diff --git a/README.md b/README.md
index 910c6884dfc6d980afb285e8e7465412435b880d..25844674b61d240fac9d2498b881817fa796e396 100644
--- a/README.md
+++ b/README.md
@@ -39,7 +39,7 @@ Add this to dependencies in pom.xml:
     <dependency>
       <groupId>com.xeiam</groupId>
       <artifactId>xchart</artifactId>
-      <version>1.2.0-SNAPSHOT</version>
+      <version>1.1.0</version>
     </dependency>
 
 Building
diff --git a/src/main/java/com/xeiam/xchart/Axis.java b/src/main/java/com/xeiam/xchart/Axis.java
index e7722f69ea28f63032fc4d5bd5d9bd1d18862a3d..eb7a5c0b889946639f7729ab03750b4beda29688 100644
--- a/src/main/java/com/xeiam/xchart/Axis.java
+++ b/src/main/java/com/xeiam/xchart/Axis.java
@@ -19,6 +19,7 @@ import java.awt.Graphics2D;
 import java.awt.Rectangle;
 import java.awt.font.FontRenderContext;
 import java.awt.font.TextLayout;
+import java.math.BigDecimal;
 
 import com.xeiam.xchart.interfaces.IChartPart;
 
@@ -29,9 +30,17 @@ import com.xeiam.xchart.interfaces.IChartPart;
  */
 public class Axis implements IChartPart {
 
+  public enum AxisType {
+
+    NUMBER, DATE;
+  }
+
   /** the chart */
   private Chart chart;
 
+  /** the seriesType */
+  private AxisType axisType;
+
   /** the axisPair */
   private AxisPair axisPair;
 
@@ -41,15 +50,12 @@ public class Axis implements IChartPart {
   /** the axis tick */
   private AxisTick axisTick;
 
-  /** the grid */
-  private AxisLine axisLine;
-
   /** the axis direction */
   private Direction direction;
 
-  private Double min = null;
+  private BigDecimal min = null;
 
-  private Double max = null;
+  private BigDecimal max = null;
 
   /** the bounds */
   private Rectangle bounds = new Rectangle(); // default all-zero rectangle
@@ -81,22 +87,20 @@ public class Axis implements IChartPart {
 
     axisTitle = new AxisTitle(this);
     axisTick = new AxisTick(this);
-    axisLine = new AxisLine(this);
   }
 
   /**
    * @param min
    * @param max
    */
-  public void addMinMax(double min, double max) {
+  public void addMinMax(BigDecimal min, BigDecimal max) {
 
     // System.out.println(min);
     // System.out.println(max);
-
-    if (this.min == null || min < this.min) {
+    if (this.min == null || min.compareTo(this.min) < 0) {
       this.min = min;
     }
-    if (this.max == null || max > this.max) {
+    if (this.max == null || max.compareTo(this.max) > 0) {
       this.max = max;
     }
 
@@ -104,6 +108,19 @@ public class Axis implements IChartPart {
     // System.out.println(this.max);
   }
 
+  public void setAxisType(AxisType axisType) {
+
+    if (this.axisType != null && this.axisType != axisType) {
+      throw new IllegalArgumentException("Date and Number Axes cannot be mixed on the same chart!! ");
+    }
+    this.axisType = axisType;
+  }
+
+  public AxisType getAxisType() {
+
+    return axisType;
+  }
+
   public Direction getDirection() {
 
     return direction;
@@ -140,12 +157,12 @@ public class Axis implements IChartPart {
     return axisTick;
   }
 
-  public double getMin() {
+  public BigDecimal getMin() {
 
     return min;
   }
 
-  public double getMax() {
+  public BigDecimal getMax() {
 
     return max;
   }
@@ -158,7 +175,7 @@ public class Axis implements IChartPart {
     if (direction == Direction.X) { // X-Axis
 
       // Axis title
-      double titleHeight = 0;
+      double titleHeight = 0.0;
       if (axisTitle.isVisible) {
         TextLayout textLayout = new TextLayout(axisTitle.getText(), axisTitle.getFont(), new FontRenderContext(null, true, false));
         Rectangle rectangle = textLayout.getPixelBounds(null, 0, 0);
@@ -166,12 +183,13 @@ public class Axis implements IChartPart {
       }
 
       // Axis tick labels
-      TextLayout textLayout = new TextLayout("0", axisTick.getAxisTickLabels().getFont(), new FontRenderContext(null, true, false));
-      Rectangle rectangle = textLayout.getPixelBounds(null, 0, 0);
-      double axisTickLabelsHeight = rectangle.getHeight();
-
-      double gridStrokeWidth = axisLine.getStroke().getLineWidth();
-      return (int) (titleHeight + axisTickLabelsHeight + AxisTick.AXIS_TICK_PADDING + AxisTickMarks.TICK_LENGTH + gridStrokeWidth + Plot.PLOT_PADDING);
+      double axisTickLabelsHeight = 0.0;
+      if (axisTick.isVisible) {
+        TextLayout textLayout = new TextLayout("0", axisTick.getAxisTickLabels().getFont(), new FontRenderContext(null, true, false));
+        Rectangle rectangle = textLayout.getPixelBounds(null, 0, 0);
+        axisTickLabelsHeight = rectangle.getHeight() + AxisTick.AXIS_TICK_PADDING + AxisTickMarks.TICK_LENGTH + Plot.PLOT_PADDING;
+      }
+      return (int) (titleHeight + axisTickLabelsHeight);
     } else { // Y-Axis
       return 0; // We layout the yAxis first depending in the xAxis height hint. We don't care about the yAxis height hint
     }
@@ -202,11 +220,10 @@ public class Axis implements IChartPart {
       // fill in Axis with sub-components
       axisTitle.paint(g);
       axisTick.paint(g);
-      axisLine.paint(g);
 
       xOffset = (int) paintZone.getX();
       yOffset = (int) paintZone.getY();
-      width = (int) (axisTitle.isVisible ? axisTitle.getBounds().getWidth() : 0) + (int) axisTick.getBounds().getWidth() + (int) axisLine.getBounds().getWidth();
+      width = (int) (axisTitle.isVisible ? axisTitle.getBounds().getWidth() : 0) + (int) axisTick.getBounds().getWidth();
       height = (int) paintZone.getHeight();
       bounds = new Rectangle(xOffset, yOffset, width, height);
       // g.setColor(Color.yellow);
@@ -217,9 +234,9 @@ public class Axis implements IChartPart {
       // calculate paint zone
       // |____________________|
 
-      int xOffset = (int) (axisPair.getYAxis().getBounds().getWidth() + Plot.PLOT_PADDING + Chart.CHART_PADDING - 1);
+      int xOffset = (int) (axisPair.getYAxis().getBounds().getWidth() + (axisPair.getYAxis().getAxisTick().isVisible ? Plot.PLOT_PADDING : 0) + Chart.CHART_PADDING);
       int yOffset = (int) (axisPair.getYAxis().getBounds().getY() + axisPair.getYAxis().getBounds().getHeight());
-      int width = (int) (chart.getWidth() - axisPair.getYAxis().getBounds().getWidth() - axisPair.getChartLegendBounds().getWidth() - 3 * Chart.CHART_PADDING);
+      int width = (int) (chart.getWidth() - axisPair.getYAxis().getBounds().getWidth() - axisPair.getChartLegendBounds().getWidth() - (chart.getLegend().isVisible ? 3 : 2) * Chart.CHART_PADDING);
       int height = this.getSizeHint();
       Rectangle xAxisRectangle = new Rectangle(xOffset, yOffset, width, height);
       this.paintZone = xAxisRectangle;
@@ -228,12 +245,11 @@ public class Axis implements IChartPart {
 
       axisTitle.paint(g);
       axisTick.paint(g);
-      axisLine.paint(g);
 
       xOffset = (int) paintZone.getX();
       yOffset = (int) paintZone.getY();
-      width = ((int) paintZone.getWidth());
-      height = (int) (axisTitle.isVisible ? axisTitle.getBounds().getHeight() : 0 + axisTick.getBounds().getHeight() + axisLine.getBounds().getHeight());
+      width = (int) paintZone.getWidth();
+      height = (int) ((axisTitle.isVisible ? axisTitle.getBounds().getHeight() : 0) + (int) axisTick.getBounds().getHeight());
       bounds = new Rectangle(xOffset, yOffset, width, height);
       bounds = new Rectangle(xOffset, yOffset, width, height);
       // g.setColor(Color.yellow);
diff --git a/src/main/java/com/xeiam/xchart/AxisLine.java b/src/main/java/com/xeiam/xchart/AxisLine.java
deleted file mode 100644
index 54a8761c5334c0cd3223cb4152d156c86a7e561a..0000000000000000000000000000000000000000
--- a/src/main/java/com/xeiam/xchart/AxisLine.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/**
- * Copyright 2011-2012 Xeiam LLC.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.xeiam.xchart;
-
-import java.awt.BasicStroke;
-import java.awt.Color;
-import java.awt.Graphics2D;
-import java.awt.Rectangle;
-
-import com.xeiam.xchart.interfaces.IChartPart;
-
-
-/**
- * AxisLine
- */
-public class AxisLine implements IChartPart {
-
-  /** the axis */
-  private Axis axis;
-
-  /** the visibility state of grid */
-  protected boolean isVisible = true; // default to true
-
-  /** the foreground color */
-  private Color foreground = ChartColor.getAWTColor(ChartColor.DARK_GREY); // default foreground color
-
-  /** the line style */
-  private BasicStroke stroke = new BasicStroke(1, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL);
-
-  /** the bounds */
-  private Rectangle bounds = new Rectangle(); // default all-zero rectangle
-
-  /**
-   * Constructor
-   * 
-   * @param axis the axis
-   */
-  public AxisLine(Axis axis) {
-
-    this.axis = axis;
-
-  }
-
-  public BasicStroke getStroke() {
-
-    return stroke;
-  }
-
-  @Override
-  public void paint(Graphics2D g) {
-
-    g.setColor(foreground);
-
-    if (axis.getDirection() == Axis.Direction.Y) {
-
-      int xOffset = (int) (axis.getAxisTick().getBounds().getX() + axis.getAxisTick().getBounds().getWidth());
-      int yOffset = (int) (axis.getPaintZone().getY());
-
-      g.setColor(foreground);
-      g.setStroke(stroke);
-
-      g.drawLine(xOffset, yOffset, xOffset, (int) (yOffset + axis.getPaintZone().getHeight()));
-
-      // bounds
-      bounds = new Rectangle(xOffset, yOffset, (int) stroke.getLineWidth(), (int) axis.getPaintZone().getHeight());
-      // g.setColor(Color.green);
-      // g.draw(bounds);
-
-    } else {
-
-      int xOffset = (int) (axis.getPaintZone().getX());
-      int yOffset = (int) (axis.getAxisTick().getBounds().getY() - stroke.getLineWidth());
-
-      g.setColor(foreground);
-      g.setStroke(stroke);
-
-      g.drawLine(xOffset, yOffset, (int) (xOffset + axis.getPaintZone().getWidth()), yOffset);
-
-      // bounds
-      bounds = new Rectangle(xOffset, yOffset, (int) axis.getPaintZone().getWidth(), (int) stroke.getLineWidth());
-      // g.setColor(Color.green);
-      // g.draw(bounds);
-
-    }
-  }
-
-  @Override
-  public Rectangle getBounds() {
-
-    // TODO Auto-generated method stub
-    return bounds;
-  }
-}
diff --git a/src/main/java/com/xeiam/xchart/AxisPair.java b/src/main/java/com/xeiam/xchart/AxisPair.java
index d332384c261b82562543d5599735f4650cd3c9b7..2a7e988693aa64f8ff1f30fcdcfd41821f241419 100644
--- a/src/main/java/com/xeiam/xchart/AxisPair.java
+++ b/src/main/java/com/xeiam/xchart/AxisPair.java
@@ -19,9 +19,12 @@ import java.awt.Graphics2D;
 import java.awt.Rectangle;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Date;
+import java.util.Iterator;
 import java.util.LinkedHashMap;
 import java.util.Map;
 
+import com.xeiam.xchart.Axis.AxisType;
 import com.xeiam.xchart.interfaces.IChartPart;
 import com.xeiam.xchart.series.Series;
 
@@ -55,10 +58,11 @@ public class AxisPair implements IChartPart {
   }
 
   /**
+   * @param <T>
    * @param xData
    * @param yData
    */
-  public Series addSeries(String seriesName, Collection<Number> xData, Collection<Number> yData, Collection<Number> errorBars) {
+  public <T> Series addSeries(String seriesName, Collection<T> xData, Collection<Number> yData, Collection<Number> errorBars) {
 
     // Sanity checks
     if (seriesName == null) {
@@ -73,22 +77,30 @@ public class AxisPair implements IChartPart {
     if (xData != null && xData.size() == 0) {
       throw new IllegalArgumentException("X-Axis data cannot be empty!!!");
     }
-    if (xData != null && xData.size() == 1 && Double.isNaN(xData.iterator().next().doubleValue())) {
-      throw new IllegalArgumentException("X-Axis data cannot contain a single NaN value!!!");
-    }
     if (yData.size() == 1 && Double.isNaN(yData.iterator().next().doubleValue())) {
       throw new IllegalArgumentException("Y-Axis data cannot contain a single NaN value!!!");
     }
 
-    Series series;
+    Series series = null;
     if (xData != null) {
-      series = new Series(seriesName, xData, yData, errorBars);
+      // Check if xAxis series contains Number or Date data
+      Iterator<?> itr = xData.iterator();
+      Object dataPoint = itr.next();
+      if (dataPoint instanceof Number) {
+        xAxis.setAxisType(AxisType.NUMBER);
+      } else if (dataPoint instanceof Date) {
+        xAxis.setAxisType(AxisType.DATE);
+      }
+      yAxis.setAxisType(AxisType.NUMBER);
+      series = new Series(seriesName, xData, xAxis.getAxisType(), yData, yAxis.getAxisType(), errorBars);
     } else { // generate xData
       Collection<Number> generatedXData = new ArrayList<Number>();
       for (int i = 1; i < yData.size(); i++) {
         generatedXData.add(i);
       }
-      series = new Series(seriesName, generatedXData, yData, errorBars);
+      xAxis.setAxisType(AxisType.NUMBER);
+      yAxis.setAxisType(AxisType.NUMBER);
+      series = new Series(seriesName, generatedXData, xAxis.getAxisType(), yData, yAxis.getAxisType(), errorBars);
     }
 
     // Sanity check
diff --git a/src/main/java/com/xeiam/xchart/AxisTick.java b/src/main/java/com/xeiam/xchart/AxisTick.java
index f307131b199712d50182f289838062ff34180329..63f5858773463ce0ce6d4091fb5c8120aa23e35b 100644
--- a/src/main/java/com/xeiam/xchart/AxisTick.java
+++ b/src/main/java/com/xeiam/xchart/AxisTick.java
@@ -20,15 +20,18 @@ import java.awt.Rectangle;
 import java.math.BigDecimal;
 import java.text.DecimalFormat;
 import java.text.Format;
+import java.text.SimpleDateFormat;
 import java.util.LinkedList;
 import java.util.List;
 
+import com.xeiam.xchart.Axis.AxisType;
 import com.xeiam.xchart.interfaces.IChartPart;
+import com.xeiam.xchart.interfaces.IHideable;
 
 /**
  * An axis tick.
  */
-public class AxisTick implements IChartPart {
+public class AxisTick implements IChartPart, IHideable {
 
   /** the axis */
   private Axis axis;
@@ -50,6 +53,7 @@ public class AxisTick implements IChartPart {
   /** the default tick mark step hint */
   private static final int DEFAULT_TICK_MARK_STEP_HINT = 64;
 
+  /** the padding between the tick labels and the tick marks */
   protected final static int AXIS_TICK_PADDING = 4;
 
   /** the normal format for tick labels */
@@ -58,9 +62,15 @@ public class AxisTick implements IChartPart {
   /** the scientific format for tick labels */
   private Format scientificFormat = new DecimalFormat("0.###E0");
 
+  // private SimpleDateFormat simpleDateformat = new SimpleDateFormat("dd.MM.yyyy");
+  private SimpleDateFormat simpleDateformat = new SimpleDateFormat("MM-dd");
+
   /** the bounds */
   private Rectangle bounds = new Rectangle(); // default all-zero rectangle
 
+  /** the visibility state of axistick */
+  protected boolean isVisible = true; // default to true
+
   /**
    * Constructor.
    * 
@@ -126,19 +136,21 @@ public class AxisTick implements IChartPart {
     // System.out.println(label);
     // }
 
-    axisTickLabels.paint(g);
-    axisTickMarks.paint(g);
+    if (isVisible) {
+      axisTickLabels.paint(g);
+      axisTickMarks.paint(g);
 
-    if (axis.getDirection() == Axis.Direction.Y) {
-      bounds = new Rectangle((int) axisTickLabels.getBounds().getX(), (int) (axisTickLabels.getBounds().getY()), (int) (axisTickLabels.getBounds().getWidth() + AXIS_TICK_PADDING + axisTickMarks.getBounds().getWidth()),
-          (int) (axisTickMarks.getBounds().getHeight()));
-      // g.setColor(Color.red);
-      // g.draw(bounds);
-    } else {
-      bounds = new Rectangle((int) axisTickMarks.getBounds().getX(), (int) (axisTickMarks.getBounds().getY()), (int) axisTickLabels.getBounds().getWidth(), (int) (axisTickMarks.getBounds().getHeight()
-          + AXIS_TICK_PADDING + axisTickLabels.getBounds().getHeight()));
-      // g.setColor(Color.red);
-      // g.draw(bounds);
+      if (axis.getDirection() == Axis.Direction.Y) {
+        bounds = new Rectangle((int) axisTickLabels.getBounds().getX(), (int) (axisTickLabels.getBounds().getY()),
+            (int) (axisTickLabels.getBounds().getWidth() + AXIS_TICK_PADDING + axisTickMarks.getBounds().getWidth()), (int) (axisTickMarks.getBounds().getHeight()));
+        // g.setColor(Color.red);
+        // g.draw(bounds);
+      } else {
+        bounds = new Rectangle((int) axisTickMarks.getBounds().getX(), (int) (axisTickMarks.getBounds().getY()), (int) axisTickLabels.getBounds().getWidth(), (int) (axisTickMarks.getBounds().getHeight()
+            + AXIS_TICK_PADDING + axisTickLabels.getBounds().getHeight()));
+        // g.setColor(Color.red);
+        // g.draw(bounds);
+      }
     }
 
   }
@@ -161,7 +173,7 @@ public class AxisTick implements IChartPart {
       tickLocations.add((int) (margin + tickSpace / 2.0));
     } else {
 
-      final BigDecimal MIN = new BigDecimal(new Double(axis.getMin()).toString());
+      final BigDecimal MIN = new BigDecimal(axis.getMin().doubleValue());
       BigDecimal firstPosition;
       BigDecimal gridStep = getGridStep(tickSpace);
 
@@ -172,11 +184,11 @@ public class AxisTick implements IChartPart {
         firstPosition = MIN.subtract(MIN.remainder(gridStep)).add(gridStep);
       }
 
-      for (BigDecimal b = firstPosition; b.doubleValue() <= axis.getMax(); b = b.add(gridStep)) {
+      for (BigDecimal b = firstPosition; b.compareTo(axis.getMax()) <= 0; b = b.add(gridStep)) {
 
         // System.out.println("b= " + b);
-        tickLabels.add(format(b.doubleValue()));
-        int tickLabelPosition = (int) (margin + ((b.doubleValue() - axis.getMin()) / (axis.getMax() - axis.getMin()) * tickSpace));
+        tickLabels.add(format(b));
+        int tickLabelPosition = (int) (margin + ((b.subtract(axis.getMin())).doubleValue() / (axis.getMax().subtract(axis.getMin())).doubleValue() * tickSpace));
         // System.out.println("tickLabelPosition= " + tickLabelPosition);
 
         tickLocations.add(tickLabelPosition);
@@ -186,7 +198,7 @@ public class AxisTick implements IChartPart {
 
   private BigDecimal getGridStep(int tickSpace) {
 
-    double length = Math.abs(axis.getMax() - axis.getMin());
+    double length = Math.abs(axis.getMax().subtract(axis.getMin()).doubleValue());
     // System.out.println(axis.getMax());
     // System.out.println(axis.getMin());
     // System.out.println(length);
@@ -246,13 +258,23 @@ public class AxisTick implements IChartPart {
     return value;
   }
 
-  private String format(double value) {
+  private String format(BigDecimal value) {
 
-    if (Math.abs(value) < 9999 && Math.abs(value) > .0001 || value == 0) {
-      return this.normalFormat.format(value);
+    if (axis.getAxisType() == AxisType.NUMBER) {
+      if (Math.abs(value.doubleValue()) < 9999 && Math.abs(value.doubleValue()) > .0001 || value.doubleValue() == 0) {
+        return normalFormat.format(value.doubleValue());
+      } else {
+        return scientificFormat.format(value.doubleValue());
+      }
     } else {
-      return this.scientificFormat.format(value);
+      return simpleDateformat.format(value.longValueExact());
     }
+
   }
 
+  @Override
+  public void setVisible(boolean isVisible) {
+
+    this.isVisible = isVisible;
+  }
 }
diff --git a/src/main/java/com/xeiam/xchart/AxisTickLabels.java b/src/main/java/com/xeiam/xchart/AxisTickLabels.java
index 65dc0dc233daf87389cde0fa618a9ba9388ee583..d9332c720cefb997dec37c1765bdb1dca56079e1 100644
--- a/src/main/java/com/xeiam/xchart/AxisTickLabels.java
+++ b/src/main/java/com/xeiam/xchart/AxisTickLabels.java
@@ -24,7 +24,6 @@ import java.awt.font.TextLayout;
 
 import com.xeiam.xchart.interfaces.IChartPart;
 
-
 /**
  * Axis tick labels
  */
diff --git a/src/main/java/com/xeiam/xchart/AxisTickMarks.java b/src/main/java/com/xeiam/xchart/AxisTickMarks.java
index 064932c81cdfc70470547439296fed13a21588c5..f21f78f7508fe1e48e184ea632a8c7a17ba3b46d 100644
--- a/src/main/java/com/xeiam/xchart/AxisTickMarks.java
+++ b/src/main/java/com/xeiam/xchart/AxisTickMarks.java
@@ -23,7 +23,6 @@ import java.awt.Stroke;
 
 import com.xeiam.xchart.interfaces.IChartPart;
 
-
 /**
  * Axis tick marks.
  */
@@ -73,6 +72,8 @@ public class AxisTickMarks implements IChartPart {
 
       int xOffset = (int) (axisTick.getAxisTickLabels().getBounds().getX() + axisTick.getAxisTickLabels().getBounds().getWidth() + AxisTick.AXIS_TICK_PADDING);
       int yOffset = (int) (axis.getPaintZone().getY());
+
+      // tick marks
       for (int i = 0; i < axisTick.getTickLabels().size(); i++) {
 
         int tickLocation = axisTick.getTickLocations().get(i);
@@ -83,16 +84,20 @@ public class AxisTickMarks implements IChartPart {
         g.drawLine(xOffset, yOffset + (int) (axis.getPaintZone().getHeight() - tickLocation), xOffset + TICK_LENGTH, yOffset + (int) (axis.getPaintZone().getHeight() - tickLocation));
 
       }
+      // Line
+      g.drawLine(xOffset + TICK_LENGTH, yOffset, xOffset + TICK_LENGTH, yOffset + (int) axis.getPaintZone().getHeight());
 
       // bounds
       bounds = new Rectangle(xOffset, yOffset, TICK_LENGTH, (int) axis.getPaintZone().getHeight());
-      // g.setColor(Color.blue);
+      // g.setColor(Color.yellow);
       // g.draw(bounds);
 
     } else { // X-Axis
 
       int xOffset = (int) (axis.getPaintZone().getX());
       int yOffset = (int) (axisTick.getAxisTickLabels().getBounds().getY() - AxisTick.AXIS_TICK_PADDING);
+
+      // tick marks
       for (int i = 0; i < axisTick.getTickLabels().size(); i++) {
 
         int tickLocation = axisTick.getTickLocations().get(i);
@@ -102,12 +107,13 @@ public class AxisTickMarks implements IChartPart {
 
         g.drawLine(xOffset + tickLocation, yOffset, xOffset + tickLocation, yOffset - TICK_LENGTH);
       }
+      // Line
+      g.drawLine(xOffset, yOffset - TICK_LENGTH, xOffset + (int) axis.getPaintZone().getWidth(), yOffset - TICK_LENGTH);
 
       // bounds
       bounds = new Rectangle(xOffset, yOffset - TICK_LENGTH, (int) axis.getPaintZone().getWidth(), TICK_LENGTH);
-      // g.setColor(Color.blue);
+      // g.setColor(Color.yellow);
       // g.draw(bounds);
     }
   }
-
 }
diff --git a/src/main/java/com/xeiam/xchart/Chart.java b/src/main/java/com/xeiam/xchart/Chart.java
index 315215ce8edf766bca603f3293b5723c95ac8193..0693f0f5685caa080a3f045c70673f2d75d1c7e6 100644
--- a/src/main/java/com/xeiam/xchart/Chart.java
+++ b/src/main/java/com/xeiam/xchart/Chart.java
@@ -15,10 +15,12 @@
  */
 package com.xeiam.xchart;
 
+import java.awt.Color;
 import java.awt.Graphics2D;
 import java.awt.RenderingHints;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Date;
 
 import com.xeiam.xchart.series.Series;
 import com.xeiam.xchart.series.SeriesColor;
@@ -46,10 +48,24 @@ public class Chart {
    * @param pWidth
    * @param pHeight
    */
-  public Chart(final int pWidth, final int pHeight) {
+  public Chart(int width, int height) {
 
-    width = pWidth;
-    height = pHeight;
+    this.width = width;
+    this.height = height;
+  }
+
+  /**
+   * @param g
+   */
+  public void paint(final Graphics2D g, int width, int height) {
+
+    g.setColor(Color.white);
+    g.fillRect(0, 0, width, height);
+
+    this.width = width;
+    this.height = height;
+
+    paint(g);
   }
 
   /**
@@ -114,6 +130,21 @@ public class Chart {
 
   // PUBLIC SETTERS
 
+  /**
+   * @param seriesName
+   * @param xData
+   * @param yData
+   */
+  public Series addDateSeries(String seriesName, Collection<Date> xData, Collection<Number> yData) {
+
+    return axisPair.addSeries(seriesName, xData, yData, null);
+  }
+
+  public Series addDateSeries(String seriesName, Collection<Date> xData, Collection<Number> yData, Collection<Number> errorBars) {
+
+    return axisPair.addSeries(seriesName, xData, yData, errorBars);
+  }
+
   /**
    * Add series data as Collection<Number>
    * 
@@ -183,11 +214,6 @@ public class Chart {
     this.chartTitle.setText(title);
   }
 
-  public void setChartTitleVisible(boolean isVisible) {
-
-    this.chartTitle.setVisible(isVisible);
-  }
-
   public void setXAxisTitle(String title) {
 
     this.axisPair.getXAxis().setAxisTitle(title);
@@ -198,14 +224,52 @@ public class Chart {
     this.axisPair.getYAxis().setAxisTitle(title);
   }
 
+  // ChartPart visibility ////////////////////////////////
+
+  public void setChartTitleVisible(boolean isVisible) {
+
+    this.chartTitle.setVisible(isVisible);
+  }
+
   public void setAxisTitlesVisible(boolean isVisible) {
 
     this.axisPair.getXAxis().getAxisTitle().setVisible(isVisible);
     this.axisPair.getYAxis().getAxisTitle().setVisible(isVisible);
   }
 
+  public void setXAxisTitleVisible(boolean isVisible) {
+
+    this.axisPair.getXAxis().getAxisTitle().setVisible(isVisible);
+  }
+
+  public void setYAxisTitleVisible(boolean isVisible) {
+
+    this.axisPair.getYAxis().getAxisTitle().setVisible(isVisible);
+  }
+
   public void setChartLegendVisible(boolean isVisible) {
 
     this.chartLegend.setVisible(isVisible);
   }
+
+  public void setAxisTicksVisible(boolean isVisible) {
+
+    this.axisPair.getXAxis().getAxisTick().setVisible(isVisible);
+    this.axisPair.getYAxis().getAxisTick().setVisible(isVisible);
+  }
+
+  public void setXAxisTicksVisible(boolean isVisible) {
+
+    this.axisPair.getXAxis().getAxisTick().setVisible(isVisible);
+  }
+
+  public void setYAxisTicksVisible(boolean isVisible) {
+
+    this.axisPair.getYAxis().getAxisTick().setVisible(isVisible);
+  }
+
+  public void setChartGridlinesVisible(boolean isVisible) {
+
+    this.plot.getPlotSurface().setVisible(isVisible);
+  }
 }
diff --git a/src/main/java/com/xeiam/xchart/ChartLegend.java b/src/main/java/com/xeiam/xchart/ChartLegend.java
index cda6d9f2184bdbc923ff1b766b15f6866d716600..6e49361b6579261e7acb78189980ff7d900a55e6 100644
--- a/src/main/java/com/xeiam/xchart/ChartLegend.java
+++ b/src/main/java/com/xeiam/xchart/ChartLegend.java
@@ -27,7 +27,6 @@ import com.xeiam.xchart.interfaces.IHideable;
 import com.xeiam.xchart.series.Series;
 import com.xeiam.xchart.series.markers.Marker;
 
-
 /**
  * @author timmolter
  */
@@ -37,7 +36,7 @@ public class ChartLegend implements IHideable {
   private Chart chart;
 
   /** the visibility state of legend */
-  private boolean isVisible = true; // default to true
+  protected boolean isVisible = true; // default to true
 
   /** the font */
   private Font font = new Font(Font.SANS_SERIF, Font.PLAIN, 11); // default font
@@ -104,7 +103,7 @@ public class ChartLegend implements IHideable {
       // Draw Legend Box
       int legendBoxWidth = legendContentWidth + 2 * LEGEND_PADDING;
       int legendBoxHeight = legendContentHeight + 2 * LEGEND_PADDING;
-      int xOffset = (chart.getWidth() - legendBoxWidth - Chart.CHART_PADDING);
+      int xOffset = chart.getWidth() - legendBoxWidth - Chart.CHART_PADDING;
       int yOffset = (int) ((chart.getHeight() - legendBoxHeight) / 2.0 + chart.getTitle().getBounds().getY() + chart.getTitle().getBounds().getHeight());
 
       g.setColor(border);
diff --git a/src/main/java/com/xeiam/xchart/ChartTitle.java b/src/main/java/com/xeiam/xchart/ChartTitle.java
index aa11c5174570818ad70563ede50c465835d1faf6..415b5d407af48bf2fc5f553e4a6021bef31bf147 100644
--- a/src/main/java/com/xeiam/xchart/ChartTitle.java
+++ b/src/main/java/com/xeiam/xchart/ChartTitle.java
@@ -24,7 +24,6 @@ import java.awt.font.TextLayout;
 
 import com.xeiam.xchart.interfaces.IHideable;
 
-
 /**
  * Chart Title
  */
@@ -75,21 +74,19 @@ public class ChartTitle implements IHideable {
   @Override
   public void paint(Graphics2D g) {
 
-    if (isVisible) {
+    FontRenderContext frc = g.getFontRenderContext();
+    TextLayout textLayout = new TextLayout(this.text, this.font, frc);
+    Rectangle rectangle = textLayout.getPixelBounds(null, 0, 0);
+    int xOffset = (int) ((chart.getWidth() - rectangle.getWidth()) / 2.0);
+    int yOffset = (int) ((isVisible ? (Chart.CHART_PADDING - rectangle.getY()) : 0));
 
-      FontRenderContext frc = g.getFontRenderContext();
-      TextLayout textLayout = new TextLayout(this.text, this.font, frc);
-      Rectangle rectangle = textLayout.getPixelBounds(null, 0, 0);
-      // System.out.println(rectangle);
-      int xOffset = (int) ((chart.getWidth() - rectangle.getWidth()) / 2.0);
-      int yOffset = (int) (Chart.CHART_PADDING - rectangle.getY());
+    bounds = new Rectangle(xOffset, yOffset + (isVisible ? (int) rectangle.getY() : 0), (int) rectangle.getWidth(), (int) (isVisible ? rectangle.getHeight() : 0));
+    // g.setColor(Color.green);
+    // g.draw(bounds);
 
+    if (isVisible) {
       g.setColor(foreground);
       textLayout.draw(g, xOffset, yOffset);
-
-      bounds = new Rectangle(xOffset, (int) (yOffset + rectangle.getY()), (int) rectangle.getWidth(), (int) rectangle.getHeight());
-      // g.setColor(Color.green);
-      // g.draw(bounds);
     }
 
   }
diff --git a/src/main/java/com/xeiam/xchart/Plot.java b/src/main/java/com/xeiam/xchart/Plot.java
index b0908b9d2e55e9e1817889733167199d2abe3db9..d57d8ddc9e0f40a678517f7c3e8c27868a57da1a 100644
--- a/src/main/java/com/xeiam/xchart/Plot.java
+++ b/src/main/java/com/xeiam/xchart/Plot.java
@@ -31,7 +31,7 @@ public class Plot implements IChartPart {
 
   private PlotContent plotContent;
 
-  public static final int PLOT_PADDING = 5;
+  public static final int PLOT_PADDING = 3;
 
   /** the bounds */
   private Rectangle bounds = new Rectangle(); // default all-zero rectangle
@@ -53,7 +53,7 @@ public class Plot implements IChartPart {
   public void paint(Graphics2D g) {
 
     // calculate bounds
-    int xOffset = (int) (chart.getAxisPair().getYAxis().getBounds().getX() + chart.getAxisPair().getYAxis().getBounds().getWidth() + PLOT_PADDING);
+    int xOffset = (int) (chart.getAxisPair().getYAxis().getBounds().getX() + chart.getAxisPair().getYAxis().getBounds().getWidth() + (chart.getAxisPair().getYAxis().getAxisTick().isVisible ? (Plot.PLOT_PADDING + 1) : 0));
     int yOffset = (int) (chart.getAxisPair().getYAxis().getBounds().getY());
     int width = (int) chart.getAxisPair().getXAxis().getBounds().getWidth();
     int height = (int) chart.getAxisPair().getYAxis().getBounds().getHeight();
@@ -66,4 +66,12 @@ public class Plot implements IChartPart {
 
   }
 
+  /**
+   * @return the plotSurface
+   */
+  public PlotSurface getPlotSurface() {
+
+    return plotSurface;
+  }
+
 }
diff --git a/src/main/java/com/xeiam/xchart/PlotContent.java b/src/main/java/com/xeiam/xchart/PlotContent.java
index 12d12363ef0bd41ebedf1a269712a9f6f5e5b955..e1d7d7c75acdb065ee81da9b7866f8329a1eb46c 100644
--- a/src/main/java/com/xeiam/xchart/PlotContent.java
+++ b/src/main/java/com/xeiam/xchart/PlotContent.java
@@ -17,10 +17,13 @@ package com.xeiam.xchart;
 
 import java.awt.Graphics2D;
 import java.awt.Rectangle;
+import java.math.BigDecimal;
 import java.util.Collection;
+import java.util.Date;
 import java.util.Iterator;
 import java.util.Map;
 
+import com.xeiam.xchart.Axis.AxisType;
 import com.xeiam.xchart.interfaces.IChartPart;
 import com.xeiam.xchart.series.Series;
 import com.xeiam.xchart.series.SeriesLineStyle;
@@ -65,18 +68,18 @@ public class PlotContent implements IChartPart {
       int yTopMargin = AxisPair.getMargin((int) bounds.getHeight(), yTickSpace);
 
       // data points
-      Collection<Number> xData = series.getxData();
-      double xMin = chart.getAxisPair().getXAxis().getMin();
-      double xMax = chart.getAxisPair().getXAxis().getMax();
+      Collection<?> xData = series.getxData();
+      BigDecimal xMin = chart.getAxisPair().getXAxis().getMin();
+      BigDecimal xMax = chart.getAxisPair().getXAxis().getMax();
       Collection<Number> yData = series.getyData();
-      double yMin = chart.getAxisPair().getYAxis().getMin();
-      double yMax = chart.getAxisPair().getYAxis().getMax();
+      BigDecimal yMin = chart.getAxisPair().getYAxis().getMin();
+      BigDecimal yMax = chart.getAxisPair().getYAxis().getMax();
       Collection<Number> errorBars = series.getErrorBars();
 
       int previousX = Integer.MIN_VALUE;
       int previousY = Integer.MIN_VALUE;
 
-      Iterator<Number> xItr = xData.iterator();
+      Iterator<?> xItr = xData.iterator();
       Iterator<Number> yItr = yData.iterator();
       Iterator<Number> ebItr = null;
       if (errorBars != null) {
@@ -84,29 +87,42 @@ public class PlotContent implements IChartPart {
       }
       while (xItr.hasNext()) {
 
-        double x = xItr.next().doubleValue();
-        double y = yItr.next().doubleValue();
+        BigDecimal x = null;
+        if (chart.getAxisPair().getXAxis().getAxisType() == AxisType.NUMBER) {
+          x = new BigDecimal(((Number) xItr.next()).doubleValue());
+        }
+        if (chart.getAxisPair().getXAxis().getAxisType() == AxisType.DATE) {
+          x = new BigDecimal(((Date) xItr.next()).getTime());
+          System.out.println(x);
+        }
+
+        BigDecimal y = new BigDecimal(yItr.next().doubleValue());
+        // System.out.println(y);
         double eb = 0.0;
         if (errorBars != null) {
           eb = ebItr.next().doubleValue();
         }
-        if (!Double.isNaN(x) && !Double.isNaN(y)) {
+        if (!Double.isNaN(x.doubleValue()) && !Double.isNaN(y.doubleValue())) {
 
-          int xTransform = (int) (xLeftMargin + ((x - xMin) / (xMax - xMin) * xTickSpace));
-          int yTransform = (int) (bounds.getHeight() - (yTopMargin + (y - yMin) / (yMax - yMin) * yTickSpace));
+          // int xTransform = (int) (xLeftMargin + ((x - xMin) / (xMax - xMin) * xTickSpace));
+          int xTransform = (int) (xLeftMargin + (x.subtract(xMin).doubleValue() / xMax.subtract(xMin).doubleValue() * xTickSpace));
+          // int yTransform = (int) (bounds.getHeight() - (yTopMargin + (y - yMin) / (yMax - yMin) * yTickSpace));
+          int yTransform = (int) (bounds.getHeight() - (yTopMargin + y.subtract(yMin).doubleValue() / yMax.subtract(yMin).doubleValue() * yTickSpace));
 
           // a check if all y data are the exact same values
-          if (Math.abs(xMax - xMin) / 5 == 0.0) {
+          if (Math.abs(xMax.subtract(xMin).doubleValue()) / 5 == 0.0) {
             xTransform = (int) (bounds.getWidth() / 2.0);
           }
 
           // a check if all y data are the exact same values
-          if (Math.abs(yMax - yMin) / 5 == 0.0) {
+          if (Math.abs(yMax.subtract(yMin).doubleValue()) / 5 == 0.0) {
             yTransform = (int) (bounds.getHeight() / 2.0);
           }
 
           int xOffset = (int) (bounds.getX() + xTransform - 1);
           int yOffset = (int) (bounds.getY() + yTransform);
+          // System.out.println(yOffset);
+          // System.out.println(yTransform);
 
           // paint line
           if (series.getLineStyle() != null) {
@@ -129,14 +145,17 @@ public class PlotContent implements IChartPart {
           if (errorBars != null) {
             g.setColor(ChartColor.getAWTColor(ChartColor.DARK_GREY));
             g.setStroke(SeriesLineStyle.getBasicStroke(SeriesLineStyle.SOLID));
-            int bottom = (int) (-1 * bounds.getHeight() * eb / (yMax - yMin));
-            int top = (int) (bounds.getHeight() * eb / (yMax - yMin));
+            int bottom = (int) (-1 * bounds.getHeight() * eb / (yMax.subtract(yMin).doubleValue()));
+            int top = (int) (bounds.getHeight() * eb / (yMax.subtract(yMin).doubleValue()));
             g.drawLine(xOffset, yOffset + bottom, xOffset, yOffset + top);
             g.drawLine(xOffset - 3, yOffset + bottom, xOffset + 3, yOffset + bottom);
             g.drawLine(xOffset - 3, yOffset + top, xOffset + 3, yOffset + top);
           }
         }
       }
+
     }
+
   }
+
 }
diff --git a/src/main/java/com/xeiam/xchart/PlotSurface.java b/src/main/java/com/xeiam/xchart/PlotSurface.java
index a8f092d831d7ace8dfb1f909ea2e26ca4bbc7362..0b1ee3c11a290c619b3332a127ffe0dd87af06fc 100644
--- a/src/main/java/com/xeiam/xchart/PlotSurface.java
+++ b/src/main/java/com/xeiam/xchart/PlotSurface.java
@@ -22,12 +22,12 @@ import java.awt.Rectangle;
 import java.util.List;
 
 import com.xeiam.xchart.interfaces.IChartPart;
-
+import com.xeiam.xchart.interfaces.IHideable;
 
 /**
  * @author timmolter
  */
-public class PlotSurface implements IChartPart {
+public class PlotSurface implements IChartPart, IHideable {
 
   private Chart chart;
 
@@ -42,6 +42,15 @@ public class PlotSurface implements IChartPart {
   /** the line style */
   private BasicStroke stroke = new BasicStroke(1, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL, 10.0f, new float[] { 3.0f, 3.0f }, 0.0f);
 
+  /** the visibility state of PlotSurface */
+  protected boolean isVisible = true; // default to true
+
+  /**
+   * Constructor
+   * 
+   * @param chart
+   * @param plot
+   */
   public PlotSurface(Chart chart, Plot plot) {
 
     this.chart = chart;
@@ -68,28 +77,37 @@ public class PlotSurface implements IChartPart {
     g.draw(borderRectangle);
 
     // paint grid lines
-    // horizontal
-    List<Integer> yAxisTickLocations = chart.getAxisPair().getYAxis().getAxisTick().getTickLocations();
-    for (int i = 0; i < yAxisTickLocations.size(); i++) {
+    if (isVisible) {
+      // horizontal
+      List<Integer> yAxisTickLocations = chart.getAxisPair().getYAxis().getAxisTick().getTickLocations();
+      for (int i = 0; i < yAxisTickLocations.size(); i++) {
 
-      int tickLocation = yAxisTickLocations.get(i);
+        int tickLocation = yAxisTickLocations.get(i);
 
-      g.setColor(foreground);
-      g.setStroke(stroke);
-      // System.out.println("bounds.getY()= " + bounds.getY());
-      g.drawLine((int) bounds.getX(), (int) (bounds.getY() + bounds.getHeight() - tickLocation), (int) (bounds.getX() + bounds.getWidth() - 2), (int) (bounds.getY() + bounds.getHeight() - tickLocation));
-    }
+        g.setColor(foreground);
+        g.setStroke(stroke);
+        // System.out.println("bounds.getY()= " + bounds.getY());
+        g.drawLine((int) bounds.getX(), (int) (bounds.getY() + bounds.getHeight() - tickLocation), (int) (bounds.getX() + bounds.getWidth() - 2), (int) (bounds.getY() + bounds.getHeight() - tickLocation));
+      }
 
-    // vertical
-    List<Integer> xAxisTickLocations = chart.getAxisPair().getXAxis().getAxisTick().getTickLocations();
-    for (int i = 0; i < xAxisTickLocations.size(); i++) {
+      // vertical
+      List<Integer> xAxisTickLocations = chart.getAxisPair().getXAxis().getAxisTick().getTickLocations();
+      for (int i = 0; i < xAxisTickLocations.size(); i++) {
 
-      int tickLocation = xAxisTickLocations.get(i);
+        int tickLocation = xAxisTickLocations.get(i);
 
-      g.setColor(foreground);
-      g.setStroke(stroke);
+        g.setColor(foreground);
+        g.setStroke(stroke);
 
-      g.drawLine((int) (bounds.getX() + tickLocation - 1), (int) (bounds.getY() + 1), (int) (bounds.getX() + tickLocation - 1), (int) (bounds.getY() + bounds.getHeight() - 1));
+        g.drawLine((int) (bounds.getX() + tickLocation - 1), (int) (bounds.getY() + 1), (int) (bounds.getX() + tickLocation - 1), (int) (bounds.getY() + bounds.getHeight() - 1));
+      }
     }
   }
+
+  @Override
+  public void setVisible(boolean isVisible) {
+
+    this.isVisible = isVisible;
+
+  }
 }
diff --git a/src/main/java/com/xeiam/xchart/interfaces/IHideable.java b/src/main/java/com/xeiam/xchart/interfaces/IHideable.java
index 2f68d6d2d65be0990a42918ff9d5ad560788298a..77fc22e830049a55cfb37716d777816aa70373d8 100644
--- a/src/main/java/com/xeiam/xchart/interfaces/IHideable.java
+++ b/src/main/java/com/xeiam/xchart/interfaces/IHideable.java
@@ -13,6 +13,6 @@ package com.xeiam.xchart.interfaces;
  */
 public interface IHideable extends IChartPart {
 
-  public void setVisible(boolean visible);
+  public void setVisible(boolean isVisible);
 
 }
\ No newline at end of file
diff --git a/src/main/java/com/xeiam/xchart/series/Series.java b/src/main/java/com/xeiam/xchart/series/Series.java
index ac974c6b659ab6e6a4407a0b2000fe0a20e6c58e..287b6ff95e6c8b15cc2f58ee62087f5286c56452 100644
--- a/src/main/java/com/xeiam/xchart/series/Series.java
+++ b/src/main/java/com/xeiam/xchart/series/Series.java
@@ -17,9 +17,12 @@ package com.xeiam.xchart.series;
 
 import java.awt.BasicStroke;
 import java.awt.Color;
+import java.math.BigDecimal;
 import java.util.Collection;
+import java.util.Date;
 import java.util.Iterator;
 
+import com.xeiam.xchart.Axis.AxisType;
 import com.xeiam.xchart.series.markers.Marker;
 
 /**
@@ -29,23 +32,25 @@ public class Series {
 
   private String name = "";
 
-  protected Collection<Number> xData;
+  // private AxisType seriesType;
+
+  protected Collection<?> xData;
 
   protected Collection<Number> yData;
 
   protected Collection<Number> errorBars;
 
   /** the minimum value of axis range */
-  private double xMin;
+  private BigDecimal xMin;
 
   /** the maximum value of axis range */
-  private double xMax;
+  private BigDecimal xMax;
 
   /** the minimum value of axis range */
-  private double yMin;
+  private BigDecimal yMin;
 
   /** the maximum value of axis range */
-  private double yMax;
+  private BigDecimal yMax;
 
   /** Line Style */
   private BasicStroke stroke;
@@ -62,11 +67,12 @@ public class Series {
   /**
    * Constructor
    * 
+   * @param <?>
    * @param name
    * @param xData
    * @param yData
    */
-  public Series(String name, Collection<Number> xData, Collection<Number> yData, Collection<Number> errorBars) {
+  public Series(String name, Collection<?> xData, AxisType xAxisType, Collection<Number> yData, AxisType yAxisType, Collection<Number> errorBars) {
 
     this.name = name;
     this.xData = xData;
@@ -74,28 +80,28 @@ public class Series {
     this.errorBars = errorBars;
 
     // xData
-    double[] xMinMax = findMinMax(xData);
-    this.xMin = xMinMax[0];
-    this.xMax = xMinMax[1];
+    BigDecimal[] xMinMax = findMinMax(xData, xAxisType);
+    xMin = xMinMax[0];
+    xMax = xMinMax[1];
 
     // yData
-    double[] yMinMax = null;
+    BigDecimal[] yMinMax = null;
     if (errorBars == null) {
-      yMinMax = findMinMax(yData);
+      yMinMax = findMinMax(yData, yAxisType);
     } else {
       yMinMax = findMinMaxWithErrorBars(yData, errorBars);
     }
-    this.yMin = yMinMax[0];
-    this.yMax = yMinMax[1];
+    yMin = yMinMax[0];
+    yMax = yMinMax[1];
     // System.out.println(yMin);
     // System.out.println(yMax);
 
     Color color = SeriesColor.getNextAWTColor();
-    this.strokeColor = color;
-    this.markerColor = color;
+    strokeColor = color;
+    markerColor = color;
 
-    this.marker = SeriesMarker.getNextMarker();
-    this.stroke = SeriesLineStyle.getNextBasicStroke();
+    marker = SeriesMarker.getNextMarker();
+    stroke = SeriesLineStyle.getNextBasicStroke();
 
   }
 
@@ -105,24 +111,39 @@ public class Series {
    * @param data
    * @return
    */
-  private double[] findMinMax(Collection<Number> data) {
-
-    Double min = null;
-    Double max = null;
-    for (Number number : data) {
-      verify(number.doubleValue());
-      if (min == null || number.doubleValue() < min) {
-        if (!Double.isNaN(number.doubleValue())) {
-          min = number.doubleValue();
+  private BigDecimal[] findMinMax(Collection<?> data, AxisType axisType) {
+
+    BigDecimal min = null;
+    BigDecimal max = null;
+
+    for (Object dataPoint : data) {
+
+      BigDecimal bigDecimal = null;
+
+      if (axisType == AxisType.NUMBER) {
+        bigDecimal = new BigDecimal(((Number) dataPoint).doubleValue());
+        verify(bigDecimal);
+
+      } else if (axisType == AxisType.DATE) {
+        Date date = (Date) dataPoint;
+        bigDecimal = new BigDecimal(date.getTime());
+        verify(bigDecimal);
+      }
+      // if (min == null || bigDecimal < min) {
+      if (min == null || bigDecimal.compareTo(min) < 0) {
+        if (!Double.isNaN(bigDecimal.doubleValue())) {
+          min = bigDecimal;
         }
       }
-      if (max == null || number.doubleValue() > max) {
-        if (!Double.isNaN(number.doubleValue())) {
-          max = number.doubleValue();
+      // if (max == null || bigDecimal > max) {
+      if (max == null || bigDecimal.compareTo(max) > 0) {
+        if (!Double.isNaN(bigDecimal.doubleValue())) {
+          max = bigDecimal;
         }
       }
     }
-    return new double[] { min, max };
+
+    return new BigDecimal[] { min, max };
   }
 
   /**
@@ -131,29 +152,29 @@ public class Series {
    * @param data
    * @return
    */
-  private double[] findMinMaxWithErrorBars(Collection<Number> data, Collection<Number> errorBars) {
+  private BigDecimal[] findMinMaxWithErrorBars(Collection<Number> data, Collection<Number> errorBars) {
 
-    Double min = null;
-    Double max = null;
+    BigDecimal min = null;
+    BigDecimal max = null;
 
     Iterator<Number> itr = data.iterator();
     Iterator<Number> ebItr = errorBars.iterator();
     while (itr.hasNext()) {
-      double number = itr.next().doubleValue();
-      double eb = ebItr.next().doubleValue();
-      verify(number);
-      if (min == null || (number - eb) < min) {
-        if (!Double.isNaN(number)) {
-          min = number - eb;
+      BigDecimal bigDecimal = new BigDecimal(itr.next().doubleValue());
+      BigDecimal eb = new BigDecimal(ebItr.next().doubleValue());
+      verify(bigDecimal);
+      if (min == null || (bigDecimal.subtract(eb)).compareTo(min) < 0) {
+        if (!Double.isNaN(bigDecimal.doubleValue())) {
+          min = bigDecimal.subtract(eb);
         }
       }
-      if (max == null || (number + eb) > max) {
-        if (!Double.isNaN(number)) {
-          max = number + eb;
+      if (max == null || (bigDecimal.add(eb)).compareTo(max) > 0) {
+        if (!Double.isNaN(bigDecimal.doubleValue())) {
+          max = bigDecimal.add(eb);
         }
       }
     }
-    return new double[] { min, max };
+    return new BigDecimal[] { min, max };
   }
 
   /**
@@ -161,13 +182,23 @@ public class Series {
    * 
    * @param data
    */
-  private void verify(double value) {
+  private void verify(BigDecimal value) {
 
-    if (value == Double.POSITIVE_INFINITY) {
+    // TODO get rid of this if not a Number axis type
+    double doubleValue = value.doubleValue();
+    if (doubleValue == Double.POSITIVE_INFINITY) {
       throw new RuntimeException("Axis data cannot contain Double.POSITIVE_INFINITY!!!");
-    } else if (value == Double.NEGATIVE_INFINITY) {
+    } else if (doubleValue == Double.NEGATIVE_INFINITY) {
       throw new RuntimeException("Axis data cannot contain Double.NEGATIVE_INFINITY!!!");
     }
+    // TODO get rid of this if not a Date axis type
+    long longValue = value.longValue();
+    if (longValue == Long.MAX_VALUE) {
+      throw new RuntimeException("Axis data cannot be greater than Long.MAX_VALUE!!!");
+    } else if (longValue == Long.MIN_VALUE) {
+      throw new RuntimeException("Axis data cannot be less than Long.MIN_VALUE!!!");
+    }
+
   }
 
   public String getName() {
@@ -175,7 +206,7 @@ public class Series {
     return name;
   }
 
-  public Collection<Number> getxData() {
+  public Collection<?> getxData() {
 
     return xData;
   }
@@ -190,22 +221,22 @@ public class Series {
     return errorBars;
   }
 
-  public double getxMin() {
+  public BigDecimal getxMin() {
 
     return xMin;
   }
 
-  public double getxMax() {
+  public BigDecimal getxMax() {
 
     return xMax;
   }
 
-  public double getyMin() {
+  public BigDecimal getyMin() {
 
     return yMin;
   }
 
-  public double getyMax() {
+  public BigDecimal getyMax() {
 
     return yMax;
   }
@@ -217,12 +248,12 @@ public class Series {
 
   public void setLineStyle(SeriesLineStyle lineStyle) {
 
-    this.stroke = SeriesLineStyle.getBasicStroke(lineStyle);
+    stroke = SeriesLineStyle.getBasicStroke(lineStyle);
   }
 
   public void setLineStyle(BasicStroke lineStyle) {
 
-    this.stroke = lineStyle;
+    stroke = lineStyle;
   }
 
   public Color getLineColor() {
@@ -232,12 +263,12 @@ public class Series {
 
   public void setLineColor(SeriesColor lineColor) {
 
-    this.strokeColor = SeriesColor.getAWTColor(lineColor);
+    strokeColor = SeriesColor.getAWTColor(lineColor);
   }
 
   public void setLineColor(java.awt.Color lineColor) {
 
-    this.strokeColor = lineColor;
+    strokeColor = lineColor;
   }
 
   public Marker getMarker() {
diff --git a/src/main/java/com/xeiam/xchart/swing/SwingWrapper.java b/src/main/java/com/xeiam/xchart/swing/SwingWrapper.java
index f571d3dd60c66434319e3a9bbdf16710f5aac23b..6696234bbe8c77f45281e963cf64ef9e80046788 100644
--- a/src/main/java/com/xeiam/xchart/swing/SwingWrapper.java
+++ b/src/main/java/com/xeiam/xchart/swing/SwingWrapper.java
@@ -15,14 +15,10 @@
  */
 package com.xeiam.xchart.swing;
 
-import java.awt.Dimension;
-import java.awt.Graphics;
-import java.awt.Graphics2D;
 import java.awt.GridLayout;
 import java.util.ArrayList;
 import java.util.List;
 
-import javax.swing.BoxLayout;
 import javax.swing.JFrame;
 import javax.swing.JPanel;
 
@@ -108,10 +104,10 @@ public class SwingWrapper {
         // Create and set up the window.
         JFrame frame = new JFrame("XChart");
         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
-        frame.getContentPane().setLayout(new BoxLayout(frame.getContentPane(), BoxLayout.Y_AXIS));
-
-        JPanel chartPanel = new ChartJPanel(charts.get(0));
-        frame.getContentPane().add(chartPanel);
+        // frame.setSize(new Dimension(charts.get(0).getWidth(), charts.get(0).getHeight()));
+        JPanel chartPanel = new XChartJPanel(charts.get(0));
+        // frame.getContentPane().add(chartPanel);
+        frame.add(chartPanel);
 
         // Display the window.
         frame.pack();
@@ -139,7 +135,7 @@ public class SwingWrapper {
 
         for (Chart chart : charts) {
           if (chart != null) {
-            JPanel chartPanel = new ChartJPanel(chart);
+            JPanel chartPanel = new XChartJPanel(chart);
             frame.getContentPane().add(chartPanel);
           } else {
             JPanel chartPanel = new JPanel();
@@ -155,25 +151,4 @@ public class SwingWrapper {
     });
   }
 
-  private class ChartJPanel extends JPanel {
-
-    private Chart chart;
-
-    public ChartJPanel(Chart chart) {
-
-      this.chart = chart;
-    }
-
-    @Override
-    public void paint(Graphics g) {
-
-      chart.paint((Graphics2D) g);
-    }
-
-    @Override
-    public Dimension getPreferredSize() {
-
-      return new Dimension(chart.getWidth(), chart.getHeight());
-    }
-  }
 }
diff --git a/src/main/java/com/xeiam/xchart/swing/XChartJPanel.java b/src/main/java/com/xeiam/xchart/swing/XChartJPanel.java
new file mode 100644
index 0000000000000000000000000000000000000000..cd74d039fdb829069505f8f691599a5832775693
--- /dev/null
+++ b/src/main/java/com/xeiam/xchart/swing/XChartJPanel.java
@@ -0,0 +1,55 @@
+/**
+ * Copyright 2012 Xeiam LLC.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.xeiam.xchart.swing;
+
+import java.awt.Dimension;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+
+import javax.swing.JPanel;
+
+import com.xeiam.xchart.Chart;
+
+/**
+ * @author timmolter
+ * @create Sep 9, 2012
+ */
+public class XChartJPanel extends JPanel {
+
+  private Chart chart;
+
+  public XChartJPanel(Chart chart) {
+
+    this.chart = chart;
+  }
+
+  @Override
+  protected void paintComponent(Graphics g) {
+
+    super.paintComponent(g);
+
+    super.removeAll();
+    System.out.println(getSize().toString());
+
+    chart.paint((Graphics2D) g, getSize().width, getSize().height);
+  }
+
+  @Override
+  public Dimension getPreferredSize() {
+
+    return new Dimension(chart.getWidth(), chart.getHeight());
+  }
+}
diff --git a/src/test/java/com/xeiam/xchart/example/Example10.java b/src/test/java/com/xeiam/xchart/example/Example10.java
new file mode 100644
index 0000000000000000000000000000000000000000..af8e41506bb88846d0696c7dd943f0948cfa0f75
--- /dev/null
+++ b/src/test/java/com/xeiam/xchart/example/Example10.java
@@ -0,0 +1,54 @@
+/**
+ * Copyright 2011-2012 Xeiam LLC.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.xeiam.xchart.example;
+
+import java.util.Arrays;
+import java.util.Collection;
+
+import com.xeiam.xchart.Chart;
+import com.xeiam.xchart.swing.SwingWrapper;
+
+/**
+ * Creates a simple charts using Longs as inputs
+ * 
+ * @author timmolter
+ */
+public class Example10 {
+
+  public static void main(String[] args) throws Exception {
+
+    Collection<Number> xData = Arrays
+        .asList(new Number[] { 1222812000000L, 1222898400000L, 1222984800000L, 1223071200000L, 1223157600000L, 1223244000000L, 1223330400000L, 1223416800000L, 1223503200000L, 1223589600000L });
+    // .asList(new Number[] { 12228120L, 12228984L, 12229848L, 12230712L, 12231576L, 12232440L, 12233304L, 12234168L, 12235032L, 12235896L });
+    // .asList(new Number[] { 12228120, 12228984, 12229848, 12230712, 12231576, 12232440, 12233304, 12234168, 12235032, 12235896 });
+    // .asList(new Number[] { 12228120.0, 12228984.0, 12229848.0, 12230712.0, 12231576.0, 12232440.0, 12233304.0, 12234168.0, 12235032.0, 12235896.0 });
+    // .asList(new Number[] { 0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0 });
+    // .asList(new Number[] { 0.0, 100.0, 200.0, 300.0, 400.0, 500.0, 600.0, 700.0, 800.0, 900.0 });
+    // .asList(new Number[] { 0.0, 100000000.0, 200000000.0, 300000000.0, 400000000.0, 500000000.0, 600000000.0, 700000000.0, 800000000.0, 900000000.0 });
+    Collection<Number> yData = Arrays.asList(new Number[] { 0.0, 1.0, 2.0, 0.0, 1.0, 2.0, 0.0, 1.0, 2.0, 0.0 });
+
+    // Create Chart
+    Chart chart = new Chart(700, 500);
+    chart.setChartTitle("Sample Chart");
+    chart.setXAxisTitle("X");
+    chart.setYAxisTitle("Y");
+    chart.addSeries("y(x)", xData, yData);
+
+    new SwingWrapper(chart).displayChart();
+
+  }
+
+}
diff --git a/src/test/java/com/xeiam/xchart/example/Example3.java b/src/test/java/com/xeiam/xchart/example/Example3.java
index a70b68ec6134fc73ec6092f5aaad5d4ba57e79a1..acf9f2c40e8a7eb6a57642dc6c1a3d37f3b83e25 100644
--- a/src/test/java/com/xeiam/xchart/example/Example3.java
+++ b/src/test/java/com/xeiam/xchart/example/Example3.java
@@ -48,6 +48,13 @@ public class Example3 {
       chart.setChartTitle("Sample Chart");
       chart.setXAxisTitle("X");
       chart.setYAxisTitle("Y");
+      // chart.setAxisTicksVisible(false);
+      // chart.setAxisTitlesVisible(false);
+      // chart.setXAxisTitleVisible(false);
+      // chart.setXAxisTicksVisible(false);
+      chart.setChartTitleVisible(false);
+      chart.setChartLegendVisible(false);
+      chart.setChartGridlinesVisible(false);
 
       String seriesName = "y=" + 2 * i + "x-" + i * b + "b";
       chart.addSeries(seriesName, xData, yData);
@@ -56,5 +63,4 @@ public class Example3 {
 
     new SwingWrapper(chart).displayChart();
   }
-
 }
diff --git a/src/test/java/com/xeiam/xchart/example/Example9.java b/src/test/java/com/xeiam/xchart/example/Example9.java
new file mode 100644
index 0000000000000000000000000000000000000000..64260399a66569edea435b375fc2f1f554090eb4
--- /dev/null
+++ b/src/test/java/com/xeiam/xchart/example/Example9.java
@@ -0,0 +1,61 @@
+/**
+ * Copyright 2011-2012 Xeiam LLC.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.xeiam.xchart.example;
+
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Date;
+
+import com.xeiam.xchart.Chart;
+import com.xeiam.xchart.swing.SwingWrapper;
+
+/**
+ * Create a chart with a Date x-axis
+ * 
+ * @author timmolter
+ */
+public class Example9 {
+
+  public static void main(String[] args) throws ParseException {
+
+    // Create Chart
+    Chart chart = new Chart(700, 500);
+
+    // generates linear data
+    Collection<Date> xData = new ArrayList<Date>();
+    Collection<Number> yData = new ArrayList<Number>();
+
+    DateFormat sdf = new SimpleDateFormat("dd.MM.yyyy");
+    for (int i = 1; i <= 10; i++) {
+      Date date = sdf.parse(i + ".10.2008");
+      xData.add(date);
+      yData.add(Math.random() * i);
+    }
+
+    // Customize Chart
+    chart.setChartTitle("Sample Chart with Date X-Axis");
+    chart.setXAxisTitle("X");
+    chart.setYAxisTitle("Y");
+
+    chart.addDateSeries("Fake Data", xData, yData);
+
+    new SwingWrapper(chart).displayChart();
+  }
+
+}