Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis.Views/3.3/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis.Views-3.3.csproj
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis.Views/3.3/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis.Views-3.3.csproj	(revision 4555)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis.Views/3.3/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis.Views-3.3.csproj	(revision 4556)
@@ -91,4 +91,5 @@
   </PropertyGroup>
   <ItemGroup>
+    <Reference Include="HeuristicLab.Common.Resources-3.3, Version=3.2.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=x86" />
     <Reference Include="System" />
     <Reference Include="System.Core">
@@ -108,4 +109,10 @@
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="PrognosisView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="PrognosisView.Designer.cs">
+      <DependentUpon>PrognosisView.cs</DependentUpon>
+    </Compile>
     <Compile Include="HeuristicLabProblemsDataAnalysisMultiVariateTimeSeriesPrognosisViewsPlugin.cs" />
     <Compile Include="InteractiveSymbolicTimeSeriesPrognosisSolutionSimplifierView.cs">
@@ -114,4 +121,10 @@
     <Compile Include="InteractiveSymbolicTimeSeriesPrognosisSolutionSimplifierView.Designer.cs">
       <DependentUpon>InteractiveSymbolicTimeSeriesPrognosisSolutionSimplifierView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="TimeSeriesPrognosisLineChartView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="TimeSeriesPrognosisLineChartView.Designer.cs">
+      <DependentUpon>TimeSeriesPrognosisLineChartView.cs</DependentUpon>
     </Compile>
     <Compile Include="ResultsView.cs">
@@ -206,4 +219,8 @@
       <Project>{23DA7FF4-D5B8-41B6-AA96-F0561D24F3EE}</Project>
       <Name>HeuristicLab.Operators-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Optimization.Views\3.3\HeuristicLab.Optimization.Views-3.3.csproj">
+      <Project>{662B4B15-8F4D-4AE5-B3EB-D91C215F5AF2}</Project>
+      <Name>HeuristicLab.Optimization.Views-3.3</Name>
     </ProjectReference>
     <ProjectReference Include="..\..\HeuristicLab.Optimization\3.3\HeuristicLab.Optimization-3.3.csproj">
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis.Views/3.3/PrognosisView.Designer.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis.Views/3.3/PrognosisView.Designer.cs	(revision 4556)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis.Views/3.3/PrognosisView.Designer.cs	(revision 4556)
@@ -0,0 +1,94 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 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.MultiVariate.TimeSeriesPrognosis.Views {
+  partial class PrognosisView {
+    /// <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.timePointValue = new HeuristicLab.Data.Views.StringConvertibleValueView();
+      this.valuesView = new HeuristicLab.Data.Views.StringConvertibleMatrixView();
+      this.SuspendLayout();
+      // 
+      // timePointValue
+      // 
+      this.timePointValue.Caption = "StringConvertibleValue View";
+      this.timePointValue.Content = null;
+      this.timePointValue.LabelVisible = true;
+      this.timePointValue.Location = new System.Drawing.Point(3, 3);
+      this.timePointValue.Name = "timePointValue";
+      this.timePointValue.ReadOnly = false;
+      this.timePointValue.Size = new System.Drawing.Size(250, 22);
+      this.timePointValue.TabIndex = 1;
+      // 
+      // valuesView
+      // 
+      this.valuesView.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.valuesView.Caption = "StringConvertibleMatrix View";
+      this.valuesView.Content = null;
+      this.valuesView.Location = new System.Drawing.Point(3, 31);
+      this.valuesView.Name = "valuesView";
+      this.valuesView.ReadOnly = false;
+      this.valuesView.Size = new System.Drawing.Size(321, 242);
+      this.valuesView.TabIndex = 2;
+      // 
+      // EstimatedValuesView
+      // 
+      this.AllowDrop = true;
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.valuesView);
+      this.Controls.Add(this.timePointValue);
+      this.Name = "EstimatedValuesView";
+      this.Size = new System.Drawing.Size(327, 276);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private Data.Views.StringConvertibleValueView timePointValue;
+    private Data.Views.StringConvertibleMatrixView valuesView;
+
+
+  }
+}
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis.Views/3.3/PrognosisView.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis.Views/3.3/PrognosisView.cs	(revision 4556)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis.Views/3.3/PrognosisView.cs	(revision 4556)
@@ -0,0 +1,114 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 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.Linq;
+using System.Windows.Forms;
+using HeuristicLab.Data;
+using HeuristicLab.Data.Views;
+using HeuristicLab.MainForm;
+using HeuristicLab.MainForm.WindowsForms;
+using System.Collections.Generic;
+using HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis.Symbolic;
+
+namespace HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis.Views {
+  [View("Prognosis View")]
+  [Content(typeof(SymbolicTimeSeriesPrognosisSolution))]
+  public partial class PrognosisView : AsynchronousContentView {
+    private const string TARGETVARIABLE_SERIES_NAME = "TargetVariable";
+    private const string ESTIMATEDVALUES_SERIES_NAME = "EstimatedValues";
+    private int currentTimePoint;
+    public new SymbolicTimeSeriesPrognosisSolution Content {
+      get { return (SymbolicTimeSeriesPrognosisSolution)base.Content; }
+      set {
+        base.Content = value;
+      }
+    }
+
+    public PrognosisView()
+      : base() {
+      InitializeComponent();
+    }
+
+    #region events
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.ProblemDataChanged += new EventHandler(Content_ProblemDataChanged);
+    }
+
+    protected override void DeregisterContentEvents() {
+      base.DeregisterContentEvents();
+      Content.ProblemDataChanged -= new EventHandler(Content_ProblemDataChanged);
+    }
+
+    void Content_ProblemDataChanged(object sender, EventArgs e) {
+      OnContentChanged();
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content != null) {
+        UpdateRowIndexValue();
+        UpdateEstimatedValues();
+      }
+    }
+
+
+    private void UpdateEstimatedValues() {
+      if (InvokeRequired) Invoke((Action)UpdateEstimatedValues);
+      DoubleMatrix matrix = null;
+        if (Content != null) {
+          IEnumerable<string> targetVariables = Content.ProblemData.TargetVariables.CheckedItems.Select(x => x.Value.Value);
+          List<double[]> prognosis = Content.GetPrognosis(currentTimePoint).ToList();
+          double[,] values = new double[prognosis.Count, targetVariables.Count() * 2];
+          for (int row = 0; row < prognosis.Count; row++) {
+            int col = 0;
+            int t = currentTimePoint + row;
+            foreach (string targetVariable in targetVariables) {
+              values[row, col++] = t<Content.ProblemData.Dataset.Rows ? Content.ProblemData.Dataset[targetVariable, t] : double.NaN;
+              values[row, col++] = prognosis[row][(col - 1) / 2];
+            }
+          }
+          matrix = new DoubleMatrix(values);
+          string[] partitions = new string[] { "(original)", "(estimated)" };
+          matrix.ColumnNames = from targetVariable in targetVariables
+                               from partition in partitions
+                               select targetVariable + " " + partition;
+          ;
+        }
+        valuesView.Content = matrix;
+    }
+
+    private void UpdateRowIndexValue() {
+      if(timePointValue.Content!=null)
+        timePointValue.Content.ValueChanged -= new EventHandler(Content_ValueChanged);
+      currentTimePoint = Content.ProblemData.TestSamplesStart.Value;
+      timePointValue.Content = new  IntValue(currentTimePoint);
+      timePointValue.Locked = timePointValue.ReadOnly = false;
+      timePointValue.Content.ValueChanged += new EventHandler(Content_ValueChanged);
+    }
+
+    void Content_ValueChanged(object sender, EventArgs e) {
+      currentTimePoint = int.Parse(timePointValue.Content.GetValue());
+      UpdateEstimatedValues();
+    }
+    #endregion
+  }
+}
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis.Views/3.3/ResultsView.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis.Views/3.3/ResultsView.cs	(revision 4555)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis.Views/3.3/ResultsView.cs	(revision 4556)
@@ -155,18 +155,23 @@
           List<string> targetVariables = Content.ProblemData.TargetVariables.CheckedItems.Select(x => x.Value.Value).ToList();
 
-          int timestep = 0;
-          foreach (double[] x in Content.GetPrognosis(row)) {
-            int targetIndex = 0;
-            foreach (var targetVariable in targetVariables) {
-              double originalValue = Content.ProblemData.Dataset[targetVariable, row + timestep];
-              double estimatedValue = x[targetIndex];
-              if (IsValidValue(originalValue) && IsValidValue(estimatedValue)) {
-                foreach (IOnlineEvaluator evaluator in evaluators[targetVariable]) {
-                  evaluator.Add(originalValue, estimatedValue);
+          if (string.IsNullOrEmpty(Content.ConditionalEvaluationVariable) ||
+            Content.ProblemData.Dataset[Content.ConditionalEvaluationVariable, row] > 0) {
+            int timestep = 0;
+            foreach (double[] x in Content.GetPrognosis(row)) {
+              int targetIndex = 0;
+              if (row + timestep < Content.ProblemData.Dataset.Rows) {
+                foreach (var targetVariable in targetVariables) {
+                  double originalValue = Content.ProblemData.Dataset[targetVariable, row + timestep];
+                  double estimatedValue = x[targetIndex];
+                  if (IsValidValue(originalValue) && IsValidValue(estimatedValue)) {
+                    foreach (IOnlineEvaluator evaluator in evaluators[targetVariable]) {
+                      evaluator.Add(originalValue, estimatedValue);
+                    }
+                  }
+                  targetIndex++;
                 }
               }
-              targetIndex++;
+              timestep++;
             }
-            timestep++;
           }
         }
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis.Views/3.3/TimeSeriesPrognosisLineChartView.Designer.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis.Views/3.3/TimeSeriesPrognosisLineChartView.Designer.cs	(revision 4556)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis.Views/3.3/TimeSeriesPrognosisLineChartView.Designer.cs	(revision 4556)
@@ -0,0 +1,116 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 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.MultiVariate.TimeSeriesPrognosis.Views {
+  partial class TimeSeriesPrognosisLineChartView {
+    /// <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() {
+      System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea1 = new System.Windows.Forms.DataVisualization.Charting.ChartArea();
+      System.Windows.Forms.DataVisualization.Charting.Legend legend1 = new System.Windows.Forms.DataVisualization.Charting.Legend();
+      this.chart = new System.Windows.Forms.DataVisualization.Charting.Chart();
+      this.numericUpDown = new System.Windows.Forms.NumericUpDown();
+      this.horizonLabel = new System.Windows.Forms.Label();
+      ((System.ComponentModel.ISupportInitialize)(this.chart)).BeginInit();
+      ((System.ComponentModel.ISupportInitialize)(this.numericUpDown)).BeginInit();
+      this.SuspendLayout();
+      // 
+      // chart
+      // 
+      this.chart.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)));
+      chartArea1.Name = "ChartArea";
+      this.chart.ChartAreas.Add(chartArea1);
+      legend1.Alignment = System.Drawing.StringAlignment.Center;
+      legend1.Docking = System.Windows.Forms.DataVisualization.Charting.Docking.Top;
+      legend1.Name = "Default";
+      this.chart.Legends.Add(legend1);
+      this.chart.Location = new System.Drawing.Point(0, 29);
+      this.chart.Name = "chart";
+      this.chart.Size = new System.Drawing.Size(358, 196);
+      this.chart.TabIndex = 0;
+      // 
+      // numericUpDown
+      // 
+      this.numericUpDown.Location = new System.Drawing.Point(103, 3);
+      this.numericUpDown.Name = "numericUpDown";
+      this.numericUpDown.Size = new System.Drawing.Size(51, 20);
+      this.numericUpDown.TabIndex = 1;
+      this.numericUpDown.Value = new decimal(new int[] {
+            1,
+            0,
+            0,
+            0});
+      this.numericUpDown.ValueChanged += new System.EventHandler(this.numericUpDown_ValueChanged);
+      // 
+      // horizonLabel
+      // 
+      this.horizonLabel.AutoSize = true;
+      this.horizonLabel.Location = new System.Drawing.Point(3, 5);
+      this.horizonLabel.Name = "horizonLabel";
+      this.horizonLabel.Size = new System.Drawing.Size(94, 13);
+      this.horizonLabel.TabIndex = 2;
+      this.horizonLabel.Text = "Prediction horizon:";
+      // 
+      // TimeSeriesPrognosisLineChartView
+      // 
+      this.AllowDrop = true;
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.horizonLabel);
+      this.Controls.Add(this.numericUpDown);
+      this.Controls.Add(this.chart);
+      this.Name = "TimeSeriesPrognosisLineChartView";
+      this.Size = new System.Drawing.Size(358, 225);
+      ((System.ComponentModel.ISupportInitialize)(this.chart)).EndInit();
+      ((System.ComponentModel.ISupportInitialize)(this.numericUpDown)).EndInit();
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.DataVisualization.Charting.Chart chart;
+    private System.Windows.Forms.NumericUpDown numericUpDown;
+    private System.Windows.Forms.Label horizonLabel;
+  }
+}
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis.Views/3.3/TimeSeriesPrognosisLineChartView.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis.Views/3.3/TimeSeriesPrognosisLineChartView.cs	(revision 4556)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis.Views/3.3/TimeSeriesPrognosisLineChartView.cs	(revision 4556)
@@ -0,0 +1,157 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+using System;
+using System.Drawing;
+using System.Linq;
+using System.Windows.Forms;
+using System.Windows.Forms.DataVisualization.Charting;
+using HeuristicLab.MainForm;
+using HeuristicLab.MainForm.WindowsForms;
+using System.Collections.Generic;
+using HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis.Symbolic;
+
+namespace HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis.Views {
+  [View("Symbolic Time Series Prognosis Line Chart View")]
+  [Content(typeof(SymbolicTimeSeriesPrognosisSolution))]
+  public partial class TimeSeriesPrognosisLineChartView : AsynchronousContentView {
+    private const string TARGETVARIABLE_SERIES_NAME = "(target)";
+    private const string ESTIMATEDVALUES_SERIES_NAME = "(estimated)";
+
+    public new SymbolicTimeSeriesPrognosisSolution Content {
+      get { return (SymbolicTimeSeriesPrognosisSolution)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public TimeSeriesPrognosisLineChartView()
+      : base() {
+      InitializeComponent();
+      //configure axis
+      this.chart.ChartAreas[0].CursorX.IsUserSelectionEnabled = true;
+      this.chart.ChartAreas[0].AxisX.ScaleView.Zoomable = true;
+      this.chart.ChartAreas[0].CursorX.Interval = 1;
+
+      this.chart.ChartAreas[0].CursorY.IsUserSelectionEnabled = true;
+      this.chart.ChartAreas[0].AxisY.ScaleView.Zoomable = true;
+      this.chart.ChartAreas[0].CursorY.Interval = 0;
+    }
+
+    private void RedrawChart() {
+      this.chart.Series.Clear();
+      if (Content != null) {
+        int selectedHorizonValue = Math.Min(Content.Horizon, Math.Max(1, (int)numericUpDown.Value));
+        numericUpDown.Minimum = 1;
+        numericUpDown.Maximum = Content.Horizon;
+        numericUpDown.Value = selectedHorizonValue;
+        List<string> targetVariables = Content.ProblemData.TargetVariables.CheckedItems.Select(x => x.Value.Value).ToList();
+        // horizon=1 (t+0) =>  0 .. 10
+        // horizon=2 (t+0..1) => -1 .. 9
+        // horizon=3 (t+0..2) => -2 .. 8
+        // ...
+        // horizon=10 (t+0..9) => -9 .. 1
+        int firstIndex = 1 - selectedHorizonValue;
+        int lastIndex = Content.ProblemData.Dataset.Rows ;
+        double[] nanVector =
+          targetVariables
+          .Select(x => double.NaN)
+          .ToArray();
+        IEnumerable<int> rows = Enumerable.Range(firstIndex, lastIndex );
+        IEnumerable<IEnumerable<double[]>> values = from row in rows
+                                                    let evaluate = string.IsNullOrEmpty(Content.ConditionalEvaluationVariable) ||
+                                                                  (row > 0 && row < lastIndex &&
+                                                                  Content.ProblemData.Dataset[Content.ConditionalEvaluationVariable, row + selectedHorizonValue - 1] > 0)
+                                                    select evaluate ? Content.GetPrognosis(row) : Enumerable.Repeat(nanVector, Content.Horizon);
+
+        for (int col = 0; col < targetVariables.Count; col++) {
+          string targetVariable = targetVariables[col];
+          this.chart.Series.Add(targetVariable + " " + TARGETVARIABLE_SERIES_NAME);
+          this.chart.Series[targetVariable + " " + TARGETVARIABLE_SERIES_NAME].LegendText = targetVariable;
+          this.chart.Series[targetVariable + " " + TARGETVARIABLE_SERIES_NAME].ChartType = SeriesChartType.FastLine;
+          this.chart.Series[targetVariable + " " + TARGETVARIABLE_SERIES_NAME].Points.DataBindY(Content.ProblemData.Dataset.GetVariableValues(targetVariable));
+
+          this.chart.Series.Add(targetVariable + " " + ESTIMATEDVALUES_SERIES_NAME);
+          this.chart.Series[targetVariable + " " + ESTIMATEDVALUES_SERIES_NAME].LegendText = targetVariable + " " + ESTIMATEDVALUES_SERIES_NAME;
+          this.chart.Series[targetVariable + " " + ESTIMATEDVALUES_SERIES_NAME].ChartType = SeriesChartType.FastLine;
+          this.chart.Series[targetVariable + " " + ESTIMATEDVALUES_SERIES_NAME].Points.DataBindY(values.Select(x => x.ElementAt(selectedHorizonValue - 1)[col]).ToArray());
+          this.chart.Series[targetVariable + " " + ESTIMATEDVALUES_SERIES_NAME].Tag = Content;
+        }
+        this.UpdateStripLines();
+        UpdateCursorInterval();
+      }
+    }
+
+    private void UpdateCursorInterval() {
+      var allValues = (from series in this.chart.Series
+                       from point in series.Points
+                       select point.YValues[0])
+                            .DefaultIfEmpty(1.0);
+      double range = allValues.Max() - allValues.Min();
+      double interestingValuesRange = Math.Min(Math.Max(range, 1.0), Math.Max(range, 1.0));
+      double digits = (int)Math.Log10(interestingValuesRange) - 3;
+      double yZoomInterval = Math.Max(Math.Pow(10, digits), 10E-5);
+      this.chart.ChartAreas[0].CursorY.Interval = yZoomInterval;
+    }
+
+    #region events
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.ProblemDataChanged += new EventHandler(Content_ProblemDataChanged);
+    }
+    protected override void DeregisterContentEvents() {
+      base.DeregisterContentEvents();
+      Content.ProblemDataChanged -= new EventHandler(Content_ProblemDataChanged);
+    }
+
+    private void Content_ProblemDataChanged(object sender, EventArgs e) {
+      RedrawChart();
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      RedrawChart();
+    }
+
+    #endregion
+
+    private void UpdateStripLines() {
+      this.chart.ChartAreas[0].AxisX.StripLines.Clear();
+      this.CreateAndAddStripLine("Training", Color.FromArgb(20, Color.Green),
+        Content.ProblemData.TrainingSamplesStart.Value,
+        Content.ProblemData.TrainingSamplesEnd.Value);
+      this.CreateAndAddStripLine("Test", Color.FromArgb(20, Color.Red),
+        Content.ProblemData.TestSamplesStart.Value,
+        Content.ProblemData.TestSamplesEnd.Value);
+    }
+
+    private void CreateAndAddStripLine(string title, Color c, int start, int end) {
+      StripLine stripLine = new StripLine();
+      stripLine.BackColor = c;
+      stripLine.Text = title;
+      stripLine.Font = new Font("Times New Roman", 12, FontStyle.Bold);
+      stripLine.StripWidth = end - start;
+      stripLine.IntervalOffset = start;
+      this.chart.ChartAreas[0].AxisX.StripLines.Add(stripLine);
+    }
+
+    private void numericUpDown_ValueChanged(object sender, EventArgs e) {
+      RedrawChart();
+    }
+  }
+}
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis/3.3/Symbolic/SymbolicTimeSeriesExpressionInterpreter.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis/3.3/Symbolic/SymbolicTimeSeriesExpressionInterpreter.cs	(revision 4555)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis/3.3/Symbolic/SymbolicTimeSeriesExpressionInterpreter.cs	(revision 4556)
@@ -136,5 +136,5 @@
 
       foreach (var row in rows) {
-        ResetVariableValues(dataset, row);
+        // ResetVariableValues(dataset, row);
         for (int step = 0; step < predictionHorizon; step++) {
           this.row = row + step;
@@ -169,5 +169,5 @@
 
       foreach (var row in rows) {
-        ResetVariableValues(dataset, row);
+        // ResetVariableValues(dataset, row);
         for (int step = 0; step < predictionHorizon; step++) {
           this.row = row + step;
@@ -190,20 +190,20 @@
     #endregion
 
-    private void ResetVariableValues(Dataset dataset, int start) {
-      foreach (var pair in estimatedTargetVariableValues) {
-        int targetVariableIndex = pair.Key;
-        double[] values = pair.Value;
-        for (int i = 0; i < values.Length; i++) {
-          values[i] = dataset[start + i, targetVariableIndex];
-        }
-      }
-    }
+    //private void ResetVariableValues(Dataset dataset, int start) {
+    //  foreach (var pair in estimatedTargetVariableValues) {
+    //    int targetVariableIndex = pair.Key;
+    //    double[] values = pair.Value;
+    //    for (int i = 0; i < values.Length; i++) {
+    //      values[i] = dataset[start + i, targetVariableIndex];
+    //    }
+    //  }
+    //}
 
     private Instruction PostProcessInstruction(Instruction instr) {
-      if (instr.opCode == OpCodes.Variable || instr.opCode == OpCodes.LagVariable || 
+      if (instr.opCode == OpCodes.Variable || instr.opCode == OpCodes.LagVariable ||
         instr.opCode == OpCodes.Integral || instr.opCode == OpCodes.MovingAverage || instr.opCode == OpCodes.Differential) {
         var variableTreeNode = instr.dynamicNode as VariableTreeNode;
         instr.iArg0 = (ushort)dataset.GetVariableIndex(variableTreeNode.VariableName);
-      } 
+      }
       return instr;
     }
@@ -349,5 +349,5 @@
             var lagVariableTreeNode = currentInstr.dynamicNode as LaggedVariableTreeNode;
             int actualRow = row + lagVariableTreeNode.Lag;
-            if (actualRow < 0 || actualRow >= dataset.Rows)
+            if (actualRow < 0 || actualRow >= dataset.Rows + currentPredictionHorizon)
               return double.NaN;
             return GetVariableValue(currentInstr.iArg0, lagVariableTreeNode.Lag) * lagVariableTreeNode.Weight;
@@ -355,5 +355,5 @@
         case OpCodes.MovingAverage: {
             var movingAvgTreeNode = currentInstr.dynamicNode as MovingAverageTreeNode;
-            if (row + movingAvgTreeNode.MinTimeOffset < 0 || row + movingAvgTreeNode.MaxTimeOffset >= dataset.Rows)
+            if (row + movingAvgTreeNode.MinTimeOffset < 0 || row + movingAvgTreeNode.MaxTimeOffset >= dataset.Rows + currentPredictionHorizon)
               return double.NaN;
             double sum = 0.0;
@@ -365,14 +365,14 @@
         case OpCodes.Differential: {
             var diffTreeNode = currentInstr.dynamicNode as DerivativeVariableTreeNode;
-            if (row + diffTreeNode.Lag - 2 < 0 || row + diffTreeNode.Lag >= dataset.Rows)
+            if (row + diffTreeNode.Lag - 2 < 0 || row + diffTreeNode.Lag >= dataset.Rows + currentPredictionHorizon)
               return double.NaN;
             double y_0 = GetVariableValue(currentInstr.iArg0, diffTreeNode.Lag);
             double y_1 = GetVariableValue(currentInstr.iArg0, diffTreeNode.Lag - 1);
             double y_2 = GetVariableValue(currentInstr.iArg0, diffTreeNode.Lag - 2);
-            return diffTreeNode.Weight * (3 * y_0 - 4 * y_1 + 3 * y_2) / 2;
+            return diffTreeNode.Weight * (y_0 - 4 * y_1 + 3 * y_2) / 2;
           }
         case OpCodes.Integral: {
             var integralVarTreeNode = currentInstr.dynamicNode as IntegratedVariableTreeNode;
-            if (row + integralVarTreeNode.MinTimeOffset < 0 || row + integralVarTreeNode.MaxTimeOffset >= dataset.Rows)
+            if (row + integralVarTreeNode.MinTimeOffset < 0 || row + integralVarTreeNode.MaxTimeOffset >= dataset.Rows + currentPredictionHorizon)
               return double.NaN;
             double sum = 0;
@@ -391,7 +391,13 @@
 
     private double GetVariableValue(int variableIndex, int timeoffset) {
-      if (estimatedTargetVariableValues.ContainsKey(variableIndex) &&
-                      currentPredictionHorizon + timeoffset >= 0) {
-        return estimatedTargetVariableValues[variableIndex][currentPredictionHorizon + timeoffset];
+      if (currentPredictionHorizon + timeoffset >= 0) {
+        double[] values;
+        estimatedTargetVariableValues.TryGetValue(variableIndex, out values);
+        if (values != null) {
+          return values[currentPredictionHorizon + timeoffset];
+        }
+      }
+      if (row + timeoffset < 0 || row + timeoffset >= dataset.Rows) {
+        return double.NaN;
       } else {
         return dataset[row + timeoffset, variableIndex];
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis/3.3/Symbolic/SymbolicTimeSeriesPrognosisSolution.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis/3.3/Symbolic/SymbolicTimeSeriesPrognosisSolution.cs	(revision 4555)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.TimeSeriesPrognosis/3.3/Symbolic/SymbolicTimeSeriesPrognosisSolution.cs	(revision 4556)
@@ -117,5 +117,5 @@
 
     public IEnumerable<double[]> GetPrognosis(int t) {
-      return model.GetEstimatedValues(problemData, t, t + 1);
+      return model.GetEstimatedValues(problemData, t, t + 1, horizon);
     }
 
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.Views/3.3/HeuristicLab.Problems.DataAnalysis.MultiVariate.Views-3.3.csproj
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.Views/3.3/HeuristicLab.Problems.DataAnalysis.MultiVariate.Views-3.3.csproj	(revision 4555)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.Views/3.3/HeuristicLab.Problems.DataAnalysis.MultiVariate.Views-3.3.csproj	(revision 4556)
@@ -91,4 +91,6 @@
   </PropertyGroup>
   <ItemGroup>
+    <Reference Include="HeuristicLab.Common.Resources-3.3, Version=3.2.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=x86" />
+    <Reference Include="HeuristicLab.Optimization-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=x86" />
     <Reference Include="System" />
     <Reference Include="System.Core">
@@ -170,4 +172,8 @@
       <Project>{3BD61258-31DA-4B09-89C0-4F71FEF5F05A}</Project>
       <Name>HeuristicLab.MainForm-3.3</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Optimization.Views\3.3\HeuristicLab.Optimization.Views-3.3.csproj">
+      <Project>{662B4B15-8F4D-4AE5-B3EB-D91C215F5AF2}</Project>
+      <Name>HeuristicLab.Optimization.Views-3.3</Name>
     </ProjectReference>
     <ProjectReference Include="..\..\HeuristicLab.Persistence\3.3\HeuristicLab.Persistence-3.3.csproj">
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.Views/3.3/LineChartView.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.Views/3.3/LineChartView.cs	(revision 4555)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.Views/3.3/LineChartView.cs	(revision 4556)
@@ -55,6 +55,6 @@
     private void RedrawChart() {
       this.chart.Series.Clear();
-      IEnumerable<double[]> values = Content.EstimatedValues;
       if (Content != null) {
+        IEnumerable<double[]> values = Content.EstimatedValues;
         List<string> targetVariables = Content.ProblemData.TargetVariables.CheckedItems.Select(x => x.Value.Value).ToList();
         for (int col = 0; col < targetVariables.Count; col++) {
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.Views/3.3/MultiVariateDataAnalysisSolutionView.Designer.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.Views/3.3/MultiVariateDataAnalysisSolutionView.Designer.cs	(revision 4556)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.Views/3.3/MultiVariateDataAnalysisSolutionView.Designer.cs	(revision 4556)
@@ -0,0 +1,154 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 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.MultiVariate.Views {
+  partial class MultiVariateDataAnalysisSolutionView {
+    /// <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.dataTabPage = new System.Windows.Forms.TabPage();
+      this.modelTabPage = new System.Windows.Forms.TabPage();
+      this.tabControl = new System.Windows.Forms.TabControl();
+      this.modelViewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
+      this.viewHost1 = new HeuristicLab.MainForm.WindowsForms.ViewHost();
+      this.dataViewHost = new HeuristicLab.MainForm.WindowsForms.ViewHost();
+      this.dataTabPage.SuspendLayout();
+      this.modelTabPage.SuspendLayout();
+      this.tabControl.SuspendLayout();
+      this.SuspendLayout();
+      // 
+      // dataTabPage
+      // 
+      this.dataTabPage.Controls.Add(this.dataViewHost);
+      this.dataTabPage.Location = new System.Drawing.Point(4, 22);
+      this.dataTabPage.Name = "dataTabPage";
+      this.dataTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.dataTabPage.Size = new System.Drawing.Size(372, 236);
+      this.dataTabPage.TabIndex = 1;
+      this.dataTabPage.Text = "Data";
+      this.dataTabPage.UseVisualStyleBackColor = true;
+      // 
+      // modelTabPage
+      // 
+      this.modelTabPage.Controls.Add(this.modelViewHost);
+      this.modelTabPage.Location = new System.Drawing.Point(4, 22);
+      this.modelTabPage.Name = "modelTabPage";
+      this.modelTabPage.Padding = new System.Windows.Forms.Padding(3);
+      this.modelTabPage.Size = new System.Drawing.Size(372, 236);
+      this.modelTabPage.TabIndex = 0;
+      this.modelTabPage.Text = "Model";
+      this.modelTabPage.UseVisualStyleBackColor = true;
+      // 
+      // 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.modelTabPage);
+      this.tabControl.Controls.Add(this.dataTabPage);
+      this.tabControl.Location = new System.Drawing.Point(3, 3);
+      this.tabControl.Name = "tabControl";
+      this.tabControl.SelectedIndex = 0;
+      this.tabControl.Size = new System.Drawing.Size(380, 262);
+      this.tabControl.TabIndex = 1;
+      // 
+      // modelViewHost
+      // 
+      this.modelViewHost.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.modelViewHost.Caption = "DataAnalysisSolution Model View";
+      this.modelViewHost.Content = null;
+      this.modelViewHost.Location = new System.Drawing.Point(6, 6);
+      this.modelViewHost.Name = "modelViewHost";
+      this.modelViewHost.ReadOnly = false;
+      this.modelViewHost.Size = new System.Drawing.Size(360, 224);
+      this.modelViewHost.TabIndex = 1;
+      this.modelViewHost.ViewType = null;
+      // 
+      // viewHost1
+      // 
+      this.viewHost1.Caption = "View";
+      this.viewHost1.Content = null;
+      this.viewHost1.Location = new System.Drawing.Point(6, 6);
+      this.viewHost1.Name = "viewHost1";
+      this.viewHost1.ReadOnly = false;
+      this.viewHost1.Size = new System.Drawing.Size(360, 224);
+      this.viewHost1.TabIndex = 1;
+      this.viewHost1.ViewType = null;
+      // 
+      // dataViewHost
+      // 
+      this.dataViewHost.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.dataViewHost.Caption = "DataAnalysisSolution Data View";
+      this.dataViewHost.Content = null;
+      this.dataViewHost.Location = new System.Drawing.Point(6, 6);
+      this.dataViewHost.Name = "dataViewHost";
+      this.dataViewHost.ReadOnly = false;
+      this.dataViewHost.Size = new System.Drawing.Size(360, 224);
+      this.dataViewHost.TabIndex = 2;
+      this.dataViewHost.ViewType = null;
+      // 
+      // DataAnalysisSolutionView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.tabControl);
+      this.Name = "DataAnalysisSolutionView";
+      this.Size = new System.Drawing.Size(386, 268);
+      this.dataTabPage.ResumeLayout(false);
+      this.modelTabPage.ResumeLayout(false);
+      this.tabControl.ResumeLayout(false);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    protected System.Windows.Forms.TabControl tabControl;
+    protected System.Windows.Forms.TabPage dataTabPage;
+    protected System.Windows.Forms.TabPage modelTabPage;
+    protected HeuristicLab.MainForm.WindowsForms.ViewHost dataViewHost;
+    private HeuristicLab.MainForm.WindowsForms.ViewHost viewHost1;
+    protected HeuristicLab.MainForm.WindowsForms.ViewHost modelViewHost;
+  }
+}
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.Views/3.3/MultiVariateDataAnalysisSolutionView.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.Views/3.3/MultiVariateDataAnalysisSolutionView.cs	(revision 4556)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.Views/3.3/MultiVariateDataAnalysisSolutionView.cs	(revision 4556)
@@ -0,0 +1,70 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 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.Windows.Forms;
+using HeuristicLab.MainForm;
+using HeuristicLab.MainForm.WindowsForms;
+using HeuristicLab.Problems.DataAnalysis.MultiVariate;
+
+namespace HeuristicLab.Problems.DataAnalysis.MultiVariate.Views {
+  [View("Multi-Variate Data Analysis Solution View")]
+  [Content(typeof(IMultiVariateDataAnalysisSolution))]
+  public partial class MultiVariateDataAnalysisSolutionView : AsynchronousContentView {
+    public MultiVariateDataAnalysisSolutionView() {
+      InitializeComponent();
+    }
+
+    public new IMultiVariateDataAnalysisSolution Content {
+      get { return (IMultiVariateDataAnalysisSolution)base.Content; }
+      set { base.Content = value; }
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content != null) {
+        modelViewHost.Content = Content.Model;
+        dataViewHost.Content = Content.ProblemData;
+      } else {
+        modelViewHost.Content = null;
+        dataViewHost.Content = null;
+      }
+    }
+
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      Content.ModelChanged += new EventHandler(Content_ModelChanged);
+      Content.ProblemDataChanged += new EventHandler(Content_ProblemDataChanged);
+    }
+
+    protected override void DeregisterContentEvents() {
+      base.DeregisterContentEvents();
+      Content.ModelChanged -= new EventHandler(Content_ModelChanged);
+      Content.ProblemDataChanged -= new EventHandler(Content_ProblemDataChanged);
+    }
+
+    private void Content_ModelChanged(object sender, EventArgs e) {
+      modelViewHost.Content = Content.Model;
+    }
+    private void Content_ProblemDataChanged(object sender, EventArgs e) {
+      dataViewHost.Content = Content.ProblemData;
+    }
+  }
+}
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.Views/3.3/ResultsView.Designer.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.Views/3.3/ResultsView.Designer.cs	(revision 4556)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.Views/3.3/ResultsView.Designer.cs	(revision 4556)
@@ -0,0 +1,75 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 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.VectorRegression.Views {
+  partial class ResultsView {
+    /// <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.matrixView = new HeuristicLab.Data.Views.StringConvertibleMatrixView();
+      this.SuspendLayout();
+      // 
+      // matrixView
+      // 
+      this.matrixView.Caption = "StringConvertibleMatrix View";
+      this.matrixView.Content = null;
+      this.matrixView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.matrixView.Location = new System.Drawing.Point(0, 0);
+      this.matrixView.Name = "matrixView";
+      this.matrixView.ReadOnly = true;
+      this.matrixView.Size = new System.Drawing.Size(494, 317);
+      this.matrixView.TabIndex = 0;
+      // 
+      // ResultsView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.matrixView);
+      this.Name = "ResultsView";
+      this.Size = new System.Drawing.Size(494, 317);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private HeuristicLab.Data.Views.StringConvertibleMatrixView matrixView;
+  }
+}
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.Views/3.3/ResultsView.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.Views/3.3/ResultsView.cs	(revision 4556)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.MultiVariate.Views/3.3/ResultsView.cs	(revision 4556)
@@ -0,0 +1,109 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.MainForm;
+using HeuristicLab.MainForm.WindowsForms;
+using HeuristicLab.Data.Views;
+using HeuristicLab.Data;
+using HeuristicLab.Problems.DataAnalysis.Evaluators;
+using HeuristicLab.Problems.DataAnalysis.VectorRegression;
+
+namespace HeuristicLab.Problems.DataAnalysis.VectorRegression.Views {
+  [Content(typeof(IMultiTargetRegressionSolution), false)]
+  [View("Multi-target Results View")]
+  public partial class ResultsView : AsynchronousContentView {
+    private List<string> rowNames = new List<string>() { 
+      "Mean squared error (training)", "Mean squared error (test)",
+      "Pearson's R² (training)", "Pearson's R² (test)", 
+      "Mean relative error (training)", "Mean relative error (test)" };
+
+    public ResultsView() {
+      InitializeComponent();
+    }
+
+    public new IMultiTargetRegressionSolution Content {
+      get { return (IMultiTargetRegressionSolution)base.Content; }
+      set { base.Content = value; }
+    }
+
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      //Content.ModelChanged += new EventHandler(Content_ModelChanged);
+      //Content.ProblemDataChanged += new EventHandler(Content_ProblemDataChanged);
+      //Content.EstimatedValuesChanged += new EventHandler(Content_EstimatedValuesChanged);
+    }
+    protected override void DeregisterContentEvents() {
+      base.DeregisterContentEvents();
+      //Content.ModelChanged -= new EventHandler(Content_ModelChanged);
+      //Content.ProblemDataChanged -= new EventHandler(Content_ProblemDataChanged);
+      //Content.EstimatedValuesChanged -= new EventHandler(Content_EstimatedValuesChanged);
+    }
+
+    private void Content_ModelChanged(object sender, EventArgs e) {
+      UpdateView();
+    }
+    private void Content_ProblemDataChanged(object sender, EventArgs e) {
+      UpdateView();
+    }
+    private void Content_EstimatedValuesChanged(object sender, EventArgs e) {
+      UpdateView();
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      UpdateView();
+    }
+    private void UpdateView() {
+      if (Content != null) {
+        DoubleMatrix matrix = new DoubleMatrix(rowNames.Count, Content.TargetVariables.Count());
+        matrix.RowNames = rowNames;
+        matrix.ColumnNames = Content.TargetVariables;
+        matrix.SortableView = false;
+
+        int columnIndex = 0;
+        foreach (string targetVariable in Content.TargetVariables) {
+          DataAnalysisSolution targetVariableSolution = Content.GetModelFor(targetVariable);
+
+          IEnumerable<double> originalTrainingValues = targetVariableSolution.ProblemData.Dataset.GetVariableValues(targetVariable, targetVariableSolution.ProblemData.TrainingSamplesStart.Value, targetVariableSolution.ProblemData.TrainingSamplesEnd.Value);
+          IEnumerable<double> originalTestValues = targetVariableSolution.ProblemData.Dataset.GetVariableValues(targetVariable, targetVariableSolution.ProblemData.TestSamplesStart.Value, targetVariableSolution.ProblemData.TestSamplesEnd.Value);
+
+          matrix[0, columnIndex] = SimpleMSEEvaluator.Calculate(originalTrainingValues, targetVariableSolution.EstimatedTrainingValues);
+          matrix[1, columnIndex] = SimpleMSEEvaluator.Calculate(originalTestValues, targetVariableSolution.EstimatedTestValues);
+          matrix[2, columnIndex] = SimpleRSquaredEvaluator.Calculate(originalTrainingValues, targetVariableSolution.EstimatedTrainingValues);
+          matrix[3, columnIndex] = SimpleRSquaredEvaluator.Calculate(originalTestValues, targetVariableSolution.EstimatedTestValues);
+          matrix[4, columnIndex] = SimpleMeanAbsolutePercentageErrorEvaluator.Calculate(originalTrainingValues, targetVariableSolution.EstimatedTrainingValues);
+          matrix[5, columnIndex] = SimpleMeanAbsolutePercentageErrorEvaluator.Calculate(originalTestValues, targetVariableSolution.EstimatedTestValues);
+          columnIndex++;
+        }
+
+        matrixView.Content = matrix;
+      } else
+        matrixView.Content = null;
+    }
+  }
+}
Index: /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Views/3.3/Symbolic/SymbolicExpressionTreeLatexFormatter.cs
===================================================================
--- /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Views/3.3/Symbolic/SymbolicExpressionTreeLatexFormatter.cs	(revision 4555)
+++ /branches/DataAnalysis/HeuristicLab.Problems.DataAnalysis.Views/3.3/Symbolic/SymbolicExpressionTreeLatexFormatter.cs	(revision 4556)
@@ -79,5 +79,5 @@
       } else if (node.Symbol is Variable) {
         var varNode = node as VariableTreeNode;
-        strBuilder.Append(" " + varNode.VariableName + " ");
+        strBuilder.Append(" " + varNode.ToString()+ " ");
       } else if (node.Symbol is ProgramRootSymbol) {
       } else if (node.Symbol is Defun) {
