Index: trunk/sources/HeuristicLab.Visualization/ChartDataRowsModel.cs
===================================================================
--- trunk/sources/HeuristicLab.Visualization/ChartDataRowsModel.cs	(revision 696)
+++ trunk/sources/HeuristicLab.Visualization/ChartDataRowsModel.cs	(revision 697)
@@ -7,5 +7,5 @@
 
 namespace HeuristicLab.Visualization{
-  public class ChartDataRowsModel : ChartDataModelBase, IChartDataRowsModel{
+  public class ChartDataRowsModel : ChartDataModelBase, IChartDataRowsModel {
 
     private readonly ListDictionary dataRows;
@@ -27,5 +27,15 @@
     }
 
-    public event ChartDataRowsModelDataChangedHandler DataChanged;
+    public event ChartDataRowsModelColumnChangedHandler ColumnChanged;
+
+    private void RaiseColumnChanged(ChangeType type, long columnId, double[] values) {
+      if (ColumnChanged != null) {
+        ColumnChanged(type, columnId, values);
+      }
+    }
+
+    public List<ChartDataRowsModelColumn> Columns {
+      get { throw new NotImplementedException(); }
+    }
   }
 }
Index: trunk/sources/HeuristicLab.Visualization/ChartDataRowsModelColumn.cs
===================================================================
--- trunk/sources/HeuristicLab.Visualization/ChartDataRowsModelColumn.cs	(revision 697)
+++ trunk/sources/HeuristicLab.Visualization/ChartDataRowsModelColumn.cs	(revision 697)
@@ -0,0 +1,11 @@
+namespace HeuristicLab.Visualization {
+  public class ChartDataRowsModelColumn {
+    public readonly int ColumnId;
+    public readonly double[] Values;
+
+    public ChartDataRowsModelColumn(int columnId, double[] values) {
+      ColumnId = columnId;
+      Values = values;
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Visualization/ChartDataRowsModelColumnChangedHandler.cs
===================================================================
--- trunk/sources/HeuristicLab.Visualization/ChartDataRowsModelColumnChangedHandler.cs	(revision 697)
+++ trunk/sources/HeuristicLab.Visualization/ChartDataRowsModelColumnChangedHandler.cs	(revision 697)
@@ -0,0 +1,3 @@
+namespace HeuristicLab.Visualization {
+  public delegate void ChartDataRowsModelColumnChangedHandler(ChangeType type, long columnId, double[] values);
+}
Index: trunk/sources/HeuristicLab.Visualization/ChartDataRowsModelDataChangedHandler.cs
===================================================================
--- trunk/sources/HeuristicLab.Visualization/ChartDataRowsModelDataChangedHandler.cs	(revision 696)
+++ 	(revision )
@@ -1,3 +1,0 @@
-namespace HeuristicLab.Visualization {
-  public delegate void ChartDataRowsModelDataChangedHandler(ChangeType type, int dataId, double[] values);
-}
Index: trunk/sources/HeuristicLab.Visualization/HeuristicLab.Visualization.csproj
===================================================================
--- trunk/sources/HeuristicLab.Visualization/HeuristicLab.Visualization.csproj	(revision 696)
+++ trunk/sources/HeuristicLab.Visualization/HeuristicLab.Visualization.csproj	(revision 697)
@@ -61,5 +61,6 @@
     <Compile Include="ChartDataModelBase.cs" />
     <Compile Include="ChartDataRowsModel.cs" />
-    <Compile Include="ChartDataRowsModelDataChangedHandler.cs" />
+    <Compile Include="ChartDataRowsModelColumn.cs" />
+    <Compile Include="ChartDataRowsModelColumnChangedHandler.cs" />
     <Compile Include="ChartDataRowsModelDummy.cs" />
     <Compile Include="CompositeShape.cs" />
Index: trunk/sources/HeuristicLab.Visualization/IChartDataRowsModel.cs
===================================================================
--- trunk/sources/HeuristicLab.Visualization/IChartDataRowsModel.cs	(revision 696)
+++ trunk/sources/HeuristicLab.Visualization/IChartDataRowsModel.cs	(revision 697)
@@ -1,5 +1,8 @@
-﻿namespace HeuristicLab.Visualization {
+﻿using System.Collections.Generic;
+
+namespace HeuristicLab.Visualization {
   public interface IChartDataRowsModel {
-    event ChartDataRowsModelDataChangedHandler DataChanged;
+    event ChartDataRowsModelColumnChangedHandler ColumnChanged;
+    List<ChartDataRowsModelColumn> Columns { get; }
   }
 }
Index: trunk/sources/HeuristicLab.Visualization/LineChart.cs
===================================================================
--- trunk/sources/HeuristicLab.Visualization/LineChart.cs	(revision 696)
+++ trunk/sources/HeuristicLab.Visualization/LineChart.cs	(revision 697)
@@ -1,33 +1,129 @@
 ﻿using System;
-using System.Windows.Forms;
+using HeuristicLab.Core;
 
 namespace HeuristicLab.Visualization {
-  public partial class LineChart : UserControl {
-    private IChartDataRowsModel model;
+  public partial class LineChart : ViewBase {
+    private readonly IChartDataRowsModel model;
 
+    /// <summary>
+    /// This constructor shouldn't be called. Only required for the designer.
+    /// </summary>
     public LineChart() {
       InitializeComponent();
     }
 
-    public IChartDataRowsModel Model {
-      get { return model; }
-      set {
-        if (value == null) {
-          throw new NullReferenceException("Model cannot be null.");
-        }
+    /// <summary>
+    /// Initializes the chart.
+    /// </summary>
+    /// <param name="model"></param>
+    public LineChart(IChartDataRowsModel model) : this() {
+      if (model == null) {
+        throw new NullReferenceException("Model cannot be null.");
+      }
 
-        if (model != null) {
-          throw new InvalidOperationException("Model has already been set.");
-        }
+      this.model = model;
 
-        model = value;
+      Reset();
+    }
 
-        model.DataChanged += OnDataChanged;
+    /// <summary>
+    /// Resets the line chart by deleting all shapes and reloading all data from the model.
+    /// </summary>
+    private void Reset() {
+      BeginUpdate();
+
+      // TODO clear existing shapes
+
+      // reload data from the model and create shapes
+      foreach (ChartDataRowsModelColumn column in model.Columns) {
+        AddColumn(column.ColumnId, column.Values);
+      }
+
+      EndUpdate();
+    }
+
+    /// <summary>
+    /// Event handler which gets called when data in the model changes.
+    /// </summary>
+    /// <param name="type">Type of change</param>
+    /// <param name="columnId">Id of the changed column</param>
+    /// <param name="values">Values contained within the changed column</param>
+    private void OnDataChanged(ChangeType type, long columnId, double[] values) {
+      switch (type) {
+        case ChangeType.Add:
+          AddColumn(columnId, values);
+          break;
+        case ChangeType.Modify:
+          ModifyColumn(columnId, values);
+          break;
+        case ChangeType.Remove:
+          RemoveColumn(columnId);
+          break;
+        default:
+          throw new ArgumentOutOfRangeException("type");
       }
     }
 
-    private void OnDataChanged(ChangeType type, int dataId, double[] values) {
+    /// <summary>
+    /// Adds a new column to the chart.
+    /// </summary>
+    /// <param name="columnId">Id of the column</param>
+    /// <param name="values">Values of the column</param>
+    private void AddColumn(long columnId, double[] values) {
       throw new NotImplementedException();
     }
+
+    /// <summary>
+    /// Modifies an existing column of the chart.
+    /// </summary>
+    /// <param name="columnId">Id of the column</param>
+    /// <param name="values">Values of the column</param>
+    private void ModifyColumn(long columnId, double[] values) {
+      throw new NotImplementedException();
+    }
+
+    /// <summary>
+    /// Removes a column from the chart.
+    /// </summary>
+    /// <param name="columnId">Id of the column</param>
+    private void RemoveColumn(long columnId) {
+      throw new NotImplementedException();
+    }
+
+    #region Add-/RemoveItemEvents
+
+    protected override void AddItemEvents() {
+      base.AddItemEvents();
+      model.ColumnChanged += OnDataChanged;
+    }
+
+    protected override void RemoveItemEvents() {
+      base.RemoveItemEvents();
+      model.ColumnChanged -= OnDataChanged;
+    }
+
+    #endregion
+
+    #region Begin-/EndUpdate
+
+    private int beginUpdateCount = 0;
+
+    public void BeginUpdate() {
+      beginUpdateCount++;
+    }
+
+    public void EndUpdate() {
+      if (beginUpdateCount == 0) {
+        throw new InvalidOperationException("Too many EndUpdates.");
+      }
+
+      beginUpdateCount--;
+
+      if (beginUpdateCount == 0) {
+        Invalidate();
+      }
+    }
+
+    #endregion
   }
 }
