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
deleted file mode 100644
index b45b31a..0000000
--- a/org.eclipse.nebula.widgets.nattable.renderer.javafx.example/src/org/eclipse/nebula/widgets/nattable/renderer/javafx/example/JavaFXExample.xtend
+++ /dev/null
@@ -1,66 +0,0 @@
-package org.eclipse.nebula.widgets.nattable.renderer.javafx.example
-
-import javafx.application.Application
-import javafx.scene.Scene
-import javafx.scene.layout.Pane
-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 {
-	
-	def static void main(String[] args) {
-        launch(args)
-    }
-    
-    //
-    
-    override start(Stage primaryStage) {
-        primaryStage.title = "NatTable -> JavaFX"
-        val root = new Pane
-        
-        val natTable = new JavaFXNatTable(layer)
-        
-        root.children += natTable
-
-        primaryStage.scene = new Scene(root, 500, 400)
-        primaryStage.show
-        
-        natTable.widthProperty.bind(root.widthProperty)
-        natTable.heightProperty.bind(root.heightProperty)
-    }
-    
-	def Layer getLayer() {
-		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/TreeViewSample.java b/org.eclipse.nebula.widgets.nattable.renderer.javafx.example/src/org/eclipse/nebula/widgets/nattable/renderer/javafx/example/TreeViewSample.java
deleted file mode 100644
index 3ff4d17..0000000
--- a/org.eclipse.nebula.widgets.nattable.renderer.javafx.example/src/org/eclipse/nebula/widgets/nattable/renderer/javafx/example/TreeViewSample.java
+++ /dev/null
@@ -1,184 +0,0 @@
-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/style.css b/org.eclipse.nebula.widgets.nattable.renderer.javafx.example/src/style.css
index 477d90e..9560c0e 100644
--- a/org.eclipse.nebula.widgets.nattable.renderer.javafx.example/src/style.css
+++ b/org.eclipse.nebula.widgets.nattable.renderer.javafx.example/src/style.css
@@ -1,11 +1,3 @@
-.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;
