changeset 5218:0eb503d2b567 8.0-b110

Automated merge with ssh://jfxsrc.us.oracle.com//javafx/8.0/MASTER/jfx/rt
author jgodinez
date Tue, 01 Oct 2013 10:06:51 -0700
parents 6039c1e69ed7 ac845cbafb49
children 085053c47663 8207cae52078
files modules/graphics/src/main/docs/javafx/scene/doc-files/bounds-complex.png modules/graphics/src/main/java/com/sun/javafx/font/coretext/CFRange.java modules/graphics/src/main/java/javafx/scene/Node.java
diffstat 91 files changed, 1588 insertions(+), 931 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/experiments/DukePad/build.gradle	Tue Oct 01 10:06:51 2013 -0700
@@ -0,0 +1,179 @@
+defaultTasks "artifacts"
+
+subprojects {
+    apply plugin: 'java'
+    repositories {
+        mavenCentral()
+    }
+
+    dependencies {
+        compile files(
+            "${rootProject.file('equinox/plugins/org.eclipse.equinox.common_3.6.200.v20130402-1505.jar')}",
+            "${rootProject.file('equinox/plugins/org.eclipse.osgi_3.9.0.v20130529-1710.jar')}",
+            "${rootProject.file('equinox/plugins/org.eclipse.equinox.preferences_3.5.100.v20130422-1538.jar')}",
+        )
+        //compile group: 'org.ecilpse', name: 'equinox.preferences', version: '3.5.100.v20130422-1538'
+    }
+
+    jar {
+        manifest {
+            from "src/main/resources/META-INF/MANIFEST.MF"
+        }
+    }
+}
+
+project(":browser") {
+    dependencies {
+        compile project(":core")
+    }
+}
+
+project(":chess") {
+    dependencies {
+        compile project(":core")
+        compile group: "org.glassfish", name: "javax.json", version: "1.0.1"
+        compile group: "org.glassfish.tyrus", name: "tyrus-client", version: "1.0"
+        compile group: "org.glassfish.tyrus", name: "tyrus-container-grizzly", version: "1.0"
+        compile group: "javax", name: "javaee-web-api", version: "7.0"
+        testCompile group: "junit", name: "junit", version: "4.10"
+        testCompile group: "org.hamcrest", name: "hamcrest-core", version: "1.1"
+        compile group: "org.glassfish", name: "javax.json", version: "1.0.1"
+    }
+
+    sourceSets {
+        main {
+            java {
+                srcDir "${rootProject.file('../Chess/ChessLibrary/src/main/java')}"
+            }
+            resources {
+                srcDir "${rootProject.file('../Chess/ChessLibrary/src/main/resources')}"
+            }
+        }
+    }
+
+    sourceCompatibility = 1.8;
+    targetCompatibility = 1.8;
+}
+
+project(":calculator") {
+    dependencies {
+        compile project(":core")
+    }
+}
+
+project(":clock") {
+    dependencies {
+        compile project(":core")
+    }
+}
+
+project(":compass") {
+    dependencies {
+        compile project(":core")
+        compile group: "com.pi4j", name:"pi4j-core", version:"0.0.5"
+    }
+}
+
+project(":cubeGame") {
+    dependencies {
+        compile project(":core")
+    }
+}
+
+project(":lockScreen") {
+    dependencies {
+        compile project(":core")
+    }
+}
+
+project(":mediaPlayer") {
+    dependencies {
+        compile project(":core")
+    }
+}
+
+project(":notes") {
+    dependencies {
+        compile project(":core")
+    }
+}
+
+project(":settings") {
+    dependencies {
+        compile project(":core")
+    }
+}
+
+project(":weather") {
+    dependencies {
+        compile project(":core")
+    }
+}
+
+subprojects {
+    task libs(type: Sync) {
+        from configurations.compile
+        into "${rootProject.file('lib')}"
+    }
+}
+
+task artifacts(dependsOn: [subprojects.jar, subprojects.libs]) << {
+    mkdir "build/artifacts/apps"
+    mkdir "build/artifacts/lib"
+    mkdir "build/artifacts/bundles"
+
+    copy {
+        from "modules/browser/build/libs/browser.jar"
+        from "modules/calculator/build/libs/calculator.jar"
+        from "modules/chess/build/libs/chess.jar"
+        from "modules/clock/build/libs/clock.jar"
+        from "modules/compass/build/libs/compass.jar"
+        from "modules/cubeGame/build/libs/cubeGame.jar"
+        from "modules/lockScreen/build/libs/lockScreen.jar"
+        from "modules/mediaPlayer/build/libs/mediaPlayer.jar"
+        from "modules/notes/build/libs/notes.jar"
+        from "modules/settings/build/libs/settings.jar"
+        from "modules/weather/build/libs/weather.jar"
+        into "build/artifacts/apps"
+    }
+
+    copy {
+        from "lib/"
+        into "build/artifacts/bundles"
+//        include "core.jar",
+//                "javax.json-1.0.1.jar",
+//                "javax.websocket-api-1.0.jar",
+//                "org.eclipse.equinox.common_3.6.200.v20130402-1505.jar",
+//                "org.eclipse.equinox.preferences_3.5.100.v20130422-1538.jar",
+//                "tyrus-client-1.0.jar",
+//                "tyrus-container-grizzly-1.0.jar",
+//                "tyrus-core-1.0.jar",
+//                "tyrus-spi-1.0.jar",
+//                "tyrus-websocket-core-1.0.jar"
+        exclude "org.eclipse.osgi_3.9.0.v20130529-1710.jar"
+    }
+
+    copy {
+        from "modules/core/build/libs/core.jar"
+        from "equinox/plugins/org.eclipse.equinox.preferences_3.5.100.v20130422-1538.jar"
+        from "equinox/plugins/org.eclipse.equinox.common_3.6.200.v20130402-1505.jar"
+        into "build/artifacts/bundles"
+    }
+
+    copy {
+        from "starter/build/libs/starter.jar"
+        into "build/artifacts"
+        rename { "dukepad.jar" }
+    }
+
+    copy {
+        from "equinox/plugins/org.eclipse.osgi_3.9.0.v20130529-1710.jar"
+        into "build/artifacts/lib"
+    }
+}
+
+task run(dependsOn: "artifacts", type: JavaExec) {
+    main = "com.javafx.experiments.dukepad.starter.StarterApplication"
+    classpath = files("build/artifacts/lib/org.eclipse.osgi_3.9.0.v20130529-1710.jar", "build/artifacts/dukepad.jar")
+    workingDir "build/artifacts"
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/experiments/DukePad/settings.gradle	Tue Oct 01 10:06:51 2013 -0700
@@ -0,0 +1,16 @@
+include "starter", "browser", "calculator", "chess", "clock", "compass", "core", "cubeGame", "lockScreen", "mediaPlayer", "notes", "settings", "weather"
+
+project(":starter").projectDir = file("starter")
+project(":browser").projectDir = file("modules/browser")
+project(":calculator").projectDir = file("modules/calculator")
+project(":chess").projectDir = file("modules/chess")
+project(":clock").projectDir = file("modules/clock")
+project(":compass").projectDir = file("modules/compass")
+project(":core").projectDir = file("modules/core")
+project(":cubeGame").projectDir = file("modules/cubeGame")
+project(":lockScreen").projectDir = file("modules/lockScreen")
+project(":mediaPlayer").projectDir = file("modules/mediaPlayer")
+project(":notes").projectDir = file("modules/notes")
+project(":settings").projectDir = file("modules/settings")
+project(":weather").projectDir = file("modules/weather")
+
--- a/apps/experiments/Modena/src/main/java/modena/Modena.java	Tue Oct 01 10:00:06 2013 -0400
+++ b/apps/experiments/Modena/src/main/java/modena/Modena.java	Tue Oct 01 10:06:51 2013 -0700
@@ -107,16 +107,18 @@
         try {
             // these are not supported ways to find the platform themes and may 
             // change release to release. Just used here for testing.
-            File caspianCssFile = new File("../../../javafx-ui-controls/src/com/sun/javafx/scene/control/skin/caspian/caspian.css");
+            File caspianCssFile = new File("../../../modules/controls/src/main/resources/com/sun/javafx/scene/control/skin/caspian/caspian.css");
             if (!caspianCssFile.exists()) {
-                caspianCssFile = new File("rt/javafx-ui-controls/src/com/sun/javafx/scene/control/skin/caspian/caspian.css");
+                caspianCssFile = new File("modules/controls/src/main/resources/com/sun/javafx/scene/control/skin/caspian/caspian.css");
             }
             CASPIAN_STYLESHEET_URL = caspianCssFile.exists() ? 
                     caspianCssFile.toURI().toURL().toExternalForm() :
                     com.sun.javafx.scene.control.skin.ButtonSkin.class.getResource("caspian/caspian.css").toExternalForm();
-            File modenaCssFile = new File("../../../javafx-ui-controls/src/com/sun/javafx/scene/control/skin/modena/modena.css");
+            File modenaCssFile = new File("../../../modules/controls/src/main/resources/com/sun/javafx/scene/control/skin/modena/modena.css");
             if (!modenaCssFile.exists()) {
-                modenaCssFile = new File("rt/javafx-ui-controls/src/com/sun/javafx/scene/control/skin/modena/modena.css");
+                modenaCssFile = new File("rt/modules/controls/src/main/resources/com/sun/javafx/scene/control/skin/modena/modena.css");
+                System.out.println("modenaCssFile = " + modenaCssFile);
+                System.out.println("modenaCssFile = " + modenaCssFile.getAbsolutePath());
             }
             MODENA_STYLESHEET_URL = modenaCssFile.exists() ? 
                     modenaCssFile.toURI().toURL().toExternalForm() : 
--- a/apps/experiments/Modena/src/main/java/modena/SimpleWindowPage.java	Tue Oct 01 10:00:06 2013 -0400
+++ b/apps/experiments/Modena/src/main/java/modena/SimpleWindowPage.java	Tue Oct 01 10:06:51 2013 -0700
@@ -86,23 +86,34 @@
             ubuntuWindowContent = (Node)FXMLLoader.load(SimpleWindowPage.class.getResource("simple-window.fxml"));
             ubuntuWindow.getChildren().add(ubuntuWindowContent);
             
-            Platform.runLater(new Runnable() {
+            Platform.runLater(new Runnable() {                
                 @Override public void run() {
+                    final Node macRB1 = macWindowContent.lookup("#RadioButton1");
+                    macRB1.setMouseTransparent(true);
                     final Node macRB2 = macWindowContent.lookup("#RadioButton2");
                     macRB2.setMouseTransparent(true);
                     macRB2.pseudoClassStateChanged(PseudoClass.getPseudoClass("focused"), true);
+
+                    final Node windows7RB1 = windows7WindowContent.lookup("#RadioButton1");
+                    windows7RB1.setMouseTransparent(true);
                     final Node windows7RB2 = windows7WindowContent.lookup("#RadioButton2");
                     windows7RB2.setMouseTransparent(true);
                     windows7RB2.pseudoClassStateChanged(PseudoClass.getPseudoClass("focused"), true);
+
+                    final Node windows8RB1 = windows8WindowContent.lookup("#RadioButton1");
+                    windows8RB1.setMouseTransparent(true);
                     final Node windows8RB2 = windows8WindowContent.lookup("#RadioButton2");
                     windows8RB2.setMouseTransparent(true);
                     windows8RB2.pseudoClassStateChanged(PseudoClass.getPseudoClass("focused"), true);
+
+                    final Node ubuntuRB1 = ubuntuWindowContent.lookup("#RadioButton1");
+                    ubuntuRB1.setMouseTransparent(true);
                     final Node ubuntuRB2 = ubuntuWindowContent.lookup("#RadioButton2");
                     ubuntuRB2.setMouseTransparent(true);
                     ubuntuRB2.pseudoClassStateChanged(PseudoClass.getPseudoClass("focused"), true);
                 }
             });
-            
+                      
             box.getChildren().addAll(macWindow, ubuntuWindow, windows7Window, windows8Window);
         } catch (IOException ex) {
             Logger.getLogger(SimpleWindowPage.class.getName()).log(Level.SEVERE, null, ex);
--- a/apps/experiments/Modena/src/main/resources/modena/simple-window.fxml	Tue Oct 01 10:00:06 2013 -0400
+++ b/apps/experiments/Modena/src/main/resources/modena/simple-window.fxml	Tue Oct 01 10:06:51 2013 -0700
@@ -44,7 +44,7 @@
           <content>
             <GridPane id="GridPane" hgap="10.0" style="" vgap="10.0">
               <children>
-                <RadioButton mnemonicParsing="false" text="RadioButton 1" GridPane.columnIndex="0" GridPane.rowIndex="0">
+                <RadioButton id="RadioButton1" mnemonicParsing="false" text="RadioButton 1" GridPane.columnIndex="0" GridPane.rowIndex="0">
                   <toggleGroup>
                     <ToggleGroup fx:id="toggle2" />
                   </toggleGroup>
--- a/apps/samples/Ensemble8/src/generated/java/ensemble/generated/Samples.java	Tue Oct 01 10:00:06 2013 -0400
+++ b/apps/samples/Ensemble8/src/generated/java/ensemble/generated/Samples.java	Tue Oct 01 10:06:51 2013 -0700
@@ -13,7 +13,7 @@
     private static final SampleInfo SAMPLE_6 = new SampleInfo("Path Transition","A sample in which a node moves along a path from end to end over a given time. ","/Animation/Transitions/Path Transition","/ensemble/samples/animation/transitions/pathtransition","ensemble.samples.animation.transitions.pathtransition.PathTransitionApp","/ensemble/samples/animation/transitions/pathtransition/preview.png",new String[]{"/ensemble/samples/animation/transitions/pathtransition/PathTransitionApp.java",},new String[]{"javafx.animation.PathTransition","javafx.animation.Transition",},new String[]{},new String[]{"/Animation/Transitions/Fade Transition","/Animation/Transitions/Fill Transition","/Animation/Transitions/Parallel Transition","/Animation/Transitions/Pause Transition","/Animation/Transitions/Rotate Transition","/Animation/Transitions/Scale Transition","/Animation/Transitions/Sequential Transition","/Animation/Transitions/Stroke Transition","/Animation/Transitions/Translate Transition",},"/ensemble/samples/animation/transitions/pathtransition/PathTransitionApp.java",new PlaygroundProperty[]{},new ConditionalFeature[]{});
     private static final SampleInfo SAMPLE_7 = new SampleInfo("Pause Transition","A sample in which a node pauses over a given time. ","/Animation/Transitions/Pause Transition","/ensemble/samples/animation/transitions/pausetransition","ensemble.samples.animation.transitions.pausetransition.PauseTransitionApp","/ensemble/samples/animation/transitions/pausetransition/preview.png",new String[]{"/ensemble/samples/animation/transitions/pausetransition/PauseTransitionApp.java",},new String[]{"javafx.animation.PauseTransition","javafx.animation.Transition",},new String[]{},new String[]{"/Animation/Transitions/Fade Transition","/Animation/Transitions/Fill Transition","/Animation/Transitions/Parallel Transition","/Animation/Transitions/Path Transition","/Animation/Transitions/Rotate Transition","/Animation/Transitions/Scale Transition","/Animation/Transitions/Sequential Transition","/Animation/Transitions/Stroke Transition","/Animation/Transitions/Translate Transition",},"/ensemble/samples/animation/transitions/pausetransition/PauseTransitionApp.java",new PlaygroundProperty[]{},new ConditionalFeature[]{});
     private static final SampleInfo SAMPLE_8 = new SampleInfo("Rotate Transition","A sample in which a node rotates around its center over a given time. ","/Animation/Transitions/Rotate Transition","/ensemble/samples/animation/transitions/rotatetransition","ensemble.samples.animation.transitions.rotatetransition.RotateTransitionApp","/ensemble/samples/animation/transitions/rotatetransition/preview.png",new String[]{"/ensemble/samples/animation/transitions/rotatetransition/RotateTransitionApp.java",},new String[]{"javafx.animation.RotateTransition","javafx.animation.Transition",},new String[]{},new String[]{"/Animation/Transitions/Fade Transition","/Animation/Transitions/Fill Transition","/Animation/Transitions/Parallel Transition","/Animation/Transitions/Path Transition","/Animation/Transitions/Pause Transition","/Animation/Transitions/Scale Transition","/Animation/Transitions/Sequential Transition","/Animation/Transitions/Stroke Transition","/Animation/Transitions/Translate Transition",},"/ensemble/samples/animation/transitions/rotatetransition/RotateTransitionApp.java",new PlaygroundProperty[]{},new ConditionalFeature[]{});
-    private static final SampleInfo SAMPLE_9 = new SampleInfo("Scale Transition","A sample in which a node scales larger and smaller over a given time. ","/Animation/Transitions/Scale Transition","/ensemble/samples/animation/transitions/scaletransition","ensemble.samples.animation.transitions.scaletransition.ScaleTransitionApp","/ensemble/samples/animation/transitions/scaletransition/preview.png",new String[]{"/ensemble/samples/animation/transitions/scaletransition/ScaleTransitionApp.java","/ensemble/samples/animation/transitions/scaletransition/ScaleTransitionApp.java.orig","/ensemble/samples/animation/transitions/scaletransition/ScaleTransitionApp.java.typoFixed",},new String[]{"javafx.animation.ScaleTransition","javafx.animation.Transition",},new String[]{},new String[]{"/Animation/Transitions/Fade Transition","/Animation/Transitions/Fill Transition","/Animation/Transitions/Parallel Transition","/Animation/Transitions/Path Transition","/Animation/Transitions/Pause Transition","/Animation/Transitions/Rotate Transition","/Animation/Transitions/Sequential Transition","/Animation/Transitions/Stroke Transition","/Animation/Transitions/Translate Transition",},"/ensemble/samples/animation/transitions/scaletransition/ScaleTransitionApp.java",new PlaygroundProperty[]{},new ConditionalFeature[]{});
+    private static final SampleInfo SAMPLE_9 = new SampleInfo("Scale Transition","A sample in which a node scales larger and smaller over a given time. ","/Animation/Transitions/Scale Transition","/ensemble/samples/animation/transitions/scaletransition","ensemble.samples.animation.transitions.scaletransition.ScaleTransitionApp","/ensemble/samples/animation/transitions/scaletransition/preview.png",new String[]{"/ensemble/samples/animation/transitions/scaletransition/ScaleTransitionApp.java",},new String[]{"javafx.animation.ScaleTransition","javafx.animation.Transition",},new String[]{},new String[]{"/Animation/Transitions/Fade Transition","/Animation/Transitions/Fill Transition","/Animation/Transitions/Parallel Transition","/Animation/Transitions/Path Transition","/Animation/Transitions/Pause Transition","/Animation/Transitions/Rotate Transition","/Animation/Transitions/Sequential Transition","/Animation/Transitions/Stroke Transition","/Animation/Transitions/Translate Transition",},"/ensemble/samples/animation/transitions/scaletransition/ScaleTransitionApp.java",new PlaygroundProperty[]{},new ConditionalFeature[]{});
     private static final SampleInfo SAMPLE_10 = new SampleInfo("Sequential Transition","A sample in which various transitions are executed sequentially. ","/Animation/Transitions/Sequential Transition","/ensemble/samples/animation/transitions/sequentialtransition","ensemble.samples.animation.transitions.sequentialtransition.SequentialTransitionApp","/ensemble/samples/animation/transitions/sequentialtransition/preview.png",new String[]{"/ensemble/samples/animation/transitions/sequentialtransition/SequentialTransitionApp.java",},new String[]{"javafx.animation.SequentialTransition","javafx.animation.Transition",},new String[]{},new String[]{"/Animation/Transitions/Fade Transition","/Animation/Transitions/Fill Transition","/Animation/Transitions/Parallel Transition","/Animation/Transitions/Path Transition","/Animation/Transitions/Pause Transition","/Animation/Transitions/Rotate Transition","/Animation/Transitions/Scale Transition","/Animation/Transitions/Stroke Transition","/Animation/Transitions/Translate Transition",},"/ensemble/samples/animation/transitions/sequentialtransition/SequentialTransitionApp.java",new PlaygroundProperty[]{},new ConditionalFeature[]{});
     private static final SampleInfo SAMPLE_11 = new SampleInfo("Stroke Transition","A sample in which the stroke color of a shape changes over a given time. ","/Animation/Transitions/Stroke Transition","/ensemble/samples/animation/transitions/stroketransition","ensemble.samples.animation.transitions.stroketransition.StrokeTransitionApp","/ensemble/samples/animation/transitions/stroketransition/preview.png",new String[]{"/ensemble/samples/animation/transitions/stroketransition/StrokeTransitionApp.java",},new String[]{"javafx.animation.StrokeTransition","javafx.animation.Transition",},new String[]{},new String[]{"/Animation/Transitions/Fade Transition","/Animation/Transitions/Fill Transition","/Animation/Transitions/Parallel Transition","/Animation/Transitions/Path Transition","/Animation/Transitions/Pause Transition","/Animation/Transitions/Rotate Transition","/Animation/Transitions/Scale Transition","/Animation/Transitions/Sequential Transition","/Animation/Transitions/Translate Transition",},"/ensemble/samples/animation/transitions/stroketransition/StrokeTransitionApp.java",new PlaygroundProperty[]{},new ConditionalFeature[]{});
     private static final SampleInfo SAMPLE_12 = new SampleInfo("Translate Transition","A sample in which a node moves from one location to another over a given time. ","/Animation/Transitions/Translate Transition","/ensemble/samples/animation/transitions/translatetransition","ensemble.samples.animation.transitions.translatetransition.TranslateTransitionApp","/ensemble/samples/animation/transitions/translatetransition/preview.png",new String[]{"/ensemble/samples/animation/transitions/translatetransition/TranslateTransitionApp.java",},new String[]{"javafx.animation.TranslateTransition","javafx.animation.Transition",},new String[]{},new String[]{"/Animation/Transitions/Fade Transition","/Animation/Transitions/Fill Transition","/Animation/Transitions/Parallel Transition","/Animation/Transitions/Path Transition","/Animation/Transitions/Pause Transition","/Animation/Transitions/Rotate Transition","/Animation/Transitions/Scale Transition","/Animation/Transitions/Sequential Transition","/Animation/Transitions/Stroke Transition",},"/ensemble/samples/animation/transitions/translatetransition/TranslateTransitionApp.java",new PlaygroundProperty[]{},new ConditionalFeature[]{});
@@ -42,9 +42,9 @@
     private static final SampleInfo SAMPLE_35 = new SampleInfo("Check Box","An example of CheckBoxes in various states. ","/Controls/Check Box","/ensemble/samples/controls/checkbox","ensemble.samples.controls.checkbox.CheckBoxApp","/ensemble/samples/controls/checkbox/preview.png",new String[]{"/ensemble/samples/controls/checkbox/CheckBoxApp.java",},new String[]{"javafx.scene.control.CheckBox",},new String[]{},new String[]{"/Controls/Radiobutton/Radio Button",},"/ensemble/samples/controls/checkbox/CheckBoxApp.java",new PlaygroundProperty[]{},new ConditionalFeature[]{});
     private static final SampleInfo SAMPLE_36 = new SampleInfo("ChoiceBox","An example of a ChoiceBox with several options. The ChoiceBox control displays a default or current selection, with an icon to click that expands the list for a selection. ","/Controls/ChoiceBox","/ensemble/samples/controls/choicebox","ensemble.samples.controls.choicebox.ChoiceBoxApp","/ensemble/samples/controls/choicebox/preview.png",new String[]{"/ensemble/samples/controls/choicebox/ChoiceBoxApp.java",},new String[]{"javafx.scene.control.ChoiceBox",},new String[]{},new String[]{},"/ensemble/samples/controls/choicebox/ChoiceBoxApp.java",new PlaygroundProperty[]{},new ConditionalFeature[]{});
     private static final SampleInfo SAMPLE_37 = new SampleInfo("ColorPicker","A sample that demonstrates the ColorPicker. ","/Controls/ColorPicker","/ensemble/samples/controls/colorpicker","ensemble.samples.controls.colorpicker.ColorPickerApp","/ensemble/samples/controls/colorpicker/preview.png",new String[]{"/ensemble/samples/controls/colorpicker/ColorPickerApp.java",},new String[]{"javafx.scene.control.ColorPicker",},new String[]{},new String[]{},"/ensemble/samples/controls/colorpicker/ColorPickerApp.java",new PlaygroundProperty[]{},new ConditionalFeature[]{});
-    private static final SampleInfo SAMPLE_38 = new SampleInfo("DatePicker","A sample that demonstrates the DatePicker. The sample uses a new Stage for the DatePicker to allow changing of locales. ","/Controls/DatePicker","/ensemble/samples/controls/datepicker","ensemble.samples.controls.datepicker.DatePickerApp","/ensemble/samples/controls/datepicker/preview.png",new String[]{"/ensemble/samples/controls/datepicker/DatePickerApp.java","/ensemble/samples/controls/datepicker/DatePickerApp.java.save","/ensemble/samples/controls/datepicker/DatePicker.css.orig",},new String[]{"javafx.scene.control.DateCell","javafx.scene.control.DatePicker",},new String[]{},new String[]{},"/ensemble/samples/controls/datepicker/DatePickerApp.java",new PlaygroundProperty[]{},new ConditionalFeature[]{});
+    private static final SampleInfo SAMPLE_38 = new SampleInfo("DatePicker","A sample that demonstrates the DatePicker. The sample uses a new Stage for the DatePicker to allow changing of locales. ","/Controls/DatePicker","/ensemble/samples/controls/datepicker","ensemble.samples.controls.datepicker.DatePickerApp","/ensemble/samples/controls/datepicker/preview.png",new String[]{"/ensemble/samples/controls/datepicker/DatePickerApp.java",},new String[]{"javafx.scene.control.DateCell","javafx.scene.control.DatePicker",},new String[]{},new String[]{},"/ensemble/samples/controls/datepicker/DatePickerApp.java",new PlaygroundProperty[]{},new ConditionalFeature[]{});
     private static final SampleInfo SAMPLE_39 = new SampleInfo("HyperLink","A sample that shows a simple hyperlink and a hyperlink with an image. ","/Controls/HyperLink","/ensemble/samples/controls/hyperlink","ensemble.samples.controls.hyperlink.HyperLinkApp","/ensemble/samples/controls/hyperlink/preview.png",new String[]{"/ensemble/samples/shared-resources/icon-48x48.png","/ensemble/samples/controls/hyperlink/HyperLinkApp.java",},new String[]{"javafx.scene.control.Hyperlink",},new String[]{},new String[]{},"/ensemble/samples/controls/hyperlink/HyperLinkApp.java",new PlaygroundProperty[]{},new ConditionalFeature[]{});
-    private static final SampleInfo SAMPLE_40 = new SampleInfo("Menu","An example of a menu bar. The example includes use of the system bar, if the current platform supports a system bar. ","/Controls/Menu","/ensemble/samples/controls/menu","ensemble.samples.controls.menu.MenuApp","/ensemble/samples/controls/menu/preview.png",new String[]{"/ensemble/samples/shared-resources/menuInfo.png","/ensemble/samples/controls/menu/MenuApp.java","/ensemble/samples/controls/menu/MenuApp.java.orig",},new String[]{"javafx.scene.control.MenuBar","javafx.scene.control.Menu","javafx.scene.control.MenuItem",},new String[]{},new String[]{},"/ensemble/samples/controls/menu/MenuApp.java",new PlaygroundProperty[]{},new ConditionalFeature[]{});
+    private static final SampleInfo SAMPLE_40 = new SampleInfo("Menu","An example of a menu bar. The example includes use of the system bar, if the current platform supports a system bar. ","/Controls/Menu","/ensemble/samples/controls/menu","ensemble.samples.controls.menu.MenuApp","/ensemble/samples/controls/menu/preview.png",new String[]{"/ensemble/samples/shared-resources/menuInfo.png","/ensemble/samples/controls/menu/MenuApp.java",},new String[]{"javafx.scene.control.MenuBar","javafx.scene.control.Menu","javafx.scene.control.MenuItem",},new String[]{},new String[]{},"/ensemble/samples/controls/menu/MenuApp.java",new PlaygroundProperty[]{},new ConditionalFeature[]{});
     private static final SampleInfo SAMPLE_41 = new SampleInfo("Pagination","A sample that demonstrates pagination. ","/Controls/Pagination","/ensemble/samples/controls/pagination","ensemble.samples.controls.pagination.PaginationApp","/ensemble/samples/controls/pagination/preview.png",new String[]{"/ensemble/samples/shared-resources/Animal1.jpg","/ensemble/samples/shared-resources/Animal2.jpg","/ensemble/samples/shared-resources/Animal3.jpg","/ensemble/samples/shared-resources/Animal4.jpg","/ensemble/samples/shared-resources/Animal5.jpg","/ensemble/samples/shared-resources/Animal6.jpg","/ensemble/samples/shared-resources/Animal7.jpg","/ensemble/samples/controls/pagination/PaginationApp.java",},new String[]{"javafx.scene.control.Pagination",},new String[]{},new String[]{},"/ensemble/samples/controls/pagination/PaginationApp.java",new PlaygroundProperty[]{},new ConditionalFeature[]{});
     private static final SampleInfo SAMPLE_42 = new SampleInfo("Progress Bar","A sample that demonstrates the ProgressBar control. ","/Controls/Progress Bar","/ensemble/samples/controls/progressbar","ensemble.samples.controls.progressbar.ProgressBarApp","/ensemble/samples/controls/progressbar/preview.png",new String[]{"/ensemble/samples/controls/progressbar/ProgressBarApp.java",},new String[]{"javafx.scene.control.ProgressBar",},new String[]{},new String[]{"/Controls/Progress Indicator",},"/ensemble/samples/controls/progressbar/ProgressBarApp.java",new PlaygroundProperty[]{},new ConditionalFeature[]{});
     private static final SampleInfo SAMPLE_43 = new SampleInfo("Progress Indicator","A sample that demonstrates the Progress Indicator control in various modes. ","/Controls/Progress Indicator","/ensemble/samples/controls/progressindicator","ensemble.samples.controls.progressindicator.ProgressIndicatorApp","/ensemble/samples/controls/progressindicator/preview.png",new String[]{"/ensemble/samples/controls/progressindicator/ProgressIndicatorApp.java",},new String[]{"javafx.scene.control.ProgressIndicator",},new String[]{},new String[]{"/Controls/Progress Bar",},"/ensemble/samples/controls/progressindicator/ProgressIndicatorApp.java",new PlaygroundProperty[]{},new ConditionalFeature[]{});
@@ -60,7 +60,7 @@
     private static final SampleInfo SAMPLE_53 = new SampleInfo("Simple ListView","A simple implementation of the ListView control, in which a list of items is displayed vertically.  ListView is a powerful multirow control, in which each of a virtually unlimited number of horizontal or vertical rows is defined as a cell. The control also supports dynamically variable nonhomogenous row heights. ","/Controls/Listview/Simple ListView","/ensemble/samples/controls/listview/simplelistview","ensemble.samples.controls.listview.simplelistview.SimpleListViewApp","/ensemble/samples/controls/listview/simplelistview/preview.png",new String[]{"/ensemble/samples/controls/listview/simplelistview/SimpleListViewApp.java",},new String[]{"javafx.scene.control.ListView","javafx.scene.control.SelectionModel",},new String[]{},new String[]{"/Controls/Listview/HorizontalListView","/Controls/Listview/ListViewCellFactory",},"/ensemble/samples/controls/listview/simplelistview/SimpleListViewApp.java",new PlaygroundProperty[]{},new ConditionalFeature[]{});
     private static final SampleInfo SAMPLE_54 = new SampleInfo("Hidden SplitPane","A sample that demonstrates styling a hidden split pane with CSS. ","/Controls/Splitpane/Hidden SplitPane","/ensemble/samples/controls/splitpane/hiddensplitpane","ensemble.samples.controls.splitpane.hiddensplitpane.HiddenSplitPaneApp","/ensemble/samples/controls/splitpane/hiddensplitpane/preview.png",new String[]{"/ensemble/samples/controls/splitpane/hiddensplitpane/HiddenSplitPaneApp.java","/ensemble/samples/controls/splitpane/hiddensplitpane/HiddenSplitPane.css",},new String[]{"javafx.scene.control.SplitPane",},new String[]{},new String[]{},"/ensemble/samples/controls/splitpane/hiddensplitpane/HiddenSplitPaneApp.java",new PlaygroundProperty[]{},new ConditionalFeature[]{});
     private static final SampleInfo SAMPLE_55 = new SampleInfo("TabPane","Some implementations of tabs using the TabPane class. ","/Controls/Tab/TabPane","/ensemble/samples/controls/tab/tabpane","ensemble.samples.controls.tab.tabpane.TabPaneApp","/ensemble/samples/controls/tab/tabpane/preview.png",new String[]{"/ensemble/samples/controls/tab/tabpane/TabPaneApp.java","/ensemble/samples/controls/tab/tabpane/tab_16.png",},new String[]{"javafx.scene.control.Tab","javafx.scene.control.TabPane","javafx.scene.control.TabBuilder",},new String[]{},new String[]{},"/ensemble/samples/controls/tab/tabpane/TabPaneApp.java",new PlaygroundProperty[]{},new ConditionalFeature[]{});
-    private static final SampleInfo SAMPLE_56 = new SampleInfo("TableCellFactory","A simple table that uses cell factories to add a checkbox to a table column and to add textfields to table columns. The latter enables editing of first name, last name, and email. ","/Controls/Table/TableCellFactory","/ensemble/samples/controls/table/tablecellfactory","ensemble.samples.controls.table.tablecellfactory.TableCellFactoryApp","/ensemble/samples/controls/table/tablecellfactory/preview.png",new String[]{"/ensemble/samples/controls/table/tablecellfactory/CheckBoxTableCell.java.orig","/ensemble/samples/controls/table/tablecellfactory/CheckBoxTableCell.java.save","/ensemble/samples/controls/table/tablecellfactory/EditingCell.java.orig","/ensemble/samples/controls/table/tablecellfactory/Person.java","/ensemble/samples/controls/table/tablecellfactory/TableCellFactoryApp.java",},new String[]{"javafx.scene.control.TableCell","javafx.scene.control.TableColumn","javafx.scene.control.TablePosition","javafx.scene.control.TableRow","javafx.scene.control.TableView",},new String[]{},new String[]{},"/ensemble/samples/controls/table/tablecellfactory/TableCellFactoryApp.java",new PlaygroundProperty[]{},new ConditionalFeature[]{});
+    private static final SampleInfo SAMPLE_56 = new SampleInfo("TableCellFactory","A simple table that uses cell factories to add a checkbox to a table column and to add textfields to table columns. The latter enables editing of first name, last name, and email. ","/Controls/Table/TableCellFactory","/ensemble/samples/controls/table/tablecellfactory","ensemble.samples.controls.table.tablecellfactory.TableCellFactoryApp","/ensemble/samples/controls/table/tablecellfactory/preview.png",new String[]{"/ensemble/samples/controls/table/tablecellfactory/Person.java","/ensemble/samples/controls/table/tablecellfactory/TableCellFactoryApp.java",},new String[]{"javafx.scene.control.TableCell","javafx.scene.control.TableColumn","javafx.scene.control.TablePosition","javafx.scene.control.TableRow","javafx.scene.control.TableView",},new String[]{},new String[]{},"/ensemble/samples/controls/table/tablecellfactory/TableCellFactoryApp.java",new PlaygroundProperty[]{},new ConditionalFeature[]{});
     private static final SampleInfo SAMPLE_57 = new SampleInfo("TableView","A simple table with a header row. ","/Controls/Table/TableView","/ensemble/samples/controls/table/tableview","ensemble.samples.controls.table.tableview.TableViewApp","/ensemble/samples/controls/table/tableview/preview.png",new String[]{"/ensemble/samples/controls/table/tableview/Person.java","/ensemble/samples/controls/table/tableview/TableViewApp.java",},new String[]{"javafx.scene.control.TableColumn","javafx.scene.control.TablePosition","javafx.scene.control.TableRow","javafx.scene.control.TableView",},new String[]{},new String[]{},"/ensemble/samples/controls/table/tableview/TableViewApp.java",new PlaygroundProperty[]{},new ConditionalFeature[]{});
     private static final SampleInfo SAMPLE_58 = new SampleInfo("Advanced Label","Several Label controls, displayed in various alignments with respect to an image. ","/Controls/Text/Advanced Label","/ensemble/samples/controls/text/advancedlabel","ensemble.samples.controls.text.advancedlabel.AdvancedLabelApp","/ensemble/samples/controls/text/advancedlabel/preview.png",new String[]{"/ensemble/samples/shared-resources/icon-48x48.png","/ensemble/samples/controls/text/advancedlabel/AdvancedLabelApp.java",},new String[]{"javafx.scene.control.Label",},new String[]{},new String[]{"/Controls/Text/Simple Label","/Controls/Button/Graphic Button",},"/ensemble/samples/controls/text/advancedlabel/AdvancedLabelApp.java",new PlaygroundProperty[]{},new ConditionalFeature[]{});
     private static final SampleInfo SAMPLE_59 = new SampleInfo("Inset Text","A sample that shows styling of text through CSS. ","/Controls/Text/Inset Text","/ensemble/samples/controls/text/insettext","ensemble.samples.controls.text.insettext.InsetTextApp","/ensemble/samples/controls/text/insettext/preview.png",new String[]{"/ensemble/samples/controls/text/insettext/InsetTextApp.java","/ensemble/samples/controls/text/insettext/InsetText.css",},new String[]{"javafx.geometry.Insets","javafx.scene.control.LabelBuilder",},new String[]{},new String[]{"/Controls/Text/Simple Label",},"/ensemble/samples/controls/text/insettext/InsetTextApp.java",new PlaygroundProperty[]{},new ConditionalFeature[]{});
@@ -72,7 +72,7 @@
     private static final SampleInfo SAMPLE_65 = new SampleInfo("Tool Bar","A toolbar with three buttons. ","/Controls/Toolbar/Tool Bar","/ensemble/samples/controls/toolbar/toolbar","ensemble.samples.controls.toolbar.toolbar.ToolBarApp","/ensemble/samples/controls/toolbar/toolbar/preview.png",new String[]{"/ensemble/samples/controls/toolbar/toolbar/ToolBarApp.java",},new String[]{"javafx.scene.control.ToolBar",},new String[]{},new String[]{},"/ensemble/samples/controls/toolbar/toolbar/ToolBarApp.java",new PlaygroundProperty[]{},new ConditionalFeature[]{});
     private static final SampleInfo SAMPLE_66 = new SampleInfo("FXML Login Demo","FXML-based Login screen sample ","/Fxml/FXML Login Demo","/ensemble/samples/fxml/fxmldemo","ensemble.samples.fxml.fxmldemo.FXMLLoginDemoApp","/ensemble/samples/fxml/fxmldemo/preview.png",new String[]{"/ensemble/samples/fxml/fxmldemo/Authenticator.java","/ensemble/samples/fxml/fxmldemo/FXMLLoginDemoApp.java","/ensemble/samples/fxml/fxmldemo/LoginController.java","/ensemble/samples/fxml/fxmldemo/ProfileController.java","/ensemble/samples/fxml/fxmldemo/User.java","/ensemble/samples/fxml/fxmldemo/Login.css","/ensemble/samples/fxml/fxmldemo/Login.fxml","/ensemble/samples/fxml/fxmldemo/Profile.fxml",},new String[]{"java.util.HashMap","java.util.Map","java.io.InputStream","java.util.logging.Level","java.util.logging.Logger","javafx.fxml.FXML","javafx.fxml.FXMLLoader","javafx.fxml.Initializable","javafx.fxml.JavaFXBuilderFactory","javafx.stage.Stage",},new String[]{},new String[]{},"/ensemble/samples/fxml/fxmldemo/FXMLLoginDemoApp.java",new PlaygroundProperty[]{},new ConditionalFeature[]{});
     private static final SampleInfo SAMPLE_67 = new SampleInfo("Bouncing Balls","A sample that shows animated bouncing balls. Select a ball to start or stop the animation. Select the reset button to stop all the balls. ","/Graphics/Bouncing Balls","/ensemble/samples/graphics/bouncingballs","ensemble.samples.graphics.bouncingballs.BouncingBallsApp","/ensemble/samples/graphics/bouncingballs/preview.png",new String[]{"/ensemble/samples/graphics/bouncingballs/Ball.java","/ensemble/samples/graphics/bouncingballs/BallsPane.java","/ensemble/samples/graphics/bouncingballs/BallsScreen.java","/ensemble/samples/graphics/bouncingballs/BouncingBallsApp.java","/ensemble/samples/graphics/bouncingballs/Constants.java",},new String[]{"java.util.ArrayList","java.util.List","javafx.util.Duration","javafx.stage.Stage","javafx.stage.Screen","javafx.scene.Parent","javafx.scene.Group","javafx.scene.Scene","javafx.scene.Node","javafx.scene.effect.Reflection","javafx.scene.shape.Rectangle","javafx.scene.shape.Line","javafx.scene.shape.Circle","javafx.scene.paint.Color","javafx.scene.paint.CycleMethod","javafx.scene.paint.RadialGradient","javafx.scene.paint.Stop","javafx.scene.control.Button","javafx.scene.text.Text","javafx.application.Application","javafx.animation.Interpolator","javafx.animation.KeyFrame","javafx.animation.KeyValue","javafx.animation.Timeline","javafx.animation.Animation.Status","javafx.event.EventHandler","javafx.event.ActionEvent","javafx.scene.input.MouseEvent","javafx.geometry.Insets",},new String[]{},new String[]{},"/ensemble/samples/graphics/bouncingballs/BouncingBallsApp.java",new PlaygroundProperty[]{},new ConditionalFeature[]{});
-    private static final SampleInfo SAMPLE_68 = new SampleInfo("Brick Breaker","The main purpose of the game is to break all the bricks and not drop the ball. ","/Graphics/Brick Breaker","/ensemble/samples/graphics/brickbreaker","ensemble.samples.graphics.brickbreaker.BrickBreakerApp","/ensemble/samples/graphics/brickbreaker/preview.png",new String[]{"/ensemble/samples/graphics/brickbreaker/Ball.java","/ensemble/samples/graphics/brickbreaker/Bat.java","/ensemble/samples/graphics/brickbreaker/Bonus.java","/ensemble/samples/graphics/brickbreaker/Brick.java","/ensemble/samples/graphics/brickbreaker/BrickBreakerApp.java","/ensemble/samples/graphics/brickbreaker/BrickBreakerApp.java.orig","/ensemble/samples/shared-resources/brickImages/background.png","/ensemble/samples/shared-resources/brickImages/bat/left.png","/ensemble/samples/shared-resources/brickImages/bat/center.png","/ensemble/samples/shared-resources/brickImages/bat/right.png","/ensemble/samples/shared-resources/brickImages/ball/ball0.png","/ensemble/samples/shared-resources/brickImages/ball/ball1.png","/ensemble/samples/shared-resources/brickImages/ball/ball2.png","/ensemble/samples/shared-resources/brickImages/ball/ball3.png","/ensemble/samples/shared-resources/brickImages/ball/ball4.png","/ensemble/samples/shared-resources/brickImages/ball/ball5.png","/ensemble/samples/shared-resources/brickImages/logo.png","/ensemble/samples/shared-resources/brickImages/splash/brick.png","/ensemble/samples/shared-resources/brickImages/splash/brickshadow.png","/ensemble/samples/shared-resources/brickImages/splash/breaker.png","/ensemble/samples/shared-resources/brickImages/splash/breakershadow.png","/ensemble/samples/shared-resources/brickImages/splash/pressanykey.png","/ensemble/samples/shared-resources/brickImages/splash/pressanykeyshadow.png","/ensemble/samples/shared-resources/brickImages/splash/strike.png","/ensemble/samples/shared-resources/brickImages/splash/strikeshadow.png","/ensemble/samples/shared-resources/brickImages/splash/sun.png","/ensemble/samples/shared-resources/brickImages/ready.png","/ensemble/samples/shared-resources/brickImages/gameover.png","/ensemble/samples/shared-resources/brickImages/brick/blue.png","/ensemble/samples/shared-resources/brickImages/brick/broken1.png","/ensemble/samples/shared-resources/brickImages/brick/broken2.png","/ensemble/samples/shared-resources/brickImages/brick/brown.png","/ensemble/samples/shared-resources/brickImages/brick/cyan.png","/ensemble/samples/shared-resources/brickImages/brick/green.png","/ensemble/samples/shared-resources/brickImages/brick/grey.png","/ensemble/samples/shared-resources/brickImages/brick/magenta.png","/ensemble/samples/shared-resources/brickImages/brick/orange.png","/ensemble/samples/shared-resources/brickImages/brick/red.png","/ensemble/samples/shared-resources/brickImages/brick/violet.png","/ensemble/samples/shared-resources/brickImages/brick/white.png","/ensemble/samples/shared-resources/brickImages/brick/yellow.png","/ensemble/samples/shared-resources/brickImages/bonus/ballslow.png","/ensemble/samples/shared-resources/brickImages/bonus/ballfast.png","/ensemble/samples/shared-resources/brickImages/bonus/catch.png","/ensemble/samples/shared-resources/brickImages/bonus/batgrow.png","/ensemble/samples/shared-resources/brickImages/bonus/batreduce.png","/ensemble/samples/shared-resources/brickImages/bonus/ballgrow.png","/ensemble/samples/shared-resources/brickImages/bonus/ballreduce.png","/ensemble/samples/shared-resources/brickImages/bonus/strike.png","/ensemble/samples/shared-resources/brickImages/bonus/extralife.png","/ensemble/samples/graphics/brickbreaker/Config.java","/ensemble/samples/graphics/brickbreaker/Config.java.orig","/ensemble/samples/shared-resources/brickImages/vline.png","/ensemble/samples/graphics/brickbreaker/Level.java","/ensemble/samples/graphics/brickbreaker/Level.java.orig","/ensemble/samples/graphics/brickbreaker/LevelData.java","/ensemble/samples/graphics/brickbreaker/Splash.java","/ensemble/samples/graphics/brickbreaker/Utils.java",},new String[]{"javafx.scene.image.Image","javafx.scene.image.ImageView","javafx.util.Duration","javafx.animation.KeyFrame","javafx.animation.KeyValue","javafx.animation.Timeline","javafx.application.Application","javafx.application.Platform","javafx.collections.ObservableList","javafx.geometry.Rectangle2D","javafx.geometry.VPos",},new String[]{},new String[]{},"/ensemble/samples/graphics/brickbreaker/BrickBreakerApp.java",new PlaygroundProperty[]{},new ConditionalFeature[]{});
+    private static final SampleInfo SAMPLE_68 = new SampleInfo("Brick Breaker","The main purpose of the game is to break all the bricks and not drop the ball. ","/Graphics/Brick Breaker","/ensemble/samples/graphics/brickbreaker","ensemble.samples.graphics.brickbreaker.BrickBreakerApp","/ensemble/samples/graphics/brickbreaker/preview.png",new String[]{"/ensemble/samples/graphics/brickbreaker/Ball.java","/ensemble/samples/graphics/brickbreaker/Bat.java","/ensemble/samples/graphics/brickbreaker/Bonus.java","/ensemble/samples/graphics/brickbreaker/Brick.java","/ensemble/samples/graphics/brickbreaker/BrickBreakerApp.java","/ensemble/samples/shared-resources/brickImages/background.png","/ensemble/samples/shared-resources/brickImages/bat/left.png","/ensemble/samples/shared-resources/brickImages/bat/center.png","/ensemble/samples/shared-resources/brickImages/bat/right.png","/ensemble/samples/shared-resources/brickImages/ball/ball0.png","/ensemble/samples/shared-resources/brickImages/ball/ball1.png","/ensemble/samples/shared-resources/brickImages/ball/ball2.png","/ensemble/samples/shared-resources/brickImages/ball/ball3.png","/ensemble/samples/shared-resources/brickImages/ball/ball4.png","/ensemble/samples/shared-resources/brickImages/ball/ball5.png","/ensemble/samples/shared-resources/brickImages/logo.png","/ensemble/samples/shared-resources/brickImages/splash/brick.png","/ensemble/samples/shared-resources/brickImages/splash/brickshadow.png","/ensemble/samples/shared-resources/brickImages/splash/breaker.png","/ensemble/samples/shared-resources/brickImages/splash/breakershadow.png","/ensemble/samples/shared-resources/brickImages/splash/pressanykey.png","/ensemble/samples/shared-resources/brickImages/splash/pressanykeyshadow.png","/ensemble/samples/shared-resources/brickImages/splash/strike.png","/ensemble/samples/shared-resources/brickImages/splash/strikeshadow.png","/ensemble/samples/shared-resources/brickImages/splash/sun.png","/ensemble/samples/shared-resources/brickImages/ready.png","/ensemble/samples/shared-resources/brickImages/gameover.png","/ensemble/samples/shared-resources/brickImages/brick/blue.png","/ensemble/samples/shared-resources/brickImages/brick/broken1.png","/ensemble/samples/shared-resources/brickImages/brick/broken2.png","/ensemble/samples/shared-resources/brickImages/brick/brown.png","/ensemble/samples/shared-resources/brickImages/brick/cyan.png","/ensemble/samples/shared-resources/brickImages/brick/green.png","/ensemble/samples/shared-resources/brickImages/brick/grey.png","/ensemble/samples/shared-resources/brickImages/brick/magenta.png","/ensemble/samples/shared-resources/brickImages/brick/orange.png","/ensemble/samples/shared-resources/brickImages/brick/red.png","/ensemble/samples/shared-resources/brickImages/brick/violet.png","/ensemble/samples/shared-resources/brickImages/brick/white.png","/ensemble/samples/shared-resources/brickImages/brick/yellow.png","/ensemble/samples/shared-resources/brickImages/bonus/ballslow.png","/ensemble/samples/shared-resources/brickImages/bonus/ballfast.png","/ensemble/samples/shared-resources/brickImages/bonus/catch.png","/ensemble/samples/shared-resources/brickImages/bonus/batgrow.png","/ensemble/samples/shared-resources/brickImages/bonus/batreduce.png","/ensemble/samples/shared-resources/brickImages/bonus/ballgrow.png","/ensemble/samples/shared-resources/brickImages/bonus/ballreduce.png","/ensemble/samples/shared-resources/brickImages/bonus/strike.png","/ensemble/samples/shared-resources/brickImages/bonus/extralife.png","/ensemble/samples/graphics/brickbreaker/Config.java","/ensemble/samples/shared-resources/brickImages/vline.png","/ensemble/samples/graphics/brickbreaker/Level.java","/ensemble/samples/graphics/brickbreaker/LevelData.java","/ensemble/samples/graphics/brickbreaker/Splash.java","/ensemble/samples/graphics/brickbreaker/Utils.java",},new String[]{"javafx.scene.image.Image","javafx.scene.image.ImageView","javafx.util.Duration","javafx.animation.KeyFrame","javafx.animation.KeyValue","javafx.animation.Timeline","javafx.application.Application","javafx.application.Platform","javafx.collections.ObservableList","javafx.geometry.Rectangle2D","javafx.geometry.VPos",},new String[]{},new String[]{},"/ensemble/samples/graphics/brickbreaker/BrickBreakerApp.java",new PlaygroundProperty[]{},new ConditionalFeature[]{});
     private static final SampleInfo SAMPLE_69 = new SampleInfo("Calculator","A calculator that performs simple math exercises. ","/Graphics/Calculator","/ensemble/samples/graphics/calc","ensemble.samples.graphics.calc.CalculatorApp","/ensemble/samples/graphics/calc/preview.png",new String[]{"/ensemble/samples/graphics/calc/Calculator.java","/ensemble/samples/graphics/calc/CalculatorApp.java","/ensemble/samples/graphics/calc/Key.java","/ensemble/samples/graphics/calc/Util.java",},new String[]{"javafx.application.Application","javafx.stage.Stage","javafx.scene.Scene","javafx.scene.Group","javafx.scene.Parent","javafx.scene.paint.Color","javafx.scene.paint.CycleMethod","javafx.scene.paint.LinearGradient","javafx.scene.paint.Stop","javafx.scene.input.KeyEvent","javafx.scene.input.MouseEvent","javafx.scene.shape.Rectangle","javafx.scene.text.Font","javafx.scene.text.Text","javafx.event.EventHandler","javafx.geometry.VPos",},new String[]{},new String[]{},"/ensemble/samples/graphics/calc/CalculatorApp.java",new PlaygroundProperty[]{},new ConditionalFeature[]{});
     private static final SampleInfo SAMPLE_70 = new SampleInfo("Colorful Circles","A sample that demonstrates how to draw and paint shapes, apply visual effects, blend colors in overlapping objects, and animate objects. ","/Graphics/Colorful Circles","/ensemble/samples/graphics/colorfulcircles","ensemble.samples.graphics.colorfulcircles.ColorfulCirclesApp","/ensemble/samples/graphics/colorfulcircles/preview.png",new String[]{"/ensemble/samples/graphics/colorfulcircles/ColorfulCirclesApp.java",},new String[]{"javafx.scene.effect.BlendMode","javafx.scene.effect.BoxBlur","javafx.scene.shape.Circle","javafx.scene.Group","javafx.scene.paint.LinearGradient","javafx.animation.Timeline",},new String[]{},new String[]{},"/ensemble/samples/graphics/colorfulcircles/ColorfulCirclesApp.java",new PlaygroundProperty[]{},new ConditionalFeature[]{});
     private static final SampleInfo SAMPLE_71 = new SampleInfo("Digital Clock","A digital clock application that demonstrates JavaFX animation, images, and effects. ","/Graphics/Digital Clock","/ensemble/samples/graphics/digitalclock","ensemble.samples.graphics.digitalclock.DigitalClockApp","/ensemble/samples/graphics/digitalclock/preview.png",new String[]{"/ensemble/samples/graphics/digitalclock/Clock.java","/ensemble/samples/graphics/digitalclock/Digit.java","/ensemble/samples/shared-resources/DigitalClock-background.png","/ensemble/samples/graphics/digitalclock/DigitalClockApp.java",},new String[]{"javafx.scene.effect.Glow","javafx.scene.shape.Polygon","javafx.scene.transform.Shear",},new String[]{},new String[]{},"/ensemble/samples/graphics/digitalclock/DigitalClockApp.java",new PlaygroundProperty[]{},new ConditionalFeature[]{});
@@ -100,13 +100,13 @@
     private static final SampleInfo SAMPLE_93 = new SampleInfo("Polyline","A sample that demonstrates polyline construction with stroke and fill. ","/Graphics/Shapes/Polyline","/ensemble/samples/graphics/shapes/polyline","ensemble.samples.graphics.shapes.polyline.PolylineApp","/ensemble/samples/graphics/shapes/polyline/preview.png",new String[]{"/ensemble/samples/graphics/shapes/polyline/PolylineApp.java",},new String[]{"javafx.scene.shape.Polyline","javafx.scene.shape.Shape","javafx.scene.paint.Color",},new String[]{},new String[]{},"/ensemble/samples/graphics/shapes/polyline/PolylineApp.java",new PlaygroundProperty[]{new PlaygroundProperty("polyline1","fill","name","Polyline 1 Fill"),new PlaygroundProperty("polyline1","stroke","name","Polyline 1 Stroke"),new PlaygroundProperty("polyline2","stroke","name","Polyline 2 Stroke"),},new ConditionalFeature[]{});
     private static final SampleInfo SAMPLE_94 = new SampleInfo("Quad Curve","An example of how various settings affect a quadratic B??zier parametric curve. ","/Graphics/Shapes/Quad Curve","/ensemble/samples/graphics/shapes/quadcurve","ensemble.samples.graphics.shapes.quadcurve.QuadCurveApp","/ensemble/samples/graphics/shapes/quadcurve/preview.png",new String[]{"/ensemble/samples/graphics/shapes/quadcurve/QuadCurveApp.java",},new String[]{"javafx.scene.shape.QuadCurve","javafx.scene.shape.Shape","javafx.scene.paint.Color",},new String[]{},new String[]{},"/ensemble/samples/graphics/shapes/quadcurve/QuadCurveApp.java",new PlaygroundProperty[]{new PlaygroundProperty("quadCurve","fill","name","Cubic Curve Fill"),new PlaygroundProperty("quadCurve","stroke","name","Cubic Curve Stroke"),new PlaygroundProperty("quadCurve","startX","min","0","max","170","name","Cubic Curve Start X"),new PlaygroundProperty("quadCurve","startY","min","10","max","80","name","Cubic Curve Start Y"),new PlaygroundProperty("quadCurve","controlX","min","0","max","180","name","Cubic Curve Control X"),new PlaygroundProperty("quadCurve","controlY","min","0","max","90","name","Cubic Curve Control Y"),new PlaygroundProperty("quadCurve","endX","min","10","max","180","name","Cubic Curve End X"),new PlaygroundProperty("quadCurve","endY","min","10","max","80","name","Cubic Curve End Y"),},new ConditionalFeature[]{});
     private static final SampleInfo SAMPLE_95 = new SampleInfo("Rectangle","A sample showing how various settings effect two rectangles. ","/Graphics/Shapes/Rectangle","/ensemble/samples/graphics/shapes/rectangle","ensemble.samples.graphics.shapes.rectangle.RectangleApp","/ensemble/samples/graphics/shapes/rectangle/preview.png",new String[]{"/ensemble/samples/graphics/shapes/rectangle/RectangleApp.java",},new String[]{"javafx.scene.shape.Rectangle","javafx.scene.shape.Shape","javafx.scene.paint.Color",},new String[]{},new String[]{},"/ensemble/samples/graphics/shapes/rectangle/RectangleApp.java",new PlaygroundProperty[]{new PlaygroundProperty("rect1","fill","name","Rectangle 1 Fill"),new PlaygroundProperty("rect1","width","min","10","max","50","name","Rectangle 1 Width"),new PlaygroundProperty("rect1","height","min","10","max","50","name","Rectangle 1 Height"),new PlaygroundProperty("rect1","arcWidth","min","0","max","50","name","Rectangle 1 Arc Width"),new PlaygroundProperty("rect1","arcHeight","min","0","max","50","name","Rectangle 1 Arc Height"),new PlaygroundProperty("rect2","stroke","name","Rectangle 2 Stroke"),new PlaygroundProperty("rect2","strokeWidth","min","1","max","5","name","Rectangle 2 Stroke Width"),new PlaygroundProperty("rect2","width","min","10","max","50","name","Rectangle 2 Width"),new PlaygroundProperty("rect2","height","min","10","max","50","name","Rectangle 2 Height"),new PlaygroundProperty("rect2","arcWidth","min","0","max","50","name","Rectangle 2 Arc Width"),new PlaygroundProperty("rect2","arcHeight","min","0","max","50","name","Rectangle 2 Arc Height"),},new ConditionalFeature[]{});
-    private static final SampleInfo SAMPLE_96 = new SampleInfo("3D Cubes","A sample that demonstrates an animated rotation of 3D cubes. When the application runs in standalone mode, the scene must be constructed with the depthBuffer argument set to true, and the root node must have depthTest set to true. ","/Graphics 3d/3D Cubes","/ensemble/samples/graphics3d/cube","ensemble.samples.graphics3d.cube.CubeApp","/ensemble/samples/graphics3d/cube/preview.png",new String[]{"/ensemble/samples/graphics3d/cube/Cube.java","/ensemble/samples/graphics3d/cube/CubeApp.java",},new String[]{"javafx.scene.transform.Rotate","javafx.scene.paint.Color","javafx.scene.shape.RectangleBuilder",},new String[]{},new String[]{},"/ensemble/samples/graphics3d/cube/CubeApp.java",new PlaygroundProperty[]{},new ConditionalFeature[]{});
-    private static final SampleInfo SAMPLE_97 = new SampleInfo("3D Cube System","A sample that demonstrates an animated rotation of 3D cubes. When the application runs in standalone mode, the scene must be constructed with the depthBuffer argument set to true, and the root node must have depthTest set to true. ","/Graphics 3d/3D Cube System","/ensemble/samples/graphics3d/cubesystem","ensemble.samples.graphics3d.cubesystem.CubeSystemApp","/ensemble/samples/graphics3d/cubesystem/preview.png",new String[]{"/ensemble/samples/graphics3d/cubesystem/Cube.java","/ensemble/samples/graphics3d/cubesystem/CubeSystemApp.java","/ensemble/samples/graphics3d/cubesystem/Xform.java",},new String[]{"javafx.scene.transform.Rotate","javafx.scene.paint.Color","javafx.scene.shape.RectangleBuilder",},new String[]{},new String[]{},"/ensemble/samples/graphics3d/cubesystem/CubeSystemApp.java",new PlaygroundProperty[]{},new ConditionalFeature[]{});
-    private static final SampleInfo SAMPLE_98 = new SampleInfo("3D Box","A sample that shows a 3D box and uses a perspective camera for rendering the scene. ","/Graphics 3d/3D Box","/ensemble/samples/graphics3d/simple3dbox","ensemble.samples.graphics3d.simple3dbox.Simple3DBoxApp","/ensemble/samples/graphics3d/simple3dbox/preview.png",new String[]{"/ensemble/samples/graphics3d/simple3dbox/Simple3DBoxApp.java",},new String[]{"javafx.scene.paint.Color","javafx.scene.transform.Rotate","javafx.scene.transform.Translate",},new String[]{},new String[]{},"/ensemble/samples/graphics3d/simple3dbox/Simple3DBoxApp.java",new PlaygroundProperty[]{},new ConditionalFeature[]{});
-    private static final SampleInfo SAMPLE_99 = new SampleInfo("Xylophone","A sample that demonstrates a xylophone made of 3D cubes. ","/Graphics 3d/Xylophone","/ensemble/samples/graphics3d/xylophone","ensemble.samples.graphics3d.xylophone.XylophoneApp","/ensemble/samples/graphics3d/xylophone/preview.png",new String[]{"/ensemble/samples/graphics3d/xylophone/Cube.java","/ensemble/samples/graphics3d/xylophone/Xform.java","/ensemble/samples/shared-resources/Note1.wav","/ensemble/samples/shared-resources/Note2.wav","/ensemble/samples/shared-resources/Note3.wav","/ensemble/samples/shared-resources/Note4.wav","/ensemble/samples/shared-resources/Note5.wav","/ensemble/samples/shared-resources/Note6.wav","/ensemble/samples/shared-resources/Note7.wav","/ensemble/samples/shared-resources/Note8.wav","/ensemble/samples/graphics3d/xylophone/XylophoneApp.java",},new String[]{"javafx.scene.transform.Rotate","javafx.scene.paint.Color","javafx.scene.PerspectiveCamera","javafx.scene.shape.RectangleBuilder","javafx.scene.SubScene",},new String[]{},new String[]{},"/ensemble/samples/graphics3d/xylophone/XylophoneApp.java",new PlaygroundProperty[]{},new ConditionalFeature[]{});
+    private static final SampleInfo SAMPLE_96 = new SampleInfo("3D Cubes","A sample that demonstrates an animated rotation of 3D cubes. ","/Graphics 3d/3D Cubes","/ensemble/samples/graphics3d/cube","ensemble.samples.graphics3d.cube.CubeApp","/ensemble/samples/graphics3d/cube/preview.png",new String[]{"/ensemble/samples/graphics3d/cube/Cube.java","/ensemble/samples/graphics3d/cube/CubeApp.java",},new String[]{"javafx.scene.PerspectiveCamera","javafx.scene.SubScene","javafx.scene.paint.Color","javafx.scene.transform.Rotate","javafx.scene.transform.Translate",},new String[]{},new String[]{},"/ensemble/samples/graphics3d/cube/CubeApp.java",new PlaygroundProperty[]{},new ConditionalFeature[]{ConditionalFeature.SCENE3D,});
+    private static final SampleInfo SAMPLE_97 = new SampleInfo("3D Cube System","A sample that demonstrates an animated rotation of 3D cubes. When the application runs in standalone mode, the scene must be constructed with the depthBuffer argument set to true, and the root node must have depthTest set to true. ","/Graphics 3d/3D Cube System","/ensemble/samples/graphics3d/cubesystem","ensemble.samples.graphics3d.cubesystem.CubeSystemApp","/ensemble/samples/graphics3d/cubesystem/preview.png",new String[]{"/ensemble/samples/graphics3d/cubesystem/Cube.java","/ensemble/samples/graphics3d/cubesystem/CubeSystemApp.java","/ensemble/samples/graphics3d/cubesystem/Xform.java",},new String[]{"javafx.scene.transform.Rotate","javafx.scene.paint.Color","javafx.scene.shape.RectangleBuilder",},new String[]{},new String[]{},"/ensemble/samples/graphics3d/cubesystem/CubeSystemApp.java",new PlaygroundProperty[]{},new ConditionalFeature[]{ConditionalFeature.SCENE3D,});
+    private static final SampleInfo SAMPLE_98 = new SampleInfo("3D Box","A sample that shows a 3D box and uses a perspective camera for rendering the scene. ","/Graphics 3d/3D Box","/ensemble/samples/graphics3d/simple3dbox","ensemble.samples.graphics3d.simple3dbox.Simple3DBoxApp","/ensemble/samples/graphics3d/simple3dbox/preview.png",new String[]{"/ensemble/samples/graphics3d/simple3dbox/Simple3DBoxApp.java",},new String[]{"javafx.scene.paint.Color","javafx.scene.transform.Rotate","javafx.scene.transform.Translate",},new String[]{},new String[]{},"/ensemble/samples/graphics3d/simple3dbox/Simple3DBoxApp.java",new PlaygroundProperty[]{},new ConditionalFeature[]{ConditionalFeature.SCENE3D,});
+    private static final SampleInfo SAMPLE_99 = new SampleInfo("Xylophone","A sample that demonstrates a xylophone made of 3D cubes. ","/Graphics 3d/Xylophone","/ensemble/samples/graphics3d/xylophone","ensemble.samples.graphics3d.xylophone.XylophoneApp","/ensemble/samples/graphics3d/xylophone/preview.png",new String[]{"/ensemble/samples/graphics3d/xylophone/Cube.java","/ensemble/samples/graphics3d/xylophone/Xform.java","/ensemble/samples/shared-resources/Note1.wav","/ensemble/samples/shared-resources/Note2.wav","/ensemble/samples/shared-resources/Note3.wav","/ensemble/samples/shared-resources/Note4.wav","/ensemble/samples/shared-resources/Note5.wav","/ensemble/samples/shared-resources/Note6.wav","/ensemble/samples/shared-resources/Note7.wav","/ensemble/samples/shared-resources/Note8.wav","/ensemble/samples/graphics3d/xylophone/XylophoneApp.java",},new String[]{"javafx.scene.transform.Rotate","javafx.scene.paint.Color","javafx.scene.PerspectiveCamera","javafx.scene.shape.RectangleBuilder","javafx.scene.SubScene",},new String[]{},new String[]{},"/ensemble/samples/graphics3d/xylophone/XylophoneApp.java",new PlaygroundProperty[]{},new ConditionalFeature[]{ConditionalFeature.SCENE3D,});
     private static final SampleInfo SAMPLE_100 = new SampleInfo("ChangeListener","A sample that demonstrates how to add or remove a change listener on a node (for example, a Rectangle node) for some property (for example, Rectangle.hover). Once you add a listener, the text field  shows the hover property change. ","/Language/Beans/ChangeListener","/ensemble/samples/language/beans/changelistener","ensemble.samples.language.beans.changelistener.ChangeListenerApp","/ensemble/samples/language/beans/changelistener/preview.png",new String[]{"/ensemble/samples/language/beans/changelistener/ChangeListenerApp.java",},new String[]{"javafx.beans.value.ChangeListener","javafx.beans.InvalidationListener","javafx.beans.value.ObservableValue",},new String[]{},new String[]{},"/ensemble/samples/language/beans/changelistener/ChangeListenerApp.java",new PlaygroundProperty[]{},new ConditionalFeature[]{});
     private static final SampleInfo SAMPLE_101 = new SampleInfo("String Binding","A sample that demonstrates how to bind text properties so the value of the bound property is updated automatically when the value of the original property is changed. ","/Language/Beans/String Binding","/ensemble/samples/language/beans/stringbinding","ensemble.samples.language.beans.stringbinding.StringBindingApp","/ensemble/samples/language/beans/stringbinding/preview.png",new String[]{"/ensemble/samples/language/beans/stringbinding/StringBindingApp.java",},new String[]{"javafx.beans.binding.StringBinding","javafx.scene.control.TextField","javafx.scene.control.Label",},new String[]{},new String[]{},"/ensemble/samples/language/beans/stringbinding/StringBindingApp.java",new PlaygroundProperty[]{},new ConditionalFeature[]{});
-    private static final SampleInfo SAMPLE_102 = new SampleInfo("ObservableList","A sample that demonstrates the ObservableList interface, which extends the java.util.List interface. Click the button to change an integer to a new random number in a random position in the list. Once you add a listener, the index of the changed number is displayed to the left of the list. ","/Language/Collections/ObservableList","/ensemble/samples/language/collections/observablelist","ensemble.samples.language.collections.observablelist.ObservableListApp","/ensemble/samples/language/collections/observablelist/preview.png",new String[]{"/ensemble/samples/language/collections/observablelist/ObservableListApp.java",},new String[]{"javafx.beans.value.ChangeListener","javafx.collections.FXCollections","javafx.collections.ListChangeListener","javafx.collections.ObservableList",},new String[]{},new String[]{},"/ensemble/samples/language/collections/observablelist/ObservableListApp.java",new PlaygroundProperty[]{},new ConditionalFeature[]{});
+    private static final SampleInfo SAMPLE_102 = new SampleInfo("ObservableList","A sample that demonstrates the ObservableList interface, which extends the java.util.List interface. Click the button to change an integer to a new random number in a random position in the list. Once you add a listener, the index of the changed number is displayed above the buttons. ","/Language/Collections/ObservableList","/ensemble/samples/language/collections/observablelist","ensemble.samples.language.collections.observablelist.ObservableListApp","/ensemble/samples/language/collections/observablelist/preview.png",new String[]{"/ensemble/samples/language/collections/observablelist/ObservableListApp.java",},new String[]{"javafx.beans.value.ChangeListener","javafx.collections.FXCollections","javafx.collections.ListChangeListener","javafx.collections.ObservableList",},new String[]{},new String[]{},"/ensemble/samples/language/collections/observablelist/ObservableListApp.java",new PlaygroundProperty[]{},new ConditionalFeature[]{});
     private static final SampleInfo SAMPLE_103 = new SampleInfo("AnchorPane","A simple example of an AnchorPane layout. ","/Layout/AnchorPane","/ensemble/samples/layout/anchorpane","ensemble.samples.layout.anchorpane.AnchorPaneApp","/ensemble/samples/layout/anchorpane/preview.png",new String[]{"/ensemble/samples/shared-resources/icon-48x48.png","/ensemble/samples/layout/anchorpane/AnchorPaneApp.java",},new String[]{"javafx.scene.layout.AnchorPane","javafx.collections.ObservableList",},new String[]{},new String[]{"/Controls/Text/Simple Label",},"/ensemble/samples/layout/anchorpane/AnchorPaneApp.java",new PlaygroundProperty[]{},new ConditionalFeature[]{});
     private static final SampleInfo SAMPLE_104 = new SampleInfo("BorderPane","An example of  a BorderPane layout, with placement of children in the top, left, center, right, and bottom positions. ","/Layout/BorderPane","/ensemble/samples/layout/borderpane","ensemble.samples.layout.borderpane.BorderPaneApp","/ensemble/samples/layout/borderpane/preview.png",new String[]{"/ensemble/samples/shared-resources/icon-48x48.png","/ensemble/samples/layout/borderpane/BorderPaneApp.java",},new String[]{"javafx.scene.layout.BorderPane",},new String[]{},new String[]{"/Controls/Text/Simple Label","/Graphics/Images/Image Creation",},"/ensemble/samples/layout/borderpane/BorderPaneApp.java",new PlaygroundProperty[]{},new ConditionalFeature[]{});
     private static final SampleInfo SAMPLE_105 = new SampleInfo("FlowPane","A simple example of a FlowPane layout. ","/Layout/FlowPane","/ensemble/samples/layout/flowpane","ensemble.samples.layout.flowpane.FlowPaneApp","/ensemble/samples/layout/flowpane/preview.png",new String[]{"/ensemble/samples/shared-resources/icon-48x48.png","/ensemble/samples/shared-resources/icon-68x68.png","/ensemble/samples/shared-resources/icon-88x88.png","/ensemble/samples/layout/flowpane/FlowPaneApp.java",},new String[]{"javafx.scene.layout.FlowPane",},new String[]{},new String[]{"/Graphics/Images/Image Creation",},"/ensemble/samples/layout/flowpane/FlowPaneApp.java",new PlaygroundProperty[]{},new ConditionalFeature[]{});
@@ -117,19 +117,19 @@
     private static final SampleInfo SAMPLE_110 = new SampleInfo("VBox","A simple example of a VBox layout. ","/Layout/VBox","/ensemble/samples/layout/vbox","ensemble.samples.layout.vbox.VBoxApp","/ensemble/samples/layout/vbox/preview.png",new String[]{"/ensemble/samples/layout/vbox/VBoxApp.java",},new String[]{"javafx.scene.layout.VBox",},new String[]{},new String[]{},"/ensemble/samples/layout/vbox/VBoxApp.java",new PlaygroundProperty[]{},new ConditionalFeature[]{});
     private static final SampleInfo SAMPLE_111 = new SampleInfo("Advanced Media","An advanced media player with controls for play/pause, seek, and volume. ","/Media/Advanced Media","/ensemble/samples/media/advancedmedia","ensemble.samples.media.advancedmedia.AdvancedMediaApp","/ensemble/samples/media/advancedmedia/preview.png",new String[]{"/ensemble/samples/media/advancedmedia/AdvancedMediaApp.java","/ensemble/samples/shared-resources/playbutton.png","/ensemble/samples/shared-resources/pausebutton.png","/ensemble/samples/media/advancedmedia/MediaControl.java",},new String[]{"javafx.scene.media.MediaPlayer","javafx.scene.media.Media",},new String[]{},new String[]{"/Media/Alpha Media Player","/Media/Overlay Media Player","/Media/Streaming Media Player",},"/ensemble/samples/media/advancedmedia/AdvancedMediaApp.java",new PlaygroundProperty[]{},new ConditionalFeature[]{ConditionalFeature.WEB,});
     private static final SampleInfo SAMPLE_112 = new SampleInfo("Alpha Media Player","An alpha media player with 2 different media views and alpha channels. ","/Media/Alpha Media Player","/ensemble/samples/media/alphamediaplayer","ensemble.samples.media.alphamediaplayer.AlphaMediaPlayerApp","/ensemble/samples/media/alphamediaplayer/preview.png",new String[]{"/ensemble/samples/media/alphamediaplayer/AlphaMediaPlayerApp.java","/ensemble/samples/media/alphamediaplayer/PlanetaryPlayerPane.java","/ensemble/samples/media/alphamediaplayer/AlphaMediaPlayer.css",},new String[]{"javafx.scene.media.MediaPlayer","javafx.scene.media.Media",},new String[]{},new String[]{"/Media/Advanced Media","/Media/Overlay Media Player","/Media/Streaming Media Player",},"/ensemble/samples/media/alphamediaplayer/AlphaMediaPlayerApp.java",new PlaygroundProperty[]{new PlaygroundProperty(null,"arthPos","min","-100","max","100","name","Arth Position"),new PlaygroundProperty(null,"fierPos","min","-100","max","100","name","Fier Position"),new PlaygroundProperty(null,"arthRate","min","0.1","max","1","name","Arth Rate"),new PlaygroundProperty(null,"fierRate","min","0.1","max","1","name","Fier Rate"),},new ConditionalFeature[]{ConditionalFeature.WEB,});
-    private static final SampleInfo SAMPLE_113 = new SampleInfo("Audio Clip","A sample that demonstrates the basics of AudioClips. ","/Media/Audio Clip","/ensemble/samples/media/audioclip","ensemble.samples.media.audioclip.AudioClipApp","/ensemble/samples/media/audioclip/preview.png",new String[]{"/ensemble/samples/shared-resources/Note1.wav","/ensemble/samples/shared-resources/Note2.wav","/ensemble/samples/shared-resources/Note3.wav","/ensemble/samples/shared-resources/Note4.wav","/ensemble/samples/shared-resources/Note5.wav","/ensemble/samples/shared-resources/Note6.wav","/ensemble/samples/shared-resources/Note7.wav","/ensemble/samples/shared-resources/Note8.wav","/ensemble/samples/media/audioclip/AudioClipApp.java","/ensemble/samples/media/audioclip/AudioClipApp.java.orig",},new String[]{"javafx.scene.media.AudioClip",},new String[]{},new String[]{"/Graphics3d/Xylophone",},"/ensemble/samples/media/audioclip/AudioClipApp.java",new PlaygroundProperty[]{},new ConditionalFeature[]{ConditionalFeature.WEB,});
+    private static final SampleInfo SAMPLE_113 = new SampleInfo("Audio Clip","A sample that demonstrates the basics of AudioClips. ","/Media/Audio Clip","/ensemble/samples/media/audioclip","ensemble.samples.media.audioclip.AudioClipApp","/ensemble/samples/media/audioclip/preview.png",new String[]{"/ensemble/samples/shared-resources/Note1.wav","/ensemble/samples/shared-resources/Note2.wav","/ensemble/samples/shared-resources/Note3.wav","/ensemble/samples/shared-resources/Note4.wav","/ensemble/samples/shared-resources/Note5.wav","/ensemble/samples/shared-resources/Note6.wav","/ensemble/samples/shared-resources/Note7.wav","/ensemble/samples/shared-resources/Note8.wav","/ensemble/samples/media/audioclip/AudioClipApp.java",},new String[]{"javafx.scene.media.AudioClip",},new String[]{},new String[]{"/Graphics3d/Xylophone",},"/ensemble/samples/media/audioclip/AudioClipApp.java",new PlaygroundProperty[]{},new ConditionalFeature[]{ConditionalFeature.WEB,});
     private static final SampleInfo SAMPLE_114 = new SampleInfo("Overlay Media Player","A media player with controls for play, pause, stop, seek, and volume. This media player also demonstrates overlaying the player controls on top of the media. ","/Media/Overlay Media Player","/ensemble/samples/media/overlaymediaplayer","ensemble.samples.media.overlaymediaplayer.OverlayMediaPlayerApp","/ensemble/samples/media/overlaymediaplayer/preview.png",new String[]{"/ensemble/samples/media/overlaymediaplayer/OverlayMediaPlayerApp.java","/ensemble/samples/media/overlaymediaplayer/PlayerPane.java","/ensemble/samples/media/overlaymediaplayer/OverlayMediaPlayer.css",},new String[]{"javafx.scene.media.MediaPlayer","javafx.scene.media.Media",},new String[]{},new String[]{"/Media/Advanced Media","/Media/Alpha Media Player","/Media/Streaming Media Player",},"/ensemble/samples/media/overlaymediaplayer/OverlayMediaPlayerApp.java",new PlaygroundProperty[]{},new ConditionalFeature[]{ConditionalFeature.WEB,});
     private static final SampleInfo SAMPLE_115 = new SampleInfo("Streaming Media Player","A media player with controls for play, pause, stop, seek, and volume. This media player is playing media via HTTP Live Streaming, also known as HLS. ","/Media/Streaming Media Player","/ensemble/samples/media/streamingmediaplayer","ensemble.samples.media.streamingmediaplayer.StreamingMediaPlayerApp","/ensemble/samples/media/streamingmediaplayer/preview.png",new String[]{"/ensemble/samples/media/streamingmediaplayer/PlayerPane.java","/ensemble/samples/media/streamingmediaplayer/StreamingMediaPlayerApp.java","/ensemble/samples/media/streamingmediaplayer/StreamingMediaPlayer.css",},new String[]{"javafx.scene.media.MediaPlayer","javafx.scene.media.Media",},new String[]{},new String[]{"/Media/Advanced Media","/Media/Alpha Media Player","/Media/Overlay Media Player",},"/ensemble/samples/media/streamingmediaplayer/StreamingMediaPlayerApp.java",new PlaygroundProperty[]{},new ConditionalFeature[]{ConditionalFeature.WEB,});
-    private static final SampleInfo SAMPLE_116 = new SampleInfo("Cursor","A sample that demonstrates changing the cursor icon. ","/Scenegraph/Events/Cursor","/ensemble/samples/scenegraph/events/cursor","ensemble.samples.scenegraph.events.cursor.CursorApp","/ensemble/samples/scenegraph/events/cursor/preview.png",new String[]{"/ensemble/samples/scenegraph/events/cursor/CursorApp.java","/ensemble/samples/scenegraph/events/cursor/CursorApp.java.orig",},new String[]{"javafx.scene.Cursor",},new String[]{},new String[]{},"/ensemble/samples/scenegraph/events/cursor/CursorApp.java",new PlaygroundProperty[]{},new ConditionalFeature[]{});
+    private static final SampleInfo SAMPLE_116 = new SampleInfo("Cursor","A sample that demonstrates changing the cursor icon. ","/Scenegraph/Events/Cursor","/ensemble/samples/scenegraph/events/cursor","ensemble.samples.scenegraph.events.cursor.CursorApp","/ensemble/samples/scenegraph/events/cursor/preview.png",new String[]{"/ensemble/samples/scenegraph/events/cursor/CursorApp.java",},new String[]{"javafx.scene.Cursor",},new String[]{},new String[]{},"/ensemble/samples/scenegraph/events/cursor/CursorApp.java",new PlaygroundProperty[]{},new ConditionalFeature[]{});
     private static final SampleInfo SAMPLE_117 = new SampleInfo("Gesture Event","A sample that demonstrates various gesture events and their usage. Scroll the rectangle or the background behind the rectangle to move the rectangle itself. Similarly, rotate, zoom in, or zoom out the rectangle. All events are logged to the console. ","/Scenegraph/Events/Gesture Event","/ensemble/samples/scenegraph/events/gestureevent","ensemble.samples.scenegraph.events.gestureevent.GestureEventApp","/ensemble/samples/scenegraph/events/gestureevent/preview.png",new String[]{"/ensemble/samples/scenegraph/events/gestureevent/GestureEventApp.java",},new String[]{"javafx.collections.ObservableList","javafx.scene.Cursor","javafx.scene.input.GestureEvent","javafx.scene.input.RotateEvent","javafx.scene.input.ScrollEvent","javafx.scene.input.SwipeEvent","javafx.scene.input.ZoomEvent","javafx.event.EventHandler",},new String[]{},new String[]{"/Scenegraph/Events/MouseEvent",},"/ensemble/samples/scenegraph/events/gestureevent/GestureEventApp.java",new PlaygroundProperty[]{},new ConditionalFeature[]{});
     private static final SampleInfo SAMPLE_118 = new SampleInfo("KeyEvent","A sample that demonstrates various key events and their usage. Type in the text box to view the triggered events: key pressed, key typed and key released. Pressing the Shift, Ctrl, and Alt keys also trigger events. ","/Scenegraph/Events/KeyEvent","/ensemble/samples/scenegraph/events/keyevent","ensemble.samples.scenegraph.events.keyevent.KeyEventApp","/ensemble/samples/scenegraph/events/keyevent/preview.png",new String[]{"/ensemble/samples/scenegraph/events/keyevent/KeyEventApp.java",},new String[]{"javafx.scene.input.KeyCode","javafx.scene.input.KeyEvent","javafx.event.EventHandler",},new String[]{},new String[]{},"/ensemble/samples/scenegraph/events/keyevent/KeyEventApp.java",new PlaygroundProperty[]{},new ConditionalFeature[]{});
     private static final SampleInfo SAMPLE_119 = new SampleInfo("Key Stroke Motion","An example of animation generated from key events. Click the grey area to give it focus and try typing letters. ","/Scenegraph/Events/Key Stroke Motion","/ensemble/samples/scenegraph/events/keystrokemotion","ensemble.samples.scenegraph.events.keystrokemotion.KeyStrokeMotionApp","/ensemble/samples/scenegraph/events/keystrokemotion/preview.png",new String[]{"/ensemble/samples/scenegraph/events/keystrokemotion/KeyStrokeMotionApp.java","/ensemble/samples/scenegraph/events/keystrokemotion/LettersPane.java",},new String[]{"javafx.scene.input.KeyEvent","javafx.animation.Interpolator",},new String[]{},new String[]{},"/ensemble/samples/scenegraph/events/keystrokemotion/KeyStrokeMotionApp.java",new PlaygroundProperty[]{},new ConditionalFeature[]{});
     private static final SampleInfo SAMPLE_120 = new SampleInfo("MouseEvent","A sample that demonstrates various mouse and scroll events and their usage. Click the circles and drag them across the screen. Scroll the whole screen. All events are logged to the console. ","/Scenegraph/Events/MouseEvent","/ensemble/samples/scenegraph/events/mouseevent","ensemble.samples.scenegraph.events.mouseevent.MouseEventApp","/ensemble/samples/scenegraph/events/mouseevent/preview.png",new String[]{"/ensemble/samples/scenegraph/events/mouseevent/MouseEventApp.java",},new String[]{"javafx.scene.Cursor","javafx.scene.input.MouseEvent","javafx.event.EventHandler",},new String[]{},new String[]{},"/ensemble/samples/scenegraph/events/mouseevent/MouseEventApp.java",new PlaygroundProperty[]{},new ConditionalFeature[]{});
     private static final SampleInfo SAMPLE_121 = new SampleInfo("Multi-Touch","A sample that demonstrates multi-touch support. You can zoom in and out of the images and also rotate the images with multi-touch. ","/Scenegraph/Events/Multi-Touch","/ensemble/samples/scenegraph/events/multitouch","ensemble.samples.scenegraph.events.multitouch.MultiTouchApp","/ensemble/samples/scenegraph/events/multitouch/preview.png",new String[]{"/ensemble/samples/scenegraph/events/multitouch/MultiTouchApp.java","/ensemble/samples/scenegraph/events/multitouch/MultiTouchImageView.java","/ensemble/samples/shared-resources/warning.png","/ensemble/samples/shared-resources/Animal1.jpg","/ensemble/samples/shared-resources/Animal2.jpg","/ensemble/samples/shared-resources/Animal3.jpg","/ensemble/samples/scenegraph/events/multitouch/MultiTouchPane.java",},new String[]{"javafx.scene.input.MouseEvent","javafx.event.EventHandler","javafx.scene.input.RotateEvent","javafx.scene.input.ZoomEvent",},new String[]{},new String[]{},"/ensemble/samples/scenegraph/events/multitouch/MultiTouchApp.java",new PlaygroundProperty[]{},new ConditionalFeature[]{ConditionalFeature.INPUT_MULTITOUCH,});
-    private static final SampleInfo SAMPLE_122 = new SampleInfo("Custom Node","A sample that demonstrates how to create a custom node by extending the Parent class. ","/Scenegraph/Node/Custom Node","/ensemble/samples/scenegraph/node/customnode","ensemble.samples.scenegraph.node.customnode.CustomNodeApp","/ensemble/samples/scenegraph/node/customnode/preview.png",new String[]{"/ensemble/samples/scenegraph/node/customnode/CustomNodeApp.java","/ensemble/samples/scenegraph/node/customnode/CustomNodeApp.java.orig","/ensemble/samples/scenegraph/node/customnode/MyNode.java",},new String[]{"javafx.scene.Parent","javafx.scene.Node",},new String[]{},new String[]{},"/ensemble/samples/scenegraph/node/customnode/CustomNodeApp.java",new PlaygroundProperty[]{},new ConditionalFeature[]{});
+    private static final SampleInfo SAMPLE_122 = new SampleInfo("Custom Node","A sample that demonstrates how to create a custom node by extending the Parent class. ","/Scenegraph/Node/Custom Node","/ensemble/samples/scenegraph/node/customnode","ensemble.samples.scenegraph.node.customnode.CustomNodeApp","/ensemble/samples/scenegraph/node/customnode/preview.png",new String[]{"/ensemble/samples/scenegraph/node/customnode/CustomNodeApp.java","/ensemble/samples/scenegraph/node/customnode/MyNode.java",},new String[]{"javafx.scene.Parent","javafx.scene.Node",},new String[]{},new String[]{},"/ensemble/samples/scenegraph/node/customnode/CustomNodeApp.java",new PlaygroundProperty[]{},new ConditionalFeature[]{});
     private static final SampleInfo SAMPLE_123 = new SampleInfo("Node Properties","A sample that demonstrates some properties of nodes. Use the radio buttons to send any of the rectangles to the front or back. Use the controls to change opacity or horizontal position. ","/Scenegraph/Node/Node Properties","/ensemble/samples/scenegraph/node/nodeproperties","ensemble.samples.scenegraph.node.nodeproperties.NodePropertiesApp","/ensemble/samples/scenegraph/node/nodeproperties/preview.png",new String[]{"/ensemble/samples/scenegraph/node/nodeproperties/NodePropertiesApp.java",},new String[]{"javafx.scene.Node",},new String[]{},new String[]{},"/ensemble/samples/scenegraph/node/nodeproperties/NodePropertiesApp.java",new PlaygroundProperty[]{new PlaygroundProperty("rectA","translateX","min","0","max","50","name","Rectangle A translate X"),new PlaygroundProperty("rectB","translateX","min","0","max","50","name","Rectangle B translate X"),new PlaygroundProperty("rectC","translateX","min","0","max","50","name","Rectangle C translate X"),new PlaygroundProperty("rectA","opacity","min","0","max","1","name","Rectangle A Opacity"),new PlaygroundProperty("rectB","opacity","min","0","max","1","name","Rectangle B Opacity"),new PlaygroundProperty("rectC","opacity","min","0","max","1","name","Rectangle C Opacity"),},new ConditionalFeature[]{});
     private static final SampleInfo SAMPLE_124 = new SampleInfo("Advanced Stage","A sample with a control that creates a transparent stage that is centered on your desktop. You can drag the stage with your mouse or use the scene controls to minimize or close it. With a transparent stage, you must add your own event handlers to perform these actions. ","/Scenegraph/Stage/Advanced Stage","/ensemble/samples/scenegraph/stage/advancedstage","ensemble.samples.scenegraph.stage.advancedstage.AdvancedStageApp","/ensemble/samples/scenegraph/stage/advancedstage/preview.png",new String[]{"/ensemble/samples/scenegraph/stage/advancedstage/AdvancedStageApp.java",},new String[]{"javafx.stage.Stage","javafx.scene.Scene","javafx.stage.StageStyle","javafx.application.Platform",},new String[]{},new String[]{"/Scenegraph/Stage/Stage",},"/ensemble/samples/scenegraph/stage/advancedstage/AdvancedStageApp.java",new PlaygroundProperty[]{},new ConditionalFeature[]{});
-    private static final SampleInfo SAMPLE_125 = new SampleInfo("Stage","A sample with a control that creates a decorated stage that is centered on your desktop. ","/Scenegraph/Stage/Stage","/ensemble/samples/scenegraph/stage/stage","ensemble.samples.scenegraph.stage.stage.StageApp","/ensemble/samples/scenegraph/stage/stage/preview.png",new String[]{"/ensemble/samples/scenegraph/stage/stage/StageApp.java","/ensemble/samples/scenegraph/stage/stage/StageApp.java.orig",},new String[]{"javafx.stage.Stage","javafx.scene.Scene",},new String[]{},new String[]{"/Scenegraph/Stage/Advanced Stage",},"/ensemble/samples/scenegraph/stage/stage/StageApp.java",new PlaygroundProperty[]{},new ConditionalFeature[]{});
+    private static final SampleInfo SAMPLE_125 = new SampleInfo("Stage","A sample with a control that creates a decorated stage that is centered on your desktop. ","/Scenegraph/Stage/Stage","/ensemble/samples/scenegraph/stage/stage","ensemble.samples.scenegraph.stage.stage.StageApp","/ensemble/samples/scenegraph/stage/stage/preview.png",new String[]{"/ensemble/samples/scenegraph/stage/stage/StageApp.java",},new String[]{"javafx.stage.Stage","javafx.scene.Scene",},new String[]{},new String[]{"/Scenegraph/Stage/Advanced Stage",},"/ensemble/samples/scenegraph/stage/stage/StageApp.java",new PlaygroundProperty[]{},new ConditionalFeature[]{});
     private static final SampleInfo SAMPLE_126 = new SampleInfo("SwingInterop","A sample that invokes SwingInterop to run in a separate JVM.  SwingInterop shows how to embed JavaFX components, like Chart and WebView components, in a Swing application. ","/Swing/SwingInterop","/ensemble/samples/swing/swinginterop","ensemble.samples.swing.swinginterop.SwingInteropApp","/ensemble/samples/swing/swinginterop/preview.png",new String[]{"/ensemble/samples/swing/swinginterop/ProcessListener.java","/ensemble/samples/swing/swinginterop/SampleTableModel.java","/ensemble/samples/swing/swinginterop/SwingInterop.java","/ensemble/samples/swing/swinginterop/SwingInteropApp.java","/ensemble/samples/swing/swinginterop/SwingInteropService.java","/ensemble/samples/swing/swinginterop/SwingInteropTask.java",},new String[]{"javafx.application.Application","javafx.stage.Stage","javafx.scene.Scene","javafx.scene.chart.BarChart","javafx.scene.chart.CategoryAxis","javafx.scene.chart.Chart","javafx.scene.chart.NumberAxis","javafx.scene.chart.XYChart","javafx.scene.web.WebEngine","javafx.scene.web.WebView",},new String[]{},new String[]{},"/ensemble/samples/swing/swinginterop/SwingInteropApp.java",new PlaygroundProperty[]{},new ConditionalFeature[]{});
     private static final SampleInfo SAMPLE_127 = new SampleInfo("Bidi","Demonstrates bi-directional text. ","/Text/Bidi","/ensemble/samples/text/bidi","ensemble.samples.text.bidi.BidiApp","/ensemble/samples/text/bidi/preview.png",new String[]{"/ensemble/samples/text/bidi/BidiApp.java",},new String[]{"javafx.scene.text.Text","javafx.scene.text.TextFlow",},new String[]{},new String[]{},"/ensemble/samples/text/bidi/BidiApp.java",new PlaygroundProperty[]{new PlaygroundProperty("text1","strikethrough","name","He said... strikethrough"),new PlaygroundProperty("text1","underline","name","He said... underline"),new PlaygroundProperty("text1","fill","name","He said... fill"),new PlaygroundProperty("text1","rotate","min","-180","max","180","name","He said... rotate"),new PlaygroundProperty("text1","translateX","name","He said... translateX"),new PlaygroundProperty("text1","translateY","name","He said... translateY"),new PlaygroundProperty("text2","strikethrough","name","He said... strikethrough"),new PlaygroundProperty("text2","underline","name","...to me. underline"),new PlaygroundProperty("text2","fill","name","...to me. fill"),new PlaygroundProperty("text2","rotate","min","-180","max","180","name","...to me. rotate"),new PlaygroundProperty("text2","translateX","name","...to me. translateX"),new PlaygroundProperty("text2","translateY","name","...to me. translateY"),},new ConditionalFeature[]{});
     private static final SampleInfo SAMPLE_128 = new SampleInfo("TextFlow","Demonstrates some simple uses of rich text and TextFlow.The first example shows use of text with different fonts in a TextFlow. Use the Playground to experiment with different Text properties. The second example shows TextFlow and embedded objects. ","/Text/TextFlow","/ensemble/samples/text/textflow","ensemble.samples.text.textflow.TextFlowApp","/ensemble/samples/text/textflow/preview.png",new String[]{"/ensemble/samples/shared-resources/oracle.png","/ensemble/samples/text/textflow/TextFlowApp.java",},new String[]{"javafx.scene.text.Font","javafx.scene.text.FontPosture","javafx.scene.text.Text","javafx.scene.text.TextFlow",},new String[]{},new String[]{},"/ensemble/samples/text/textflow/TextFlowApp.java",new PlaygroundProperty[]{new PlaygroundProperty("textHello","strikethrough","name","Hello strikethrough"),new PlaygroundProperty("textHello","underline","name","Hello underline"),new PlaygroundProperty("textHello","fill","name","Hello fill"),new PlaygroundProperty("textHello","rotate","min","-180","max","180","name","Hello rotate"),new PlaygroundProperty("textHello","translateX","name","Hello translateX"),new PlaygroundProperty("textHello","translateY","name","Hello translateY"),new PlaygroundProperty("textBold","strikethrough","name","Bold strikethrough"),new PlaygroundProperty("textBold","underline","name","Bold underline"),new PlaygroundProperty("textBold","fill","name","Bold fill"),new PlaygroundProperty("textBold","rotate","min","-180","max","180","name","Bold rotate"),new PlaygroundProperty("textBold","translateX","name","Bold translateX"),new PlaygroundProperty("textBold","translateY","name","Bold translateY"),new PlaygroundProperty("textWorld","strikethrough","name","World strikethrough"),new PlaygroundProperty("textWorld","underline","name","World underline"),new PlaygroundProperty("textWorld","fill","name","World fill"),new PlaygroundProperty("textWorld","rotate","min","-180","max","180","name","World rotate"),new PlaygroundProperty("textWorld","translateX","name","World translateX"),new PlaygroundProperty("textWorld","translateY","name","World translateY"),},new ConditionalFeature[]{});
@@ -171,7 +171,7 @@
         DOCS_URL_TO_SAMPLE.put("javafx.scene.layout.TilePane",new SampleInfo[]{SAMPLE_109,});
         DOCS_URL_TO_SAMPLE.put("javafx.animation.SequentialTransition",new SampleInfo[]{SAMPLE_10,SAMPLE_30,});
         DOCS_URL_TO_SAMPLE.put("javafx.concurrent.Task",new SampleInfo[]{SAMPLE_32,SAMPLE_33,});
-        DOCS_URL_TO_SAMPLE.put("javafx.scene.transform.Translate",new SampleInfo[]{SAMPLE_98,});
+        DOCS_URL_TO_SAMPLE.put("javafx.scene.transform.Translate",new SampleInfo[]{SAMPLE_98,SAMPLE_96,});
         DOCS_URL_TO_SAMPLE.put("javafx.scene.layout.StackPane",new SampleInfo[]{SAMPLE_108,});
         DOCS_URL_TO_SAMPLE.put("javafx.scene.chart.PieChart",new SampleInfo[]{SAMPLE_29,SAMPLE_28,});
         DOCS_URL_TO_SAMPLE.put("javafx.scene.chart.NumberAxis",new SampleInfo[]{SAMPLE_22,SAMPLE_21,SAMPLE_24,SAMPLE_23,SAMPLE_20,SAMPLE_19,SAMPLE_18,SAMPLE_26,SAMPLE_17,SAMPLE_16,SAMPLE_25,SAMPLE_15,SAMPLE_27,SAMPLE_14,SAMPLE_30,SAMPLE_31,SAMPLE_126,});
@@ -180,7 +180,7 @@
         DOCS_URL_TO_SAMPLE.put("javafx.animation.ParallelTransition",new SampleInfo[]{SAMPLE_5,});
         DOCS_URL_TO_SAMPLE.put("javafx.beans.value.ObservableValue",new SampleInfo[]{SAMPLE_100,});
         DOCS_URL_TO_SAMPLE.put("javafx.scene.transform.Shear",new SampleInfo[]{SAMPLE_71,});
-        DOCS_URL_TO_SAMPLE.put("javafx.scene.SubScene",new SampleInfo[]{SAMPLE_99,});
+        DOCS_URL_TO_SAMPLE.put("javafx.scene.SubScene",new SampleInfo[]{SAMPLE_99,SAMPLE_96,});
         DOCS_URL_TO_SAMPLE.put("javafx.scene.media.Media",new SampleInfo[]{SAMPLE_114,SAMPLE_112,SAMPLE_111,SAMPLE_18,SAMPLE_115,SAMPLE_14,});
         DOCS_URL_TO_SAMPLE.put("javafx.scene.chart.XYChart",new SampleInfo[]{SAMPLE_24,SAMPLE_18,SAMPLE_126,SAMPLE_14,});
         DOCS_URL_TO_SAMPLE.put("javafx.scene.control.Hyperlink",new SampleInfo[]{SAMPLE_39,});
@@ -201,7 +201,7 @@
         DOCS_URL_TO_SAMPLE.put("javafx.scene.input.KeyCode",new SampleInfo[]{SAMPLE_118,});
         DOCS_URL_TO_SAMPLE.put("javafx.scene.shape.Ellipse",new SampleInfo[]{SAMPLE_74,SAMPLE_89,});
         DOCS_URL_TO_SAMPLE.put("java.util.HashMap",new SampleInfo[]{SAMPLE_66,});
-        DOCS_URL_TO_SAMPLE.put("javafx.scene.PerspectiveCamera",new SampleInfo[]{SAMPLE_99,});
+        DOCS_URL_TO_SAMPLE.put("javafx.scene.PerspectiveCamera",new SampleInfo[]{SAMPLE_99,SAMPLE_96,});
         DOCS_URL_TO_SAMPLE.put("javafx.scene.control.Menu",new SampleInfo[]{SAMPLE_40,});
         DOCS_URL_TO_SAMPLE.put("javafx.scene.media.AudioClip",new SampleInfo[]{SAMPLE_113,});
         DOCS_URL_TO_SAMPLE.put("javafx.scene.control.TabBuilder",new SampleInfo[]{SAMPLE_55,});
@@ -213,7 +213,7 @@
         DOCS_URL_TO_SAMPLE.put("javafx.scene.chart.LineChart",new SampleInfo[]{SAMPLE_26,SAMPLE_25,SAMPLE_27,});
         DOCS_URL_TO_SAMPLE.put("javafx.scene.effect.SepiaTone",new SampleInfo[]{SAMPLE_79,});
         DOCS_URL_TO_SAMPLE.put("java.util.ArrayList",new SampleInfo[]{SAMPLE_67,});
-        DOCS_URL_TO_SAMPLE.put("javafx.scene.shape.RectangleBuilder",new SampleInfo[]{SAMPLE_99,SAMPLE_97,SAMPLE_96,});
+        DOCS_URL_TO_SAMPLE.put("javafx.scene.shape.RectangleBuilder",new SampleInfo[]{SAMPLE_99,SAMPLE_97,});
         DOCS_URL_TO_SAMPLE.put("javafx.stage.Stage",new SampleInfo[]{SAMPLE_124,SAMPLE_125,SAMPLE_69,SAMPLE_67,SAMPLE_66,SAMPLE_126,});
         DOCS_URL_TO_SAMPLE.put("javafx.scene.effect.Reflection",new SampleInfo[]{SAMPLE_72,SAMPLE_78,SAMPLE_67,});
         DOCS_URL_TO_SAMPLE.put("javafx.scene.control.Pagination",new SampleInfo[]{SAMPLE_41,});
--- a/apps/samples/Ensemble8/src/samples/java/ensemble/samples/graphics3d/cube/CubeApp.java	Tue Oct 01 10:00:06 2013 -0400
+++ b/apps/samples/Ensemble8/src/samples/java/ensemble/samples/graphics3d/cube/CubeApp.java	Tue Oct 01 10:06:51 2013 -0700
@@ -36,39 +36,44 @@
 import javafx.animation.KeyValue;
 import javafx.animation.Timeline;
 import javafx.application.Application;
+import javafx.application.ConditionalFeature;
 import javafx.scene.Group;
 import javafx.scene.Parent;
+import javafx.scene.PerspectiveCamera;
 import javafx.scene.Scene;
+import javafx.scene.SubScene;
 import javafx.scene.paint.Color;
+import javafx.scene.transform.Translate;
 import javafx.stage.Stage;
 import javafx.util.Duration;
 
 /**
- * A sample that demonstrates an animated rotation of 3D cubes. When the
- * application runs in standalone mode, the scene must be constructed with the
- * depthBuffer argument set to true, and the root node must have depthTest set
- * to true.
+ * A sample that demonstrates an animated rotation of 3D cubes. 
  *
  * @sampleName 3D Cubes
  * @preview preview.png
+ * @see javafx.scene.PerspectiveCamera
+ * @see javafx.scene.SubScene
+ * @see javafx.scene.paint.Color
  * @see javafx.scene.transform.Rotate
- * @see javafx.scene.paint.Color
- * @see javafx.scene.shape.RectangleBuilder
+ * @see javafx.scene.transform.Translate
+ * @conditionalFeatures SCENE3D
  */
 public class CubeApp extends Application {
 
     private Timeline animation;
 
     public Parent createContent() {
-        Cube c = new Cube(50, Color.RED, 1);
+        Cube c = new Cube(1, Color.RED, 1);
         c.rx.setAngle(45);
         c.ry.setAngle(45);
-        Cube c2 = new Cube(50, Color.GREEN, 1);
-        c2.setTranslateX(100);
+        Cube c2 = new Cube(1, Color.GREEN, 1);
+        c2.setTranslateX(2);
         c2.rx.setAngle(45);
         c2.ry.setAngle(45);
-        Cube c3 = new Cube(50, Color.ORANGE, 1);
-        c3.setTranslateX(-100);
+
+        Cube c3 = new Cube(1, Color.ORANGE, 1);
+        c3.setTranslateX(-2);
         c3.rx.setAngle(45);
         c3.ry.setAngle(45);
 
@@ -84,8 +89,17 @@
                 new KeyValue(c3.rz.angleProperty(), 360d)));
         animation.setCycleCount(Animation.INDEFINITE);
 
-        return new Group(c, c2, c3);
+        PerspectiveCamera camera = new PerspectiveCamera(true);
+        camera.getTransforms().add(new Translate(0, 0, -15));
 
+        Group root = new Group();
+        root.getChildren().addAll(c, c2, c3);
+        SubScene subScene = new SubScene(root, 300, 300);
+        subScene.setCamera(camera);
+        Group group = new Group();
+        group.getChildren().add(subScene);
+
+        return group;
     }
 
     public void play() {
--- a/apps/samples/Ensemble8/src/samples/java/ensemble/samples/graphics3d/cubesystem/CubeSystemApp.java	Tue Oct 01 10:00:06 2013 -0400
+++ b/apps/samples/Ensemble8/src/samples/java/ensemble/samples/graphics3d/cubesystem/CubeSystemApp.java	Tue Oct 01 10:06:51 2013 -0700
@@ -52,6 +52,7 @@
  * @see javafx.scene.transform.Rotate
  * @see javafx.scene.paint.Color
  * @see javafx.scene.shape.RectangleBuilder
+ * @conditionalFeatures SCENE3D
  */
 public class CubeSystemApp extends Application {
 
--- a/apps/samples/Ensemble8/src/samples/java/ensemble/samples/graphics3d/simple3dbox/Simple3DBoxApp.java	Tue Oct 01 10:00:06 2013 -0400
+++ b/apps/samples/Ensemble8/src/samples/java/ensemble/samples/graphics3d/simple3dbox/Simple3DBoxApp.java	Tue Oct 01 10:06:51 2013 -0700
@@ -54,6 +54,7 @@
  * @see javafx.scene.paint.Color
  * @see javafx.scene.transform.Rotate
  * @see javafx.scene.transform.Translate
+ * @conditionalFeatures SCENE3D
  */
 public class Simple3DBoxApp extends Application {
    
--- a/apps/samples/Ensemble8/src/samples/java/ensemble/samples/graphics3d/xylophone/XylophoneApp.java	Tue Oct 01 10:00:06 2013 -0400
+++ b/apps/samples/Ensemble8/src/samples/java/ensemble/samples/graphics3d/xylophone/XylophoneApp.java	Tue Oct 01 10:06:51 2013 -0700
@@ -60,6 +60,7 @@
  * @see javafx.scene.PerspectiveCamera
  * @see javafx.scene.shape.RectangleBuilder
  * @see javafx.scene.SubScene
+ * @conditionalFeatures SCENE3D
  */
 public class XylophoneApp extends Application {
 
--- a/apps/samples/Ensemble8/src/samples/java/ensemble/samples/language/collections/observablelist/ObservableListApp.java	Tue Oct 01 10:00:06 2013 -0400
+++ b/apps/samples/Ensemble8/src/samples/java/ensemble/samples/language/collections/observablelist/ObservableListApp.java	Tue Oct 01 10:06:51 2013 -0700
@@ -45,7 +45,6 @@
 import javafx.scene.Scene;
 import javafx.scene.control.Button;
 import javafx.scene.layout.VBox;
-import javafx.scene.shape.Rectangle;
 import javafx.scene.text.Text;
 import javafx.scene.text.TextAlignment;
 import javafx.stage.Stage;
@@ -54,7 +53,7 @@
  * A sample that demonstrates the ObservableList interface, which extends the
  * java.util.List interface. Click the button to change an integer to a new
  * random number in a random position in the list. Once you add a listener,
- * the index of the changed number is displayed to the left of the list.
+ * the index of the changed number is displayed above the buttons.
  *
  * @sampleName ObservableList
  * @preview preview.png
--- a/apps/samples/Ensemble8/src/samples/java/ensemble/samples/scenegraph/events/cursor/CursorApp.java	Tue Oct 01 10:00:06 2013 -0400
+++ b/apps/samples/Ensemble8/src/samples/java/ensemble/samples/scenegraph/events/cursor/CursorApp.java	Tue Oct 01 10:06:51 2013 -0700
@@ -38,6 +38,7 @@
 import javafx.scene.Parent;
 import javafx.scene.Scene;
 import javafx.scene.control.Label;
+import javafx.scene.control.ScrollPane;
 import javafx.scene.layout.TilePane;
 import javafx.stage.Stage;
 
@@ -51,43 +52,50 @@
 public class CursorApp extends Application {
     
     public Parent createContent() {
+
+        ScrollPane root = new ScrollPane();
+        root.setPrefSize(435, 269);
+        root.setMinSize(ScrollPane.USE_PREF_SIZE, ScrollPane.USE_PREF_SIZE);
+        root.setMaxSize(ScrollPane.USE_PREF_SIZE, ScrollPane.USE_PREF_SIZE);
+
         TilePane tilePaneRoot = new TilePane(5, 5);
         tilePaneRoot.setHgap(2);
         tilePaneRoot.setVgap(2);
         tilePaneRoot.getChildren().addAll(
-            createBox(Cursor.DEFAULT),
-            createBox(Cursor.CROSSHAIR),
-            createBox(Cursor.TEXT),
-            createBox(Cursor.WAIT),
-            createBox(Cursor.SW_RESIZE),
-            createBox(Cursor.SE_RESIZE),
-            createBox(Cursor.NW_RESIZE),
-            createBox(Cursor.NE_RESIZE),
-            createBox(Cursor.N_RESIZE),
-            createBox(Cursor.S_RESIZE),
-            createBox(Cursor.W_RESIZE),
-            createBox(Cursor.E_RESIZE),
-            createBox(Cursor.OPEN_HAND),
-            createBox(Cursor.CLOSED_HAND),
-            createBox(Cursor.HAND),
-            createBox(Cursor.DISAPPEAR),
-            createBox(Cursor.MOVE),
-            createBox(Cursor.H_RESIZE),
-            createBox(Cursor.V_RESIZE),
-            createBox(Cursor.NONE)
-        );       
-        return tilePaneRoot;
+                createBox(Cursor.DEFAULT),
+                createBox(Cursor.CROSSHAIR),
+                createBox(Cursor.TEXT),
+                createBox(Cursor.WAIT),
+                createBox(Cursor.SW_RESIZE),
+                createBox(Cursor.SE_RESIZE),
+                createBox(Cursor.NW_RESIZE),
+                createBox(Cursor.NE_RESIZE),
+                createBox(Cursor.N_RESIZE),
+                createBox(Cursor.S_RESIZE),
+                createBox(Cursor.W_RESIZE),
+                createBox(Cursor.E_RESIZE),
+                createBox(Cursor.OPEN_HAND),
+                createBox(Cursor.CLOSED_HAND),
+                createBox(Cursor.HAND),
+                createBox(Cursor.DISAPPEAR),
+                createBox(Cursor.MOVE),
+                createBox(Cursor.H_RESIZE),
+                createBox(Cursor.V_RESIZE),
+                createBox(Cursor.NONE));
+        root.setContent(tilePaneRoot);
+        return root;
     }
-    
+
     private Node createBox(Cursor cursor) {
         Label label = new Label(cursor.toString());
         label.setAlignment(Pos.CENTER);
-        label.setPrefSize(85, 85);
+        label.setWrapText(true);
+        label.setPrefSize(85, 65);
         label.setStyle("-fx-border-color: #aaaaaa; -fx-background-color: #dddddd;");
         label.setCursor(cursor);
         return label;
-    }  
-    
+    }
+
     @Override
     public void start(Stage primaryStage) throws Exception {
         primaryStage.setScene(new Scene(createContent()));
--- a/apps/toys/FX8-3DFeatures/src/fx83dfeatures/NearAndFarClipTest.java	Tue Oct 01 10:00:06 2013 -0400
+++ b/apps/toys/FX8-3DFeatures/src/fx83dfeatures/NearAndFarClipTest.java	Tue Oct 01 10:06:51 2013 -0700
@@ -25,9 +25,11 @@
 package fx83dfeatures;
 
 import javafx.application.Application;
+import javafx.event.EventHandler;
 import javafx.scene.Group;
 import javafx.scene.PerspectiveCamera;
 import javafx.scene.Scene;
+import javafx.scene.input.MouseEvent;
 import javafx.scene.paint.Color;
 import javafx.scene.shape.Rectangle;
 import javafx.stage.Stage;
@@ -52,7 +54,7 @@
         final double farClipDistance = focalLength * FAR + eyePositionZ;
         final double nearClipDistanceOffset = Math.abs(nearClipDistance * OFFSET_PERCENT);
         final double farClipDistanceOffset = Math.abs(farClipDistance * OFFSET_PERCENT);
-        
+
         System.out.println("In scene coordinate: focalLength = " + focalLength
                 + ", nearClipDistance = " + nearClipDistance
                 + ", nearClipDistanceOffset = " + nearClipDistanceOffset
@@ -62,26 +64,31 @@
         Rectangle insideRect = new Rectangle(220, 220, Color.GREEN);
         insideRect.setLayoutX(140);
         insideRect.setLayoutY(140);
+        insideRect.setId("Green");
 
         Rectangle insideNearClip = new Rectangle(16, 16, Color.BLUE);
         insideNearClip.setLayoutX(242);
         insideNearClip.setLayoutY(242);
         insideNearClip.setTranslateZ(nearClipDistance + nearClipDistanceOffset);
+        insideNearClip.setId("Blue");
 
         Rectangle outsideNearClip = new Rectangle(16, 16, Color.YELLOW);
         outsideNearClip.setLayoutX(242);
         outsideNearClip.setLayoutY(242);
         outsideNearClip.setTranslateZ(nearClipDistance - nearClipDistanceOffset);
+        outsideNearClip.setId("Yellow");
 
         Rectangle insideFarClip = new Rectangle(3000, 3000, Color.RED);
         insideFarClip.setTranslateX(-1250);
         insideFarClip.setTranslateY(-1250);
         insideFarClip.setTranslateZ(farClipDistance - farClipDistanceOffset);
+        insideFarClip.setId("Red");
 
         Rectangle outsideFarClip = new Rectangle(4000, 4000, Color.CYAN);
         outsideFarClip.setTranslateX(-1750);
         outsideFarClip.setTranslateY(-1750);
         outsideFarClip.setTranslateZ(farClipDistance + farClipDistanceOffset);
+        outsideFarClip.setId("Cyan");
 
         Group root = new Group();
 
@@ -90,6 +97,13 @@
 
         // Intentionally set depth buffer to false to reduce test complexity
         Scene scene = new Scene(root, WIDTH, HEIGHT, false);
+        scene.setOnMousePressed(new EventHandler<MouseEvent>() {
+            @Override public void handle(MouseEvent event) {
+                System.out.println("Clicked: " + event.getTarget());
+            }
+        });
+
+
         PerspectiveCamera camera = new PerspectiveCamera();
         camera.setFieldOfView(FOV);
         camera.setNearClip(NEAR);
@@ -99,7 +113,7 @@
     }
 
     @Override public void start(Stage stage) {
-        Scene scene = createClipPlanes(stage); 
+        Scene scene = createClipPlanes(stage);
         scene.setFill(Color.GRAY);
         stage.setScene(scene);
         stage.sizeToScene();
--- a/modules/controls/src/main/resources/com/sun/javafx/scene/control/skin/NumericBoard.txt	Tue Oct 01 10:00:06 2013 -0400
+++ b/modules/controls/src/main/resources/com/sun/javafx/scene/control/skin/NumericBoard.txt	Tue Oct 01 10:06:51 2013 -0700
@@ -1,9 +1,9 @@
-[1][2][3][/]
+[1 ][2 ][3 ][/ ]
 
-[4][5][6][-]
+[4 ][5 ][6 ][- ]
 
-[7][8][9][$backspace]
+[7 ][8 ][9 ][$backspace ]
 
-[+][0][.|'][$enter]
+[$hide][+][0 ][.|' ][$enter ]
 
 
--- a/modules/controls/src/main/resources/com/sun/javafx/scene/control/skin/TextBoard.txt	Tue Oct 01 10:00:06 2013 -0400
+++ b/modules/controls/src/main/resources/com/sun/javafx/scene/control/skin/TextBoard.txt	Tue Oct 01 10:06:51 2013 -0700
@@ -5,4 +5,4 @@
 
 [$shift ][z|/|iexcl ][x|\\|iquest ][c|;|permil|ccedil|copy|cent ][v|:|reg ][b|=|tm ][n|+|ntilde ][m|-|micro ]['|" ][$backspace ]
 
-[$hide ][$SymbolABC  ][$space       ][,|! ][.|? ][$enter  ]
+[$hide][$SymbolABC ][$space         ][,|! ][.|? ][$enter  ]
--- a/modules/controls/src/main/resources/com/sun/javafx/scene/control/skin/UrlBoard.txt	Tue Oct 01 10:00:06 2013 -0400
+++ b/modules/controls/src/main/resources/com/sun/javafx/scene/control/skin/UrlBoard.txt	Tue Oct 01 10:06:51 2013 -0700
@@ -5,5 +5,5 @@
 
 [$shift ][z|iexcl ][x|iquest ][c|;|permil|ccedil|copy|cent ][v|:|reg ][b|=|tm ][n|+|ntilde ][m|'|micro ][-|_ ][$backspace ]
 
-[$hide  ][$SymbolABC ][www.|http://  ][.|, ][.com|.org|.net  ][/|\\ ][$enter   ]
+[$hide ][$SymbolABC  ][www.|http://  ][.|,  ][.com|.org|.net  ][/|\\  ][$enter  ]
 
Binary file modules/controls/src/main/resources/com/sun/javafx/scene/control/skin/caspian/images/backspace-icon.png has changed
--- a/modules/controls/src/test/java/javafx/scene/control/ListViewKeyInputTest.java	Tue Oct 01 10:00:06 2013 -0400
+++ b/modules/controls/src/test/java/javafx/scene/control/ListViewKeyInputTest.java	Tue Oct 01 10:06:51 2013 -0700
@@ -25,24 +25,28 @@
 
 package javafx.scene.control;
 
-import com.sun.javafx.tk.Toolkit;
 import javafx.beans.InvalidationListener;
 import javafx.beans.Observable;
 import javafx.event.EventHandler;
 import javafx.scene.input.KeyCode;
 import java.util.List;
+import com.sun.javafx.PlatformUtil;
 import com.sun.javafx.Utils;
 import com.sun.javafx.scene.control.behavior.ListViewAnchorRetriever;
 import com.sun.javafx.scene.control.infrastructure.KeyEventFirer;
 import com.sun.javafx.scene.control.infrastructure.KeyModifier;
 import com.sun.javafx.scene.control.infrastructure.StageLoader;
 import com.sun.javafx.scene.control.infrastructure.VirtualFlowTestUtils;
+import com.sun.javafx.tk.Toolkit;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Ignore;
 import org.junit.Test;
-
-import static org.junit.Assert.*;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotSame;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
 
 public class ListViewKeyInputTest {
     private ListView<String> listView;
@@ -1417,7 +1421,7 @@
 
         keyboard.doKeyPress(KeyCode.DOWN,  KeyModifier.getShortcutKey());
         keyboard.doKeyPress(KeyCode.DOWN,  KeyModifier.getShortcutKey());
-        keyboard.doKeyPress(KeyCode.SPACE, KeyModifier.getShortcutKey());
+        keyboard.doKeyPress(KeyCode.SPACE, KeyModifier.getShortcutKey(), PlatformUtil.isMac() ? KeyModifier.CTRL : null);
         keyboard.doKeyPress(KeyCode.DOWN,  KeyModifier.getShortcutKey());
         keyboard.doKeyPress(KeyCode.DOWN,  KeyModifier.SHIFT);
         Toolkit.getToolkit().firePulse();
@@ -1438,7 +1442,7 @@
 
         keyboard.doKeyPress(KeyCode.DOWN,  KeyModifier.getShortcutKey());
         keyboard.doKeyPress(KeyCode.DOWN,  KeyModifier.getShortcutKey());
-        keyboard.doKeyPress(KeyCode.SPACE, KeyModifier.getShortcutKey());
+        keyboard.doKeyPress(KeyCode.SPACE, KeyModifier.getShortcutKey(), PlatformUtil.isMac() ? KeyModifier.CTRL : null);
         keyboard.doKeyPress(KeyCode.DOWN,  KeyModifier.getShortcutKey());
         keyboard.doKeyPress(KeyCode.DOWN,  KeyModifier.getShortcutKey(), KeyModifier.SHIFT);
         Toolkit.getToolkit().firePulse();
@@ -1497,7 +1501,7 @@
 
         keyboard.doKeyPress(KeyCode.UP,  KeyModifier.getShortcutKey());
         keyboard.doKeyPress(KeyCode.UP,  KeyModifier.getShortcutKey());
-        keyboard.doKeyPress(KeyCode.SPACE, KeyModifier.getShortcutKey());
+        keyboard.doKeyPress(KeyCode.SPACE, KeyModifier.getShortcutKey(), PlatformUtil.isMac() ? KeyModifier.CTRL : null);
         keyboard.doKeyPress(KeyCode.UP,  KeyModifier.getShortcutKey());
         keyboard.doKeyPress(KeyCode.UP,  KeyModifier.SHIFT);
         Toolkit.getToolkit().firePulse();
@@ -1518,7 +1522,7 @@
 
         keyboard.doKeyPress(KeyCode.UP,  KeyModifier.getShortcutKey());
         keyboard.doKeyPress(KeyCode.UP,  KeyModifier.getShortcutKey());
-        keyboard.doKeyPress(KeyCode.SPACE, KeyModifier.getShortcutKey());
+        keyboard.doKeyPress(KeyCode.SPACE, KeyModifier.getShortcutKey(), PlatformUtil.isMac() ? KeyModifier.CTRL : null);
         keyboard.doKeyPress(KeyCode.UP,  KeyModifier.getShortcutKey());
         keyboard.doKeyPress(KeyCode.UP,  KeyModifier.getShortcutKey(), KeyModifier.SHIFT);
         Toolkit.getToolkit().firePulse();
--- a/modules/controls/src/test/java/javafx/scene/control/TableViewKeyInputTest.java	Tue Oct 01 10:00:06 2013 -0400
+++ b/modules/controls/src/test/java/javafx/scene/control/TableViewKeyInputTest.java	Tue Oct 01 10:06:51 2013 -0700
@@ -25,7 +25,6 @@
 
 package javafx.scene.control;
 
-import com.sun.javafx.tk.Toolkit;
 import javafx.beans.InvalidationListener;
 import javafx.beans.Observable;
 import javafx.beans.property.ReadOnlyStringWrapper;
@@ -34,19 +33,23 @@
 import javafx.scene.input.KeyCode;
 import javafx.util.Callback;
 import java.util.List;
+import com.sun.javafx.PlatformUtil;
 import com.sun.javafx.Utils;
 import com.sun.javafx.scene.control.behavior.TableViewAnchorRetriever;
 import com.sun.javafx.scene.control.infrastructure.KeyEventFirer;
 import com.sun.javafx.scene.control.infrastructure.KeyModifier;
 import com.sun.javafx.scene.control.infrastructure.StageLoader;
 import com.sun.javafx.scene.control.infrastructure.VirtualFlowTestUtils;
+import com.sun.javafx.tk.Toolkit;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Ignore;
 import org.junit.Test;
-
-import static org.junit.Assert.*;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotSame;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
 
 //@Ignore("Disabling tests as they fail with OOM in continuous builds")
 public class TableViewKeyInputTest {
@@ -68,7 +71,7 @@
         tableView = new TableView<String>();
         sm = tableView.getSelectionModel();
         fm = tableView.getFocusModel();
-        
+
         sm.setSelectionMode(SelectionMode.MULTIPLE);
         sm.setCellSelectionEnabled(false);
         
@@ -2203,7 +2206,7 @@
 
         keyboard.doKeyPress(KeyCode.DOWN,  KeyModifier.getShortcutKey());
         keyboard.doKeyPress(KeyCode.DOWN,  KeyModifier.getShortcutKey());
-        keyboard.doKeyPress(KeyCode.SPACE, KeyModifier.getShortcutKey());
+        keyboard.doKeyPress(KeyCode.SPACE, KeyModifier.getShortcutKey(), PlatformUtil.isMac() ? KeyModifier.CTRL : null);
         keyboard.doKeyPress(KeyCode.DOWN,  KeyModifier.getShortcutKey());
         keyboard.doKeyPress(KeyCode.DOWN,  KeyModifier.SHIFT);
         Toolkit.getToolkit().firePulse();
@@ -2224,7 +2227,7 @@
 
         keyboard.doKeyPress(KeyCode.DOWN,  KeyModifier.getShortcutKey());
         keyboard.doKeyPress(KeyCode.DOWN,  KeyModifier.getShortcutKey());
-        keyboard.doKeyPress(KeyCode.SPACE, KeyModifier.getShortcutKey());
+        keyboard.doKeyPress(KeyCode.SPACE, KeyModifier.getShortcutKey(), PlatformUtil.isMac() ? KeyModifier.CTRL : null);
         keyboard.doKeyPress(KeyCode.DOWN,  KeyModifier.getShortcutKey());
         keyboard.doKeyPress(KeyCode.DOWN,  KeyModifier.getShortcutKey(), KeyModifier.SHIFT);
         Toolkit.getToolkit().firePulse();
@@ -2283,7 +2286,7 @@
 
         keyboard.doKeyPress(KeyCode.UP,  KeyModifier.getShortcutKey());
         keyboard.doKeyPress(KeyCode.UP,  KeyModifier.getShortcutKey());
-        keyboard.doKeyPress(KeyCode.SPACE, KeyModifier.getShortcutKey());
+        keyboard.doKeyPress(KeyCode.SPACE, KeyModifier.getShortcutKey(), PlatformUtil.isMac() ? KeyModifier.CTRL : null);
         keyboard.doKeyPress(KeyCode.UP,  KeyModifier.getShortcutKey());
         keyboard.doKeyPress(KeyCode.UP,  KeyModifier.SHIFT);
         Toolkit.getToolkit().firePulse();
@@ -2304,7 +2307,7 @@
 
         keyboard.doKeyPress(KeyCode.UP,  KeyModifier.getShortcutKey());
         keyboard.doKeyPress(KeyCode.UP,  KeyModifier.getShortcutKey());
-        keyboard.doKeyPress(KeyCode.SPACE, KeyModifier.getShortcutKey());
+        keyboard.doKeyPress(KeyCode.SPACE, KeyModifier.getShortcutKey(), PlatformUtil.isMac() ? KeyModifier.CTRL : null);
         keyboard.doKeyPress(KeyCode.UP,  KeyModifier.getShortcutKey());
         keyboard.doKeyPress(KeyCode.UP,  KeyModifier.getShortcutKey(), KeyModifier.SHIFT);
         Toolkit.getToolkit().firePulse();
--- a/modules/controls/src/test/java/javafx/scene/control/TreeTableViewKeyInputTest.java	Tue Oct 01 10:00:06 2013 -0400
+++ b/modules/controls/src/test/java/javafx/scene/control/TreeTableViewKeyInputTest.java	Tue Oct 01 10:06:51 2013 -0700
@@ -25,29 +25,31 @@
 
 package javafx.scene.control;
 
-import com.sun.javafx.tk.Toolkit;
 import javafx.beans.InvalidationListener;
 import javafx.beans.Observable;
 import javafx.beans.property.ReadOnlyStringWrapper;
 import javafx.beans.value.ObservableValue;
-import javafx.collections.FXCollections;
 import javafx.event.EventHandler;
 import javafx.scene.input.KeyCode;
 import javafx.util.Callback;
 import java.util.List;
+import com.sun.javafx.PlatformUtil;
 import com.sun.javafx.Utils;
 import com.sun.javafx.scene.control.behavior.TreeTableViewAnchorRetriever;
 import com.sun.javafx.scene.control.infrastructure.KeyEventFirer;
 import com.sun.javafx.scene.control.infrastructure.KeyModifier;
 import com.sun.javafx.scene.control.infrastructure.StageLoader;
 import com.sun.javafx.scene.control.infrastructure.VirtualFlowTestUtils;
+import com.sun.javafx.tk.Toolkit;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Ignore;
 import org.junit.Test;
-
-import static org.junit.Assert.*;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotSame;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
 
 //@Ignore("Disabling tests as they fail with OOM in continuous builds")
 public class TreeTableViewKeyInputTest {
@@ -2675,7 +2677,7 @@
 
         keyboard.doKeyPress(KeyCode.DOWN,  KeyModifier.getShortcutKey());
         keyboard.doKeyPress(KeyCode.DOWN,  KeyModifier.getShortcutKey());
-        keyboard.doKeyPress(KeyCode.SPACE, KeyModifier.getShortcutKey());
+        keyboard.doKeyPress(KeyCode.SPACE, KeyModifier.getShortcutKey(), PlatformUtil.isMac() ? KeyModifier.CTRL : null);
         keyboard.doKeyPress(KeyCode.DOWN,  KeyModifier.getShortcutKey());
         keyboard.doKeyPress(KeyCode.DOWN,  KeyModifier.SHIFT);
         Toolkit.getToolkit().firePulse();
@@ -2696,7 +2698,7 @@
 
         keyboard.doKeyPress(KeyCode.DOWN,  KeyModifier.getShortcutKey());
         keyboard.doKeyPress(KeyCode.DOWN,  KeyModifier.getShortcutKey());
-        keyboard.doKeyPress(KeyCode.SPACE, KeyModifier.getShortcutKey());
+        keyboard.doKeyPress(KeyCode.SPACE, KeyModifier.getShortcutKey(), PlatformUtil.isMac() ? KeyModifier.CTRL : null);
         keyboard.doKeyPress(KeyCode.DOWN,  KeyModifier.getShortcutKey());
         keyboard.doKeyPress(KeyCode.DOWN,  KeyModifier.getShortcutKey(), KeyModifier.SHIFT);
         Toolkit.getToolkit().firePulse();
@@ -2759,7 +2761,7 @@
 
         keyboard.doKeyPress(KeyCode.UP,  KeyModifier.getShortcutKey());
         keyboard.doKeyPress(KeyCode.UP,  KeyModifier.getShortcutKey());
-        keyboard.doKeyPress(KeyCode.SPACE, KeyModifier.getShortcutKey());
+        keyboard.doKeyPress(KeyCode.SPACE, KeyModifier.getShortcutKey(), PlatformUtil.isMac() ? KeyModifier.CTRL : null);
         keyboard.doKeyPress(KeyCode.UP,  KeyModifier.getShortcutKey());
         keyboard.doKeyPress(KeyCode.UP,  KeyModifier.SHIFT);
         Toolkit.getToolkit().firePulse();
@@ -2780,7 +2782,7 @@
 
         keyboard.doKeyPress(KeyCode.UP,  KeyModifier.getShortcutKey());
         keyboard.doKeyPress(KeyCode.UP,  KeyModifier.getShortcutKey());
-        keyboard.doKeyPress(KeyCode.SPACE, KeyModifier.getShortcutKey());
+        keyboard.doKeyPress(KeyCode.SPACE, KeyModifier.getShortcutKey(), PlatformUtil.isMac() ? KeyModifier.CTRL : null);
         keyboard.doKeyPress(KeyCode.UP,  KeyModifier.getShortcutKey());
         keyboard.doKeyPress(KeyCode.UP,  KeyModifier.getShortcutKey(), KeyModifier.SHIFT);
         Toolkit.getToolkit().firePulse();
--- a/modules/controls/src/test/java/javafx/scene/control/TreeViewKeyInputTest.java	Tue Oct 01 10:00:06 2013 -0400
+++ b/modules/controls/src/test/java/javafx/scene/control/TreeViewKeyInputTest.java	Tue Oct 01 10:06:51 2013 -0700
@@ -25,27 +25,30 @@
 
 package javafx.scene.control;
 
-import com.sun.javafx.tk.Toolkit;
 import javafx.beans.InvalidationListener;
 import javafx.beans.Observable;
-import javafx.collections.FXCollections;
 import javafx.event.Event;
 import javafx.event.EventHandler;
 import javafx.scene.input.KeyCode;
 import java.util.List;
+import com.sun.javafx.PlatformUtil;
 import com.sun.javafx.Utils;
 import com.sun.javafx.scene.control.behavior.TreeViewAnchorRetriever;
 import com.sun.javafx.scene.control.infrastructure.KeyEventFirer;
 import com.sun.javafx.scene.control.infrastructure.KeyModifier;
 import com.sun.javafx.scene.control.infrastructure.StageLoader;
 import com.sun.javafx.scene.control.infrastructure.VirtualFlowTestUtils;
+import com.sun.javafx.tk.Toolkit;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Ignore;
 import org.junit.Test;
-
-import static org.junit.Assert.*;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNotSame;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
 
 //@Ignore("Disabling tests as they fail with OOM in continuous builds")
 public class TreeViewKeyInputTest {
@@ -1611,7 +1614,7 @@
 
         keyboard.doKeyPress(KeyCode.DOWN,  KeyModifier.getShortcutKey());
         keyboard.doKeyPress(KeyCode.DOWN,  KeyModifier.getShortcutKey());
-        keyboard.doKeyPress(KeyCode.SPACE, KeyModifier.getShortcutKey());
+        keyboard.doKeyPress(KeyCode.SPACE, KeyModifier.getShortcutKey(), PlatformUtil.isMac() ? KeyModifier.CTRL : null);
         keyboard.doKeyPress(KeyCode.DOWN,  KeyModifier.getShortcutKey());
         keyboard.doKeyPress(KeyCode.DOWN,  KeyModifier.SHIFT);
         Toolkit.getToolkit().firePulse();
@@ -1632,7 +1635,7 @@
 
         keyboard.doKeyPress(KeyCode.DOWN,  KeyModifier.getShortcutKey());
         keyboard.doKeyPress(KeyCode.DOWN,  KeyModifier.getShortcutKey());
-        keyboard.doKeyPress(KeyCode.SPACE, KeyModifier.getShortcutKey());
+        keyboard.doKeyPress(KeyCode.SPACE, KeyModifier.getShortcutKey(), PlatformUtil.isMac() ? KeyModifier.CTRL : null);
         keyboard.doKeyPress(KeyCode.DOWN,  KeyModifier.getShortcutKey());
         keyboard.doKeyPress(KeyCode.DOWN,  KeyModifier.getShortcutKey(), KeyModifier.SHIFT);
         Toolkit.getToolkit().firePulse();
@@ -1691,7 +1694,7 @@
 
         keyboard.doKeyPress(KeyCode.UP,  KeyModifier.getShortcutKey());
         keyboard.doKeyPress(KeyCode.UP,  KeyModifier.getShortcutKey());
-        keyboard.doKeyPress(KeyCode.SPACE, KeyModifier.getShortcutKey());
+        keyboard.doKeyPress(KeyCode.SPACE, KeyModifier.getShortcutKey(), PlatformUtil.isMac() ? KeyModifier.CTRL : null);
         keyboard.doKeyPress(KeyCode.UP,  KeyModifier.getShortcutKey());
         keyboard.doKeyPress(KeyCode.UP,  KeyModifier.SHIFT);
         Toolkit.getToolkit().firePulse();
@@ -1712,7 +1715,7 @@
 
         keyboard.doKeyPress(KeyCode.UP,  KeyModifier.getShortcutKey());
         keyboard.doKeyPress(KeyCode.UP,  KeyModifier.getShortcutKey());
-        keyboard.doKeyPress(KeyCode.SPACE, KeyModifier.getShortcutKey());
+        keyboard.doKeyPress(KeyCode.SPACE, KeyModifier.getShortcutKey(), PlatformUtil.isMac() ? KeyModifier.CTRL : null);
         keyboard.doKeyPress(KeyCode.UP,  KeyModifier.getShortcutKey());
         keyboard.doKeyPress(KeyCode.UP,  KeyModifier.getShortcutKey(), KeyModifier.SHIFT);
         Toolkit.getToolkit().firePulse();
--- a/modules/fxml/src/main/java/javafx/fxml/FXMLLoader.java	Tue Oct 01 10:00:06 2013 -0400
+++ b/modules/fxml/src/main/java/javafx/fxml/FXMLLoader.java	Tue Oct 01 10:06:51 2013 -0700
@@ -1099,6 +1099,9 @@
             URL location;
             if (source.charAt(0) == '/') {
                 location = classLoader.getResource(source.substring(1));
+                if (location == null) {
+                    throw new LoadException("Cannot resolve path: " + source);
+                }
             } else {
                 if (FXMLLoader.this.location == null) {
                     throw new LoadException("Base location is undefined.");
@@ -2054,8 +2057,11 @@
     public boolean equals(Object obj) {
         if (obj instanceof FXMLLoader) {
             FXMLLoader loader = (FXMLLoader)obj;
-            return loader.location.toExternalForm().equals(
-                    location.toExternalForm());
+            if (location == null || loader.location == null) {
+                return loader.location == location;
+            }
+            return location.toExternalForm().equals(
+                    loader.location.toExternalForm());
         }
         return false;
     }
--- a/modules/graphics/src/android/java/com/oracle/dalvik/FXActivity.java	Tue Oct 01 10:00:06 2013 -0400
+++ b/modules/graphics/src/android/java/com/oracle/dalvik/FXActivity.java	Tue Oct 01 10:06:51 2013 -0700
@@ -181,11 +181,48 @@
         public InternalSurfaceView(Context context) {
             super(context);
             setFocusableInTouchMode(true);
-        }
+        }        
 
+        private static final int ACTION_POINTER_STILL = -1;
+        
         @Override
-        public boolean dispatchTouchEvent(MotionEvent event) {
-            onTouchEventNative(event.getAction(), (int) event.getX(), (int) event.getY());
+        public boolean dispatchTouchEvent(MotionEvent event) {      
+            int action = event.getAction();
+            int actionCode = action & MotionEvent.ACTION_MASK;
+            int pcount = event.getPointerCount();
+            int[] actions = new int[pcount];
+            int[] ids = new int[pcount];
+            int[] touchXs = new int[pcount];
+            int[] touchYs = new int[pcount];
+
+            if (pcount > 1) {                      
+                //multitouch
+                if (actionCode == MotionEvent.ACTION_POINTER_DOWN ||
+                    actionCode == MotionEvent.ACTION_POINTER_UP) {
+
+                    int pointerIndex = event.getActionIndex();
+                    for (int i = 0;i <pcount; i++) {
+                        actions[i] = pointerIndex == i ? actionCode : ACTION_POINTER_STILL;
+                        ids[i] = event.getPointerId(i);
+                        touchXs[i] = (int)event.getX(i);
+                        touchYs[i] = (int)event.getY(i);                        
+                    }                    
+                } else if (actionCode == MotionEvent.ACTION_MOVE) {
+                    for (int i = 0;i <pcount; i++) {
+                        touchXs[i] = (int)event.getX(i);
+                        touchYs[i] = (int)event.getY(i);                    
+                        actions[i] = MotionEvent.ACTION_MOVE;
+                        ids[i] = event.getPointerId(i);                        
+                    }                    
+                }                 
+            } else {
+                //single touch
+                actions[0] = actionCode;
+                ids[0] = event.getPointerId(0);
+                touchXs[0] = (int)event.getX();
+                touchYs[0] = (int)event.getY();                
+            }                 
+            onMultiTouchEventNative(pcount, actions, ids, touchXs, touchYs);
             return true;
         }
 
@@ -194,8 +231,10 @@
             onKeyEventNative(event.getAction(), event.getKeyCode(), event.getCharacters());
             return true;
         }
-
-        private native void onTouchEventNative(int action, int absx, int absy);
+        
+        private native void onMultiTouchEventNative(int count, int[] actions, 
+                int[] ids, int[] touchXs, int[] touchYs);
+        
 
         private native void onKeyEventNative(int action, int keycode, String characters);
 
Binary file modules/graphics/src/main/docs/javafx/scene/doc-files/bounds-complex.png has changed
Binary file modules/graphics/src/main/docs/javafx/scene/doc-files/boundsLocal.png has changed
Binary file modules/graphics/src/main/docs/javafx/scene/doc-files/boundsParent.png has changed
--- a/modules/graphics/src/main/java/com/sun/glass/ui/Screen.java	Tue Oct 01 10:00:06 2013 -0400
+++ b/modules/graphics/src/main/java/com/sun/glass/ui/Screen.java	Tue Oct 01 10:06:51 2013 -0700
@@ -58,19 +58,6 @@
         return Application.GetApplication().staticScreen_getVideoRefreshPeriod();
     }
 
-    // Used by Window.notifyMoveToAnotherScreen
-    static Screen getScreenForPtr(long screenPtr) {
-        Application.checkEventThread();
-        for (Screen s : getScreens()) {
-            if (s != null && s.ptr == screenPtr) {
-                return s;
-            }
-        }
-
-        return null;
-    }
-
-
     /**
      * Could be called from any thread
      * @return the main screen
@@ -317,4 +304,42 @@
                 "    resolutionX:"+getResolutionX()+"\n"+
                 "    resolutionY:"+getResolutionY()+"\n";
     }
+
+    @Override public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+
+        Screen screen = (Screen) o;
+        return ptr == screen.ptr
+                && depth == screen.depth
+                && x == screen.x
+                && y == screen.y
+                && width == screen.width
+                && height == screen.height
+                && visibleX == screen.visibleX
+                && visibleY == screen.visibleY
+                && visibleWidth == screen.visibleWidth
+                && visibleHeight == screen.visibleHeight
+                && resolutionX == screen.resolutionX
+                && resolutionY == screen.resolutionY
+                && Float.compare(screen.scale, scale) == 0;
+    }
+
+    @Override public int hashCode() {
+        int result = 17;
+        result = 31 * result + (int) (ptr ^ (ptr >>> 32));
+        result = 31 * result + depth;
+        result = 31 * result + x;
+        result = 31 * result + y;
+        result = 31 * result + width;
+        result = 31 * result + height;
+        result = 31 * result + visibleX;
+        result = 31 * result + visibleY;
+        result = 31 * result + visibleWidth;
+        result = 31 * result + visibleHeight;
+        result = 31 * result + resolutionX;
+        result = 31 * result + resolutionY;
+        result = 31 * result + (scale != +0.0f ? Float.floatToIntBits(scale) : 0);
+        return result;
+    }
 }
--- a/modules/graphics/src/main/java/com/sun/glass/ui/Window.java	Tue Oct 01 10:00:06 2013 -0400
+++ b/modules/graphics/src/main/java/com/sun/glass/ui/Window.java	Tue Oct 01 10:06:51 2013 -0700
@@ -380,8 +380,8 @@
         this.screen = screen;
 
         if (this.eventHandler != null) {
-            //TODO: RT-31098
-            if (old != this.screen) {
+            if ((old == null && this.screen != null) ||
+                (old != null && !old.equals(this.screen))) {
                 this.eventHandler.handleScreenChangedEvent(this, System.nanoTime(), old, this.screen);
             }
         }
@@ -1169,8 +1169,8 @@
         handleWindowEvent(System.nanoTime(), WindowEvent.MOVE);
     }
 
-    protected void notifyMoveToAnotherScreen(long fromScreenPtr, long toScreenPtr) {
-        setScreen(Screen.getScreenForPtr(toScreenPtr));
+    protected void notifyMoveToAnotherScreen(Screen newScreen) {
+        setScreen(newScreen);
     }
 
     /**
--- a/modules/graphics/src/main/java/com/sun/javafx/Utils.java	Tue Oct 01 10:00:06 2013 -0400
+++ b/modules/graphics/src/main/java/com/sun/javafx/Utils.java	Tue Oct 01 10:06:51 2013 -0700
@@ -25,12 +25,10 @@
 
 package com.sun.javafx;
 
-import java.util.ArrayList;
-import java.util.List;
-
 import javafx.geometry.BoundingBox;
 import javafx.geometry.Bounds;
 import javafx.geometry.HPos;
+import javafx.geometry.NodeOrientation;
 import javafx.geometry.Point2D;
 import javafx.geometry.Rectangle2D;
 import javafx.geometry.VPos;
@@ -41,9 +39,8 @@
 import javafx.stage.Screen;
 import javafx.stage.Stage;
 import javafx.stage.Window;
-
+import java.util.List;
 import com.sun.javafx.stage.StageHelper;
-import javafx.geometry.NodeOrientation;
 
 /**
  * Some basic utilities which need to be in java (for shifting operations or
@@ -99,24 +96,6 @@
 
     /**
      * Simple utility function which clamps the given value to be strictly
-     * above the min value.
-     */
-    public static int clampMin(int value, int min) {
-        if (value < min) return min;
-        return value;
-    }
-
-    /**
-     * Simple utility function which clamps the given value to be strictly
-     * under the max value.
-     */
-    public static float clampMax(float value, float max) {
-        if (value > max) return max;
-        return value;
-    }
-
-    /**
-     * Simple utility function which clamps the given value to be strictly
      * under the max value.
      */
     public static int clampMax(int value, int max) {
@@ -143,17 +122,6 @@
      **************************************************************************/
 
     /**
-     * Simple helper function which works on both desktop and mobile for
-     * stripping newlines. The problem we encountered when attempting this in
-     * FX was that there is no character literal in FX and no way that I could
-     * see to efficiently create characters representing newline and so forth.
-     */
-    public static String stripNewlines(String s) {
-        if (s == null) return null;
-        return s.replace('\n', ' ');
-    }
-
-    /**
      * Helper to remove leading and trailing quotes from a string.
      * Works with single or double quotes. 
      */
@@ -460,44 +428,11 @@
         return Color.color(colors[0], colors[1], colors[2], color.getOpacity());
     }
 
-    public static <E extends Node> List<E> getManaged(List<E>nodes) {
-        List<E> managed = new ArrayList<E>();
-        for (E e : nodes) {
-            if (e != null && e.isManaged()) {
-                managed.add(e);
-            }
-        }
-        return managed;
-    }
-
     /** helper function for calculating the sum of a series of numbers */
     public static double sum(double[] values) {
-   	double sum = 0;
-    	for (double v : values) sum = sum+v;
-    	return sum / values.length;
-}
-
-    /**
-     * Returns a Point2D that represents an x,y location that should safely position
-     * the given node relative to the given parent node.
-     *
-     * If reposition is set to be false, then the node will be positioned with no
-     * regard to it's position being offscreen. Conversely, setting reposition to be
-     * true will result in the point being shifted such that the entire node is onscreen.
-     *
-     * How this works is largely based on the provided hpos and vpos parameters, with
-     * the repositioned node trying not to overlap the parent unless absolutely necessary.
-     */
-    public static Point2D pointRelativeTo(Node parent, Node node, HPos hpos, VPos vpos, boolean reposition) {
-        final double nodeWidth = node.getLayoutBounds().getWidth();
-        final double nodeHeight = node.getLayoutBounds().getHeight();
-        return pointRelativeTo(parent, nodeWidth, nodeHeight, hpos, vpos, 0, 0, reposition);
-    }
-
-    public static Point2D pointRelativeTo(Node parent, double anchorWidth, double anchorHeight,
-             HPos hpos, VPos vpos, boolean reposition)
-    {
-        return pointRelativeTo(parent, anchorWidth, anchorHeight, hpos, vpos, 0, 0, reposition);
+        double sum = 0;
+        for (double v : values) sum = sum+v;
+        return sum / values.length;
     }
 
     public static Point2D pointRelativeTo(Node parent, Node node, HPos hpos,
@@ -546,55 +481,6 @@
     }
 
     /**
-     * Returns a Point2D that represents an x,y location that should safely position
-     * the given node relative to the given parent node.
-     *
-     * The provided x and y values are offsets from the parent node. This allows for
-     * the node to be positioned relative to the parent using exact coordinates.
-     *
-     * If reposition is set to be false, then the node will be positioned with no
-     * regard to it's position being offscreen. Conversely, setting reposition to be
-     * true will result in the point being shifted such that the entire node is onscreen.
-     */
-    public static Point2D pointRelativeTo(Node parent, Node node, double x, double y, boolean reposition) {
-        final Bounds bounds = parent.localToScreen(parent.getBoundsInLocal());
-        final double layoutX = x + bounds.getMinX();
-        final double layoutY = y + bounds.getMinY();
-
-        if (reposition) {
-            return pointRelativeTo(parent, node, layoutX, layoutY, null, null);
-        } else {
-            return new Point2D(layoutX, layoutY);
-        }
-    }
-
-    /**
-     * Returns a Point2D that represents an x,y location that should safely position
-     * the given node relative to the given parent node.
-     *
-     * <b>Note</b>: Unlike other functions provided in this class, the provided x
-     * and y values are <b>not</b> offsets from the parent node - they are relative
-     * to the screen. This reduces the utility of this function, and in many cases
-     * you're better off using the more specific functions provided.
-     *
-     * How this works is largely based on the provided hpos and vpos parameters, with
-     * the repositioned node trying not to overlap the parent unless absolutely necessary.
-     *
-     * This function implicitly has the reposition argument set to true, which means
-     * that the returned Point2D be such that the node will be fully on screen.
-     *
-     * Don't use the BASELINE vpos, it doesn't make sense and would produce wrong result.
-     */
-    public static Point2D pointRelativeTo(Node parent, Node node, double screenX,
-            double screenY, HPos hpos, VPos vpos)
-    {
-        final double nodeWidth = node.getLayoutBounds().getWidth();
-        final double nodeHeight = node.getLayoutBounds().getHeight();
-
-        return pointRelativeTo(parent, nodeWidth, nodeHeight, screenX, screenY, hpos, vpos);
-    }
-
-    /**
      * This is the fallthrough function that most other functions fall into. It takes
      * care specifically of the repositioning of the item such that it remains onscreen
      * as best it can, given it's unique qualities.
@@ -672,19 +558,6 @@
     }
 
     /**
-     * Returns a Point2D that represents an x,y location that should safely position
-     * a node on screen assuming its width and height values are equal to the arguments given
-     * to this function.
-     *
-     * In this situation, the provided screenX and screenY values are in screen coordinates, so
-     * the reposition value is implicitly set to true. This means that after calling
-     * this function you'll have a Point2D object representing new screen coordinates.
-     */
-    public static Point2D pointRelativeTo(Window parent, double width, double height, double screenX, double screenY) {
-        return pointRelativeTo(parent, width, height, screenX, screenY, null, null);
-    }
-
-    /**
      * To facilitate multiple types of parent object, we unfortunately must allow for
      * Objects to be passed in. This method handles determining the x-axis offset of the
      * given Object from the screens (0,0) position. If the Object type is not supported,
@@ -835,15 +708,6 @@
     }
 
     /*
-     * Returns true if the primary Screen has VGA dimensions, in landscape or portrait mode.
-     */
-    public static boolean isVGAScreen() {
-        Rectangle2D bounds = Screen.getPrimary().getBounds();
-        return ((bounds.getWidth() == 640 && bounds.getHeight() == 480) ||
-                (bounds.getWidth() == 480 && bounds.getHeight() == 640));
-    }
-
-    /*
      * Returns true if the primary Screen has QVGA dimensions, in landscape or portrait mode.
      */
     public static boolean isQVGAScreen() {
--- a/modules/graphics/src/main/java/com/sun/javafx/application/PlatformImpl.java	Tue Oct 01 10:00:06 2013 -0400
+++ b/modules/graphics/src/main/java/com/sun/javafx/application/PlatformImpl.java	Tue Oct 01 10:06:51 2013 -0700
@@ -364,15 +364,23 @@
     public static void removeListener(FinishListener l) {
         finishListeners.remove(l);
         listenersRegistered.set(!finishListeners.isEmpty());
+        if (!listenersRegistered.get()) {
+            checkIdle();
+        }
     }
 
     private static void notifyFinishListeners(boolean exitCalled) {
-        for (FinishListener l : finishListeners) {
-            if (exitCalled) {
-                l.exitCalled();
-            } else {
-                l.idle(implicitExit);
+        // Notify listeners if any are registered, else exit directly
+        if (listenersRegistered.get()) {
+            for (FinishListener l : finishListeners) {
+                if (exitCalled) {
+                    l.exitCalled();
+                } else {
+                    l.idle(implicitExit);
+                }
             }
+        } else if (implicitExit || platformExit.get()) {
+            tkExit();
         }
     }
 
@@ -450,16 +458,8 @@
     }
 
     public static void exit() {
-//        System.err.println("PlatformImpl.exit");
         platformExit.set(true);
-
-        // Notify listeners if any are registered, else exit directly
-        if (listenersRegistered.get()) {
-            notifyFinishListeners(true);
-        } else {
-//            System.err.println("Platform.exit: calling doExit directly (no listeners)");
-            tkExit();
-        }
+        notifyFinishListeners(true);
     }
 
     private static Boolean checkForClass(String classname) {
--- a/modules/graphics/src/main/java/com/sun/javafx/font/CompositeStrike.java	Tue Oct 01 10:00:06 2013 -0400
+++ b/modules/graphics/src/main/java/com/sun/javafx/font/CompositeStrike.java	Tue Oct 01 10:06:51 2013 -0700
@@ -197,11 +197,13 @@
         for (int i = 0; i < gl.getGlyphCount(); i++) {
             int glyphCode = gl.getGlyphCode(i);
             if (glyphCode != CharToGlyphMapper.INVISIBLE_GLYPH_ID) {
-                t.setTransform(transform);
                 Glyph glyph = getGlyph(glyphCode);
                 Shape gp = glyph.getShape();
-                t.translate(gl.getPosX(i), gl.getPosY(i));
-                p.append(gp.getPathIterator(t), false);
+                if (gp != null) {
+                    t.setTransform(transform);
+                    t.translate(gl.getPosX(i), gl.getPosY(i));
+                    p.append(gp.getPathIterator(t), false);
+                }
             }
         }
     }
--- a/modules/graphics/src/main/java/com/sun/javafx/font/PrismFontStrike.java	Tue Oct 01 10:00:06 2013 -0400
+++ b/modules/graphics/src/main/java/com/sun/javafx/font/PrismFontStrike.java	Tue Oct 01 10:06:51 2013 -0700
@@ -183,10 +183,12 @@
         for (int i = 0; i < gl.getGlyphCount(); i++) {
             int glyphCode = gl.getGlyphCode(i);
             if (glyphCode != CharToGlyphMapper.INVISIBLE_GLYPH_ID) {
-                t.setTransform(transform);
                 Shape gp = createGlyphOutline(glyphCode);
-                t.translate(gl.getPosX(i), gl.getPosY(i));
-                p.append(gp.getPathIterator(t), false);
+                if (gp != null) {
+                    t.setTransform(transform);
+                    t.translate(gl.getPosX(i), gl.getPosY(i));
+                    p.append(gp.getPathIterator(t), false);
+                }
             }
         }
     }
--- a/modules/graphics/src/main/java/com/sun/javafx/font/coretext/CFRange.java	Tue Oct 01 10:00:06 2013 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,31 +0,0 @@
-/*
- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package com.sun.javafx.font.coretext;
-
-class CFRange {
-    long location;
-    long length;
-}
--- a/modules/graphics/src/main/java/com/sun/javafx/font/coretext/CTFontFile.java	Tue Oct 01 10:00:06 2013 -0400
+++ b/modules/graphics/src/main/java/com/sun/javafx/font/coretext/CTFontFile.java	Tue Oct 01 10:06:51 2013 -0700
@@ -48,19 +48,27 @@
     public static boolean registerFont(String fontfile) {
         if (fontfile == null) return false;
         long alloc = OS.kCFAllocatorDefault();
+        boolean result = false;
         long fileRef = OS.CFStringCreate(fontfile);
-        long urlRef = OS.CFURLCreateWithFileSystemPath(alloc, fileRef, OS.kCFURLPOSIXPathStyle, false);
-        int scope = OS.kCTFontManagerScopeProcess;
-        boolean result = OS.CTFontManagerRegisterFontsForURL(urlRef, scope, 0);
-        OS.CFRelease(fileRef);
-        OS.CFRelease(urlRef);
+        if (fileRef != 0) {
+            int pathStyle = OS.kCFURLPOSIXPathStyle;
+            long urlRef = OS.CFURLCreateWithFileSystemPath(alloc, fileRef, pathStyle, false);
+            if (urlRef != 0) {
+                int scope = OS.kCTFontManagerScopeProcess;
+                result = OS.CTFontManagerRegisterFontsForURL(urlRef, scope, 0);
+                OS.CFRelease(urlRef);
+            }
+            OS.CFRelease(fileRef);
+        }
         return result;
     }
 
     CGRect getBBox(int gc, float size) {
         CTFontStrike strike = (CTFontStrike)getStrike(size, BaseTransform.IDENTITY_TRANSFORM);
         long fontRef = strike.getFontRef();
+        if (fontRef == 0) return null;
         long pathRef = OS.CTFontCreatePathForGlyph(fontRef, (short)gc, tx);
+        if (pathRef == 0) return null;
         CGRect rect = OS.CGPathGetPathBoundingBox(pathRef);
         OS.CGPathRelease(pathRef);
         return rect;
@@ -69,7 +77,9 @@
     Path2D getGlyphOutline(int gc, float size) {
         CTFontStrike strike = (CTFontStrike)getStrike(size, BaseTransform.IDENTITY_TRANSFORM);
         long fontRef = strike.getFontRef();
+        if (fontRef == 0) return null;
         long pathRef = OS.CTFontCreatePathForGlyph(fontRef, (short)gc, tx);
+        if (pathRef == 0) return null;
         Path2D path = OS.CGPathApply(pathRef);
         OS.CGPathRelease(pathRef);
         return path;
@@ -80,6 +90,10 @@
         CTFontStrike strike = (CTFontStrike)getStrike(size,
                                                       BaseTransform.IDENTITY_TRANSFORM);
 
+        long fontRef = strike.getFontRef();
+        if (fontRef == 0) return null;
+        int[] bb = new int[4];
+
         /* For some reason CTFontGetBoundingRectsForGlyphs has poor performance.
          * The fix is to use the 'loca' and the 'glyf' tables to determine
          * the glyph bounding box (same as T2K). This implementation
@@ -87,8 +101,6 @@
          * In case it fails, or the font doesn't have a glyph table
          * (CFF fonts), then the bounds of the glyph outline is used instead.
          */
-        long fontRef = strike.getFontRef();
-        int[] bb = new int[4];
         if (!isCFF()) {
             short format = getIndexToLocFormat();
             if (OS.CTFontGetBoundingRectForGlyphUsingTables(fontRef, (short)gc, format, bb)) {
@@ -97,6 +109,7 @@
         }
         /* Note: not using tx here as the bounds need to be y up */
         long pathRef = OS.CTFontCreatePathForGlyph(fontRef, (short)gc, null);
+        if (pathRef == 0) return null;
         CGRect rect = OS.CGPathGetPathBoundingBox(pathRef);
         OS.CGPathRelease(pathRef);
         float scale = getUnitsPerEm() / size;
@@ -108,8 +121,8 @@
     }
 
     @Override
-    protected PrismFontStrike createStrike(float size, BaseTransform transform,
-                                           int aaMode, FontStrikeDesc desc) {
+    protected PrismFontStrike<CTFontFile> createStrike(float size,
+            BaseTransform transform, int aaMode, FontStrikeDesc desc) {
         return new CTFontStrike(this, size, transform, aaMode, desc);
     }
 
--- a/modules/graphics/src/main/java/com/sun/javafx/font/coretext/CTFontStrike.java	Tue Oct 01 10:00:06 2013 -0400
+++ b/modules/graphics/src/main/java/com/sun/javafx/font/coretext/CTFontStrike.java	Tue Oct 01 10:06:51 2013 -0700
@@ -68,8 +68,15 @@
             }
         }
         long psNameRef = OS.CFStringCreate(fontResource.getPSName());
-        fontRef = OS.CTFontCreateWithName(psNameRef, size, matrix);
-        OS.CFRelease(psNameRef);
+        if (psNameRef != 0) {
+            fontRef = OS.CTFontCreateWithName(psNameRef, size, matrix);
+            OS.CFRelease(psNameRef);
+        }
+        if (fontRef == 0) {
+            if (PrismFontFactory.debugFonts) {
+                System.err.println("Failed to create CTFont for " + this);
+            }
+        }
 
         /* CoreText uses different precision for subpixel text according
          * to the font size. By observation, font sizes smaller than 12
--- a/modules/graphics/src/main/java/com/sun/javafx/font/coretext/CTGlyph.java	Tue Oct 01 10:00:06 2013 -0400
+++ b/modules/graphics/src/main/java/com/sun/javafx/font/coretext/CTGlyph.java	Tue Oct 01 10:06:51 2013 -0700
@@ -64,6 +64,7 @@
     @Override public RectBounds getBBox() {
         /* IN T2k this is the bounds of the glyph path see GeneralPath.cpp */
         CGRect rect = strike.getBBox(glyphCode);
+        if (rect == null) return new RectBounds();
         return new RectBounds((float)rect.origin.x,
                               (float)rect.origin.y,
                               (float)(rect.origin.x + rect.size.width),
@@ -76,9 +77,10 @@
         if (strike.getSize() == 0) return;
 
         long fontRef = strike.getFontRef();
+        if (fontRef == 0) return;
         int orientation = OS.kCTFontOrientationDefault;
         CGSize size = new CGSize();
-        OS.CTFontGetAdvancesForGlyphs(fontRef, orientation, (short)glyphCode, size, 1);
+        OS.CTFontGetAdvancesForGlyphs(fontRef, orientation, (short)glyphCode, size);
         xAdvance = size.width;
         yAdvance = -size.height;   /*Inverted coordinates system */
 
@@ -153,6 +155,7 @@
         boolean cache = CACHE_CONTEXT & BITMAP_WIDTH >= w & BITMAP_HEIGHT >= h;
         long context = cache ? getCachedContext(lcdContext) :
                                createContext(lcdContext, w, h);
+        if (context == 0) return new byte[0];
 
         /* Fill background with white */
         OS.CGContextSetRGBFillColor(context, 1, 1, 1, 1);
@@ -175,7 +178,7 @@
 
         /* Draw the text with black */
         OS.CGContextSetRGBFillColor(context, 0, 0, 0, 1);
-        OS.CTFontDrawGlyphs(fontRef, (short)glyphCode, -drawX, -drawY, 1, context);
+        OS.CTFontDrawGlyphs(fontRef, (short)glyphCode, -drawX, -drawY, context);
 
         if (matrix != null) {
             OS.CGContextTranslateCTM(context, x, y);
--- a/modules/graphics/src/main/java/com/sun/javafx/font/coretext/CTGlyphLayout.java	Tue Oct 01 10:00:06 2013 -0400
+++ b/modules/graphics/src/main/java/com/sun/javafx/font/coretext/CTGlyphLayout.java	Tue Oct 01 10:06:51 2013 -0700
@@ -40,26 +40,36 @@
         /* Use CoreText to analize the run */
         long alloc = OS.kCFAllocatorDefault();
         long textRef = OS.CFStringCreateWithCharacters(alloc, chars, start, length);
-        long attributes = OS.CFDictionaryCreateMutable(alloc, 4,
-                              OS.kCFTypeDictionaryKeyCallBacks(),
-                              OS.kCFTypeDictionaryValueCallBacks());
-        OS.CFDictionaryAddValue(attributes, OS.kCTFontAttributeName(), fontRef);
-        /* Note that by default CoreText will apply kerning depending on the font*/
-        long attString = OS.CFAttributedStringCreate(alloc, textRef, attributes);
-        long lineRef = OS.CTLineCreateWithAttributedString(attString);
-        OS.CFRelease(attributes);
-        OS.CFRelease(attString);
-        OS.CFRelease(textRef);
+        long lineRef = 0;
+        if (textRef != 0) {
+            long attributes = OS.CFDictionaryCreateMutable(alloc, 4,
+                                  OS.kCFTypeDictionaryKeyCallBacks(),
+                                  OS.kCFTypeDictionaryValueCallBacks());
+            if (attributes != 0) {
+                OS.CFDictionaryAddValue(attributes, OS.kCTFontAttributeName(), fontRef);
+                /* Note that by default CoreText will apply kerning depending on the font*/
+                long attString = OS.CFAttributedStringCreate(alloc, textRef, attributes);
+                if (attString != 0) {
+                    lineRef = OS.CTLineCreateWithAttributedString(attString);
+                    OS.CFRelease(attString);
+                }
+                OS.CFRelease(attributes);
+            }
+            OS.CFRelease(textRef);
+        }
         return lineRef;
     }
 
     private int getFontSlot(long runRef, CompositeFontResource fr, String name) {
         long runAttrs = OS.CTRunGetAttributes(runRef);
+        if (runAttrs == 0) return -1;
         long actualFont = OS.CFDictionaryGetValue(runAttrs, OS.kCTFontAttributeName());
+        if (actualFont == 0) return -1;
 
         /* Use the display name from the kCTFontDisplayNameAttribute attribute
          * instead of CTFontCopyDisplayName() to avoid localized names*/
         String fontName = OS.CTFontCopyAttributeDisplayName(actualFont);
+        if (fontName == null) return -1;
         int slot = 0;
         if (!fontName.equalsIgnoreCase(name)) {
             if (fr == null) return -1;
@@ -81,32 +91,37 @@
         float size = strike.getSize();
         String fontName = strike.getFontResource().getFullName();
         long fontRef = ((CTFontStrike)strike).getFontRef();
+        if (fontRef == 0) return;
         long lineRef = createCTLine(fontRef, text, run.getStart(), run.getLength());
+        if (lineRef == 0) return;
         long runs = OS.CTLineGetGlyphRuns(lineRef);
-        int glyphCount = (int)OS.CTLineGetGlyphCount(lineRef);
-        int[] glyphs = new int[glyphCount];
-        float[] positions = new float[glyphCount * 2 + 2];
-        int[] indices = new int[glyphCount];
-        long runCount = OS.CFArrayGetCount(runs);
-        int glyphStart = 0, posStart = 0, indicesStart = 0;
-        for (int i = 0; i < runCount; i++) {
-            long runRef = OS.CFArrayGetValueAtIndex(runs, i);
-            int slot = getFontSlot(runRef, composite, fontName) ;
-            if (slot != -1) {
-                glyphStart += OS.CTRunGetGlyphs(runRef, slot << 24, glyphStart, glyphs);
-            } else {
-                glyphStart += OS.CTRunGetGlyphCount(runRef);
+        if (runs != 0) {
+            int glyphCount = (int)OS.CTLineGetGlyphCount(lineRef);
+            int[] glyphs = new int[glyphCount];
+            float[] positions = new float[glyphCount * 2 + 2];
+            int[] indices = new int[glyphCount];
+            long runCount = OS.CFArrayGetCount(runs);
+            int glyphStart = 0, posStart = 0, indicesStart = 0;
+            for (int i = 0; i < runCount; i++) {
+                long runRef = OS.CFArrayGetValueAtIndex(runs, i);
+                if (runRef == 0) continue;
+                int slot = getFontSlot(runRef, composite, fontName) ;
+                if (slot != -1) {
+                    glyphStart += OS.CTRunGetGlyphs(runRef, slot << 24, glyphStart, glyphs);
+                } else {
+                    glyphStart += OS.CTRunGetGlyphCount(runRef);
+                }
+                if (size > 0) {
+                    posStart += OS.CTRunGetPositions(runRef, posStart, positions);
+                }
+                indicesStart += OS.CTRunGetStringIndices(runRef, indicesStart, indices);
+
             }
             if (size > 0) {
-                posStart += OS.CTRunGetPositions(runRef, posStart, positions);
+                positions[posStart] = (float)OS.CTLineGetTypographicBounds(lineRef);
             }
-            indicesStart += OS.CTRunGetStringIndices(runRef, indicesStart, indices);
-
+            run.shape(glyphCount, glyphs, positions, indices);
         }
-        if (size > 0) {
-            positions[posStart] = (float)OS.CTLineGetTypographicBounds(lineRef);
-        }
-        run.shape(glyphCount, glyphs, positions, indices);
         OS.CFRelease(lineRef);
     }
 }
--- a/modules/graphics/src/main/java/com/sun/javafx/font/coretext/OS.java	Tue Oct 01 10:00:06 2013 -0400
+++ b/modules/graphics/src/main/java/com/sun/javafx/font/coretext/OS.java	Tue Oct 01 10:06:51 2013 -0700
@@ -44,24 +44,12 @@
 
     static final int kCFURLPOSIXPathStyle = 0;
     static final int kCTFontOrientationDefault = 0;
-    static final int kCTFontManagerScopeNone = 0;
     static final int kCTFontManagerScopeProcess = 1;
-    static final int kCTFontManagerScopeSession = 3;
-    static final int kCTFontManagerScopeUser = 2;
-    static final int kCTRunStatusNoStatus = 0;
-    static final int kCTRunStatusNonMonotonic = 2;
-    static final int kCTRunStatusRightToLeft = 1;
     static final int kCGBitmapByteOrder32Big = 4 << 12;
     static final int kCGBitmapByteOrder32Little = 2 << 12;
     static final int kCGBitmapByteOrder32Host = ByteOrder.nativeOrder() == ByteOrder.LITTLE_ENDIAN ? kCGBitmapByteOrder32Little : kCGBitmapByteOrder32Big;
     static final int kCGImageAlphaPremultipliedFirst = 2;
     static final int kCGImageAlphaNone = 0;
-    static final int kCGImageAlphaOnly = 7;
-    static final int kCGPathElementAddCurveToPoint = 3;
-    static final int kCGPathElementAddLineToPoint = 1;
-    static final int kCGPathElementAddQuadCurveToPoint = 2;
-    static final int kCGPathElementCloseSubpath = 4;
-    static final int kCGPathElementMoveToPoint = 0;
 
     static final long CFStringCreate(String string) {
         char[] buffer = string.toCharArray();
@@ -70,23 +58,17 @@
     }
 
     /* Custom */
-    static final native byte[] CGBitmapContextGetData(long c);
     static final native byte[] CGBitmapContextGetData(long c, int width, int height, int bpp);
-    static final native void CGPointApplyAffineTransform(CGPoint point, CGAffineTransform t);
     static final native void CGRectApplyAffineTransform(CGRect rect, CGAffineTransform t);
-    static final native CGAffineTransform CGAffineTransformInvert(CGAffineTransform t);
     static final native Path2D CGPathApply(long path);
     static final native CGRect CGPathGetPathBoundingBox(long path);
     static final native long CFStringCreateWithCharacters(long alloc, char[] chars, long start, long numChars);
-    static final native String CTFontCopyDisplayName(long font);
     static final native String CTFontCopyAttributeDisplayName(long font);
-    static final native void CTFontDrawGlyphs(long font, short glyphs, double x, double y, long count, long context);
-    static final native double CTFontGetAdvancesForGlyphs(long font, int orientation, short glyphs, CGSize advances, long count);
-    static final native CGRect CTFontGetBoundingRectsForGlyphs(long font, int orientation, short glyphs, CGRect boundingRects, long count);
+    static final native void CTFontDrawGlyphs(long font, short glyphs, double x, double y, long context);
+    static final native double CTFontGetAdvancesForGlyphs(long font, int orientation, short glyphs, CGSize advances);
     static final native boolean CTFontGetBoundingRectForGlyphUsingTables(long font, short glyphs, short format, int[] retArr);
     static final native int CTRunGetGlyphs(long run, int slotMask, int start, int[] buffer);
     static final native int CTRunGetStringIndices(long run, int start, int[] buffer);
-    static final native CFRange CTRunGetStringRange(long run);
     static final native int CTRunGetPositions(long run, int start, float[] buffer);
 
     /* one to one */
@@ -125,6 +107,5 @@
     static final native double CTLineGetTypographicBounds(long line);
     static final native long CTRunGetGlyphCount(long run);
     static final native long CTRunGetAttributes(long run);
-    static final native int CTRunGetStatus(long run);
 
 }
--- a/modules/graphics/src/main/java/com/sun/javafx/font/directwrite/DWGlyph.java	Tue Oct 01 10:00:06 2013 -0400
+++ b/modules/graphics/src/main/java/com/sun/javafx/font/directwrite/DWGlyph.java	Tue Oct 01 10:06:51 2013 -0700
@@ -96,36 +96,44 @@
          */
         int textureType = OS.DWRITE_TEXTURE_CLEARTYPE_3x1;
         IDWriteGlyphRunAnalysis runAnalysis = createAnalysis(0, 0);
-        rect = runAnalysis.GetAlphaTextureBounds(textureType);
-        if ((rect.right - rect.left == 0) ||
-             (rect.bottom - rect.top == 0)) {
-            /* Check for both texture types due to some limitations with
-             * IDWriteGlyphRunAnalysis. See RT-31587.
-             */
-            rect = runAnalysis.GetAlphaTextureBounds(OS.DWRITE_TEXTURE_ALIASED_1x1);
+        if (runAnalysis != null) {
+            rect = runAnalysis.GetAlphaTextureBounds(textureType);
+            if (rect == null || rect.right - rect.left == 0 || rect.bottom - rect.top == 0) {
+                /* Check for both texture types due to some limitations with
+                 * IDWriteGlyphRunAnalysis. See RT-31587.
+                 */
+                rect = runAnalysis.GetAlphaTextureBounds(OS.DWRITE_TEXTURE_ALIASED_1x1);
+            }
+            runAnalysis.Release();
         }
-        runAnalysis.Release();
+        if (rect == null) {
+            rect = new RECT();
+        }
     }
 
     byte[] getLCDMask(float subPixelX, float subPixelY) {
-        int textureType = OS.DWRITE_TEXTURE_CLEARTYPE_3x1;
         IDWriteGlyphRunAnalysis runAnalysis = createAnalysis(subPixelX, subPixelY);
-        rect = runAnalysis.GetAlphaTextureBounds(textureType);
-        if ((rect.right - rect.left == 0) ||
-            (rect.bottom - rect.top == 0)) {
-            rect = runAnalysis.GetAlphaTextureBounds(OS.DWRITE_TEXTURE_ALIASED_1x1);
-            if ((rect.right - rect.left == 0) ||
-                (rect.bottom - rect.top == 0)) {
-                return new byte[0];
+        byte[] buffer = null;
+        if (runAnalysis != null) {
+            int textureType = OS.DWRITE_TEXTURE_CLEARTYPE_3x1;
+            rect = runAnalysis.GetAlphaTextureBounds(textureType);
+            if (rect != null && rect.right - rect.left != 0 && rect.bottom - rect.top != 0) {
+                buffer = runAnalysis.CreateAlphaTexture(textureType, rect);
             } else {
                 /* In some cases IDWriteGlyphRunAnalysis is unable to produce
                  * LCD masks. But as long as the size can determined D2D can be
                  * used to do the rendering. */
-                return getD2DMask(subPixelX, subPixelY, true);
+                rect = runAnalysis.GetAlphaTextureBounds(OS.DWRITE_TEXTURE_ALIASED_1x1);
+                if (rect != null && rect.right - rect.left != 0 && rect.bottom - rect.top != 0) {
+                    buffer = getD2DMask(subPixelX, subPixelY, true);
+                }
             }
+            runAnalysis.Release();
         }
-        byte[] buffer = runAnalysis.CreateAlphaTexture(textureType, rect);
-        runAnalysis.Release();
+        if (buffer == null) {
+            buffer = new byte[0];
+            rect = new RECT();
+        }
         return buffer;
     }
 
--- a/modules/graphics/src/main/java/com/sun/javafx/font/directwrite/DWGlyphLayout.java	Tue Oct 01 10:00:06 2013 -0400
+++ b/modules/graphics/src/main/java/com/sun/javafx/font/directwrite/DWGlyphLayout.java	Tue Oct 01 10:06:51 2013 -0700
@@ -25,6 +25,8 @@
 
 package com.sun.javafx.font.directwrite;
 
+import java.util.Arrays;
+
 import com.sun.javafx.font.CompositeFontResource;
 import com.sun.javafx.font.FontResource;
 import com.sun.javafx.font.FontStrike;
@@ -144,15 +146,6 @@
                                     analysis, null, features, featuresRangeLengths,
                                     featuresCount, advances, offsets);
 
-        /* Adjust glyph indices */
-        int[] indices = new int[length];
-        i = 0; j = rtl ? length - 1 : 0;
-        while (i < length) {
-            indices[i] = clusterMap[j];
-            i++;
-            j+=step;
-        }
-
         /* Adjust glyphs positions */
         float[] pos = new float[glyphCount * 2 + 2];
         i = 0; j = rtl ? glyphCount - 1 : 0;
@@ -168,9 +161,41 @@
         pos[i++] = 0;
 
         analyzer.Release();
+        int[] indices = getIndices(clusterMap, glyphCount, rtl);
         run.shape(glyphCount, iglyphs, pos, indices);
     }
 
+    private int[] getIndices(short[] clusterMap, int glyphCount, boolean rtl) {
+        /* The cluster map array produced by DirectWrite is character offset
+         * to glyph index mapping. TextRun internally requires a glyph index
+         * to character offset map table. */
+        int[] indices = new int[glyphCount];
+        Arrays.fill(indices, -1);
+        for (int i = 0; i < clusterMap.length; i++) {
+            /* keep character offset for the first glyph in the cluster */
+            if (indices[clusterMap[i]] == -1) {
+                indices[clusterMap[i]] = i;
+            }
+        }
+        if (indices.length > 0) {
+            if (indices[0] == -1) indices[0] = 0;
+            /* use the character offset of the preceding element */
+            for (int i = 1; i < indices.length; i++) {
+                if (indices[i] == -1) indices[i] = indices[i - 1];
+            }
+        }
+
+        if (rtl) {
+            /* Flip the array for RTL */
+            for (int i = 0; i < indices.length / 2; i++) {
+                int tmp = indices[i];
+                indices[i] = indices[indices.length - i - 1];
+                indices[indices.length - i - 1] = tmp;
+            }
+        }
+        return indices;
+    }
+
     private String getName(IDWriteLocalizedStrings localizedStrings) {
         if (localizedStrings == null) return null;
         int index = localizedStrings.FindLocaleName(LOCALE);
@@ -314,7 +339,7 @@
         int[] glyphs = new int[glyphCount];
         float[] advances = new float[glyphCount];
         float[] offsets = new float[glyphCount * 2];
-        int[] clusterMap = new int[length];
+        short[] clusterMap = new short[length];
         int glyphStart = 0;
         int textStart = 0;
         while (renderer.Next()) {
@@ -358,13 +383,8 @@
                 glyphs[i] = glyphs[glyphCount - i - 1];
                 glyphs[glyphCount - i - 1] = tmp;
             }
-            /* Adjust glyph indices */
-            for (i = 0; i < length / 2; i++) {
-                int tmp = clusterMap[i];
-                clusterMap[i] = clusterMap[length - i - 1];
-                clusterMap[length - i - 1] = tmp;
-            }
         }
-        run.shape(glyphCount, glyphs, pos, clusterMap);
+        int[] indices = getIndices(clusterMap, glyphCount, rtl);
+        run.shape(glyphCount, glyphs, pos, indices);
     }
 }
--- a/modules/graphics/src/main/java/com/sun/javafx/font/directwrite/JFXTextRenderer.java	Tue Oct 01 10:00:06 2013 -0400
+++ b/modules/graphics/src/main/java/com/sun/javafx/font/directwrite/JFXTextRenderer.java	Tue Oct 01 10:06:51 2013 -0700
@@ -68,7 +68,7 @@
         return OS.JFXTextRendererGetGlyphOffsets(ptr, offsets, start);
     }
 
-    int GetClusterMap(int[] clusterMap, int start) {
+    int GetClusterMap(short[] clusterMap, int start) {
         return OS.JFXTextRendererGetClusterMap(ptr, clusterMap, start);
     }
 }
--- a/modules/graphics/src/main/java/com/sun/javafx/font/directwrite/OS.java	Tue Oct 01 10:00:06 2013 -0400
+++ b/modules/graphics/src/main/java/com/sun/javafx/font/directwrite/OS.java	Tue Oct 01 10:06:51 2013 -0700
@@ -225,7 +225,7 @@
     static final native int JFXTextRendererGetGlyphIndices(long ptr, int[] glyphs, int start, int slot);
     static final native int JFXTextRendererGetGlyphAdvances(long ptr, float[] advances, int start);
     static final native int JFXTextRendererGetGlyphOffsets(long ptr, float[] offsets, int start);
-    static final native int JFXTextRendererGetClusterMap(long ptr, int[] clusterMap, int start);
+    static final native int JFXTextRendererGetClusterMap(long ptr, short[] clusterMap, int start);
 
     //IDWriteFontFace
     static final native int GetType(long ptr);
--- a/modules/graphics/src/main/java/com/sun/javafx/geom/PickRay.java	Tue Oct 01 10:00:06 2013 -0400
+++ b/modules/graphics/src/main/java/com/sun/javafx/geom/PickRay.java	Tue Oct 01 10:06:51 2013 -0700
@@ -84,8 +84,8 @@
             eye.set(halfViewWidth, halfViewHeight, -distanceZ);
         }
 
-        pickRay.nearClip = nearClip * (direction.length() / distanceZ);
-        pickRay.farClip = farClip * (direction.length() / distanceZ);
+        pickRay.nearClip = nearClip * (direction.length() / (fixedEye ? distanceZ : 1.0));
+        pickRay.farClip = farClip * (direction.length() / (fixedEye ? distanceZ : 1.0));
 
         pickRay.transform(cameraTransform);
 
--- a/modules/graphics/src/main/java/com/sun/javafx/sg/prism/CacheFilter.java	Tue Oct 01 10:00:06 2013 -0400
+++ b/modules/graphics/src/main/java/com/sun/javafx/sg/prism/CacheFilter.java	Tue Oct 01 10:06:51 2013 -0700
@@ -211,7 +211,7 @@
         if (cachedImageData == null) {
             return true;
         }
-        
+
         if (lastXDelta != 0 || lastYDelta != 0) {
             if (Math.abs(lastXDelta) >= cacheBounds.width || Math.abs(lastYDelta) >= cacheBounds.height ||
                     Math.rint(lastXDelta) != lastXDelta || Math.rint(lastYDelta) != lastYDelta) {
@@ -228,7 +228,7 @@
                 }
             }
         }
-        
+
         // TODO: is == sufficient for floating point comparison here? (RT-23963)
         if (cachedXform.getMxx() == renderXform.getMxx() &&
             cachedXform.getMyy() == renderXform.getMyy() &&
@@ -329,7 +329,7 @@
             cachedImageData = null;
         }
     }
-    
+
     void invalidateByTranslation(double translateXDelta, double translateYDelta) {
         if (cachedImageData == null) {
             return;
@@ -505,18 +505,9 @@
         BaseTransform xform = g.getTransformNoClone();
         FilterContext fctx = PrFilterContext.getInstance(g.getAssociatedScreen()); // getFilterContext
 
-        // Note: xform should not be modified, for the sake of Prism
-        double mxx = xform.getMxx();
-        double myx = xform.getMyx();
-        double mxy = xform.getMxy();
-        double myy = xform.getMyy();
-        double mxt = xform.getMxt();
-        double myt = xform.getMyt();
-
         double[] xformInfo = unmatrix(xform);
         boolean isUnsupported = unsupported(xformInfo);
 
-
         lastXDelta = lastXDelta * xformInfo[0];
         lastYDelta = lastYDelta * xformInfo[1];
 
@@ -539,11 +530,31 @@
                 }
                 invalidate();
             }
-            // Update the cachedXform to the current xform (ignoring translate).
-            cachedXform.setTransform(mxx, myx, mxy, myy, 0.0, 0.0);
-            cachedScaleX = xformInfo[0];
-            cachedScaleY = xformInfo[1];
-            cachedRotate = xformInfo[2];
+            if (scaleHint) {
+                // do not cache the image at a small scale factor when
+                // scaleHint is set as it leads to poor rendering results
+                // when image is scaled up.
+                cachedScaleX = Math.max(NGNode.highestPixelScale, xformInfo[0]);
+                cachedScaleY = Math.max(NGNode.highestPixelScale, xformInfo[1]);
+                cachedRotate = 0;
+                cachedXform.setTransform(cachedScaleX, 0.0,
+                                         0.0, cachedScaleX,
+                                         0.0, 0.0);
+                updateScreenXform(xformInfo);
+            } else {
+                cachedScaleX = xformInfo[0];
+                cachedScaleY = xformInfo[1];
+                cachedRotate = xformInfo[2];
+
+                // Update the cachedXform to the current xform (ignoring translate).
+                cachedXform.setTransform(xform.getMxx(), xform.getMyx(),
+                                         xform.getMxy(), xform.getMyy(),
+                                         0.0, 0.0);
+
+                // screenXform is always identity in this case, as we've just
+                // rendered into the cache using the render xform.
+                screenXform.setTransform(BaseTransform.IDENTITY_TRANSFORM);
+            }
 
             cacheBounds = impl_getCacheBounds(cacheBounds, cachedXform);
             cachedImageData = impl_createImageData(fctx, cacheBounds);
@@ -558,9 +569,6 @@
             cachedX = cachedBounds.x;
             cachedY = cachedBounds.y;
 
-            // screenXform is always identity in this case, as we've just
-            // rendered into the cache using the render xform.
-            screenXform.setTransform(BaseTransform.IDENTITY_TRANSFORM);
         } else {
             if (scrollCacheState == ScrollCacheState.ENABLED &&
                     (lastXDelta != 0 || lastYDelta != 0) ) {
@@ -590,6 +598,8 @@
             if (PulseLogger.PULSE_LOGGING_ENABLED) PulseLogger.PULSE_LOGGER.renderIncrementCounter("CacheFilter not used");
             impl_renderNodeToScreen(g);
         } else {
+            double mxt = xform.getMxt();
+            double myt = xform.getMyt();
             impl_renderCacheToScreen(g, implImage, mxt, myt);
             implImage.unlock();
         }
--- a/modules/graphics/src/main/java/com/sun/javafx/stage/PopupWindowPeerListener.java	Tue Oct 01 10:00:06 2013 -0400
+++ b/modules/graphics/src/main/java/com/sun/javafx/stage/PopupWindowPeerListener.java	Tue Oct 01 10:06:51 2013 -0700
@@ -51,6 +51,9 @@
     public void closing() {
     }
 
+    public void changedLocation(float x, float y) {
+    }
+
     public void changedIconified(boolean iconified) {
         // Not applicable for popups
     }
--- a/modules/graphics/src/main/java/com/sun/javafx/text/PrismTextLayout.java	Tue Oct 01 10:00:06 2013 -0400
+++ b/modules/graphics/src/main/java/com/sun/javafx/text/PrismTextLayout.java	Tue Oct 01 10:06:51 2013 -0700
@@ -164,7 +164,7 @@
 
     public boolean setWrapWidth(float newWidth) {
         float oldWidth = this.wrapWidth;
-        this.wrapWidth = newWidth;
+        this.wrapWidth = Math.max(0, newWidth);
 
         boolean needsLayout = true;
         if (lines != null && oldWidth != 0 && newWidth != 0) {
@@ -1181,7 +1181,7 @@
             }
 
             computeSideBearings(line);
-            
+
             /* Set run location */
             float runX = lineX;
             TextRun[] lineRuns = line.getRuns();
@@ -1192,7 +1192,7 @@
                 runX += run.getWidth();
             }
             if (i + 1 < lines.length) {
-                lineY = Math.max(lineY, lineY + bounds.getHeight() + spacing);                
+                lineY = Math.max(lineY, lineY + bounds.getHeight() + spacing);
             } else {
                 lineY += (bounds.getHeight() - line.getLeading());
             }
@@ -1211,7 +1211,7 @@
         if (strike == null) {
             return null;
         }
-        
+
         boolean underline = (type & TYPE_UNDERLINE) != 0;
         boolean hasUnderline = (flags & FLAGS_CACHED_UNDERLINE) != 0;
         boolean strikethrough = (type & TYPE_STRIKETHROUGH) != 0;
@@ -1221,7 +1221,7 @@
             /* Return last cached value */
             return visualBounds;
         }
-        
+
         flags &= ~(FLAGS_CACHED_STRIKETHROUGH | FLAGS_CACHED_UNDERLINE);
         if (underline) flags |= FLAGS_CACHED_UNDERLINE;
         if (strikethrough) flags |= FLAGS_CACHED_STRIKETHROUGH;
@@ -1283,7 +1283,7 @@
                 }
             }
         }
-        
+
         if (xMin < xMax && yMin < yMax) {
             visualBounds.setBounds(xMin, yMin, xMax, yMax);
         }
--- a/modules/graphics/src/main/java/com/sun/javafx/tk/quantum/PerformanceTrackerHelper.java	Tue Oct 01 10:00:06 2013 -0400
+++ b/modules/graphics/src/main/java/com/sun/javafx/tk/quantum/PerformanceTrackerHelper.java	Tue Oct 01 10:06:51 2013 -0700
@@ -54,7 +54,7 @@
                     @Override
                     public PerformanceTrackerHelper run() {
                         try {
-                            if (PrismSettings.perfLog) {
+                            if (PrismSettings.perfLog != null) {
                                 final PerformanceTrackerHelper trackerImpl =
                                         new PerformanceTrackerDefaultImpl();
 
--- a/modules/graphics/src/main/java/com/sun/prism/impl/PrismSettings.java	Tue Oct 01 10:00:06 2013 -0400
+++ b/modules/graphics/src/main/java/com/sun/prism/impl/PrismSettings.java	Tue Oct 01 10:06:51 2013 -0700
@@ -83,7 +83,7 @@
     public static final boolean disableEffects;
     public static final int glyphCacheWidth;
     public static final int glyphCacheHeight;
-    public static final boolean perfLog;
+    public static final String perfLog;
     public static final boolean perfLogExitFlush;
     public static final boolean perfLogFirstPaintFlush;
     public static final boolean perfLogFirstPaintExit;
@@ -343,7 +343,7 @@
          * Performance Logger flags
          * Enable the performance logger, print on exit, print on first paint etc.
          */
-        perfLog = getBoolean(systemProperties, "sun.perflog", false, true);
+        perfLog = systemProperties.getProperty("sun.perflog");
         perfLogExitFlush = getBoolean(systemProperties, "sun.perflog.fx.exitflush", false, true);
         perfLogFirstPaintFlush = getBoolean(systemProperties, "sun.perflog.fx.firstpaintflush", false, true);
         perfLogFirstPaintExit = getBoolean(systemProperties, "sun.perflog.fx.firstpaintexit", false, true);
--- a/modules/graphics/src/main/java/com/sun/prism/j2d/J2DPrismGraphics.java	Tue Oct 01 10:00:06 2013 -0400
+++ b/modules/graphics/src/main/java/com/sun/prism/j2d/J2DPrismGraphics.java	Tue Oct 01 10:06:51 2013 -0700
@@ -226,8 +226,11 @@
                     y2 = y + h * y2;
                 }
                 if (x1 == x2 && y1 == y1) {
-                    x1 -= .0001f;
-                    x2 += .0001f;
+                    // Hardware pipelines use an inverse transform of
+                    // all zeros to choose colors when the start and end
+                    // point are the same so that the first color is
+                    // always chosen...
+                    return colors[0];
                 }
                 java.awt.geom.Point2D p1 =
                     new java.awt.geom.Point2D.Float(x1, y1);
--- a/modules/graphics/src/main/java/com/sun/prism/sw/SWGraphics.java	Tue Oct 01 10:00:06 2013 -0400
+++ b/modules/graphics/src/main/java/com/sun/prism/sw/SWGraphics.java	Tue Oct 01 10:06:51 2013 -0700
@@ -783,9 +783,12 @@
                 }
             }
         } else {
-            glyphTx.setTransform(tx);
-            glyphTx.deriveWithTranslation(x + gl.getPosX(idx), y + gl.getPosY(idx));
-            this.paintShapePaintAlreadySet(g.getShape(), null, glyphTx);
+            Shape shape = g.getShape();
+            if (shape != null) {
+                glyphTx.setTransform(tx);
+                glyphTx.deriveWithTranslation(x + gl.getPosX(idx), y + gl.getPosY(idx));
+                this.paintShapePaintAlreadySet(shape, null, glyphTx);
+            }
         }
     }
 
--- a/modules/graphics/src/main/java/javafx/concurrent/ScheduledService.java	Tue Oct 01 10:00:06 2013 -0400
+++ b/modules/graphics/src/main/java/javafx/concurrent/ScheduledService.java	Tue Oct 01 10:06:51 2013 -0700
@@ -25,8 +25,6 @@
 
 package javafx.concurrent;
 
-import java.util.Timer;
-import java.util.TimerTask;
 import javafx.beans.property.BooleanProperty;
 import javafx.beans.property.IntegerProperty;
 import javafx.beans.property.ObjectProperty;
@@ -39,6 +37,8 @@
 import javafx.beans.property.SimpleObjectProperty;
 import javafx.util.Callback;
 import javafx.util.Duration;
+import java.util.Timer;
+import java.util.TimerTask;
 
 /**
  * <p>The ScheduledService is a {@link Service} which will automatically restart
@@ -313,7 +313,7 @@
      */
     private ReadOnlyObjectWrapper<V> lastValue = new ReadOnlyObjectWrapper<>(this, "lastValue", null);
     public final V getLastValue() { return lastValue.get(); }
-    public final ReadOnlyObjectProperty lastValueProperty() { return lastValue.getReadOnlyProperty(); }
+    public final ReadOnlyObjectProperty<V> lastValueProperty() { return lastValue.getReadOnlyProperty(); }
 
     /**
      * The timestamp of the last time the task was run. This is used to compute the amount
--- a/modules/graphics/src/main/java/javafx/concurrent/Service.java	Tue Oct 01 10:00:06 2013 -0400
+++ b/modules/graphics/src/main/java/javafx/concurrent/Service.java	Tue Oct 01 10:06:51 2013 -0700
@@ -25,14 +25,6 @@
 
 package javafx.concurrent;
 
-import java.security.AccessController;
-import java.security.PrivilegedAction;
-import java.util.concurrent.BlockingQueue;
-import java.util.concurrent.Executor;
-import java.util.concurrent.LinkedBlockingQueue;
-import java.util.concurrent.ThreadFactory;
-import java.util.concurrent.ThreadPoolExecutor;
-import java.util.concurrent.TimeUnit;
 import javafx.application.Platform;
 import javafx.beans.property.BooleanProperty;
 import javafx.beans.property.DoubleProperty;
@@ -53,9 +45,21 @@
 import javafx.event.EventHandler;
 import javafx.event.EventTarget;
 import javafx.event.EventType;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.Executor;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
 import sun.util.logging.PlatformLogger;
-
-import static javafx.concurrent.WorkerStateEvent.*;
+import static javafx.concurrent.WorkerStateEvent.WORKER_STATE_CANCELLED;
+import static javafx.concurrent.WorkerStateEvent.WORKER_STATE_FAILED;
+import static javafx.concurrent.WorkerStateEvent.WORKER_STATE_READY;
+import static javafx.concurrent.WorkerStateEvent.WORKER_STATE_RUNNING;
+import static javafx.concurrent.WorkerStateEvent.WORKER_STATE_SCHEDULED;
+import static javafx.concurrent.WorkerStateEvent.WORKER_STATE_SUCCEEDED;
 
 /**
  * <p>
--- a/modules/graphics/src/main/java/javafx/concurrent/Task.java	Tue Oct 01 10:00:06 2013 -0400
+++ b/modules/graphics/src/main/java/javafx/concurrent/Task.java	Tue Oct 01 10:06:51 2013 -0700
@@ -25,13 +25,32 @@
 
 package javafx.concurrent;
 
+import javafx.application.Platform;
+import javafx.beans.property.BooleanProperty;
+import javafx.beans.property.DoubleProperty;
+import javafx.beans.property.ObjectProperty;
+import javafx.beans.property.ReadOnlyBooleanProperty;
+import javafx.beans.property.ReadOnlyDoubleProperty;
+import javafx.beans.property.ReadOnlyObjectProperty;
+import javafx.beans.property.ReadOnlyStringProperty;
+import javafx.beans.property.SimpleBooleanProperty;
+import javafx.beans.property.SimpleDoubleProperty;
+import javafx.beans.property.SimpleObjectProperty;
+import javafx.beans.property.SimpleStringProperty;
+import javafx.beans.property.StringProperty;
+import javafx.event.Event;
+import javafx.event.EventDispatchChain;
+import javafx.event.EventHandler;
+import javafx.event.EventTarget;
+import javafx.event.EventType;
 import java.util.concurrent.Callable;
 import java.util.concurrent.FutureTask;
 import java.util.concurrent.atomic.AtomicReference;
-import javafx.application.Platform;
-import javafx.beans.property.*;
-import javafx.event.*;
-import static javafx.concurrent.WorkerStateEvent.*;
+import static javafx.concurrent.WorkerStateEvent.WORKER_STATE_CANCELLED;
+import static javafx.concurrent.WorkerStateEvent.WORKER_STATE_FAILED;
+import static javafx.concurrent.WorkerStateEvent.WORKER_STATE_RUNNING;
+import static javafx.concurrent.WorkerStateEvent.WORKER_STATE_SCHEDULED;
+import static javafx.concurrent.WorkerStateEvent.WORKER_STATE_SUCCEEDED;
 
 /**
  * <p>
@@ -964,7 +983,7 @@
             // If this method was called on the FX application thread, then we can
             // just update the state directly and this will make sure that after
             // the cancel method was called, the state will be set correctly
-            // (otherwise it would be indeterminate. However if the cancel method was
+            // (otherwise it would be indeterminate). However if the cancel method was
             // called off the FX app thread, then we must use runLater, and the
             // state flag will not be readable immediately after this call. However,
             // that would be the case anyway since these properties are not thread-safe.
--- a/modules/graphics/src/main/java/javafx/concurrent/WorkerStateEvent.java	Tue Oct 01 10:00:06 2013 -0400
+++ b/modules/graphics/src/main/java/javafx/concurrent/WorkerStateEvent.java	Tue Oct 01 10:06:51 2013 -0700
@@ -95,6 +95,11 @@
         super(worker, worker instanceof EventTarget ? (EventTarget) worker : null, eventType);
     }
 
+    /**
+     * The Worker on which the Event initially occurred.
+     *
+     * @return The Worker on which the Event initially occurred.
+     */
     @Override public Worker getSource() {
         return (Worker) super.getSource();
     }
--- a/modules/graphics/src/main/java/javafx/scene/Node.java	Tue Oct 01 10:00:06 2013 -0400
+++ b/modules/graphics/src/main/java/javafx/scene/Node.java	Tue Oct 01 10:06:51 2013 -0700
@@ -337,11 +337,14 @@
  * clip, or any transforms. For resizable classes (Regions and Controls)
  * layoutBounds will always map to {@code 0,0 width x height}.
  *
- * <p> The image shows a node with transformation (rotation by 20 degrees)
- * and its bounds. The red rectangle represents {@code boundsInParent} in the
- * coordinate space of the Node's parent. The green rectangle represents {@code boundsInLocal}
- * in coordinate space of the Node. </p>
- * <p> <img src="doc-files/bounds-complex.png"/> </p>
+ * <p> The image shows a node without any transformation and its {@code boundsInLocal}:
+ * <p> <img src="doc-files/boundsLocal.png"/> </p>
+ * If we rotate the image by 20 degrees we get following result:
+ * <p> <img src="doc-files/boundsParent.png"/> </p>
+ * The red rectangle represents {@code boundsInParent} in the
+ * coordinate space of the Node's parent. The {@code boundsInLocal} stays the same
+ * as in the first image, the green rectangle in this image represents {@code boundsInLocal}
+ * in the coordinate space of the Node. </p>
  *
  * <p> The images show a filled and stroked rectangle and their bounds. The
  * first rectangle {@code [x:10.0 y:10.0 width:100.0 height:100.0 strokeWidth:0]}
@@ -4879,7 +4882,7 @@
         final double minDistance = pickRay.getNearClip();
         final double maxDistance = pickRay.getFarClip();
         if (tmin < minDistance) {
-            if (tmax >= minDistance && tmax <= maxDistance) {
+            if (tmax >= minDistance) {
                 // we are inside bounds
                 return 0.0;
             } else {
--- a/modules/graphics/src/main/java/javafx/scene/PerspectiveCamera.java	Tue Oct 01 10:00:06 2013 -0400
+++ b/modules/graphics/src/main/java/javafx/scene/PerspectiveCamera.java	Tue Oct 01 10:06:51 2013 -0700
@@ -212,9 +212,7 @@
                 getViewWidth(), getViewHeight(),
                 getFieldOfView(), isVerticalFieldOfView(),
                 getCameraTransform(),
-                //TODO: use actual clips always after rendering uses them
-                fixedEyeAtCameraZero ? getNearClip() : 0.0,
-                fixedEyeAtCameraZero ? getFarClip() : Double.POSITIVE_INFINITY,
+                getNearClip(), getFarClip(),
                 pickRay);
     }
 
--- a/modules/graphics/src/main/java/javafx/scene/layout/GridPane.java	Tue Oct 01 10:00:06 2013 -0400
+++ b/modules/graphics/src/main/java/javafx/scene/layout/GridPane.java	Tue Oct 01 10:06:51 2013 -0700
@@ -1338,7 +1338,9 @@
 
     private CompositeSize computeMaxHeights() {
         if (rowMaxHeight == null) {
-            rowMaxHeight = createCompositeRows();
+            rowMaxHeight = createCompositeRows(Double.MAX_VALUE); // Do not restrict the row (to allow grow). The
+                                                                  // Nodes will be restricted to their computed size
+                                                                  // in Region.layoutInArea call
             final ObservableList<RowConstraints> rowConstr = getRowConstraints();
             CompositeSize prefHeights = null;
             for (int i = 0; i < rowConstr.size(); ++i) {
@@ -1358,20 +1360,6 @@
                     }
                 }
             }
-            List<Node> managed = getManagedChildren();
-            for (int i = 0, size = managed.size(); i < size; i++) {
-                Node child = managed.get(i);
-                int start = getNodeRowIndex(child);
-                int end = getNodeRowEndConvertRemaining(child);
-                double childMaxAreaHeight = computeChildMaxAreaHeight(child,
-                        isNodePositionedByBaseline(child) ? rowMaxBaselineComplement[start] : -1,
-                        getMargin(child), -1);
-                if (start == end && !rowMaxHeight.isPreset(start)) {
-                    rowMaxHeight.setMaxSize(start, childMaxAreaHeight);
-                } else if (start != end){
-                    rowMaxHeight.setMaxMultiSize(start, end + 1, childMaxAreaHeight);
-                }
-            }
         }
         return rowMaxHeight;
     }
@@ -1382,10 +1370,10 @@
             if (rowPrefHeight != null) {
                 return rowPrefHeight;
             }
-            rowPrefHeight = createCompositeRows();
+            rowPrefHeight = createCompositeRows(0);
             result = rowPrefHeight;
         } else {
-            result = createCompositeRows();
+            result = createCompositeRows(0);
         }
 
         final ObservableList<RowConstraints> rowConstr = getRowConstraints();
@@ -1430,10 +1418,10 @@
             if (rowMinHeight != null) {
                 return rowMinHeight;
             }
-            rowMinHeight = createCompositeRows();
+            rowMinHeight = createCompositeRows(0);
             result = rowMinHeight;
         } else {
-            result = createCompositeRows();
+            result = createCompositeRows(0);
         }
 
         final ObservableList<RowConstraints> rowConstr = getRowConstraints();
@@ -1479,7 +1467,9 @@
 
     private CompositeSize computeMaxWidths() {
         if (columnMaxWidth == null) {
-            columnMaxWidth = createCompositeColumns();
+            columnMaxWidth = createCompositeColumns(Double.MAX_VALUE);// Do not restrict the column (to allow grow). The
+                                                                      // Nodes will be restricted to their computed size
+                                                                      // in Region.layoutInArea call
             final ObservableList<ColumnConstraints> columnConstr = getColumnConstraints();
             CompositeSize prefWidths = null;
             for (int i = 0; i < columnConstr.size(); ++i) {
@@ -1499,19 +1489,6 @@
                     }
                 }
             }
-            List<Node> managed = getManagedChildren();
-            for (int i = 0, size = managed.size(); i < size; i++) {
-                Node child = managed.get(i);
-                int start = getNodeColumnIndex(child);
-                int end = getNodeColumnEndConvertRemaining(child);
-                if (start == end && !columnMaxWidth.isPreset(start)) {
-                    columnMaxWidth.setMaxSize(start, computeChildMaxAreaWidth(child,
-                            -1, getMargin(child), -1, false));
-                } else if (start != end){
-                    columnMaxWidth.setMaxMultiSize(start, end + 1, computeChildMaxAreaWidth(child,
-                            -1, getMargin(child), -1, false));
-                }
-            }
         }
         return columnMaxWidth;
     }
@@ -1522,10 +1499,10 @@
             if (columnPrefWidth != null) {
                 return columnPrefWidth;
             }
-            columnPrefWidth = createCompositeColumns();
+            columnPrefWidth = createCompositeColumns(0);
             result = columnPrefWidth;
         } else {
-            result = createCompositeColumns();
+            result = createCompositeColumns(0);
         }
 
         final ObservableList<ColumnConstraints> columnConstr = getColumnConstraints();
@@ -1573,10 +1550,10 @@
             if (columnMinWidth != null) {
                 return columnMinWidth;
             }
-            columnMinWidth = createCompositeColumns();
+            columnMinWidth = createCompositeColumns(0);
             result = columnMinWidth;
         } else {
-            result = createCompositeColumns();
+            result = createCompositeColumns(0);
         }
 
         final ObservableList<ColumnConstraints> columnConstr = getColumnConstraints();
@@ -1615,7 +1592,7 @@
         final CompositeSize heights;
         if (rowPercentTotal == 100) {
             // all rows defined by percentage, no need to compute pref heights
-            heights = createCompositeRows();
+            heights = createCompositeRows(0);
         } else {
             heights = (CompositeSize) computePrefHeights(null).clone();
         }
@@ -1628,7 +1605,7 @@
         final CompositeSize widths;
         if (columnPercentTotal == 100) {
             // all columns defined by percentage, no need to compute pref widths
-            widths = createCompositeColumns();
+            widths = createCompositeColumns(0);
         } else {
             widths = (CompositeSize) computePrefWidths(null).clone();
         }
@@ -2316,14 +2293,14 @@
         return "Grid hgap="+getHgap()+", vgap="+getVgap()+", alignment="+getAlignment();
     }
 
-    private CompositeSize createCompositeRows() {
+    private CompositeSize createCompositeRows(double initSize) {
         return new CompositeSize(getNumberOfRows(), rowPercentHeight, rowPercentTotal,
-                snapSpace(getVgap()));
+                snapSpace(getVgap()), initSize);
     }
 
-    private CompositeSize createCompositeColumns() {
+    private CompositeSize createCompositeColumns(double initSize) {
         return new CompositeSize(getNumberOfColumns(), columnPercentWidth, columnPercentTotal,
-                snapSpace(getHgap()));
+                snapSpace(getHgap()), initSize);
     }
 
     private int getNodeRowEndConvertRemaining(Node child) {
@@ -2496,9 +2473,9 @@
         private final double totalFixedPercent;
         private final double gap;
 
-        public CompositeSize(int capacity, double fixedPercent[], double totalFixedPercent, double gap) {
+        public CompositeSize(int capacity, double fixedPercent[], double totalFixedPercent, double gap, double initSize) {
             singleSizes = new double[capacity];
-            Arrays.fill(singleSizes, 0);
+            Arrays.fill(singleSizes, initSize);
 
             this.fixedPercent = fixedPercent;
             this.totalFixedPercent = totalFixedPercent;
--- a/modules/graphics/src/main/java/javafx/scene/shape/Box.java	Tue Oct 01 10:00:06 2013 -0400
+++ b/modules/graphics/src/main/java/javafx/scene/shape/Box.java	Tue Oct 01 10:06:51 2013 -0700
@@ -93,6 +93,7 @@
                     impl_markDirty(DirtyBits.MESH_GEOM);
                     manager.invalidateBoxMesh(key);
                     key = 0;
+                    impl_geomChanged();
                 }
             };
         }
@@ -122,6 +123,7 @@
                     impl_markDirty(DirtyBits.MESH_GEOM);
                     manager.invalidateBoxMesh(key);
                     key = 0;
+                    impl_geomChanged();
                 }
             };
         }
@@ -151,6 +153,7 @@
                     impl_markDirty(DirtyBits.MESH_GEOM);
                     manager.invalidateBoxMesh(key);
                     key = 0;
+                    impl_geomChanged();
                 }
             };
         }
--- a/modules/graphics/src/main/java/javafx/scene/shape/Cylinder.java	Tue Oct 01 10:00:06 2013 -0400
+++ b/modules/graphics/src/main/java/javafx/scene/shape/Cylinder.java	Tue Oct 01 10:06:51 2013 -0700
@@ -115,6 +115,7 @@
                     impl_markDirty(DirtyBits.MESH_GEOM);
                     manager.invalidateCylinderMesh(key);
                     key = 0;
+                    impl_geomChanged();
                 }
             };
         }
@@ -144,6 +145,7 @@
                     impl_markDirty(DirtyBits.MESH_GEOM);
                     manager.invalidateCylinderMesh(key);
                     key = 0;
+                    impl_geomChanged();
                 }
             };
         }
--- a/modules/graphics/src/main/java/javafx/scene/shape/Sphere.java	Tue Oct 01 10:00:06 2013 -0400
+++ b/modules/graphics/src/main/java/javafx/scene/shape/Sphere.java	Tue Oct 01 10:06:51 2013 -0700
@@ -112,6 +112,7 @@
                     impl_markDirty(DirtyBits.MESH_GEOM);
                     manager.invalidateSphereMesh(key);
                     key = 0;
+                    impl_geomChanged();
                 }
             };
         }
--- a/modules/graphics/src/main/native-font/coretext.c	Tue Oct 01 10:00:06 2013 -0400
+++ b/modules/graphics/src/main/native-font/coretext.c	Tue Oct 01 10:06:51 2013 -0700
@@ -104,50 +104,6 @@
     return lpObject;
 }
 
-typedef struct CFRange_FID_CACHE {
-    int cached;
-    jclass clazz;
-    jfieldID location, length;
-    jmethodID init;
-} CFRange_FID_CACHE;
-
-CFRange_FID_CACHE CFRangeFc;
-
-void cacheCFRangeFields(JNIEnv *env)
-{
-    if (CFRangeFc.cached) return;
-    jclass tmpClass = (*env)->FindClass(env, "com/sun/javafx/font/coretext/CFRange");
-    CFRangeFc.clazz =  (jclass)(*env)->NewGlobalRef(env, tmpClass);
-    CFRangeFc.location = (*env)->GetFieldID(env, CFRangeFc.clazz, "location", "J");
-    CFRangeFc.length = (*env)->GetFieldID(env, CFRangeFc.clazz, "length", "J");
-    CFRangeFc.init = (*env)->GetMethodID(env, CFRangeFc.clazz, "<init>", "()V");
-    CFRangeFc.cached = 1;
-}
-
-CFRange *getCFRangeFields(JNIEnv *env, jobject lpObject, CFRange *lpStruct)
-{
-    if (!CFRangeFc.cached) cacheCFRangeFields(env);
-    lpStruct->location = (*env)->GetLongField(env, lpObject, CFRangeFc.location);
-    lpStruct->length = (*env)->GetLongField(env, lpObject, CFRangeFc.length);
-    return lpStruct;
-}
-
-void setCFRangeFields(JNIEnv *env, jobject lpObject, CFRange *lpStruct)
-{
-    if (!CFRangeFc.cached) cacheCFRangeFields(env);
-    (*env)->SetLongField(env, lpObject, CFRangeFc.location, (jlong)lpStruct->location);
-    (*env)->SetLongField(env, lpObject, CFRangeFc.length, (jlong)lpStruct->length);
-}
-
-jobject newCFRange(JNIEnv *env, CFRange *lpStruct)
-{
-    jobject lpObject = NULL;
-    if (!CFRangeFc.cached) cacheCFRangeFields(env);
-    lpObject = (*env)->NewObject(env, CFRangeFc.clazz, CFRangeFc.init);
-    if (lpObject && lpStruct) setCFRangeFields(env, lpObject, lpStruct);
-    return lpObject;
-}
-
 typedef struct CGPoint_FID_CACHE {
     int cached;
     jclass clazz;
@@ -525,12 +481,6 @@
     return (jlong)CTRunGetGlyphCount((CTRunRef)arg0);
 }
 
-JNIEXPORT jint JNICALL OS_NATIVE(CTRunGetStatus)
-    (JNIEnv *env, jclass that, jlong arg0)
-{
-    return (jint)CTRunGetStatus((CTRunRef)arg0);
-}
-
 JNIEXPORT jlong JNICALL OS_NATIVE(CTRunGetAttributes)
     (JNIEnv *env, jclass that, jlong arg0)
 {
@@ -619,20 +569,11 @@
     return i;
 }
 
-JNIEXPORT jobject JNICALL OS_NATIVE(CTRunGetStringRange)
-    (JNIEnv *env, jclass that, jlong arg0)
-{
-    CTRunRef run = (CTRunRef)arg0;
-    CFRange result = CTRunGetStringRange(run);
-    return newCFRange(env, &result);
-}
-
 JNIEXPORT jstring JNICALL OS_NATIVE(CTFontCopyAttributeDisplayName)
     (JNIEnv *env, jclass that, jlong arg0)
 {
     CFStringRef stringRef = CTFontCopyAttribute((CTFontRef)arg0, kCTFontDisplayNameAttribute);
-
-    /* Copied from MacFontFinder#createJavaString */
+    if (stringRef == NULL) return NULL;
     CFIndex length = CFStringGetLength(stringRef);
     UniChar buffer[length];
     CFStringGetCharacters(stringRef, CFRangeMake(0, length), buffer);
@@ -640,36 +581,7 @@
     return (*env)->NewString(env, (jchar *)buffer, length);
 }
 
-JNIEXPORT jstring JNICALL OS_NATIVE(CTFontCopyDisplayName)
-    (JNIEnv *env, jclass that, jlong arg0)
-{
-    CFStringRef stringRef = CTFontCopyDisplayName((CTFontRef)arg0);
-
-    /* Copied from MacFontFinder#createJavaString */
-    CFIndex length = CFStringGetLength(stringRef);
-    UniChar buffer[length];
-    CFStringGetCharacters(stringRef, CFRangeMake(0, length), buffer);
-    CFRelease(stringRef);
-    return (*env)->NewString(env, (jchar *)buffer, length);
-}
-
-JNIEXPORT jbyteArray JNICALL OS_NATIVE(CGBitmapContextGetData__J)
-    (JNIEnv *env, jclass that, jlong arg0)
-{
-    jbyteArray result = NULL;
-    CGContextRef context = (CGContextRef)arg0;
-    void* data = CGBitmapContextGetData(context);
-    if (data) {
-        size_t size = CGBitmapContextGetBytesPerRow(context) * CGBitmapContextGetHeight(context);
-        result = (*env)->NewByteArray(env, size);
-        if (result) {
-            (*env)->SetByteArrayRegion(env, result, 0, size, data);
-        }
-    }
-    return result;
-}
-
-JNIEXPORT jbyteArray JNICALL OS_NATIVE(CGBitmapContextGetData__JIII)
+JNIEXPORT jbyteArray JNICALL OS_NATIVE(CGBitmapContextGetData)
     (JNIEnv *env, jclass that, jlong arg0, jint dstWidth, jint dstHeight, jint bpp)
 {
     jbyteArray result = NULL;
@@ -679,7 +591,9 @@
     if (srcData) {
         /* Use one byte per pixel for grayscale */
         size_t srcWidth = CGBitmapContextGetWidth(context);
+        if (srcWidth < dstWidth) return NULL;
         size_t srcHeight =  CGBitmapContextGetHeight(context);
+        if (srcHeight < dstHeight) return NULL;
         size_t srcBytesPerRow = CGBitmapContextGetBytesPerRow(context);
         size_t srcStep = CGBitmapContextGetBitsPerPixel(context) / 8;
         int srcOffset = (srcHeight - dstHeight) * srcBytesPerRow;
@@ -695,7 +609,7 @@
         for (y = 0; y < dstHeight; y++) {
             for (x = 0, sx = 0; x < dstWidth; x++, dstOffset += dstStep, sx += srcStep) {
                 if (dstStep == 1) {
-                    /* BGRA or Gray to Gray*/
+                    /* BGRA or Gray to Gray */
                     data[dstOffset] = 0xFF - srcData[srcOffset + sx];
                 } else {
                     /* BGRA to RGB */
@@ -715,20 +629,6 @@
     return result;
 }
 
-JNIEXPORT void JNICALL OS_NATIVE(CGPointApplyAffineTransform)
-    (JNIEnv *env, jclass that, jobject arg0, jobject arg1)
-{
-    CGPoint _arg0, *lparg0=NULL;
-    CGAffineTransform _arg1, *lparg1=NULL;
-    if (arg0) if ((lparg0 = getCGPointFields(env, arg0, &_arg0)) == NULL) goto fail;
-    if (arg1) if ((lparg1 = getCGAffineTransformFields(env, arg1, &_arg1)) == NULL) goto fail;
-    _arg0 = CGPointApplyAffineTransform(*lparg0, *lparg1);
-fail:
-    /* In Only */
-//    if (arg1 && lparg1) setCGAffineTransformFields(env, arg1, lparg1);
-    if (arg0 && lparg0) setCGPointFields(env, arg0, lparg0);
-}
-
 JNIEXPORT void JNICALL OS_NATIVE(CGRectApplyAffineTransform)
     (JNIEnv *env, jclass that, jobject arg0, jobject arg1)
 {
@@ -744,28 +644,12 @@
 }
 
 JNIEXPORT void JNICALL OS_NATIVE(CTFontDrawGlyphs)
-    (JNIEnv *env, jclass that, jlong arg0, jshort arg1, jdouble arg2, jdouble arg3, jlong arg4, jlong arg5)
+    (JNIEnv *env, jclass that, jlong arg0, jshort arg1, jdouble arg2, jdouble arg3, jlong contextRef)
 {
     /* Custom: only takes one glyph at the time */
     CGGlyph glyphs[] = {arg1};
     CGPoint pos[] = {CGPointMake(arg2, arg3)};
-    CTFontDrawGlyphs((CTFontRef)arg0, glyphs, pos, 1, (CGContextRef)arg5);
-}
-
-JNIEXPORT jobject JNICALL OS_NATIVE(CTFontGetBoundingRectsForGlyphs)
-    (JNIEnv *env, jclass that, jlong arg1, jint arg2, jshort arg3, jobject arg4, jlong arg5)
-{
-    /* Custom: only takes one glyph at the time */
-    jobject rc = NULL;
-    CGRect result;
-    CGGlyph glyphs[] = {arg3};
-    CGRect _arg4, *lparg4=NULL;
-    if (arg4) if ((lparg4 = getCGRectFields(env, arg4, &_arg4)) == NULL) goto fail;
-    result = CTFontGetBoundingRectsForGlyphs((CTFontRef)arg1, (CTFontOrientation)arg2, glyphs, lparg4, 1);
-    rc = newCGRect(env, &result);
-fail:
-    if (arg4 && lparg4) setCGRectFields(env, arg4, &_arg4);
-    return rc;
+    CTFontDrawGlyphs((CTFontRef)arg0, glyphs, pos, 1, (CGContextRef)contextRef);
 }
 
 JNIEXPORT jboolean JNICALL OS_NATIVE(CTFontGetBoundingRectForGlyphUsingTables)
@@ -831,7 +715,7 @@
 }
 
 JNIEXPORT jdouble JNICALL OS_NATIVE(CTFontGetAdvancesForGlyphs)
-    (JNIEnv *env, jclass that, jlong arg0, jint arg1, jshort arg2, jobject arg3, jlong arg4)
+    (JNIEnv *env, jclass that, jlong arg0, jint arg1, jshort arg2, jobject arg3)
 {
     /* Custom: only takes one glyph at the time */
     jdouble rc = 0;
@@ -851,21 +735,6 @@
     return newCGRect(env, &result);
 }
 
-JNIEXPORT jobject JNICALL OS_NATIVE(CGAffineTransformInvert)
-    (JNIEnv *env, jclass that, jobject arg0)
-{
-    jobject rc = NULL;
-    CGAffineTransform result;
-    CGAffineTransform _arg0, *lparg0=NULL;
-    if (arg0) if ((lparg0 = getCGAffineTransformFields(env, arg0, &_arg0)) == NULL) goto fail;
-    result = CGAffineTransformInvert(*lparg0);
-    rc = newCGAffineTransform(env, &result);
-fail:
-    /* In Only */
-//    if (arg0 && lparg0) setCGAffineTransformFields(env, arg0, lparg0);
-    return rc;
-}
-
 /***********************************************/
 /*                Glyph Outline                */
 /***********************************************/
--- a/modules/graphics/src/main/native-font/directwrite.cpp	Tue Oct 01 10:00:06 2013 -0400
+++ b/modules/graphics/src/main/native-font/directwrite.cpp	Tue Oct 01 10:06:51 2013 -0700
@@ -1270,9 +1270,9 @@
 }
 
 JNIEXPORT jint JNICALL OS_NATIVE(JFXTextRendererGetClusterMap)
-(JNIEnv *env, jclass that, jlong arg0, jintArray arg1, jint start) {
+(JNIEnv *env, jclass that, jlong arg0, jshortArray arg1, jint start) {
     if (!arg1) return 0;
-    jint* data = env->GetIntArrayElements(arg1, NULL);
+    jshort* data = env->GetShortArrayElements(arg1, NULL);
     if (!data) return 0;
 
     JFXTextRenderer* renderer = (JFXTextRenderer*)arg0;
@@ -1287,9 +1287,9 @@
      * by DirectWrite has it relative to the DWRITE_GLYPH_RUN.
      */
     for (i = 0; i < copiedCount; i++) {
-        data[i + start] = map[i] + start;
+        data[i + start] = map[i] + (jshort)start;
     }
-    env->ReleaseIntArrayElements(arg1, data, NULL);
+    env->ReleaseShortArrayElements(arg1, data, NULL);
     return copiedCount;
 }
 
--- a/modules/graphics/src/main/native-glass/gtk/GlassApplication.cpp	Tue Oct 01 10:00:06 2013 -0400
+++ b/modules/graphics/src/main/native-glass/gtk/GlassApplication.cpp	Tue Oct 01 10:06:51 2013 -0700
@@ -43,6 +43,7 @@
 #include "glass_evloop.h"
 #include "glass_dnd.h"
 #include "glass_window.h"
+#include "glass_screen.h"
 
 GdkEventFunc process_events_prev;
 static void process_events(GdkEvent*, gpointer);
@@ -62,136 +63,6 @@
     return FALSE;
 }
 
-static jobject createJavaScreen
-  (JNIEnv* env, GdkScreen* screen, GdkRectangle workArea, gint monitor_idx)
-{
-    GdkRectangle monitor_geometry;
-    gdk_screen_get_monitor_geometry(screen, monitor_idx, &monitor_geometry);
-    LOG1("convert monitor[%d] -> glass Screen\n", monitor_idx)
-    LOG4("[x: %d y: %d w: %d h: %d]\n",
-            monitor_geometry.x, monitor_geometry.y,
-            monitor_geometry.width, monitor_geometry.height)
-
-    GdkVisual* visual = gdk_screen_get_system_visual(screen);
-
-    GdkRectangle working_monitor_geometry;
-    gdk_rectangle_intersect(&workArea, &monitor_geometry, &working_monitor_geometry);
-
-    jobject jScreen = env->NewObject(jScreenCls, jScreenInit,
-                                    (jlong)monitor_idx,
-
-                                    visual ? visual->depth : 0,
-
-                                    monitor_geometry.x,
-                                    monitor_geometry.y,
-                                    monitor_geometry.width,
-                                    monitor_geometry.height,
-
-                                    working_monitor_geometry.x,
-                                    working_monitor_geometry.y,
-                                    working_monitor_geometry.width,
-                                    working_monitor_geometry.height,
-
-                                    (jint)gdk_screen_get_resolution(screen),
-                                    (jint)gdk_screen_get_resolution(screen),
-                                    1.0f);
-    JNI_EXCEPTION_TO_CPP(env);
-    return jScreen;
-}
-
-static guint get_current_desktop(GdkScreen *screen) {
-    Display* display = gdk_x11_display_get_xdisplay(gdk_display_get_default());
-    Atom currentDesktopAtom = XInternAtom(display, "_NET_CURRENT_DESKTOP", True);
-    guint ret = 0;
-
-    Atom type;
-    int format;
-    gulong num, left;
-    unsigned long *data = NULL;
-
-    if (currentDesktopAtom == None) {
-        return 0;
-    }
-
-    int result = XGetWindowProperty(display,
-            GDK_WINDOW_XID(gdk_screen_get_root_window(screen)),
-            currentDesktopAtom, 0, G_MAXLONG, False, XA_CARDINAL,
-            &type, &format, &num, &left, (unsigned char **)&data);
-
-    if ((result == Success) && (data != NULL)) {
-        if (type == XA_CARDINAL && format == 32) {
-            ret = data[0];
-        }
-
-        XFree(data);
-    }
-
-    return ret;
-
-}
-
-static GdkRectangle get_screen_workarea(GdkScreen *screen) {
-    Display* display = gdk_x11_display_get_xdisplay(gdk_display_get_default());
-    GdkRectangle ret = { 0, 0, gdk_screen_get_width(screen), gdk_screen_get_height(screen)};
-
-    Atom workareaAtom = XInternAtom(display, "_NET_WORKAREA", True);
-
-    Atom type;
-    int format;
-    gulong num, left;
-    unsigned long *data = NULL;
-
-    if (workareaAtom == None) {
-        return ret;
-    }
-
-    int result = XGetWindowProperty(display,
-            GDK_WINDOW_XID(gdk_screen_get_root_window(screen)),
-            workareaAtom, 0, G_MAXLONG, False, AnyPropertyType,
-            &type, &format, &num, &left, (unsigned char **)&data);
-
-    if ((result == Success) && (data != NULL)) {
-        if (type != None && format == 32) {
-            guint current_desktop = get_current_desktop(screen);
-            if (current_desktop < num / 4) {
-                ret.x = data[current_desktop * 4];
-                ret.y = data[current_desktop * 4 + 1];
-                ret.width = data[current_desktop * 4 + 2];
-                ret.height = data[current_desktop * 4 + 3];
-            }
-        }
-
-        XFree(data);
-    }
-
-    return ret;
-
-}
-
-static jobjectArray rebuild_screens(JNIEnv* env) {
-    GdkScreen *default_gdk_screen = gdk_screen_get_default();
-    gint n_monitors = gdk_screen_get_n_monitors(default_gdk_screen);
-
-    jobjectArray jscreens = env->NewObjectArray(n_monitors, jScreenCls, NULL);
-    JNI_EXCEPTION_TO_CPP(env)
-    LOG1("Available monitors: %d\n", n_monitors)
-    int i;
-    GdkRectangle workArea = get_screen_workarea(default_gdk_screen);
-    LOG4("Work Area: x:%d, y:%d, w:%d, h:%d\n", workArea.x, workArea.y, workArea.width, workArea.height);
-
-    for (i=0; i < n_monitors; i++) {
-        env->SetObjectArrayElement(jscreens, i, createJavaScreen(env, default_gdk_screen, workArea, i));
-        JNI_EXCEPTION_TO_CPP(env)
-    }
-
-    return jscreens;
-}
-
-static void screen_settings_changed(GdkScreen* screen, gpointer user_data) {
-    mainEnv->CallStaticVoidMethod(jScreenCls, jScreenNotifySettingsChanged);
-    LOG_EXCEPTION(mainEnv);
-}
-
 extern "C" {
 
 /*
--- a/modules/graphics/src/main/native-glass/gtk/glass_general.cpp	Tue Oct 01 10:00:06 2013 -0400
+++ b/modules/graphics/src/main/native-glass/gtk/glass_general.cpp	Tue Oct 01 10:06:51 2013 -0700
@@ -167,7 +167,7 @@
     jWindowNotifyFocus = env->GetMethodID(clazz, "notifyFocus", "(I)V");
     jWindowNotifyFocusDisabled = env->GetMethodID(clazz, "notifyFocusDisabled", "()V");
     jWindowNotifyFocusUngrab = env->GetMethodID(clazz, "notifyFocusUngrab", "()V");
-    jWindowNotifyMoveToAnotherScreen = env->GetMethodID(clazz, "notifyMoveToAnotherScreen", "(JJ)V");
+    jWindowNotifyMoveToAnotherScreen = env->GetMethodID(clazz, "notifyMoveToAnotherScreen", "(Lcom/sun/glass/ui/Screen;)V");
     jWindowIsEnabled = env->GetMethodID(clazz, "isEnabled", "()Z");
     jWindowNotifyDelegatePtr = env->GetMethodID(clazz, "notifyDelegatePtr", "(J)V");
     jWindowPtr = env->GetFieldID(clazz, "ptr", "J");
--- a/modules/graphics/src/main/native-glass/gtk/glass_general.h	Tue Oct 01 10:00:06 2013 -0400
+++ b/modules/graphics/src/main/native-glass/gtk/glass_general.h	Tue Oct 01 10:06:51 2013 -0700
@@ -144,7 +144,7 @@
     extern jmethodID jWindowNotifyFocus; // com.sun.glass.ui.Window#notifyFocus (I)V
     extern jmethodID jWindowNotifyFocusDisabled; // com.sun.glass.ui.Window#notifyFocusDisabled ()V
     extern jmethodID jWindowNotifyFocusUngrab; // com.sun.glass.ui.Window#notifyFocusUngrab ()V
-    extern jmethodID jWindowNotifyMoveToAnotherScreen; // com.sun.glass.ui.Window#notifyMoveToAnotherScreen (JJ)V
+    extern jmethodID jWindowNotifyMoveToAnotherScreen; // com.sun.glass.ui.Window#notifyMoveToAnotherScreen (Lcom/sun/glass/ui/Screen;)V
     extern jmethodID jWindowNotifyDelegatePtr; //com.sun.glass.ui.Window#notifyDelegatePtr (J)V
     extern jmethodID jWindowIsEnabled; // com.sun.glass.ui.Window#isEnabled ()Z
     extern jfieldID jWindowPtr; // com.sun.glass.ui.Window#ptr
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/modules/graphics/src/main/native-glass/gtk/glass_screen.cpp	Tue Oct 01 10:06:51 2013 -0700
@@ -0,0 +1,172 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+#include "glass_screen.h"
+#include "glass_general.h"
+
+#include <X11/Xatom.h>
+#include <gdk/gdk.h>
+#include <gdk/gdkx.h>
+
+static guint get_current_desktop(GdkScreen *screen) {
+    Display* display = gdk_x11_display_get_xdisplay(gdk_display_get_default());
+    Atom currentDesktopAtom = XInternAtom(display, "_NET_CURRENT_DESKTOP", True);
+    guint ret = 0;
+
+    Atom type;
+    int format;
+    gulong num, left;
+    unsigned long *data = NULL;
+
+    if (currentDesktopAtom == None) {
+        return 0;
+    }
+
+    int result = XGetWindowProperty(display,
+                                    GDK_WINDOW_XID(gdk_screen_get_root_window(screen)),
+                                    currentDesktopAtom, 0, G_MAXLONG, False, XA_CARDINAL,
+                                    &type, &format, &num, &left, (unsigned char **)&data);
+
+    if ((result == Success) && (data != NULL)) {
+        if (type == XA_CARDINAL && format == 32) {
+            ret = data[0];
+        }
+
+        XFree(data);
+    }
+
+    return ret;
+
+}
+
+static GdkRectangle get_screen_workarea(GdkScreen *screen) {
+    Display* display = gdk_x11_display_get_xdisplay(gdk_display_get_default());
+    GdkRectangle ret = { 0, 0, gdk_screen_get_width(screen), gdk_screen_get_height(screen)};
+
+    Atom workareaAtom = XInternAtom(display, "_NET_WORKAREA", True);
+
+    Atom type;
+    int format;
+    gulong num, left;
+    unsigned long *data = NULL;
+
+    if (workareaAtom == None) {
+        return ret;
+    }
+
+    int result = XGetWindowProperty(display,
+                                    GDK_WINDOW_XID(gdk_screen_get_root_window(screen)),
+                                    workareaAtom, 0, G_MAXLONG, False, AnyPropertyType,
+                                    &type, &format, &num, &left, (unsigned char **)&data);
+
+    if ((result == Success) && (data != NULL)) {
+        if (type != None && format == 32) {
+            guint current_desktop = get_current_desktop(screen);
+            if (current_desktop < num / 4) {
+                ret.x = data[current_desktop * 4];
+                ret.y = data[current_desktop * 4 + 1];
+                ret.width = data[current_desktop * 4 + 2];
+                ret.height = data[current_desktop * 4 + 3];
+            }
+        }
+
+        XFree(data);
+    }
+
+    return ret;
+
+}
+
+static jobject createJavaScreen(JNIEnv* env, GdkScreen* screen, gint monitor_idx)
+{
+    GdkRectangle workArea = get_screen_workarea(screen);
+    LOG4("Work Area: x:%d, y:%d, w:%d, h:%d\n", workArea.x, workArea.y, workArea.width, workArea.height);
+
+    GdkRectangle monitor_geometry;
+    gdk_screen_get_monitor_geometry(screen, monitor_idx, &monitor_geometry);
+    LOG1("convert monitor[%d] -> glass Screen\n", monitor_idx)
+    LOG4("[x: %d y: %d w: %d h: %d]\n",
+         monitor_geometry.x, monitor_geometry.y,
+         monitor_geometry.width, monitor_geometry.height)
+
+    GdkVisual* visual = gdk_screen_get_system_visual(screen);
+
+    GdkRectangle working_monitor_geometry;
+    gdk_rectangle_intersect(&workArea, &monitor_geometry, &working_monitor_geometry);
+
+    jobject jScreen = env->NewObject(jScreenCls, jScreenInit,
+                                     (jlong)monitor_idx,
+
+                                     visual ? visual->depth : 0,
+
+                                     monitor_geometry.x,
+                                     monitor_geometry.y,
+                                     monitor_geometry.width,
+                                     monitor_geometry.height,
+
+                                     working_monitor_geometry.x,
+                                     working_monitor_geometry.y,
+                                     working_monitor_geometry.width,
+                                     working_monitor_geometry.height,
+
+                                     (jint)gdk_screen_get_resolution(screen),
+                                     (jint)gdk_screen_get_resolution(screen),
+                                     1.0f);
+    JNI_EXCEPTION_TO_CPP(env);
+    return jScreen;
+}
+
+jobject createJavaScreen(JNIEnv* env, gint monitor_idx) {
+    GdkScreen *default_gdk_screen = gdk_screen_get_default();
+    return createJavaScreen(env, default_gdk_screen, monitor_idx);
+}
+
+jobjectArray rebuild_screens(JNIEnv* env) {
+    GdkScreen *default_gdk_screen = gdk_screen_get_default();
+    gint n_monitors = gdk_screen_get_n_monitors(default_gdk_screen);
+    
+    jobjectArray jscreens = env->NewObjectArray(n_monitors, jScreenCls, NULL);
+    JNI_EXCEPTION_TO_CPP(env)
+    LOG1("Available monitors: %d\n", n_monitors)
+    
+    int i;
+    for (i=0; i < n_monitors; i++) {
+        env->SetObjectArrayElement(jscreens, i, createJavaScreen(env, default_gdk_screen, i));
+        JNI_EXCEPTION_TO_CPP(env)
+    }
+    
+    return jscreens;
+}
+
+
+glong getScreenPtrForLocation(gint x, gint y) {
+    //Note: we are relying on the fact that javafx_screen_id == gdk_monitor_id
+    return gdk_screen_get_monitor_at_point(gdk_screen_get_default(), x, y);
+}
+
+void screen_settings_changed(GdkScreen* screen, gpointer user_data) {
+    mainEnv->CallStaticVoidMethod(jScreenCls, jScreenNotifySettingsChanged);
+    LOG_EXCEPTION(mainEnv);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/modules/graphics/src/main/native-glass/gtk/glass_screen.h	Tue Oct 01 10:06:51 2013 -0700
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+#ifndef GLASS_SCREEN_H
+#define GLASS_SCREEN_H
+
+#include <jni.h>
+
+#include <gtk/gtk.h>
+
+jobject createJavaScreen(JNIEnv* env, gint monitor_idx);
+glong getScreenPtrForLocation(gint x, gint y);
+jobjectArray rebuild_screens(JNIEnv* env);
+void screen_settings_changed(GdkScreen* screen, gpointer user_data);
+
+#endif
--- a/modules/graphics/src/main/native-glass/gtk/glass_window.cpp	Tue Oct 01 10:00:06 2013 -0400
+++ b/modules/graphics/src/main/native-glass/gtk/glass_window.cpp	Tue Oct 01 10:06:51 2013 -0700
@@ -26,6 +26,7 @@
 #include "glass_general.h"
 #include "glass_gtkcompat.h"
 #include "glass_key.h"
+#include "glass_screen.h"
 
 #include <com_sun_glass_events_WindowEvent.h>
 #include <com_sun_glass_events_ViewEvent.h>
@@ -911,11 +912,6 @@
     }
 }
 
-static glong getScreenPtrForLocation(gint x, gint y) { //TODO: refactor to GlassApplication.cpp ?
-    //Note: we are relying on the fact that javafx_screen_id == gdk_monitor_id
-    return gdk_screen_get_monitor_at_point(gdk_screen_get_default(), x, y);
-}
-
 void WindowContextTop::process_configure(GdkEventConfigure* event) {
 
     geometry.current_width = event->width + geometry.extents.left
@@ -967,7 +963,8 @@
         if (to_screen != screen) {
             if (jwindow) {
                 //notify screen changed
-                mainEnv->CallVoidMethod(jwindow, jWindowNotifyMoveToAnotherScreen, screen, (jlong) to_screen);
+                jobject jScreen = createJavaScreen(mainEnv, to_screen);
+                mainEnv->CallVoidMethod(jwindow, jWindowNotifyMoveToAnotherScreen, jScreen);
                 CHECK_JNI_EXCEPTION(mainEnv)
             }
             screen = to_screen;
--- a/modules/graphics/src/main/native-glass/ios/GlassApplication.m	Tue Oct 01 10:00:06 2013 -0400
+++ b/modules/graphics/src/main/native-glass/ios/GlassApplication.m	Tue Oct 01 10:06:51 2013 -0700
@@ -666,7 +666,7 @@
     
     mat_jWindowNotifyMove = (*env)->GetMethodID(env, mat_jWindowBaseClass, "notifyMove", "(II)V");
     mat_jWindowNotifyResize = (*env)->GetMethodID(env, mat_jWindowBaseClass, "notifyResize", "(III)V");
-    mat_jWindowNotifyMoveToAnotherScreen = (*env)->GetMethodID(env, mat_jWindowBaseClass, "notifyMoveToAnotherScreen", "(JJ)V");
+    mat_jWindowNotifyMoveToAnotherScreen = (*env)->GetMethodID(env, mat_jWindowBaseClass, "notifyMoveToAnotherScreen", "(Lcom/sun/glass/ui/Screen;)V");
     mat_jWindowNotifyClose = (*env)->GetMethodID(env, mat_jWindowBaseClass, "notifyClose", "()V");
     mat_jWindowNotifyFocus = (*env)->GetMethodID(env, mat_jWindowBaseClass, "notifyFocus", "(I)V");
     mat_jWindowNotifyDestroy = (*env)->GetMethodID(env, mat_jWindowBaseClass, "notifyDestroy", "()V");
--- a/modules/graphics/src/main/native-glass/lens/android/android.c	Tue Oct 01 10:00:06 2013 -0400
+++ b/modules/graphics/src/main/native-glass/lens/android/android.c	Tue Oct 01 10:06:51 2013 -0700
@@ -41,6 +41,7 @@
 #define RGB_888   3
 #define RGB_565   4
 
+#define TOUCH_ACTION_STILL         -1
 #define TOUCH_ACTION_DOWN           0
 #define TOUCH_ACTION_UP             1
 #define TOUCH_ACTION_MOVE           2
@@ -80,6 +81,13 @@
         int isTouch,
         int touchId);
 
+static void (*_notifyMultiTouchEvent) (
+        int count,
+        int *states,
+        int *ids,
+        int *xs,
+        int *ys);
+
 static void (*_notifyButtonEvent)(
         int pressed,
         int button,
@@ -164,6 +172,7 @@
     }
     _notifyWindowEvent_resize = GET_SYMBOL(env, libglass, "notifyWindowEvent_resize");
     _notifyTouchEvent = GET_SYMBOL(env, libglass, "notifyTouchEvent");
+    _notifyMultiTouchEvent = GET_SYMBOL(env, libglass, "notifyMultiTouchEvent");
     _notifyMotionEvent = GET_SYMBOL(env, libglass, "notifyMotionEvent");
     _notifyButtonEvent = GET_SYMBOL(env, libglass, "notifyButtonEvent");
     _notifyKeyEvent = GET_SYMBOL(env, libglass, "notifyKeyEvent");
@@ -213,32 +222,11 @@
 
 /*
  * Class:     com_oracle_dalvik_FXActivity_InternalSurfaceView
- * Method:    onTouchEventNative
- * Signature: (III)V
- */
-JNIEXPORT void JNICALL Java_com_oracle_dalvik_FXActivity_00024InternalSurfaceView_onTouchEventNative
-(JNIEnv *ignore, jobject view, jint action, jint absx, jint absy) {
-    LOGV(TAG, "Touch event: [%s, x: %i, y: %i]\n", describe_touch_action(action), absx, absy);
-
-    int fxstate = to_jfx_touch_action(action);
-    if (!fxstate) {
-        LOGE(TAG, "Can't handle this state yet. Ignoring. (Probably multitouch)");
-        return;
-    }
-    if (fxstate == com_sun_glass_events_TouchEvent_TOUCH_MOVED) {
-        (*_notifyMotionEvent)(absx, absy, 1, 1);
-    } else {
-        (*_notifyTouchEvent)(fxstate, 1, 1, absx, absy);
-    }
-}
-
-/*
- * Class:     com_oracle_dalvik_FXActivity_InternalSurfaceView
  * Method:    onKeyEventNative
  * Signature: (II)V
  */
 JNIEXPORT void JNICALL Java_com_oracle_dalvik_FXActivity_00024InternalSurfaceView_onKeyEventNative
-(JNIEnv *ignore, jobject view, jint action, jint keyCode) {
+(JNIEnv *ignore, jobject view, jint action, jint keyCode, jstring characters) {
     
     LOGV(TAG, "Key event: [action: %s, keyCode: %i]\n", describe_key_action(action), keyCode);
     int event_type = to_jfx_key_action(action);
@@ -249,6 +237,34 @@
     }
 }
 
+JNIEXPORT void JNICALL Java_com_oracle_dalvik_FXActivity_00024InternalSurfaceView_onMultiTouchEventNative
+  (JNIEnv *env, jobject jview, jint jpcount, jintArray jactions, jintArray jids,
+        jintArray jtouchXs, jintArray jtouchYs) {
+    if (!jpcount) {
+        LOGE(TAG, "MultiTouchEvent with pointer count = 0 is illegal!");
+        return;
+    }
+    int actions_len, ids_len, touchXs_len, touchYs_len;
+    int *actions = getIntArray(env, &actions_len, jactions);    
+    int *ids = getIntArray(env, &ids_len, jids);
+    int *touchXs = getIntArray(env, &touchXs_len, jtouchXs);
+    int *touchYs = getIntArray(env, &touchYs_len, jtouchYs);
+    for(int i=0;i<jpcount;i++) {
+        actions[i] = to_jfx_touch_action(actions[i]);
+    }
+    (*_notifyMultiTouchEvent)(jpcount, actions, ids, touchXs, touchYs);
+    
+    (*env)->ReleaseIntArrayElements(env, jactions, actions, 0);
+    (*env)->ReleaseIntArrayElements(env, jids, ids, 0);
+    (*env)->ReleaseIntArrayElements(env, jtouchXs, touchXs, 0);
+    (*env)->ReleaseIntArrayElements(env, jtouchYs, touchYs, 0);
+}
+
+int *getIntArray(JNIEnv *env, int *len, jintArray arr) {
+    *len = (*env)->GetArrayLength(env, arr);
+    return (*env)->GetIntArrayElements(env, arr, 0);
+}
+
 ANativeWindow *ANDROID_getNativeWindow() {
     return window;
 }
@@ -310,13 +326,17 @@
 int to_jfx_touch_action(int state) {
     switch (state) {
         case TOUCH_ACTION_DOWN:
+        case TOUCH_ACTION_POINTER_DOWN:    
             return com_sun_glass_events_TouchEvent_TOUCH_PRESSED;
         case TOUCH_ACTION_UP:
+        case TOUCH_ACTION_POINTER_UP:    
             return com_sun_glass_events_TouchEvent_TOUCH_RELEASED;
         case TOUCH_ACTION_MOVE:
             return com_sun_glass_events_TouchEvent_TOUCH_MOVED;
         case TOUCH_ACTION_CANCEL:
-            return com_sun_glass_events_TouchEvent_TOUCH_RELEASED;
+            return com_sun_glass_events_TouchEvent_TOUCH_RELEASED;                    
+        case TOUCH_ACTION_STILL:
+            return com_sun_glass_events_TouchEvent_TOUCH_STILL;
         default:
             return 0;
     }
@@ -360,9 +380,10 @@
             return "TOUCH_ACTION_POINTER_DOWN";
         case TOUCH_ACTION_POINTER_UP:
             return "TOUCH_ACTION_POINTER_UP";
+        case TOUCH_ACTION_STILL:
+            return "TOUCH_ACTION_STILL";
         default:
             return "TOUCH_ACTION_UNKNOWN";
-
     }
 }
 
--- a/modules/graphics/src/main/native-glass/lens/android/android.h	Tue Oct 01 10:00:06 2013 -0400
+++ b/modules/graphics/src/main/native-glass/lens/android/android.h	Tue Oct 01 10:06:51 2013 -0700
@@ -90,6 +90,8 @@
 
 int32_t translate_to_linux_keycode(int32_t);
 
+int *getIntArray(JNIEnv *,int *, jintArray);
+
 ANativeWindow *ANDROID_getNativeWindow();
 
 void ANDROID_showIME();
--- a/modules/graphics/src/main/native-glass/lens/android/com_oracle_dalvik_FXActivity.h	Tue Oct 01 10:00:06 2013 -0400
+++ b/modules/graphics/src/main/native-glass/lens/android/com_oracle_dalvik_FXActivity.h	Tue Oct 01 10:06:51 2013 -0700
@@ -22,30 +22,66 @@
  * or visit www.oracle.com if you need additional information or have any
  * questions.
  */
+
+/* DO NOT EDIT THIS FILE - it is machine generated */
 #include <jni.h>
+/* Header for class com_oracle_dalvik_FXActivity */
 
 #ifndef _Included_com_oracle_dalvik_FXActivity
 #define _Included_com_oracle_dalvik_FXActivity
 #ifdef __cplusplus
 extern "C" {
 #endif
-
-/*
- * Class:     com_oracle_dalvik_FXActivity
- * Method:    initContext
- * Signature: (Lcom/oracle/dalvik/FXActivity;)V
- */
-JNIEXPORT void JNICALL Java_com_oracle_dalvik_FXActivity_initContext
-  (JNIEnv *, jobject, jobject);
-
-/*
- * Class:     com_oracle_dalvik_FXActivity
- * Method:    initGlassSymbols
- * Signature: (Ljava/lang/String;)V
- */
-JNIEXPORT void JNICALL Java_com_oracle_dalvik_FXActivity_initGlassSymbols
-  (JNIEnv *, jobject, jstring);
-
+#undef com_oracle_dalvik_FXActivity_MODE_PRIVATE
+#define com_oracle_dalvik_FXActivity_MODE_PRIVATE 0L
+#undef com_oracle_dalvik_FXActivity_MODE_WORLD_READABLE
+#define com_oracle_dalvik_FXActivity_MODE_WORLD_READABLE 1L
+#undef com_oracle_dalvik_FXActivity_MODE_WORLD_WRITEABLE
+#define com_oracle_dalvik_FXActivity_MODE_WORLD_WRITEABLE 2L
+#undef com_oracle_dalvik_FXActivity_MODE_APPEND
+#define com_oracle_dalvik_FXActivity_MODE_APPEND 32768L
+#undef com_oracle_dalvik_FXActivity_MODE_MULTI_PROCESS
+#define com_oracle_dalvik_FXActivity_MODE_MULTI_PROCESS 4L
+#undef com_oracle_dalvik_FXActivity_MODE_ENABLE_WRITE_AHEAD_LOGGING
+#define com_oracle_dalvik_FXActivity_MODE_ENABLE_WRITE_AHEAD_LOGGING 8L
+#undef com_oracle_dalvik_FXActivity_BIND_AUTO_CREATE
+#define com_oracle_dalvik_FXActivity_BIND_AUTO_CREATE 1L
+#undef com_oracle_dalvik_FXActivity_BIND_DEBUG_UNBIND
+#define com_oracle_dalvik_FXActivity_BIND_DEBUG_UNBIND 2L
+#undef com_oracle_dalvik_FXActivity_BIND_NOT_FOREGROUND
+#define com_oracle_dalvik_FXActivity_BIND_NOT_FOREGROUND 4L
+#undef com_oracle_dalvik_FXActivity_BIND_ABOVE_CLIENT
+#define com_oracle_dalvik_FXActivity_BIND_ABOVE_CLIENT 8L
+#undef com_oracle_dalvik_FXActivity_BIND_ALLOW_OOM_MANAGEMENT
+#define com_oracle_dalvik_FXActivity_BIND_ALLOW_OOM_MANAGEMENT 16L
+#undef com_oracle_dalvik_FXActivity_BIND_WAIVE_PRIORITY
+#define com_oracle_dalvik_FXActivity_BIND_WAIVE_PRIORITY 32L
+#undef com_oracle_dalvik_FXActivity_BIND_IMPORTANT
+#define com_oracle_dalvik_FXActivity_BIND_IMPORTANT 64L
+#undef com_oracle_dalvik_FXActivity_BIND_ADJUST_WITH_ACTIVITY
+#define com_oracle_dalvik_FXActivity_BIND_ADJUST_WITH_ACTIVITY 128L
+#undef com_oracle_dalvik_FXActivity_CONTEXT_INCLUDE_CODE
+#define com_oracle_dalvik_FXActivity_CONTEXT_INCLUDE_CODE 1L
+#undef com_oracle_dalvik_FXActivity_CONTEXT_IGNORE_SECURITY
+#define com_oracle_dalvik_FXActivity_CONTEXT_IGNORE_SECURITY 2L
+#undef com_oracle_dalvik_FXActivity_CONTEXT_RESTRICTED
+#define com_oracle_dalvik_FXActivity_CONTEXT_RESTRICTED 4L
+#undef com_oracle_dalvik_FXActivity_RESULT_CANCELED
+#define com_oracle_dalvik_FXActivity_RESULT_CANCELED 0L
+#undef com_oracle_dalvik_FXActivity_RESULT_OK
+#define com_oracle_dalvik_FXActivity_RESULT_OK -1L
+#undef com_oracle_dalvik_FXActivity_RESULT_FIRST_USER
+#define com_oracle_dalvik_FXActivity_RESULT_FIRST_USER 1L
+#undef com_oracle_dalvik_FXActivity_DEFAULT_KEYS_DISABLE
+#define com_oracle_dalvik_FXActivity_DEFAULT_KEYS_DISABLE 0L
+#undef com_oracle_dalvik_FXActivity_DEFAULT_KEYS_DIALER
+#define com_oracle_dalvik_FXActivity_DEFAULT_KEYS_DIALER 1L
+#undef com_oracle_dalvik_FXActivity_DEFAULT_KEYS_SHORTCUT
+#define com_oracle_dalvik_FXActivity_DEFAULT_KEYS_SHORTCUT 2L
+#undef com_oracle_dalvik_FXActivity_DEFAULT_KEYS_SEARCH_LOCAL
+#define com_oracle_dalvik_FXActivity_DEFAULT_KEYS_SEARCH_LOCAL 3L
+#undef com_oracle_dalvik_FXActivity_DEFAULT_KEYS_SEARCH_GLOBAL
+#define com_oracle_dalvik_FXActivity_DEFAULT_KEYS_SEARCH_GLOBAL 4L
 /*
  * Class:     com_oracle_dalvik_FXActivity
  * Method:    _surfaceChanged
--- a/modules/graphics/src/main/native-glass/lens/android/com_oracle_dalvik_FXActivity_InternalSurfaceView.h	Tue Oct 01 10:00:06 2013 -0400
+++ b/modules/graphics/src/main/native-glass/lens/android/com_oracle_dalvik_FXActivity_InternalSurfaceView.h	Tue Oct 01 10:06:51 2013 -0700
@@ -22,29 +22,141 @@
  * or visit www.oracle.com if you need additional information or have any
  * questions.
  */
+
+/* DO NOT EDIT THIS FILE - it is machine generated */
 #include <jni.h>
+/* Header for class com_oracle_dalvik_FXActivity_InternalSurfaceView */
 
 #ifndef _Included_com_oracle_dalvik_FXActivity_InternalSurfaceView
 #define _Included_com_oracle_dalvik_FXActivity_InternalSurfaceView
 #ifdef __cplusplus
 extern "C" {
 #endif
-
+#undef com_oracle_dalvik_FXActivity_InternalSurfaceView_NO_ID
+#define com_oracle_dalvik_FXActivity_InternalSurfaceView_NO_ID -1L
+#undef com_oracle_dalvik_FXActivity_InternalSurfaceView_VISIBLE
+#define com_oracle_dalvik_FXActivity_InternalSurfaceView_VISIBLE 0L
+#undef com_oracle_dalvik_FXActivity_InternalSurfaceView_INVISIBLE
+#define com_oracle_dalvik_FXActivity_InternalSurfaceView_INVISIBLE 4L
+#undef com_oracle_dalvik_FXActivity_InternalSurfaceView_GONE
+#define com_oracle_dalvik_FXActivity_InternalSurfaceView_GONE 8L
+#undef com_oracle_dalvik_FXActivity_InternalSurfaceView_DRAWING_CACHE_QUALITY_LOW
+#define com_oracle_dalvik_FXActivity_InternalSurfaceView_DRAWING_CACHE_QUALITY_LOW 524288L
+#undef com_oracle_dalvik_FXActivity_InternalSurfaceView_DRAWING_CACHE_QUALITY_HIGH
+#define com_oracle_dalvik_FXActivity_InternalSurfaceView_DRAWING_CACHE_QUALITY_HIGH 1048576L
+#undef com_oracle_dalvik_FXActivity_InternalSurfaceView_DRAWING_CACHE_QUALITY_AUTO
+#define com_oracle_dalvik_FXActivity_InternalSurfaceView_DRAWING_CACHE_QUALITY_AUTO 0L
+#undef com_oracle_dalvik_FXActivity_InternalSurfaceView_SCROLLBARS_INSIDE_OVERLAY
+#define com_oracle_dalvik_FXActivity_InternalSurfaceView_SCROLLBARS_INSIDE_OVERLAY 0L
+#undef com_oracle_dalvik_FXActivity_InternalSurfaceView_SCROLLBARS_INSIDE_INSET
+#define com_oracle_dalvik_FXActivity_InternalSurfaceView_SCROLLBARS_INSIDE_INSET 16777216L
+#undef com_oracle_dalvik_FXActivity_InternalSurfaceView_SCROLLBARS_OUTSIDE_OVERLAY
+#define com_oracle_dalvik_FXActivity_InternalSurfaceView_SCROLLBARS_OUTSIDE_OVERLAY 33554432L
+#undef com_oracle_dalvik_FXActivity_InternalSurfaceView_SCROLLBARS_OUTSIDE_INSET
+#define com_oracle_dalvik_FXActivity_InternalSurfaceView_SCROLLBARS_OUTSIDE_INSET 50331648L
+#undef com_oracle_dalvik_FXActivity_InternalSurfaceView_KEEP_SCREEN_ON
+#define com_oracle_dalvik_FXActivity_InternalSurfaceView_KEEP_SCREEN_ON 67108864L
+#undef com_oracle_dalvik_FXActivity_InternalSurfaceView_SOUND_EFFECTS_ENABLED
+#define com_oracle_dalvik_FXActivity_InternalSurfaceView_SOUND_EFFECTS_ENABLED 134217728L
+#undef com_oracle_dalvik_FXActivity_InternalSurfaceView_HAPTIC_FEEDBACK_ENABLED
+#define com_oracle_dalvik_FXActivity_InternalSurfaceView_HAPTIC_FEEDBACK_ENABLED 268435456L
+#undef com_oracle_dalvik_FXActivity_InternalSurfaceView_FOCUSABLES_ALL
+#define com_oracle_dalvik_FXActivity_InternalSurfaceView_FOCUSABLES_ALL 0L
+#undef com_oracle_dalvik_FXActivity_InternalSurfaceView_FOCUSABLES_TOUCH_MODE
+#define com_oracle_dalvik_FXActivity_InternalSurfaceView_FOCUSABLES_TOUCH_MODE 1L
+#undef com_oracle_dalvik_FXActivity_InternalSurfaceView_FOCUS_BACKWARD
+#define com_oracle_dalvik_FXActivity_InternalSurfaceView_FOCUS_BACKWARD 1L
+#undef com_oracle_dalvik_FXActivity_InternalSurfaceView_FOCUS_FORWARD
+#define com_oracle_dalvik_FXActivity_InternalSurfaceView_FOCUS_FORWARD 2L
+#undef com_oracle_dalvik_FXActivity_InternalSurfaceView_FOCUS_LEFT
+#define com_oracle_dalvik_FXActivity_InternalSurfaceView_FOCUS_LEFT 17L
+#undef com_oracle_dalvik_FXActivity_InternalSurfaceView_FOCUS_UP
+#define com_oracle_dalvik_FXActivity_InternalSurfaceView_FOCUS_UP 33L
+#undef com_oracle_dalvik_FXActivity_InternalSurfaceView_FOCUS_RIGHT
+#define com_oracle_dalvik_FXActivity_InternalSurfaceView_FOCUS_RIGHT 66L
+#undef com_oracle_dalvik_FXActivity_InternalSurfaceView_FOCUS_DOWN
+#define com_oracle_dalvik_FXActivity_InternalSurfaceView_FOCUS_DOWN 130L
+#undef com_oracle_dalvik_FXActivity_InternalSurfaceView_MEASURED_SIZE_MASK
+#define com_oracle_dalvik_FXActivity_InternalSurfaceView_MEASURED_SIZE_MASK 16777215L
+#undef com_oracle_dalvik_FXActivity_InternalSurfaceView_MEASURED_STATE_MASK
+#define com_oracle_dalvik_FXActivity_InternalSurfaceView_MEASURED_STATE_MASK -16777216L
+#undef com_oracle_dalvik_FXActivity_InternalSurfaceView_MEASURED_HEIGHT_STATE_SHIFT
+#define com_oracle_dalvik_FXActivity_InternalSurfaceView_MEASURED_HEIGHT_STATE_SHIFT 16L
+#undef com_oracle_dalvik_FXActivity_InternalSurfaceView_MEASURED_STATE_TOO_SMALL
+#define com_oracle_dalvik_FXActivity_InternalSurfaceView_MEASURED_STATE_TOO_SMALL 16777216L
+#undef com_oracle_dalvik_FXActivity_InternalSurfaceView_TEXT_ALIGNMENT_INHERIT
+#define com_oracle_dalvik_FXActivity_InternalSurfaceView_TEXT_ALIGNMENT_INHERIT 0L
+#undef com_oracle_dalvik_FXActivity_InternalSurfaceView_TEXT_ALIGNMENT_RESOLVED_DEFAULT
+#define com_oracle_dalvik_FXActivity_InternalSurfaceView_TEXT_ALIGNMENT_RESOLVED_DEFAULT 131072L
+#undef com_oracle_dalvik_FXActivity_InternalSurfaceView_IMPORTANT_FOR_ACCESSIBILITY_AUTO
+#define com_oracle_dalvik_FXActivity_InternalSurfaceView_IMPORTANT_FOR_ACCESSIBILITY_AUTO 0L
+#undef com_oracle_dalvik_FXActivity_InternalSurfaceView_IMPORTANT_FOR_ACCESSIBILITY_YES
+#define com_oracle_dalvik_FXActivity_InternalSurfaceView_IMPORTANT_FOR_ACCESSIBILITY_YES 1L
+#undef com_oracle_dalvik_FXActivity_InternalSurfaceView_IMPORTANT_FOR_ACCESSIBILITY_NO
+#define com_oracle_dalvik_FXActivity_InternalSurfaceView_IMPORTANT_FOR_ACCESSIBILITY_NO 2L
+#undef com_oracle_dalvik_FXActivity_InternalSurfaceView_OVER_SCROLL_ALWAYS
+#define com_oracle_dalvik_FXActivity_InternalSurfaceView_OVER_SCROLL_ALWAYS 0L
+#undef com_oracle_dalvik_FXActivity_InternalSurfaceView_OVER_SCROLL_IF_CONTENT_SCROLLS
+#define com_oracle_dalvik_FXActivity_InternalSurfaceView_OVER_SCROLL_IF_CONTENT_SCROLLS 1L
+#undef com_oracle_dalvik_FXActivity_InternalSurfaceView_OVER_SCROLL_NEVER
+#define com_oracle_dalvik_FXActivity_InternalSurfaceView_OVER_SCROLL_NEVER 2L
+#undef com_oracle_dalvik_FXActivity_InternalSurfaceView_SYSTEM_UI_FLAG_VISIBLE
+#define com_oracle_dalvik_FXActivity_InternalSurfaceView_SYSTEM_UI_FLAG_VISIBLE 0L
+#undef com_oracle_dalvik_FXActivity_InternalSurfaceView_SYSTEM_UI_FLAG_LOW_PROFILE
+#define com_oracle_dalvik_FXActivity_InternalSurfaceView_SYSTEM_UI_FLAG_LOW_PROFILE 1L
+#undef com_oracle_dalvik_FXActivity_InternalSurfaceView_SYSTEM_UI_FLAG_HIDE_NAVIGATION
+#define com_oracle_dalvik_FXActivity_InternalSurfaceView_SYSTEM_UI_FLAG_HIDE_NAVIGATION 2L
+#undef com_oracle_dalvik_FXActivity_InternalSurfaceView_SYSTEM_UI_FLAG_FULLSCREEN
+#define com_oracle_dalvik_FXActivity_InternalSurfaceView_SYSTEM_UI_FLAG_FULLSCREEN 4L
+#undef com_oracle_dalvik_FXActivity_InternalSurfaceView_SYSTEM_UI_FLAG_LAYOUT_STABLE
+#define com_oracle_dalvik_FXActivity_InternalSurfaceView_SYSTEM_UI_FLAG_LAYOUT_STABLE 256L
+#undef com_oracle_dalvik_FXActivity_InternalSurfaceView_SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
+#define com_oracle_dalvik_FXActivity_InternalSurfaceView_SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION 512L
+#undef com_oracle_dalvik_FXActivity_InternalSurfaceView_SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
+#define com_oracle_dalvik_FXActivity_InternalSurfaceView_SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 1024L
+#undef com_oracle_dalvik_FXActivity_InternalSurfaceView_STATUS_BAR_HIDDEN
+#define com_oracle_dalvik_FXActivity_InternalSurfaceView_STATUS_BAR_HIDDEN 1L
+#undef com_oracle_dalvik_FXActivity_InternalSurfaceView_STATUS_BAR_VISIBLE
+#define com_oracle_dalvik_FXActivity_InternalSurfaceView_STATUS_BAR_VISIBLE 0L
+#undef com_oracle_dalvik_FXActivity_InternalSurfaceView_SYSTEM_UI_LAYOUT_FLAGS
+#define com_oracle_dalvik_FXActivity_InternalSurfaceView_SYSTEM_UI_LAYOUT_FLAGS 1536L
+#undef com_oracle_dalvik_FXActivity_InternalSurfaceView_FIND_VIEWS_WITH_TEXT
+#define com_oracle_dalvik_FXActivity_InternalSurfaceView_FIND_VIEWS_WITH_TEXT 1L
+#undef com_oracle_dalvik_FXActivity_InternalSurfaceView_FIND_VIEWS_WITH_CONTENT_DESCRIPTION
+#define com_oracle_dalvik_FXActivity_InternalSurfaceView_FIND_VIEWS_WITH_CONTENT_DESCRIPTION 2L
+#undef com_oracle_dalvik_FXActivity_InternalSurfaceView_SCREEN_STATE_OFF
+#define com_oracle_dalvik_FXActivity_InternalSurfaceView_SCREEN_STATE_OFF 0L
+#undef com_oracle_dalvik_FXActivity_InternalSurfaceView_SCREEN_STATE_ON
+#define com_oracle_dalvik_FXActivity_InternalSurfaceView_SCREEN_STATE_ON 1L
+#undef com_oracle_dalvik_FXActivity_InternalSurfaceView_SCROLLBAR_POSITION_DEFAULT
+#define com_oracle_dalvik_FXActivity_InternalSurfaceView_SCROLLBAR_POSITION_DEFAULT 0L
+#undef com_oracle_dalvik_FXActivity_InternalSurfaceView_SCROLLBAR_POSITION_LEFT
+#define com_oracle_dalvik_FXActivity_InternalSurfaceView_SCROLLBAR_POSITION_LEFT 1L
+#undef com_oracle_dalvik_FXActivity_InternalSurfaceView_SCROLLBAR_POSITION_RIGHT
+#define com_oracle_dalvik_FXActivity_InternalSurfaceView_SCROLLBAR_POSITION_RIGHT 2L
+#undef com_oracle_dalvik_FXActivity_InternalSurfaceView_LAYER_TYPE_NONE
+#define com_oracle_dalvik_FXActivity_InternalSurfaceView_LAYER_TYPE_NONE 0L
+#undef com_oracle_dalvik_FXActivity_InternalSurfaceView_LAYER_TYPE_SOFTWARE
+#define com_oracle_dalvik_FXActivity_InternalSurfaceView_LAYER_TYPE_SOFTWARE 1L
+#undef com_oracle_dalvik_FXActivity_InternalSurfaceView_LAYER_TYPE_HARDWARE
+#define com_oracle_dalvik_FXActivity_InternalSurfaceView_LAYER_TYPE_HARDWARE 2L
+#undef com_oracle_dalvik_FXActivity_InternalSurfaceView_ACTION_POINTER_STILL
+#define com_oracle_dalvik_FXActivity_InternalSurfaceView_ACTION_POINTER_STILL -1L
 /*
  * Class:     com_oracle_dalvik_FXActivity_InternalSurfaceView
- * Method:    onTouchEventNative
- * Signature: (III)V
+ * Method:    onMultiTouchEventNative
+ * Signature: (I[I[I[I[I)V
  */
-JNIEXPORT void JNICALL Java_com_oracle_dalvik_FXActivity_00024InternalSurfaceView_onTouchEventNative
-  (JNIEnv *, jobject, jint, jint, jint);
+JNIEXPORT void JNICALL Java_com_oracle_dalvik_FXActivity_00024InternalSurfaceView_onMultiTouchEventNative
+  (JNIEnv *, jobject, jint, jintArray, jintArray, jintArray, jintArray);
 
 /*
  * Class:     com_oracle_dalvik_FXActivity_InternalSurfaceView
  * Method:    onKeyEventNative
- * Signature: (II)V
+ * Signature: (IILjava/lang/String;)V
  */
 JNIEXPORT void JNICALL Java_com_oracle_dalvik_FXActivity_00024InternalSurfaceView_onKeyEventNative
-  (JNIEnv *, jobject, jint, jint);
+  (JNIEnv *, jobject, jint, jint, jstring);
 
 #ifdef __cplusplus
 }
--- a/modules/graphics/src/main/native-glass/lens/input/android/androidLens.c	Tue Oct 01 10:00:06 2013 -0400
+++ b/modules/graphics/src/main/native-glass/lens/input/android/androidLens.c	Tue Oct 01 10:06:51 2013 -0700
@@ -105,6 +105,26 @@
    DETACH_JNI_THREAD();
 }
 
+void notifyMultiTouchEvent(
+        int count,
+        int *states,
+        int *ids,
+        int *xs,
+        int *ys) {
+    
+    ATTACH_JNI_THREAD();
+    jlong jids[count];
+    
+    for(int i=0;i<count;i++) jids[i] = ids[i];
+    lens_wm_notifyMultiTouchEvent(env,
+           count,
+           states,
+           jids,
+           xs,
+           ys);
+    DETACH_JNI_THREAD();
+}
+
 void notifyMotionEvent(
         int mousePosX,
         int mousePosY,
--- a/modules/graphics/src/main/native-glass/lens/input/android/androidLens.h	Tue Oct 01 10:00:06 2013 -0400
+++ b/modules/graphics/src/main/native-glass/lens/input/android/androidLens.h	Tue Oct 01 10:06:51 2013 -0700
@@ -48,6 +48,13 @@
         int  xabs,
         int  yabs);
 
+    void notifyMultiTouchEvent(
+        int count,
+        int *states,
+        int *ids,
+        int *xs,
+        int *ys);
+    
     void notifyMotionEvent(
         int mousePosX,
         int mousePosY,
--- a/modules/graphics/src/main/native-glass/mac/GlassScreen.h	Tue Oct 01 10:00:06 2013 -0400
+++ b/modules/graphics/src/main/native-glass/mac/GlassScreen.h	Tue Oct 01 10:06:51 2013 -0700
@@ -38,3 +38,4 @@
 
 CGFloat GetScreenScaleFactor(NSScreen *screen);
 jobjectArray createJavaScreens(JNIEnv* env);
+jobject createJavaScreen(JNIEnv *env, NSScreen* screen);
--- a/modules/graphics/src/main/native-glass/mac/GlassScreen.m	Tue Oct 01 10:00:06 2013 -0400
+++ b/modules/graphics/src/main/native-glass/mac/GlassScreen.m	Tue Oct 01 10:06:51 2013 -0700
@@ -48,7 +48,7 @@
     }
 }
 
-static inline jobject createJavaScreen(JNIEnv *env, NSScreen* screen)
+jobject createJavaScreen(JNIEnv *env, NSScreen* screen)
 {
     jobject jscreen = NULL;
 
--- a/modules/graphics/src/main/native-glass/mac/GlassWindow+Java.m	Tue Oct 01 10:00:06 2013 -0400
+++ b/modules/graphics/src/main/native-glass/mac/GlassWindow+Java.m	Tue Oct 01 10:06:51 2013 -0700
@@ -32,6 +32,7 @@
 
 #import "GlassMacros.h"
 #import "GlassWindow+Java.h"
+#import "GlassScreen.h"
 
 static NSWindow *s_grabWindow = nil;
 
@@ -56,7 +57,7 @@
         self->currentScreen = newScreen;
         
         GET_MAIN_JENV;
-        (*env)->CallVoidMethod(env, jWindow, jWindowNotifyMoveToAnotherScreen, ptr_to_jlong(self->currentScreen), ptr_to_jlong(newScreen));
+        (*env)->CallVoidMethod(env, jWindow, jWindowNotifyMoveToAnotherScreen, createJavaScreen(env, newScreen));
     }
 }
 
--- a/modules/graphics/src/main/native-glass/mac/GlassWindow.m	Tue Oct 01 10:00:06 2013 -0400
+++ b/modules/graphics/src/main/native-glass/mac/GlassWindow.m	Tue Oct 01 10:06:51 2013 -0700
@@ -617,7 +617,7 @@
     
     if (jWindowNotifyMoveToAnotherScreen == NULL)
     {
-        jWindowNotifyMoveToAnotherScreen = (*env)->GetMethodID(env, jWindowClass, "notifyMoveToAnotherScreen", "(JJ)V");
+        jWindowNotifyMoveToAnotherScreen = (*env)->GetMethodID(env, jWindowClass, "notifyMoveToAnotherScreen", "(Lcom/sun/glass/ui/Screen;)V");
     }
     
     if (jWindowNotifyClose == NULL)
--- a/modules/graphics/src/main/native-glass/win/GlassScreen.cpp	Tue Oct 01 10:00:06 2013 -0400
+++ b/modules/graphics/src/main/native-glass/win/GlassScreen.cpp	Tue Oct 01 10:06:51 2013 -0700
@@ -101,7 +101,7 @@
     return screenCls;
 }
 
-jobject CreateJavaMonitorWithSettings(JNIEnv *env, MonitorInfoStruct *mis)
+jobject GlassScreen::CreateJavaMonitor(JNIEnv *env, HMONITOR monitor)
 {
     jclass screenCls = GetScreenCls(env);
 
@@ -111,25 +111,29 @@
     }
     
     if (CheckAndClearException(env)) return NULL;
+
+    MonitorInfoStruct mis;
+    memset(&mis, 0, sizeof(MonitorInfoStruct));
+    GetMonitorSettings(monitor, &mis);
     
     return env->NewObject(screenCls, javaIDs.Screen.init,
-                          mis->ptr,
+                          mis.ptr,
 
-                          mis->colorDepth,
-                          mis->rcMonitor.left,
-                          mis->rcMonitor.top,
-                          mis->rcMonitor.right - mis->rcMonitor.left,
-                          mis->rcMonitor.bottom - mis->rcMonitor.top,
+                          mis.colorDepth,
+                          mis.rcMonitor.left,
+                          mis.rcMonitor.top,
+                          mis.rcMonitor.right - mis.rcMonitor.left,
+                          mis.rcMonitor.bottom - mis.rcMonitor.top,
                           
-                          mis->rcWork.left,
-                          mis->rcWork.top,
-                          mis->rcWork.right - mis->rcWork.left,
-                          mis->rcWork.bottom - mis->rcWork.top,
+                          mis.rcWork.left,
+                          mis.rcWork.top,
+                          mis.rcWork.right - mis.rcWork.left,
+                          mis.rcWork.bottom - mis.rcWork.top,
                               
-                          mis->dpiX,
-                          mis->dpiY,
+                          mis.dpiX,
+                          mis.dpiY,
                           
-                          mis->scale);
+                          mis.scale);
 }
 
 void GlassScreen::HandleDisplayChange()
@@ -161,11 +165,8 @@
     int arrayIndex = 1;
     for (int i = 0; i < numMonitors; i++) {
         if (g_hmpMonitors[i] != NULL) {
-            MonitorInfoStruct mis;
-            memset(&mis, 0, sizeof(MonitorInfoStruct));
-            GetMonitorSettings(g_hmpMonitors[i], &mis);
 
-            jobject jScreen = CreateJavaMonitorWithSettings(env, &mis);
+            jobject jScreen = CreateJavaMonitor(env, g_hmpMonitors[i]);
             const POINT ptZero = { 0, 0 };
 
             //The primary monitor should be set to the 0 index
--- a/modules/graphics/src/main/native-glass/win/GlassScreen.h	Tue Oct 01 10:00:06 2013 -0400
+++ b/modules/graphics/src/main/native-glass/win/GlassScreen.h	Tue Oct 01 10:06:51 2013 -0700
@@ -28,6 +28,7 @@
 
 class GlassScreen {
 public:
+    static jobject CreateJavaMonitor(JNIEnv *env, HMONITOR monitor);
     static void HandleDisplayChange();
     static jobjectArray CreateJavaScreens(JNIEnv* env);
 };
--- a/modules/graphics/src/main/native-glass/win/GlassWindow.cpp	Tue Oct 01 10:00:06 2013 -0400
+++ b/modules/graphics/src/main/native-glass/win/GlassWindow.cpp	Tue Oct 01 10:06:51 2013 -0700
@@ -35,6 +35,7 @@
 #include "Pixels.h"
 #include "AccessibleRoot.h"
 #include "GlassCursor.h"
+#include "GlassScreen.h"
 
 #include "com_sun_glass_events_WindowEvent.h"
 #include "com_sun_glass_ui_Window.h"
@@ -565,7 +566,7 @@
     HMONITOR fromMonitor = GetMonitor();
     if (toMonitor != fromMonitor) {
         env->CallVoidMethod(m_grefThis, midNotifyMoveToAnotherScreen,
-                            ptr_to_jlong(fromMonitor), ptr_to_jlong(toMonitor));
+                            GlassScreen::CreateJavaMonitor(env, toMonitor));
         CheckAndClearException(env);
         SetMonitor(toMonitor);
     }
@@ -989,7 +990,7 @@
     javaIDs.Window.notifyFocusUngrab = env->GetMethodID(cls, "notifyFocusUngrab", "()V");
     ASSERT(javaIDs.Window.notifyFocusUngrab);
 
-    midNotifyMoveToAnotherScreen = env->GetMethodID(cls, "notifyMoveToAnotherScreen", "(JJ)V");
+    midNotifyMoveToAnotherScreen = env->GetMethodID(cls, "notifyMoveToAnotherScreen", "(Lcom/sun/glass/ui/Screen;)V");
     ASSERT(midNotifyMoveToAnotherScreen);
 
 
--- a/modules/graphics/src/main/native-prism-es2/x11/X11GLFactory.c	Tue Oct 01 10:00:06 2013 -0400
+++ b/modules/graphics/src/main/native-prism-es2/x11/X11GLFactory.c	Tue Oct 01 10:06:51 2013 -0700
@@ -102,6 +102,39 @@
     }
 }
 
+jboolean queryGLX13(Display *display) {
+
+    int major, minor;
+    int errorBase, eventBase;
+
+    if (!glXQueryExtension(display, &errorBase, &eventBase)) {
+        fprintf(stderr, "ES2 Prism: Error - GLX extension is not supported\n");
+        fprintf(stderr, "    GLX version 1.3 or higher is required\n");
+        return JNI_FALSE;
+    }
+
+    /* Query the GLX version number */
+    if (!glXQueryVersion(display, &major, &minor)) {
+        fprintf(stderr, "ES2 Prism: Error - Unable to query GLX version\n");
+        fprintf(stderr, "    GLX version 1.3 or higher is required\n");
+        return JNI_FALSE;
+    }
+
+    /*
+        fprintf(stderr, "Checking GLX version : %d.%d\n", major, minor);
+     */
+
+    /* Check for GLX 1.3 and higher */
+    if (!(major == 1 && minor >= 3)) {
+        fprintf(stderr, "ES2 Prism: Error - reported GLX version = %d.%d\n", major, minor);
+        fprintf(stderr, "    GLX version 1.3 or higher is required\n");
+
+        return JNI_FALSE;
+    }
+
+    return JNI_TRUE;
+}
+
 /*
  * Class:     com_sun_prism_es2_X11GLFactory
  * Method:    nInitialize
@@ -148,6 +181,10 @@
     }
 
     screen = DefaultScreen(display);
+    
+    if (!queryGLX13(display)) {
+        return 0;
+    }
 
     fbConfigList = glXChooseFBConfig(display, screen, glxAttrs, &numFBConfigs);
 
--- a/modules/graphics/src/test/java/javafx/concurrent/ScheduledServiceTest.java	Tue Oct 01 10:00:06 2013 -0400
+++ b/modules/graphics/src/test/java/javafx/concurrent/ScheduledServiceTest.java	Tue Oct 01 10:06:51 2013 -0700
@@ -25,15 +25,16 @@
 
 package javafx.concurrent;
 
-import java.util.TimerTask;
-import java.util.concurrent.atomic.AtomicInteger;
 import javafx.concurrent.mocks.EpicFailTask;
 import javafx.concurrent.mocks.SimpleTask;
 import javafx.util.Callback;
 import javafx.util.Duration;
+import java.util.TimerTask;
+import java.util.concurrent.atomic.AtomicInteger;
 import org.junit.Test;
-
-import static org.junit.Assert.*;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
 
 /**
  * Tests for the ScheduledService.
@@ -75,8 +76,6 @@
      */
     private long wallClock;
 
-
-
     @Override protected TestServiceFactory setupServiceFactory() {
         return new TestServiceFactory() {
             @Override protected AbstractTask createTestTask() {
--- a/modules/graphics/src/test/java/javafx/concurrent/ServiceLifecycleTest.java	Tue Oct 01 10:00:06 2013 -0400
+++ b/modules/graphics/src/test/java/javafx/concurrent/ServiceLifecycleTest.java	Tue Oct 01 10:06:51 2013 -0700
@@ -25,19 +25,21 @@
 
 package javafx.concurrent;
 
-import java.util.concurrent.Executor;
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.atomic.AtomicReference;
 import javafx.beans.value.ChangeListener;
 import javafx.beans.value.ObservableValue;
 import javafx.concurrent.mocks.MythicalEvent;
 import javafx.concurrent.mocks.SimpleTask;
 import javafx.event.EventHandler;
+import java.util.concurrent.Executor;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicReference;
 import org.junit.After;
 import org.junit.Test;
-import org.junit.Ignore;
-
-import static org.junit.Assert.*;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertTrue;
 
 /**
  * Tests various rules regarding the lifecycle of a Service.
@@ -100,7 +102,7 @@
 
     protected final class ManualTask extends AbstractTask {
         private AtomicBoolean finish = new AtomicBoolean(false);
-        private AtomicReference<Exception> exception = new AtomicReference<Exception>();
+        private AtomicReference<Exception> exception = new AtomicReference<>();
         private boolean failToCancel = false;
 
         @Override protected String call() throws Exception {
@@ -136,8 +138,9 @@
 
         @Override
         public boolean cancel(boolean mayInterruptIfRunning) {
+            boolean result = failToCancel ? false : super.cancel(mayInterruptIfRunning);
             finish.set(true);
-            return failToCancel ? false : super.cancel(mayInterruptIfRunning);
+            return result;
         }
     }
 
@@ -319,7 +322,6 @@
         assertSame(Worker.State.SCHEDULED, service.stateProperty().get());
     }
 
-    @Ignore("RT-30173")
     @Test public void callingCancelInRunningStateResultsInCancelledState() {
         service.start();
         executor.executeScheduled();
@@ -1294,7 +1296,6 @@
         assertNull(service.onCancelledProperty().get());
     }
 
-    @Ignore("RT-30173")
     @Test public void onCancelledFilterCalledBefore_onCancelled() {
         final AtomicBoolean filterCalled = new AtomicBoolean(false);
         final AtomicBoolean filterCalledFirst = new AtomicBoolean(false);
@@ -1317,7 +1318,6 @@
         assertTrue(filterCalledFirst.get());
     }
 
-    @Ignore("RT-30173")
     @Test public void cancelledCalledAfterHandler() {
         final AtomicBoolean handlerCalled = new AtomicBoolean(false);
         service.setOnCancelled(new EventHandler<WorkerStateEvent>() {
@@ -1334,7 +1334,6 @@
         assertTrue(handlerCalled.get() && factory.getCurrentTask().cancelledSemaphore.getQueueLength() == 0);
     }
 
-    @Ignore("RT-30173")
     @Test public void cancelledCalledAfterHandlerEvenIfConsumed() {
         final AtomicBoolean handlerCalled = new AtomicBoolean(false);
         service.setOnCancelled(new EventHandler<WorkerStateEvent>() {
@@ -1352,7 +1351,6 @@
         assertTrue(handlerCalled.get() && factory.getCurrentTask().cancelledSemaphore.getQueueLength() == 0);
     }
 
-    @Ignore("RT-30173")
     @Test public void onCancelledHandlerCalled() {
         final AtomicBoolean handlerCalled = new AtomicBoolean(false);
         service.addEventHandler(WorkerStateEvent.WORKER_STATE_CANCELLED, new EventHandler<WorkerStateEvent>() {
@@ -1369,7 +1367,6 @@
         assertTrue(handlerCalled.get());
     }
 
-    @Ignore("RT-30173")
     @Test public void removed_onCancelledHandlerNotCalled() {
         final AtomicBoolean handlerCalled = new AtomicBoolean(false);
         final AtomicBoolean sanity = new AtomicBoolean(false);
@@ -1394,7 +1391,6 @@
         assertFalse(handlerCalled.get());
     }
 
-    @Ignore("RT-30173")
     @Test public void removed_onCancelledFilterNotCalled() {
         final AtomicBoolean filterCalled = new AtomicBoolean(false);
         final AtomicBoolean sanity = new AtomicBoolean(false);
--- a/modules/graphics/src/test/java/javafx/scene/Mouse3DTest.java	Tue Oct 01 10:00:06 2013 -0400
+++ b/modules/graphics/src/test/java/javafx/scene/Mouse3DTest.java	Tue Oct 01 10:06:51 2013 -0700
@@ -112,11 +112,14 @@
         scene(group(), cam, true);
         cam.impl_updatePeer();
         PickRay pickRay = cam.computePickRay(100, 200, null);
-        assertEquals(0.0, pickRay.getNearClip(), 0.01);
-        assertTrue(Double.isInfinite(pickRay.getFarClip()));
-        //TODO: replace the conditions by the following:
-//        assertEquals(104.39, pickRay.getNearClip(), 0.01);
-//        assertEquals(208.78, pickRay.getFarClip(), 0.01);
+
+        double xd = PERSPECTIVE_CAMERA_X - 100;
+        double yd = PERSPECTIVE_CAMERA_Y - 200;
+        double pd = Math.sqrt(xd * xd + yd * yd);
+        double len = Math.sqrt(PERSPECTIVE_CAMERA_Z * PERSPECTIVE_CAMERA_Z + pd * pd);
+
+        assertEquals(len * 100, pickRay.getNearClip(), 0.01);
+        assertEquals(len * 200, pickRay.getFarClip(), 0.01);
     }
 
     @Test
@@ -2077,6 +2080,56 @@
                 21, NOFACE, null);
     }
 
+    @Test
+    public void shouldIgnoreRectangleCloserThanNearClip() {
+
+        Camera cam = new PerspectiveCamera();
+        cam.setNearClip(0.2);
+        double nearClip = PERSPECTIVE_CAMERA_Z * 0.8;
+
+        Rectangle r1 = rect().handleMove(me);
+        r1.setTranslateX(PERSPECTIVE_CAMERA_X - 50);
+        r1.setTranslateY(PERSPECTIVE_CAMERA_Y - 50);
+        r1.setTranslateZ(nearClip - 0.1);
+        Rectangle r2 = rect().handleMove(sme);
+        r2.setTranslateX(PERSPECTIVE_CAMERA_X - 50);
+        r2.setTranslateY(PERSPECTIVE_CAMERA_Y - 50);
+        r2.setTranslateZ(nearClip + 0.1);
+
+        Scene s = scene(group(r1, r2), cam, true);
+
+        s.impl_processMouseEvent(MouseEventGenerator.generateMouseEvent(
+                MouseEvent.MOUSE_MOVED, 540, 440));
+
+        assertNull(me.event);
+        assertNotNull(sme.event);
+    }
+
+    @Test
+    public void shouldIgnoreRectangleFartherThanFarClip() {
+
+        Camera cam = new PerspectiveCamera();
+        cam.setNearClip(0.1);
+        cam.setFarClip(0.3);
+        double far = PERSPECTIVE_CAMERA_Z * 0.7;
+
+        Rectangle r = rect().handleMove(me);
+        r.setTranslateX(PERSPECTIVE_CAMERA_X - 50);
+        r.setTranslateY(PERSPECTIVE_CAMERA_Y - 50);
+        r.setTranslateZ(far - 0.1);
+
+        Scene s = scene(group(r), cam, true);
+
+        s.impl_processMouseEvent(MouseEventGenerator.generateMouseEvent(
+                MouseEvent.MOUSE_MOVED, 540, 440));
+        assertNotNull(me.event);
+
+        me.clear();
+        r.setTranslateZ(far + 0.1);
+        s.impl_processMouseEvent(MouseEventGenerator.generateMouseEvent(
+                MouseEvent.MOUSE_MOVED, 540, 440));
+        assertNull(me.event);
+    }
 
     /*****************  Scenegraph-generated events ********************/
 
@@ -2353,6 +2406,8 @@
         PerspectiveCamera cam = new PerspectiveCamera(fixedEye);
         // this field of view makes camera Z position to be -1000
         cam.setFieldOfView(43.60281897);
+        // this makes the near clip to be also at -1000
+        cam.setNearClip(0.0);
         return cam;
     }
 
--- a/modules/graphics/src/test/java/javafx/scene/layout/GridPaneTest.java	Tue Oct 01 10:00:06 2013 -0400
+++ b/modules/graphics/src/test/java/javafx/scene/layout/GridPaneTest.java	Tue Oct 01 10:06:51 2013 -0700
@@ -489,7 +489,7 @@
         gridpane.layout();
 
         assertEquals(0, child0_0.getLayoutX(), 1e-100);
-        assertEquals(200, child0_0.getLayoutY(), 1e-100); // The gridPane is resized to height 100, to cover preferred height
+        assertEquals(200, child0_0.getLayoutY(), 1e-100);
         assertEquals(300, child0_0.getLayoutBounds().getWidth(), 1e-100);
         assertEquals(100, child0_0.getLayoutBounds().getHeight(), 1e-100);
     }
@@ -2801,4 +2801,37 @@
         assertEquals(100, child2.getLayoutY(), 1e-100);
         assertEquals(75, child_double_12.getLayoutY(), 1e-100);
     }
+
+    @Test
+    public void testGridMaxSize() {
+        MockResizable child1 = new MockResizable(0,0,100,100, 100,100);
+        MockResizable child2 = new MockResizable(0,0,100,100, 150,150);
+
+        gridpane.add(child1, 0, 0);
+        gridpane.add(child2, 0, 1);
+
+        RowConstraints rc = new RowConstraints();
+        rc.setVgrow(Priority.ALWAYS);
+
+        gridpane.getRowConstraints().addAll(rc, rc);
+
+        ColumnConstraints cc = new ColumnConstraints();
+        cc.setHgrow(Priority.ALWAYS);
+        cc.setHalignment(HPos.CENTER);
+
+        gridpane.getColumnConstraints().addAll(cc);
+
+        gridpane.resize(200, 300);
+        gridpane.layout();
+
+        assertEquals(25, child1.getLayoutY(), 1e-100); // (300 (height) / 2 (2 rows) - 100 (node height)) / 2
+        assertEquals(50, child1.getLayoutX(), 1e-100); // (200 (width) - 100 (node width)) / 2
+        assertEquals(100, child1.getHeight(), 1e-100);
+        assertEquals(100, child1.getWidth(), 1e-100);
+
+        assertEquals(150, child2.getLayoutY(), 1e-100); // 150 (2nd row!) + 0
+        assertEquals(25, child2.getLayoutX(), 1e-100);
+        assertEquals(150, child2.getHeight(), 1e-100);
+        assertEquals(150, child2.getWidth(), 1e-100);
+    }
 }
--- a/modules/swing/src/main/java/javafx/embed/swing/JFXPanel.java	Tue Oct 01 10:00:06 2013 -0400
+++ b/modules/swing/src/main/java/javafx/embed/swing/JFXPanel.java	Tue Oct 01 10:06:51 2013 -0700
@@ -123,8 +123,8 @@
  */
 public class JFXPanel extends JComponent {
 
+    private static AtomicInteger instanceCount = new AtomicInteger(0);
     private static PlatformImpl.FinishListener finishListener;
-    private static boolean firstPanelShown = false;
 
     private HostContainer hostContainer;
 
@@ -160,28 +160,32 @@
 
     private boolean isCapturingMouse = false;
 
-    // Initialize FX runtime when the JFXPanel instance is constructed
-    private synchronized static void initFx() {
-        if (finishListener != null) {
+    private synchronized void registerFinishListener() {
+        if (instanceCount.getAndIncrement() > 0) {
             // Already registered
             return;
         }
         // Need to install a finish listener to catch calls to Platform.exit
         finishListener = new PlatformImpl.FinishListener() {
             @Override public void idle(boolean implicitExit) {
-                if (!firstPanelShown) {
-                    return;
-                }
-                PlatformImpl.removeListener(finishListener);
-                finishListener = null;
-                if (implicitExit) {
-                    Platform.exit();
-                }
             }
             @Override public void exitCalled() {
             }
         };
         PlatformImpl.addListener(finishListener);
+    }
+
+    private synchronized void deregisterFinishListener() {
+        if (instanceCount.decrementAndGet() > 0) {
+            // Other JFXPanels still alive
+            return;
+        }
+        PlatformImpl.removeListener(finishListener);
+        finishListener = null;
+    }
+
+    // Initialize FX runtime when the JFXPanel instance is constructed
+    private synchronized static void initFx() {
         // Note that calling PlatformImpl.startup more than once is OK
         PlatformImpl.startup(new Runnable() {
             @Override public void run() {
@@ -280,7 +284,6 @@
             stage.setScene(newScene);
             if (!stage.isShowing()) {
                 stage.show();
-                firstPanelShown = true;
             }
         }
     }
@@ -692,8 +695,8 @@
     public void addNotify() {
         super.addNotify();
 
+        registerFinishListener();
         dnd.addNotify();
-
         AccessController.doPrivileged(new PrivilegedAction<Void>() {
             public Void run() {
                 JFXPanel.this.getToolkit().addAWTEventListener(ungrabListener,
@@ -701,15 +704,12 @@
                 return null;
             }
         });
-
         updateComponentSize(); // see RT-23603
-
         SwingFXUtils.runOnFxThread(new Runnable() {
             @Override
             public void run() {
                 if ((stage != null) && !stage.isShowing()) {
                     stage.show();
-                    firstPanelShown = true;
                     sendMoveEventToFX();
                 }
             }
@@ -748,6 +748,8 @@
 
         /* see CR 4867453 */
         getInputContext().removeNotify(this);
+
+        deregisterFinishListener();
     }
 
     private class HostContainer implements HostInterface {
--- a/tests/system/src/test/java/com/sun/javafx/application/SwingExitCommon.java	Tue Oct 01 10:00:06 2013 -0400
+++ b/tests/system/src/test/java/com/sun/javafx/application/SwingExitCommon.java	Tue Oct 01 10:06:51 2013 -0700
@@ -57,7 +57,7 @@
     private static final CountDownLatch initialized = new CountDownLatch(1);
 
     // Value of the implicit exit flag for the given test
-    private static boolean implicitExit;
+    private static volatile boolean implicitExit;
 
     private JFrame frame;
     private JFXPanel fxPanel;
@@ -91,7 +91,7 @@
         });
 
         // show frame
-        frame.setLocation(0, 0);
+        frame.setLocationRelativeTo(null);
         frame.pack();
         frame.setVisible(true);
 
--- a/tests/system/src/test/java/com/sun/javafx/application/SwingExitExplicit2Test.java	Tue Oct 01 10:00:06 2013 -0400
+++ b/tests/system/src/test/java/com/sun/javafx/application/SwingExitExplicit2Test.java	Tue Oct 01 10:06:51 2013 -0700
@@ -33,8 +33,7 @@
  */
 public class SwingExitExplicit2Test extends SwingExitCommon {
 
-    // TODO: Re-enable this test when RT-21404 is fixed
-    @Ignore @Test
+    @Test
     public void testExplicitExitReEnable() {
         doTestExplicitExitReEnable();
     }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/system/src/test/java/com/sun/javafx/application/SwingNoExit.java	Tue Oct 01 10:06:51 2013 -0700
@@ -0,0 +1,143 @@
+/*
+ * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.javafx.application;
+
+import javafx.application.Platform;
+import javafx.embed.swing.JFXPanel;
+import javafx.scene.Group;
+import javafx.scene.Scene;
+import javafx.scene.paint.Color;
+import junit.framework.AssertionFailedError;
+import util.Util;
+
+import javax.swing.JFrame;
+import javax.swing.SwingUtilities;
+import java.awt.BorderLayout;
+import java.awt.Dimension;
+import java.lang.reflect.InvocationTargetException;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicReference;
+
+import org.junit.Test;
+import org.junit.Assert;
+
+/**
+ * Test program for Platform.exit() behavior with an embedded JFXPanel.
+ */
+public class SwingNoExit {
+
+    // Sleep time showing/hiding window in milliseconds
+    private static final int SLEEP_TIME = 1000;
+
+    private JFrame frame;
+    private JFXPanel fxPanel;
+
+    public void init() {
+        // Create Swing window
+        frame = new JFrame("JFXPanel 1");
+        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
+        frame.setLayout(new BorderLayout());
+
+        // Create javafx panel
+        fxPanel = new JFXPanel();
+        fxPanel.setPreferredSize(new Dimension(210, 180));
+        frame.getContentPane().add(fxPanel, BorderLayout.CENTER);
+
+        // Create scene and add it to the panel
+        Util.runAndWait(new Runnable() {
+            public void run() {
+                Group root = new Group();
+                Scene scene = new Scene(root);
+                scene.setFill(Color.LIGHTYELLOW);
+                fxPanel.setScene(scene);
+            }
+        });
+
+        // show frame
+        frame.setLocationRelativeTo(null);
+        frame.pack();
+        frame.setVisible(true);
+    }
+
+    @Test
+    public void doTestImplicitExit() throws Throwable {
+        final AtomicReference<Throwable> error = new AtomicReference<>(null);
+
+        final CountDownLatch initLatch = new CountDownLatch(1);
+        SwingUtilities.invokeLater(new Runnable() {
+            public void run() {
+                try {
+                    init();
+                    initLatch.countDown();
+                } catch (Throwable th) {
+                    error.set(th);
+                }
+            }
+        });
+        if (!initLatch.await(Util.TIMEOUT, TimeUnit.MILLISECONDS)) {
+            throw new AssertionFailedError("Timeout waiting for JFXPanel to launch and initialize");
+        }
+        Throwable t = error.get();
+        if (t != null) {
+            throw t;
+        }
+
+        final CountDownLatch runAndWait = new CountDownLatch(1);
+        Platform.runLater(new Runnable() {
+            public void run() {
+                Platform.exit();
+                runAndWait.countDown();
+            }
+        });
+        if (!runAndWait.await(Util.TIMEOUT, TimeUnit.MILLISECONDS)) {
+            throw new AssertionFailedError("Timeout waiting for Platform.exit()");
+        }
+
+        final CountDownLatch exitLatch = PlatformImpl.test_getPlatformExitLatch();
+        Thread.sleep(SLEEP_TIME);
+        // Platform.exit() should not cause FX to exit, while JFXPanel is alive
+        Assert.assertEquals("Platform.exit() caused FX to exit, while JFXPanel is alive",
+                            1, exitLatch.getCount());
+
+        try {
+            SwingUtilities.invokeAndWait(new Runnable() {
+                public void run() {
+                    frame.setVisible(false);
+                    frame.dispose();
+                }
+            });
+        }
+        catch (InvocationTargetException ex) {
+            throw new AssertionFailedError("Exception while disposing JFrame");
+        }
+
+        Thread.sleep(SLEEP_TIME);
+        // JFXPanel is gone, implicit exit is false, so FX should have exited now
+        Assert.assertEquals("FX is not exited, when the last JFXPanel is disposed",
+                            0, exitLatch.getCount());
+    }
+}