initial contribution of IGraphicsContext
diff --git a/org.eclipse.nebula.widgets.nattable.core.test/META-INF/MANIFEST.MF b/org.eclipse.nebula.widgets.nattable.core.test/META-INF/MANIFEST.MF
index 0079b34..d1e272f 100644
--- a/org.eclipse.nebula.widgets.nattable.core.test/META-INF/MANIFEST.MF
+++ b/org.eclipse.nebula.widgets.nattable.core.test/META-INF/MANIFEST.MF
@@ -14,5 +14,5 @@
  org.eclipse.nebula.widgets.nattable.test.fixture.group,
  org.eclipse.nebula.widgets.nattable.test.fixture.layer,
  org.eclipse.nebula.widgets.nattable.test.integration
-Require-Bundle: org.junit4
+Require-Bundle: org.junit;bundle-version="4.11.0"
 Bundle-Vendor: Eclipse Nebula NatTable
diff --git a/org.eclipse.nebula.widgets.nattable.core.test/src/org/eclipse/nebula/widgets/nattable/core/geometry/RectangleTest.java b/org.eclipse.nebula.widgets.nattable.core.test/src/org/eclipse/nebula/widgets/nattable/core/geometry/RectangleTest.java
new file mode 100644
index 0000000..8ca41c7
--- /dev/null
+++ b/org.eclipse.nebula.widgets.nattable.core.test/src/org/eclipse/nebula/widgets/nattable/core/geometry/RectangleTest.java
@@ -0,0 +1,580 @@
+package org.eclipse.nebula.widgets.nattable.core.geometry;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.math.BigInteger;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.junit.Test;
+
+public class RectangleTest {
+
+    // equals testing
+
+    @Test
+    public void pixelRectanglesShouldBeEqual() {
+        PixelRectangle rect1 = new PixelRectangle(20, 20, 100, 100);
+        PixelRectangle rect2 = new PixelRectangle(20, 20, 100, 100);
+
+        assertEquals(rect1, rect2);
+    }
+
+    @Test
+    public void pixelRectanglesShouldNotBeEqual() {
+        PixelRectangle rect1 = new PixelRectangle(20, 20, 100, 100);
+        PixelRectangle rect2 = new PixelRectangle(10, 10, 90, 90);
+
+        assertFalse("rectangles are equal", rect1.equals(rect2));
+    }
+
+    @Test
+    public void positionRectanglesShouldBeEqual() {
+        PositionRectangle rect1 = new PositionRectangle(
+                BigInteger.valueOf(20),
+                BigInteger.valueOf(20),
+                BigInteger.valueOf(100),
+                BigInteger.valueOf(100));
+        PositionRectangle rect2 = new PositionRectangle(
+                BigInteger.valueOf(20),
+                BigInteger.valueOf(20),
+                BigInteger.valueOf(100),
+                BigInteger.valueOf(100));
+
+        assertEquals(rect1, rect2);
+    }
+
+    @Test
+    public void positionRectanglesShouldNotBeEqual() {
+        PositionRectangle rect1 = new PositionRectangle(
+                BigInteger.valueOf(20),
+                BigInteger.valueOf(20),
+                BigInteger.valueOf(100),
+                BigInteger.valueOf(100));
+        PositionRectangle rect2 = new PositionRectangle(
+                BigInteger.valueOf(10),
+                BigInteger.valueOf(10),
+                BigInteger.valueOf(90),
+                BigInteger.valueOf(90));
+
+        assertFalse("rectangles are equal", rect1.equals(rect2));
+    }
+
+    // hashCode testing
+
+    @Test
+    public void pixelRectanglesHashCode() {
+        PixelRectangle rect1 = new PixelRectangle(20, 20, 100, 100);
+        PixelRectangle rect2 = new PixelRectangle(20, 20, 100, 100);
+
+        Set<PixelRectangle> set = new HashSet<PixelRectangle>();
+        set.add(rect1);
+        set.add(rect2);
+
+        assertEquals(1, set.size());
+
+        PixelRectangle rect3 = new PixelRectangle(10, 10, 90, 90);
+        set.add(rect3);
+
+        assertEquals(2, set.size());
+    }
+
+    @Test
+    public void positionRectanglesHashCode() {
+        PositionRectangle rect1 = new PositionRectangle(
+                BigInteger.valueOf(20),
+                BigInteger.valueOf(20),
+                BigInteger.valueOf(100),
+                BigInteger.valueOf(100));
+        PositionRectangle rect2 = new PositionRectangle(
+                BigInteger.valueOf(20),
+                BigInteger.valueOf(20),
+                BigInteger.valueOf(100),
+                BigInteger.valueOf(100));
+
+        Set<PositionRectangle> set = new HashSet<PositionRectangle>();
+        set.add(rect1);
+        set.add(rect2);
+
+        assertEquals(1, set.size());
+
+        PositionRectangle rect3 = new PositionRectangle(
+                BigInteger.valueOf(10),
+                BigInteger.valueOf(10),
+                BigInteger.valueOf(90),
+                BigInteger.valueOf(90));
+        set.add(rect3);
+
+        assertEquals(2, set.size());
+    }
+
+    // empty
+
+    @Test
+    public void pixelRectangleShouldBeEmpty() {
+        PixelRectangle rect = new PixelRectangle(20, 20, 100, 100);
+        assertFalse("rectangle is empty", rect.isEmpty());
+
+        rect = new PixelRectangle(20, 20, 100, -10);
+        assertTrue("rectangle is not empty", rect.isEmpty());
+
+        rect = new PixelRectangle(20, 20, -10, 100);
+        assertTrue("rectangle is not empty", rect.isEmpty());
+
+        rect = new PixelRectangle(20, 20, -10, -10);
+        assertTrue("rectangle is not empty", rect.isEmpty());
+    }
+
+    @Test
+    public void positionRectangleShouldBeEmpty() {
+        PositionRectangle rect = new PositionRectangle(
+                BigInteger.valueOf(20),
+                BigInteger.valueOf(20),
+                BigInteger.valueOf(100),
+                BigInteger.valueOf(100));
+        assertFalse("rectangle is empty", rect.isEmpty());
+
+        rect = new PositionRectangle(
+                BigInteger.valueOf(20),
+                BigInteger.valueOf(20),
+                BigInteger.valueOf(100),
+                BigInteger.valueOf(-10));
+        assertTrue("rectangle is not empty", rect.isEmpty());
+
+        rect = new PositionRectangle(
+                BigInteger.valueOf(20),
+                BigInteger.valueOf(20),
+                BigInteger.valueOf(-10),
+                BigInteger.valueOf(100));
+        assertTrue("rectangle is not empty", rect.isEmpty());
+
+        rect = new PositionRectangle(
+                BigInteger.valueOf(20),
+                BigInteger.valueOf(20),
+                BigInteger.valueOf(-10),
+                BigInteger.valueOf(-10));
+        assertTrue("rectangle is not empty", rect.isEmpty());
+    }
+
+    // contains
+
+    @Test(expected = IllegalArgumentException.class)
+    public void pixelRectangleContainsNull() {
+        PixelRectangle rect = new PixelRectangle(20, 20, 100, 100);
+        rect.contains(null);
+    }
+
+    @Test
+    public void pixelRectangleShouldContainCoordinate() {
+        PixelRectangle rect = new PixelRectangle(20, 20, 100, 100);
+
+        PixelCoordinate coord = new PixelCoordinate(20, 20);
+        assertTrue("retangle does not contain coordinate " + coord, rect.contains(coord));
+
+        coord = new PixelCoordinate(100, 100);
+        assertTrue("retangle does not contain coordinate " + coord, rect.contains(coord));
+
+        coord = new PixelCoordinate(40, 40);
+        assertTrue("retangle does not contain coordinate " + coord, rect.contains(coord));
+    }
+
+    @Test
+    public void pixelRectangleShouldNotContainCoordinate() {
+        PixelRectangle rect = new PixelRectangle(20, 20, 100, 100);
+
+        PixelCoordinate coord = new PixelCoordinate(19, 19);
+        assertFalse("retangle does not contain coordinate " + coord, rect.contains(coord));
+
+        coord = new PixelCoordinate(121, 121);
+        assertFalse("retangle does contain coordinate " + coord, rect.contains(coord));
+
+        coord = new PixelCoordinate(10, 40);
+        assertFalse("retangle does contain coordinate " + coord, rect.contains(coord));
+
+        coord = new PixelCoordinate(40, 140);
+        assertFalse("retangle does contain coordinate " + coord, rect.contains(coord));
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void positionRectangleContainsNull() {
+        PositionRectangle rect = new PositionRectangle(
+                BigInteger.valueOf(20),
+                BigInteger.valueOf(20),
+                BigInteger.valueOf(100),
+                BigInteger.valueOf(100));
+        rect.contains(null);
+    }
+
+    @Test
+    public void positionRectangleShouldContainCoordinate() {
+        PositionRectangle rect = new PositionRectangle(
+                BigInteger.valueOf(20),
+                BigInteger.valueOf(20),
+                BigInteger.valueOf(100),
+                BigInteger.valueOf(100));
+
+        PositionCoordinate coord = new PositionCoordinate(BigInteger.valueOf(20), BigInteger.valueOf(20));
+        assertTrue("retangle does not contain coordinate " + coord, rect.contains(coord));
+
+        coord = new PositionCoordinate(BigInteger.valueOf(100), BigInteger.valueOf(100));
+        assertTrue("retangle does not contain coordinate " + coord, rect.contains(coord));
+
+        coord = new PositionCoordinate(BigInteger.valueOf(40), BigInteger.valueOf(40));
+        assertTrue("retangle does not contain coordinate " + coord, rect.contains(coord));
+    }
+
+    @Test
+    public void positionRectangleShouldNotContainCoordinate() {
+        PositionRectangle rect = new PositionRectangle(
+                BigInteger.valueOf(20),
+                BigInteger.valueOf(20),
+                BigInteger.valueOf(100),
+                BigInteger.valueOf(100));
+
+        PositionCoordinate coord = new PositionCoordinate(BigInteger.valueOf(19), BigInteger.valueOf(19));
+        assertFalse("retangle does not contain coordinate " + coord, rect.contains(coord));
+
+        coord = new PositionCoordinate(BigInteger.valueOf(121), BigInteger.valueOf(121));
+        assertFalse("retangle does contain coordinate " + coord, rect.contains(coord));
+
+        coord = new PositionCoordinate(BigInteger.valueOf(10), BigInteger.valueOf(40));
+        assertFalse("retangle does contain coordinate " + coord, rect.contains(coord));
+
+        coord = new PositionCoordinate(BigInteger.valueOf(40), BigInteger.valueOf(140));
+        assertFalse("retangle does contain coordinate " + coord, rect.contains(coord));
+    }
+
+    // add - modify the current rectangle
+
+    @Test
+    public void pixelRectangleShouldAddSmaller() {
+        PixelRectangle rect1 = new PixelRectangle(20, 20, 100, 100);
+        PixelRectangle rect2 = new PixelRectangle(40, 40, 80, 80);
+
+        rect1.add(rect2);
+
+        assertEquals(20, rect1.x, 0);
+        assertEquals(20, rect1.y, 0);
+        assertEquals(100, rect1.width, 0);
+        assertEquals(100, rect1.height, 0);
+    }
+
+    @Test
+    public void pixelRectangleShouldAddBigger() {
+        PixelRectangle rect1 = new PixelRectangle(20, 20, 100, 100);
+        PixelRectangle rect2 = new PixelRectangle(0, 0, 120, 120);
+
+        rect1.add(rect2);
+
+        assertEquals(0, rect1.x, 0);
+        assertEquals(0, rect1.y, 0);
+        assertEquals(120, rect1.width, 0);
+        assertEquals(120, rect1.height, 0);
+    }
+
+    @Test
+    public void positionRectangleShouldAddSmaller() {
+        PositionRectangle rect1 = new PositionRectangle(
+                BigInteger.valueOf(20),
+                BigInteger.valueOf(20),
+                BigInteger.valueOf(100),
+                BigInteger.valueOf(100));
+        PositionRectangle rect2 = new PositionRectangle(
+                BigInteger.valueOf(40),
+                BigInteger.valueOf(40),
+                BigInteger.valueOf(80),
+                BigInteger.valueOf(80));
+
+        rect1.add(rect2);
+
+        assertEquals(BigInteger.valueOf(20), rect1.x);
+        assertEquals(BigInteger.valueOf(20), rect1.y);
+        assertEquals(BigInteger.valueOf(100), rect1.width);
+        assertEquals(BigInteger.valueOf(100), rect1.height);
+    }
+
+    @Test
+    public void positionRectangleShouldAddBigger() {
+        PositionRectangle rect1 = new PositionRectangle(
+                BigInteger.valueOf(20),
+                BigInteger.valueOf(20),
+                BigInteger.valueOf(100),
+                BigInteger.valueOf(100));
+        PositionRectangle rect2 = new PositionRectangle(
+                BigInteger.valueOf(0),
+                BigInteger.valueOf(0),
+                BigInteger.valueOf(120),
+                BigInteger.valueOf(120));
+
+        rect1.add(rect2);
+
+        assertEquals(BigInteger.valueOf(0), rect1.x);
+        assertEquals(BigInteger.valueOf(0), rect1.y);
+        assertEquals(BigInteger.valueOf(120), rect1.width);
+        assertEquals(BigInteger.valueOf(120), rect1.height);
+    }
+
+    // union - return a new rectangle
+
+    @Test
+    public void pixelRectangleShouldUnionSmaller() {
+        PixelRectangle rect1 = new PixelRectangle(20, 20, 100, 100);
+        PixelRectangle rect2 = new PixelRectangle(40, 40, 80, 80);
+
+        PixelRectangle union = rect1.union(rect2);
+
+        assertEquals(20, union.x, 0);
+        assertEquals(20, union.y, 0);
+        assertEquals(100, union.width, 0);
+        assertEquals(100, union.height, 0);
+    }
+
+    @Test
+    public void pixelRectangleShouldUnionBigger() {
+        PixelRectangle rect1 = new PixelRectangle(20, 20, 100, 100);
+        PixelRectangle rect2 = new PixelRectangle(0, 0, 120, 120);
+
+        PixelRectangle union = rect1.union(rect2);
+
+        assertEquals(0, union.x, 0);
+        assertEquals(0, union.y, 0);
+        assertEquals(120, union.width, 0);
+        assertEquals(120, union.height, 0);
+    }
+
+    @Test
+    public void positionRectangleShouldUnionSmaller() {
+        PositionRectangle rect1 = new PositionRectangle(
+                BigInteger.valueOf(20),
+                BigInteger.valueOf(20),
+                BigInteger.valueOf(100),
+                BigInteger.valueOf(100));
+        PositionRectangle rect2 = new PositionRectangle(
+                BigInteger.valueOf(40),
+                BigInteger.valueOf(40),
+                BigInteger.valueOf(80),
+                BigInteger.valueOf(80));
+
+        PositionRectangle union = rect1.union(rect2);
+
+        assertEquals(BigInteger.valueOf(20), union.x);
+        assertEquals(BigInteger.valueOf(20), union.y);
+        assertEquals(BigInteger.valueOf(100), union.width);
+        assertEquals(BigInteger.valueOf(100), union.height);
+    }
+
+    @Test
+    public void positionRectangleShouldUnionBigger() {
+        PositionRectangle rect1 = new PositionRectangle(
+                BigInteger.valueOf(20),
+                BigInteger.valueOf(20),
+                BigInteger.valueOf(100),
+                BigInteger.valueOf(100));
+        PositionRectangle rect2 = new PositionRectangle(
+                BigInteger.valueOf(0),
+                BigInteger.valueOf(0),
+                BigInteger.valueOf(120),
+                BigInteger.valueOf(120));
+
+        PositionRectangle union = rect1.union(rect2);
+
+        assertEquals(BigInteger.valueOf(0), union.x);
+        assertEquals(BigInteger.valueOf(0), union.y);
+        assertEquals(BigInteger.valueOf(120), union.width);
+        assertEquals(BigInteger.valueOf(120), union.height);
+    }
+
+    // intersect
+
+    @Test
+    public void pixelRectanglesShouldIntersect() {
+        PixelRectangle rect1 = new PixelRectangle(20, 20, 100, 100);
+        PixelRectangle rect2 = new PixelRectangle(60, 60, 100, 100);
+
+        assertTrue("rectangles do not intersect", rect1.intersects(rect2));
+
+        rect1.intersect(rect2);
+
+        assertEquals(60, rect1.x, 0);
+        assertEquals(60, rect1.y, 0);
+        assertEquals(60, rect1.width, 0);
+        assertEquals(60, rect1.height, 0);
+    }
+
+    @Test
+    public void pixelRectanglesShouldIntersect2() {
+        PixelRectangle rect1 = new PixelRectangle(20, 20, 100, 100);
+        PixelRectangle rect2 = new PixelRectangle(60, 60, 100, 100);
+
+        assertTrue("rectangles do not intersect", rect2.intersects(rect1));
+
+        rect2.intersect(rect1);
+
+        assertEquals(60, rect2.x, 0);
+        assertEquals(60, rect2.y, 0);
+        assertEquals(60, rect2.width, 0);
+        assertEquals(60, rect2.height, 0);
+    }
+
+    @Test
+    public void pixelRectanglesShouldProvideIntersection() {
+        PixelRectangle rect1 = new PixelRectangle(20, 20, 100, 100);
+        PixelRectangle rect2 = new PixelRectangle(60, 60, 100, 100);
+
+        assertTrue("rectangles do not intersect", rect1.intersects(rect2));
+
+        PixelRectangle inter = rect1.intersection(rect2);
+
+        assertEquals(60, inter.x, 0);
+        assertEquals(60, inter.y, 0);
+        assertEquals(60, inter.width, 0);
+        assertEquals(60, inter.height, 0);
+    }
+
+    @Test
+    public void pixelRectanglesShouldProvideIntersection2() {
+        PixelRectangle rect1 = new PixelRectangle(20, 20, 100, 100);
+        PixelRectangle rect2 = new PixelRectangle(60, 60, 100, 100);
+
+        assertTrue("rectangles do not intersect", rect2.intersects(rect1));
+
+        PixelRectangle inter = rect1.intersection(rect2);
+
+        assertEquals(60, inter.x, 0);
+        assertEquals(60, inter.y, 0);
+        assertEquals(60, inter.width, 0);
+        assertEquals(60, inter.height, 0);
+    }
+
+    @Test
+    public void pixelRectanglesShouldNotIntersect() {
+        PixelRectangle rect1 = new PixelRectangle(20, 20, 40, 40);
+        PixelRectangle rect2 = new PixelRectangle(60, 60, 100, 100);
+
+        assertFalse("rectangles do intersect", rect1.intersects(rect2));
+
+        rect1.intersect(rect2);
+
+        assertEquals(60, rect1.x, 0);
+        assertEquals(60, rect1.y, 0);
+        assertEquals(0, rect1.width, 0);
+        assertEquals(0, rect1.height, 0);
+    }
+
+    @Test
+    public void positionRectanglesShouldIntersect() {
+        PositionRectangle rect1 = new PositionRectangle(
+                BigInteger.valueOf(20),
+                BigInteger.valueOf(20),
+                BigInteger.valueOf(100),
+                BigInteger.valueOf(100));
+        PositionRectangle rect2 = new PositionRectangle(
+                BigInteger.valueOf(60),
+                BigInteger.valueOf(60),
+                BigInteger.valueOf(100),
+                BigInteger.valueOf(100));
+
+        assertTrue("rectangles do not intersect", rect1.intersects(rect2));
+
+        rect1.intersect(rect2);
+
+        assertEquals(BigInteger.valueOf(60), rect1.x);
+        assertEquals(BigInteger.valueOf(60), rect1.y);
+        assertEquals(BigInteger.valueOf(60), rect1.width);
+        assertEquals(BigInteger.valueOf(60), rect1.height);
+    }
+
+    @Test
+    public void positionRectanglesShouldIntersect2() {
+        PositionRectangle rect1 = new PositionRectangle(
+                BigInteger.valueOf(20),
+                BigInteger.valueOf(20),
+                BigInteger.valueOf(100),
+                BigInteger.valueOf(100));
+        PositionRectangle rect2 = new PositionRectangle(
+                BigInteger.valueOf(60),
+                BigInteger.valueOf(60),
+                BigInteger.valueOf(100),
+                BigInteger.valueOf(100));
+
+        assertTrue("rectangles do not intersect", rect2.intersects(rect1));
+
+        rect2.intersect(rect1);
+
+        assertEquals(BigInteger.valueOf(60), rect2.x);
+        assertEquals(BigInteger.valueOf(60), rect2.y);
+        assertEquals(BigInteger.valueOf(60), rect2.width);
+        assertEquals(BigInteger.valueOf(60), rect2.height);
+    }
+
+    @Test
+    public void positionRectanglesShouldProvideIntersection() {
+        PositionRectangle rect1 = new PositionRectangle(
+                BigInteger.valueOf(20),
+                BigInteger.valueOf(20),
+                BigInteger.valueOf(100),
+                BigInteger.valueOf(100));
+        PositionRectangle rect2 = new PositionRectangle(
+                BigInteger.valueOf(60),
+                BigInteger.valueOf(60),
+                BigInteger.valueOf(100),
+                BigInteger.valueOf(100));
+
+        assertTrue("rectangles do not intersect", rect1.intersects(rect2));
+
+        PositionRectangle inter = rect1.intersection(rect2);
+
+        assertEquals(BigInteger.valueOf(60), inter.x);
+        assertEquals(BigInteger.valueOf(60), inter.y);
+        assertEquals(BigInteger.valueOf(60), inter.width);
+        assertEquals(BigInteger.valueOf(60), inter.height);
+    }
+
+    @Test
+    public void positionRectanglesShouldProvideIntersection2() {
+        PositionRectangle rect1 = new PositionRectangle(
+                BigInteger.valueOf(20),
+                BigInteger.valueOf(20),
+                BigInteger.valueOf(100),
+                BigInteger.valueOf(100));
+        PositionRectangle rect2 = new PositionRectangle(
+                BigInteger.valueOf(60),
+                BigInteger.valueOf(60),
+                BigInteger.valueOf(100),
+                BigInteger.valueOf(100));
+
+        assertTrue("rectangles do not intersect", rect2.intersects(rect1));
+
+        PositionRectangle inter = rect1.intersection(rect2);
+
+        assertEquals(BigInteger.valueOf(60), inter.x);
+        assertEquals(BigInteger.valueOf(60), inter.y);
+        assertEquals(BigInteger.valueOf(60), inter.width);
+        assertEquals(BigInteger.valueOf(60), inter.height);
+    }
+
+    @Test
+    public void positionRectanglesShouldNotIntersect() {
+        PositionRectangle rect1 = new PositionRectangle(
+                BigInteger.valueOf(20),
+                BigInteger.valueOf(20),
+                BigInteger.valueOf(40),
+                BigInteger.valueOf(40));
+        PositionRectangle rect2 = new PositionRectangle(
+                BigInteger.valueOf(60),
+                BigInteger.valueOf(60),
+                BigInteger.valueOf(100),
+                BigInteger.valueOf(100));
+
+        assertFalse("rectangles do intersect", rect1.intersects(rect2));
+
+        rect1.intersect(rect2);
+
+        assertEquals(BigInteger.valueOf(60), rect1.x);
+        assertEquals(BigInteger.valueOf(60), rect1.y);
+        assertEquals(BigInteger.valueOf(0), rect1.width);
+        assertEquals(BigInteger.valueOf(0), rect1.height);
+    }
+}
diff --git a/org.eclipse.nebula.widgets.nattable.core/META-INF/MANIFEST.MF b/org.eclipse.nebula.widgets.nattable.core/META-INF/MANIFEST.MF
index 7678d2f..a5a2c9c 100644
--- a/org.eclipse.nebula.widgets.nattable.core/META-INF/MANIFEST.MF
+++ b/org.eclipse.nebula.widgets.nattable.core/META-INF/MANIFEST.MF
@@ -23,6 +23,8 @@
  org.eclipse.nebula.widgets.nattable.copy.action;version="2.0.0",
  org.eclipse.nebula.widgets.nattable.copy.command;version="2.0.0",
  org.eclipse.nebula.widgets.nattable.copy.serializing;version="2.0.0",
+ org.eclipse.nebula.widgets.nattable.core.geometry;version="2.0.0",
+ org.eclipse.nebula.widgets.nattable.core.ui.rendering;version="2.0.0",
  org.eclipse.nebula.widgets.nattable.data;version="2.0.0",
  org.eclipse.nebula.widgets.nattable.data.convert;version="2.0.0",
  org.eclipse.nebula.widgets.nattable.data.validate;version="2.0.0",
@@ -73,6 +75,7 @@
  org.eclipse.nebula.widgets.nattable.hover.config;version="2.0.0",
  org.eclipse.nebula.widgets.nattable.layer;version="2.0.0",
  org.eclipse.nebula.widgets.nattable.layer.cell;version="2.0.0",
+ org.eclipse.nebula.widgets.nattable.layer.command;version="2.0.0",
  org.eclipse.nebula.widgets.nattable.layer.config;version="2.0.0",
  org.eclipse.nebula.widgets.nattable.layer.event;version="2.0.0",
  org.eclipse.nebula.widgets.nattable.layer.stack;version="2.0.0",
@@ -140,7 +143,6 @@
  org.eclipse.nebula.widgets.nattable.ui.matcher;version="2.0.0",
  org.eclipse.nebula.widgets.nattable.ui.menu;version="2.0.0",
  org.eclipse.nebula.widgets.nattable.ui.mode;version="2.0.0",
- org.eclipse.nebula.widgets.nattable.ui.rendering;version="2.0.0",
  org.eclipse.nebula.widgets.nattable.ui.util;version="2.0.0",
  org.eclipse.nebula.widgets.nattable.util;version="2.0.0",
  org.eclipse.nebula.widgets.nattable.viewport;version="2.0.0",
@@ -169,4 +171,4 @@
  org.eclipse.swt.program,
  org.eclipse.swt.widgets
 Bundle-Vendor: Eclipse Nebula NatTable
-Require-Bundle: org.eclipse.equinox.common;bundle-version="3.5.1"
+Require-Bundle: org.eclipse.equinox.common;bundle-version="3.6.0"
diff --git a/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/core/geometry/PixelCoordinate.java b/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/core/geometry/PixelCoordinate.java
new file mode 100644
index 0000000..c2e61c8
--- /dev/null
+++ b/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/core/geometry/PixelCoordinate.java
@@ -0,0 +1,88 @@
+/*******************************************************************************
+ * Copyright (c) 2014 Dirk Fauth, Edwin Park.
+ * 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:
+ *     Dirk Fauth <dirk.fauth@googlemail.com>   - initial API and implementation
+ *     Edwin Park <esp1@cornell.edu>            - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.nebula.widgets.nattable.core.geometry;
+
+/**
+ * Instances of this class represent places on the (x, y) coordinate plane. It
+ * is used to identify a pixel coordinate for drawing operations via graphics
+ * context. The values for x and y are stored as double values because newer UI
+ * toolkits use doubles to identify coordinates to support scaling.
+ * <p>
+ * Note that the x and y values are final.
+ * </p>
+ * <p>
+ * There might be an implementation for this in every UI toolkit, like
+ * org.eclipse.swt.graphics.Point or java.awt.Point, but they are dependent to
+ * the UI toolkit because of their package and inheritance. That's why we
+ * re-implemented it again to make use of it in NatTable core without any
+ * further dependencies.
+ * </p>
+ */
+public class PixelCoordinate {
+
+    /**
+     * the x coordinate of the point
+     */
+    public final double x;
+
+    /**
+     * the y coordinate of the point
+     */
+    public final double y;
+
+    /**
+     * Constructs a new pixel coordinate with the given x and y coordinates.
+     *
+     * @param x
+     *            the x coordinate of the new point
+     * @param y
+     *            the y coordinate of the new point
+     */
+    public PixelCoordinate(double x, double y) {
+        this.x = x;
+        this.y = y;
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        long temp;
+        temp = Double.doubleToLongBits(this.x);
+        result = prime * result + (int) (temp ^ (temp >>> 32));
+        temp = Double.doubleToLongBits(this.y);
+        result = prime * result + (int) (temp ^ (temp >>> 32));
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (obj == null)
+            return false;
+        if (getClass() != obj.getClass())
+            return false;
+        PixelCoordinate other = (PixelCoordinate) obj;
+        if (Double.doubleToLongBits(this.x) != Double.doubleToLongBits(other.x))
+            return false;
+        if (Double.doubleToLongBits(this.y) != Double.doubleToLongBits(other.y))
+            return false;
+        return true;
+    }
+
+    @Override
+    public String toString() {
+        return "PixelCoordinate {" + this.x + ", " + this.y + "}"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+    }
+
+}
diff --git a/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/core/geometry/PixelRectangle.java b/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/core/geometry/PixelRectangle.java
new file mode 100644
index 0000000..ddd1915
--- /dev/null
+++ b/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/core/geometry/PixelRectangle.java
@@ -0,0 +1,341 @@
+/*******************************************************************************
+ * Copyright (c) 2014 Dirk Fauth, Edwin Park.
+ * 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:
+ *     Dirk Fauth <dirk.fauth@googlemail.com>   - initial API and implementation
+ *     Edwin Park <esp1@cornell.edu>            - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.nebula.widgets.nattable.core.geometry;
+
+/**
+ * Instances of this class represent rectangular areas in an (x, y) coordinate
+ * system. The top left corner of the rectangle is specified by its x and y
+ * values, and the extent of the rectangle is specified by its width and height.
+ * The values are stored as double values because newer UI toolkits use doubles
+ * to identify coordinates to support scaling.
+ * <p>
+ * There might be an implementation for this in every UI toolkit, like
+ * org.eclipse.swt.graphics.Rectangle or java.awt.Rectangle, but they are
+ * dependent to the UI toolkit because of their package and inheritance. That's
+ * why we re-implemented it again to make use of it in NatTable core without any
+ * further dependencies.
+ * </p>
+ */
+public class PixelRectangle {
+
+    /**
+     * the x coordinate of the rectangle
+     */
+    public double x;
+
+    /**
+     * the y coordinate of the rectangle
+     */
+    public double y;
+
+    /**
+     * the width of the rectangle
+     */
+    public double width;
+
+    /**
+     * the height of the rectangle
+     */
+    public double height;
+
+    /**
+     * Construct a new instance of this class given the x, y, width and height
+     * values.
+     *
+     * @param x
+     *            the x coordinate of the origin of the rectangle
+     * @param y
+     *            the y coordinate of the origin of the rectangle
+     * @param width
+     *            the width of the rectangle
+     * @param height
+     *            the height of the rectangle
+     */
+    public PixelRectangle(double x, double y, double width, double height) {
+        this.x = x;
+        this.y = y;
+        this.width = width;
+        this.height = height;
+    }
+
+    /**
+     * Destructively replaces the x, y, width and height values in the receiver
+     * with ones which represent the union of the rectangles specified by the
+     * receiver and the given rectangle.
+     * <p>
+     * The union of two rectangles is the smallest single rectangle that
+     * completely covers both of the areas covered by the two given rectangles.
+     * </p>
+     *
+     * @param rect
+     *            the rectangle to merge with the receiver
+     *
+     * @throws IllegalArgumentException
+     *             if the specified rectangle is <code>null</code>
+     */
+    public void add(PixelRectangle rect) {
+        if (rect == null)
+            throw new IllegalArgumentException("rectangle can not be null"); //$NON-NLS-1$
+        double left = this.x < rect.x ? this.x : rect.x;
+        double top = this.y < rect.y ? this.y : rect.y;
+        double lhs = this.x + this.width;
+        double rhs = rect.x + rect.width;
+        double right = lhs > rhs ? lhs : rhs;
+        lhs = this.y + this.height;
+        rhs = rect.y + rect.height;
+        double bottom = lhs > rhs ? lhs : rhs;
+        this.x = left;
+        this.y = top;
+        this.width = right - left;
+        this.height = bottom - top;
+    }
+
+    /**
+     * Returns <code>true</code> if the point specified by the arguments is
+     * inside the area specified by the receiver, and <code>false</code>
+     * otherwise.
+     *
+     * @param x
+     *            the x coordinate of the point to test for containment
+     * @param y
+     *            the y coordinate of the point to test for containment
+     * @return <code>true</code> if the rectangle contains the point and
+     *         <code>false</code> otherwise
+     */
+    public boolean contains(double x, double y) {
+        return (x >= this.x) && (y >= this.y) && x < (this.x + this.width) && y < (this.y + this.height);
+    }
+
+    /**
+     * Returns <code>true</code> if the given pixel coordinate is inside the
+     * area specified by the receiver, and <code>false</code> otherwise.
+     *
+     * @param pt
+     *            the point to test for containment
+     * @return <code>true</code> if the rectangle contains the point and
+     *         <code>false</code> otherwise
+     *
+     * @throws IllegalArgumentException
+     *             if the specified point is <code>null</code>
+     */
+    public boolean contains(PixelCoordinate pt) {
+        if (pt == null)
+            throw new IllegalArgumentException("pixel coordinate can not be null"); //$NON-NLS-1$
+        return contains(pt.x, pt.y);
+    }
+
+    /**
+     * Returns <code>true</code> if the receiver does not cover any area in the
+     * (x, y) coordinate plane, and <code>false</code> if the receiver does
+     * cover some area in the plane.
+     * <p>
+     * A rectangle is considered to <em>cover area</em> in the (x, y) coordinate
+     * plane if both its width and height are non-zero.
+     * </p>
+     *
+     * @return <code>true</code> if the receiver is empty, and
+     *         <code>false</code> otherwise
+     */
+    public boolean isEmpty() {
+        return (this.width <= 0) || (this.height <= 0);
+    }
+
+    /**
+     * Destructively replaces the x, y, width and height values in the receiver
+     * with ones which represent the intersection of the rectangles specified by
+     * the receiver and the given rectangle.
+     *
+     * @param rect
+     *            the rectangle to intersect with the receiver
+     *
+     * @throws IllegalArgumentException
+     *             if the specified rectangle is <code>null</code>
+     */
+    public void intersect(PixelRectangle rect) {
+        if (rect == null)
+            throw new IllegalArgumentException("rectangle can not be null"); //$NON-NLS-1$
+        if (this == rect)
+            return;
+        double left = this.x > rect.x ? this.x : rect.x;
+        double top = this.y > rect.y ? this.y : rect.y;
+        double lhs = this.x + this.width;
+        double rhs = rect.x + rect.width;
+        double right = lhs < rhs ? lhs : rhs;
+        lhs = this.y + this.height;
+        rhs = rect.y + rect.height;
+        double bottom = lhs < rhs ? lhs : rhs;
+        this.x = right < left ? 0 : left;
+        this.y = bottom < top ? 0 : top;
+        this.width = right < left ? 0 : right - left;
+        this.height = bottom < top ? 0 : bottom - top;
+    }
+
+    /**
+     * Returns a new rectangle which represents the intersection of the receiver
+     * and the given rectangle.
+     * <p>
+     * The intersection of two rectangles is the rectangle that covers the area
+     * which is contained within both rectangles.
+     * </p>
+     *
+     * @param rect
+     *            the rectangle to intersect with the receiver
+     * @return the intersection of the receiver and the argument
+     *
+     * @throws IllegalArgumentException
+     *             if the specified rectangle is <code>null</code>
+     */
+    public PixelRectangle intersection(PixelRectangle rect) {
+        if (rect == null)
+            throw new IllegalArgumentException("rectangle can not be null"); //$NON-NLS-1$
+        if (this == rect)
+            return new PixelRectangle(this.x, this.y, this.width, this.height);
+        double left = this.x > rect.x ? this.x : rect.x;
+        double top = this.y > rect.y ? this.y : rect.y;
+        double lhs = this.x + this.width;
+        double rhs = rect.x + rect.width;
+        double right = lhs < rhs ? lhs : rhs;
+        lhs = this.y + this.height;
+        rhs = rect.y + rect.height;
+        double bottom = lhs < rhs ? lhs : rhs;
+        return new PixelRectangle(
+                right < left ? 0 : left,
+                        bottom < top ? 0 : top,
+                                right < left ? 0 : right - left,
+                                        bottom < top ? 0 : bottom - top);
+    }
+
+    /**
+     * Returns <code>true</code> if the rectangle described by the arguments
+     * intersects with the receiver and <code>false</code> otherwise.
+     * <p>
+     * Two rectangles intersect if the area of the rectangle representing their
+     * intersection is not empty.
+     * </p>
+     *
+     * @param x
+     *            the x coordinate of the origin of the rectangle
+     * @param y
+     *            the y coordinate of the origin of the rectangle
+     * @param width
+     *            the width of the rectangle
+     * @param height
+     *            the height of the rectangle
+     * @return <code>true</code> if the rectangle intersects with the receiver,
+     *         and <code>false</code> otherwise
+     *
+     * @see #intersection(PixelRectangle)
+     * @see #isEmpty()
+     */
+    public boolean intersects(double x, double y, double width, double height) {
+        return (x < this.x + this.width) && (y < this.y + this.height) &&
+                (x + width > this.x) && (y + height > this.y);
+    }
+
+    /**
+     * Returns <code>true</code> if the given rectangle intersects with the
+     * receiver and <code>false</code> otherwise.
+     * <p>
+     * Two rectangles intersect if the area of the rectangle representing their
+     * intersection is not empty.
+     * </p>
+     *
+     * @param rect
+     *            the rectangle to test for intersection
+     * @return <code>true</code> if the rectangle intersects with the receiver,
+     *         and <code>false</code> otherwise
+     *
+     * @throws IllegalArgumentException
+     *             if the specified rectangle is <code>null</code>
+     *
+     * @see #intersection(PixelRectangle)
+     * @see #isEmpty()
+     */
+    public boolean intersects(PixelRectangle rect) {
+        if (rect == null)
+            throw new IllegalArgumentException("rectangle can not be null"); //$NON-NLS-1$
+        return rect == this || intersects(rect.x, rect.y, rect.width, rect.height);
+    }
+
+    /**
+     * Returns a new rectangle which represents the union of the receiver and
+     * the given rectangle.
+     * <p>
+     * The union of two rectangles is the smallest single rectangle that
+     * completely covers both of the areas covered by the two given rectangles.
+     * </p>
+     *
+     * @param rect
+     *            the rectangle to perform union with
+     * @return the union of the receiver and the argument
+     *
+     * @throws IllegalArgumentException
+     *             if the specified rectangle is <code>null</code>
+     *
+     * @see #add(PixelRectangle)
+     */
+    public PixelRectangle union(PixelRectangle rect) {
+        if (rect == null)
+            throw new IllegalArgumentException("rectangle can not be null"); //$NON-NLS-1$
+        double left = this.x < rect.x ? this.x : rect.x;
+        double top = this.y < rect.y ? this.y : rect.y;
+        double lhs = this.x + this.width;
+        double rhs = rect.x + rect.width;
+        double right = lhs > rhs ? lhs : rhs;
+        lhs = this.y + this.height;
+        rhs = rect.y + rect.height;
+        double bottom = lhs > rhs ? lhs : rhs;
+        return new PixelRectangle(left, top, right - left, bottom - top);
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        long temp;
+        temp = Double.doubleToLongBits(this.height);
+        result = prime * result + (int) (temp ^ (temp >>> 32));
+        temp = Double.doubleToLongBits(this.width);
+        result = prime * result + (int) (temp ^ (temp >>> 32));
+        temp = Double.doubleToLongBits(this.x);
+        result = prime * result + (int) (temp ^ (temp >>> 32));
+        temp = Double.doubleToLongBits(this.y);
+        result = prime * result + (int) (temp ^ (temp >>> 32));
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (obj == null)
+            return false;
+        if (getClass() != obj.getClass())
+            return false;
+        PixelRectangle other = (PixelRectangle) obj;
+        if (Double.doubleToLongBits(this.height) != Double.doubleToLongBits(other.height))
+            return false;
+        if (Double.doubleToLongBits(this.width) != Double.doubleToLongBits(other.width))
+            return false;
+        if (Double.doubleToLongBits(this.x) != Double.doubleToLongBits(other.x))
+            return false;
+        if (Double.doubleToLongBits(this.y) != Double.doubleToLongBits(other.y))
+            return false;
+        return true;
+    }
+
+    @Override
+    public String toString() {
+        return "PixelRectangle {" + this.x + ", " + this.y + ", " + this.width + ", " + this.height + "}"; //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
+    }
+
+}
diff --git a/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/core/geometry/PositionCoordinate.java b/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/core/geometry/PositionCoordinate.java
new file mode 100644
index 0000000..7d2f80f
--- /dev/null
+++ b/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/core/geometry/PositionCoordinate.java
@@ -0,0 +1,84 @@
+/*******************************************************************************
+ * Copyright (c) 2014 Dirk Fauth, Edwin Park.
+ * 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:
+ *     Dirk Fauth <dirk.fauth@googlemail.com>   - initial API and implementation
+ *     Edwin Park <esp1@cornell.edu>            - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.nebula.widgets.nattable.core.geometry;
+
+import java.math.BigInteger;
+
+/**
+ * Instances of this class represent places on the (x, y) coordinate plane. It
+ * is used to identify a layer coordinate (column/row) in NatTable.
+ * <p>
+ * Note that the x and y values are final.
+ * </p>
+ */
+public class PositionCoordinate {
+
+    /**
+     * the x coordinate of the point
+     */
+    public final BigInteger x;
+
+    /**
+     * the y coordinate of the point
+     */
+    public final BigInteger y;
+
+    /**
+     * Constructs a new position coordinate with the given x and y coordinates.
+     *
+     * @param x
+     *            the x coordinate of the new point
+     * @param y
+     *            the y coordinate of the new point
+     */
+    public PositionCoordinate(BigInteger x, BigInteger y) {
+        this.x = x;
+        this.y = y;
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((this.x == null) ? 0 : this.x.hashCode());
+        result = prime * result + ((this.y == null) ? 0 : this.y.hashCode());
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (obj == null)
+            return false;
+        if (getClass() != obj.getClass())
+            return false;
+        PositionCoordinate other = (PositionCoordinate) obj;
+        if (this.x == null) {
+            if (other.x != null)
+                return false;
+        } else if (!this.x.equals(other.x))
+            return false;
+        if (this.y == null) {
+            if (other.y != null)
+                return false;
+        } else if (!this.y.equals(other.y))
+            return false;
+        return true;
+    }
+
+    @Override
+    public String toString() {
+        return "PositionCoordinate {" + this.x + ", " + this.y + "}"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+    }
+
+}
diff --git a/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/core/geometry/PositionRectangle.java b/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/core/geometry/PositionRectangle.java
new file mode 100644
index 0000000..8239b77
--- /dev/null
+++ b/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/core/geometry/PositionRectangle.java
@@ -0,0 +1,391 @@
+/*******************************************************************************
+ * Copyright (c) 2014 Dirk Fauth, Edwin Park.
+ * 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:
+ *     Dirk Fauth <dirk.fauth@googlemail.com>   - initial API and implementation
+ *     Edwin Park <esp1@cornell.edu>            - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.nebula.widgets.nattable.core.geometry;
+
+import java.math.BigInteger;
+
+/**
+ * Instances of this class represent rectangular areas in an (x, y) coordinate
+ * system. The top left corner of the rectangle is specified by its x and y
+ * values, and the extent of the rectangle is specified by its width and height.
+ * The values are stored as BigInteger values because newer UI toolkits use
+ * BigIntegers to identify coordinates to support scaling.
+ * <p>
+ * There might be an implementation for this in every UI toolkit, like
+ * org.eclipse.swt.graphics.Rectangle or java.awt.Rectangle, but they are
+ * dependent to the UI toolkit because of their package and inheritance. That's
+ * why we re-implemented it again to make use of it in NatTable core without any
+ * further dependencies.
+ * </p>
+ */
+public class PositionRectangle {
+
+    private static final BigInteger NONE = BigInteger.valueOf(-1);
+
+    /**
+     * the x coordinate of the rectangle
+     */
+    public BigInteger x;
+
+    /**
+     * the y coordinate of the rectangle
+     */
+    public BigInteger y;
+
+    /**
+     * the width of the rectangle
+     */
+    public BigInteger width;
+
+    /**
+     * the height of the rectangle
+     */
+    public BigInteger height;
+
+    /**
+     * Construct a new instance of this class given the x, y, width and height
+     * values.
+     * <p>
+     * This constructor is used for backwards compatibility because the layers
+     * are not yet updated for huge data sets and still use <code>int</code> to
+     * identify coordinates.
+     * </p>
+     *
+     * @param x
+     *            the x coordinate of the origin of the rectangle
+     * @param y
+     *            the y coordinate of the origin of the rectangle
+     * @param width
+     *            the width of the rectangle
+     * @param height
+     *            the height of the rectangle
+     */
+    public PositionRectangle(Integer x, Integer y, Integer width, Integer height) {
+        this.x = x != null ? BigInteger.valueOf(x) : NONE;
+        this.y = y != null ? BigInteger.valueOf(y) : NONE;
+        this.width = width != null ? BigInteger.valueOf(width) : NONE;
+        this.height = height != null ? BigInteger.valueOf(height) : NONE;
+    }
+
+    /**
+     * Construct a new instance of this class given the x, y, width and height
+     * values.
+     *
+     * @param x
+     *            the x coordinate of the origin of the rectangle
+     * @param y
+     *            the y coordinate of the origin of the rectangle
+     * @param width
+     *            the width of the rectangle
+     * @param height
+     *            the height of the rectangle
+     */
+    public PositionRectangle(BigInteger x, BigInteger y, BigInteger width, BigInteger height) {
+        this.x = x != null ? x : NONE;
+        this.y = y != null ? y : NONE;
+        this.width = width != null ? width : NONE;
+        this.height = height != null ? height : NONE;
+    }
+
+    /**
+     * Destructively replaces the x, y, width and height values in the receiver
+     * with ones which represent the union of the rectangles specified by the
+     * receiver and the given rectangle.
+     * <p>
+     * The union of two rectangles is the smallest single rectangle that
+     * completely covers both of the areas covered by the two given rectangles.
+     * </p>
+     *
+     * @param rect
+     *            the rectangle to merge with the receiver
+     *
+     * @throws IllegalArgumentException
+     *             if the specified rectangle is <code>null</code>
+     */
+    public void add(PositionRectangle rect) {
+        if (rect == null)
+            throw new IllegalArgumentException("rectangle can not be null"); //$NON-NLS-1$
+        BigInteger left = this.x.min(rect.x);
+        BigInteger top = this.y.min(rect.y);
+        BigInteger lhs = this.x.add(this.width);
+        BigInteger rhs = rect.x.add(rect.width);
+        BigInteger right = lhs.max(rhs);
+        lhs = this.y.add(this.height);
+        rhs = rect.y.add(rect.height);
+        BigInteger bottom = lhs.max(rhs);
+        this.x = left;
+        this.y = top;
+        this.width = right.subtract(left);
+        this.height = bottom.subtract(top);
+    }
+
+    /**
+     * Returns <code>true</code> if the point specified by the arguments is
+     * inside the area specified by the receiver, and <code>false</code>
+     * otherwise.
+     *
+     * @param x
+     *            the x coordinate of the point to test for containment
+     * @param y
+     *            the y coordinate of the point to test for containment
+     * @return <code>true</code> if the rectangle contains the point and
+     *         <code>false</code> otherwise
+     *
+     * @throws IllegalArgumentException
+     *             if on of the specified coordinates is <code>null</code>
+     */
+    public boolean contains(BigInteger x, BigInteger y) {
+        if (x == null || y == null)
+            throw new IllegalArgumentException("coordinates can not be null"); //$NON-NLS-1$
+        return (x.compareTo(this.x) >= 0)
+                && (y.compareTo(this.y) >= 0)
+                && (x.compareTo(this.x.add(this.width)) < 0)
+                && (y.compareTo(this.y.add(this.height)) < 0);
+    }
+
+    /**
+     * Returns <code>true</code> if the given pixel coordinate is inside the
+     * area specified by the receiver, and <code>false</code> otherwise.
+     *
+     * @param pt
+     *            the point to test for containment
+     * @return <code>true</code> if the rectangle contains the point and
+     *         <code>false</code> otherwise
+     *
+     * @throws IllegalArgumentException
+     *             if the specified point is <code>null</code>
+     */
+    public boolean contains(PositionCoordinate pt) {
+        if (pt == null)
+            throw new IllegalArgumentException("pixel coordinate can not be null"); //$NON-NLS-1$
+        return contains(pt.x, pt.y);
+    }
+
+    /**
+     * Returns <code>true</code> if the receiver does not cover any area in the
+     * (x, y) coordinate plane, and <code>false</code> if the receiver does
+     * cover some area in the plane.
+     * <p>
+     * A rectangle is considered to <em>cover area</em> in the (x, y) coordinate
+     * plane if both its width and height are non-zero.
+     * </p>
+     *
+     * @return <code>true</code> if the receiver is empty, and
+     *         <code>false</code> otherwise
+     */
+    public boolean isEmpty() {
+        return (this.width.compareTo(BigInteger.ZERO) <= 0)
+                || (this.height.compareTo(BigInteger.ZERO) <= 0);
+    }
+
+    /**
+     * Destructively replaces the x, y, width and height values in the receiver
+     * with ones which represent the intersection of the rectangles specified by
+     * the receiver and the given rectangle.
+     *
+     * @param rect
+     *            the rectangle to intersect with the receiver
+     *
+     * @throws IllegalArgumentException
+     *             if the specified rectangle is <code>null</code>
+     */
+    public void intersect(PositionRectangle rect) {
+        if (rect == null)
+            throw new IllegalArgumentException("rectangle can not be null"); //$NON-NLS-1$
+        if (this == rect)
+            return;
+        BigInteger left = this.x.max(rect.x);
+        BigInteger top = this.y.max(rect.y);
+        BigInteger lhs = this.x.add(this.width);
+        BigInteger rhs = rect.x.add(rect.width);
+        BigInteger right = lhs.min(rhs);
+        lhs = this.y.add(this.height);
+        rhs = rect.y.add(rect.height);
+        BigInteger bottom = lhs.min(rhs);
+        this.x = right.compareTo(left) < 0 ? BigInteger.ZERO : left;
+        this.y = bottom.compareTo(top) < 0 ? BigInteger.ZERO : top;
+        this.width = right.compareTo(left) < 0 ? BigInteger.ZERO : right.subtract(left);
+        this.height = bottom.compareTo(top) < 0 ? BigInteger.ZERO : bottom.subtract(top);
+    }
+
+    /**
+     * Returns a new rectangle which represents the intersection of the receiver
+     * and the given rectangle.
+     * <p>
+     * The intersection of two rectangles is the rectangle that covers the area
+     * which is contained within both rectangles.
+     * </p>
+     *
+     * @param rect
+     *            the rectangle to intersect with the receiver
+     * @return the intersection of the receiver and the argument
+     *
+     * @throws IllegalArgumentException
+     *             if the specified rectangle is <code>null</code>
+     */
+    public PositionRectangle intersection(PositionRectangle rect) {
+        if (rect == null)
+            throw new IllegalArgumentException("rectangle can not be null"); //$NON-NLS-1$
+        if (this == rect)
+            return new PositionRectangle(this.x, this.y, this.width, this.height);
+        BigInteger left = this.x.max(rect.x);
+        BigInteger top = this.y.max(rect.y);
+        BigInteger lhs = this.x.add(this.width);
+        BigInteger rhs = rect.x.add(rect.width);
+        BigInteger right = lhs.min(rhs);
+        lhs = this.y.add(this.height);
+        rhs = rect.y.add(rect.height);
+        BigInteger bottom = lhs.min(rhs);
+        return new PositionRectangle(
+                right.compareTo(left) < 0 ? BigInteger.ZERO : left,
+                        bottom.compareTo(top) < 0 ? BigInteger.ZERO : top,
+                                right.compareTo(left) < 0 ? BigInteger.ZERO : right.subtract(left),
+                                        bottom.compareTo(top) < 0 ? BigInteger.ZERO : bottom.subtract(top));
+    }
+
+    /**
+     * Returns <code>true</code> if the rectangle described by the arguments
+     * intersects with the receiver and <code>false</code> otherwise.
+     * <p>
+     * Two rectangles intersect if the area of the rectangle representing their
+     * intersection is not empty.
+     * </p>
+     *
+     * @param x
+     *            the x coordinate of the origin of the rectangle
+     * @param y
+     *            the y coordinate of the origin of the rectangle
+     * @param width
+     *            the width of the rectangle
+     * @param height
+     *            the height of the rectangle
+     * @return <code>true</code> if the rectangle intersects with the receiver,
+     *         and <code>false</code> otherwise
+     *
+     * @see #intersection(PositionRectangle)
+     * @see #isEmpty()
+     *
+     * @throws IllegalArgumentException
+     *             if on of the specified values is <code>null</code>
+     */
+    public boolean intersects(BigInteger x, BigInteger y, BigInteger width, BigInteger height) {
+        if (x == null || y == null || width == null || height == null)
+            throw new IllegalArgumentException("none of the values can be null"); //$NON-NLS-1$
+        return (x.compareTo(this.x.add(this.width)) < 0) && (y.compareTo(this.y.add(this.height)) < 0) &&
+                (x.add(width).compareTo(this.x) > 0) && (y.add(height).compareTo(this.y) > 0);
+    }
+
+    /**
+     * Returns <code>true</code> if the given rectangle intersects with the
+     * receiver and <code>false</code> otherwise.
+     * <p>
+     * Two rectangles intersect if the area of the rectangle representing their
+     * intersection is not empty.
+     * </p>
+     *
+     * @param rect
+     *            the rectangle to test for intersection
+     * @return <code>true</code> if the rectangle intersects with the receiver,
+     *         and <code>false</code> otherwise
+     *
+     * @throws IllegalArgumentException
+     *             if the specified rectangle is <code>null</code>
+     *
+     * @see #intersection(PositionRectangle)
+     * @see #isEmpty()
+     */
+    public boolean intersects(PositionRectangle rect) {
+        if (rect == null)
+            throw new IllegalArgumentException("rectangle can not be null"); //$NON-NLS-1$
+        return rect == this || intersects(rect.x, rect.y, rect.width, rect.height);
+    }
+
+    /**
+     * Returns a new rectangle which represents the union of the receiver and
+     * the given rectangle.
+     * <p>
+     * The union of two rectangles is the smallest single rectangle that
+     * completely covers both of the areas covered by the two given rectangles.
+     * </p>
+     *
+     * @param rect
+     *            the rectangle to perform union with
+     * @return the union of the receiver and the argument
+     *
+     * @throws IllegalArgumentException
+     *             if the specified rectangle is <code>null</code>
+     *
+     * @see #add(PositionRectangle)
+     */
+    public PositionRectangle union(PositionRectangle rect) {
+        if (rect == null)
+            throw new IllegalArgumentException("rectangle can not be null"); //$NON-NLS-1$
+        BigInteger left = this.x.min(rect.x);
+        BigInteger top = this.y.min(rect.y);
+        BigInteger lhs = this.x.add(this.width);
+        BigInteger rhs = rect.x.add(rect.width);
+        BigInteger right = lhs.max(rhs);
+        lhs = this.y.add(this.height);
+        rhs = rect.y.add(rect.height);
+        BigInteger bottom = lhs.max(rhs);
+        return new PositionRectangle(left, top, right.subtract(left), bottom.subtract(top));
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((this.height == null) ? 0 : this.height.hashCode());
+        result = prime * result + ((this.width == null) ? 0 : this.width.hashCode());
+        result = prime * result + ((this.x == null) ? 0 : this.x.hashCode());
+        result = prime * result + ((this.y == null) ? 0 : this.y.hashCode());
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (obj == null)
+            return false;
+        if (getClass() != obj.getClass())
+            return false;
+        PositionRectangle other = (PositionRectangle) obj;
+        if (this.height == null) {
+            if (other.height != null)
+                return false;
+        } else if (!this.height.equals(other.height))
+            return false;
+        if (this.width == null) {
+            if (other.width != null)
+                return false;
+        } else if (!this.width.equals(other.width))
+            return false;
+        if (this.x == null) {
+            if (other.x != null)
+                return false;
+        } else if (!this.x.equals(other.x))
+            return false;
+        if (this.y == null) {
+            if (other.y != null)
+                return false;
+        } else if (!this.y.equals(other.y))
+            return false;
+        return true;
+    }
+
+    @Override
+    public String toString() {
+        return "PositionRectangle {" + this.x + ", " + this.y + ", " + this.width + ", " + this.height + "}"; //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
+    }
+
+}
diff --git a/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/core/ui/rendering/Color.java b/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/core/ui/rendering/Color.java
new file mode 100644
index 0000000..7ab38a2
--- /dev/null
+++ b/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/core/ui/rendering/Color.java
@@ -0,0 +1,117 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Dirk Fauth, Edwin Park.
+ * 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:
+ *     Dirk Fauth <dirk.fauth@googlemail.com>   - initial API and implementation
+ *     Edwin Park <esp1@cornell.edu>            - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.nebula.widgets.nattable.core.ui.rendering;
+
+/**
+ * UI independent implementation for a rgb based color that transports the
+ * necessary information to create a color instance for a specific UI toolkit.
+ */
+public class Color {
+
+    /**
+     * the red component, in the range {@code 0-255}
+     */
+    public final int red;
+    /**
+     * the green component, in the range {@code 0-255}
+     */
+    public final int green;
+    /**
+     * the blue component, in the range {@code 0-255}
+     */
+    public final int blue;
+    /**
+     * the opacity component, in the range {@code 0.0-1.0}
+     */
+    public final double opacity;
+    /**
+     * The native color object for the UI toolkit in use, that matches this
+     * {@link Color} instance. Used to reduce the amount of UI toolkit color
+     * objects on rendering.
+     */
+    private Object nativeColor;
+
+    /**
+     * Creates a color with the specified RGB values in the range {@code 0-255},
+     * and a opacity of {@code 1.0} (respectively {@code 255}).
+     *
+     * @param red
+     *            the red component, in the range {@code 0-255}
+     * @param green
+     *            the green component, in the range {@code 0-255}
+     * @param blue
+     *            the blue component, in the range {@code 0-255}
+     */
+    public Color(int red, int green, int blue) {
+        this(red, green, blue, 1.0);
+    }
+
+    /**
+     * Creates a color with the specified RGB values in the range {@code 0-255},
+     * and a given opacity in the range {@code 0-255}. The opacity value will be
+     * calculated to a double value in the range {@code 0.0-1.0}.
+     *
+     * @param red
+     *            the red component, in the range {@code 0-255}
+     * @param green
+     *            the green component, in the range {@code 0-255}
+     * @param blue
+     *            the blue component, in the range {@code 0-255}
+     * @param opacity
+     *            the opacity component, in the range {@code 0-255}
+     */
+    public Color(int red, int green, int blue, int opacity) {
+        this(red, green, blue, Double.valueOf(opacity / 255));
+    }
+
+    /**
+     * Creates a color with the specified RGB values in the range {@code 0-255},
+     * and a given opacity in the range {@code 0.0-1.0}.
+     *
+     * @param red
+     *            the red component, in the range {@code 0-255}
+     * @param green
+     *            the green component, in the range {@code 0-255}
+     * @param blue
+     *            the blue component, in the range {@code 0-255}
+     * @param opacity
+     *            the opacity component, in the range {@code 0.0-1.0}
+     */
+    public Color(int red, int green, int blue, double opacity) {
+        this.red = red;
+        this.green = green;
+        this.blue = blue;
+        this.opacity = opacity;
+    }
+
+    /**
+     * @return the native color object for the UI toolkit in use, that matches
+     *         this {@link Color} instance.
+     */
+    public Object getNativeColor() {
+        return this.nativeColor;
+    }
+
+    /**
+     * Set the native color object for the UI toolkit in use, that matches this
+     * {@link Color} instance. Will be called by the {@link GraphicsContext}
+     * implementation the first time the corresponding native color object is
+     * retrieved.
+     *
+     * @param nativeColor
+     *            the native color object for the UI toolkit in use, that
+     *            matches this {@link Color} instance.
+     */
+    public void setNativeColor(Object nativeColor) {
+        this.nativeColor = nativeColor;
+    }
+}
diff --git a/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/core/ui/rendering/Font.java b/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/core/ui/rendering/Font.java
new file mode 100644
index 0000000..26b359a
--- /dev/null
+++ b/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/core/ui/rendering/Font.java
@@ -0,0 +1,174 @@
+/*******************************************************************************
+ * Copyright (c) 2015 Dirk Fauth.
+ * 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:
+ *     Dirk Fauth <dirk.fauth@googlemail.com>   - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.nebula.widgets.nattable.core.ui.rendering;
+
+/**
+ * UI independent implementation for a font that transports the necessary
+ * information to create a font instance for a specific UI toolkit.
+ */
+public class Font {
+
+    /**
+     * Note that not every UI toolkit supports every {@link FontStyle}. For SWT
+     * for example, only NORMAL, BOLD and ITALIC are supported. The others will
+     * be translated to the closest matching ones.
+     */
+    public enum FontStyle {
+        /**
+         * represents the regular font posture
+         */
+        REGULAR,
+        /**
+         * represents the italic font posture
+         */
+        ITALIC,
+        /**
+         * represents the black font weight
+         */
+        BLACK,
+        /**
+         * represents the bold font weight
+         */
+        BOLD,
+        /**
+         * represents the extra bold font weight
+         */
+        EXTRA_BOLD,
+        /**
+         * represents the extra light font weight
+         */
+        EXTRA_LIGHT,
+        /**
+         * represents the light font weight
+         */
+        LIGHT,
+        /**
+         * represents the medium font weight
+         */
+        MEDIUM,
+        /**
+         * represents the normal font weight
+         */
+        NORMAL,
+        /**
+         * represents the semi bold font weight
+         */
+        SEMI_BOLD,
+        /**
+         * represents the thin font weight
+         */
+        THIN
+    }
+
+    /**
+     * the name of the font family
+     */
+    public final String name;
+    /**
+     * the font height
+     */
+    public final double height;
+    /**
+     * the font styles
+     */
+    public final FontStyle[] style;
+    /**
+     * The native font object for the UI toolkit in use, that matches this
+     * {@link Font} instance. Used to reduce the amount of UI toolkit font
+     * objects on rendering.
+     */
+    private Object nativeFont;
+
+    /**
+     * Create a {@link Font} instance that will use the default font of the UI
+     * toolkit (typically the system default font).
+     */
+    public Font() {
+        this(null, -1, null);
+    }
+
+    /**
+     * Create a {@link Font} instance that will search for a font with the given
+     * font family name and the default font size (typically the system default
+     * font size).
+     *
+     * @param name
+     *            the name of the font family
+     */
+    public Font(String name) {
+        this(name, -1, null);
+    }
+
+    /**
+     * Create a {@link Font} instance that will use the default font of the UI
+     * toolkit (typically the system default font) and the given font height.
+     *
+     * @param height
+     *            the font height
+     */
+    public Font(double height) {
+        this(null, height, null);
+    }
+
+    /**
+     * Create a {@link Font} instance that will search for a font with the given
+     * font family name and the given font size.
+     *
+     * @param name
+     *            the name of the font family
+     * @param height
+     *            the font height
+     */
+    public Font(String name, double height) {
+        this(name, height, null);
+    }
+
+    /**
+     * Create a {@link Font} instance that will search for a font with the given
+     * font family name, the given font size and the font styles for font weight
+     * and font posture.
+     *
+     * @param name
+     *            the name of the font family
+     * @param height
+     *            the font height
+     * @param style
+     *            array of {@link FontStyle} values for font weight and font
+     *            posture.
+     */
+    public Font(String name, double height, FontStyle[] style) {
+        this.name = name;
+        this.height = height;
+        this.style = style;
+    }
+
+    /**
+     * @return the native font object for the UI toolkit in use, that matches
+     *         this {@link Font} instance.
+     */
+    public Object getNativeFont() {
+        return this.nativeFont;
+    }
+
+    /**
+     * Set the native font object for the UI toolkit in use, that matches this
+     * {@link Font} instance. Will be called by the {@link GraphicsContext}
+     * implementation the first time the corresponding native font object is
+     * retrieved.
+     *
+     * @param nativeFont
+     *            the native font object for the UI toolkit in use, that matches
+     *            this {@link Font} instance.
+     */
+    public void setNativeFont(Object nativeFont) {
+        this.nativeFont = nativeFont;
+    }
+}
diff --git a/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/core/ui/rendering/GraphicsContext.java b/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/core/ui/rendering/GraphicsContext.java
new file mode 100644
index 0000000..34a3167
--- /dev/null
+++ b/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/core/ui/rendering/GraphicsContext.java
@@ -0,0 +1,265 @@
+/*******************************************************************************
+ * Copyright (c) 2014 Dirk Fauth, Edwin Park.
+ * 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:
+ *     Dirk Fauth <dirk.fauth@googlemail.com>   - initial API and implementation
+ *     Edwin Park <esp1@cornell.edu>            - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.nebula.widgets.nattable.core.ui.rendering;
+
+import org.eclipse.nebula.widgets.nattable.core.geometry.PixelRectangle;
+import org.eclipse.nebula.widgets.nattable.style.IStyle;
+
+/**
+ * Interface for implementing a proxy to a UI toolkit dependent graphics context
+ * implementation. The graphics context is at the end the on who paints lines
+ * shapes etc. to the canvas to create the NatTable.
+ *
+ * e.g. org.eclipse.swt.graphics.GC
+ *
+ */
+public interface GraphicsContext {
+
+    /**
+     * Takes the styling attributes of an {@link IStyle} and applies them to the
+     * UI toolkit graphics context.
+     * <p>
+     * It is a good practice to store the current state of the graphics context
+     * prior to calling this method. Use {@link GraphicsContext#pushState()} for
+     * this.
+     * </p>
+     * <p>
+     * After the drawing operations are done it is also good practice to reset
+     * the applied settings using {@link GraphicsContext#popState()}.
+     * </p>
+     *
+     * @param style
+     *            {@link IStyle} instance containing the style information that
+     *            should be used in the following painting operations.
+     */
+    void initStyle(IStyle style);
+
+    /**
+     * Draws the specified text at the position specified by x and y
+     * coordinates. Ensure that drawing the text doesn't draw a background and
+     * line delimiters are handled correctly.
+     *
+     * @param text
+     *            The text to draw.
+     * @param x
+     *            the x coordinate of the top left corner of the rectangular
+     *            area where the text is to be drawn
+     * @param y
+     *            the y coordinate of the top left corner of the rectangular
+     *            area where the text is to be drawn
+     */
+    void drawText(String text, double x, double y);
+
+    /**
+     * Draws a line, using the foreground color, between the points (
+     * <code>x1</code>, <code>y1</code>) and (<code>x2</code>, <code>y2</code>).
+     *
+     * @param x1
+     *            the first point's x coordinate
+     * @param y1
+     *            the first point's y coordinate
+     * @param x2
+     *            the second point's x coordinate
+     * @param y2
+     *            the second point's y coordinate
+     */
+    void drawLine(double x1, double y1, double x2, double y2);
+
+    /**
+     * Draws a rectangle with the specified bounds using the foreground color.
+     *
+     * @param rect
+     *            The rectangle's pixel bounds.
+     */
+    void drawRectangle(PixelRectangle rect);
+
+    /**
+     * Fills the specified rectangular pixel area with the background color.
+     *
+     * @param rect
+     *            The rectangle's pixel bounds.
+     */
+    void fillRectangle(PixelRectangle rect);
+
+    /**
+     * Returns the calculated pixel width of the given string if drawn in the
+     * current font in the receiver. Tab expansion and carriage return
+     * processing are performed.
+     * <p>
+     *
+     * @param text
+     *            the text to measure
+     * @return the width in pixels
+     */
+    double calculateTextWidth(String text);
+
+    /**
+     * Returns the height of the font currently being used by the receiver,
+     * measured in pixels. A font's height is the sum of its ascent, descent and
+     * leading area.
+     *
+     * @return The height of the font currently being used.
+     */
+    double getFontHeight();
+
+    // State
+
+    /**
+     * Saves the current graphics context property state and pushes it onto a
+     * stack.
+     */
+    void pushState();
+
+    /**
+     * Pops the last saved graphics context state and restores all properties
+     * back to what they were when that state was saved.
+     */
+    void popState();
+
+    /**
+     * Returns the bounding rectangle of the receiver's clipping region. If no
+     * clipping region is set, the return value will be a rectangle which covers
+     * the entire bounds of the object the receiver is drawing on.
+     *
+     * @return The bounding rectangle of the clipping region.
+     */
+    PixelRectangle getClipping();
+
+    /**
+     * Sets the area of the receiver which can be changed by drawing operations
+     * to the rectangular area specified by the argument. Specifying null for
+     * the rectangle reverts the receiver's clipping area to its original value.
+     *
+     * @param clipBounds
+     *            The clipping rectangle or <code>null</code>.
+     */
+    void setClipping(PixelRectangle clipBounds);
+
+    /**
+     * Set the foreground color.
+     *
+     * @param foregroundColor
+     *            The new foreground color to use.
+     */
+    void setForeground(Color foregroundColor);
+
+    /**
+     * Set the background color.
+     *
+     * @param backgroundColor
+     *            The new background color to use.
+     */
+    void setBackground(Color backgroundColor);
+
+    /**
+     * Transforms the given NatTable {@link Color} to the UI toolkit dependent
+     * color implementation instance. Used internally to operate with UI toolkit
+     * dependent color instances.
+     * <p>
+     * For optimization, this method should also set the UI toolkit dependent
+     * color instance as native value to the {@link Color} instance. This way
+     * resource allocation and the number of created objects is reduced.
+     * </p>
+     * <p>
+     * Note: On overriding you can return the specific color implementation of
+     * the UI toolkit to avoid later casting operations.
+     * </p>
+     *
+     * @param color
+     *            The NatTable {@link Color} that transports the necessary
+     *            information to build up a UI dependent color object.
+     * @return A UI toolkit color instance.
+     */
+    Object getUiColor(Color color);
+
+    // TODO
+    // void setLineStyle(int style);
+    //
+    // void setLineDash(int dash);
+    //
+    // void setLineWidth(int width);
+    //
+    // void setAntialias(int antialias);
+    //
+    // void setTextAntialias(int antialias);
+
+    /**
+     * Set the font.
+     *
+     * @param font
+     *            The new font to use.
+     */
+    void setFont(Font font);
+
+    /**
+     * Transforms the given NatTable {@link Font} to the UI toolkit dependent
+     * font implementation instance. Used internally to operate with UI toolkit
+     * dependent font instances.
+     * <p>
+     * For optimization, this method should also set the UI toolkit dependent
+     * font instance as native value to the {@link Font} instance. This way
+     * resource allocation and the number of created objects is reduced.
+     * </p>
+     * <p>
+     * Note: On overriding you can return the specific font implementation of
+     * the UI toolkit to avoid later casting operations.
+     * </p>
+     *
+     * @param font
+     *            The NatTable {@link Font} that transports the necessary
+     *            information to build up a UI dependent font object.
+     * @return A UI toolkit font instance.
+     */
+    Object getUiFont(Font font);
+
+    /**
+     * Draws the given image at the specified coordinates.
+     *
+     * @param image
+     *            the image to draw
+     * @param x
+     *            the x coordinate of where to draw
+     * @param y
+     *            the y coordinate of where to draw
+     */
+    void drawImage(Image image, double x, double y);
+
+    /**
+     * Transforms the given NatTable {@link Image} to the UI toolkit dependent
+     * image implementation instance. Used internally to operate with UI toolkit
+     * dependent image instances.
+     * <p>
+     * For optimization, this method should also set the UI toolkit dependent
+     * image instance as native value to the {@link Image} instance. This way
+     * resource allocation and the number of created objects is reduced.
+     * </p>
+     * <p>
+     * Note: On overriding you can return the specific image implementation of
+     * the UI toolkit to avoid later casting operations.
+     * </p>
+     *
+     * @param image
+     *            The NatTable {@link Image} that transports the necessary
+     *            information to build up a UI dependent image object.
+     * @return A UI toolkit image instance.
+     */
+    Object getUiImage(Image image);
+
+    /**
+     * Sets the current transform.
+     *
+     * @param transform
+     *            The transformation that should be applied or <code>null</code>
+     *            to reset an applied transformation.
+     */
+    void setTransform(Transform transform);
+}
diff --git a/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/core/ui/rendering/Image.java b/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/core/ui/rendering/Image.java
new file mode 100644
index 0000000..5b4f503
--- /dev/null
+++ b/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/core/ui/rendering/Image.java
@@ -0,0 +1,88 @@
+/*******************************************************************************
+ * Copyright (c) 2015 Dirk Fauth.
+ * 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:
+ *     Dirk Fauth <dirk.fauth@googlemail.com>   - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.nebula.widgets.nattable.core.ui.rendering;
+
+import java.net.URL;
+
+import org.eclipse.nebula.widgets.nattable.util.GUIHelper;
+
+/**
+ * UI independent implementation for an image that should be rendered in a
+ * NatTable. It simply transports the {@link URL} that points to the image. The
+ * {@link GraphicsContext} implementation for a specific UI toolkit is
+ * responsible to load the corresponding image object.
+ * <p>
+ * For optimization purposes regarding object creation and resource allocation,
+ * the {@link GraphicsContext} will set the UI toolkit native image
+ * representation to the {@link Image}. This way images only need to be loaded
+ * once.
+ * </p>
+ */
+public class Image {
+
+    /**
+     * the {@link URL} that points to the image file
+     */
+    public final URL url;
+    /**
+     * The native image object for the UI toolkit in use, that matches this
+     * {@link Image} instance. Used to reduce the amount of UI toolkit image
+     * objects and corresponding resource allocation on rendering.
+     */
+    private Object nativeImage;
+
+    // TODO boolean flag need upscaling
+
+    // TODO on init check for scaling
+
+    /**
+     * Create an {@link Image} that points to a NatTable internal image.
+     *
+     * @param name
+     *            the name of the NatTable internal image
+     */
+    public Image(String name) {
+        this(GUIHelper.getInternalImageUrl(name));
+    }
+
+    /**
+     * Create an {@link Image} that points to an image located at the specified
+     * {@link URL}.
+     *
+     * @param url
+     *            the {@link URL} that points to the image file
+     */
+    public Image(URL url) {
+        this.url = url;
+    }
+
+    /**
+     * @return the native image object for the UI toolkit in use, that matches
+     *         this {@link Image} instance.
+     */
+    public Object getNativeImage() {
+        return this.nativeImage;
+    }
+
+    /**
+     * Set the native image object for the UI toolkit in use, that matches this
+     * {@link Image} instance. Will be called by the {@link GraphicsContext}
+     * implementation the first time the corresponding native image object is
+     * retrieved.
+     *
+     * @param nativeImage
+     *            the native image object for the UI toolkit in use, that
+     *            matches this {@link Image} instance.
+     */
+    public void setNativeImage(Object nativeImage) {
+        this.nativeImage = nativeImage;
+    }
+}
diff --git a/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/core/ui/rendering/Transform.java b/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/core/ui/rendering/Transform.java
new file mode 100644
index 0000000..6aead8c
--- /dev/null
+++ b/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/core/ui/rendering/Transform.java
@@ -0,0 +1,119 @@
+package org.eclipse.nebula.widgets.nattable.core.ui.rendering;
+
+/**
+ * Wrapper class to transport transformation informations that can be used to
+ * create a UI toolkit dependent transformation.
+ */
+public class Transform {
+
+    private Float angle;
+
+    private Float scaleX;
+    private Float scaleY;
+
+    private Float offsetX;
+    private Float offsetY;
+
+    /**
+     * Modifies the receiver so that it represents a transformation that is
+     * equivalent to its previous transformation rotated by the specified angle.
+     * The angle is specified in degrees and for the identity transform 0
+     * degrees is at the 3 o'clock position. A positive value indicates a
+     * clockwise rotation while a negative value indicates a counter-clockwise
+     * rotation.
+     *
+     * @param angle
+     *            the angle to rotate the transformation by
+     */
+    public void rotate(float angle) {
+        this.angle = angle;
+    }
+
+    /**
+     * Modifies the receiver so that it represents a transformation that is
+     * equivalent to its previous transformation scaled by (scaleX, scaleY).
+     *
+     * @param scaleX
+     *            the amount to scale in the X direction
+     * @param scaleY
+     *            the amount to scale in the Y direction
+     */
+    public void scale(float scaleX, float scaleY) {
+        this.scaleX = scaleX;
+        this.scaleY = scaleY;
+    }
+
+    /**
+     * Modifies the receiver so that it represents a transformation that is
+     * equivalent to its previous transformation translated by (offsetX,
+     * offsetY).
+     *
+     * @param offsetX
+     *            the distance to translate in the X direction
+     * @param offsetY
+     *            the distance to translate in the Y direction
+     */
+    public void translate(float offsetX, float offsetY) {
+        this.offsetX = offsetX;
+        this.offsetY = offsetY;
+    }
+
+    /**
+     * @return <code>true</code> if this transformation is configured for
+     *         rotation
+     */
+    public boolean hasRotation() {
+        return this.angle != null;
+    }
+
+    /**
+     * @return <code>true</code> if this transformation is configured for
+     *         scaling
+     */
+    public boolean hasScaling() {
+        return this.scaleX != null && this.scaleY != null;
+    }
+
+    /**
+     * @return <code>true</code> if this transformation is configured for
+     *         translation
+     */
+    public boolean hasTranslation() {
+        return this.offsetX != null && this.offsetY != null;
+    }
+
+    /**
+     * @return the angle to rotate the transformation by
+     */
+    public float getAngle() {
+        return this.angle;
+    }
+
+    /**
+     * @return the amount to scale in the X direction
+     */
+    public float getScaleX() {
+        return this.scaleX;
+    }
+
+    /**
+     * @return the amount to scale in the Y direction
+     */
+    public float getScaleY() {
+        return this.scaleY;
+    }
+
+    /**
+     * @return the distance to translate in the X direction
+     */
+    public float getOffsetX() {
+        return this.offsetX;
+    }
+
+    /**
+     * @return the distance to translate in the Y direction
+     */
+    public float getOffsetY() {
+        return this.offsetY;
+    }
+}
diff --git a/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/util/GUIHelper.java b/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/util/GUIHelper.java
index 05afe07..9ecda9b 100644
--- a/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/util/GUIHelper.java
+++ b/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/util/GUIHelper.java
@@ -210,6 +210,33 @@
         return image;
     }
 
+    public static URL getScaledImageURL(URL url) {
+        if (needScaling()) {
+            // modify url to contain scaling information in filename
+            // create the matching URL for the scaled image
+            String urlString = url.toString();
+            int extIndex = urlString.lastIndexOf('.');
+            String ext = urlString.substring(extIndex, urlString.length());
+            String base = urlString.substring(0, extIndex);
+
+            // check if there is a upscaled image available
+            try {
+                URL scaleURL = new URL(base + getScalingImageSuffix() + ext);
+                URLConnection con = scaleURL.openConnection();
+                con.connect();
+                // as the connection could be established, the file exists
+                // this check is working in plain SWT aswell as in the OSGi
+                // context
+                return scaleURL;
+            } catch (IOException e) {
+                // do nothing, there is no upscaled image available, so we
+                // simply use the given URL
+            }
+        }
+        // scaling is not necessary, so just return the given URL
+        return url;
+    }
+
     /**
      * Returns the {@link Image} representation of a NatTable internal image
      * resource.
@@ -281,9 +308,10 @@
      *         there is no image found for the given name at the internal image
      *         resource location.
      */
-    private static URL getInternalImageUrl(String imageName) {
+    public static URL getInternalImageUrl(String imageName) {
         for (String dir : IMAGE_DIRS) {
             for (String ext : IMAGE_EXTENSIONS) {
+                // TODO remove direct scaling information addition
                 // add search for scaled image
                 // e.g. imageName = checkbox -->
                 // org/eclipse/nebula/widgets/nattable/images/checkbox_128_128.png
diff --git a/org.eclipse.nebula.widgets.nattable.extension.glazedlists.test/META-INF/MANIFEST.MF b/org.eclipse.nebula.widgets.nattable.extension.glazedlists.test/META-INF/MANIFEST.MF
index 0f27f1c..06631f2 100644
--- a/org.eclipse.nebula.widgets.nattable.extension.glazedlists.test/META-INF/MANIFEST.MF
+++ b/org.eclipse.nebula.widgets.nattable.extension.glazedlists.test/META-INF/MANIFEST.MF
@@ -5,7 +5,7 @@
 Bundle-Version: 1.2.0.qualifier
 Fragment-Host: org.eclipse.nebula.widgets.nattable.extension.glazedlists
 Bundle-RequiredExecutionEnvironment: JavaSE-1.6
-Require-Bundle: org.junit4
+Require-Bundle: org.junit;bundle-version="4.11.0"
 Import-Package: org.eclipse.jface.viewers,
  org.eclipse.nebula.widgets.nattable.extension.glazedlists.filterrow,
  org.eclipse.nebula.widgets.nattable.filterrow.command,
diff --git a/org.eclipse.nebula.widgets.nattable.ui.javafx/.classpath b/org.eclipse.nebula.widgets.nattable.ui.javafx/.classpath
new file mode 100644
index 0000000..eca7bdb
--- /dev/null
+++ b/org.eclipse.nebula.widgets.nattable.ui.javafx/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.nebula.widgets.nattable.ui.javafx/.project b/org.eclipse.nebula.widgets.nattable.ui.javafx/.project
new file mode 100644
index 0000000..30f5a2e
--- /dev/null
+++ b/org.eclipse.nebula.widgets.nattable.ui.javafx/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.nebula.widgets.nattable.ui.javafx</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/org.eclipse.nebula.widgets.nattable.ui.javafx/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.nebula.widgets.nattable.ui.javafx/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..73d1d24
--- /dev/null
+++ b/org.eclipse.nebula.widgets.nattable.ui.javafx/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,291 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.8
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=0
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=1
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=0
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=0
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=64
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=0
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
+org.eclipse.jdt.core.formatter.comment.format_block_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=true
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=80
+org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true
+org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true
+org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off
+org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=true
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=false
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=240
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=space
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_on_off_tags=false
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
+org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
diff --git a/org.eclipse.nebula.widgets.nattable.ui.javafx/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.nebula.widgets.nattable.ui.javafx/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..04015e6
--- /dev/null
+++ b/org.eclipse.nebula.widgets.nattable.ui.javafx/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,62 @@
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_NatTable
+formatter_settings_version=12
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_missing_override_annotations_interface_methods=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=true
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_functional_interfaces=false
+sp_cleanup.convert_to_enhanced_for_loop=false
+sp_cleanup.correct_indentation=true
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.insert_inferred_type_arguments=false
+sp_cleanup.make_local_variable_final=true
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_type_abstract_if_missing_method=false
+sp_cleanup.make_variable_declarations_final=false
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_redundant_type_arguments=false
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=true
+sp_cleanup.remove_unused_imports=false
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_anonymous_class_creation=false
+sp_cleanup.use_blocks=false
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_lambda=true
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=true
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=false
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
+sp_cleanup.use_type_arguments=false
diff --git a/org.eclipse.nebula.widgets.nattable.ui.javafx/.settings/org.eclipse.pde.core.prefs b/org.eclipse.nebula.widgets.nattable.ui.javafx/.settings/org.eclipse.pde.core.prefs
new file mode 100644
index 0000000..f29e940
--- /dev/null
+++ b/org.eclipse.nebula.widgets.nattable.ui.javafx/.settings/org.eclipse.pde.core.prefs
@@ -0,0 +1,3 @@
+eclipse.preferences.version=1
+pluginProject.extensions=false
+resolve.requirebundle=false
diff --git a/org.eclipse.nebula.widgets.nattable.ui.javafx/META-INF/MANIFEST.MF b/org.eclipse.nebula.widgets.nattable.ui.javafx/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..8df5b03
--- /dev/null
+++ b/org.eclipse.nebula.widgets.nattable.ui.javafx/META-INF/MANIFEST.MF
@@ -0,0 +1,47 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: NatTable JavaFX UI
+Bundle-SymbolicName: org.eclipse.nebula.widgets.nattable.ui.javafx
+Bundle-Version: 2.0.0.qualifier
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Eclipse-ExtensibleAPI: true
+Bundle-Vendor: Eclipse Nebula NatTable
+Import-Package: com.sun.javafx.tk;version="2.2.0",
+ javafx.animation;version="2.2.0",
+ javafx.application;version="2.2.0",
+ javafx.beans;version="2.2.0",
+ javafx.beans.binding;version="2.2.0",
+ javafx.beans.property;version="2.2.0",
+ javafx.beans.property.adapter;version="2.2.0",
+ javafx.beans.value;version="2.2.0",
+ javafx.collections;version="2.2.0",
+ javafx.collections.transformation;version="8.0.0",
+ javafx.concurrent;version="2.2.0",
+ javafx.css;version="8.0.0",
+ javafx.embed.swing;version="2.2.0",
+ javafx.embed.swt;version="2.2.0",
+ javafx.event;version="2.2.0",
+ javafx.fxml;version="2.2.0",
+ javafx.geometry;version="2.2.0",
+ javafx.print;version="8.0.0",
+ javafx.scene;version="2.2.0",
+ javafx.scene.canvas;version="2.2.0",
+ javafx.scene.chart;version="2.2.0",
+ javafx.scene.control;version="2.2.0",
+ javafx.scene.control.cell;version="2.2.0",
+ javafx.scene.effect;version="2.2.0",
+ javafx.scene.image;version="2.2.0",
+ javafx.scene.input;version="2.2.0",
+ javafx.scene.layout;version="2.2.0",
+ javafx.scene.media;version="2.2.0",
+ javafx.scene.paint;version="2.2.0",
+ javafx.scene.shape;version="2.2.0",
+ javafx.scene.text;version="2.2.0",
+ javafx.scene.transform;version="2.2.0",
+ javafx.scene.web;version="2.2.0",
+ javafx.stage;version="2.2.0",
+ javafx.util;version="2.2.0",
+ javafx.util.converter;version="2.2.0",
+ org.eclipse.nebula.widgets.nattable.core.geometry;version="2.0.0",
+ org.eclipse.nebula.widgets.nattable.core.ui.rendering;version="2.0.0",
+ org.eclipse.nebula.widgets.nattable.style;version="2.0.0"
diff --git a/org.eclipse.nebula.widgets.nattable.ui.javafx/build.properties b/org.eclipse.nebula.widgets.nattable.ui.javafx/build.properties
new file mode 100644
index 0000000..34d2e4d
--- /dev/null
+++ b/org.eclipse.nebula.widgets.nattable.ui.javafx/build.properties
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .
diff --git a/org.eclipse.nebula.widgets.nattable.ui.javafx/src/org/eclipse/nebula/widgets/nattable/ui/javafx/FXGraphicsContext.java b/org.eclipse.nebula.widgets.nattable.ui.javafx/src/org/eclipse/nebula/widgets/nattable/ui/javafx/FXGraphicsContext.java
new file mode 100644
index 0000000..d2013a9
--- /dev/null
+++ b/org.eclipse.nebula.widgets.nattable.ui.javafx/src/org/eclipse/nebula/widgets/nattable/ui/javafx/FXGraphicsContext.java
@@ -0,0 +1,332 @@
+/*******************************************************************************
+ * Copyright (c) 2014 Dirk Fauth, Edwin Park.
+ * 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:
+ *     Dirk Fauth <dirk.fauth@googlemail.com>   - initial API and implementation
+ *     Edwin Park <esp1@cornell.edu>            - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.nebula.widgets.nattable.ui.javafx;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+import javafx.geometry.Bounds;
+import javafx.geometry.VPos;
+import javafx.scene.effect.BlendMode;
+import javafx.scene.paint.Paint;
+import javafx.scene.shape.FillRule;
+import javafx.scene.shape.StrokeLineCap;
+import javafx.scene.shape.StrokeLineJoin;
+import javafx.scene.text.FontPosture;
+import javafx.scene.text.FontWeight;
+import javafx.scene.text.TextAlignment;
+import javafx.scene.transform.Affine;
+
+import org.eclipse.nebula.widgets.nattable.core.geometry.PixelRectangle;
+import org.eclipse.nebula.widgets.nattable.core.ui.rendering.Color;
+import org.eclipse.nebula.widgets.nattable.core.ui.rendering.Font;
+import org.eclipse.nebula.widgets.nattable.core.ui.rendering.Font.FontStyle;
+import org.eclipse.nebula.widgets.nattable.core.ui.rendering.GraphicsContext;
+import org.eclipse.nebula.widgets.nattable.core.ui.rendering.Image;
+import org.eclipse.nebula.widgets.nattable.core.ui.rendering.Transform;
+import org.eclipse.nebula.widgets.nattable.style.IStyle;
+
+import com.sun.javafx.tk.FontMetrics;
+import com.sun.javafx.tk.Toolkit;
+
+@SuppressWarnings("restriction")
+public class FXGraphicsContext implements GraphicsContext {
+
+    /**
+     * The JavaFX {@link javafx.scene.canvas.GraphicsContext} which is proxied
+     * by this implementation.
+     */
+    private javafx.scene.canvas.GraphicsContext gc;
+
+    private boolean activeClipping;
+
+    /**
+     *
+     * @param gc
+     *            The JavaFX {@link javafx.scene.canvas.GraphicsContext} that
+     *            should be proxied by this implementation.
+     */
+    public FXGraphicsContext(javafx.scene.canvas.GraphicsContext gc) {
+        this.gc = gc;
+    }
+
+    @Override
+    public void initStyle(IStyle style) {
+        // TODO Auto-generated method stub
+
+    }
+
+    @Override
+    public void drawText(String text, double x, double y) {
+        this.gc.strokeText(text, x, y);
+    }
+
+    @Override
+    public void drawLine(double x1, double y1, double x2, double y2) {
+        this.gc.strokeLine(x1, y1, x2, y2);
+    }
+
+    @Override
+    public void drawRectangle(PixelRectangle rect) {
+        this.gc.strokeRect(rect.x, rect.y, rect.width, rect.height);
+    }
+
+    @Override
+    public void fillRectangle(PixelRectangle rect) {
+        this.gc.fillRect(rect.x, rect.y, rect.width, rect.height);
+    }
+
+    @Override
+    public double calculateTextWidth(String text) {
+        // as there is no other way to get font metrics we need to use internal
+        // API here
+        FontMetrics metrics = Toolkit.getToolkit().getFontLoader().getFontMetrics(this.gc.getFont());
+        return metrics.computeStringWidth(text);
+    }
+
+    @Override
+    public double getFontHeight() {
+        // as there is no other way to get font metrics we need to use internal
+        // API here
+        FontMetrics metrics = Toolkit.getToolkit().getFontLoader().getFontMetrics(this.gc.getFont());
+        return metrics.getLineHeight();
+    }
+
+    @Override
+    public void pushState() {
+        this.gc.save();
+    }
+
+    @Override
+    public void popState() {
+        this.gc.restore();
+    }
+
+    @Override
+    public PixelRectangle getClipping() {
+        return getPixelRectangle(this.gc.getCanvas().getBoundsInLocal());
+    }
+
+    @Override
+    public void setClipping(PixelRectangle clipBounds) {
+        resetClip();
+
+        if (clipBounds != null) {
+            this.activeClipping = true;
+
+            this.gc.save();
+            this.gc.beginPath();
+
+            // if this isn't working well, we need to check the following link
+            // again
+            // http://git.eclipse.org/c/efxclipse/org.eclipse.efxclipse.git/tree/experimental/swt/org.eclipse.fx.runtime.swt/src/org/eclipse/swt/internal/CanvasGC.java
+            this.gc.rect(clipBounds.x, clipBounds.y, clipBounds.width, clipBounds.height);
+
+            this.gc.clip();
+            this.gc.closePath();
+        }
+    }
+
+    private void resetClip() {
+        if (this.activeClipping) {
+            // Read state of other values
+            double globalAlpha = this.gc.getGlobalAlpha();
+            BlendMode blendop = this.gc.getGlobalBlendMode();
+            Affine transform = this.gc.getTransform();
+            Paint fill = this.gc.getFill();
+            Paint stroke = this.gc.getStroke();
+            double linewidth = this.gc.getLineWidth();
+            StrokeLineCap linecap = this.gc.getLineCap();
+            StrokeLineJoin linejoin = this.gc.getLineJoin();
+            double miterlimit = this.gc.getMiterLimit();
+            javafx.scene.text.Font font = this.gc.getFont();
+            TextAlignment textalign = this.gc.getTextAlign();
+            VPos textbaseline = this.gc.getTextBaseline();
+            FillRule fillRule = this.gc.getFillRule();
+
+            // pop the last state from the stack because the clipping is a
+            // common rendering attribute
+            this.gc.restore();
+
+            this.gc.setGlobalAlpha(globalAlpha);
+            this.gc.setGlobalBlendMode(blendop);
+            this.gc.setTransform(transform);
+            this.gc.setFill(fill);
+            this.gc.setStroke(stroke);
+            this.gc.setLineWidth(linewidth);
+            this.gc.setLineCap(linecap);
+            this.gc.setLineJoin(linejoin);
+            this.gc.setMiterLimit(miterlimit);
+            this.gc.setFont(font);
+            this.gc.setTextAlign(textalign);
+            this.gc.setTextBaseline(textbaseline);
+            this.gc.setFillRule(fillRule);
+
+            this.activeClipping = false;
+        }
+    }
+
+    private PixelRectangle getPixelRectangle(Bounds rectangle) {
+        return new PixelRectangle(rectangle.getMinX(), rectangle.getMinY(), rectangle.getWidth(), rectangle.getHeight());
+    }
+
+    @Override
+    public void setForeground(Color foregroundColor) {
+        this.gc.setStroke(getUiColor(foregroundColor));
+    }
+
+    @Override
+    public void setBackground(Color backgroundColor) {
+        this.gc.setFill(getUiColor(backgroundColor));
+    }
+
+    @Override
+    public javafx.scene.paint.Color getUiColor(Color color) {
+        if (color.getNativeColor() == null) {
+            color.setNativeColor(javafx.scene.paint.Color.rgb(color.red, color.green, color.blue, color.opacity));
+        }
+        if (!(color.getNativeColor() instanceof javafx.scene.paint.Color)) {
+            throw new IllegalStateException("native color instance in color wrapper is invalid");
+        }
+        return (javafx.scene.paint.Color) color.getNativeColor();
+    }
+
+    @Override
+    public void setFont(Font font) {
+        this.gc.setFont(getUiFont(font));
+    }
+
+    @Override
+    public javafx.scene.text.Font getUiFont(Font font) {
+        if (font.getNativeFont() == null) {
+            // if all attributes are not set, use the default font
+            if (font.name == null && font.height == -1 && font.style == null) {
+                font.setNativeFont(javafx.scene.text.Font.getDefault());
+            }
+            else {
+                if (font.name != null && font.height == -1 && font.style == null) {
+                    font.setNativeFont(javafx.scene.text.Font.font(font.name));
+                }
+                else if (font.name == null && font.height >= 0 && font.style == null) {
+                    font.setNativeFont(javafx.scene.text.Font.font(font.height));
+                }
+                else if (font.name != null && font.height >= 0 && font.style == null) {
+                    font.setNativeFont(javafx.scene.text.Font.font(font.name, font.height));
+                }
+                else if (font.style != null) {
+                    javafx.scene.text.Font defaultFont = javafx.scene.text.Font.getDefault();
+                    String fontName = (font.name == null) ? defaultFont.getName() : font.name;
+                    double height = (font.height == -1) ? defaultFont.getSize() : font.height;
+
+                    FontPosture posture = null;
+                    FontWeight weight = null;
+                    for (FontStyle style : font.style) {
+                        switch (style) {
+                            case ITALIC:
+                                posture = FontPosture.ITALIC;
+                                break;
+                            case REGULAR:
+                                posture = FontPosture.REGULAR;
+                                break;
+                            case BLACK:
+                                weight = FontWeight.BLACK;
+                                break;
+                            case BOLD:
+                                weight = FontWeight.BOLD;
+                                break;
+                            case EXTRA_BOLD:
+                                weight = FontWeight.EXTRA_BOLD;
+                                break;
+                            case EXTRA_LIGHT:
+                                weight = FontWeight.EXTRA_LIGHT;
+                                break;
+                            case LIGHT:
+                                weight = FontWeight.LIGHT;
+                                break;
+                            case MEDIUM:
+                                weight = FontWeight.MEDIUM;
+                                break;
+                            case NORMAL:
+                                weight = FontWeight.NORMAL;
+                                break;
+                            case SEMI_BOLD:
+                                weight = FontWeight.SEMI_BOLD;
+                                break;
+                            case THIN:
+                                weight = FontWeight.THIN;
+                                break;
+                        }
+                    }
+
+                    if (posture != null && weight != null) {
+                        font.setNativeFont(javafx.scene.text.Font.font(fontName, weight, posture, height));
+                    }
+                    else if (posture != null && weight == null) {
+                        font.setNativeFont(javafx.scene.text.Font.font(fontName, posture, height));
+                    }
+                    else if (posture == null && weight != null) {
+                        font.setNativeFont(javafx.scene.text.Font.font(fontName, weight, height));
+                    }
+                }
+            }
+        }
+        if (!(font.getNativeFont() instanceof javafx.scene.text.Font)) {
+            throw new IllegalStateException("native font instance in font wrapper is invalid");
+        }
+        return (javafx.scene.text.Font) font.getNativeFont();
+    }
+
+    @Override
+    public void drawImage(Image image, double x, double y) {
+        this.gc.drawImage(getUiImage(image), x, y);
+    }
+
+    @Override
+    public javafx.scene.image.Image getUiImage(Image image) {
+        if (image.getNativeImage() == null) {
+            // TODO check scaling
+            try (InputStream in = image.url.openStream()) {
+                image.setNativeImage(new javafx.scene.image.Image(in));
+            } catch (IOException e) {
+                // TODO logging
+            }
+        }
+        if (!(image.getNativeImage() instanceof javafx.scene.image.Image)) {
+            throw new IllegalStateException("native image instance in image wrapper is invalid");
+        }
+        return (javafx.scene.image.Image) image.getNativeImage();
+    }
+
+    @Override
+    public void setTransform(Transform transform) {
+        if (transform == null) {
+            // TODO reset transformation - need to be tested
+            this.gc.rotate(0);
+            this.gc.scale(0, 0);
+            this.gc.translate(0, 0);
+        }
+        else {
+            if (transform.hasRotation()) {
+                this.gc.rotate(transform.getAngle());
+            }
+
+            if (transform.hasScaling()) {
+                this.gc.scale(transform.getScaleX(), transform.getScaleY());
+            }
+
+            if (transform.hasTranslation()) {
+                this.gc.translate(transform.getOffsetX(), transform.getOffsetY());
+            }
+        }
+    }
+
+}
diff --git a/org.eclipse.nebula.widgets.nattable.ui.swt/.classpath b/org.eclipse.nebula.widgets.nattable.ui.swt/.classpath
new file mode 100644
index 0000000..ad32c83
--- /dev/null
+++ b/org.eclipse.nebula.widgets.nattable.ui.swt/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.nebula.widgets.nattable.ui.swt/.project b/org.eclipse.nebula.widgets.nattable.ui.swt/.project
new file mode 100644
index 0000000..68f02dd
--- /dev/null
+++ b/org.eclipse.nebula.widgets.nattable.ui.swt/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.nebula.widgets.nattable.ui.swt</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/org.eclipse.nebula.widgets.nattable.ui.swt/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.nebula.widgets.nattable.ui.swt/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..e76440a
--- /dev/null
+++ b/org.eclipse.nebula.widgets.nattable.ui.swt/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,291 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.6
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=0
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=1
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=0
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=0
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=64
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=0
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
+org.eclipse.jdt.core.formatter.comment.format_block_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=true
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=80
+org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true
+org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true
+org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off
+org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=true
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=false
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=240
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=space
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_on_off_tags=false
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
+org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
diff --git a/org.eclipse.nebula.widgets.nattable.ui.swt/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.nebula.widgets.nattable.ui.swt/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..04015e6
--- /dev/null
+++ b/org.eclipse.nebula.widgets.nattable.ui.swt/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,62 @@
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_NatTable
+formatter_settings_version=12
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_missing_override_annotations_interface_methods=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=true
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_functional_interfaces=false
+sp_cleanup.convert_to_enhanced_for_loop=false
+sp_cleanup.correct_indentation=true
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.insert_inferred_type_arguments=false
+sp_cleanup.make_local_variable_final=true
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_type_abstract_if_missing_method=false
+sp_cleanup.make_variable_declarations_final=false
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_redundant_type_arguments=false
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=true
+sp_cleanup.remove_unused_imports=false
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_anonymous_class_creation=false
+sp_cleanup.use_blocks=false
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_lambda=true
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=true
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=false
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
+sp_cleanup.use_type_arguments=false
diff --git a/org.eclipse.nebula.widgets.nattable.ui.swt/.settings/org.eclipse.pde.core.prefs b/org.eclipse.nebula.widgets.nattable.ui.swt/.settings/org.eclipse.pde.core.prefs
new file mode 100644
index 0000000..f29e940
--- /dev/null
+++ b/org.eclipse.nebula.widgets.nattable.ui.swt/.settings/org.eclipse.pde.core.prefs
@@ -0,0 +1,3 @@
+eclipse.preferences.version=1
+pluginProject.extensions=false
+resolve.requirebundle=false
diff --git a/org.eclipse.nebula.widgets.nattable.ui.swt/META-INF/MANIFEST.MF b/org.eclipse.nebula.widgets.nattable.ui.swt/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..42661e7
--- /dev/null
+++ b/org.eclipse.nebula.widgets.nattable.ui.swt/META-INF/MANIFEST.MF
@@ -0,0 +1,32 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: NatTable SWT UI
+Bundle-SymbolicName: org.eclipse.nebula.widgets.nattable.ui.swt
+Bundle-Version: 2.0.0.qualifier
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Eclipse-ExtensibleAPI: true
+Import-Package: org.apache.commons.logging;version="[1.0.0,2.0.0)",
+ org.eclipse.core.commands.common,
+ org.eclipse.jface.action,
+ org.eclipse.jface.dialogs,
+ org.eclipse.jface.fieldassist,
+ org.eclipse.jface.layout,
+ org.eclipse.jface.menus,
+ org.eclipse.jface.resource,
+ org.eclipse.jface.util,
+ org.eclipse.jface.viewers,
+ org.eclipse.jface.window,
+ org.eclipse.nebula.widgets.nattable.core.geometry;version="2.0.0",
+ org.eclipse.nebula.widgets.nattable.core.ui.rendering;version="2.0.0",
+ org.eclipse.nebula.widgets.nattable.style;version="2.0.0",
+ org.eclipse.swt,
+ org.eclipse.swt.custom,
+ org.eclipse.swt.dnd,
+ org.eclipse.swt.events,
+ org.eclipse.swt.graphics,
+ org.eclipse.swt.layout,
+ org.eclipse.swt.printing,
+ org.eclipse.swt.program,
+ org.eclipse.swt.widgets
+Require-Bundle: org.eclipse.equinox.common;bundle-version="3.6.0"
+Bundle-Vendor: Eclipse Nebula NatTable
diff --git a/org.eclipse.nebula.widgets.nattable.ui.swt/build.properties b/org.eclipse.nebula.widgets.nattable.ui.swt/build.properties
new file mode 100644
index 0000000..34d2e4d
--- /dev/null
+++ b/org.eclipse.nebula.widgets.nattable.ui.swt/build.properties
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .
diff --git a/org.eclipse.nebula.widgets.nattable.ui.swt/src/org/eclipse/nebula/widgets/nattable/ui/swt/SWTGraphicsContext.java b/org.eclipse.nebula.widgets.nattable.ui.swt/src/org/eclipse/nebula/widgets/nattable/ui/swt/SWTGraphicsContext.java
new file mode 100644
index 0000000..7a3d25c
--- /dev/null
+++ b/org.eclipse.nebula.widgets.nattable.ui.swt/src/org/eclipse/nebula/widgets/nattable/ui/swt/SWTGraphicsContext.java
@@ -0,0 +1,283 @@
+/*******************************************************************************
+ * Copyright (c) 2014 Dirk Fauth, Edwin Park.
+ * 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:
+ *     Dirk Fauth <dirk.fauth@googlemail.com>   - initial API and implementation
+ *     Edwin Park <esp1@cornell.edu>            - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.nebula.widgets.nattable.ui.swt;
+
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Stack;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.nebula.widgets.nattable.core.geometry.PixelRectangle;
+import org.eclipse.nebula.widgets.nattable.core.ui.rendering.Color;
+import org.eclipse.nebula.widgets.nattable.core.ui.rendering.Font;
+import org.eclipse.nebula.widgets.nattable.core.ui.rendering.Font.FontStyle;
+import org.eclipse.nebula.widgets.nattable.core.ui.rendering.GraphicsContext;
+import org.eclipse.nebula.widgets.nattable.core.ui.rendering.Image;
+import org.eclipse.nebula.widgets.nattable.core.ui.rendering.Transform;
+import org.eclipse.nebula.widgets.nattable.style.IStyle;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.FontData;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.graphics.RGB;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * Proxy implementation of {@link GraphicsContext} to provide the drawing
+ * capabilities by SWT {@link GC} so the NatTable can be painted using this.
+ */
+public class SWTGraphicsContext implements GraphicsContext {
+
+    private static final String KEY_PREFIX = SWTGraphicsContext.class.getCanonicalName() + "."; //$NON-NLS-1$
+
+    enum GraphicsProperties {
+        FOREGROUND_COLOR,
+        BACKGROUND_COLOR,
+        ALPHA,
+        CLIP_BOUNDS,
+        TRANSFORM,
+        LINE_STYLE,
+        LINE_DASH,
+        LINE_WIDTH
+    }
+
+    private Stack<Map<GraphicsProperties, Object>> stateStack = new Stack<Map<GraphicsProperties, Object>>();
+
+    /**
+     * The SWT {@link GC} which is proxied by this implementation.
+     */
+    private GC gc;
+
+    /**
+     *
+     * @param gc
+     *            The SWT {@link GC} that should be proxied by this
+     *            implementation.
+     */
+    public SWTGraphicsContext(GC gc) {
+        this.gc = gc;
+    }
+
+    @Override
+    public void initStyle(IStyle style) {
+        // TODO Auto-generated method stub
+
+    }
+
+    @Override
+    public void drawText(String text, double x, double y) {
+        this.gc.drawText(text, (int) x, (int) y, SWT.DRAW_TRANSPARENT | SWT.DRAW_DELIMITER);
+    }
+
+    @Override
+    public void drawLine(double x1, double y1, double x2, double y2) {
+        this.gc.drawLine((int) x1, (int) y1, (int) x2, (int) y2);
+    }
+
+    @Override
+    public void drawRectangle(PixelRectangle rect) {
+        this.gc.drawRectangle((int) rect.x, (int) rect.y, (int) rect.width, (int) rect.height);
+    }
+
+    @Override
+    public void fillRectangle(PixelRectangle rect) {
+        this.gc.fillRectangle((int) rect.x, (int) rect.y, (int) rect.width, (int) rect.height);
+    }
+
+    @Override
+    public double calculateTextWidth(String text) {
+        return this.gc.textExtent(text).x;
+    }
+
+    @Override
+    public double getFontHeight() {
+        return this.gc.getFontMetrics().getHeight();
+    }
+
+    @Override
+    public void pushState() {
+        Map<GraphicsProperties, Object> props = new HashMap<GraphicsProperties, Object>();
+        props.put(GraphicsProperties.FOREGROUND_COLOR, this.gc.getForeground());
+        props.put(GraphicsProperties.BACKGROUND_COLOR, this.gc.getBackground());
+        props.put(GraphicsProperties.ALPHA, this.gc.getAlpha());
+        props.put(GraphicsProperties.CLIP_BOUNDS, this.gc.getClipping());
+
+        // TODO remember the transform wrapper if any is active
+        // props.put(GraphicsProperties.TRANSFORM, null);
+
+        this.stateStack.push(props);
+    }
+
+    @Override
+    public void popState() {
+        Map<GraphicsProperties, Object> props = this.stateStack.pop();
+        this.gc.setForeground((org.eclipse.swt.graphics.Color) props.get(GraphicsProperties.FOREGROUND_COLOR));
+        this.gc.setBackground((org.eclipse.swt.graphics.Color) props.get(GraphicsProperties.BACKGROUND_COLOR));
+        this.gc.setAlpha((Integer) props.get(GraphicsProperties.ALPHA));
+        this.gc.setClipping((Rectangle) props.get(GraphicsProperties.CLIP_BOUNDS));
+    }
+
+    @Override
+    public PixelRectangle getClipping() {
+        return getPixelRectangle(this.gc.getClipping());
+    }
+
+    @Override
+    public void setClipping(PixelRectangle clipBounds) {
+        this.gc.setClipping(getUiRectangle(clipBounds));
+    }
+
+    @Override
+    public void setForeground(Color foregroundColor) {
+        this.gc.setForeground(getUiColor(foregroundColor));
+        // TODO set alpha
+    }
+
+    @Override
+    public void setBackground(Color backgroundColor) {
+        this.gc.setBackground(getUiColor(backgroundColor));
+        // TODO set alpha
+    }
+
+    @Override
+    public org.eclipse.swt.graphics.Color getUiColor(Color color) {
+        if (color.getNativeColor() == null) {
+            String key = KEY_PREFIX + "_COLOR_" + color.red + "_" + color.green + "_" + color.blue; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+            if (!JFaceResources.getColorRegistry().hasValueFor(key)) {
+                JFaceResources.getColorRegistry().put(key, new RGB(color.red, color.green, color.blue));
+            }
+            color.setNativeColor(JFaceResources.getColorRegistry().get(key));
+        }
+        if (color.getNativeColor() == null || !(color.getNativeColor() instanceof org.eclipse.swt.graphics.Color)) {
+            throw new IllegalStateException("native color instance in color wrapper is invalid");
+        }
+        return (org.eclipse.swt.graphics.Color) color.getNativeColor();
+    }
+
+    @Override
+    public void setFont(Font font) {
+        this.gc.setFont(getUiFont(font));
+    }
+
+    @Override
+    public org.eclipse.swt.graphics.Font getUiFont(Font font) {
+        if (font.getNativeFont() == null) {
+            // if all attributes are not set, use the default font
+            if (font.name == null && font.height == -1 && font.style == null) {
+                font.setNativeFont(Display.getDefault().getSystemFont());
+            }
+            else {
+                FontData defaultFontData = Display.getDefault().getSystemFont().getFontData()[0];
+                String fontName = (font.name == null) ? defaultFontData.getName() : font.name;
+                int height = (font.height == -1) ? defaultFontData.getHeight() : Double.valueOf(font.height).intValue();
+                int fontStyle = SWT.NORMAL;
+
+                // calculate font style
+                if (font.style != null) {
+                    for (FontStyle style : font.style) {
+                        if (FontStyle.ITALIC.equals(style)) {
+                            fontStyle = fontStyle | SWT.ITALIC;
+                        }
+                        else if (FontStyle.BOLD.equals(style)
+                                || FontStyle.EXTRA_BOLD.equals(style)
+                                || FontStyle.SEMI_BOLD.equals(style)) {
+                            fontStyle = fontStyle | SWT.BOLD;
+                        }
+                    }
+                }
+
+                FontData data = new FontData(fontName, height, fontStyle);
+                String key = data.toString();
+                if (!JFaceResources.getFontRegistry().hasValueFor(key)) {
+                    JFaceResources.getFontRegistry().put(key, new FontData[] { data });
+                }
+                font.setNativeFont(JFaceResources.getFontRegistry().get(key));
+            }
+        }
+        if (!(font.getNativeFont() instanceof org.eclipse.swt.graphics.Font)) {
+            throw new IllegalStateException("native font instance in font wrapper is invalid");
+        }
+        return (org.eclipse.swt.graphics.Font) font.getNativeFont();
+    }
+
+    @Override
+    public void drawImage(Image image, double x, double y) {
+        this.gc.drawImage(getUiImage(image), Double.valueOf(x).intValue(), Double.valueOf(y).intValue());
+    }
+
+    @Override
+    public org.eclipse.swt.graphics.Image getUiImage(Image image) {
+        if (image.getNativeImage() == null) {
+            // key = filename
+            String key = image.url.toString();
+            key = key.substring(key.lastIndexOf('/') + 1, key.lastIndexOf('.'));
+
+            ImageDescriptor descriptor = JFaceResources.getImageRegistry().getDescriptor(key);
+            if (descriptor == null) {
+                URL url = image.url;
+                // TODO check if scaling is necessary
+                // if (GUIHelper.needScaling())
+
+                descriptor = ImageDescriptor.createFromURL(url);
+
+                // TODO or upscale
+
+                JFaceResources.getImageRegistry().put(key, ImageDescriptor.createFromURL(url));
+            }
+            image.setNativeImage(JFaceResources.getImage(key));
+        }
+        if (image.getNativeImage() == null || !(image.getNativeImage() instanceof org.eclipse.swt.graphics.Image)) {
+            throw new IllegalStateException("native image instance in image wrapper is invalid");
+        }
+        return (org.eclipse.swt.graphics.Image) image.getNativeImage();
+    }
+
+    private Rectangle getUiRectangle(PixelRectangle rectangle) {
+        return new Rectangle(
+                (int) rectangle.x,
+                (int) rectangle.y,
+                (int) rectangle.width,
+                (int) rectangle.height);
+    }
+
+    private PixelRectangle getPixelRectangle(Rectangle rectangle) {
+        return new PixelRectangle(rectangle.x, rectangle.y, rectangle.width, rectangle.height);
+    }
+
+    @Override
+    public void setTransform(Transform transform) {
+        if (transform == null) {
+            this.gc.setTransform(null);
+        }
+        else {
+            org.eclipse.swt.graphics.Transform uiTransform =
+                    new org.eclipse.swt.graphics.Transform(this.gc.getDevice());
+
+            if (transform.hasRotation()) {
+                uiTransform.rotate(transform.getAngle());
+            }
+
+            if (transform.hasScaling()) {
+                uiTransform.scale(transform.getScaleX(), transform.getScaleY());
+            }
+
+            if (transform.hasTranslation()) {
+                uiTransform.translate(transform.getOffsetX(), transform.getOffsetY());
+            }
+
+            this.gc.setTransform(uiTransform);
+        }
+    }
+
+}
diff --git a/target-platform/target-platform.target b/target-platform/target-platform.target
index 0a8d8c3..34537f6 100644
--- a/target-platform/target-platform.target
+++ b/target-platform/target-platform.target
@@ -1,13 +1,19 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<?pde version="3.8"?><target name="NatTable Target" sequenceNumber="11">
+<?pde version="3.8"?><target name="NatTable Target" sequenceNumber="17">
 <locations>
-<location includeAllPlatforms="false" includeConfigurePhase="false" includeMode="planner" includeSource="true" type="InstallableUnit">
-<unit id="org.eclipse.sdk.ide" version="3.6.2.M20110210-1200"/>
-<repository location="http://download.eclipse.org/releases/helios"/>
+<location includeAllPlatforms="false" includeConfigurePhase="false" includeMode="slicer" includeSource="true" type="InstallableUnit">
+<unit id="org.eclipse.fx.runtime.feature.feature.group" version="1.1.0.201411050703"/>
+<repository location="http://download.eclipse.org/efxclipse/runtime-released/1.1.0/site"/>
 </location>
-<location includeAllPlatforms="false" includeConfigurePhase="false" includeMode="planner" includeSource="true" type="InstallableUnit">
+<location includeAllPlatforms="false" includeConfigurePhase="false" includeMode="slicer" includeSource="true" type="InstallableUnit">
+<unit id="org.eclipse.sdk.ide" version="4.4.1.M20140925-0400"/>
+<repository location="http://download.eclipse.org/releases/luna/"/>
+</location>
+<location includeAllPlatforms="false" includeConfigurePhase="false" includeMode="slicer" includeSource="true" type="InstallableUnit">
 <unit id="org.apache.poi" version="3.9.0.v201405241750"/>
+<unit id="org.apache.commons.codec.source" version="1.6.0.v201305230611"/>
 <unit id="ca.odell.glazedlists.source" version="1.9.0.v201303080712"/>
+<unit id="org.apache.commons.codec" version="1.6.0.v201305230611"/>
 <unit id="ca.odell.glazedlists" version="1.9.0.v201303080712"/>
 <unit id="org.apache.poi.source" version="3.9.0.v201405241750"/>
 <repository location="http://download.eclipse.org/tools/orbit/downloads/drops/R20140525021250/repository/"/>