JavaFXNatExampleRunner
diff --git a/org.eclipse.nebula.widgets.nattable.core.example/src/org/eclipse/nebula/widgets/nattable/core/example/impl/index.properties b/org.eclipse.nebula.widgets.nattable.core.example/src/org/eclipse/nebula/widgets/nattable/core/example/impl/index.properties
index 8b0c496..b48e201 100644
--- a/org.eclipse.nebula.widgets.nattable.core.example/src/org/eclipse/nebula/widgets/nattable/core/example/impl/index.properties
+++ b/org.eclipse.nebula.widgets.nattable.core.example/src/org/eclipse/nebula/widgets/nattable/core/example/impl/index.properties
@@ -1,3 +1,3 @@
 GridLayer=org.eclipse.nebula.widgets.nattable.core.example.impl.GridLayer
+SmallLayerExample=org.eclipse.nebula.widgets.nattable.core.example.impl.SmallLayerExample|A little example
 big=|Huge examples
-SmallLayerExample=org.eclipse.nebula.widgets.nattable.core.example.impl.SmallLayerExample
diff --git a/org.eclipse.nebula.widgets.nattable.renderer.javafx.example/META-INF/MANIFEST.MF b/org.eclipse.nebula.widgets.nattable.renderer.javafx.example/META-INF/MANIFEST.MF
index aea7455..6d41089 100644
--- a/org.eclipse.nebula.widgets.nattable.renderer.javafx.example/META-INF/MANIFEST.MF
+++ b/org.eclipse.nebula.widgets.nattable.renderer.javafx.example/META-INF/MANIFEST.MF
@@ -5,3 +5,4 @@
 Bundle-Version: 2.0.0.qualifier
 Fragment-Host: org.eclipse.nebula.widgets.nattable.renderer.javafx;bundle-version="2.0.0"
 Bundle-RequiredExecutionEnvironment: JavaSE-1.7
+Require-Bundle: org.eclipse.nebula.widgets.nattable.core.example;bundle-version="1.0.0"
diff --git a/org.eclipse.nebula.widgets.nattable.renderer.javafx.example/src/org/eclipse/nebula/widgets/nattable/renderer/javafx/example/JavaFXExample.xtend b/org.eclipse.nebula.widgets.nattable.renderer.javafx.example/src/org/eclipse/nebula/widgets/nattable/renderer/javafx/example/JavaFXExample.xtend
index 4af9382..b45b31a 100644
--- a/org.eclipse.nebula.widgets.nattable.renderer.javafx.example/src/org/eclipse/nebula/widgets/nattable/renderer/javafx/example/JavaFXExample.xtend
+++ b/org.eclipse.nebula.widgets.nattable.renderer.javafx.example/src/org/eclipse/nebula/widgets/nattable/renderer/javafx/example/JavaFXExample.xtend
@@ -6,7 +6,15 @@
 import javafx.stage.Stage
 import org.eclipse.nebula.widgets.nattable.core.layer.Layer
 import org.eclipse.nebula.widgets.nattable.core.layer.axis.impl.AxisImpl
+import org.eclipse.nebula.widgets.nattable.core.layer.axis.impl.hideshow.HideShowAxis
+import org.eclipse.nebula.widgets.nattable.core.layer.axis.impl.reorder.ReorderAxis
+import org.eclipse.nebula.widgets.nattable.core.layer.impl.DimensionallyDependentLayer
 import org.eclipse.nebula.widgets.nattable.core.layer.impl.DummyLayer
+import org.eclipse.nebula.widgets.nattable.core.layer.impl.LayerDataAccessorImpl
+import org.eclipse.nebula.widgets.nattable.core.layer.impl.composite.CompositeLayer
+import org.eclipse.nebula.widgets.nattable.core.layer.impl.header.ColumnHeaderLayer
+import org.eclipse.nebula.widgets.nattable.core.layer.impl.header.RowHeaderLayer
+import org.eclipse.nebula.widgets.nattable.core.layer.impl.viewport.ViewportLayer
 import org.eclipse.nebula.widgets.nattable.renderer.javafx.JavaFXNatTable
 
 class JavaFXExample extends Application {
@@ -15,15 +23,17 @@
         launch(args)
     }
     
+    //
+    
     override start(Stage primaryStage) {
         primaryStage.title = "NatTable -> JavaFX"
         val root = new Pane
         
-        val natTable = new JavaFXNatTable(layer, 300, 250)
+        val natTable = new JavaFXNatTable(layer)
         
         root.children += natTable
 
-        primaryStage.scene = new Scene(root)
+        primaryStage.scene = new Scene(root, 500, 400)
         primaryStage.show
         
         natTable.widthProperty.bind(root.widthProperty)
@@ -31,10 +41,26 @@
     }
     
 	def Layer getLayer() {
-    	new DummyLayer(
-    		new AxisImpl(4, 200),
-    		new AxisImpl(4, 100)
-    	)
+		val bodyLayer = new ViewportLayer(new DummyLayer(
+			// Horizontal axis
+			new ReorderAxis(
+				new AxisImpl(10, 200) => [ setPixelSizeOfSegmentPosition(100, 0) ]
+			) => [ reorderSegmentPosition(0, 2) ],
+			
+			// Vertical axis
+			new HideShowAxis(
+				new AxisImpl(10, 100) => [ setPixelSizeOfSegmentPosition(200, 2) ]
+			) => [ hideSegmentId(0) ]
+		))
+
+		val columnHeaderLayer = new ColumnHeaderLayer(bodyLayer.horizontalAxis, new LayerDataAccessorImpl([ layer, columnId, rowId | columnId ]))
+		val rowHeaderLayer = new RowHeaderLayer(bodyLayer.verticalAxis, new LayerDataAccessorImpl([ layer, columnId, rowId | rowId ]))
+		val cornerLayer = new DimensionallyDependentLayer(rowHeaderLayer.horizontalAxis, columnHeaderLayer.verticalAxis, new LayerDataAccessorImpl([ layer, columnId, rowId | "" ]))
+		
+		new CompositeLayer => [
+			addRow(cornerLayer, columnHeaderLayer)
+			addRow(rowHeaderLayer, bodyLayer)
+		]
     }
     
 }
diff --git a/org.eclipse.nebula.widgets.nattable.renderer.javafx.example/src/org/eclipse/nebula/widgets/nattable/renderer/javafx/example/JavaFXNatExamplesRunner.xtend b/org.eclipse.nebula.widgets.nattable.renderer.javafx.example/src/org/eclipse/nebula/widgets/nattable/renderer/javafx/example/JavaFXNatExamplesRunner.xtend
new file mode 100644
index 0000000..56810a6
--- /dev/null
+++ b/org.eclipse.nebula.widgets.nattable.renderer.javafx.example/src/org/eclipse/nebula/widgets/nattable/renderer/javafx/example/JavaFXNatExamplesRunner.xtend
@@ -0,0 +1,127 @@
+package org.eclipse.nebula.widgets.nattable.renderer.javafx.example
+
+import java.util.HashSet
+import javafx.application.Application
+import javafx.geometry.Pos
+import javafx.scene.Scene
+import javafx.scene.control.Label
+import javafx.scene.control.Tab
+import javafx.scene.control.TabPane
+import javafx.scene.control.TreeCell
+import javafx.scene.control.TreeItem
+import javafx.scene.control.TreeView
+import javafx.scene.image.Image
+import javafx.scene.image.ImageView
+import javafx.scene.layout.BorderPane
+import javafx.scene.layout.StackPane
+import javafx.stage.Stage
+import org.eclipse.nebula.widgets.nattable.core.example.index.NatExamplesIndex
+import org.eclipse.nebula.widgets.nattable.core.example.index.node.CategoryNode
+import org.eclipse.nebula.widgets.nattable.core.example.index.node.IndexNode
+import org.eclipse.nebula.widgets.nattable.core.example.index.node.NatExampleNode
+import org.eclipse.nebula.widgets.nattable.renderer.javafx.JavaFXNatTable
+
+class JavaFXNatExamplesRunner extends Application {
+	
+	def static void main(String[] args) {
+        launch(args)
+	}
+	
+	//
+	
+    val nodeImage = new Image(class.getResourceAsStream("opened_folder.png"))
+    val rootTreeItem = new TreeItem<IndexNode>(NatExamplesIndex::rootNode, new ImageView(nodeImage))
+	val tabPane = new TabPane
+	
+	val exampleNodes = new HashSet<NatExampleNode>
+	
+	override start(Stage primaryStage) throws Exception {
+        primaryStage.title = "NatTable -> JavaFX"
+        val grid = new BorderPane
+        
+        // Nav tree
+        val indexNode = NatExamplesIndex::rootNode
+        indexNode.createTreeItem(rootTreeItem)
+	    grid.left = new TreeView<IndexNode>(rootTreeItem) => [
+	    	showRoot = false
+        	editable = true
+        	cellFactory = [ treeView | new NavTreeCell(this) as TreeCell<IndexNode> ]
+       	]
+		
+		// Example pane
+	    grid.center = tabPane
+        
+        val scene = new Scene(grid, 1000, 600)
+        scene.stylesheets += "style.css"
+        primaryStage.scene = scene
+        primaryStage.show
+
+		// Stop
+		for (exampleNode : exampleNodes)
+			exampleNode.natExample.stop
+	}
+	
+	def void createTreeItem(IndexNode indexNode, TreeItem<IndexNode> treeItem) {
+		for (childIndexNodeName : indexNode.childNodeNames) {
+			val childIndexNode = indexNode.getChildNode(childIndexNodeName)
+			val childTreeItem = switch (childIndexNode) {
+				NatExampleNode: new TreeItem<IndexNode>(childIndexNode)
+				CategoryNode: new TreeItem<IndexNode>(childIndexNode, new ImageView(nodeImage))
+			}
+			childIndexNode.createTreeItem(childTreeItem)
+			treeItem.children += childTreeItem
+		}
+	}
+	
+	def void openExampleInTab(NatExampleNode node) {
+		exampleNodes += node
+		
+		tabPane.tabs += new Tab => [
+			text = node.displayName
+			
+			content = new BorderPane => [
+				// Create example control
+				center = new StackPane => [
+					val centerPane = it
+					children += new JavaFXNatTable(node.natExample.createLayer) => [
+				        widthProperty.bind(centerPane.widthProperty)
+				        heightProperty.bind(centerPane.heightProperty)
+			        ]
+				]
+				
+				// Description
+				val description = node.natExample.description
+				if (description != null && description.length() > 0) {
+					bottom = new StackPane => [
+						children += new Label(" Description ") => [
+						    styleClass += "bordered-titled-title"
+			    			StackPane::setAlignment(it, Pos::TOP_LEFT)
+						]
+						
+					    children += new StackPane => [
+						    children += new Label(description) => [
+						    	styleClass += "bordered-titled-content"
+						    ]
+					    ]
+						
+					    styleClass += "bordered-titled-border"
+					]
+				}
+			]
+			
+			onClosed = [
+				// Stop
+				node.natExample.stop
+				
+				// Remove from map
+				exampleNodes.remove(node)
+			]
+			
+			tabPane.selectionModel.select(it)
+		]
+		
+		// Start
+		node.natExample.start
+	}
+	
+}
\ No newline at end of file
diff --git a/org.eclipse.nebula.widgets.nattable.renderer.javafx.example/src/org/eclipse/nebula/widgets/nattable/renderer/javafx/example/NavTreeCell.xtend b/org.eclipse.nebula.widgets.nattable.renderer.javafx.example/src/org/eclipse/nebula/widgets/nattable/renderer/javafx/example/NavTreeCell.xtend
new file mode 100644
index 0000000..5eb2374
--- /dev/null
+++ b/org.eclipse.nebula.widgets.nattable.renderer.javafx.example/src/org/eclipse/nebula/widgets/nattable/renderer/javafx/example/NavTreeCell.xtend
@@ -0,0 +1,37 @@
+package org.eclipse.nebula.widgets.nattable.renderer.javafx.example
+
+import javafx.scene.control.TreeCell
+import org.eclipse.nebula.widgets.nattable.core.example.index.node.IndexNode
+import org.eclipse.nebula.widgets.nattable.core.example.index.node.NatExampleNode
+
+class NavTreeCell extends TreeCell<IndexNode> {
+
+	val JavaFXNatExamplesRunner runner
+	
+	new(JavaFXNatExamplesRunner runner) {
+		this.runner = runner
+	}
+	
+	override startEdit() {
+		super.startEdit
+		
+		if (item instanceof NatExampleNode)
+			runner.openExampleInTab(item as NatExampleNode)
+	}
+
+	override updateItem(IndexNode item, boolean empty) {
+		super.updateItem(item, empty)
+
+		if (empty) {
+			text = null
+			graphic = null
+		} else {
+			text = string
+			graphic = treeItem.graphic
+		}
+	}
+
+	def private String getString() {
+		item?.displayName ?: ""
+	}
+}
diff --git a/org.eclipse.nebula.widgets.nattable.renderer.javafx.example/src/org/eclipse/nebula/widgets/nattable/renderer/javafx/example/TreeViewSample.java b/org.eclipse.nebula.widgets.nattable.renderer.javafx.example/src/org/eclipse/nebula/widgets/nattable/renderer/javafx/example/TreeViewSample.java
new file mode 100644
index 0000000..3ff4d17
--- /dev/null
+++ b/org.eclipse.nebula.widgets.nattable.renderer.javafx.example/src/org/eclipse/nebula/widgets/nattable/renderer/javafx/example/TreeViewSample.java
@@ -0,0 +1,184 @@
+package org.eclipse.nebula.widgets.nattable.renderer.javafx.example;
+import java.util.Arrays;
+import java.util.List;
+
+import javafx.application.Application;
+import javafx.beans.property.SimpleStringProperty;
+import javafx.event.EventHandler;
+import javafx.scene.Node;
+import javafx.scene.Scene;
+import javafx.scene.control.TextField;
+import javafx.scene.control.TreeCell;
+import javafx.scene.control.TreeItem;
+import javafx.scene.control.TreeView;
+import javafx.scene.image.Image;
+import javafx.scene.image.ImageView;
+import javafx.scene.input.KeyCode;
+import javafx.scene.input.KeyEvent;
+import javafx.scene.layout.VBox;
+import javafx.scene.paint.Color;
+import javafx.stage.Stage;
+import javafx.util.Callback;
+ 
+public class TreeViewSample extends Application {
+ 
+    private final Node rootIcon = 
+        new ImageView(new Image(getClass().getResourceAsStream("opened_folder.png")));
+    private final Image depIcon = 
+        new Image(getClass().getResourceAsStream("opened_folder.png"));
+    List<Employee> employees = Arrays.<Employee>asList(
+            new Employee("Ethan Williams", "Sales Department"),
+            new Employee("Emma Jones", "Sales Department"),
+            new Employee("Michael Brown", "Sales Department"),
+            new Employee("Anna Black", "Sales Department"),
+            new Employee("Rodger York", "Sales Department"),
+            new Employee("Susan Collins", "Sales Department"),
+            new Employee("Mike Graham", "IT Support"),
+            new Employee("Judy Mayer", "IT Support"),
+            new Employee("Gregory Smith", "IT Support"),
+            new Employee("Jacob Smith", "Accounts Department"),
+            new Employee("Isabella Johnson", "Accounts Department"));
+    TreeItem<String> rootNode = 
+        new TreeItem<String>("MyCompany Human Resources", rootIcon);
+ 
+    public static void main(String[] args) {
+        Application.launch(args);
+    }
+ 
+    @Override
+    public void start(Stage stage) {
+        rootNode.setExpanded(true);
+        for (Employee employee : employees) {
+            TreeItem<String> empLeaf = new TreeItem<String>(employee.getName());
+            boolean found = false;
+            for (TreeItem<String> depNode : rootNode.getChildren()) {
+                if (depNode.getValue().contentEquals(employee.getDepartment())){
+                    depNode.getChildren().add(empLeaf);
+                    found = true;
+                    break;
+                }
+            }
+            if (!found) {
+                TreeItem<String> depNode = new TreeItem<String>(
+                    employee.getDepartment(), 
+                    new ImageView(depIcon)
+                );
+                rootNode.getChildren().add(depNode);
+                depNode.getChildren().add(empLeaf);
+            }
+        }
+ 
+        stage.setTitle("Tree View Sample");
+        VBox box = new VBox();
+        final Scene scene = new Scene(box, 400, 300);
+        scene.setFill(Color.LIGHTGRAY);
+ 
+        TreeView<String> treeView = new TreeView<String>(rootNode);
+        treeView.setEditable(true);
+        treeView.setCellFactory(new Callback<TreeView<String>,TreeCell<String>>(){
+            @Override
+            public TreeCell<String> call(TreeView<String> p) {
+                return new TextFieldTreeCellImpl();
+            }
+        });
+ 
+        box.getChildren().add(treeView);
+        stage.setScene(scene);
+        stage.show();
+    }
+ 
+    private final class TextFieldTreeCellImpl extends TreeCell<String> {
+ 
+        private TextField textField;
+ 
+        public TextFieldTreeCellImpl() {
+        }
+ 
+        @Override
+        public void startEdit() {
+            super.startEdit();
+ 
+            if (textField == null) {
+            	System.out.println("edit!");
+                createTextField();
+            }
+            setText(null);
+            setGraphic(textField);
+            textField.selectAll();
+        }
+ 
+        @Override
+        public void cancelEdit() {
+            super.cancelEdit();
+            setText((String) getItem());
+            setGraphic(getTreeItem().getGraphic());
+        }
+ 
+        @Override
+        public void updateItem(String item, boolean empty) {
+            super.updateItem(item, empty);
+ 
+            if (empty) {
+                setText(null);
+                setGraphic(null);
+            } else {
+                if (isEditing()) {
+                    if (textField != null) {
+                        textField.setText(getString());
+                    }
+                    setText(null);
+                    setGraphic(textField);
+                } else {
+                    setText(getString());
+                    setGraphic(getTreeItem().getGraphic());
+                }
+            }
+        }
+ 
+        private void createTextField() {
+            textField = new TextField(getString());
+            textField.setOnKeyReleased(new EventHandler<KeyEvent>() {
+ 
+                @Override
+                public void handle(KeyEvent t) {
+                    if (t.getCode() == KeyCode.ENTER) {
+                        commitEdit(textField.getText());
+                    } else if (t.getCode() == KeyCode.ESCAPE) {
+                        cancelEdit();
+                    }
+                }
+            });
+        }
+ 
+        private String getString() {
+            return getItem() == null ? "" : getItem().toString();
+        }
+    }
+ 
+    public static class Employee {
+ 
+        private final SimpleStringProperty name;
+        private final SimpleStringProperty department;
+ 
+        private Employee(String name, String department) {
+            this.name = new SimpleStringProperty(name);
+            this.department = new SimpleStringProperty(department);
+        }
+ 
+        public String getName() {
+            return name.get();
+        }
+ 
+        public void setName(String fName) {
+            name.set(fName);
+        }
+ 
+        public String getDepartment() {
+            return department.get();
+        }
+ 
+        public void setDepartment(String fName) {
+            department.set(fName);
+        }
+    }
+}
\ No newline at end of file
diff --git a/org.eclipse.nebula.widgets.nattable.renderer.javafx.example/src/org/eclipse/nebula/widgets/nattable/renderer/javafx/example/opened_folder.png b/org.eclipse.nebula.widgets.nattable.renderer.javafx.example/src/org/eclipse/nebula/widgets/nattable/renderer/javafx/example/opened_folder.png
new file mode 100644
index 0000000..6f2c5f7
--- /dev/null
+++ b/org.eclipse.nebula.widgets.nattable.renderer.javafx.example/src/org/eclipse/nebula/widgets/nattable/renderer/javafx/example/opened_folder.png
Binary files differ
diff --git a/org.eclipse.nebula.widgets.nattable.renderer.javafx.example/src/style.css b/org.eclipse.nebula.widgets.nattable.renderer.javafx.example/src/style.css
new file mode 100644
index 0000000..477d90e
--- /dev/null
+++ b/org.eclipse.nebula.widgets.nattable.renderer.javafx.example/src/style.css
@@ -0,0 +1,24 @@
+.button1{
+    -fx-text-fill: #006464;
+    -fx-background-color: #DFB951;
+    -fx-border-radius: 20;
+    -fx-background-radius: 20;
+    -fx-padding: 5;
+}
+
+.bordered-titled-title {
+  -fx-background-color: white;
+  -fx-translate-y: -16;
+}
+
+.bordered-titled-border {
+  -fx-content-display: top;
+  -fx-border-insets: 20 15 15 15;
+  -fx-background-color: white;
+  -fx-border-color: black;
+  -fx-border-width: 2;
+}
+
+.bordered-titled-content {
+  -fx-padding: 26 10 10 10;
+}
\ No newline at end of file
diff --git a/org.eclipse.nebula.widgets.nattable.renderer.javafx/src/org/eclipse/nebula/widgets/nattable/renderer/javafx/JavaFXNatTable.xtend b/org.eclipse.nebula.widgets.nattable.renderer.javafx/src/org/eclipse/nebula/widgets/nattable/renderer/javafx/JavaFXNatTable.xtend
index fed9af0..9bd1cbd 100644
--- a/org.eclipse.nebula.widgets.nattable.renderer.javafx/src/org/eclipse/nebula/widgets/nattable/renderer/javafx/JavaFXNatTable.xtend
+++ b/org.eclipse.nebula.widgets.nattable.renderer.javafx/src/org/eclipse/nebula/widgets/nattable/renderer/javafx/JavaFXNatTable.xtend
@@ -16,8 +16,7 @@
 	
 	val Layer layer
 	
-	new(Layer layer, double width, double height) {
-		super(width, height)
+	new(Layer layer) {
 		this.layer = layer
 		
 		paintLayer