Index: /trunk/sources/HeuristicLab.Visualization/CompositeShape.cs
===================================================================
--- /trunk/sources/HeuristicLab.Visualization/CompositeShape.cs	(revision 986)
+++ /trunk/sources/HeuristicLab.Visualization/CompositeShape.cs	(revision 987)
@@ -24,4 +24,9 @@
     }
 
+    public void ClearShapes() {
+      shapes.Clear();
+      boundingBox = RectangleD.Empty;
+    }
+
     public void AddShape(IShape shape) {
       if (shapes.Count == 0) {
Index: /trunk/sources/HeuristicLab.Visualization/LineChart.cs
===================================================================
--- /trunk/sources/HeuristicLab.Visualization/LineChart.cs	(revision 986)
+++ /trunk/sources/HeuristicLab.Visualization/LineChart.cs	(revision 987)
@@ -51,5 +51,4 @@
       minDataValue = Double.PositiveInfinity;
       maxDataValue = Double.NegativeInfinity;
-
     }
 
@@ -88,5 +87,20 @@
         maxDataRowCount = row.Count;
       
-      InitShapes(row);
+      InitLineShapes(row);
+      InitXAxis();
+    }
+
+    private void InitXAxis() {
+      int numLabels = 0;
+
+      foreach (IDataRow row in model.Rows) {
+        numLabels = Math.Max(numLabels, row.Count);
+      }
+
+      xAxis.ClearLabels();
+
+      for (int i = 0; i < numLabels; i++) {
+        xAxis.SetLabel(i, i.ToString());
+      }
     }
 
@@ -101,7 +115,5 @@
     }
 
-    private void InitShapes(IDataRow row) {
-      
-       
+    private void InitLineShapes(IDataRow row) {
       List<LineShape> lineShapes = new List<LineShape>();
       if (row.Count > 0) {
@@ -132,4 +144,6 @@
     // TODO use action parameter
     private void OnRowValueChanged(IDataRow row, double value, int index, Action action) {
+      xAxis.SetLabel(index, index.ToString());
+
       List<LineShape> lineShapes = rowToLineShapes[row];
       maxDataValue = Math.Max(value, maxDataValue);
@@ -142,5 +156,4 @@
       // new value was added
       if (index > 0 && index == lineShapes.Count + 1) {
-        
         if (maxDataRowCount < row.Count)
           maxDataRowCount = row.Count;
@@ -148,5 +161,5 @@
         lineShapes.Add(lineShape);
         // TODO each DataRow needs its own WorldShape so Y Axes can be zoomed independently.
-        canvasUI1.MainCanvas.WorldShape.AddShape(lineShape);
+        root.AddShape(lineShape);
       }
 
@@ -171,5 +184,7 @@
     }
 
-    private void OnModelChanged() {}
+    private void OnModelChanged() {
+      InitXAxis();
+    }
 
     #endregion
Index: /trunk/sources/HeuristicLab.Visualization/XAxis.cs
===================================================================
--- /trunk/sources/HeuristicLab.Visualization/XAxis.cs	(revision 986)
+++ /trunk/sources/HeuristicLab.Visualization/XAxis.cs	(revision 987)
@@ -1,5 +1,64 @@
+using System.Collections.Generic;
+using System.Drawing;
+
 namespace HeuristicLab.Visualization {
+  // TODO move to own file
+  public class TextShape : IShape {
+    private readonly double x;
+    private readonly double y;
+    private string text;
+
+    private Font font = new Font("Arial", 8);
+    private Brush brush = new SolidBrush(Color.Blue);
+
+    public TextShape(double x, double y, string text) {
+      this.x = x;
+      this.y = y;
+      this.text = text;
+    }
+
+    public void Draw(Graphics graphics, Rectangle viewport, RectangleD clippingArea) {
+      int screenX = Transform.ToScreenX(x, viewport, clippingArea);
+      int screenY = Transform.ToScreenY(y, viewport, clippingArea);
+
+      graphics.DrawString(text, font, brush, screenX, screenY);
+    }
+
+    public RectangleD BoundingBox {
+      get { return RectangleD.Empty; }
+    }
+
+    public string Text {
+      get { return text; }
+      set { text = value; }
+    }
+  }
+
   public class XAxis : CompositeShape {
+    private readonly List<TextShape> labels = new List<TextShape>();
+    private readonly LineShape axisLine = new LineShape(0, 0, 0, 0, 0, Color.Black, 1, DrawingStyle.Solid);
 
+    public void ClearLabels() {
+      shapes.Clear();
+      labels.Clear();
+
+      shapes.Add(axisLine);
+    }
+
+    public override void Draw(Graphics graphics, Rectangle viewport, RectangleD clippingArea) {
+      axisLine.X1 = Transform.ToWorldX(viewport.Left, viewport, clippingArea);
+      axisLine.X2 = Transform.ToWorldX(viewport.Right, viewport, clippingArea);
+
+      base.Draw(graphics, viewport, clippingArea);
+    }
+
+    public void SetLabel(int i, string text) {
+      while (i >= labels.Count) {
+        TextShape label = new TextShape(i, 0, i.ToString());
+        labels.Add(label);
+        AddShape(label);
+      }
+      labels[i].Text = text;
+    }
   }
 }
