adding/refactoring event stuff
diff --git a/NatTable/src/org/eclipse/nebula/widgets/nattable/core/event/AbstractEventSource.xtend b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/event/AbstractEventSource.xtend
new file mode 100644
index 0000000..d3aecc5
--- /dev/null
+++ b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/event/AbstractEventSource.xtend
@@ -0,0 +1,25 @@
+package org.eclipse.nebula.widgets.nattable.core.event
+
+import java.util.LinkedHashSet
+import java.util.Set
+
+abstract class AbstractEventSource implements EventSource {
+	
+	val Set<EventListener> listeners = new LinkedHashSet
+	
+	// EventSource interface
+	
+	override addEventListener(EventListener listener) { listeners.add(listener) }
+	override removeEventListener(EventListener listener) { listeners.remove(listener) }
+	
+	//
+	
+	/**
+	 * Pass the event to all the {@link LayerListener}s registered on this layer.
+	 */
+	def fireEvent(Event event) {
+		for (listener : listeners)
+			listener.handleEvent(event)
+	}
+	
+}
\ No newline at end of file
diff --git a/NatTable/src/org/eclipse/nebula/widgets/nattable/core/event/AbstractEventSourceSink.xtend b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/event/AbstractEventSourceSink.xtend
new file mode 100644
index 0000000..c63d7da
--- /dev/null
+++ b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/event/AbstractEventSourceSink.xtend
@@ -0,0 +1,11 @@
+package org.eclipse.nebula.widgets.nattable.core.event
+
+class AbstractEventSourceSink extends AbstractEventSource implements EventListener {
+	
+	// EventListener interface
+	
+	override handleEvent(Event event) {
+		fireEvent(event)
+	}
+	
+}
\ No newline at end of file
diff --git a/NatTable/src/org/eclipse/nebula/widgets/nattable/core/event/Event.xtend b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/event/Event.xtend
new file mode 100644
index 0000000..4ce8155
--- /dev/null
+++ b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/event/Event.xtend
@@ -0,0 +1,5 @@
+package org.eclipse.nebula.widgets.nattable.core.event
+
+interface Event {
+	
+}
\ No newline at end of file
diff --git a/NatTable/src/org/eclipse/nebula/widgets/nattable/core/event/EventListener.xtend b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/event/EventListener.xtend
new file mode 100644
index 0000000..71487ad
--- /dev/null
+++ b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/event/EventListener.xtend
@@ -0,0 +1,7 @@
+package org.eclipse.nebula.widgets.nattable.core.event
+
+interface EventListener {
+	
+    def void handleEvent(Event event)
+	
+}
\ No newline at end of file
diff --git a/NatTable/src/org/eclipse/nebula/widgets/nattable/core/event/EventSource.xtend b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/event/EventSource.xtend
new file mode 100644
index 0000000..210d559
--- /dev/null
+++ b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/event/EventSource.xtend
@@ -0,0 +1,9 @@
+package org.eclipse.nebula.widgets.nattable.core.event
+
+interface EventSource {
+	
+	def void addEventListener(EventListener listener)
+
+	def void removeEventListener(EventListener listener)
+	
+}
\ No newline at end of file
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 903782b..ee16aba 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,12 +1,14 @@
 package org.eclipse.nebula.widgets.nattable.core.layer
 
+import org.eclipse.nebula.widgets.nattable.core.event.EventListener
+import org.eclipse.nebula.widgets.nattable.core.event.EventSource
 import org.eclipse.nebula.widgets.nattable.core.layer.axis.Axis
 import org.eclipse.nebula.widgets.nattable.core.layer.cell.Cell
 
 /**
  * A two-dimensional rectangular region of cells.
  */
-interface Layer extends LayerListener {
+interface Layer extends EventSource, EventListener {
 	
 	/**
 	 * @return The Axis that characterizes the horizontal dimension of this layer.
@@ -23,10 +25,4 @@
 	 */
 	def Cell getCell(int columnPosition, int rowPosition)
 	
-	// Events
-	
-	def void addLayerListener(LayerListener listener)
-
-	def void removeLayerListener(LayerListener listener)
-	
 }
\ No newline at end of file
diff --git a/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/LayerEvent.xtend b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/LayerEvent.xtend
deleted file mode 100644
index e76a28d..0000000
--- a/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/LayerEvent.xtend
+++ /dev/null
@@ -1,8 +0,0 @@
-package org.eclipse.nebula.widgets.nattable.core.layer
-
-/**
- * LayerEvents should be immutable.
- */
-interface LayerEvent {
-	
-}
\ No newline at end of file
diff --git a/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/LayerListener.xtend b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/LayerListener.xtend
deleted file mode 100644
index 2d8bd47..0000000
--- a/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/LayerListener.xtend
+++ /dev/null
@@ -1,7 +0,0 @@
-package org.eclipse.nebula.widgets.nattable.core.layer
-
-interface LayerListener {
-	
-    def void handleLayerEvent(LayerEvent event)
-	
-}
\ No newline at end of file
diff --git a/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/axis/Axis.xtend b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/axis/Axis.xtend
index 13451f3..6c7fd0a 100644
--- a/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/axis/Axis.xtend
+++ b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/axis/Axis.xtend
@@ -1,11 +1,13 @@
 package org.eclipse.nebula.widgets.nattable.core.layer.axis
 
 import java.io.Serializable
+import org.eclipse.nebula.widgets.nattable.core.event.EventListener
+import org.eclipse.nebula.widgets.nattable.core.event.EventSource
 
 /**
  * Represents a linear dimension (e.g. horizontal, vertical) that is composed of segments (e.g. columns, rows).
  */
-interface Axis {
+interface Axis extends EventSource, EventListener {
 	
 	/**
 	 * @return The number of segments on this axis.
diff --git a/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/axis/impl/AbstractAxis.xtend b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/axis/impl/AbstractAxis.xtend
new file mode 100644
index 0000000..3b6b05c
--- /dev/null
+++ b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/axis/impl/AbstractAxis.xtend
@@ -0,0 +1,8 @@
+package org.eclipse.nebula.widgets.nattable.core.layer.axis.impl
+
+import org.eclipse.nebula.widgets.nattable.core.event.AbstractEventSourceSink
+import org.eclipse.nebula.widgets.nattable.core.layer.axis.Axis
+
+abstract class AbstractAxis extends AbstractEventSourceSink implements Axis {
+	
+}
\ No newline at end of file
diff --git a/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/axis/impl/AxisImpl.xtend b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/axis/impl/AxisImpl.xtend
index be37a68..fe561a7 100644
--- a/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/axis/impl/AxisImpl.xtend
+++ b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/axis/impl/AxisImpl.xtend
@@ -2,14 +2,13 @@
 
 import java.io.Serializable
 import java.util.TreeMap
-import org.eclipse.nebula.widgets.nattable.core.layer.axis.Axis
 
 import static extension org.eclipse.nebula.widgets.nattable.core.layer.axis.AxisInvariants.*
 
 /**
  * A simple Axis implementation.
  */
-class AxisImpl implements Axis {
+class AxisImpl extends AbstractAxis {
 	
 	int segmentCount
 	int defaultSegmentSize
diff --git a/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/axis/impl/hideshow/HideShowAxis.xtend b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/axis/impl/hideshow/HideShowAxis.xtend
index 20a4ff0..00c9b0f 100644
--- a/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/axis/impl/hideshow/HideShowAxis.xtend
+++ b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/axis/impl/hideshow/HideShowAxis.xtend
@@ -5,10 +5,11 @@
 import java.util.SortedMap
 import java.util.TreeMap
 import org.eclipse.nebula.widgets.nattable.core.layer.axis.Axis
+import org.eclipse.nebula.widgets.nattable.core.layer.axis.impl.AbstractAxis
 
 import static extension org.eclipse.nebula.widgets.nattable.core.layer.axis.AxisInvariants.*
 
-class HideShowAxis implements Axis {
+class HideShowAxis extends AbstractAxis {
 	
 	val SortedMap<Integer, Serializable> hiddenSegmentPositionToIdMap = new TreeMap
 	val Map<Integer, Integer> segmentPositionToStartPixelMap = newHashMap
diff --git a/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/axis/impl/reorder/ReorderAxis.xtend b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/axis/impl/reorder/ReorderAxis.xtend
index ce46c74..5574e16 100644
--- a/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/axis/impl/reorder/ReorderAxis.xtend
+++ b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/axis/impl/reorder/ReorderAxis.xtend
@@ -4,10 +4,11 @@
 import java.util.List
 import java.util.Map
 import org.eclipse.nebula.widgets.nattable.core.layer.axis.Axis
+import org.eclipse.nebula.widgets.nattable.core.layer.axis.impl.AbstractAxis
 
 import static extension org.eclipse.nebula.widgets.nattable.core.layer.axis.AxisInvariants.*
 
-class ReorderAxis implements Axis {
+class ReorderAxis extends AbstractAxis {
 	
 	val List<Serializable> reorderedSegmentIds = newArrayList
 	val Map<Integer, Integer> segmentPositionToStartPixelMap = newHashMap
diff --git a/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/AbstractLayer.xtend b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/AbstractLayer.xtend
index d5649b1..311a54c 100644
--- a/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/AbstractLayer.xtend
+++ b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/AbstractLayer.xtend
@@ -1,34 +1,8 @@
 package org.eclipse.nebula.widgets.nattable.core.layer.impl
 
-import java.util.LinkedHashSet
-import java.util.Set
+import org.eclipse.nebula.widgets.nattable.core.event.AbstractEventSourceSink
 import org.eclipse.nebula.widgets.nattable.core.layer.Layer
-import org.eclipse.nebula.widgets.nattable.core.layer.LayerEvent
-import org.eclipse.nebula.widgets.nattable.core.layer.LayerListener
 
-abstract class AbstractLayer implements Layer {
-	
-	val Set<LayerListener> listeners = new LinkedHashSet
-	
-	// Layer interface
-	
-	override addLayerListener(LayerListener listener) { listeners.add(listener) }
-	override removeLayerListener(LayerListener listener) { listeners.remove(listener) }
-	
-	// LayerListener interface
-	
-	override handleLayerEvent(LayerEvent event) {
-		fireLayerEvent(event);
-	}
-	
-	//
-	
-	/**
-	 * Pass the event to all the {@link LayerListener}s registered on this layer.
-	 */
-	def fireLayerEvent(LayerEvent event) {
-		for (listener : listeners)
-			listener.handleLayerEvent(event)
-	}
+abstract class AbstractLayer extends AbstractEventSourceSink implements Layer {
 	
 }
\ No newline at end of file
diff --git a/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/DimensionallyDependentLayer.xtend b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/DimensionallyDependentLayer.xtend
index 56a8769..7cccb08 100644
--- a/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/DimensionallyDependentLayer.xtend
+++ b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/DimensionallyDependentLayer.xtend
@@ -20,10 +20,12 @@
 	
 	def void setHorizontalAxis(Axis horizontalAxis) {
 		this.horizontalAxis = horizontalAxis
+		this.horizontalAxis.addEventListener(this)
 	}
 	
 	def void setVerticalAxis(Axis verticalAxis) {
 		this.verticalAxis = verticalAxis
+		this.verticalAxis.addEventListener(this)
 	}
 	
 	def void setLayerDataAccessor(LayerDataAccessor layerDataAccessor) {
diff --git a/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/DummyLayer.xtend b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/DummyLayer.xtend
index eff6162..331bc60 100644
--- a/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/DummyLayer.xtend
+++ b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/DummyLayer.xtend
@@ -20,10 +20,12 @@
 
 	def void setHorizontalAxis(Axis horizontalAxis) {
 		this.horizontalAxis = horizontalAxis
+		this.horizontalAxis.addEventListener(this)
 	}
 	
 	def void setVerticalAxis(Axis verticalAxis) {
 		this.verticalAxis = verticalAxis
+		this.verticalAxis.addEventListener(this)
 	}
 	
 	// Layer interface
diff --git a/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/ListRowDataLayer.xtend b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/ListRowDataLayer.xtend
index 7885145..6bd5968 100644
--- a/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/ListRowDataLayer.xtend
+++ b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/ListRowDataLayer.xtend
@@ -33,6 +33,7 @@
 	
 	def void setHorizontalAxis(Axis horizontalAxis) {
 		this.horizontalAxis = horizontalAxis
+		this.horizontalAxis.addEventListener(this)
 	}
 	
 	def void setObjectPropertyAccessor(ObjectPropertyAccessor objectPropertyAccessor) {
diff --git a/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/composite/CompositeAxis.xtend b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/composite/CompositeAxis.xtend
index aaae4c4..26728af 100644
--- a/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/composite/CompositeAxis.xtend
+++ b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/composite/CompositeAxis.xtend
@@ -1,14 +1,14 @@
 package org.eclipse.nebula.widgets.nattable.core.layer.impl.composite
 
 import java.io.Serializable
-import org.eclipse.nebula.widgets.nattable.core.layer.axis.Axis
+import org.eclipse.nebula.widgets.nattable.core.layer.axis.impl.AbstractAxis
 
 import static extension org.eclipse.nebula.widgets.nattable.core.layer.axis.AxisInvariants.*
 
 /**
  * Represents the axis of a CompositeLayer, which is composed of an amalgamation of the axes of the CompsiteLayer's sublayers.
  */
-class CompositeAxis implements Axis {
+class CompositeAxis extends AbstractAxis {
 	
 	val SubLayerAccessor subLayerAccessor
 	val extension AxisAccessor axisAccessor
diff --git a/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/composite/CompositeLayer.xtend b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/composite/CompositeLayer.xtend
index 942fe28..ea20a2d 100644
--- a/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/composite/CompositeLayer.xtend
+++ b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/composite/CompositeLayer.xtend
@@ -34,9 +34,7 @@
 	def addRow(Layer...childLayers) {
 		compositeRows += new CompositeRow => [
 			for (childLayer : childLayers) {
-				childLayer.addLayerListener [
-					
-				]
+				childLayer.addEventListener(this)
 				it.childLayers += childLayer
 			}
 		]
diff --git a/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/header/ColumnHeaderLayer.xtend b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/header/ColumnHeaderLayer.xtend
index 32a0042..08987dc 100644
--- a/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/header/ColumnHeaderLayer.xtend
+++ b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/header/ColumnHeaderLayer.xtend
@@ -27,6 +27,7 @@
 	
 	def void setHorizontalAxis(Axis horizontalAxis) {
 		this.horizontalAxis = horizontalAxis
+		this.horizontalAxis.addEventListener(this)
 	}
 	
 	def void setLayerDataAccessor(LayerDataAccessor layerDataAccessor) {
diff --git a/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/header/RowHeaderLayer.xtend b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/header/RowHeaderLayer.xtend
index abb60cf..39b3077 100644
--- a/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/header/RowHeaderLayer.xtend
+++ b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/header/RowHeaderLayer.xtend
@@ -27,6 +27,7 @@
 	
 	def void setVerticalAxis(Axis verticalAxis) {
 		this.verticalAxis = verticalAxis
+		this.verticalAxis.addEventListener(this)
 	}
 	
 	def void setLayerDataAccessor(LayerDataAccessor layerDataAccessor) {
diff --git a/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/viewport/ScrollEvent.xtend b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/viewport/ScrollEvent.xtend
new file mode 100644
index 0000000..2033a7a
--- /dev/null
+++ b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/viewport/ScrollEvent.xtend
@@ -0,0 +1,7 @@
+package org.eclipse.nebula.widgets.nattable.core.layer.impl.viewport
+
+import org.eclipse.nebula.widgets.nattable.core.event.Event
+
+class ScrollEvent implements Event {
+	
+}
\ No newline at end of file
diff --git a/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/viewport/ViewportAxis.xtend b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/viewport/ViewportAxis.xtend
index f3e596b..db6dfe7 100644
--- a/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/viewport/ViewportAxis.xtend
+++ b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/viewport/ViewportAxis.xtend
@@ -3,8 +3,9 @@
 import java.io.Serializable
 import org.eclipse.nebula.widgets.nattable.core.geometry.PixelRange
 import org.eclipse.nebula.widgets.nattable.core.layer.axis.Axis
+import org.eclipse.nebula.widgets.nattable.core.layer.axis.impl.AbstractAxis
 
-class ViewportAxis implements Axis {
+class ViewportAxis extends AbstractAxis {
 	
 	val Axis underlyingAxis
 	
@@ -14,17 +15,25 @@
 	 */
 	val PixelRange visiblePixelRange
 	
+	val ViewportAxisListener viewportAxisListener
+	
 	int pixelOrigin
 	
-	new(Axis underlyingAxis, PixelRange visiblePixelRange) {
+	new(Axis underlyingAxis, PixelRange visiblePixelRange, ViewportAxisListener viewportAxisListener) {
 		this.underlyingAxis = underlyingAxis
 		this.visiblePixelRange = visiblePixelRange
+		this.viewportAxisListener = viewportAxisListener
 	}
 	
+	def getUnderlyingAxis() { underlyingAxis }
+	
+	def getVisiblePixelRange() { visiblePixelRange }
+	
 	def getPixelOrigin() { pixelOrigin }
 	
 	def void setPixelOrigin(int pixelOrigin) {
 		this.pixelOrigin = pixelOrigin
+		viewportAxisListener.viewportAxisChanged
 	}
 	
 	def int getOriginSegmentPosition() {
diff --git a/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/viewport/ViewportAxisListener.xtend b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/viewport/ViewportAxisListener.xtend
new file mode 100644
index 0000000..efeaf97
--- /dev/null
+++ b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/viewport/ViewportAxisListener.xtend
@@ -0,0 +1,7 @@
+package org.eclipse.nebula.widgets.nattable.core.layer.impl.viewport
+
+interface ViewportAxisListener {
+	
+	def void viewportAxisChanged()
+	
+}
\ No newline at end of file
diff --git a/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/viewport/ViewportLayer.xtend b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/viewport/ViewportLayer.xtend
index 1dd1758..85a9c5c 100644
--- a/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/viewport/ViewportLayer.xtend
+++ b/NatTable/src/org/eclipse/nebula/widgets/nattable/core/layer/impl/viewport/ViewportLayer.xtend
@@ -18,11 +18,12 @@
 	
 	def void setUnderlyingLayer(Layer underlyingLayer) {
 		this.underlyingLayer = underlyingLayer
+		this.underlyingLayer.addEventListener(this)
 	}
 	
 	def void setPixelArea(PixelArea pixelArea) {
-		this.horizontalViewportAxis = new ViewportAxis(underlyingLayer.horizontalAxis, pixelArea.horizontalPixelRange)
-		this.verticalViewportAxis = new ViewportAxis(underlyingLayer.verticalAxis, pixelArea.verticalPixelRange)
+		horizontalViewportAxis = new ViewportAxis(underlyingLayer.horizontalAxis, pixelArea.horizontalPixelRange, [| fireEvent(new ScrollEvent) ])
+		verticalViewportAxis = new ViewportAxis(underlyingLayer.verticalAxis, pixelArea.verticalPixelRange, [| fireEvent(new ScrollEvent) ])
 	}
 	
 	// Layer interface
diff --git a/NatTable/src/org/eclipse/nebula/widgets/nattable/renderer/swt/layer/viewport/SWTViewportLayerPainter.xtend b/NatTable/src/org/eclipse/nebula/widgets/nattable/renderer/swt/layer/viewport/SWTViewportLayerPainter.xtend
index 12b6f2d..31f364c 100644
--- a/NatTable/src/org/eclipse/nebula/widgets/nattable/renderer/swt/layer/viewport/SWTViewportLayerPainter.xtend
+++ b/NatTable/src/org/eclipse/nebula/widgets/nattable/renderer/swt/layer/viewport/SWTViewportLayerPainter.xtend
@@ -3,6 +3,7 @@
 import org.eclipse.nebula.widgets.nattable.core.graphics.GraphicsContext
 import org.eclipse.nebula.widgets.nattable.core.layer.LayerPainter
 import org.eclipse.nebula.widgets.nattable.core.layer.impl.GridLineCellLayerPainter
+import org.eclipse.nebula.widgets.nattable.core.layer.impl.viewport.ViewportAxis
 import org.eclipse.nebula.widgets.nattable.core.layer.impl.viewport.ViewportLayer
 import org.eclipse.nebula.widgets.nattable.renderer.swt.geometry.SWTControlPixelArea
 import org.eclipse.nebula.widgets.nattable.renderer.swt.graphics.SWTGraphicsContext
@@ -24,13 +25,22 @@
 			
 			viewportLayer.pixelArea = new SWTControlPixelArea(viewportCanvas)
 			
-			viewportCanvas.horizontalBar.addListener(SWT::Selection, [ event | println(event) ])
-			viewportCanvas.verticalBar.addListener(SWT::Selection, [ event | println(event) ])
 			viewportCanvas.addPaintListener([ event | defaultPainter.paintLayer(viewportLayer, new SWTGraphicsContext(viewportCanvas, event.gc)) ])
+			
+			val horizontalScrollBarHandler = new ScrollBarHandler(viewportCanvas.horizontalBar, viewportLayer.horizontalAxis as ViewportAxis)
+			val verticalScrollBarHandler = new ScrollBarHandler(viewportCanvas.verticalBar, viewportLayer.verticalAxis as ViewportAxis)
+			
+			viewportCanvas.horizontalBar.addListener(SWT::Selection, horizontalScrollBarHandler)
+			viewportCanvas.verticalBar.addListener(SWT::Selection, verticalScrollBarHandler)
+			
+			viewportCanvas.horizontalBar.addDisposeListener([ viewportCanvas.horizontalBar.removeListener(SWT::Selection, horizontalScrollBarHandler) ])
+			viewportCanvas.verticalBar.addDisposeListener([ viewportCanvas.verticalBar.removeListener(SWT::Selection, verticalScrollBarHandler) ])
+			
+			viewportCanvas.addListener(SWT::Resize, [ event | horizontalScrollBarHandler.recalculateScrollBarSize; verticalScrollBarHandler.recalculateScrollBarSize ])
 		}
 		
 		val clipBounds = swtGC.SWTGC.clipping
 		viewportCanvas.bounds = new Rectangle(clipBounds.x, clipBounds.y, clipBounds.width, clipBounds.height)
 	}
 	
-}
\ No newline at end of file
+}
diff --git a/NatTable/src/org/eclipse/nebula/widgets/nattable/renderer/swt/layer/viewport/ScrollBarHandler.xtend b/NatTable/src/org/eclipse/nebula/widgets/nattable/renderer/swt/layer/viewport/ScrollBarHandler.xtend
new file mode 100644
index 0000000..4628d5e
--- /dev/null
+++ b/NatTable/src/org/eclipse/nebula/widgets/nattable/renderer/swt/layer/viewport/ScrollBarHandler.xtend
@@ -0,0 +1,60 @@
+package org.eclipse.nebula.widgets.nattable.renderer.swt.layer.viewport
+
+import org.eclipse.nebula.widgets.nattable.core.layer.impl.viewport.ViewportAxis
+import org.eclipse.swt.widgets.Event
+import org.eclipse.swt.widgets.Listener
+import org.eclipse.swt.widgets.ScrollBar
+
+import static extension org.eclipse.nebula.widgets.nattable.core.layer.axis.AxisInvariants.*
+
+class ScrollBarHandler implements Listener {
+	
+	val ScrollBar scrollBar
+	val ViewportAxis viewportAxis
+
+	new(ScrollBar scrollBar, ViewportAxis viewportAxis) {
+		this.scrollBar = scrollBar
+		this.viewportAxis = viewportAxis
+	}
+
+	override handleEvent(Event event) {
+		viewportAxis.pixelOrigin = /*viewportAxis.minimumOrigin +*/ scrollBar.selection
+		scrollBar.increment = scrollIncrement
+		adjustScrollBar
+	}
+
+	def void adjustScrollBar() {
+		scrollBar.selection = viewportAxis.pixelOrigin /*- viewportAxis.minimumOrigin*/
+	}
+
+	def void recalculateScrollBarSize() {
+		val max = viewportAxis.underlyingAxis.pixelSize /*- viewportAxis.minimumOrigin*/
+		
+		scrollBar.maximum = max
+		
+		val visiblePixelSize = viewportAxis.visiblePixelRange.pixelSize
+		
+		var thumbSize = 0
+		if (visiblePixelSize < max && visiblePixelSize != 0) {
+			thumbSize = visiblePixelSize
+			scrollBar.enabled = true
+			scrollBar.visible = true
+			
+			scrollBar.increment = scrollIncrement
+			
+			scrollBar.pageIncrement = visiblePixelSize
+		} else {
+			thumbSize = max
+			scrollBar.enabled = false
+			scrollBar.visible = false
+		}
+		scrollBar.thumb = thumbSize
+		
+		adjustScrollBar
+	}
+	
+	def int getScrollIncrement() {
+		Math::min(viewportAxis.getPixelSizeOfSegmentPosition(0), viewportAxis.visiblePixelRange.pixelSize / 4)
+	}
+	
+}
\ No newline at end of file
diff --git a/NatTable/test/org/eclipse/nebula/widgets/nattable/renderer/swt/SWTExample.xtend b/NatTable/test/org/eclipse/nebula/widgets/nattable/renderer/swt/SWTExample.xtend
index c5a09b7..fa189b8 100644
--- a/NatTable/test/org/eclipse/nebula/widgets/nattable/renderer/swt/SWTExample.xtend
+++ b/NatTable/test/org/eclipse/nebula/widgets/nattable/renderer/swt/SWTExample.xtend
@@ -76,6 +76,7 @@
 				addRow(cornerLayer, columnHeaderLayer)
 				addRow(rowHeaderLayer, bodyLayer)
 			]
+			layer.addEventListener([ event | println("hey! " + event) ])
 		]
 	}