extracting Cell interface
diff --git a/NatTable/src/org/eclipse/nebula/widgets/nattable/core/cell/Cell.xtend b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/cell/Cell.xtend
new file mode 100644
index 0000000..109bd94
--- /dev/null
+++ b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/cell/Cell.xtend
@@ -0,0 +1,14 @@
+package org.eclipse.nebula.widgets.nattable.core.cell
+
+import org.eclipse.nebula.widgets.nattable.core.geometry.PositionRectangle
+import org.eclipse.nebula.widgets.nattable.core.layer.Layer
+
+interface Cell {
+	
+	def Layer getLayer()
+	def PositionRectangle getPositionBounds()
+	
+	def Object getDataValue()
+	def void setDataValue(Object newValue)
+	
+}
\ No newline at end of file
diff --git a/NatTable/src/org/eclipse/nebula/widgets/nattable/core/cell/CellInvariants.xtend b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/cell/CellInvariants.xtend
new file mode 100644
index 0000000..612c542
--- /dev/null
+++ b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/cell/CellInvariants.xtend
@@ -0,0 +1,21 @@
+package org.eclipse.nebula.widgets.nattable.core.cell
+
+import org.eclipse.nebula.widgets.nattable.core.geometry.PixelRectangle
+
+import static extension org.eclipse.nebula.widgets.nattable.core.layer.LayerInvariants.*
+
+class CellInvariants {
+	
+	def static getPixelBounds(Cell cell) {
+		val layer = cell.layer
+		val positionBounds = cell.positionBounds
+		
+		val startX = layer.getStartXPixelOfColumnPosition(positionBounds.columnPosition)
+		val startY = layer.getStartYPixelOfRowPosition(positionBounds.rowPosition)
+		val endX = layer.getStartXPixelOfColumnPosition(positionBounds.columnPosition + positionBounds.positionWidth)
+		val endY = layer.getStartYPixelOfRowPosition(positionBounds.rowPosition + positionBounds.positionHeight)
+		
+		new PixelRectangle(startX, startY, endX - startX, endY - startY)
+	}
+	
+}
\ No newline at end of file
diff --git a/NatTable/src/org/eclipse/nebula/widgets/nattable/core/cell/LayerDataAccessorCell.xtend b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/cell/LayerDataAccessorCell.xtend
new file mode 100644
index 0000000..711a93c
--- /dev/null
+++ b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/cell/LayerDataAccessorCell.xtend
@@ -0,0 +1,37 @@
+package org.eclipse.nebula.widgets.nattable.core.cell
+
+import org.eclipse.nebula.widgets.nattable.core.geometry.PositionRectangle
+import org.eclipse.nebula.widgets.nattable.core.layer.Layer
+import org.eclipse.nebula.widgets.nattable.core.layer.LayerDataAccessor
+
+class LayerDataAccessorCell implements Cell {
+	
+	val Layer layer
+	val PositionRectangle positionBounds
+	val LayerDataAccessor layerDataAccessor
+	
+	new(Layer layer, int columnPosition, int rowPosition, LayerDataAccessor layerDataAccessor) {
+		this.layer = layer
+		this.positionBounds = new PositionRectangle(columnPosition, rowPosition, 1, 1)
+		this.layerDataAccessor = layerDataAccessor
+	}
+	
+	override getLayer() { layer }
+	override getPositionBounds() { positionBounds }
+	
+	override getDataValue() {
+		layerDataAccessor.getCellDataValue(
+			positionBounds.originPosition.columnPosition,
+			positionBounds.originPosition.rowPosition
+		)
+	}
+	
+	override setDataValue(Object newValue) {
+		layerDataAccessor.setCellDataValue(
+			positionBounds.originPosition.columnPosition,
+			positionBounds.originPosition.rowPosition,
+			newValue
+		)
+	}
+	
+}
\ No newline at end of file
diff --git a/NatTable/src/org/eclipse/nebula/widgets/nattable/core/cell/ReadOnlyCell.xtend b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/cell/ReadOnlyCell.xtend
new file mode 100644
index 0000000..19abaad
--- /dev/null
+++ b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/cell/ReadOnlyCell.xtend
@@ -0,0 +1,26 @@
+package org.eclipse.nebula.widgets.nattable.core.cell
+
+import org.eclipse.nebula.widgets.nattable.core.geometry.PositionRectangle
+import org.eclipse.nebula.widgets.nattable.core.layer.Layer
+
+class ReadOnlyCell implements Cell {
+	
+	val Layer layer
+	val PositionRectangle positionBounds
+	val Object dataValue
+	
+	new(Layer layer, int columnPosition, int rowPosition, Object dataValue) {
+		this.layer = layer
+		this.positionBounds = new PositionRectangle(columnPosition, rowPosition, 1, 1)
+		this.dataValue = dataValue
+	}
+	
+	override getLayer() { layer }
+	override getPositionBounds() { positionBounds }
+	override getDataValue() { dataValue }
+	
+	override setDataValue(Object newValue) {
+		throw new UnsupportedOperationException("TODO: auto-generated method stub")
+	}
+	
+}
\ No newline at end of file
diff --git a/NatTable/src/org/eclipse/nebula/widgets/nattable/core/data/PropertyAccessor.xtend b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/data/ObjectPropertyAccessor.xtend
similarity index 76%
rename from NatTable/src/org/eclipse/nebula/widgets/nattable/core/data/PropertyAccessor.xtend
rename to NatTable/src/org/eclipse/nebula/widgets/nattable/core/data/ObjectPropertyAccessor.xtend
index 99d91dd..de40f80 100644
--- a/NatTable/src/org/eclipse/nebula/widgets/nattable/core/data/PropertyAccessor.xtend
+++ b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/data/ObjectPropertyAccessor.xtend
@@ -1,6 +1,6 @@
 package org.eclipse.nebula.widgets.nattable.core.data
 
-interface PropertyAccessor {
+interface ObjectPropertyAccessor {
 	
 	def Object getProperty(Object obj, Object propertyId)
 	
diff --git a/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/DummyLayer.xtend b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/DummyLayer.xtend
index 9e26f55..fdab9a0 100644
--- a/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/DummyLayer.xtend
+++ b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/DummyLayer.xtend
@@ -2,7 +2,7 @@
 
 import org.eclipse.nebula.widgets.nattable.core.axis.Axis
 import org.eclipse.nebula.widgets.nattable.core.axis.DefaultAxis
-import org.eclipse.nebula.widgets.nattable.core.geometry.PositionRectangle
+import org.eclipse.nebula.widgets.nattable.core.cell.ReadOnlyCell
 
 class DummyLayer implements Layer {
 
@@ -17,16 +17,8 @@
 	override getHorizontalAxis() { horizontalAxis }
 	override getVerticalAxis() { verticalAxis }
 	
-	override getCellPositionBounds(int columnPosition, int rowPosition) {
-		new PositionRectangle(columnPosition, rowPosition, 1, 1)
-	}
-	
-	override getCellDataValue(int columnPosition, int rowPosition) {
-		'''Column «columnPosition», Row «rowPosition»'''
-	}
-	
-	override setCellDataValue(int columnPosition, int rowPosition, Object newValue) {
-		throw new UnsupportedOperationException("TODO: auto-generated method stub")
+	override getCell(int columnPosition, int rowPosition) {
+		new ReadOnlyCell(this, columnPosition, rowPosition, '''Column «columnPosition», Row «rowPosition»''')
 	}
 	
 }
diff --git a/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/Layer.xtend b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/Layer.xtend
index b382761..aaed4cc 100644
--- a/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/Layer.xtend
+++ b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/Layer.xtend
@@ -1,7 +1,7 @@
 package org.eclipse.nebula.widgets.nattable.core.layer
 
 import org.eclipse.nebula.widgets.nattable.core.axis.Axis
-import org.eclipse.nebula.widgets.nattable.core.geometry.PositionRectangle
+import org.eclipse.nebula.widgets.nattable.core.cell.Cell
 
 interface Layer {
 	
@@ -12,9 +12,6 @@
 	
 	// Cell
 	
-	def PositionRectangle getCellPositionBounds(int columnPosition, int rowPosition)
-	
-	def Object getCellDataValue(int columnPosition, int rowPosition)
-	def void setCellDataValue(int columnPosition, int rowPosition, Object newValue)
+	def Cell getCell(int columnPosition, int rowPosition)
 	
 }
\ No newline at end of file
diff --git a/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/LayerDataAccessor.xtend b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/LayerDataAccessor.xtend
new file mode 100644
index 0000000..8e628b0
--- /dev/null
+++ b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/LayerDataAccessor.xtend
@@ -0,0 +1,8 @@
+package org.eclipse.nebula.widgets.nattable.core.layer
+
+interface LayerDataAccessor {
+	
+	def Object getCellDataValue(int columnPosition, int rowPosition)
+	def void setCellDataValue(int columnPosition, int rowPosition, Object newValue)
+	
+}
\ No newline at end of file
diff --git a/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/LayerInvariants.xtend b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/LayerInvariants.xtend
index 9c3f326..47e455c 100644
--- a/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/LayerInvariants.xtend
+++ b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/LayerInvariants.xtend
@@ -1,7 +1,5 @@
 package org.eclipse.nebula.widgets.nattable.core.layer
 
-import org.eclipse.nebula.widgets.nattable.core.geometry.PixelRectangle
-
 import static extension org.eclipse.nebula.widgets.nattable.core.axis.AxisInvariants.*
 
 /**
@@ -53,19 +51,6 @@
 		layer.verticalAxis.getSegmentPositionByPixelLocation(yPixel)
 	}
 	
-	// Cell
-	
-	def static getCellPixelBounds(Layer layer, int columnPosition, int rowPosition) {
-		val positionBounds = layer.getCellPositionBounds(columnPosition, rowPosition)
-		
-		val startX = layer.getStartXPixelOfColumnPosition(positionBounds.columnPosition)
-		val startY = layer.getStartYPixelOfRowPosition(positionBounds.rowPosition)
-		val endX = layer.getStartXPixelOfColumnPosition(positionBounds.columnPosition + positionBounds.positionWidth)
-		val endY = layer.getStartYPixelOfRowPosition(positionBounds.rowPosition + positionBounds.positionHeight)
-		
-		return new PixelRectangle(startX, startY, endX - startX, endY - startY)
-	}
-	
 	// Contains
 	
 	def static boolean containsCellPosition(Layer layer, int columnPosition, int rowPosition) {
diff --git a/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/ListRowDataLayer.xtend b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/ListRowDataLayer.xtend
index 669bb63..54cb127 100644
--- a/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/ListRowDataLayer.xtend
+++ b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/ListRowDataLayer.xtend
@@ -4,8 +4,8 @@
 import java.util.List
 import org.eclipse.nebula.widgets.nattable.core.axis.Axis
 import org.eclipse.nebula.widgets.nattable.core.axis.DefaultAxis
-import org.eclipse.nebula.widgets.nattable.core.data.PropertyAccessor
-import org.eclipse.nebula.widgets.nattable.core.geometry.PositionRectangle
+import org.eclipse.nebula.widgets.nattable.core.cell.ReadOnlyCell
+import org.eclipse.nebula.widgets.nattable.core.data.ObjectPropertyAccessor
 
 class ListRowDataLayer implements Layer {
 	
@@ -14,7 +14,7 @@
 	val Axis horizontalAxis
 	val Axis verticalAxis
 	
-	@Inject extension PropertyAccessor
+	@Inject extension ObjectPropertyAccessor
 	
 	new(List<?> list, Axis horizontalAxis) {
 		this.list = list
@@ -25,18 +25,12 @@
 	override getHorizontalAxis() { horizontalAxis }
 	override getVerticalAxis() { verticalAxis }
 	
-	override getCellPositionBounds(int columnPosition, int rowPosition) {
-		new PositionRectangle(columnPosition, rowPosition, 1, 1)
-	}
-	
-	override getCellDataValue(int columnPosition, int rowPosition) {
+	override getCell(int columnPosition, int rowPosition) {
 		val rowObject = list.get(rowPosition)
 		val propertyId = horizontalAxis.getIdOfSegmentPosition(columnPosition)
-		rowObject.getProperty(propertyId)
-	}
-	
-	override setCellDataValue(int columnPosition, int rowPosition, Object newValue) {
-		throw new UnsupportedOperationException("TODO: auto-generated method stub")
+		val value = rowObject.getProperty(propertyId)
+		
+		new ReadOnlyCell(this, columnPosition, rowPosition, value)
 	}
 	
 }
\ No newline at end of file
diff --git a/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/composite/CompositeLayer.xtend b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/composite/CompositeLayer.xtend
index 2982ffc..2175bca 100644
--- a/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/composite/CompositeLayer.xtend
+++ b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/composite/CompositeLayer.xtend
@@ -1,8 +1,8 @@
 package org.eclipse.nebula.widgets.nattable.core.layer.composite
 
-import org.eclipse.nebula.widgets.nattable.core.layer.Layer
 import java.util.ArrayList
 import org.eclipse.nebula.widgets.nattable.core.axis.Axis
+import org.eclipse.nebula.widgets.nattable.core.layer.Layer
 
 class CompositeLayer implements Layer {
 	
@@ -20,7 +20,7 @@
 	override getHorizontalAxis() { horizontalAxis }
 	override getVerticalAxis() { verticalAxis }
 	
-	override getCellPositionBounds(int columnPosition, int rowPosition) {
+	override getCell(int columnPosition, int rowPosition) {
 		// find index of layer corresponding to given column position (& track horiz offset)
 		// find index of layer corresponding to given row position (& track vert offset)
 		// => find layer in layout
@@ -28,14 +28,6 @@
 		throw new UnsupportedOperationException("TODO: auto-generated method stub")
 	}
 	
-	override getCellDataValue(int columnPosition, int rowPosition) {
-		throw new UnsupportedOperationException("TODO: auto-generated method stub")
-	}
-	
-	override setCellDataValue(int columnPosition, int rowPosition, Object newValue) {
-		throw new UnsupportedOperationException("TODO: auto-generated method stub")
-	}
-	
 	def addLayoutRow(LayoutRow layoutRow) {
 		layoutRows += layoutRow
 	}
diff --git a/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/header/ColumnHeaderLayer.xtend b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/header/ColumnHeaderLayer.xtend
index 36674cf..b689bf4 100644
--- a/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/header/ColumnHeaderLayer.xtend
+++ b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/header/ColumnHeaderLayer.xtend
@@ -1,11 +1,12 @@
 package org.eclipse.nebula.widgets.nattable.core.layer.header
 
 import org.eclipse.nebula.widgets.nattable.core.axis.Axis
-import org.eclipse.nebula.widgets.nattable.core.layer.Layer
 import org.eclipse.nebula.widgets.nattable.core.axis.DefaultAxis
-import org.eclipse.nebula.widgets.nattable.core.geometry.PositionRectangle
+import org.eclipse.nebula.widgets.nattable.core.cell.LayerDataAccessorCell
+import org.eclipse.nebula.widgets.nattable.core.layer.Layer
+import org.eclipse.nebula.widgets.nattable.core.layer.LayerDataAccessor
 
-class ColumnHeaderLayer implements Layer {
+class ColumnHeaderLayer implements Layer, LayerDataAccessor {
 	
 	val Axis horizontalAxis
 	val Axis verticalAxis
@@ -16,13 +17,17 @@
 		this.verticalAxis = new DefaultAxis(1, 20)
 	}
 	
+	// Layer
+	
 	override getHorizontalAxis() { horizontalAxis }
 	override getVerticalAxis() { verticalAxis }
 	
-	override getCellPositionBounds(int columnPosition, int rowPosition) {
-		new PositionRectangle(columnPosition, rowPosition, 1, 1)
+	override getCell(int columnPosition, int rowPosition) {
+		new LayerDataAccessorCell(this, columnPosition, rowPosition, this)
 	}
 	
+	// LayerDataAccessor
+	
 	override getCellDataValue(int columnPosition, int rowPosition) {
 		horizontalAxis.getSegmentDataValue(columnPosition)
 	}
diff --git a/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/header/RowHeaderLayer.xtend b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/header/RowHeaderLayer.xtend
index 534ff10..e1f2dc5 100644
--- a/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/header/RowHeaderLayer.xtend
+++ b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/header/RowHeaderLayer.xtend
@@ -1,11 +1,12 @@
 package org.eclipse.nebula.widgets.nattable.core.layer.header
 
 import org.eclipse.nebula.widgets.nattable.core.axis.Axis
-import org.eclipse.nebula.widgets.nattable.core.layer.Layer
 import org.eclipse.nebula.widgets.nattable.core.axis.DefaultAxis
-import org.eclipse.nebula.widgets.nattable.core.geometry.PositionRectangle
+import org.eclipse.nebula.widgets.nattable.core.cell.LayerDataAccessorCell
+import org.eclipse.nebula.widgets.nattable.core.layer.Layer
+import org.eclipse.nebula.widgets.nattable.core.layer.LayerDataAccessor
 
-class RowHeaderLayer implements Layer {
+class RowHeaderLayer implements Layer, LayerDataAccessor {
 	
 	val Axis horizontalAxis
 	val Axis verticalAxis
@@ -16,13 +17,17 @@
 		this.horizontalAxis = new DefaultAxis(1, 20)
 	}
 	
+	// Layer
+	
 	override getHorizontalAxis() { horizontalAxis }
 	override getVerticalAxis() { verticalAxis }
 	
-	override getCellPositionBounds(int columnPosition, int rowPosition) {
-		new PositionRectangle(columnPosition, rowPosition, 1, 1)
+	override getCell(int columnPosition, int rowPosition) {
+		new LayerDataAccessorCell(this, columnPosition, rowPosition, this)
 	}
 	
+	// LayerDataAccessor
+	
 	override getCellDataValue(int columnPosition, int rowPosition) {
 		verticalAxis.getSegmentDataValue(rowPosition)
 	}
diff --git a/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/viewport/ViewportLayer.xtend b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/viewport/ViewportLayer.xtend
index f69a0d9..ec7ec23 100644
--- a/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/viewport/ViewportLayer.xtend
+++ b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/viewport/ViewportLayer.xtend
@@ -2,7 +2,6 @@
 
 import org.eclipse.nebula.widgets.nattable.core.axis.viewport.ViewportAxis
 import org.eclipse.nebula.widgets.nattable.core.geometry.PixelArea
-import org.eclipse.nebula.widgets.nattable.core.geometry.PositionRectangle
 import org.eclipse.nebula.widgets.nattable.core.layer.Layer
 
 class ViewportLayer implements Layer {
@@ -27,23 +26,11 @@
 		verticalViewportAxis
 	}
 	
-	override getCellPositionBounds(int columnPosition, int rowPosition) {
-		new PositionRectangle(columnPosition, rowPosition, 1, 1)
-	}
-	
-	override getCellDataValue(int columnPosition, int rowPosition) {
-		underlyingLayer.getCellDataValue(
+	override getCell(int columnPosition, int rowPosition) {
+		underlyingLayer.getCell(
 			horizontalViewportAxis.originSegmentPosition + columnPosition,
 			verticalViewportAxis.originSegmentPosition + rowPosition
 		)
 	}
 	
-	override setCellDataValue(int columnPosition, int rowPosition, Object newValue) {
-		underlyingLayer.setCellDataValue(
-			horizontalViewportAxis.originSegmentPosition + columnPosition,
-			verticalViewportAxis.originSegmentPosition + rowPosition,
-			newValue
-		)
-	}
-	
 }
\ No newline at end of file
diff --git a/NatTable/src/org/eclipse/nebula/widgets/nattable/renderer/javafx/DefaultLayerRenderer.xtend b/NatTable/src/org/eclipse/nebula/widgets/nattable/renderer/javafx/DefaultLayerRenderer.xtend
index 1002560..cfc603b 100644
--- a/NatTable/src/org/eclipse/nebula/widgets/nattable/renderer/javafx/DefaultLayerRenderer.xtend
+++ b/NatTable/src/org/eclipse/nebula/widgets/nattable/renderer/javafx/DefaultLayerRenderer.xtend
@@ -5,9 +5,8 @@
 import javafx.scene.paint.Color
 import org.eclipse.nebula.widgets.nattable.core.layer.Layer
 
+import static extension org.eclipse.nebula.widgets.nattable.core.cell.CellInvariants.*
 import static extension org.eclipse.nebula.widgets.nattable.core.layer.LayerInvariants.*
-import javafx.scene.text.Font
-import com.sun.javafx.tk.Toolkit
 
 class DefaultLayerRenderer implements JavaFXLayerRenderer {
 	
@@ -18,7 +17,7 @@
     	
     	for (columnPosition : 0 .. layer.columnCount) {
     		for (rowPosition : 0 .. layer.rowCount) {
-    			val cellPixelBounds = layer.getCellPixelBounds(columnPosition, rowPosition)
+    			val cellPixelBounds = layer.getCell(columnPosition, rowPosition).pixelBounds
     			gc.strokeRect(cellPixelBounds.x, cellPixelBounds.y, cellPixelBounds.pixelWidth, cellPixelBounds.pixelHeight)
     			
 //    			gc.font = new Font()
@@ -26,7 +25,7 @@
 //    			fontMetrics.computeStringWidth("")
 				
 				gc.strokeText(
-					layer.getCellDataValue(columnPosition, rowPosition).toString,
+					layer.getCell(columnPosition, rowPosition).dataValue.toString,
 					cellPixelBounds.x + (cellPixelBounds.pixelWidth/2),
 					cellPixelBounds.y + (cellPixelBounds.pixelHeight/2)
 				)