diff --git a/bundles/org.eclipse.rap.addons.chart/src/org/eclipse/rap/addons/chart/basic/BarChart.java b/bundles/org.eclipse.rap.addons.chart/src/org/eclipse/rap/addons/chart/basic/BarChart.java
index 85a6bde..a78cb56 100644
--- a/bundles/org.eclipse.rap.addons.chart/src/org/eclipse/rap/addons/chart/basic/BarChart.java
+++ b/bundles/org.eclipse.rap.addons.chart/src/org/eclipse/rap/addons/chart/basic/BarChart.java
@@ -10,6 +10,8 @@
  ******************************************************************************/
 package org.eclipse.rap.addons.chart.basic;
 
+import static org.eclipse.rap.addons.chart.internal.ColorUtil.toHtmlString;
+
 import org.eclipse.rap.addons.chart.NvChart;
 import org.eclipse.rap.json.JsonArray;
 import org.eclipse.rap.json.JsonObject;
@@ -67,12 +69,23 @@
    *
    * @param items the data items to display
    */
-  public void setItems( BarItem... items ) {
+  public void setItems( DataItem... items ) {
     JsonArray values = new JsonArray();
-    for( BarItem item : items ) {
-      values.add( item.toJson() );
+    for( DataItem item : items ) {
+      values.add( toJson( item ) );
     }
     setItems( new JsonArray().add( new JsonObject().add( "values", values ) ) );
   }
 
+  private static JsonObject toJson( DataItem item ) {
+    JsonObject json = new JsonObject().add( "value", item.value );
+    if( item.text != null ) {
+      json.add( "label", item.text );
+    }
+    if( item.color != null ) {
+      json.add( "color", toHtmlString( item.color ) );
+    }
+    return json;
+  }
+
 }
diff --git a/bundles/org.eclipse.rap.addons.chart/src/org/eclipse/rap/addons/chart/basic/BarItem.java b/bundles/org.eclipse.rap.addons.chart/src/org/eclipse/rap/addons/chart/basic/BarItem.java
deleted file mode 100644
index b709f7e..0000000
--- a/bundles/org.eclipse.rap.addons.chart/src/org/eclipse/rap/addons/chart/basic/BarItem.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2016 EclipseSource and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ralf Sternberg - initial API and implementation
- ******************************************************************************/
-package org.eclipse.rap.addons.chart.basic;
-
-import static org.eclipse.rap.addons.chart.internal.ColorUtil.toHtmlString;
-
-import org.eclipse.rap.json.JsonObject;
-import org.eclipse.swt.graphics.RGB;
-
-
-/**
- * Represents a bar in a bar chart.
- *
- * @see BarChart
- */
-public class BarItem {
-
-  protected final double value;
-  protected final String text;
-  protected final RGB color;
-
-  /**
-   * Create a new bar item with the given value and text.
-   *
-   * @param value the value of the item, affects the size of the bar
-   * @param text the label text for the item, or <code>null</code> to omit the label
-   */
-  public BarItem( double value, String text ) {
-    this( value, text, null );
-  }
-
-  /**
-   * Create a new bar item with the given value, text, and color.
-   *
-   * @param value the value of the item, affects the size of the bar
-   * @param text the label text for the item, or <code>null</code> to omit the label
-   * @param color the color of this item, or <code>null</code> to use the default color
-   */
-  public BarItem( double value, String text, RGB color ) {
-    this.value = value;
-    this.text = text;
-    this.color = color;
-  }
-
-  protected JsonObject toJson() {
-    JsonObject json = new JsonObject().add( "value", value );
-    if( text != null ) {
-      json.add( "label", text );
-    }
-    if( color != null ) {
-      json.add( "color", toHtmlString( color ) );
-    }
-    return json;
-  }
-
-}
diff --git a/bundles/org.eclipse.rap.addons.chart/src/org/eclipse/rap/addons/chart/basic/DataGroup.java b/bundles/org.eclipse.rap.addons.chart/src/org/eclipse/rap/addons/chart/basic/DataGroup.java
new file mode 100644
index 0000000..60119bc
--- /dev/null
+++ b/bundles/org.eclipse.rap.addons.chart/src/org/eclipse/rap/addons/chart/basic/DataGroup.java
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * Copyright (c) 2016 EclipseSource and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Ralf Sternberg - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.rap.addons.chart.basic;
+
+import org.eclipse.swt.graphics.RGB;
+
+
+/**
+ * Represents a series of data items in a chart.
+ */
+public class DataGroup {
+
+  protected final DataItem[] items;
+  protected final String text;
+  protected final RGB color;
+
+  /**
+   * Create a new group of data items with the given text.
+   *
+   * @param items the items of the group
+   * @param text the label text for the group, or <code>null</code> to omit the label
+   */
+  public DataGroup( DataItem[] items, String text ) {
+    this( items, text, null );
+  }
+
+  /**
+   * Create a new group of data items with the given text and color.
+   *
+   * @param items the items of the group
+   * @param text the label text for the group, or <code>null</code> to omit the label
+   * @param color the color of this group, or <code>null</code> to use the default color
+   */
+  public DataGroup( DataItem[] items, String text, RGB color ) {
+    this.items = items;
+    this.text = text;
+    this.color = color;
+  }
+
+}
diff --git a/bundles/org.eclipse.rap.addons.chart/src/org/eclipse/rap/addons/chart/basic/DataItem.java b/bundles/org.eclipse.rap.addons.chart/src/org/eclipse/rap/addons/chart/basic/DataItem.java
new file mode 100644
index 0000000..e9dbac8
--- /dev/null
+++ b/bundles/org.eclipse.rap.addons.chart/src/org/eclipse/rap/addons/chart/basic/DataItem.java
@@ -0,0 +1,84 @@
+/*******************************************************************************
+ * Copyright (c) 2016 EclipseSource and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Ralf Sternberg - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.rap.addons.chart.basic;
+
+import org.eclipse.swt.graphics.RGB;
+
+
+/**
+ * Represents a data item in a chart.
+ */
+public class DataItem {
+
+  protected final double value;
+  protected final String text;
+  protected final RGB color;
+
+  /**
+   * Create a new data item with the given value.
+   *
+   * @param value the value of the item
+   */
+  public DataItem( double value ) {
+    this( value, null );
+  }
+
+  /**
+   * Create a new data item with the given value and text.
+   *
+   * @param value the value of the item
+   * @param text the label text for the item, or <code>null</code> to omit the label
+   */
+  public DataItem( double value, String text ) {
+    this( value, text, null );
+  }
+
+  /**
+   * Create a new data item with the given value, text, and color.
+   *
+   * @param value the value of the item
+   * @param text the label text for the item, or <code>null</code> to omit the label
+   * @param color the color of this item, or <code>null</code> to use the default color
+   */
+  public DataItem( double value, String text, RGB color ) {
+    this.value = value;
+    this.text = text;
+    this.color = color;
+  }
+
+  /**
+   * Returns the value of this data item.
+   *
+   * @return the item value
+   */
+  public double getValue() {
+    return value;
+  }
+
+  /**
+   * Returns the text for this data item.
+   *
+   * @return the item text, can be <code>null</code>
+   */
+  public String getText() {
+    return text;
+  }
+
+  /**
+   * Returns the color for this data item.
+   *
+   * @return the item color, can be <code>null</code>
+   */
+  public RGB getColor() {
+    return color;
+  }
+
+}
diff --git a/bundles/org.eclipse.rap.addons.chart/src/org/eclipse/rap/addons/chart/basic/DataItem2D.java b/bundles/org.eclipse.rap.addons.chart/src/org/eclipse/rap/addons/chart/basic/DataItem2D.java
new file mode 100644
index 0000000..acbbc7f
--- /dev/null
+++ b/bundles/org.eclipse.rap.addons.chart/src/org/eclipse/rap/addons/chart/basic/DataItem2D.java
@@ -0,0 +1,75 @@
+/*******************************************************************************
+ * Copyright (c) 2016 EclipseSource and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Ralf Sternberg - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.rap.addons.chart.basic;
+
+import org.eclipse.swt.graphics.RGB;
+
+
+/**
+ * Represents a two-dimensional data item in a chart.
+ */
+public class DataItem2D extends DataItem {
+
+  protected final double x;
+
+  /**
+   * Create a new data item with the given values.
+   *
+   * @param x the x value of the item
+   * @param y the y value of the item
+   */
+  public DataItem2D( double x, double y ) {
+    this( x, y, null );
+  }
+
+  /**
+   * Create a new data item with the given values and text.
+   *
+   * @param x the x value of the item
+   * @param y the y value of the item
+   * @param text the label text for the item, or <code>null</code> to omit the label
+   */
+  public DataItem2D( double x, double y, String text ) {
+    this( x, y, text, null );
+  }
+
+  /**
+   * Create a new data item with the given values, text, and color.
+   *
+   * @param x the x value of the item
+   * @param y the y value of the item
+   * @param text the label text for the item, or <code>null</code> to omit the label
+   * @param color the color of this item, or <code>null</code> to use the default color
+   */
+  public DataItem2D( double x, double y, String text, RGB color ) {
+    super( y, text, color );
+    this.x = x;
+  }
+
+  /**
+   * Returns the x value of this data item.
+   *
+   * @return the item's x value
+   */
+  public double getX() {
+    return x;
+  }
+
+  /**
+   * Returns the y value of this data item.
+   *
+   * @return the item's y value
+   */
+  public double getY() {
+    return value;
+  }
+
+}
diff --git a/bundles/org.eclipse.rap.addons.chart/src/org/eclipse/rap/addons/chart/basic/DataPoint.java b/bundles/org.eclipse.rap.addons.chart/src/org/eclipse/rap/addons/chart/basic/DataPoint.java
deleted file mode 100644
index 9b16af4..0000000
--- a/bundles/org.eclipse.rap.addons.chart/src/org/eclipse/rap/addons/chart/basic/DataPoint.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2016 EclipseSource and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ralf Sternberg - initial API and implementation
- ******************************************************************************/
-package org.eclipse.rap.addons.chart.basic;
-
-import org.eclipse.rap.json.JsonObject;
-
-
-/**
- * Represents a data point in a Cartesian plane.
- */
-public class DataPoint {
-
-  /**
-   * the x coordinate of the point
-   */
-  public final double x;
-
-  /**
-   * the y coordinate of the point
-   */
-  public final double y;
-
-  /**
-   * Creates a new data point with the given coordinates.
-   *
-   * @param x the x coordinate of this point
-   * @param y the y coordinate of this point
-   */
-  public DataPoint( double x, double y ) {
-    this.x = x;
-    this.y = y;
-  }
-
-  protected JsonObject toJson() {
-    return new JsonObject().add( "x", x ).add( "y", y );
-  }
-
-}
diff --git a/bundles/org.eclipse.rap.addons.chart/src/org/eclipse/rap/addons/chart/basic/LineChart.java b/bundles/org.eclipse.rap.addons.chart/src/org/eclipse/rap/addons/chart/basic/LineChart.java
index 5b4067d..9bc183b 100644
--- a/bundles/org.eclipse.rap.addons.chart/src/org/eclipse/rap/addons/chart/basic/LineChart.java
+++ b/bundles/org.eclipse.rap.addons.chart/src/org/eclipse/rap/addons/chart/basic/LineChart.java
@@ -10,8 +10,11 @@
  ******************************************************************************/
 package org.eclipse.rap.addons.chart.basic;
 
+import static org.eclipse.rap.addons.chart.internal.ColorUtil.toHtmlString;
+
 import org.eclipse.rap.addons.chart.NvChart;
 import org.eclipse.rap.json.JsonArray;
+import org.eclipse.rap.json.JsonObject;
 import org.eclipse.swt.widgets.Composite;
 
 
@@ -142,12 +145,33 @@
    *
    * @param items the data items to display
    */
-  public void setItems( LineItem... items ) {
+  public void setItems( DataGroup... items ) {
     JsonArray values = new JsonArray();
-    for( LineItem item : items ) {
-      values.add( item.toJson() );
+    for( DataGroup item : items ) {
+      values.add( toJson( item ) );
     }
     setItems( values );
   }
 
+  private static JsonObject toJson( DataGroup group ) {
+    JsonArray values = new JsonArray();
+    for( int i = 0; i < group.items.length; i++ ) {
+      DataItem item = group.items[ i ];
+      if( item instanceof DataItem2D ) {
+        DataItem2D item2d = ( DataItem2D )item;
+        values.add( new JsonObject().add( "x", item2d.getX() ).add( "y", item2d.getY() ) );
+      } else {
+        values.add( new JsonObject().add( "x", i ).add( "y", item.getValue() ) );
+      }
+    }
+    JsonObject json = new JsonObject().add( "values", values );
+    if( group.text != null ) {
+      json.add( "key", group.text );
+    }
+    if( group.color != null ) {
+      json.add( "color", toHtmlString( group.color ) );
+    }
+    return json;
+  }
+
 }
diff --git a/bundles/org.eclipse.rap.addons.chart/src/org/eclipse/rap/addons/chart/basic/LineItem.java b/bundles/org.eclipse.rap.addons.chart/src/org/eclipse/rap/addons/chart/basic/LineItem.java
deleted file mode 100644
index 50a02a9..0000000
--- a/bundles/org.eclipse.rap.addons.chart/src/org/eclipse/rap/addons/chart/basic/LineItem.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2016 EclipseSource and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ralf Sternberg - initial API and implementation
- ******************************************************************************/
-package org.eclipse.rap.addons.chart.basic;
-
-import static org.eclipse.rap.addons.chart.internal.ColorUtil.toHtmlString;
-
-import org.eclipse.rap.json.JsonArray;
-import org.eclipse.rap.json.JsonObject;
-import org.eclipse.swt.graphics.RGB;
-
-
-/**
- * Represents a line in a line chart.
- *
- * @see LineChart
- */
-public class LineItem {
-
-  protected final DataPoint[] points;
-  protected final String text;
-  protected final RGB color;
-
-  /**
-   * Creates a line with the given data points and text. Later changes to the data points won't be
-   * reflected in the chart.
-   *
-   * @param points the data point that form the line
-   * @param text the label text for the line, or <code>null</code> to omit the label
-   */
-  public LineItem( DataPoint[] points, String text ) {
-    this( points, text, null );
-  }
-
-  /**
-   * Creates a line with the given data points, text, and color. Later changes to the data points
-   * won't be reflected in the chart.
-   *
-   * @param points the data point that form the line
-   * @param text the label text for the line, or <code>null</code> to omit the label
-   * @param color the color of this line, or <code>null</code> to use the default color
-   */
-  public LineItem( DataPoint[] points, String text, RGB color ) {
-    this.points = points;
-    this.text = text;
-    this.color = color;
-  }
-
-  protected JsonObject toJson() {
-    JsonArray values = new JsonArray();
-    for( DataPoint point : points ) {
-      values.add( point.toJson() );
-    }
-    JsonObject json = new JsonObject().add( "values", values );
-    if( text != null ) {
-      json.add( "key", text );
-    }
-    if( color != null ) {
-      json.add( "color", toHtmlString( color ) );
-    }
-    return json;
-  }
-
-}
diff --git a/bundles/org.eclipse.rap.addons.chart/src/org/eclipse/rap/addons/chart/basic/PieChart.java b/bundles/org.eclipse.rap.addons.chart/src/org/eclipse/rap/addons/chart/basic/PieChart.java
index 36ccac3..cd116fa 100644
--- a/bundles/org.eclipse.rap.addons.chart/src/org/eclipse/rap/addons/chart/basic/PieChart.java
+++ b/bundles/org.eclipse.rap.addons.chart/src/org/eclipse/rap/addons/chart/basic/PieChart.java
@@ -10,8 +10,11 @@
  ******************************************************************************/
 package org.eclipse.rap.addons.chart.basic;
 
+import static org.eclipse.rap.addons.chart.internal.ColorUtil.toHtmlString;
+
 import org.eclipse.rap.addons.chart.NvChart;
 import org.eclipse.rap.json.JsonArray;
+import org.eclipse.rap.json.JsonObject;
 import org.eclipse.swt.widgets.Composite;
 
 
@@ -89,12 +92,23 @@
    *
    * @param items the data items to display
    */
-  public void setItems( PieItem... items ) {
+  public void setItems( DataItem... items ) {
     JsonArray values = new JsonArray();
-    for( PieItem item : items ) {
-      values.add( item.toJson() );
+    for( DataItem item : items ) {
+      values.add( toJson( item ) );
     }
     setItems( values );
   }
 
+  private static JsonObject toJson( DataItem item ) {
+    JsonObject json = new JsonObject().add( "value", item.value );
+    if( item.text != null ) {
+      json.add( "label", item.text );
+    }
+    if( item.color != null ) {
+      json.add( "color", toHtmlString( item.color ) );
+    }
+    return json;
+  }
+
 }
diff --git a/bundles/org.eclipse.rap.addons.chart/src/org/eclipse/rap/addons/chart/basic/PieItem.java b/bundles/org.eclipse.rap.addons.chart/src/org/eclipse/rap/addons/chart/basic/PieItem.java
deleted file mode 100644
index 295f746..0000000
--- a/bundles/org.eclipse.rap.addons.chart/src/org/eclipse/rap/addons/chart/basic/PieItem.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2016 EclipseSource and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ralf Sternberg - initial API and implementation
- ******************************************************************************/
-package org.eclipse.rap.addons.chart.basic;
-
-import static org.eclipse.rap.addons.chart.internal.ColorUtil.toHtmlString;
-
-import org.eclipse.rap.json.JsonObject;
-import org.eclipse.swt.graphics.RGB;
-
-
-/**
- * Represents a segment of a pie/donut chart.
- *
- * @see PieChart
- */
-public class PieItem {
-
-  protected final double value;
-  protected final String text;
-  protected final RGB color;
-
-  /**
-   * Create a new pie item with the given value and text.
-   *
-   * @param value the value of the item, affects the size of the section, should not be negative
-   * @param text the label text for the item, or <code>null</code> to omit the label
-   */
-  public PieItem( double value, String text ) {
-    this( value, text, null );
-  }
-
-  /**
-   * Create a new pie item with the given value, text, and color.
-   *
-   * @param value the value of the item, affects the size of the section, should not be negative
-   * @param text the label text for the item, or <code>null</code> to omit the label
-   * @param color the color of this section, or <code>null</code> to use the default color
-   */
-  public PieItem( double value, String text, RGB color ) {
-    this.value = value;
-    this.text = text;
-    this.color = color;
-  }
-
-  protected JsonObject toJson() {
-    JsonObject json = new JsonObject().add( "value", value );
-    if( text != null ) {
-      json.add( "label", text );
-    }
-    if( color != null ) {
-      json.add( "color", toHtmlString( color ) );
-    }
-    return json;
-  }
-
-}
diff --git a/examples/org.eclipse.rap.addons.chart.demo/src/org/eclipse/rap/addons/chart/demo/BarChartSnippet.java b/examples/org.eclipse.rap.addons.chart.demo/src/org/eclipse/rap/addons/chart/demo/BarChartSnippet.java
index ea065d8..39e0d30 100644
--- a/examples/org.eclipse.rap.addons.chart.demo/src/org/eclipse/rap/addons/chart/demo/BarChartSnippet.java
+++ b/examples/org.eclipse.rap.addons.chart.demo/src/org/eclipse/rap/addons/chart/demo/BarChartSnippet.java
@@ -13,7 +13,7 @@
 import static org.eclipse.rap.addons.chart.demo.Colors.CAT10_COLORS;
 
 import org.eclipse.rap.addons.chart.basic.BarChart;
-import org.eclipse.rap.addons.chart.basic.BarItem;
+import org.eclipse.rap.addons.chart.basic.DataItem;
 import org.eclipse.rap.rwt.application.AbstractEntryPoint;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.layout.GridData;
@@ -62,13 +62,13 @@
     barChart.setItems( createItems() );
   }
 
-  private static BarItem[] createItems() {
-    return new BarItem[] {
-      new BarItem( Math.random() * 100, "Item 1", CAT10_COLORS[ 0 ] ),
-      new BarItem( Math.random() * 100, "Item 2", CAT10_COLORS[ 1 ] ),
-      new BarItem( Math.random() * 100, "Item 3", CAT10_COLORS[ 2 ] ),
-      new BarItem( Math.random() * 100, "Item 4", CAT10_COLORS[ 3 ] ),
-      new BarItem( Math.random() * 100, "Item 5", CAT10_COLORS[ 4 ] )
+  private static DataItem[] createItems() {
+    return new DataItem[] {
+      new DataItem( Math.random() * 100, "Item 1", CAT10_COLORS[ 0 ] ),
+      new DataItem( Math.random() * 100, "Item 2", CAT10_COLORS[ 1 ] ),
+      new DataItem( Math.random() * 100, "Item 3", CAT10_COLORS[ 2 ] ),
+      new DataItem( Math.random() * 100, "Item 4", CAT10_COLORS[ 3 ] ),
+      new DataItem( Math.random() * 100, "Item 5", CAT10_COLORS[ 4 ] )
     };
   }
 
diff --git a/examples/org.eclipse.rap.addons.chart.demo/src/org/eclipse/rap/addons/chart/demo/LineChartSnippet.java b/examples/org.eclipse.rap.addons.chart.demo/src/org/eclipse/rap/addons/chart/demo/LineChartSnippet.java
index 895d96c..9627e0b 100644
--- a/examples/org.eclipse.rap.addons.chart.demo/src/org/eclipse/rap/addons/chart/demo/LineChartSnippet.java
+++ b/examples/org.eclipse.rap.addons.chart.demo/src/org/eclipse/rap/addons/chart/demo/LineChartSnippet.java
@@ -12,9 +12,9 @@
 
 import static org.eclipse.rap.addons.chart.demo.Colors.CAT10_COLORS;
 
-import org.eclipse.rap.addons.chart.basic.DataPoint;
 import org.eclipse.rap.addons.chart.basic.LineChart;
-import org.eclipse.rap.addons.chart.basic.LineItem;
+import org.eclipse.rap.addons.chart.basic.DataGroup;
+import org.eclipse.rap.addons.chart.basic.DataItem;
 import org.eclipse.rap.rwt.application.AbstractEntryPoint;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.layout.GridData;
@@ -66,17 +66,17 @@
     lineChart.setItems( createItems() );
   }
 
-  private static LineItem[] createItems() {
-    return new LineItem[] {
-      new LineItem( createRandomPoints(), "Series 1", CAT10_COLORS[ 0 ] ),
-      new LineItem( createRandomPoints(), "Series 2", CAT10_COLORS[ 1 ] )
+  private static DataGroup[] createItems() {
+    return new DataGroup[] {
+      new DataGroup( createRandomPoints(), "Series 1", CAT10_COLORS[ 0 ] ),
+      new DataGroup( createRandomPoints(), "Series 2", CAT10_COLORS[ 1 ] )
     };
   }
 
-  private static DataPoint[] createRandomPoints() {
-    DataPoint[] values = new DataPoint[100];
+  private static DataItem[] createRandomPoints() {
+    DataItem[] values = new DataItem[100];
     for( int i = 0; i < values.length; i++ ) {
-      values[i] = new DataPoint( i, Math.random() * 100 );
+      values[i] = new DataItem( Math.random() * 100 );
     }
     return values;
   }
diff --git a/examples/org.eclipse.rap.addons.chart.demo/src/org/eclipse/rap/addons/chart/demo/PieChartSnippet.java b/examples/org.eclipse.rap.addons.chart.demo/src/org/eclipse/rap/addons/chart/demo/PieChartSnippet.java
index 9c29dac..5ffcf27 100644
--- a/examples/org.eclipse.rap.addons.chart.demo/src/org/eclipse/rap/addons/chart/demo/PieChartSnippet.java
+++ b/examples/org.eclipse.rap.addons.chart.demo/src/org/eclipse/rap/addons/chart/demo/PieChartSnippet.java
@@ -11,7 +11,7 @@
 package org.eclipse.rap.addons.chart.demo;
 
 
-import org.eclipse.rap.addons.chart.basic.PieItem;
+import org.eclipse.rap.addons.chart.basic.DataItem;
 
 import static org.eclipse.rap.addons.chart.demo.Colors.CAT10_COLORS;
 
@@ -65,13 +65,13 @@
     pieChart.setItems( createItems() );
   }
 
-  private static PieItem[] createItems() {
-    return new PieItem[] {
-      new PieItem( Math.random() * 100, "Item 1", CAT10_COLORS[ 0 ] ),
-      new PieItem( Math.random() * 100, "Item 2", CAT10_COLORS[ 1 ] ),
-      new PieItem( Math.random() * 100, "Item 3", CAT10_COLORS[ 2 ] ),
-      new PieItem( Math.random() * 100, "Item 4", CAT10_COLORS[ 3 ] ),
-      new PieItem( Math.random() * 100, "Item 5", CAT10_COLORS[ 4 ] )
+  private static DataItem[] createItems() {
+    return new DataItem[] {
+      new DataItem( Math.random() * 100, "Item 1", CAT10_COLORS[ 0 ] ),
+      new DataItem( Math.random() * 100, "Item 2", CAT10_COLORS[ 1 ] ),
+      new DataItem( Math.random() * 100, "Item 3", CAT10_COLORS[ 2 ] ),
+      new DataItem( Math.random() * 100, "Item 4", CAT10_COLORS[ 3 ] ),
+      new DataItem( Math.random() * 100, "Item 5", CAT10_COLORS[ 4 ] )
     };
   }
 
diff --git a/tests/org.eclipse.rap.addons.chart.test/src/org/eclipse/rap/addons/chart/basic/BarChart_Test.java b/tests/org.eclipse.rap.addons.chart.test/src/org/eclipse/rap/addons/chart/basic/BarChart_Test.java
index 63d8672..434982c 100644
--- a/tests/org.eclipse.rap.addons.chart.test/src/org/eclipse/rap/addons/chart/basic/BarChart_Test.java
+++ b/tests/org.eclipse.rap.addons.chart.test/src/org/eclipse/rap/addons/chart/basic/BarChart_Test.java
@@ -90,7 +90,7 @@
   public void testSetItems() {
     reset( remoteObject );
 
-    chart.setItems( new BarItem( 23, "foo" ), new BarItem( 42, "bar" ) );
+    chart.setItems( new DataItem( 23, "foo" ), new DataItem( 42, "bar" ) );
 
     String expected = "[ { \"values\": [ { \"value\": 23, \"label\": \"foo\" },"
                                       + "{ \"value\": 42, \"label\": \"bar\" } ] } ]";
diff --git a/tests/org.eclipse.rap.addons.chart.test/src/org/eclipse/rap/addons/chart/basic/BarItem_Test.java b/tests/org.eclipse.rap.addons.chart.test/src/org/eclipse/rap/addons/chart/basic/BarItem_Test.java
deleted file mode 100644
index 555c70b..0000000
--- a/tests/org.eclipse.rap.addons.chart.test/src/org/eclipse/rap/addons/chart/basic/BarItem_Test.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2016 EclipseSource and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ralf Sternberg - initial API and implementation
- ******************************************************************************/
-package org.eclipse.rap.addons.chart.basic;
-
-import static org.junit.Assert.assertEquals;
-
-import org.eclipse.rap.json.JsonObject;
-import org.eclipse.rap.json.JsonValue;
-import org.eclipse.swt.graphics.RGB;
-import org.junit.Test;
-
-
-public class BarItem_Test {
-
-  @Test
-  public void testToJson() {
-    BarItem item = new BarItem( 23, "foo", new RGB( 0, 8, 128 ) );
-
-    JsonObject json = item.toJson();
-
-    JsonValue expected = parse( "{'value': 23, 'label': 'foo', 'color': '#000880'}" );
-    assertEquals( expected, json );
-  }
-
-  @Test
-  public void testToJson_skipsMissingColor() {
-    BarItem item = new BarItem( 23, "foo" );
-
-    JsonObject json = item.toJson();
-
-    JsonValue expected = parse( "{'value': 23, 'label': 'foo'}" );
-    assertEquals( expected, json );
-  }
-
-  @Test
-  public void testToJson_skipsMissingText() {
-    BarItem item = new BarItem( 23, null, new RGB( 0, 8, 128 ) );
-
-    JsonObject json = item.toJson();
-
-    JsonValue expected = parse( "{'value': 23, 'color': '#000880'}" );
-    assertEquals( expected, json );
-  }
-
-  private static JsonValue parse( String json ) {
-    return JsonValue.readFrom( json.replace( '\'', '"' ) );
-  }
-
-}
diff --git a/tests/org.eclipse.rap.addons.chart.test/src/org/eclipse/rap/addons/chart/basic/DataPoint_Test.java b/tests/org.eclipse.rap.addons.chart.test/src/org/eclipse/rap/addons/chart/basic/DataPoint_Test.java
deleted file mode 100644
index 018e03f..0000000
--- a/tests/org.eclipse.rap.addons.chart.test/src/org/eclipse/rap/addons/chart/basic/DataPoint_Test.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2016 EclipseSource and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ralf Sternberg - initial API and implementation
- ******************************************************************************/
-package org.eclipse.rap.addons.chart.basic;
-
-import static org.junit.Assert.assertEquals;
-
-import org.eclipse.rap.json.JsonObject;
-import org.junit.Test;
-
-
-public class DataPoint_Test {
-
-  @Test
-  public void testToJson() {
-    DataPoint dataPoint = new DataPoint( 1.41, 3.14 );
-
-    JsonObject json = dataPoint.toJson();
-
-    assertEquals( new JsonObject().add( "x", 1.41 ).add( "y",  3.14 ), json );
-  }
-
-}
diff --git a/tests/org.eclipse.rap.addons.chart.test/src/org/eclipse/rap/addons/chart/basic/LineChart_Test.java b/tests/org.eclipse.rap.addons.chart.test/src/org/eclipse/rap/addons/chart/basic/LineChart_Test.java
index dc8dfb9..22b74d0 100644
--- a/tests/org.eclipse.rap.addons.chart.test/src/org/eclipse/rap/addons/chart/basic/LineChart_Test.java
+++ b/tests/org.eclipse.rap.addons.chart.test/src/org/eclipse/rap/addons/chart/basic/LineChart_Test.java
@@ -150,10 +150,10 @@
   public void testSetItems() {
     reset( remoteObject );
 
-    chart.setItems( new LineItem( new DataPoint[] { new DataPoint( 1, 2 ),
-                                                         new DataPoint( 3, 4 ) }, "foo" ),
-                    new LineItem( new DataPoint[] { new DataPoint( 2, 4 ),
-                                                         new DataPoint( 6, 8 ) }, "bar" ) );
+    chart.setItems( new DataGroup( new DataItem2D[] { new DataItem2D( 1, 2 ),
+                                                      new DataItem2D( 3, 4 ) }, "foo" ),
+                    new DataGroup( new DataItem2D[] { new DataItem2D( 2, 4 ),
+                                                      new DataItem2D( 6, 8 ) }, "bar" ) );
 
     String expected = "[{ \"values\": [{ \"x\": 1, \"y\": 2 },"
                                     + "{ \"x\": 3, \"y\": 4 }], \"key\": \"foo\" },"
diff --git a/tests/org.eclipse.rap.addons.chart.test/src/org/eclipse/rap/addons/chart/basic/LineItem_Test.java b/tests/org.eclipse.rap.addons.chart.test/src/org/eclipse/rap/addons/chart/basic/LineItem_Test.java
deleted file mode 100644
index 0f61ae5..0000000
--- a/tests/org.eclipse.rap.addons.chart.test/src/org/eclipse/rap/addons/chart/basic/LineItem_Test.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2016 EclipseSource and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ralf Sternberg - initial API and implementation
- ******************************************************************************/
-package org.eclipse.rap.addons.chart.basic;
-
-import static org.junit.Assert.assertEquals;
-
-import org.eclipse.rap.json.JsonObject;
-import org.eclipse.rap.json.JsonValue;
-import org.eclipse.swt.graphics.RGB;
-import org.junit.Test;
-
-
-public class LineItem_Test {
-
-  @Test
-  public void testToJson() {
-    DataPoint[] points = new DataPoint[] { new DataPoint( 1, 2 ), new DataPoint( 3, 4 ) };
-    LineItem item = new LineItem( points, "foo", new RGB( 0, 8, 128 ) );
-
-    JsonObject json = item.toJson();
-
-    JsonValue expected = parse( "{'values': [{'x': 1, 'y': 2}, {'x': 3, 'y': 4}],"
-                              + "'key': 'foo',"
-                              + "'color': '#000880'}" );
-    assertEquals( expected, json );
-  }
-
-  @Test
-  public void testToJson_skipsMissingColor() {
-    DataPoint[] points = new DataPoint[] { new DataPoint( 1, 2 ), new DataPoint( 3, 4 ) };
-    LineItem item = new LineItem( points, "foo" );
-
-    JsonObject json = item.toJson();
-
-    JsonValue expected = parse( "{'values': [{'x': 1, 'y': 2}, {'x': 3, 'y': 4}],"
-                              + "'key': 'foo'}" );
-    assertEquals( expected, json );
-  }
-
-  @Test
-  public void testToJson_skipsMissingText() {
-    DataPoint[] points = new DataPoint[] { new DataPoint( 1, 2 ), new DataPoint( 3, 4 ) };
-    LineItem item = new LineItem( points, null, new RGB( 0, 8, 128 ) );
-
-    JsonObject json = item.toJson();
-
-    JsonValue expected = parse( "{'values': [{'x': 1, 'y': 2}, {'x': 3, 'y': 4}],"
-                              + "'color': '#000880'}" );
-    assertEquals( expected, json );
-  }
-
-  private static JsonValue parse( String json ) {
-    return JsonValue.readFrom( json.replace( '\'', '"' ) );
-  }
-
-}
diff --git a/tests/org.eclipse.rap.addons.chart.test/src/org/eclipse/rap/addons/chart/basic/PieChart_Test.java b/tests/org.eclipse.rap.addons.chart.test/src/org/eclipse/rap/addons/chart/basic/PieChart_Test.java
index a00bc66..9e30137 100644
--- a/tests/org.eclipse.rap.addons.chart.test/src/org/eclipse/rap/addons/chart/basic/PieChart_Test.java
+++ b/tests/org.eclipse.rap.addons.chart.test/src/org/eclipse/rap/addons/chart/basic/PieChart_Test.java
@@ -111,7 +111,7 @@
   public void testSetItems() {
     reset( remoteObject );
 
-    chart.setItems( new PieItem( 23, "foo" ), new PieItem( 42, "bar" ) );
+    chart.setItems( new DataItem( 23, "foo" ), new DataItem( 42, "bar" ) );
 
     String expected = "[{ \"value\": 23, \"label\": \"foo\" },"
                      + "{ \"value\": 42, \"label\": \"bar\" }]";
diff --git a/tests/org.eclipse.rap.addons.chart.test/src/org/eclipse/rap/addons/chart/basic/PieItem_Test.java b/tests/org.eclipse.rap.addons.chart.test/src/org/eclipse/rap/addons/chart/basic/PieItem_Test.java
deleted file mode 100644
index b06234c..0000000
--- a/tests/org.eclipse.rap.addons.chart.test/src/org/eclipse/rap/addons/chart/basic/PieItem_Test.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2016 EclipseSource and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ralf Sternberg - initial API and implementation
- ******************************************************************************/
-package org.eclipse.rap.addons.chart.basic;
-
-import static org.junit.Assert.assertEquals;
-
-import org.eclipse.rap.json.JsonObject;
-import org.eclipse.rap.json.JsonValue;
-import org.eclipse.swt.graphics.RGB;
-import org.junit.Test;
-
-
-public class PieItem_Test {
-
-  @Test
-  public void testToJson() {
-    PieItem item = new PieItem( 23, "foo", new RGB( 0, 8, 128 ) );
-
-    JsonObject json = item.toJson();
-
-    JsonValue expected = parse( "{'value': 23, 'label': 'foo', 'color': '#000880'}" );
-    assertEquals( expected, json );
-  }
-
-  @Test
-  public void testToJson_skipsMissingColor() {
-    PieItem item = new PieItem( 23, "foo" );
-
-    JsonObject json = item.toJson();
-
-    JsonValue expected = parse( "{'value': 23, 'label': 'foo'}" );
-    assertEquals( expected, json );
-  }
-
-  @Test
-  public void testToJson_skipsMissingText() {
-    PieItem item = new PieItem( 23, null, new RGB( 0, 8, 128 ) );
-
-    JsonObject json = item.toJson();
-
-    JsonValue expected = parse( "{'value': 23, 'color': '#000880'}" );
-    assertEquals( expected, json );
-  }
-
-  private static JsonValue parse( String json ) {
-    return JsonValue.readFrom( json.replace( '\'', '"' ) );
-  }
-
-}
