Index: /trunk/sources/HeuristicLab.Visualization.Test/3.2/LineChartTests.cs
===================================================================
--- /trunk/sources/HeuristicLab.Visualization.Test/3.2/LineChartTests.cs	(revision 1879)
+++ /trunk/sources/HeuristicLab.Visualization.Test/3.2/LineChartTests.cs	(revision 1880)
@@ -82,6 +82,6 @@
       YAxisDescriptor yaxis2 = new YAxisDescriptor();
 
-      model.XAxisLabel = "X Axis";
-      model.ShowXAxisLabel = true;
+      model.XAxis.XAxisLabel = "X Axis";
+      model.XAxis.ShowXAxisLabel = true;
 
       yaxis1.Label = "Y-Axis 1";
@@ -139,5 +139,5 @@
       model.AddDataRow(row1);
 
-      model.ShowXAxisGrid = false;
+      model.XAxis.ShowXAxisGrid = false;
 
       Random rand = new Random(42);
Index: /trunk/sources/HeuristicLab.Visualization/3.2/CanvasUI.cs
===================================================================
--- /trunk/sources/HeuristicLab.Visualization/3.2/CanvasUI.cs	(revision 1879)
+++ /trunk/sources/HeuristicLab.Visualization/3.2/CanvasUI.cs	(revision 1880)
@@ -18,6 +18,10 @@
     }
 
+    public event PaintEventHandler BeforePaint;
+
     protected override void OnPaint(PaintEventArgs pe) {
       try {
+        FireBeforePaint(pe);
+
         Graphics g = pe.Graphics;
 
@@ -38,4 +42,9 @@
       base.OnResize(e);
     }
+
+    private void FireBeforePaint(PaintEventArgs e) {
+      if (BeforePaint != null)
+        BeforePaint(this, e);
+    }
   }
 }
Index: /trunk/sources/HeuristicLab.Visualization/3.2/ChartDataRowsModel.cs
===================================================================
--- /trunk/sources/HeuristicLab.Visualization/3.2/ChartDataRowsModel.cs	(revision 1879)
+++ /trunk/sources/HeuristicLab.Visualization/3.2/ChartDataRowsModel.cs	(revision 1880)
@@ -5,5 +5,4 @@
 using HeuristicLab.Core;
 using System.Text;
-using HeuristicLab.Visualization.LabelProvider;
 using HeuristicLab.Visualization.Options;
 
@@ -15,25 +14,15 @@
   public class ChartDataRowsModel : ChartDataModelBase, IChartDataRowsModel{
     private string title = "Title";
-    private string xAxisLabel = "";
-    private bool showXAxisLabel = true;
-    private bool showXAxisGrid = true;
-    private ILabelProvider labelProvider = new ContinuousLabelProvider("0.##");
 
     private ViewSettings viewSettings = new ViewSettings();
 
-    public bool ShowXAxisGrid {
-      get { return showXAxisGrid; }
-      set {
-        this.showXAxisGrid = value;
-        OnModelChanged();
-      }
+    private readonly XAxisDescriptor xAxisDescriptor = new XAxisDescriptor();
+
+    public ChartDataRowsModel() {
+      this.XAxis.XAxisDescriptorChanged += delegate { OnModelChanged(); };
     }
 
-    public ILabelProvider XAxisLabelProvider {
-      get { return labelProvider; }
-      set{
-        this.labelProvider = value;
-        OnModelChanged();
-      }
+    public XAxisDescriptor XAxis {
+      get { return xAxisDescriptor; }
     }
 
@@ -52,9 +41,4 @@
 
     private readonly List<IDataRow> rows = new List<IDataRow>();
-    //private readonly List<string> xLabels = new List<string>();
-
-    //public List<string> XLabels{
-    //  get { return xLabels; }
-    //}
 
     public List<IDataRow> Rows{
@@ -70,75 +54,7 @@
     }
 
-    public string XAxisLabel {
-      get { return xAxisLabel; }
-      set {
-        xAxisLabel = value;
-        OnModelChanged();
-      }
-    }
-
-    public bool ShowXAxisLabel {
-      get { return showXAxisLabel; }
-      set {
-        showXAxisLabel = value;
-        OnModelChanged();
-      }
-    }
-
     public override IView CreateView() {
       return new LineChart(this);
     }
-
-    //public void AddLabel(string label) {
-    //  xLabels.Add(label);
-    //  OnModelChanged();
-    //}
-
-    //public void AddLabel(string label, int index) {
-    //  xLabels[index] = label;
-    //  OnModelChanged();
-    //}
-
-    //public void AddLabels(string[] labels) {
-    //  foreach (var s in labels){
-    //    AddLabel(s);
-    //  }
-    //  //OnModelChanged();
-    //}
-
-    //public void AddLabels(string[] labels, int index) {
-    //  int i = 0;
-    //  foreach (var s in labels){
-    //    AddLabel(s, index + i);
-    //    i++;
-    //  }
-    //  //OnModelChanged();
-    //}
-
-    //public void ModifyLabel(string label, int index) {
-    //  xLabels[index] = label;
-    //  OnModelChanged();
-    //}
-
-    //public void ModifyLabels(string[] labels, int index) {
-    //  int i = 0;
-    //  foreach (var s in labels){
-    //    ModifyLabel(s, index + i);
-    //    i++;
-    //  }
-    //  //OnModelChanged();
-    //}
-
-    //public void RemoveLabel(int index) {
-    //  xLabels.RemoveAt(index);
-    //  OnModelChanged();
-    //}
-
-    //public void RemoveLabels(int index, int count) {
-    //  for (int i = index; i < index + count; i++ ){
-    //    RemoveLabel(i);
-    //  }
-    //  //OnModelChanged();
-    //}
 
     private readonly YAxisDescriptor defaultYAxisDescriptor = new YAxisDescriptor();
@@ -228,5 +144,5 @@
       }
 
-      XmlNode labelProviderNode = document.ImportNode(labelProvider.GetLabelProviderXmlNode(), true);
+      XmlNode labelProviderNode = document.ImportNode(XAxis.XAxisLabelProvider.GetLabelProviderXmlNode(), true);
       node.AppendChild(labelProviderNode);
 
@@ -239,5 +155,5 @@
       foreach (XmlNode dataRow in node.ChildNodes) {
         if (dataRow.Name.Equals("LabelProvider")) {
-          labelProvider = labelProvider.PopulateLabelProviderXmlNode(dataRow);
+          XAxis.XAxisLabelProvider = XAxis.XAxisLabelProvider.PopulateLabelProviderXmlNode(dataRow);
         } else {
           XmlAttributeCollection attrs = dataRow.Attributes;
Index: /trunk/sources/HeuristicLab.Visualization/3.2/DataExport/CSVDataExport.cs
===================================================================
--- /trunk/sources/HeuristicLab.Visualization/3.2/DataExport/CSVDataExport.cs	(revision 1879)
+++ /trunk/sources/HeuristicLab.Visualization/3.2/DataExport/CSVDataExport.cs	(revision 1880)
@@ -27,5 +27,5 @@
 
         // write headers
-        writer.AddString(model.XAxisLabel);
+        writer.AddString(model.XAxis.XAxisLabel);
         foreach (IDataRow row in model.Rows)
           writer.AddString(row.Label);
Index: /trunk/sources/HeuristicLab.Visualization/3.2/HeuristicLab.Visualization-3.2.csproj
===================================================================
--- /trunk/sources/HeuristicLab.Visualization/3.2/HeuristicLab.Visualization-3.2.csproj	(revision 1879)
+++ /trunk/sources/HeuristicLab.Visualization/3.2/HeuristicLab.Visualization-3.2.csproj	(revision 1880)
@@ -115,4 +115,5 @@
     <Compile Include="LabelProvider\ContinuousLabelProvider.cs" />
     <Compile Include="LabelProvider\DiscreteLabelProvider.cs" />
+    <Compile Include="XAxisDescriptor.cs" />
     <Compile Include="YAxisGrid.cs" />
     <Compile Include="HorizontalLineShape.cs" />
Index: /trunk/sources/HeuristicLab.Visualization/3.2/IChartDataRowsModel.cs
===================================================================
--- /trunk/sources/HeuristicLab.Visualization/3.2/IChartDataRowsModel.cs	(revision 1879)
+++ /trunk/sources/HeuristicLab.Visualization/3.2/IChartDataRowsModel.cs	(revision 1880)
@@ -8,6 +8,6 @@
     string Title { get; set; }
     List<IDataRow> Rows { get; }
-    ILabelProvider XAxisLabelProvider { get; set; }
 
+    XAxisDescriptor XAxis { get; }
     List<YAxisDescriptor> YAxes { get; }
 
@@ -19,8 +19,4 @@
     ViewSettings ViewSettings { get; set; }
 
-    string XAxisLabel { get; set; }
-    bool ShowXAxisLabel { get; set; }
-    bool ShowXAxisGrid { get; set; }
-
     event ModelChangedHandler ModelChanged;
     event DataRowAddedHandler DataRowAdded;
Index: /trunk/sources/HeuristicLab.Visualization/3.2/LineChart.cs
===================================================================
--- /trunk/sources/HeuristicLab.Visualization/3.2/LineChart.cs	(revision 1879)
+++ /trunk/sources/HeuristicLab.Visualization/3.2/LineChart.cs	(revision 1880)
@@ -58,4 +58,6 @@
       this.ResizeRedraw = true;
 
+      canvasUI.BeforePaint += delegate { UpdateLayout(); };
+
       UpdateLayout();
       ZoomToFullView();
@@ -78,5 +80,5 @@
       SetLegendPosition();
 
-      this.Invalidate(true);
+      canvasUI.Invalidate();
     }
 
@@ -89,5 +91,5 @@
       titleShape.Text = model.Title;
 
-      if (model.ShowXAxisGrid) {
+      if (model.XAxis.ShowXAxisGrid) {
         canvas.AddShape(xAxisGrid);
       }
@@ -105,6 +107,6 @@
       }
 
-      xAxis.ShowLabel = model.ShowXAxisLabel;
-      xAxis.Label = model.XAxisLabel;
+      xAxis.ShowLabel = model.XAxis.ShowXAxisLabel;
+      xAxis.Label = model.XAxis.XAxisLabel;
 
       canvas.AddShape(xAxis);
@@ -246,5 +248,5 @@
       legendShape.CreateLegend();
 
-      this.Invalidate(true);
+      canvasUI.Invalidate();
     }
 
@@ -287,5 +289,5 @@
       rowEntry.LinesShape.UpdateStyle(row);
 
-      this.Invalidate(true);
+      canvasUI.Invalidate();
     }
 
@@ -322,5 +324,5 @@
       InitLineShapes(row);
 
-      this.Invalidate(true);
+      canvasUI.Invalidate();
     }
 
@@ -333,5 +335,5 @@
       rowEntries.RemoveAll(delegate(RowEntry rowEntry) { return rowEntry.DataRow == row; });
 
-      this.Invalidate(true);
+      canvasUI.Invalidate();
     }
 
@@ -349,5 +351,5 @@
       }
 
-      this.Invalidate(true);
+      canvasUI.Invalidate();
     }
 
@@ -484,5 +486,5 @@
 
     private void OnModelChanged() {
-      this.Invalidate(true);
+      canvasUI.Invalidate();
     }
 
@@ -503,5 +505,5 @@
 
       if (beginUpdateCount == 0) {
-        this.Invalidate(true);
+        canvasUI.Invalidate();
       }
     }
@@ -523,5 +525,5 @@
       }
 
-      this.Invalidate(true);
+      canvasUI.Invalidate();
     }
 
@@ -544,10 +546,10 @@
 
       userInteractionShape.RemoveShape(rectangleShape);
-      this.Invalidate(true);
+      canvasUI.Invalidate();
     }
 
     private void DrawRectangle(Rectangle rectangle) {
       rectangleShape.Rectangle = Transform.ToWorld(rectangle, userInteractionShape.Viewport, userInteractionShape.ClippingArea);
-      this.Invalidate(true);
+      canvasUI.Invalidate();
     }
 
@@ -615,5 +617,5 @@
         }
 
-        this.Invalidate(true);
+        canvasUI.Invalidate();
       }
     }
Index: /trunk/sources/HeuristicLab.Visualization/3.2/Options/Options.cs
===================================================================
--- /trunk/sources/HeuristicLab.Visualization/3.2/Options/Options.cs	(revision 1879)
+++ /trunk/sources/HeuristicLab.Visualization/3.2/Options/Options.cs	(revision 1880)
@@ -66,5 +66,5 @@
 
     public void ResetSettings() {
-      model.ShowXAxisGrid = oldShowXAxisGrid;
+      model.XAxis.ShowXAxisGrid = oldShowXAxisGrid;
 
       foreach (var param in oldLineParams) {
@@ -102,9 +102,9 @@
     }
 
-    private IList<int> GetThicknesses() {
+    private static IList<int> GetThicknesses() {
       return new List<int>(new[] {1, 2, 3, 4, 5, 6, 7, 8});
     }
 
-    private IList<DrawingStyle> GetStyles() {
+    private static IList<DrawingStyle> GetStyles() {
       return new List<DrawingStyle>(new[] {DrawingStyle.Solid, DrawingStyle.Dashed});
     }
@@ -153,6 +153,6 @@
 
     private void Options_Load(object sender, EventArgs e) {
-      oldShowXAxisGrid = model.ShowXAxisGrid;
-      chkShowXAxisGrid.Checked = model.ShowXAxisGrid;
+      oldShowXAxisGrid = model.XAxis.ShowXAxisGrid;
+      chkShowXAxisGrid.Checked = model.XAxis.ShowXAxisGrid;
 
       InitTabPageLines();
@@ -245,5 +245,5 @@
 
     private void chkShowXAxisGrid_CheckedChanged(object sender, EventArgs e) {
-      model.ShowXAxisGrid = chkShowXAxisGrid.Checked;
+      model.XAxis.ShowXAxisGrid = chkShowXAxisGrid.Checked;
     }
 
Index: /trunk/sources/HeuristicLab.Visualization/3.2/Options/OptionsDialog.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Visualization/3.2/Options/OptionsDialog.Designer.cs	(revision 1879)
+++ /trunk/sources/HeuristicLab.Visualization/3.2/Options/OptionsDialog.Designer.cs	(revision 1880)
@@ -60,5 +60,5 @@
       // 
       this.options.Location = new System.Drawing.Point(2, 3);
-      chartDataRowsModel1.ShowXAxisLabel = true;
+      chartDataRowsModel1.XAxis.ShowXAxisLabel = true;
       chartDataRowsModel1.Title = "Title";
       viewSettings1.LegendColor = System.Drawing.Color.Blue;
@@ -70,6 +70,6 @@
       viewSettings1.XAxisFont = new System.Drawing.Font("Arial", 8F);
       chartDataRowsModel1.ViewSettings = viewSettings1;
-      chartDataRowsModel1.XAxisLabel = "";
-      chartDataRowsModel1.XAxisLabelProvider = continuousLabelProvider1;
+      chartDataRowsModel1.XAxis.XAxisLabel = "";
+      chartDataRowsModel1.XAxis.XAxisLabelProvider = continuousLabelProvider1;
       this.options.Model = chartDataRowsModel1;
       this.options.Name = "options";
Index: /trunk/sources/HeuristicLab.Visualization/3.2/XAxisDescriptor.cs
===================================================================
--- /trunk/sources/HeuristicLab.Visualization/3.2/XAxisDescriptor.cs	(revision 1880)
+++ /trunk/sources/HeuristicLab.Visualization/3.2/XAxisDescriptor.cs	(revision 1880)
@@ -0,0 +1,51 @@
+using HeuristicLab.Visualization.LabelProvider;
+
+namespace HeuristicLab.Visualization {
+  public delegate void XAxisDescriptorChangedHandler(XAxisDescriptor sender);
+
+  public class XAxisDescriptor {
+    private string xAxisLabel = "";
+    private bool showXAxisLabel = true;
+    private bool showXAxisGrid = true;
+    private ILabelProvider xAxisLabelProvider = new ContinuousLabelProvider("0.##");
+
+    public event XAxisDescriptorChangedHandler XAxisDescriptorChanged;
+
+    public bool ShowXAxisGrid {
+      get { return showXAxisGrid; }
+      set {
+        this.showXAxisGrid = value;
+        FireXAxisDescriptorChanged();
+      }
+    }
+
+    public ILabelProvider XAxisLabelProvider {
+      get { return xAxisLabelProvider; }
+      set {
+        this.xAxisLabelProvider = value;
+        FireXAxisDescriptorChanged();
+      }
+    }
+
+    public string XAxisLabel {
+      get { return xAxisLabel; }
+      set {
+        xAxisLabel = value;
+        FireXAxisDescriptorChanged();
+      }
+    }
+
+    public bool ShowXAxisLabel {
+      get { return showXAxisLabel; }
+      set {
+        showXAxisLabel = value;
+        FireXAxisDescriptorChanged();
+      }
+    }
+
+    private void FireXAxisDescriptorChanged() {
+      if (XAxisDescriptorChanged != null)
+        XAxisDescriptorChanged(this);
+    }
+  }
+}
