changeset 4166:d56bf9890fe6

Automated merge with ssh://jfxsrc.us.oracle.com//javafx/8.0/MASTER/jfx/rt
author jgodinez
date Wed, 03 Jul 2013 11:19:19 -0700
parents bc913850bda0 35618c416587
children b43eb1f37da3
files apps/experiments/3DViewer/src/main/java/META-INF/MANIFEST.MF apps/experiments/3DViewer/src/main/java/com/javafx/experiments/jfx3dviewer/main.fxml apps/experiments/3DViewer/src/main/java/com/javafx/experiments/jfx3dviewer/navigation.fxml apps/experiments/3DViewer/src/main/java/com/javafx/experiments/jfx3dviewer/settings.fxml apps/experiments/3DViewer/src/main/java/com/javafx/experiments/jfx3dviewer/viewer.css build.gradle buildSrc/win.gradle idea/.idea/misc.xml modules/graphics/src/main/android/com/oracle/dalvik/AppDataInstaller.java modules/graphics/src/main/android/com/oracle/dalvik/FXActivity.java modules/graphics/src/main/android/com/oracle/dalvik/InternalWebView.java modules/graphics/src/main/android/com/oracle/dalvik/MainActivity.java modules/graphics/src/main/android/com/oracle/dalvik/NativePipeReader.java modules/graphics/src/main/android/com/oracle/dalvik/VMLauncher.java modules/graphics/src/main/android/com/oracle/dalvik/net/DalvikProxySelector.java modules/graphics/src/main/native-android/DalvikProxySelector.c modules/graphics/src/main/native-android/DalvikProxySelector.h modules/graphics/src/main/native-android/NativePipeReader.c modules/graphics/src/main/native-android/VMLauncher.c
diffstat 56 files changed, 2834 insertions(+), 2682 deletions(-) [+]
line wrap: on
line diff
--- a/apps/experiments/3DViewer/src/main/java/META-INF/MANIFEST.MF	Wed Jul 03 08:46:25 2013 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,3 +0,0 @@
-Manifest-Version: 1.0
-Main-Class: com.javafx.experiments.jfx3dviewer.Jfx3dViewerApp
-
--- a/apps/experiments/3DViewer/src/main/java/com/javafx/experiments/jfx3dviewer/MainController.java	Wed Jul 03 08:46:25 2013 -0400
+++ b/apps/experiments/3DViewer/src/main/java/com/javafx/experiments/jfx3dviewer/MainController.java	Wed Jul 03 11:19:19 2013 -0700
@@ -204,16 +204,20 @@
         loadedPath = file;
         try {
             doLoad(file.toURI().toURL().toString());
-        } catch (MalformedURLException ex) {
+        } catch (Exception ex) {
             Logger.getLogger(MainController.class.getName()).log(Level.SEVERE, null, ex);
         }
     }
 
     private void load(String fileUrl) {
         try {
-            loadedPath = new File(new URL(fileUrl).toURI()).getAbsoluteFile();
+            try {
+                loadedPath = new File(new URL(fileUrl).toURI()).getAbsoluteFile();
+            } catch (IllegalArgumentException | MalformedURLException | URISyntaxException ignored) {
+                loadedPath = null;
+            }
             doLoad(fileUrl);
-        } catch (MalformedURLException | URISyntaxException ex) {
+        } catch (Exception ex) {
             Logger.getLogger(MainController.class.getName()).log(Level.SEVERE, null, ex);
         }
     }
--- a/apps/experiments/3DViewer/src/main/java/com/javafx/experiments/jfx3dviewer/main.fxml	Wed Jul 03 08:46:25 2013 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,107 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!--
-Copyright (c) 2010, 2013 Oracle and/or its affiliates.
-All rights reserved. Use is subject to license terms.
-
-This file is available and licensed under the following license:
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions
-are met:
-
- - Redistributions of source code must retain the above copyright
-   notice, this list of conditions and the following disclaimer.
- - Redistributions in binary form must reproduce the above copyright
-   notice, this list of conditions and the following disclaimer in
-   the documentation and/or other materials provided with the distribution.
- - Neither the name of Oracle Corporation nor the names of its
-   contributors may be used to endorse or promote products derived
-   from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<?import java.lang.*?>
-<?import java.net.*?>
-<?import java.util.*?>
-<?import javafx.geometry.*?>
-<?import javafx.scene.control.*?>
-<?import javafx.scene.control.MenuBar?>
-<?import javafx.scene.control.ToolBar?>
-<?import javafx.scene.layout.*?>
-<?import javafx.scene.paint.*?>
-<?import com.javafx.experiments.jfx3dviewer.*?>
-
-<VBox id="root" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns:fx="http://javafx.com/fxml" fx:controller="com.javafx.experiments.jfx3dviewer.MainController">
-  <ToolBar>
-    <items>
-      <SplitMenuButton fx:id="openMenuBtn" mnemonicParsing="false" onAction="#open" text="Open...">
-        <items>
-          <CheckMenuItem mnemonicParsing="false" text="Load as Polygons" fx:id="loadAsPolygonsCheckBox" />
-          <CheckMenuItem mnemonicParsing="false" text="Optimize" fx:id="optimizeCheckBox" />
-        </items>
-      </SplitMenuButton>
-      <Button mnemonicParsing="false" onAction="#export" text="Export..." />
-      <!--HBox.hgrow="ALWAYS"-->
-      <Pane maxWidth="1.7976931348623157E308" prefHeight="-1.0" prefWidth="-1.0" HBox.hgrow="ALWAYS"/>
-      <TimelineDisplay fx:id="timelineDisplay" />
-      <HBox id="playControls" prefHeight="-1.0" prefWidth="-1.0">
-        <children>
-          <Button fx:id="startBtn" mnemonicParsing="false" styleClass="left-pill" text="|&lt;">
-            <graphic>
-              <Pane prefHeight="16.0" prefWidth="16.0" />
-            </graphic>
-          </Button>
-          <Button fx:id="rwBtn" mnemonicParsing="false" styleClass="center-pill" text="&lt;&lt;">
-            <graphic>
-              <Pane prefHeight="16.0" prefWidth="16.0" />
-            </graphic>
-          </Button>
-          <ToggleButton fx:id="playBtn" mnemonicParsing="false" styleClass="center-pill" text="&gt;">
-            <graphic>
-              <Pane prefHeight="16.0" prefWidth="16.0" />
-            </graphic>
-          </ToggleButton>
-          <Button fx:id="ffBtn" mnemonicParsing="false" styleClass="center-pill" text="&gt;&gt;">
-            <graphic>
-              <Pane prefHeight="16.0" prefWidth="16.0" />
-            </graphic>
-          </Button>
-          <Button fx:id="endBtn" mnemonicParsing="false" styleClass="center-pill" text="&gt;|">
-            <graphic>
-              <Pane prefHeight="16.0" prefWidth="16.0" />
-            </graphic>
-          </Button>
-          <ToggleButton fx:id="loopBtn" mnemonicParsing="false" selected="true" styleClass="right-pill" text="R">
-            <graphic>
-              <Pane prefHeight="16.0" prefWidth="16.0" />
-            </graphic>
-          </ToggleButton>
-        </children>
-        <padding>
-          <Insets right="5.0" />
-        </padding>
-      </HBox>
-      <ToggleButton fx:id="settingsBtn" mnemonicParsing="false" onAction="#toggleSettings" text="Settings" />
-    </items>
-  </ToolBar>
-  <SplitPane fx:id="splitPane" dividerPositions="" focusTraversable="true" prefHeight="160.0" prefWidth="200.0" VBox.vgrow="ALWAYS" />
-  <ToolBar id="statusBar" styleClass="bottom">
-    <items>
-      <Label fx:id="status" text="Label" />
-    </items>
-  </ToolBar>
-  <stylesheets>
-    <URL value="@viewer.css" />
-  </stylesheets>
-</VBox>
--- a/apps/experiments/3DViewer/src/main/java/com/javafx/experiments/jfx3dviewer/navigation.fxml	Wed Jul 03 08:46:25 2013 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,54 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!--
-Copyright (c) 2010, 2013 Oracle and/or its affiliates.
-All rights reserved. Use is subject to license terms.
-
-This file is available and licensed under the following license:
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions
-are met:
-
- - Redistributions of source code must retain the above copyright
-   notice, this list of conditions and the following disclaimer.
- - Redistributions in binary form must reproduce the above copyright
-   notice, this list of conditions and the following disclaimer in
-   the documentation and/or other materials provided with the distribution.
- - Neither the name of Oracle Corporation nor the names of its
-   contributors may be used to endorse or promote products derived
-   from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<?import com.javafx.experiments.jfx3dviewer.*?>
-<?import com.javafx.experiments.jfx3dviewer.FourWayNavControl?>
-<?import java.lang.*?>
-<?import javafx.geometry.*?>
-<?import javafx.geometry.Insets?>
-<?import javafx.scene.control.*?>
-<?import javafx.scene.control.ScrollBar?>
-<?import javafx.scene.layout.*?>
-<?import javafx.scene.layout.VBox?>
-<?scenebuilder-classpath-element ../../../../../../../build/classes?>
-
-<VBox id="controller" alignment="CENTER" spacing="10.0" xmlns:fx="http://javafx.com/fxml" fx:controller="com.javafx.experiments.jfx3dviewer.NavigationController">
-  <children>
-    <FourWayNavControl fx:id="eyeNav" />
-    <FourWayNavControl fx:id="camNav" />
-    <ScrollBar fx:id="zoomBar" orientation="VERTICAL" rotate="180.0" />
-  </children>
-  <padding>
-    <Insets bottom="20.0" left="20.0" right="20.0" top="20.0" />
-  </padding>
-</VBox>
--- a/apps/experiments/3DViewer/src/main/java/com/javafx/experiments/jfx3dviewer/settings.fxml	Wed Jul 03 08:46:25 2013 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,282 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!--
-Copyright (c) 2010, 2013 Oracle and/or its affiliates.
-All rights reserved. Use is subject to license terms.
-
-This file is available and licensed under the following license:
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions
-are met:
-
- - Redistributions of source code must retain the above copyright
-   notice, this list of conditions and the following disclaimer.
- - Redistributions in binary form must reproduce the above copyright
-   notice, this list of conditions and the following disclaimer in
-   the documentation and/or other materials provided with the distribution.
- - Neither the name of Oracle Corporation nor the names of its
-   contributors may be used to endorse or promote products derived
-   from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<?import java.lang.*?>
-<?import java.net.*?>
-<?import java.util.*?>
-<?import javafx.geometry.*?>
-<?import javafx.scene.control.*?>
-<?import javafx.scene.control.MenuBar?>
-<?import javafx.scene.control.ToolBar?>
-<?import javafx.scene.layout.*?>
-<?import javafx.scene.paint.*?>
-<?import com.javafx.experiments.shape3d.*?>
-<?scenebuilder-stylesheet viewer.css?>
-<!--suppress JavaFxUnresolvedStyleClassReference -->
-
-<Accordion fx:id="settings" minWidth="0.0" prefHeight="798.0" prefWidth="279.0" xmlns:fx="http://javafx.com/fxml" fx:controller="com.javafx.experiments.jfx3dviewer.SettingsController">
-  <expandedPane>
-    <TitledPane fx:id="x5" animated="false" expanded="true" text="Hierarchy">
-      <content>
-        <TreeTableView fx:id="hierarachyTreeTable" editable="true" prefHeight="200.0" prefWidth="200.0">
-          <columns>
-            <TreeTableColumn fx:id="nodeColumn" editable="false" prefWidth="75.0" sortable="false" text="Node" />
-            <TreeTableColumn fx:id="idColumn" editable="false" prefWidth="75.0" text="Id" />
-            <TreeTableColumn fx:id="visibilityColumn" editable="true" text="Visibility" />
-            <TreeTableColumn fx:id="widthColumn" editable="false" text="W" />
-            <TreeTableColumn fx:id="heightColumn" editable="false" text="H" />
-            <TreeTableColumn fx:id="depthColumn" editable="false" text="D" />
-          </columns>
-        </TreeTableView>
-      </content>
-    </TitledPane>
-  </expandedPane>
-  <panes>
-    <TitledPane fx:id="x4" animated="false" expanded="false" text="Options">
-      <content>
-        <GridPane hgap="5.0" styleClass="settings" vgap="5.0">
-          <children>
-            <Label text="Show Axis:" GridPane.columnIndex="0" GridPane.rowIndex="0" />
-            <Label text="Y Up:" GridPane.columnIndex="0" GridPane.rowIndex="1" />
-            <CheckBox fx:id="showAxisCheckBox" mnemonicParsing="false" text="" GridPane.columnIndex="1" GridPane.rowIndex="0" />
-            <CheckBox fx:id="yUpCheckBox" mnemonicParsing="false" text="" GridPane.columnIndex="1" GridPane.rowIndex="1" />
-            <Label text="Scale to Fit" GridPane.columnIndex="0" GridPane.rowIndex="2" />
-            <CheckBox id="yUpCheckBox" fx:id="scaleToFitCheckBox" mnemonicParsing="false" selected="true" text="" GridPane.columnIndex="1" GridPane.rowIndex="2" />
-            <Label text="Background Color" GridPane.columnIndex="0" GridPane.rowIndex="3" />
-            <ColorPicker fx:id="backgroundColorPicker" GridPane.columnIndex="1" GridPane.rowIndex="3" />
-            <Label text="Wireframe" GridPane.columnIndex="0" GridPane.rowIndex="4" />
-            <CheckBox fx:id="wireFrameCheckbox" mnemonicParsing="false" text="" GridPane.columnIndex="1" GridPane.rowIndex="4" />
-            <Label text="Subdivision level" GridPane.columnIndex="0" GridPane.rowIndex="5" />
-            <HBox prefHeight="-1.0" prefWidth="-1.0" GridPane.columnIndex="1" GridPane.rowIndex="5">
-              <children>
-                <ToggleButton mnemonicParsing="false" selected="true" styleClass="left-pill" text="None" userData="0">
-                  <toggleGroup>
-                    <ToggleGroup fx:id="subdivisionLevelGroup" />
-                  </toggleGroup>
-                </ToggleButton>
-                <ToggleButton mnemonicParsing="false" styleClass="center-pill" text="1" toggleGroup="$subdivisionLevelGroup" userData="1" />
-                <ToggleButton mnemonicParsing="false" styleClass="center-pill" text="2" toggleGroup="$subdivisionLevelGroup" userData="2" />
-                <ToggleButton mnemonicParsing="false" styleClass="right-pill" text="3" toggleGroup="$subdivisionLevelGroup" userData="3" />
-              </children>
-            </HBox>
-            <Label text="Creases (Boundary Rules)" GridPane.columnIndex="0" GridPane.rowIndex="6" />
-            <HBox prefHeight="-1.0" prefWidth="-1.0" GridPane.columnIndex="1" GridPane.rowIndex="6">
-              <children>
-                <ToggleButton mnemonicParsing="false" selected="true" styleClass="left-pill" text="Edges">
-                  <toggleGroup>
-                    <ToggleGroup fx:id="subdivisionBoundaryGroup" />
-                  </toggleGroup>
-                  <userData>
-                    <SubdivisionMesh.BoundaryMode fx:value="CREASE_EDGES"/>
-                  </userData>
-                  <tooltip>
-                    <Tooltip text="Only edges at the boundary are treated as creases" />
-                  </tooltip>
-                </ToggleButton>
-                <ToggleButton mnemonicParsing="false" styleClass="right-pill" text="All" toggleGroup="$subdivisionBoundaryGroup">
-                  <userData>
-                    <SubdivisionMesh.BoundaryMode fx:value="CREASE_ALL"/>
-                  </userData>
-                  <tooltip>
-                    <Tooltip text="Edges and points at the boundary are treated as creases" />
-                  </tooltip>
-                </ToggleButton>
-              </children>
-            </HBox>
-            <Label text="Smooth Texture Map" GridPane.columnIndex="0" GridPane.rowIndex="7" />
-            <HBox prefHeight="-1.0" prefWidth="-1.0" GridPane.columnIndex="1" GridPane.rowIndex="7">
-              <children>
-                <ToggleButton mnemonicParsing="false" selected="true" styleClass="left-pill" text="None">
-                  <toggleGroup>
-                    <ToggleGroup fx:id="subdivisionSmoothGroup" />
-                  </toggleGroup>
-                  <userData>
-                    <SubdivisionMesh.MapBorderMode fx:value="NOT_SMOOTH"/>
-                  </userData>
-                  <tooltip>
-                    <Tooltip text="Keeps the same uvs for all control points" />
-                  </tooltip>
-                </ToggleButton>
-                <ToggleButton mnemonicParsing="false" styleClass="center-pill" text="Internal" toggleGroup="$subdivisionSmoothGroup">
-                  <userData>
-                    <SubdivisionMesh.MapBorderMode fx:value="SMOOTH_INTERNAL"/>
-                  </userData>
-                  <tooltip>
-                    <Tooltip text="Smooths uvs of points at corners" />
-                  </tooltip>
-                </ToggleButton>
-                <ToggleButton mnemonicParsing="false" styleClass="right-pill" text="All" toggleGroup="$subdivisionSmoothGroup">
-                  <userData>
-                    <SubdivisionMesh.MapBorderMode fx:value="SMOOTH_ALL"/>
-                  </userData>
-                  <tooltip>
-                    <Tooltip text="Smooths uvs of points at boundaries" />
-                  </tooltip>
-                </ToggleButton>
-              </children>
-            </HBox>
-            <Region maxHeight="1.7976931348623157E308" prefHeight="-1.0" prefWidth="-1.0" GridPane.columnIndex="0" GridPane.rowIndex="8" />
-          </children>
-          <columnConstraints>
-            <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
-            <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
-          </columnConstraints>
-          <padding>
-            <Insets bottom="8.0" left="8.0" right="8.0" top="8.0" fx:id="x3" />
-          </padding>
-          <rowConstraints>
-            <RowConstraints minHeight="10.0" prefHeight="-1.0" vgrow="SOMETIMES" />
-            <RowConstraints minHeight="10.0" prefHeight="-1.0" vgrow="SOMETIMES" />
-            <RowConstraints minHeight="10.0" prefHeight="-1.0" vgrow="SOMETIMES" />
-            <RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
-            <RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
-            <RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
-            <RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
-            <RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
-            <RowConstraints minHeight="10.0" vgrow="ALWAYS" />
-          </rowConstraints>
-        </GridPane>
-      </content>
-    </TitledPane>
-    <TitledPane fx:id="x2" animated="false" text="Lights">
-      <content>
-        <ScrollPane fitToWidth="true" prefHeight="200.0" prefWidth="200.0">
-          <content>
-            <GridPane hgap="5.0" padding="$x3" styleClass="settings" vgap="5.0">
-              <children>
-                <Label text="Color:" GridPane.columnIndex="0" GridPane.rowIndex="2" />
-                <Label maxWidth="1.7976931348623157E308" styleClass="settings-header" text="Ambient" GridPane.columnIndex="0" GridPane.columnSpan="2147483647" GridPane.hgrow="ALWAYS" GridPane.rowIndex="0" />
-                <ColorPicker fx:id="ambientColorPicker" GridPane.columnIndex="1" GridPane.rowIndex="2" />
-                <Label text="Enabled" GridPane.columnIndex="0" GridPane.rowIndex="1" />
-                <CheckBox fx:id="ambientEnableCheckbox" mnemonicParsing="false" text="" GridPane.columnIndex="1" GridPane.rowIndex="1" />
-                <Label text="Color:" GridPane.columnIndex="0" GridPane.rowIndex="5" />
-                <ColorPicker id="ambientColorPicker" fx:id="light1ColorPicker" GridPane.columnIndex="1" GridPane.rowIndex="5" />
-                <Label maxWidth="1.7976931348623157E308" styleClass="settings-header" text="Light 1 (Camera)" GridPane.columnIndex="0" GridPane.columnSpan="2" GridPane.hgrow="ALWAYS" GridPane.rowIndex="3" />
-                <Label text="Enabled" GridPane.columnIndex="0" GridPane.rowIndex="4" />
-                <CheckBox fx:id="light1EnabledCheckBox" mnemonicParsing="false" text="" GridPane.columnIndex="1" GridPane.rowIndex="4" />
-                <Label text="Lock to Camera" GridPane.columnIndex="0" GridPane.rowIndex="6" />
-                <CheckBox fx:id="light1followCameraCheckBox" mnemonicParsing="false" selected="true" text="" GridPane.columnIndex="1" GridPane.rowIndex="6" />
-                <Label text="X" GridPane.columnIndex="0" GridPane.rowIndex="7" />
-                <Slider fx:id="light1x" majorTickUnit="20.0" max="20.0" min="-20.0" minorTickCount="5" showTickLabels="true" showTickMarks="false" value="0.0" GridPane.columnIndex="1" GridPane.rowIndex="7" />
-                <Label text="Y" GridPane.columnIndex="0" GridPane.rowIndex="8" />
-                <Slider fx:id="light1y" majorTickUnit="20.0" max="20.0" min="-20.0" minorTickCount="5" showTickLabels="true" showTickMarks="false" value="0.0" GridPane.columnIndex="1" GridPane.rowIndex="8" />
-                <Label text="Z" GridPane.columnIndex="0" GridPane.rowIndex="9" />
-                <Slider fx:id="light1z" majorTickUnit="20.0" max="20.0" min="-20.0" minorTickCount="5" showTickLabels="true" showTickMarks="false" value="0.0" GridPane.columnIndex="1" GridPane.rowIndex="9" />
-                <Label maxWidth="1.7976931348623157E308" styleClass="settings-header" text="Light 2" GridPane.columnIndex="0" GridPane.columnSpan="2" GridPane.hgrow="ALWAYS" GridPane.rowIndex="10" />
-                <Label text="Enabled" GridPane.columnIndex="0" GridPane.rowIndex="11" />
-                <CheckBox fx:id="light2EnabledCheckBox" mnemonicParsing="false" text="" GridPane.columnIndex="1" GridPane.rowIndex="11" />
-                <Label text="X" GridPane.columnIndex="0" GridPane.rowIndex="13" />
-                <Slider fx:id="light2x" majorTickUnit="20.0" max="20.0" min="-20.0" minorTickCount="5" showTickLabels="true" showTickMarks="false" value="0.0" GridPane.columnIndex="1" GridPane.rowIndex="13" />
-                <Label text="Y" GridPane.columnIndex="0" GridPane.rowIndex="14" />
-                <Slider fx:id="light2y" majorTickUnit="20.0" max="20.0" min="-20.0" minorTickCount="5" showTickLabels="true" showTickMarks="false" value="0.0" GridPane.columnIndex="1" GridPane.rowIndex="14" />
-                <Label text="Z" GridPane.columnIndex="0" GridPane.rowIndex="15" />
-                <Slider fx:id="light2z" majorTickUnit="20.0" max="20.0" min="-20.0" minorTickCount="5" showTickLabels="true" showTickMarks="false" value="0.0" GridPane.columnIndex="1" GridPane.rowIndex="15" />
-                <Label maxWidth="1.7976931348623157E308" styleClass="settings-header" text="Light 3" GridPane.columnIndex="0" GridPane.columnSpan="2" GridPane.hgrow="ALWAYS" GridPane.rowIndex="16" />
-                <Label text="Enabled" GridPane.columnIndex="0" GridPane.rowIndex="17" />
-                <CheckBox fx:id="light3EnabledCheckBox" mnemonicParsing="false" text="" GridPane.columnIndex="1" GridPane.rowIndex="17" />
-                <Label text="Lock to Camera" GridPane.columnIndex="0" GridPane.rowIndex="19" />
-                <Slider fx:id="light3x" majorTickUnit="20.0" max="20.0" min="-20.0" minorTickCount="5" showTickLabels="true" showTickMarks="false" value="0.0" GridPane.columnIndex="1" GridPane.rowIndex="19" />
-                <Label text="Y" GridPane.columnIndex="0" GridPane.rowIndex="20" />
-                <Slider fx:id="light3y" majorTickUnit="20.0" max="20.0" min="-20.0" minorTickCount="5" showTickLabels="true" showTickMarks="false" value="0.0" GridPane.columnIndex="1" GridPane.rowIndex="20" />
-                <Label text="Z" GridPane.columnIndex="0" GridPane.rowIndex="21" />
-                <Slider fx:id="light3z" majorTickUnit="20.0" max="20.0" min="-20.0" minorTickCount="5" showTickLabels="true" showTickMarks="false" value="0.0" GridPane.columnIndex="1" GridPane.rowIndex="21" />
-                <Label text="Color:" GridPane.columnIndex="0" GridPane.rowIndex="12" />
-                <ColorPicker fx:id="light2ColorPicker" GridPane.columnIndex="1" GridPane.rowIndex="12" />
-                <Label text="Color" GridPane.columnIndex="0" GridPane.rowIndex="18" />
-                <ColorPicker fx:id="light3ColorPicker" GridPane.columnIndex="1" GridPane.rowIndex="18" />
-              </children>
-              <columnConstraints>
-                <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
-                <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
-              </columnConstraints>
-              <rowConstraints>
-                <RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
-                <RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
-                <RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
-                <RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
-                <RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
-                <RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
-                <RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
-                <RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
-                <RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
-                <RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
-                <RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
-                <RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
-                <RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
-                <RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
-                <RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
-                <RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
-                <RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
-                <RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
-                <RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
-                <RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
-                <RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
-                <RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
-              </rowConstraints>
-            </GridPane>
-          </content>
-        </ScrollPane>
-      </content>
-    </TitledPane>
-    <TitledPane fx:id="x1" animated="false" text="Camera">
-      <content>
-        <GridPane hgap="5.0" padding="$x3" styleClass="settings" vgap="5.0">
-          <children>
-            <Label text="Field of view:" GridPane.columnIndex="0" GridPane.rowIndex="0" />
-            <Slider fx:id="fovSlider" majorTickUnit="40.0" max="180.0" min="0.0" minorTickCount="4" showTickLabels="true" showTickMarks="true" GridPane.columnIndex="1" GridPane.rowIndex="0" />
-          </children>
-          <columnConstraints>
-            <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
-            <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
-          </columnConstraints>
-          <rowConstraints>
-            <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
-          </rowConstraints>
-        </GridPane>
-      </content>
-    </TitledPane>
-    <fx:reference source="x5" />
-    <TitledPane fx:id="x6" animated="false" expanded="false" text="Transforms">
-      <content>
-        <VBox>
-          <children>
-            <Label fx:id="selectedNodeLabel"/>
-            <ListView fx:id="transformsList" prefHeight="200.0" prefWidth="200.0">
-                <VBox.vgrow>ALWAYS</VBox.vgrow>
-            </ListView>
-          </children>
-        </VBox>
-      </content>
-    </TitledPane>
-  </panes>
-</Accordion>
--- a/apps/experiments/3DViewer/src/main/java/com/javafx/experiments/jfx3dviewer/viewer.css	Wed Jul 03 08:46:25 2013 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,220 +0,0 @@
-/*
- * Copyright (c) 2010, 2013 Oracle and/or its affiliates.
- * All rights reserved. Use is subject to license terms.
- *
- * This file is available and licensed under the following license:
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- *  - Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  - Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the distribution.
- *  - Neither the name of Oracle Corporation nor the names of its
- *    contributors may be used to endorse or promote products derived
- *    from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-.split-pane {
-    -fx-background-color: null;
-    -fx-background-insets: 0, 0;
-    -fx-padding: 0;
-}
-#statusBar > .container {
-    -fx-alignment: center;
-}
-#statusBar .text {
-    -fx-font-size: 11px;
-    -fx-font-weight: bold;
-    -fx-fill: #1d3866;
-    -fx-effect: dropshadow(one-pass-box, white, 0, 1.0, 0, 1);
-}
-#zoomBar {
-    -fx-background-insets: 0, 1;
-    -fx-background-radius: 10, 10;
-    -fx-padding: 2 0 2 0;
-}
-#zoomBar > .increment-button > .increment-arrow {
-    -fx-padding: 4;
-    -fx-shape: "M124.438,1083.516H121.5v-2.953c0-0.587-0.476-1.062-1.062-1.062s-1.062,0.476-1.062,1.062v2.953h-2.812c-0.587,0-1.062,0.476-1.062,1.062s0.476,1.062,1.062,1.062h2.812v2.797c0,0.587,0.476,1.062,1.062,1.062s1.062-0.476,1.062-1.062v-2.797h2.938c0.587,0,1.062-0.476,1.062-1.062S125.024,1083.516,124.438,1083.516z";
-}
-#zoomBar > .decrement-button > .decrement-arrow {
-    -fx-padding: 2 8 0 0;
-    -fx-shape: "M128.562,1085.625c-0.587,0-1.062-0.476-1.062-1.062l0,0c0-0.587,0.476-1.062,1.062-1.062h7.875 c0.587,0,1.062,0.476,1.062,1.062l0,0c0,0.587-0.476,1.062-1.062,1.062H128.562z";
-}
-#zoomBar > .decrement-button {
-    -fx-padding: 8 6 8 6;
-    -fx-background-radius: 10;
-}
-#zoomBar > .increment-button {
-    -fx-padding: 5 6 5 6;
-    -fx-background-radius: 10;
-}
-.four-way {
-    -fx-background-radius: 100;
-    -fx-padding: 3px;
-}
-.four-way > * {
-    -fx-shape: "M6.623,6.144L6.62,8.168L2.372,2.501L6.62-3.167L6.623-1.14l-2.8,3.641L6.623,6.";
-    -fx-scale-shape: false;
-    -fx-padding: 4px;
-    -fx-background-color: -fx-mark-highlight-color,derive(-fx-base,-45%);
-    -fx-effect: dropshadow(two-pass-box , -fx-shadow-highlight-color, 1, 0.0 , 0, 1.4);
-}
-.four-way > .center {
-    -fx-scale-shape: false;
-    -fx-padding: 10px;
-}
-.four-way > .up {
-    -fx-rotate: 90;
-}
-.four-way > .down {
-    -fx-rotate: -90;
-}
-.four-way > .right {
-    -fx-rotate: 180;
-    -fx-effect: dropshadow(two-pass-box , -fx-shadow-highlight-color, 1, 0.0 , 0, -1.4);
-}
-#eyeNav > .center {
-    -fx-shape: "M121.5,1093.484c-3.866,0-7,2.025-7,4.523s3.134,4.523,7,4.523s7-2.025,7-4.523S125.366,1093.484,121.5,1093.484z M121.5,1101.531c-3.252,0-6-1.613-6-3.523s2.748-3.523,6-3.523s6,1.613,6,3.523S124.752,1101.531,121.5,1101.531z M121.5,1094.833c-1.749,0-3.167,1.418-3.167,3.167s1.418,3.167,3.167,3.167s3.167-1.418,3.167-3.167S123.249,1094.833,121.5,1094.833z M120.595,1097.548c-0.25,0-0.453-0.202-0.453-0.453c0-0.25,0.203-0.452,0.453-0.452s0.452,0.202,0.452,0.452C121.047,1097.346,120.845,1097.548,120.595,1097.548z";
-}
-#camNav > .center {
-    -fx-shape: "M20.34,47.5c0,0-0.875-2.688-1.938-3.688s-4.688-4.438-3.625-5.562s5.25,2.25,5.25,2.25s-3.295-7.148-1.438-8c1.5-0.688,3.438,4.938,3.438,4.938S21.34,30.5,23.152,30.5c1.938,0,1.25,6.938,1.25,6.938s1.5-6.188,2.938-5.812s0,6.375,0,6.375s3.039-3.571,3.812-2.875c1.25,1.125-2.381,5.987-2.443,7.362S28.277,47.5,28.277,47.5H20.34z";
-}
-.four-way > .up:pressed,
-.four-way > .down:pressed,
-.four-way > .left:pressed,
-.four-way > .right:pressed {
-    -fx-effect: dropshadow(gaussian, -fx-accent, 15, 0.7, 0, 0);
-
-}
-.settings-header {
-    -fx-font-weight: bold;
-    -fx-alignment: center;
-    -fx-text-fill: #6f6f6f;
-    -fx-border-color: transparent transparent #dddddd transparent;
-}
-.settings {
-    -fx-font-size: 11px;
-}
-/**
-.radio-button:selected > .radio > .dot,
-.check-box:selected > .box > .mark,
-.check-box:indeterminate  > .box > .mark {
-    -fx-background-color: -fx-mark-highlight-color, -fx-mark-color !important;
-    -fx-background-insets: 1 0 -1 0, 0;
-}
-
-*/
-.settings .check-box > .box > .mark {
-    -fx-background-color: -fx-mark-highlight-color, -fx-mark-color !important;
-    -fx-background-insets: 1 0 -1 0, 0;
-    -fx-shape: "M0.288,2.742C0.48,2.195,0.756,1.716,1.115,1.308C1.476,0.9,1.918,0.58,2.442,0.348S3.555,0,4.212,0c0.664,0,1.256,0.116,1.776,0.348s0.96,0.552,1.32,0.96c0.36,0.408,0.636,0.886,0.828,1.434C8.328,3.29,8.424,3.885,8.424,4.524c0,0.624-0.096,1.206-0.288,1.746c-0.192,0.54-0.468,1.01-0.828,1.41c-0.36,0.4-0.8,0.714-1.32,0.942S4.876,8.964,4.212,8.964c-0.656,0-1.246-0.114-1.77-0.342S1.476,8.08,1.115,7.68c-0.36-0.4-0.636-0.87-0.828-1.41C0.095,5.73,0,5.148,0,4.524C0,3.885,0.095,3.29,0.288,2.742z M2.01,5.574c0.084,0.34,0.218,0.646,0.402,0.918c0.184,0.272,0.424,0.49,0.72,0.654s0.656,0.246,1.08,0.246c0.424,0,0.784-0.082,1.08-0.246s0.536-0.382,0.72-0.654S6.33,5.914,6.414,5.574c0.084-0.34,0.126-0.69,0.126-1.05c0-0.376-0.042-0.74-0.126-1.092S6.196,2.766,6.011,2.49c-0.184-0.276-0.424-0.496-0.72-0.66s-0.656-0.246-1.08-0.246c-0.424,0-0.784,0.082-1.08,0.246s-0.536,0.384-0.72,0.66C2.228,2.766,2.094,3.08,2.01,3.432S1.884,4.148,1.884,4.524C1.884,4.884,1.926,5.234,2.01,5.574z M11.58,0.204l3.576,5.748h0.024V0.204h1.764v8.568H15.06l-3.564-5.736h-0.024v5.736H9.708V0.204H11.58z M28.524,2.742c0.191-0.548,0.468-1.026,0.828-1.434c0.359-0.408,0.802-0.728,1.326-0.96C31.202,0.116,31.792,0,32.448,0c0.664,0,1.256,0.116,1.776,0.348c0.52,0.232,0.96,0.552,1.319,0.96c0.36,0.408,0.637,0.886,0.828,1.434c0.192,0.548,0.288,1.142,0.288,1.782c0,0.624-0.096,1.206-0.288,1.746c-0.191,0.54-0.468,1.01-0.828,1.41c-0.359,0.4-0.8,0.714-1.319,0.942c-0.521,0.228-1.112,0.342-1.776,0.342c-0.656,0-1.246-0.114-1.77-0.342c-0.524-0.228-0.967-0.542-1.326-0.942c-0.36-0.4-0.637-0.87-0.828-1.41c-0.192-0.54-0.288-1.122-0.288-1.746C28.236,3.885,28.332,3.29,28.524,2.742z M30.246,5.574c0.084,0.34,0.218,0.646,0.402,0.918c0.184,0.272,0.424,0.49,0.72,0.654s0.656,0.246,1.08,0.246s0.784-0.082,1.08-0.246s0.536-0.382,0.72-0.654c0.185-0.272,0.318-0.578,0.402-0.918c0.084-0.34,0.126-0.69,0.126-1.05c0-0.376-0.042-0.74-0.126-1.092s-0.218-0.666-0.402-0.942c-0.184-0.276-0.424-0.496-0.72-0.66s-0.656-0.246-1.08-0.246s-0.784,0.082-1.08,0.246s-0.536,0.384-0.72,0.66c-0.185,0.276-0.318,0.59-0.402,0.942S30.12,4.148,30.12,4.524C30.12,4.884,30.162,5.234,30.246,5.574zM43.968,0.204v1.584h-4.14v1.98h3.588v1.464h-3.588v3.54h-1.884V0.204H43.968z M51.083,0.204v1.584h-4.14v1.98h3.588v1.464h-3.588v3.54h-1.884V0.204H51.083z";
-    -fx-padding: 4.5 25.5 4.5 25.5;
-}
-.settings .check-box > .box {
-    -fx-padding: 5px 5px 5px 7px;
-    -fx-background-color:
-        -fx-shadow-highlight-color,
-        -fx-outer-border,
-        -fx-inner-border,
-        -fx-body-color,
-        linear-gradient(to bottom, derive(-fx-outer-border, -20%), -fx-outer-border),
-        linear-gradient(to bottom, derive(-fx-color, -22%) 0%, derive(-fx-color, -13%) 20%, derive(-fx-color, -11%) 50%);
-    -fx-background-insets: 0 0 -1 0, 0, 1, 2, 0 0 0 30, 1 1 1 31;
-    -fx-background-radius: 3px, 3px, 2px, 1px, 0 2px 2px 0, 0 1 1 0;
-}
-.settings .check-box:selected > .box {
-    -fx-background-color:
-        -fx-shadow-highlight-color,
-        -fx-outer-border,
-        -fx-inner-border,
-        -fx-body-color,
-        linear-gradient(to bottom, derive(-fx-outer-border, -20%), -fx-outer-border),
-        linear-gradient(to bottom, derive(-fx-default-button, -12%) 0%, derive(-fx-default-button, -3%) 20%, derive(-fx-default-button, -1%) 50%);
-
-    -fx-background-insets: 0 0 -1 0, 0, 1, 2, 0 32 0 0, 1 33 1 1;
-    -fx-background-radius: 3px, 3px, 2px, 1px, 2px 0 0 2px, 1 0 0 1;
-}
-.settings .check-box:focused > .box {
-    -fx-background-color:
-        -fx-focus-color,
-        -fx-inner-border,
-        -fx-body-color,
-        linear-gradient(to bottom, derive(-fx-outer-border, -20%), -fx-outer-border),
-        linear-gradient(to bottom, derive(-fx-color, -22%) 0%, derive(-fx-color, -13%) 20%, derive(-fx-color, -11%) 50%);
-    -fx-background-insets: -0.2, 1, 2, 1 1 1 30, 1 1 1 31;
-    -fx-background-radius: 3px, 2px, 1px, 0 2px 2px 0, 0 1 1 0;
-}
-.settings .check-box:focused:selected > .box {
-    -fx-background-color:
-        -fx-focus-color,
-        -fx-inner-border,
-        -fx-body-color,
-        linear-gradient(to bottom, derive(-fx-outer-border, -20%), -fx-outer-border),
-        linear-gradient(to bottom, derive(-fx-default-button, -12%) 0%, derive(-fx-default-button, -3%) 20%, derive(-fx-default-button, -1%) 50%);
-    -fx-background-insets: -0.2, 1, 2, 1 32 1 1, 1 33 1 1;
-    -fx-background-radius: 3px, 2px, 1px, 2px 0 0 2px, 1 0 0 1;
-}
-#playControls * {
-    -fx-content-display: graphic-only;
-}
-#playControls > * > Pane {
-    -fx-background-color: white,#666;
-    -fx-background-insets: 1 0 -1 0, 0;
-}
-#playControls > #startBtn > Pane {
-    -fx-shape: "M27.05,532h-0.782c-0.333,0-0.602,0.273-0.602,0.61v14.659c0,0.338,0.269,0.61,0.602,0.61h0.782c0.332,0,0.602-0.272,0.602-0.61V532.61C27.652,532.273,27.382,532,27.05,532zM38.9,532l-9.263,7.94l9.263,7.939V532z";
-}
-#playControls > #rwBtn > Pane {
-    -fx-shape: "M64.866,531.999l-8.818,7.965l8.818,7.964v-6.796l7.301,6.796v-15.929l-7.301,6.797V531.999z";
-}
-#playControls > #playBtn:selected  > Pane {
-    -fx-shape: "M20.716,531.999c-0.665,0-1.204,0.542-1.204,1.212v13.328c0,0.671,0.539,1.213,1.204,1.213h2.188c0.665,0,1.203-0.542,1.203-1.213v-13.328c0-0.67-0.538-1.212-1.203-1.212H20.716zM10.87,531.999c-0.665,0-1.204,0.542-1.204,1.212v13.328c0,0.671,0.539,1.213,1.204,1.213h2.188c0.665,0,1.203-0.542,1.203-1.213v-13.328c0-0.67-0.539-1.212-1.203-1.212H10.87z";
-}
-#playControls > #playBtn> Pane {
-    -fx-shape: "M0,531.999l8.667,8L0,548V531.999z";
-}
-#playControls > #ffBtn > Pane {
-    -fx-shape: "M82.09,532v6.606L74.833,532v15.832l7.257-6.606v6.606l8.576-7.916L82.09,532z";
-}
-#playControls > #endBtn > Pane {
-    -fx-shape: "M52.525,532c-0.333,0-0.602,0.273-0.602,0.611v14.669c0,0.337,0.27,0.611,0.602,0.611h0.782c0.333,0,0.602-0.274,0.602-0.611v-14.669c0-0.338-0.27-0.611-0.602-0.611H52.525zM40.667,532v15.892l9.27-7.946L40.667,532z";
-}
-.tool-bar #loopBtn Pane {
-    -fx-shape: "M103.31,539.442v-2.544h-6.487c-0.907,0-1.646,0.738-1.646,1.646v1.637l-2.512,2.526v-4.163c0-2.296,1.861-4.157,4.157-4.157h6.487v-2.392l4.034,3.724L103.31,539.442z M92.753,544.033l4.034,3.725v-2.393h6.487c2.296,0,4.157-1.861,4.157-4.157v-4.163l-2.512,2.526v1.637c0,0.907-0.738,1.646-1.646,1.646h-6.487v-2.544L92.753,544.033z";
-}
-.timeline-display {
-    -fx-font-size: 10px;
-    -fx-font-weight: bold;
-    -fx-padding: 6 6 4 6;
-}
-.timeline-display .background {
-    -fx-background-color: white,#b8c3a6;
-    -fx-background-insets: 1 0 -1 0,0;
-    -fx-background-radius: 6, 6;
-    -fx-effect: innershadow(gaussian, #52574abb, 5, 0, 0, 2);
-}
-.timeline-display Text {
-    -fx-fill: #52574a;
-}
-.timeline-display .bar {
-    -fx-border-color: #52574a;
-}
-.timeline-display .progress {
-    -fx-background-color: #52574a;
-}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/experiments/3DViewer/src/main/resources/com/javafx/experiments/jfx3dviewer/main.fxml	Wed Jul 03 11:19:19 2013 -0700
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+Copyright (c) 2010, 2013 Oracle and/or its affiliates.
+All rights reserved. Use is subject to license terms.
+
+This file is available and licensed under the following license:
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+ - Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+ - Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in
+   the documentation and/or other materials provided with the distribution.
+ - Neither the name of Oracle Corporation nor the names of its
+   contributors may be used to endorse or promote products derived
+   from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<?import java.lang.*?>
+<?import java.net.*?>
+<?import java.util.*?>
+<?import javafx.geometry.*?>
+<?import javafx.scene.control.*?>
+<?import javafx.scene.control.MenuBar?>
+<?import javafx.scene.control.ToolBar?>
+<?import javafx.scene.layout.*?>
+<?import javafx.scene.paint.*?>
+<?import com.javafx.experiments.jfx3dviewer.*?>
+
+<VBox id="root" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns:fx="http://javafx.com/fxml" fx:controller="com.javafx.experiments.jfx3dviewer.MainController">
+  <ToolBar>
+    <items>
+      <SplitMenuButton fx:id="openMenuBtn" mnemonicParsing="false" onAction="#open" text="Open...">
+        <items>
+          <CheckMenuItem mnemonicParsing="false" text="Load as Polygons" fx:id="loadAsPolygonsCheckBox" />
+          <CheckMenuItem mnemonicParsing="false" text="Optimize" fx:id="optimizeCheckBox" />
+        </items>
+      </SplitMenuButton>
+      <Button mnemonicParsing="false" onAction="#export" text="Export..." />
+      <!--HBox.hgrow="ALWAYS"-->
+      <Pane maxWidth="1.7976931348623157E308" prefHeight="-1.0" prefWidth="-1.0" HBox.hgrow="ALWAYS"/>
+      <TimelineDisplay fx:id="timelineDisplay" />
+      <HBox id="playControls" prefHeight="-1.0" prefWidth="-1.0">
+        <children>
+          <Button fx:id="startBtn" mnemonicParsing="false" styleClass="left-pill" text="|&lt;">
+            <graphic>
+              <Pane prefHeight="16.0" prefWidth="16.0" />
+            </graphic>
+          </Button>
+          <Button fx:id="rwBtn" mnemonicParsing="false" styleClass="center-pill" text="&lt;&lt;">
+            <graphic>
+              <Pane prefHeight="16.0" prefWidth="16.0" />
+            </graphic>
+          </Button>
+          <ToggleButton fx:id="playBtn" mnemonicParsing="false" styleClass="center-pill" text="&gt;">
+            <graphic>
+              <Pane prefHeight="16.0" prefWidth="16.0" />
+            </graphic>
+          </ToggleButton>
+          <Button fx:id="ffBtn" mnemonicParsing="false" styleClass="center-pill" text="&gt;&gt;">
+            <graphic>
+              <Pane prefHeight="16.0" prefWidth="16.0" />
+            </graphic>
+          </Button>
+          <Button fx:id="endBtn" mnemonicParsing="false" styleClass="center-pill" text="&gt;|">
+            <graphic>
+              <Pane prefHeight="16.0" prefWidth="16.0" />
+            </graphic>
+          </Button>
+          <ToggleButton fx:id="loopBtn" mnemonicParsing="false" selected="true" styleClass="right-pill" text="R">
+            <graphic>
+              <Pane prefHeight="16.0" prefWidth="16.0" />
+            </graphic>
+          </ToggleButton>
+        </children>
+        <padding>
+          <Insets right="5.0" />
+        </padding>
+      </HBox>
+      <ToggleButton fx:id="settingsBtn" mnemonicParsing="false" onAction="#toggleSettings" text="Settings" />
+    </items>
+  </ToolBar>
+  <SplitPane fx:id="splitPane" dividerPositions="" focusTraversable="true" prefHeight="160.0" prefWidth="200.0" VBox.vgrow="ALWAYS" />
+  <ToolBar id="statusBar" styleClass="bottom">
+    <items>
+      <Label fx:id="status" text="Label" />
+    </items>
+  </ToolBar>
+  <stylesheets>
+    <URL value="@viewer.css" />
+  </stylesheets>
+</VBox>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/experiments/3DViewer/src/main/resources/com/javafx/experiments/jfx3dviewer/navigation.fxml	Wed Jul 03 11:19:19 2013 -0700
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+Copyright (c) 2010, 2013 Oracle and/or its affiliates.
+All rights reserved. Use is subject to license terms.
+
+This file is available and licensed under the following license:
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+ - Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+ - Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in
+   the documentation and/or other materials provided with the distribution.
+ - Neither the name of Oracle Corporation nor the names of its
+   contributors may be used to endorse or promote products derived
+   from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<?import com.javafx.experiments.jfx3dviewer.*?>
+<?import com.javafx.experiments.jfx3dviewer.FourWayNavControl?>
+<?import java.lang.*?>
+<?import javafx.geometry.*?>
+<?import javafx.geometry.Insets?>
+<?import javafx.scene.control.*?>
+<?import javafx.scene.control.ScrollBar?>
+<?import javafx.scene.layout.*?>
+<?import javafx.scene.layout.VBox?>
+<?scenebuilder-classpath-element ../../../../../../../build/classes?>
+
+<VBox id="controller" alignment="CENTER" spacing="10.0" xmlns:fx="http://javafx.com/fxml" fx:controller="com.javafx.experiments.jfx3dviewer.NavigationController">
+  <children>
+    <FourWayNavControl fx:id="eyeNav" />
+    <FourWayNavControl fx:id="camNav" />
+    <ScrollBar fx:id="zoomBar" orientation="VERTICAL" rotate="180.0" />
+  </children>
+  <padding>
+    <Insets bottom="20.0" left="20.0" right="20.0" top="20.0" />
+  </padding>
+</VBox>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/experiments/3DViewer/src/main/resources/com/javafx/experiments/jfx3dviewer/settings.fxml	Wed Jul 03 11:19:19 2013 -0700
@@ -0,0 +1,282 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+Copyright (c) 2010, 2013 Oracle and/or its affiliates.
+All rights reserved. Use is subject to license terms.
+
+This file is available and licensed under the following license:
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+ - Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+ - Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in
+   the documentation and/or other materials provided with the distribution.
+ - Neither the name of Oracle Corporation nor the names of its
+   contributors may be used to endorse or promote products derived
+   from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<?import java.lang.*?>
+<?import java.net.*?>
+<?import java.util.*?>
+<?import javafx.geometry.*?>
+<?import javafx.scene.control.*?>
+<?import javafx.scene.control.MenuBar?>
+<?import javafx.scene.control.ToolBar?>
+<?import javafx.scene.layout.*?>
+<?import javafx.scene.paint.*?>
+<?import com.javafx.experiments.shape3d.*?>
+<?scenebuilder-stylesheet viewer.css?>
+<!--suppress JavaFxUnresolvedStyleClassReference -->
+
+<Accordion fx:id="settings" minWidth="0.0" prefHeight="798.0" prefWidth="279.0" xmlns:fx="http://javafx.com/fxml" fx:controller="com.javafx.experiments.jfx3dviewer.SettingsController">
+  <expandedPane>
+    <TitledPane fx:id="x5" animated="false" expanded="true" text="Hierarchy">
+      <content>
+        <TreeTableView fx:id="hierarachyTreeTable" editable="true" prefHeight="200.0" prefWidth="200.0">
+          <columns>
+            <TreeTableColumn fx:id="nodeColumn" editable="false" prefWidth="75.0" sortable="false" text="Node" />
+            <TreeTableColumn fx:id="idColumn" editable="false" prefWidth="75.0" text="Id" />
+            <TreeTableColumn fx:id="visibilityColumn" editable="true" text="Visibility" />
+            <TreeTableColumn fx:id="widthColumn" editable="false" text="W" />
+            <TreeTableColumn fx:id="heightColumn" editable="false" text="H" />
+            <TreeTableColumn fx:id="depthColumn" editable="false" text="D" />
+          </columns>
+        </TreeTableView>
+      </content>
+    </TitledPane>
+  </expandedPane>
+  <panes>
+    <TitledPane fx:id="x4" animated="false" expanded="false" text="Options">
+      <content>
+        <GridPane hgap="5.0" styleClass="settings" vgap="5.0">
+          <children>
+            <Label text="Show Axis:" GridPane.columnIndex="0" GridPane.rowIndex="0" />
+            <Label text="Y Up:" GridPane.columnIndex="0" GridPane.rowIndex="1" />
+            <CheckBox fx:id="showAxisCheckBox" mnemonicParsing="false" text="" GridPane.columnIndex="1" GridPane.rowIndex="0" />
+            <CheckBox fx:id="yUpCheckBox" mnemonicParsing="false" text="" GridPane.columnIndex="1" GridPane.rowIndex="1" />
+            <Label text="Scale to Fit" GridPane.columnIndex="0" GridPane.rowIndex="2" />
+            <CheckBox id="yUpCheckBox" fx:id="scaleToFitCheckBox" mnemonicParsing="false" selected="true" text="" GridPane.columnIndex="1" GridPane.rowIndex="2" />
+            <Label text="Background Color" GridPane.columnIndex="0" GridPane.rowIndex="3" />
+            <ColorPicker fx:id="backgroundColorPicker" GridPane.columnIndex="1" GridPane.rowIndex="3" />
+            <Label text="Wireframe" GridPane.columnIndex="0" GridPane.rowIndex="4" />
+            <CheckBox fx:id="wireFrameCheckbox" mnemonicParsing="false" text="" GridPane.columnIndex="1" GridPane.rowIndex="4" />
+            <Label text="Subdivision level" GridPane.columnIndex="0" GridPane.rowIndex="5" />
+            <HBox prefHeight="-1.0" prefWidth="-1.0" GridPane.columnIndex="1" GridPane.rowIndex="5">
+              <children>
+                <ToggleButton mnemonicParsing="false" selected="true" styleClass="left-pill" text="None" userData="0">
+                  <toggleGroup>
+                    <ToggleGroup fx:id="subdivisionLevelGroup" />
+                  </toggleGroup>
+                </ToggleButton>
+                <ToggleButton mnemonicParsing="false" styleClass="center-pill" text="1" toggleGroup="$subdivisionLevelGroup" userData="1" />
+                <ToggleButton mnemonicParsing="false" styleClass="center-pill" text="2" toggleGroup="$subdivisionLevelGroup" userData="2" />
+                <ToggleButton mnemonicParsing="false" styleClass="right-pill" text="3" toggleGroup="$subdivisionLevelGroup" userData="3" />
+              </children>
+            </HBox>
+            <Label text="Creases (Boundary Rules)" GridPane.columnIndex="0" GridPane.rowIndex="6" />
+            <HBox prefHeight="-1.0" prefWidth="-1.0" GridPane.columnIndex="1" GridPane.rowIndex="6">
+              <children>
+                <ToggleButton mnemonicParsing="false" selected="true" styleClass="left-pill" text="Edges">
+                  <toggleGroup>
+                    <ToggleGroup fx:id="subdivisionBoundaryGroup" />
+                  </toggleGroup>
+                  <userData>
+                    <SubdivisionMesh.BoundaryMode fx:value="CREASE_EDGES"/>
+                  </userData>
+                  <tooltip>
+                    <Tooltip text="Only edges at the boundary are treated as creases" />
+                  </tooltip>
+                </ToggleButton>
+                <ToggleButton mnemonicParsing="false" styleClass="right-pill" text="All" toggleGroup="$subdivisionBoundaryGroup">
+                  <userData>
+                    <SubdivisionMesh.BoundaryMode fx:value="CREASE_ALL"/>
+                  </userData>
+                  <tooltip>
+                    <Tooltip text="Edges and points at the boundary are treated as creases" />
+                  </tooltip>
+                </ToggleButton>
+              </children>
+            </HBox>
+            <Label text="Smooth Texture Map" GridPane.columnIndex="0" GridPane.rowIndex="7" />
+            <HBox prefHeight="-1.0" prefWidth="-1.0" GridPane.columnIndex="1" GridPane.rowIndex="7">
+              <children>
+                <ToggleButton mnemonicParsing="false" selected="true" styleClass="left-pill" text="None">
+                  <toggleGroup>
+                    <ToggleGroup fx:id="subdivisionSmoothGroup" />
+                  </toggleGroup>
+                  <userData>
+                    <SubdivisionMesh.MapBorderMode fx:value="NOT_SMOOTH"/>
+                  </userData>
+                  <tooltip>
+                    <Tooltip text="Keeps the same uvs for all control points" />
+                  </tooltip>
+                </ToggleButton>
+                <ToggleButton mnemonicParsing="false" styleClass="center-pill" text="Internal" toggleGroup="$subdivisionSmoothGroup">
+                  <userData>
+                    <SubdivisionMesh.MapBorderMode fx:value="SMOOTH_INTERNAL"/>
+                  </userData>
+                  <tooltip>
+                    <Tooltip text="Smooths uvs of points at corners" />
+                  </tooltip>
+                </ToggleButton>
+                <ToggleButton mnemonicParsing="false" styleClass="right-pill" text="All" toggleGroup="$subdivisionSmoothGroup">
+                  <userData>
+                    <SubdivisionMesh.MapBorderMode fx:value="SMOOTH_ALL"/>
+                  </userData>
+                  <tooltip>
+                    <Tooltip text="Smooths uvs of points at boundaries" />
+                  </tooltip>
+                </ToggleButton>
+              </children>
+            </HBox>
+            <Region maxHeight="1.7976931348623157E308" prefHeight="-1.0" prefWidth="-1.0" GridPane.columnIndex="0" GridPane.rowIndex="8" />
+          </children>
+          <columnConstraints>
+            <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
+            <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
+          </columnConstraints>
+          <padding>
+            <Insets bottom="8.0" left="8.0" right="8.0" top="8.0" fx:id="x3" />
+          </padding>
+          <rowConstraints>
+            <RowConstraints minHeight="10.0" prefHeight="-1.0" vgrow="SOMETIMES" />
+            <RowConstraints minHeight="10.0" prefHeight="-1.0" vgrow="SOMETIMES" />
+            <RowConstraints minHeight="10.0" prefHeight="-1.0" vgrow="SOMETIMES" />
+            <RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
+            <RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
+            <RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
+            <RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
+            <RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
+            <RowConstraints minHeight="10.0" vgrow="ALWAYS" />
+          </rowConstraints>
+        </GridPane>
+      </content>
+    </TitledPane>
+    <TitledPane fx:id="x2" animated="false" text="Lights">
+      <content>
+        <ScrollPane fitToWidth="true" prefHeight="200.0" prefWidth="200.0">
+          <content>
+            <GridPane hgap="5.0" padding="$x3" styleClass="settings" vgap="5.0">
+              <children>
+                <Label text="Color:" GridPane.columnIndex="0" GridPane.rowIndex="2" />
+                <Label maxWidth="1.7976931348623157E308" styleClass="settings-header" text="Ambient" GridPane.columnIndex="0" GridPane.columnSpan="2147483647" GridPane.hgrow="ALWAYS" GridPane.rowIndex="0" />
+                <ColorPicker fx:id="ambientColorPicker" GridPane.columnIndex="1" GridPane.rowIndex="2" />
+                <Label text="Enabled" GridPane.columnIndex="0" GridPane.rowIndex="1" />
+                <CheckBox fx:id="ambientEnableCheckbox" mnemonicParsing="false" text="" GridPane.columnIndex="1" GridPane.rowIndex="1" />
+                <Label text="Color:" GridPane.columnIndex="0" GridPane.rowIndex="5" />
+                <ColorPicker id="ambientColorPicker" fx:id="light1ColorPicker" GridPane.columnIndex="1" GridPane.rowIndex="5" />
+                <Label maxWidth="1.7976931348623157E308" styleClass="settings-header" text="Light 1 (Camera)" GridPane.columnIndex="0" GridPane.columnSpan="2" GridPane.hgrow="ALWAYS" GridPane.rowIndex="3" />
+                <Label text="Enabled" GridPane.columnIndex="0" GridPane.rowIndex="4" />
+                <CheckBox fx:id="light1EnabledCheckBox" mnemonicParsing="false" text="" GridPane.columnIndex="1" GridPane.rowIndex="4" />
+                <Label text="Lock to Camera" GridPane.columnIndex="0" GridPane.rowIndex="6" />
+                <CheckBox fx:id="light1followCameraCheckBox" mnemonicParsing="false" selected="true" text="" GridPane.columnIndex="1" GridPane.rowIndex="6" />
+                <Label text="X" GridPane.columnIndex="0" GridPane.rowIndex="7" />
+                <Slider fx:id="light1x" majorTickUnit="20.0" max="20.0" min="-20.0" minorTickCount="5" showTickLabels="true" showTickMarks="false" value="0.0" GridPane.columnIndex="1" GridPane.rowIndex="7" />
+                <Label text="Y" GridPane.columnIndex="0" GridPane.rowIndex="8" />
+                <Slider fx:id="light1y" majorTickUnit="20.0" max="20.0" min="-20.0" minorTickCount="5" showTickLabels="true" showTickMarks="false" value="0.0" GridPane.columnIndex="1" GridPane.rowIndex="8" />
+                <Label text="Z" GridPane.columnIndex="0" GridPane.rowIndex="9" />
+                <Slider fx:id="light1z" majorTickUnit="20.0" max="20.0" min="-20.0" minorTickCount="5" showTickLabels="true" showTickMarks="false" value="0.0" GridPane.columnIndex="1" GridPane.rowIndex="9" />
+                <Label maxWidth="1.7976931348623157E308" styleClass="settings-header" text="Light 2" GridPane.columnIndex="0" GridPane.columnSpan="2" GridPane.hgrow="ALWAYS" GridPane.rowIndex="10" />
+                <Label text="Enabled" GridPane.columnIndex="0" GridPane.rowIndex="11" />
+                <CheckBox fx:id="light2EnabledCheckBox" mnemonicParsing="false" text="" GridPane.columnIndex="1" GridPane.rowIndex="11" />
+                <Label text="X" GridPane.columnIndex="0" GridPane.rowIndex="13" />
+                <Slider fx:id="light2x" majorTickUnit="20.0" max="20.0" min="-20.0" minorTickCount="5" showTickLabels="true" showTickMarks="false" value="0.0" GridPane.columnIndex="1" GridPane.rowIndex="13" />
+                <Label text="Y" GridPane.columnIndex="0" GridPane.rowIndex="14" />
+                <Slider fx:id="light2y" majorTickUnit="20.0" max="20.0" min="-20.0" minorTickCount="5" showTickLabels="true" showTickMarks="false" value="0.0" GridPane.columnIndex="1" GridPane.rowIndex="14" />
+                <Label text="Z" GridPane.columnIndex="0" GridPane.rowIndex="15" />
+                <Slider fx:id="light2z" majorTickUnit="20.0" max="20.0" min="-20.0" minorTickCount="5" showTickLabels="true" showTickMarks="false" value="0.0" GridPane.columnIndex="1" GridPane.rowIndex="15" />
+                <Label maxWidth="1.7976931348623157E308" styleClass="settings-header" text="Light 3" GridPane.columnIndex="0" GridPane.columnSpan="2" GridPane.hgrow="ALWAYS" GridPane.rowIndex="16" />
+                <Label text="Enabled" GridPane.columnIndex="0" GridPane.rowIndex="17" />
+                <CheckBox fx:id="light3EnabledCheckBox" mnemonicParsing="false" text="" GridPane.columnIndex="1" GridPane.rowIndex="17" />
+                <Label text="Lock to Camera" GridPane.columnIndex="0" GridPane.rowIndex="19" />
+                <Slider fx:id="light3x" majorTickUnit="20.0" max="20.0" min="-20.0" minorTickCount="5" showTickLabels="true" showTickMarks="false" value="0.0" GridPane.columnIndex="1" GridPane.rowIndex="19" />
+                <Label text="Y" GridPane.columnIndex="0" GridPane.rowIndex="20" />
+                <Slider fx:id="light3y" majorTickUnit="20.0" max="20.0" min="-20.0" minorTickCount="5" showTickLabels="true" showTickMarks="false" value="0.0" GridPane.columnIndex="1" GridPane.rowIndex="20" />
+                <Label text="Z" GridPane.columnIndex="0" GridPane.rowIndex="21" />
+                <Slider fx:id="light3z" majorTickUnit="20.0" max="20.0" min="-20.0" minorTickCount="5" showTickLabels="true" showTickMarks="false" value="0.0" GridPane.columnIndex="1" GridPane.rowIndex="21" />
+                <Label text="Color:" GridPane.columnIndex="0" GridPane.rowIndex="12" />
+                <ColorPicker fx:id="light2ColorPicker" GridPane.columnIndex="1" GridPane.rowIndex="12" />
+                <Label text="Color" GridPane.columnIndex="0" GridPane.rowIndex="18" />
+                <ColorPicker fx:id="light3ColorPicker" GridPane.columnIndex="1" GridPane.rowIndex="18" />
+              </children>
+              <columnConstraints>
+                <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
+                <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
+              </columnConstraints>
+              <rowConstraints>
+                <RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
+                <RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
+                <RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
+                <RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
+                <RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
+                <RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
+                <RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
+                <RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
+                <RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
+                <RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
+                <RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
+                <RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
+                <RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
+                <RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
+                <RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
+                <RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
+                <RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
+                <RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
+                <RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
+                <RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
+                <RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
+                <RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
+              </rowConstraints>
+            </GridPane>
+          </content>
+        </ScrollPane>
+      </content>
+    </TitledPane>
+    <TitledPane fx:id="x1" animated="false" text="Camera">
+      <content>
+        <GridPane hgap="5.0" padding="$x3" styleClass="settings" vgap="5.0">
+          <children>
+            <Label text="Field of view:" GridPane.columnIndex="0" GridPane.rowIndex="0" />
+            <Slider fx:id="fovSlider" majorTickUnit="40.0" max="180.0" min="0.0" minorTickCount="4" showTickLabels="true" showTickMarks="true" GridPane.columnIndex="1" GridPane.rowIndex="0" />
+          </children>
+          <columnConstraints>
+            <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
+            <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
+          </columnConstraints>
+          <rowConstraints>
+            <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
+          </rowConstraints>
+        </GridPane>
+      </content>
+    </TitledPane>
+    <fx:reference source="x5" />
+    <TitledPane fx:id="x6" animated="false" expanded="false" text="Transforms">
+      <content>
+        <VBox>
+          <children>
+            <Label fx:id="selectedNodeLabel"/>
+            <ListView fx:id="transformsList" prefHeight="200.0" prefWidth="200.0">
+                <VBox.vgrow>ALWAYS</VBox.vgrow>
+            </ListView>
+          </children>
+        </VBox>
+      </content>
+    </TitledPane>
+  </panes>
+</Accordion>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/experiments/3DViewer/src/main/resources/com/javafx/experiments/jfx3dviewer/viewer.css	Wed Jul 03 11:19:19 2013 -0700
@@ -0,0 +1,220 @@
+/*
+ * Copyright (c) 2010, 2013 Oracle and/or its affiliates.
+ * All rights reserved. Use is subject to license terms.
+ *
+ * This file is available and licensed under the following license:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *  - Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  - Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the distribution.
+ *  - Neither the name of Oracle Corporation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+.split-pane {
+    -fx-background-color: null;
+    -fx-background-insets: 0, 0;
+    -fx-padding: 0;
+}
+#statusBar > .container {
+    -fx-alignment: center;
+}
+#statusBar .text {
+    -fx-font-size: 11px;
+    -fx-font-weight: bold;
+    -fx-fill: #1d3866;
+    -fx-effect: dropshadow(one-pass-box, white, 0, 1.0, 0, 1);
+}
+#zoomBar {
+    -fx-background-insets: 0, 1;
+    -fx-background-radius: 10, 10;
+    -fx-padding: 2 0 2 0;
+}
+#zoomBar > .increment-button > .increment-arrow {
+    -fx-padding: 4;
+    -fx-shape: "M124.438,1083.516H121.5v-2.953c0-0.587-0.476-1.062-1.062-1.062s-1.062,0.476-1.062,1.062v2.953h-2.812c-0.587,0-1.062,0.476-1.062,1.062s0.476,1.062,1.062,1.062h2.812v2.797c0,0.587,0.476,1.062,1.062,1.062s1.062-0.476,1.062-1.062v-2.797h2.938c0.587,0,1.062-0.476,1.062-1.062S125.024,1083.516,124.438,1083.516z";
+}
+#zoomBar > .decrement-button > .decrement-arrow {
+    -fx-padding: 2 8 0 0;
+    -fx-shape: "M128.562,1085.625c-0.587,0-1.062-0.476-1.062-1.062l0,0c0-0.587,0.476-1.062,1.062-1.062h7.875 c0.587,0,1.062,0.476,1.062,1.062l0,0c0,0.587-0.476,1.062-1.062,1.062H128.562z";
+}
+#zoomBar > .decrement-button {
+    -fx-padding: 8 6 8 6;
+    -fx-background-radius: 10;
+}
+#zoomBar > .increment-button {
+    -fx-padding: 5 6 5 6;
+    -fx-background-radius: 10;
+}
+.four-way {
+    -fx-background-radius: 100;
+    -fx-padding: 3px;
+}
+.four-way > * {
+    -fx-shape: "M6.623,6.144L6.62,8.168L2.372,2.501L6.62-3.167L6.623-1.14l-2.8,3.641L6.623,6.";
+    -fx-scale-shape: false;
+    -fx-padding: 4px;
+    -fx-background-color: -fx-mark-highlight-color,derive(-fx-base,-45%);
+    -fx-effect: dropshadow(two-pass-box , -fx-shadow-highlight-color, 1, 0.0 , 0, 1.4);
+}
+.four-way > .center {
+    -fx-scale-shape: false;
+    -fx-padding: 10px;
+}
+.four-way > .up {
+    -fx-rotate: 90;
+}
+.four-way > .down {
+    -fx-rotate: -90;
+}
+.four-way > .right {
+    -fx-rotate: 180;
+    -fx-effect: dropshadow(two-pass-box , -fx-shadow-highlight-color, 1, 0.0 , 0, -1.4);
+}
+#eyeNav > .center {
+    -fx-shape: "M121.5,1093.484c-3.866,0-7,2.025-7,4.523s3.134,4.523,7,4.523s7-2.025,7-4.523S125.366,1093.484,121.5,1093.484z M121.5,1101.531c-3.252,0-6-1.613-6-3.523s2.748-3.523,6-3.523s6,1.613,6,3.523S124.752,1101.531,121.5,1101.531z M121.5,1094.833c-1.749,0-3.167,1.418-3.167,3.167s1.418,3.167,3.167,3.167s3.167-1.418,3.167-3.167S123.249,1094.833,121.5,1094.833z M120.595,1097.548c-0.25,0-0.453-0.202-0.453-0.453c0-0.25,0.203-0.452,0.453-0.452s0.452,0.202,0.452,0.452C121.047,1097.346,120.845,1097.548,120.595,1097.548z";
+}
+#camNav > .center {
+    -fx-shape: "M20.34,47.5c0,0-0.875-2.688-1.938-3.688s-4.688-4.438-3.625-5.562s5.25,2.25,5.25,2.25s-3.295-7.148-1.438-8c1.5-0.688,3.438,4.938,3.438,4.938S21.34,30.5,23.152,30.5c1.938,0,1.25,6.938,1.25,6.938s1.5-6.188,2.938-5.812s0,6.375,0,6.375s3.039-3.571,3.812-2.875c1.25,1.125-2.381,5.987-2.443,7.362S28.277,47.5,28.277,47.5H20.34z";
+}
+.four-way > .up:pressed,
+.four-way > .down:pressed,
+.four-way > .left:pressed,
+.four-way > .right:pressed {
+    -fx-effect: dropshadow(gaussian, -fx-accent, 15, 0.7, 0, 0);
+
+}
+.settings-header {
+    -fx-font-weight: bold;
+    -fx-alignment: center;
+    -fx-text-fill: #6f6f6f;
+    -fx-border-color: transparent transparent #dddddd transparent;
+}
+.settings {
+    -fx-font-size: 11px;
+}
+/**
+.radio-button:selected > .radio > .dot,
+.check-box:selected > .box > .mark,
+.check-box:indeterminate  > .box > .mark {
+    -fx-background-color: -fx-mark-highlight-color, -fx-mark-color !important;
+    -fx-background-insets: 1 0 -1 0, 0;
+}
+
+*/
+.settings .check-box > .box > .mark {
+    -fx-background-color: -fx-mark-highlight-color, -fx-mark-color !important;
+    -fx-background-insets: 1 0 -1 0, 0;
+    -fx-shape: "M0.288,2.742C0.48,2.195,0.756,1.716,1.115,1.308C1.476,0.9,1.918,0.58,2.442,0.348S3.555,0,4.212,0c0.664,0,1.256,0.116,1.776,0.348s0.96,0.552,1.32,0.96c0.36,0.408,0.636,0.886,0.828,1.434C8.328,3.29,8.424,3.885,8.424,4.524c0,0.624-0.096,1.206-0.288,1.746c-0.192,0.54-0.468,1.01-0.828,1.41c-0.36,0.4-0.8,0.714-1.32,0.942S4.876,8.964,4.212,8.964c-0.656,0-1.246-0.114-1.77-0.342S1.476,8.08,1.115,7.68c-0.36-0.4-0.636-0.87-0.828-1.41C0.095,5.73,0,5.148,0,4.524C0,3.885,0.095,3.29,0.288,2.742z M2.01,5.574c0.084,0.34,0.218,0.646,0.402,0.918c0.184,0.272,0.424,0.49,0.72,0.654s0.656,0.246,1.08,0.246c0.424,0,0.784-0.082,1.08-0.246s0.536-0.382,0.72-0.654S6.33,5.914,6.414,5.574c0.084-0.34,0.126-0.69,0.126-1.05c0-0.376-0.042-0.74-0.126-1.092S6.196,2.766,6.011,2.49c-0.184-0.276-0.424-0.496-0.72-0.66s-0.656-0.246-1.08-0.246c-0.424,0-0.784,0.082-1.08,0.246s-0.536,0.384-0.72,0.66C2.228,2.766,2.094,3.08,2.01,3.432S1.884,4.148,1.884,4.524C1.884,4.884,1.926,5.234,2.01,5.574z M11.58,0.204l3.576,5.748h0.024V0.204h1.764v8.568H15.06l-3.564-5.736h-0.024v5.736H9.708V0.204H11.58z M28.524,2.742c0.191-0.548,0.468-1.026,0.828-1.434c0.359-0.408,0.802-0.728,1.326-0.96C31.202,0.116,31.792,0,32.448,0c0.664,0,1.256,0.116,1.776,0.348c0.52,0.232,0.96,0.552,1.319,0.96c0.36,0.408,0.637,0.886,0.828,1.434c0.192,0.548,0.288,1.142,0.288,1.782c0,0.624-0.096,1.206-0.288,1.746c-0.191,0.54-0.468,1.01-0.828,1.41c-0.359,0.4-0.8,0.714-1.319,0.942c-0.521,0.228-1.112,0.342-1.776,0.342c-0.656,0-1.246-0.114-1.77-0.342c-0.524-0.228-0.967-0.542-1.326-0.942c-0.36-0.4-0.637-0.87-0.828-1.41c-0.192-0.54-0.288-1.122-0.288-1.746C28.236,3.885,28.332,3.29,28.524,2.742z M30.246,5.574c0.084,0.34,0.218,0.646,0.402,0.918c0.184,0.272,0.424,0.49,0.72,0.654s0.656,0.246,1.08,0.246s0.784-0.082,1.08-0.246s0.536-0.382,0.72-0.654c0.185-0.272,0.318-0.578,0.402-0.918c0.084-0.34,0.126-0.69,0.126-1.05c0-0.376-0.042-0.74-0.126-1.092s-0.218-0.666-0.402-0.942c-0.184-0.276-0.424-0.496-0.72-0.66s-0.656-0.246-1.08-0.246s-0.784,0.082-1.08,0.246s-0.536,0.384-0.72,0.66c-0.185,0.276-0.318,0.59-0.402,0.942S30.12,4.148,30.12,4.524C30.12,4.884,30.162,5.234,30.246,5.574zM43.968,0.204v1.584h-4.14v1.98h3.588v1.464h-3.588v3.54h-1.884V0.204H43.968z M51.083,0.204v1.584h-4.14v1.98h3.588v1.464h-3.588v3.54h-1.884V0.204H51.083z";
+    -fx-padding: 4.5 25.5 4.5 25.5;
+}
+.settings .check-box > .box {
+    -fx-padding: 5px 5px 5px 7px;
+    -fx-background-color:
+        -fx-shadow-highlight-color,
+        -fx-outer-border,
+        -fx-inner-border,
+        -fx-body-color,
+        linear-gradient(to bottom, derive(-fx-outer-border, -20%), -fx-outer-border),
+        linear-gradient(to bottom, derive(-fx-color, -22%) 0%, derive(-fx-color, -13%) 20%, derive(-fx-color, -11%) 50%);
+    -fx-background-insets: 0 0 -1 0, 0, 1, 2, 0 0 0 30, 1 1 1 31;
+    -fx-background-radius: 3px, 3px, 2px, 1px, 0 2px 2px 0, 0 1 1 0;
+}
+.settings .check-box:selected > .box {
+    -fx-background-color:
+        -fx-shadow-highlight-color,
+        -fx-outer-border,
+        -fx-inner-border,
+        -fx-body-color,
+        linear-gradient(to bottom, derive(-fx-outer-border, -20%), -fx-outer-border),
+        linear-gradient(to bottom, derive(-fx-default-button, -12%) 0%, derive(-fx-default-button, -3%) 20%, derive(-fx-default-button, -1%) 50%);
+
+    -fx-background-insets: 0 0 -1 0, 0, 1, 2, 0 32 0 0, 1 33 1 1;
+    -fx-background-radius: 3px, 3px, 2px, 1px, 2px 0 0 2px, 1 0 0 1;
+}
+.settings .check-box:focused > .box {
+    -fx-background-color:
+        -fx-focus-color,
+        -fx-inner-border,
+        -fx-body-color,
+        linear-gradient(to bottom, derive(-fx-outer-border, -20%), -fx-outer-border),
+        linear-gradient(to bottom, derive(-fx-color, -22%) 0%, derive(-fx-color, -13%) 20%, derive(-fx-color, -11%) 50%);
+    -fx-background-insets: -0.2, 1, 2, 1 1 1 30, 1 1 1 31;
+    -fx-background-radius: 3px, 2px, 1px, 0 2px 2px 0, 0 1 1 0;
+}
+.settings .check-box:focused:selected > .box {
+    -fx-background-color:
+        -fx-focus-color,
+        -fx-inner-border,
+        -fx-body-color,
+        linear-gradient(to bottom, derive(-fx-outer-border, -20%), -fx-outer-border),
+        linear-gradient(to bottom, derive(-fx-default-button, -12%) 0%, derive(-fx-default-button, -3%) 20%, derive(-fx-default-button, -1%) 50%);
+    -fx-background-insets: -0.2, 1, 2, 1 32 1 1, 1 33 1 1;
+    -fx-background-radius: 3px, 2px, 1px, 2px 0 0 2px, 1 0 0 1;
+}
+#playControls * {
+    -fx-content-display: graphic-only;
+}
+#playControls > * > Pane {
+    -fx-background-color: white,#666;
+    -fx-background-insets: 1 0 -1 0, 0;
+}
+#playControls > #startBtn > Pane {
+    -fx-shape: "M27.05,532h-0.782c-0.333,0-0.602,0.273-0.602,0.61v14.659c0,0.338,0.269,0.61,0.602,0.61h0.782c0.332,0,0.602-0.272,0.602-0.61V532.61C27.652,532.273,27.382,532,27.05,532zM38.9,532l-9.263,7.94l9.263,7.939V532z";
+}
+#playControls > #rwBtn > Pane {
+    -fx-shape: "M64.866,531.999l-8.818,7.965l8.818,7.964v-6.796l7.301,6.796v-15.929l-7.301,6.797V531.999z";
+}
+#playControls > #playBtn:selected  > Pane {
+    -fx-shape: "M20.716,531.999c-0.665,0-1.204,0.542-1.204,1.212v13.328c0,0.671,0.539,1.213,1.204,1.213h2.188c0.665,0,1.203-0.542,1.203-1.213v-13.328c0-0.67-0.538-1.212-1.203-1.212H20.716zM10.87,531.999c-0.665,0-1.204,0.542-1.204,1.212v13.328c0,0.671,0.539,1.213,1.204,1.213h2.188c0.665,0,1.203-0.542,1.203-1.213v-13.328c0-0.67-0.539-1.212-1.203-1.212H10.87z";
+}
+#playControls > #playBtn> Pane {
+    -fx-shape: "M0,531.999l8.667,8L0,548V531.999z";
+}
+#playControls > #ffBtn > Pane {
+    -fx-shape: "M82.09,532v6.606L74.833,532v15.832l7.257-6.606v6.606l8.576-7.916L82.09,532z";
+}
+#playControls > #endBtn > Pane {
+    -fx-shape: "M52.525,532c-0.333,0-0.602,0.273-0.602,0.611v14.669c0,0.337,0.27,0.611,0.602,0.611h0.782c0.333,0,0.602-0.274,0.602-0.611v-14.669c0-0.338-0.27-0.611-0.602-0.611H52.525zM40.667,532v15.892l9.27-7.946L40.667,532z";
+}
+.tool-bar #loopBtn Pane {
+    -fx-shape: "M103.31,539.442v-2.544h-6.487c-0.907,0-1.646,0.738-1.646,1.646v1.637l-2.512,2.526v-4.163c0-2.296,1.861-4.157,4.157-4.157h6.487v-2.392l4.034,3.724L103.31,539.442z M92.753,544.033l4.034,3.725v-2.393h6.487c2.296,0,4.157-1.861,4.157-4.157v-4.163l-2.512,2.526v1.637c0,0.907-0.738,1.646-1.646,1.646h-6.487v-2.544L92.753,544.033z";
+}
+.timeline-display {
+    -fx-font-size: 10px;
+    -fx-font-weight: bold;
+    -fx-padding: 6 6 4 6;
+}
+.timeline-display .background {
+    -fx-background-color: white,#b8c3a6;
+    -fx-background-insets: 1 0 -1 0,0;
+    -fx-background-radius: 6, 6;
+    -fx-effect: innershadow(gaussian, #52574abb, 5, 0, 0, 2);
+}
+.timeline-display Text {
+    -fx-fill: #52574a;
+}
+.timeline-display .bar {
+    -fx-border-color: #52574a;
+}
+.timeline-display .progress {
+    -fx-background-color: #52574a;
+}
\ No newline at end of file
--- a/build.gradle	Wed Jul 03 08:46:25 2013 -0400
+++ b/build.gradle	Wed Jul 03 11:19:19 2013 -0700
@@ -96,18 +96,6 @@
 }
 
 /**
- * Converts the simple name of a library to the full name. For example, on mac
- * the simple name "glass" becomes "libglass.dylib". On Linux or Solaris, it would
- * be "libglass.so", and on Windows "glass.dll".
- *
- * @param name The simple name of the library
- * @return The name of the shared library file
- */
-String library(String name) {
-    return "${IS_WINDOWS ? '' : 'lib'}$name.${IS_WINDOWS ? 'dll' : IS_MAC ? 'dylib' : 'so'}"
-}
-
-/**
  * Converts cygwin style paths to windows style paths, but with a forward slash.
  * This method is safe to call from any platform, and will only do work if
  * called on Windows (in all other cases it simply returns the supplied path.
@@ -649,13 +637,22 @@
     // For each compile target, create a javah / cc / link triplet
     compileTargets { t ->
         def targetProperties = project.rootProject.ext[t.upper]
+        def library = targetProperties.library
         def properties = targetProperties.get(name)
         def nativeDir = file("$nativeRootDir/${t.name}")
         def headerDir = file("$headerRootDir/${t.name}")
         def javahTask = project.task("javah${t.capital}${capitalName}", type: JavaHeaderTask, dependsOn: project.classes, group: "Build") {
             description = "Generates JNI Headers for ${name} for ${t.name}"
-            source(project.sourceSets.main.output.classesDir)
-            classpath = project.files(project.sourceSets.main.output.classesDir)
+            if (properties.javahSource == null) {
+                source(project.sourceSets.main.output.classesDir)
+            } else {
+                source(properties.javahSource)
+            }
+            if (properties.javahClasspath == null) {
+                classpath = project.files(project.sourceSets.main.output.classesDir)
+            } else {
+                classpath = project.files(properties.javahClasspath)
+            }
             if (rootProject.BINARY_STUB != null) classpath += rootProject.BINARY_STUB
             output = headerDir
             include(properties.javahInclude)
@@ -1043,6 +1040,7 @@
         def upperTarget = t.upper
         def capitalTarget = t.capital
         def properties = rootProject.ext[upperTarget];
+        def library = properties.library
 
         def ccTask = task("compileDecoraNativeShaders$capitalTarget", type: CCTask, dependsOn: generateDecoraNativeHeaders) {
             description = "Compiles Decora SSE natives"
@@ -1640,6 +1638,7 @@
 
 compileTargets { t ->
     def targetProperties = project.ext[t.upper]
+    def library = targetProperties.library
     // The jfxrt task is responsible for creating the jfxrt.jar. A developer may
     // have multiple SDK's on their system at any one time, depending on which
     // cross compiles they have done. For example, I might have:
@@ -1691,20 +1690,14 @@
             // TODO instead of using copy everywhere, I probably want to use "sync" instead?
             // Copy all of the .dll / .so / .dylib native libraries into build/sdk/rt/lib/
             copy {
-                from("modules/graphics/build/libs/jsl-decora/${t.name}/${library(targetProperties.decora.lib)}",
-                     "modules/graphics/build/libs/prism/${t.name}/${library(targetProperties.prism.lib)}",
-                     "modules/graphics/build/libs/prismSW/${t.name}/${library(targetProperties.prismSW.lib)}",
-                     "modules/graphics/build/libs/font/${t.name}/${library(targetProperties.font.lib)}",
-                     "modules/graphics/build/libs/iio/${t.name}/${library(targetProperties.iio.lib)}");
-                def es2Variants = targetProperties.prismES2.containsKey("variants") ? targetProperties.prismES2.variants : [""];
-                es2Variants.each { variant ->
-                    def variantProperties = variant == "" ? targetProperties.prismES2 : targetProperties.prismES2.get(variant)
-                    from ("modules/graphics/build/libs/prismES2/${t.name}/${library(variantProperties.lib)}");
-                }
-                def glassVariants = targetProperties.glass.containsKey("variants") ? targetProperties.glass.variants : [""];
-                glassVariants.each { variant ->
-                    def variantProperties = variant == "" ? targetProperties.glass : targetProperties.glass.get(variant)
-                    from ("modules/graphics/build/libs/glass/${t.name}/${library(variantProperties.lib)}");
+                from("modules/graphics/build/libs/jsl-decora/${t.name}/${library(targetProperties.decora.lib)}")
+                ['font', 'prism', 'prismSW', 'prismES2', 'glass', 'iio'].each { lib ->
+                    def variants = targetProperties[lib].containsKey('variants') ? targetProperties[lib].variants : [null]
+                    variants.each { variant ->
+                        def variantProperties = variant ? targetProperties[lib][variant] : targetProperties[lib]
+                        println "modules/graphics/build/libs/$lib/$t.name/${library(variantProperties.lib)}"
+                        from ("modules/graphics/build/libs/$lib/$t.name/${library(variantProperties.lib)}")
+                    }
                 }
                 if (IS_WINDOWS) {
                     from ("modules/graphics/build/libs/prismD3D/${t.name}/${library(targetProperties.prismD3D.lib)}");
@@ -2267,15 +2260,6 @@
                     it.enabled = false
                 }
             }
-
-            if (BUILD_CLOSED && srcdir.exists()) {
-                def cptask = project.task('copyAppsArtifacts', type: Copy ) {
-                    dependsOn project.getPath() + ":jar"
-                    from project.jar.archivePath
-                    into "$rootProject.jfxArtifactsDir/apps/ga-samples"
-                }
-                rootProject.apps.dependsOn(cptask)
-            }
         }
     }
 }
--- a/buildSrc/.classpath	Wed Jul 03 08:46:25 2013 -0400
+++ b/buildSrc/.classpath	Wed Jul 03 11:19:19 2013 -0700
@@ -9,7 +9,6 @@
   <classpathentry kind="lib" exported="true" path="../.libs/plugin.jar"/>
   <classpathentry kind="lib" exported="true" path="../.libs/stringtemplate-3.2.jar"/>
   <classpathentry kind="lib" exported="true" path="../.libs/swt.jar"/>
-  <classpathentry kind="lib" exported="true" path="../../caches/sdk/rt/lib/ext/jfxrt.jar"/>
   <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
   <classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
   <classpathentry kind="output" path="bin"/>
--- a/buildSrc/android.gradle	Wed Jul 03 08:46:25 2013 -0400
+++ b/buildSrc/android.gradle	Wed Jul 03 11:19:19 2013 -0700
@@ -46,13 +46,21 @@
     return "android-" + max
 }
 
-ext.ANDROID = [:]
-
 def closedDir = file("$projectDir/../rt-closed")
 
 defineProperty("ANDROID_CROSS_TOOLS_VER", "arm-linux-androideabi-4.4.3")
 defineProperty("ARM_ARCH", "armeabi")//armeabi-v7
 
+ANDROID = [:]
+ANDROID.compileSwing = false;
+ANDROID.compileSWT = false;
+ANDROID.compileFXPackager = false;
+ANDROID.compileDesignTime = false;
+ANDROID.glassPlatform = "android"
+ANDROID.armArch = "${ARM_ARCH}"
+ANDROID.libDest = "lib/${ANDROID.armArch}"
+ANDROID.jfxdvklib = "jfxdvk.jar"
+
 // Look for the the Android SDK & NDK to use, as well as the compiler stuff
 def sdk = project.hasProperty("ANDROID_SDK") ? getLatestPlatform("$ANDROID_SDK") : null;
 def ndk = project.hasProperty("ANDROID_NDK") ? getLatestPlatform("$ANDROID_NDK") : null;
@@ -87,17 +95,17 @@
         sourceCompatibility = JavaVersion.VERSION_1_6
         targetCompatibility = JavaVersion.VERSION_1_6
         options.bootClasspath = "${ANDROID_SDK}/platforms/${ANDROID_SDK_TARGET}/android.jar"
-        classpath = files("build/classes/main")
-        destinationDir = file("build/classes/main")
+        classpath = files("build/classes/android")
+        destinationDir = file("build/classes/android")
         dependencyCacheDir = file("build/dependency-cache")
-        source "src/main/android"
+        source "src/android/java"
     }
 
     task jarDalvikLibs(type: Jar, group: "Build", dependsOn: compileDalvikLibs) {
         description = "Creates jfxdvk.jar with all dalvik based classes."
         archiveName = "jfxdvk.jar"
         includeEmptyDirs = false
-        from("build/classes/main")
+        from("build/classes/android")
         include("com/oracle/dalvik/**/*")
         dependsOn(compileDalvikLibs)
     }
@@ -115,11 +123,13 @@
                 copy {
                     from(
                          "modules/graphics/build/libs/vmlauncher/android/${library(props.vmlauncher.lib)}",
-                         "modules/graphics/build/libs/surface/android/${library(props.surface.lib)}",
-                         "modules/graphics/build/libs/${props.jfxdvklib}"
-                    );
-                    def libDest = props.libDest
-                    into ("build/android-sdk/dalvik")
+                         "modules/graphics/build/libs/surface/android/${library(props.surface.lib)}"                         
+                    )                    
+                    into ("build/android-sdk/dalvik/${props.libDest}")
+                }
+                copy {
+                    from ("modules/graphics/build/libs/${props.jfxdvklib}")
+                    into ("build/android-sdk/dalvik/lib")
                 }
             }
         }
@@ -129,65 +139,63 @@
 project(":web") {
     apply plugin: 'java'
 
-    sourceSets {
-        android {
-            java {
-                //srcDir 'src/android/java'
-                srcDir '${closedDir}/javafx-android/webnode/src'
-            }
-        }
-    }
-
     compileJava {
         enabled = false
     }
 
     afterEvaluate {
-        configure(compileAndroidJava, { t ->
-                t.classpath = files(
-                    project(":graphics").sourceSets.main.output.classesDir,
-                    project(":base").sourceSets.main.output.classesDir
-                )
-                t.dependsOn(project(":graphics").classes, project(":base").classes)
-            })
+        def compileWebJavaAndroid = task("compileWebJavaAndroid",
+            type: JavaCompile, group: "Build") {
+            
+            dependsOn(project(":graphics").classes, project(":base").classes)
+            description = "Task compiles web component for Android."
+            classpath = files(
+                project(":graphics").sourceSets.main.output.classesDir,
+                project(":base").sourceSets.main.output.classesDir
+            )
+            destinationDir = file("modules/web/build/classes/android")
+            dependencyCacheDir = file("modules/web/build/dependency-cache")
+            source file("${closedDir}/javafx-android/webnode/src")
+        }
+
+        def jarWebJavaAndroid = task("jarWebJavaAndroid",
+            type: Jar, group: "Build") {
+            description = "Creates web.jar for Android."
+            dependsOn(compileWebJavaAndroid)
+            archiveName = "web.jar"
+            includeEmptyDirs = false
+            destinationDir = project.file("build/libs/android")
+            from("build/classes/android")
+        }
 
         addNative(project, "webview")
         addNative(project, "dvkwebview")
-        javahAndroidWebview.dependsOn(compileAndroidJava)
-        javahAndroidDvkwebview.dependsOn(compileAndroidJava)
+        javahAndroidWebview.dependsOn(compileWebJavaAndroid)
+        javahAndroidDvkwebview.dependsOn(compileWebJavaAndroid)
 
         jfxrtAndroid {
             from "modules/web/build/classes/android"
         }
 
-        sdkAndroid << {
-            def props = project.ext["ANDROID"]
-            copy {
-                from(
-                     "modules/web/build/libs/webview/android/${library(props.webview.lib)}"
-                )
-                def libDest = props.libDest
-                into ("build/android-sdk/rt/$libDest")
-            }
-            copy {
-                from(
-                    "modules/web/build/libs/dvkwebview/android/${library(props.dvkwebview.lib)}"
-                )
-                def libDest = props.libDest
-                into ("build/android-sdk/dalvik")
+        sdkAndroid  {
+            dependsOn(jarWebJavaAndroid)
+            doLast {
+                def props = project.ext["ANDROID"]
+                copy {
+                    from(
+                         "modules/web/build/libs/dvkwebview/android/${library(props.dvkwebview.lib)}"
+                    )                    
+                    into ("build/android-sdk/dalvik/${props.libDest}")
+                }
+                copy {
+                    from ("modules/web/build/libs/webview/android/${library(props.webview.lib)}")
+                    into ("build/android-sdk/rt/${props.libDest}")
+                }
             }
         }
     }
 }
 
-ANDROID.compileSwing = false;
-ANDROID.compileSWT = false;
-ANDROID.compileFXPackager = false;
-ANDROID.compileDesignTime = false;
-ANDROID.glassPlatform = "android"
-ANDROID.armArch = "${ARM_ARCH}"
-ANDROID.libDest = "lib/${ANDROID.armArch}"
-ANDROID.jfxdvklib = "jfxdvk.jar"
 
 ANDROID.jfxrtJarExcludes = [
     "**/*.hlsl",
@@ -226,6 +234,8 @@
 android.com.sun.javafx.isEmbedded=true
 """
 
+ANDROID.library = { name -> return "lib${name}.so" as String }
+
 def ccFlags = ["-std=c99", "-DANDROID", "-c", "-nostdlib", "-DANDROID_NDK"]
 def ccOptFlags = ["-fpic", "-ffunction-sections", "-funwind-tables","-fstack-protector",
                   "-Os", "-O2", "-fno-strict-aliasing", "-finline-limit=64", "-fomit-frame-pointer"]
@@ -241,18 +251,19 @@
 
 
 ANDROID.vmlauncher = [:]
-ANDROID.vmlauncher.classpath =
-files("${ANDROID_SDK}/platforms/${ANDROID_SDK_TARGET}/android.jar",
-      "modules/graphics/build/classes/main")
+ANDROID.vmlauncher.classpath = files("${ANDROID_SDK}/platforms/${ANDROID_SDK_TARGET}/android.jar",
+                                     "modules/graphics/build/classes/android")
 
-ANDROID.vmlauncher.javahClasspath = "${ANDROID_SDK}/platforms/${ANDROID_SDK_TARGET}/android.jar"
+ANDROID.vmlauncher.javahSource = files("modules/graphics/build/classes/android")
+ANDROID.vmlauncher.javahClasspath = files("modules/graphics/build/classes/android",
+                                          "${ANDROID_SDK}/platforms/${ANDROID_SDK_TARGET}/android.jar")
 ANDROID.vmlauncher.javahInclude = [
     "com/oracle/dalvik/*"
 ]
 ANDROID.vmlauncher.nativeSource = [
-    file("modules/graphics/src/main/native-android/VMLauncher.c"),
-    file("modules/graphics/src/main/native-android/NativePipeReader.c"),
-    file("modules/graphics/src/main/native-android/DalvikProxySelector.c")
+    file("modules/graphics/src/android/native/VMLauncher.c"),
+    file("modules/graphics/src/android/native/NativePipeReader.c"),
+    file("modules/graphics/src/android/native/DalvikProxySelector.c")
 ]
 ANDROID.vmlauncher.compiler = compiler
 ANDROID.vmlauncher.linker = linker
@@ -276,7 +287,8 @@
 ANDROID.surface.linkFlags = [linkFlags, "-ldl", "-landroid", "-llog"].flatten()
 
 ANDROID.webview = [:]
-ANDROID.webview.sourceSet = "android"
+ANDROID.webview.javahSource = files("modules/web/build/classes/android")
+ANDROID.webview.javahClasspath = files("modules/web/build/classes/android")
 ANDROID.webview.javahInclude = [
     "com/sun/webkit/NativeWebView.class"
 ]
@@ -292,7 +304,8 @@
 ANDROID.webview.linkFlags = [linkFlags, "-ldl", "-llog"].flatten()
 
 ANDROID.dvkwebview = [:]
-ANDROID.dvkwebview.sourceSet = "android"
+ANDROID.dvkwebview.javahSource = files("modules/web/build/classes/android")
+ANDROID.dvkwebview.javahClasspath = files("modules/web/build/classes/android")
 ANDROID.dvkwebview.javahInclude = [
     "com/sun/webkit/NativeWebView.class"
 ]
--- a/buildSrc/armv6hf.gradle	Wed Jul 03 08:46:25 2013 -0400
+++ b/buildSrc/armv6hf.gradle	Wed Jul 03 11:19:19 2013 -0700
@@ -42,6 +42,9 @@
     return;
 }
 
+// Lambda for naming the generated libs
+ARMv6HF.library = { name -> return "lib${name}.so" as String }
+
 // alias for this platform in legacy artifacts
 ARMV6HF.artifactsName = "armv6hf-vfp"
 
--- a/buildSrc/armv6sf.gradle	Wed Jul 03 08:46:25 2013 -0400
+++ b/buildSrc/armv6sf.gradle	Wed Jul 03 11:19:19 2013 -0700
@@ -41,6 +41,9 @@
     return;
 }
 
+// Lambda for naming the generated libs
+ARMv6SF.library = { name -> return "lib${name}.so" as String }
+
 // alias for this platform in legacy artifacts
 ARMV6SF.artifactsName = "armv6-vfp"
 
--- a/buildSrc/ios.gradle	Wed Jul 03 08:46:25 2013 -0400
+++ b/buildSrc/ios.gradle	Wed Jul 03 11:19:19 2013 -0700
@@ -34,6 +34,9 @@
 IOS.compileFXPackager = false;
 IOS.compileDesignTime = false;
 
+// Lambda for naming the generated libs
+IOS.library = { name -> return "lib${name}.a" as String }
+
 IOS.libDest = "lib"
 
 IOS.jfxrtJarExcludes = [
--- a/buildSrc/linux.gradle	Wed Jul 03 08:46:25 2013 -0400
+++ b/buildSrc/linux.gradle	Wed Jul 03 11:19:19 2013 -0700
@@ -66,6 +66,9 @@
     "com/sun/prism/es2/MacGL*",
 ]
 
+// Lambda for naming the generated libs
+LINUX.library = { name -> return "lib${name}.so" as String }
+
 // A set of common parameters to use for both compiling and linking
 def commonFlags = [
         "-fno-strict-aliasing", "-fPIC", "-fno-omit-frame-pointer", // optimization flags
--- a/buildSrc/mac.gradle	Wed Jul 03 08:46:25 2013 -0400
+++ b/buildSrc/mac.gradle	Wed Jul 03 11:19:19 2013 -0700
@@ -34,6 +34,9 @@
 MAC.compileFXPackager = true;
 MAC.compileDesignTime = true;
 
+// Lambda for naming the generated libs
+MAC.library = { name -> return "lib${name}.dylib" as String }
+
 MAC.libDest = "lib"
 MAC.jfxrtJarExcludes = [
     "**/*.hlsl",
--- a/buildSrc/win.gradle	Wed Jul 03 08:46:25 2013 -0400
+++ b/buildSrc/win.gradle	Wed Jul 03 11:19:19 2013 -0700
@@ -33,6 +33,9 @@
 WIN.compileFXPackager = true;
 WIN.compileDesignTime = true;
 
+// Lambda for naming the generated libs
+WIN.library = { name -> return "${name}.dll" as String }
+
 WIN.libDest = "bin"
 WIN.jfxrtJarExcludes = [
     "com/sun/glass/events/mac",
--- a/idea/.idea/.name	Wed Jul 03 08:46:25 2013 -0400
+++ b/idea/.idea/.name	Wed Jul 03 11:19:19 2013 -0700
@@ -1,1 +1,1 @@
-javafx
\ No newline at end of file
+rt
\ No newline at end of file
--- a/idea/web.iml	Wed Jul 03 08:46:25 2013 -0400
+++ b/idea/web.iml	Wed Jul 03 11:19:19 2013 -0700
@@ -5,6 +5,7 @@
     <content url="file://$MODULE_DIR$/../modules/web">
       <sourceFolder url="file://$MODULE_DIR$/../modules/web/src/main/java" isTestSource="false" />
       <sourceFolder url="file://$MODULE_DIR$/../modules/web/src/main/native/WebKitBuild/Release/WebCore/generated/java" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/../modules/web/src/main/resources" isTestSource="false" />
       <excludeFolder url="file://$MODULE_DIR$/../modules/web/build" />
     </content>
     <orderEntry type="sourceFolder" forTests="false" />
@@ -12,6 +13,15 @@
     <orderEntry type="module" module-name="controls" exported="" />
     <orderEntry type="module" module-name="media" exported="" />
     <orderEntry type="inheritedJdk" />
+    <orderEntry type="module-library" exported="">
+      <library>
+        <CLASSES>
+          <root url="jar://$MODULE_DIR$/../../caches/sdk/rt/lib/ext/jfxrt.jar!/" />
+        </CLASSES>
+        <JAVADOC />
+        <SOURCES />
+      </library>
+    </orderEntry>
   </component>
 </module>
 
--- a/modules/base/.classpath	Wed Jul 03 08:46:25 2013 -0400
+++ b/modules/base/.classpath	Wed Jul 03 11:19:19 2013 -0700
@@ -1,9 +1,23 @@
 <classpath>
-  <classpathentry kind="src" path="build/generated-src/version-info"/>
-  <classpathentry kind="src" path="src/main/java"/>
-  <classpathentry kind="src" path="src/test/java"/>
-  <classpathentry exported="true" kind="src" path="/buildSrc"/>
-  <classpathentry exported="true" kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+  <classpathentry kind="output" path="bin"/>
+  <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
   <classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
-  <classpathentry kind="output" path="bin"/>
+  <classpathentry kind="src" exported="true" path="src/main/java"/>
+  <classpathentry kind="src" exported="true" path="src/test/java">
+  <attributes>
+      <attribute name="optional" value="true"/>
+    </attributes>
+  </classpathentry>
+  <classpathentry kind="src" exported="true" path="src/main/resources">
+  <attributes>
+      <attribute name="optional" value="true"/>
+    </attributes>
+  </classpathentry>
+  <classpathentry kind="src" exported="true" path="src/test/resources">
+  <attributes>
+      <attribute name="optional" value="true"/>
+    </attributes>
+  </classpathentry>
+  <classpathentry kind="src" exported="true" path="build/generated-src/version-info"/>
+  <classpathentry kind="src" exported="true" path="/buildSrc"/>
 </classpath>
--- a/modules/base/src/main/java/com/sun/javafx/binding/ExpressionHelper.java	Wed Jul 03 08:46:25 2013 -0400
+++ b/modules/base/src/main/java/com/sun/javafx/binding/ExpressionHelper.java	Wed Jul 03 11:19:19 2013 -0700
@@ -249,7 +249,7 @@
                             final InvalidationListener[] oldListeners = invalidationListeners;
                             if (locked) {
                                 invalidationListeners = new InvalidationListener[invalidationListeners.length];
-                                System.arraycopy(oldListeners, 0, invalidationListeners, 0, index+1);
+                                System.arraycopy(oldListeners, 0, invalidationListeners, 0, index);
                             }
                             if (numMoved > 0) {
                                 System.arraycopy(oldListeners, index+1, invalidationListeners, index, numMoved);
@@ -309,7 +309,7 @@
                             final ChangeListener<? super T>[] oldListeners = changeListeners;
                             if (locked) {
                                 changeListeners = new ChangeListener[changeListeners.length];
-                                System.arraycopy(oldListeners, 0, changeListeners, 0, index+1);
+                                System.arraycopy(oldListeners, 0, changeListeners, 0, index);
                             }
                             if (numMoved > 0) {
                                 System.arraycopy(oldListeners, index+1, changeListeners, index, numMoved);
--- a/modules/base/src/main/java/com/sun/javafx/collections/ListListenerHelper.java	Wed Jul 03 08:46:25 2013 -0400
+++ b/modules/base/src/main/java/com/sun/javafx/collections/ListListenerHelper.java	Wed Jul 03 11:19:19 2013 -0700
@@ -224,7 +224,7 @@
                             final InvalidationListener[] oldListeners = invalidationListeners;
                             if (locked) {
                                 invalidationListeners = new InvalidationListener[invalidationListeners.length];
-                                System.arraycopy(oldListeners, 0, invalidationListeners, 0, index+1);
+                                System.arraycopy(oldListeners, 0, invalidationListeners, 0, index);
                             }
                             if (numMoved > 0) {
                                 System.arraycopy(oldListeners, index+1, invalidationListeners, index, numMoved);
@@ -281,7 +281,7 @@
                             final ListChangeListener<? super E>[] oldListeners = changeListeners;
                             if (locked) {
                                 changeListeners = new ListChangeListener[changeListeners.length];
-                                System.arraycopy(oldListeners, 0, changeListeners, 0, index+1);
+                                System.arraycopy(oldListeners, 0, changeListeners, 0, index);
                             }
                             if (numMoved > 0) {
                                 System.arraycopy(oldListeners, index+1, changeListeners, index, numMoved);
--- a/modules/base/src/main/java/com/sun/javafx/collections/MapListenerHelper.java	Wed Jul 03 08:46:25 2013 -0400
+++ b/modules/base/src/main/java/com/sun/javafx/collections/MapListenerHelper.java	Wed Jul 03 11:19:19 2013 -0700
@@ -223,7 +223,7 @@
                             final InvalidationListener[] oldListeners = invalidationListeners;
                             if (locked) {
                                 invalidationListeners = new InvalidationListener[invalidationListeners.length];
-                                System.arraycopy(oldListeners, 0, invalidationListeners, 0, index+1);
+                                System.arraycopy(oldListeners, 0, invalidationListeners, 0, index);
                             }
                             if (numMoved > 0) {
                                 System.arraycopy(oldListeners, index+1, invalidationListeners, index, numMoved);
@@ -280,7 +280,7 @@
                             final MapChangeListener<? super K, ? super V>[] oldListeners = changeListeners;
                             if (locked) {
                                 changeListeners = new MapChangeListener[changeListeners.length];
-                                System.arraycopy(oldListeners, 0, changeListeners, 0, index+1);
+                                System.arraycopy(oldListeners, 0, changeListeners, 0, index);
                             }
                             if (numMoved > 0) {
                                 System.arraycopy(oldListeners, index+1, changeListeners, index, numMoved);
--- a/modules/base/src/main/java/com/sun/javafx/collections/SetListenerHelper.java	Wed Jul 03 08:46:25 2013 -0400
+++ b/modules/base/src/main/java/com/sun/javafx/collections/SetListenerHelper.java	Wed Jul 03 11:19:19 2013 -0700
@@ -223,7 +223,7 @@
                             final InvalidationListener[] oldListeners = invalidationListeners;
                             if (locked) {
                                 invalidationListeners = new InvalidationListener[invalidationListeners.length];
-                                System.arraycopy(oldListeners, 0, invalidationListeners, 0, index+1);
+                                System.arraycopy(oldListeners, 0, invalidationListeners, 0, index);
                             }
                             if (numMoved > 0) {
                                 System.arraycopy(oldListeners, index+1, invalidationListeners, index, numMoved);
@@ -280,7 +280,7 @@
                             final SetChangeListener<? super E>[] oldListeners = changeListeners;
                             if (locked) {
                                 changeListeners = new SetChangeListener[changeListeners.length];
-                                System.arraycopy(oldListeners, 0, changeListeners, 0, index+1);
+                                System.arraycopy(oldListeners, 0, changeListeners, 0, index);
                             }
                             if (numMoved > 0) {
                                 System.arraycopy(oldListeners, index+1, changeListeners, index, numMoved);
--- a/modules/controls/.classpath	Wed Jul 03 08:46:25 2013 -0400
+++ b/modules/controls/.classpath	Wed Jul 03 11:19:19 2013 -0700
@@ -1,10 +1,22 @@
 <classpath>
-  <classpathentry kind="src" path="src/main/java"/>
-  <classpathentry kind="src" path="src/main/resources"/>
-  <classpathentry kind="src" path="src/test/java"/>
-  <classpathentry kind="src" path="src/test/resources"/>
-  <classpathentry exported="true" kind="src" path="/graphics"/>
-  <classpathentry exported="true" kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
   <classpathentry kind="output" path="bin"/>
+  <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
   <classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
+  <classpathentry kind="src" exported="true" path="src/main/java"/>
+  <classpathentry kind="src" exported="true" path="src/test/java">
+  <attributes>
+      <attribute name="optional" value="true"/>
+    </attributes>
+  </classpathentry>
+  <classpathentry kind="src" exported="true" path="src/main/resources">
+  <attributes>
+      <attribute name="optional" value="true"/>
+    </attributes>
+  </classpathentry>
+  <classpathentry kind="src" exported="true" path="src/test/resources">
+  <attributes>
+      <attribute name="optional" value="true"/>
+    </attributes>
+  </classpathentry>
+  <classpathentry kind="src" exported="true" path="/graphics"/>
 </classpath>
--- a/modules/designTime/.classpath	Wed Jul 03 08:46:25 2013 -0400
+++ b/modules/designTime/.classpath	Wed Jul 03 11:19:19 2013 -0700
@@ -1,8 +1,22 @@
 <classpath>
-  <classpathentry kind="src" path="src/main/java"/>
-  <classpathentry kind="src" path="src/test/java"/>
-  <classpathentry exported="true" kind="src" path="/graphics"/>
-  <classpathentry exported="true" kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
   <classpathentry kind="output" path="bin"/>
+  <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
   <classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
+  <classpathentry kind="src" exported="true" path="src/main/java"/>
+  <classpathentry kind="src" exported="true" path="src/test/java">
+  <attributes>
+      <attribute name="optional" value="true"/>
+    </attributes>
+  </classpathentry>
+  <classpathentry kind="src" exported="true" path="src/main/resources">
+  <attributes>
+      <attribute name="optional" value="true"/>
+    </attributes>
+  </classpathentry>
+  <classpathentry kind="src" exported="true" path="src/test/resources">
+  <attributes>
+      <attribute name="optional" value="true"/>
+    </attributes>
+  </classpathentry>
+  <classpathentry kind="src" exported="true" path="/graphics"/>
 </classpath>
--- a/modules/fxml/.classpath	Wed Jul 03 08:46:25 2013 -0400
+++ b/modules/fxml/.classpath	Wed Jul 03 11:19:19 2013 -0700
@@ -1,9 +1,22 @@
 <classpath>
-  <classpathentry kind="src" path="src/main/java"/>
-  <classpathentry kind="src" path="src/test/java"/>
-  <classpathentry kind="src" path="src/test/resources"/>
-  <classpathentry exported="true" kind="src" path="/controls"/>
-  <classpathentry exported="true" kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
   <classpathentry kind="output" path="bin"/>
+  <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
   <classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
+  <classpathentry kind="src" exported="true" path="src/main/java"/>
+  <classpathentry kind="src" exported="true" path="src/test/java">
+  <attributes>
+      <attribute name="optional" value="true"/>
+    </attributes>
+  </classpathentry>
+  <classpathentry kind="src" exported="true" path="src/main/resources">
+  <attributes>
+      <attribute name="optional" value="true"/>
+    </attributes>
+  </classpathentry>
+  <classpathentry kind="src" exported="true" path="src/test/resources">
+  <attributes>
+      <attribute name="optional" value="true"/>
+    </attributes>
+  </classpathentry>
+  <classpathentry kind="src" exported="true" path="/controls"/>
 </classpath>
--- a/modules/fxpackager/.classpath	Wed Jul 03 08:46:25 2013 -0400
+++ b/modules/fxpackager/.classpath	Wed Jul 03 11:19:19 2013 -0700
@@ -1,8 +1,22 @@
 <classpath>
-  <classpathentry kind="src" path="src/main/java"/>
-  <classpathentry kind="src" path="src/main/resources"/>
-  <classpathentry exported="true" kind="src" path="/graphics"/>
-  <classpathentry exported="true" kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+  <classpathentry kind="output" path="bin"/>
+  <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
   <classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
-  <classpathentry kind="output" path="bin"/>
+  <classpathentry kind="src" exported="true" path="src/main/java"/>
+  <classpathentry kind="src" exported="true" path="src/test/java">
+  <attributes>
+      <attribute name="optional" value="true"/>
+    </attributes>
+  </classpathentry>
+  <classpathentry kind="src" exported="true" path="src/main/resources">
+  <attributes>
+      <attribute name="optional" value="true"/>
+    </attributes>
+  </classpathentry>
+  <classpathentry kind="src" exported="true" path="src/test/resources">
+  <attributes>
+      <attribute name="optional" value="true"/>
+    </attributes>
+  </classpathentry>
+  <classpathentry kind="src" exported="true" path="/graphics"/>
 </classpath>
--- a/modules/graphics/.classpath	Wed Jul 03 08:46:25 2013 -0400
+++ b/modules/graphics/.classpath	Wed Jul 03 11:19:19 2013 -0700
@@ -1,22 +1,34 @@
 <classpath>
-  <classpathentry kind="src" path="src/main/java"/>
-  <classpathentry kind="src" path="src/main/resources"/>
-  <classpathentry kind="src" path="src/stub/java"/>
-  <classpathentry kind="src" path="src/stub/resources"/>
-  <classpathentry kind="src" path="src/test/java"/>
-  <classpathentry kind="src" path="src/test/resources"/>
-  <classpathentry exported="true" kind="src" path="/base"/>
-  <classpathentry exported="true" kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
   <classpathentry kind="output" path="bin"/>
-  <classpathentry kind="src" exported="true" path="/builders"/>
+  <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+  <classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
+  <classpathentry kind="src" exported="true" path="src/main/java"/>
+  <classpathentry kind="src" exported="true" path="src/test/java">
+  <attributes>
+      <attribute name="optional" value="true"/>
+    </attributes>
+  </classpathentry>
+  <classpathentry kind="src" exported="true" path="src/main/resources">
+  <attributes>
+      <attribute name="optional" value="true"/>
+    </attributes>
+  </classpathentry>
+  <classpathentry kind="src" exported="true" path="src/test/resources">
+  <attributes>
+      <attribute name="optional" value="true"/>
+    </attributes>
+  </classpathentry>
+  <classpathentry kind="src" exported="true" path="src/stub/java"/>
+  <classpathentry kind="src" exported="true" path="src/stub/resources"/>
   <classpathentry kind="src" exported="true" path="build/generated-src/jsl-decora"/>
   <classpathentry kind="src" exported="true" path="build/generated-src/jsl-prism"/>
   <classpathentry kind="src" exported="true" path="build/resources/jsl-decora"/>
   <classpathentry kind="src" exported="true" path="build/resources/jsl-prism"/>
+  <classpathentry kind="src" exported="true" path="/base"/>
+  <classpathentry kind="src" exported="true" path="/builders"/>
   <classpathentry kind="src" exported="true" path="/rt-closed">
     <attributes>
       <attribute name="optional" value="true"/>
     </attributes>
   </classpathentry>
-  <classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
 </classpath>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/modules/graphics/src/android/java/com/oracle/dalvik/AppDataInstaller.java	Wed Jul 03 11:19:19 2013 -0700
@@ -0,0 +1,209 @@
+/*
+ * 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.oracle.dalvik;
+
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipInputStream;
+
+import android.util.Log;
+import android.content.res.AssetManager;
+
+public class AppDataInstaller {
+    private static final String TAG = "AppDataInstaller";
+    
+   String       storageDir;
+    AssetManager assetManager;
+
+    public AppDataInstaller(String storageDir, AssetManager assetManager) {
+        this.storageDir = storageDir;
+        this.assetManager = assetManager;
+    }
+
+    public void handleAssetZipFile(String zipFileName, String dstDirName) {
+
+        try {
+            // Open the ZipInputStream
+            InputStream is = assetManager.open(zipFileName);
+            ZipInputStream zis = new ZipInputStream(is);
+
+            // Loop through all the files and folders
+            ZipEntry entry = null;
+            while ((entry = zis.getNextEntry()) != null) {
+                String innerFileName = dstDirName + File.separator 
+                    + entry.getName();
+                File innerFile = new File(innerFileName);
+                if (innerFile.exists()) {
+                    innerFile.delete();
+                }
+
+                if (entry.isDirectory()) {
+                    innerFile.mkdirs();
+                } else {
+                    // Create a file output stream
+                    FileOutputStream outputStream = 
+                        new FileOutputStream(innerFileName);
+                    final int BUFFER_SIZE = 2048;
+                    BufferedOutputStream bufferedOutputStream = 
+                        new BufferedOutputStream(outputStream, BUFFER_SIZE);
+
+                    // Write output
+                    int count = 0;
+                    byte[] data = new byte[BUFFER_SIZE];
+                    while ((count = zis.read(data, 0, BUFFER_SIZE)) != -1) {
+                        bufferedOutputStream.write(data, 0, count);
+                    }
+
+                    // Flush and close the buffers
+                    bufferedOutputStream.flush();
+                    bufferedOutputStream.close();
+                }
+
+                // Close the current entry
+                zis.closeEntry();
+            }
+            zis.close();
+        } catch (IOException e) {
+            Log.v(TAG, "handleAssetZipFile: IOException: " + e);
+            e.printStackTrace();
+        }
+    }
+
+    public void copyAssetsTree(String src, String dst) {
+        // scan assets
+        Log.v(TAG, "AppDataInstaller.copyAssetsTree(): copyDir: src=" 
+                           + src + " dst=" + dst);
+
+        try {
+            String[] fileList = assetManager.list(src);
+            Log.v(TAG, "Sample.onCreate: # of assets in " + src 
+                               + ": " + fileList.length);
+            if (fileList.length <= 0) {
+                // file
+                Log.v(TAG, "copyAssetsTree: Copy file " + src
+                                   + " to " + dst);
+
+                // TODO: copy
+                InputStream is = assetManager.open(src);
+                File dstFile = new File(dst);
+                OutputStream os = new FileOutputStream(dstFile);
+                final int BUFFER_SIZE = 2048;
+                BufferedOutputStream bufferedOutputStream = 
+                    new BufferedOutputStream(os, BUFFER_SIZE);
+
+                byte[] buf = new byte[BUFFER_SIZE];
+                int len;
+                while ((len = is.read(buf)) > 0) {
+                    bufferedOutputStream.write(buf, 0, len);
+                }
+                is.close();
+                // os.close();
+                bufferedOutputStream.flush();
+                bufferedOutputStream.close();
+            } else {
+                // dir
+                // create target directory
+                Log.v(TAG, 
+                     "copyAssetsTree: Creating dir: " + dst);
+                File dstFile = new File(dst);
+                if (dstFile.exists()) {
+                    if (dstFile.isDirectory()) {
+                        Log.v(TAG,
+                             "copyAssetsTree: " + dst + " already exists");
+                    } else {
+                        Log.v(TAG,
+                             "copyAssetsTree: " + dst + " exists but is not a dierctory");
+                        return;
+                    }
+                } else {
+                    if (!dstFile.mkdirs()) {
+                        Log.v(TAG,
+                             "copyAssetsTree: Failed creating dir: " + dst);
+                        return;
+                    } else {
+                    }
+                }
+
+                final String ZIPPED_RENAMED_JPG_SUFFIX = ".ZIPPED.RENAMED.jpg";
+                final String RENAMED_JPG_SUFFIX = ".RENAMED.jpg";
+                for (String fileName: fileList) {
+                    if (fileName.endsWith(ZIPPED_RENAMED_JPG_SUFFIX)) {
+                        String newSrc = src + "/" + fileName;
+                        handleAssetZipFile(newSrc, dst);
+                    } else if (fileName.length() > RENAMED_JPG_SUFFIX.length() 
+                               && fileName.endsWith(RENAMED_JPG_SUFFIX)) {
+                        String newSrc = src + "/" + fileName;
+                        String newDst = dst + "/" 
+                            + fileName.substring(0, fileName.length()
+                                                 - RENAMED_JPG_SUFFIX.length());
+                        copyAssetsTree(newSrc, newDst);
+                    } else { // normal file
+                        String newSrc = src + "/" + fileName;
+                        String newDst = dst + "/" + fileName;
+                        copyAssetsTree(newSrc, newDst);
+                    }
+                }
+            }
+        } catch (IOException e) {
+            Log.v(TAG,
+                 "copyAssetsTree: IOException: " + e);
+            e.printStackTrace();
+        }
+    }
+
+    public void install() {
+        String doneFileName = storageDir + "/installation.done";
+        File doneFile = new File(doneFileName);
+
+        if (doneFile.exists()) {
+            Log.v(TAG,
+                 "install: JVM data already installed. Skipping");
+        } else {
+            Log.v(TAG,
+                 "install: Installing JVM data");
+            copyAssetsTree("storage", storageDir);
+
+            // write done flag
+            Log.v(TAG,
+                 "install: Write file " + doneFileName);
+            try {
+                OutputStream os = new FileOutputStream(doneFile);
+                os.write(1);
+                os.close();
+            } catch (FileNotFoundException e) {
+                e.printStackTrace();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/modules/graphics/src/android/java/com/oracle/dalvik/FXActivity.java	Wed Jul 03 11:19:19 2013 -0700
@@ -0,0 +1,342 @@
+/*
+ * 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.oracle.dalvik;
+
+import java.io.File;
+import java.io.FilenameFilter;
+import java.util.ArrayList;
+import java.util.List;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.pm.ActivityInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.NameNotFoundException;
+import android.graphics.PixelFormat;
+import android.os.AsyncTask;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.KeyEvent;
+import android.view.MotionEvent;
+import android.view.Surface;
+import android.view.SurfaceHolder;
+import android.view.SurfaceView;
+import android.view.ViewGroup;
+import android.view.Window;
+import android.view.WindowManager;
+import android.view.inputmethod.InputMethodManager;
+import android.widget.FrameLayout;
+
+public class FXActivity extends Activity implements SurfaceHolder.Callback, 
+        SurfaceHolder.Callback2 {
+	
+    private static final String TAG     = "FXActivity";
+    private static final String TAG_JVM = "JVM";
+    private static final String JAR     = ".jar";
+    
+    private static final String META_DATA_MAIN_CLASS = "main.class";
+    private static final String META_DATA_JVM_ARGS   = "jvm.args";
+    private static final String META_DATA_APP_ARGS   = "app.args";
+    private static final String META_DATA_DEBUG_PORT = "debug.port";
+    private static final String ANDROID_WEBVIEW = "android_webview";
+    private static final String GLASS_LENS_ANDROID = "glass-lens-android";
+
+    static {        
+        System.loadLibrary("vmlauncher");
+    }
+    private static FXActivity instance;
+    private static FrameLayout mViewGroup;
+    private static SurfaceView mView;
+
+    private String            appDataDir;
+    private String            storageDir;    
+    private NativePipeReader  reader;
+    private InputMethodManager imm;   
+    private String ldPath;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+            super.onCreate(savedInstanceState);
+
+        getWindow().requestFeature(Window.FEATURE_NO_TITLE);
+        getWindow().setSoftInputMode(
+                WindowManager.LayoutParams.SOFT_INPUT_STATE_UNSPECIFIED
+                | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING);
+        getWindow().setFormat(PixelFormat.RGBA_8888);
+
+        imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
+
+        mView = new InternalSurfaceView(this);
+        mView.getHolder().addCallback(this);        
+        mViewGroup = new FrameLayout(this);
+        mViewGroup.addView(mView);
+        setContentView(mViewGroup);
+        instance = this;
+        reader = NativePipeReader.getDefaultReader(textListener);
+        reader.start();
+        initDirInfo();
+        installJVMIfNeeded();
+        System.loadLibrary(GLASS_LENS_ANDROID);
+        System.loadLibrary(ANDROID_WEBVIEW);
+    }
+
+    public static FXActivity getInstance() {
+        return instance;
+    }
+
+    public String getLDPath() {
+        if (appDataDir == null) {
+            appDataDir = this.getApplicationInfo().dataDir;
+        }
+        if (ldPath == null) {
+            ldPath = appDataDir + "/lib";
+        }
+        return ldPath;
+    }
+
+    public static ViewGroup getViewGroup() {
+        return mViewGroup;
+    }    
+	
+    @Override
+    public void surfaceCreated(SurfaceHolder holder) {
+            _surfaceChanged(holder.getSurface());
+    }
+
+    @Override
+    public void surfaceChanged(SurfaceHolder holder, int format, int width,
+                    int height) {
+            _surfaceChanged(holder.getSurface(), format, width, height);
+
+    }
+
+    @Override
+    public void surfaceDestroyed(SurfaceHolder holder) {
+            _surfaceChanged(null);
+    }
+
+    @Override
+    public void surfaceRedrawNeeded(SurfaceHolder holder) {
+            _surfaceRedrawNeeded(holder.getSurface());		
+    }
+
+    private native void _surfaceChanged(Surface surface);
+
+    private native void _surfaceChanged(Surface surface, int format, int width, int height);
+
+    private native void _surfaceRedrawNeeded(Surface surface);
+
+    private void showIME() {
+        mView.requestFocus();
+        imm.showSoftInput(mView, 0);
+    }
+
+    private void hideIME() {
+        mView.requestFocus();
+        imm.hideSoftInputFromWindow(mView.getWindowToken(), 0);
+    }
+
+    private void installJVMIfNeeded() {
+        new InstallerTask().execute();
+    }
+	
+    private void runJVM() {
+        Log.i(TAG, "Launch JVM + application");
+        JvmArgs args = new JvmArgs(appDataDir);
+        VMLauncher.initialize(args.getJavaHome());
+        VMLauncher.runOnDebugPort(args.getDebugPort(),
+                                  args.getArgArray());
+    }
+	
+    private class InstallerTask extends AsyncTask<Void, Void, Void> {
+        protected Void doInBackground(Void... args) {
+           Log.i(TAG, "Installing JVM");
+            AppDataInstaller installer = 
+                new AppDataInstaller(storageDir,
+                    FXActivity.this.getApplicationContext().getAssets());
+            installer.install();
+            return null;
+        }
+    protected void onPostExecute(Void result) {
+            runJVM();
+        }
+    }
+	
+    private NativePipeReader.OnTextReceivedListener textListener = 
+            new NativePipeReader.OnTextReceivedListener() {
+                public void onTextReceived(String text) {
+                    Log.v(TAG_JVM, text);
+                }
+            };
+
+    private void initDirInfo() {
+        if (appDataDir == null) {
+            appDataDir = this.getApplicationInfo().dataDir;
+        }
+        storageDir = appDataDir + "/storage";
+    }
+	
+    private class JvmArgs {
+        private List<String> argList = new ArrayList<String>();
+        private String javaHome;
+
+        public JvmArgs(String appDir) {
+            String jvmRunCommand =
+                   "-Djava.library.path="
+                     + appDir + "/lib|"
+                     + "-Djava.home="
+                     + appDir + "/storage/jvm|"
+                     + "-Dsun.boot.library.path="
+                     + appDir + "/storage/jvm/lib|"
+                     + "-cp|"
+                     + getClasspath(appDir)
+                     + "|"                                         
+                     + "-Djavafx.platform=android|"
+                     + "-Djavafx.runtime.path="
+                     + appDir +"/storage/lib|"
+                     + getCustomJVMArgs()
+                     + "|"
+                     + getMainClass()
+                     + "|"
+                     + getApplicationArgs();
+
+            createArgList(jvmRunCommand);
+        }
+
+        private String[] listFiles(String dir, final String suffix) {
+            File dirf = new File(dir);
+            if (!dirf.exists()) {
+                return new String[]{};
+            }
+            String[] files = dirf.list(new FilenameFilter() {           
+                @Override
+                public boolean accept(File dir, String filename) {      
+                    return filename.endsWith(suffix);
+                }
+            });
+            return files;
+        }
+
+        private String getClasspath(String appDir) {
+            final String libDir = appDir + "/storage/lib/";
+            String[] libfiles = listFiles(libDir, JAR);
+            if (libfiles.length == 0) {
+                return "";
+            }
+            StringBuilder sb = new StringBuilder();
+            for(String file: libfiles) {
+                sb.append(libDir);
+                sb.append(file);
+                sb.append(File.pathSeparatorChar);
+            }
+            int len = sb.length();
+            return sb.substring(0, len - 1);
+        }
+
+        private String getMainClass() {
+             return getMetadata().getString(META_DATA_MAIN_CLASS);
+        }
+
+        private String getCustomJVMArgs() {
+             return getMetadata().getString(META_DATA_JVM_ARGS);
+        }
+
+        private String getApplicationArgs() {
+             return getMetadata().getString(META_DATA_APP_ARGS);
+        }
+
+        private int getDebugPort() {            
+             return getMetadata().getInt(META_DATA_DEBUG_PORT, 0);
+        }
+
+        private Bundle getMetadata() {
+            try {
+                ActivityInfo ai = FXActivity.this.getPackageManager().getActivityInfo(
+                        getIntent().getComponent(), PackageManager.GET_META_DATA);
+                return ai.metaData;
+
+            } catch(NameNotFoundException e) {
+                throw new RuntimeException("Error getting activity info", e);
+            }
+        }
+
+        public void createArgList(String args) {
+            if (args != null) {
+                String sep = (args.contains("|")) ? "\\|" : " ";
+                for (String arg : args.split(sep)) {
+                    arg = arg.trim();
+                    if (arg.length() > 0) {
+                        this.argList.add(arg);
+                        if (javaHome == null) {
+                            String[] pair = arg.split("\\=");
+                            Log.v(TAG, "arg = " + arg);
+                            Log.v(TAG, "pair.length = " + pair.length);
+                            if (pair.length == 2) {
+                                if ("-Djava.home".equals(pair[0])) {
+                                    Log.v(TAG, "Setting javaHome to " + pair[1]);
+                                    javaHome = pair[1];
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        
+        public String[] getArgArray() {
+            return argList.toArray(new String[0]);
+        }
+
+        public String getJavaHome() {
+           return javaHome;
+        }
+    }
+	
+    class InternalSurfaceView extends SurfaceView {
+
+        public InternalSurfaceView(Context context) {
+            super(context);
+            setFocusableInTouchMode(true);
+        }
+
+        @Override
+        public boolean dispatchTouchEvent(MotionEvent event) {
+            onTouchEventNative(event.getAction(), (int) event.getX(), (int) event.getY());
+            return true;
+        }
+
+        @Override
+        public boolean dispatchKeyEvent(KeyEvent event) {
+            onKeyEventNative(event.getAction(), event.getKeyCode(), event.getCharacters());
+            return true;
+        }
+
+        private native void onTouchEventNative(int action, int absx, int absy);
+
+        private native void onKeyEventNative(int action, int keycode, String characters);
+
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/modules/graphics/src/android/java/com/oracle/dalvik/InternalWebView.java	Wed Jul 03 11:19:19 2013 -0700
@@ -0,0 +1,324 @@
+/*
+ * 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.oracle.dalvik;
+
+import android.graphics.Bitmap;
+import android.util.Log;
+import android.view.Gravity;
+import android.view.View;
+import android.view.ViewGroup;
+import android.webkit.WebChromeClient;
+import android.webkit.WebSettings;
+import android.webkit.WebView;
+import android.webkit.WebViewClient;
+import android.widget.FrameLayout;
+import java.util.ArrayList;
+import java.util.List;
+
+public class InternalWebView {
+
+    public final static int PAGE_STARTED = 0;
+    public final static int PAGE_FINISHED = 1;
+    public final static int PAGE_REDIRECTED = 2;
+    public final static int LOAD_FAILED = 5;
+    public final static int LOAD_STOPPED = 6;
+    public final static int CONTENT_RECEIVED = 10;
+    public final static int TITLE_RECEIVED = 11;
+    public final static int ICON_RECEIVED = 12;
+    public final static int CONTENTTYPE_RECEIVED = 13;
+    public final static int DOCUMENT_AVAILABLE = 14;
+    public final static int RESOURCE_STARTED = 20;
+    public final static int RESOURCE_REDIRECTED = 21;
+    public final static int RESOURCE_FINISHED = 22;
+    public final static int RESOURCE_FAILED = 23;
+    public final static int PROGRESS_CHANGED = 30;
+    private static final String TAG = "InternalWebView";
+    private static List<InternalWebView> views = new ArrayList<InternalWebView>();
+    private static int idcounter = 0;
+    private boolean isLayedOut = false;
+    private boolean initialized = false;
+    private int internalID;
+    private int x, y, width, height;
+    private WebView nativeWebView;
+    private String url, content;
+    private String contentType = "text/html";
+    private String encoding = "base64";
+    private boolean visible;
+
+    public InternalWebView() {
+        this.internalID = ++idcounter;
+        views.add(0, this);
+    }
+
+    public int getInternalID() {
+        return this.internalID;
+    }
+
+    private void initialize() {
+        nativeWebView = new WebView(FXActivity.getInstance()) {
+            @Override
+            protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+                setMeasuredDimension(width, height);
+            }
+        };
+        nativeWebView.setWebViewClient(new WebViewClient() {
+            @Override
+            public boolean shouldOverrideUrlLoading(WebView view, String url) {
+                view.loadUrl(url);
+                return true;
+            }
+
+            @Override
+            public void onPageStarted(WebView view, String url, Bitmap favicon) {
+                fireLoadEvent(0, PAGE_STARTED, url, contentType, -1, -1);
+            }
+
+            @Override
+            public void onPageFinished(WebView view, String url) {
+                fireLoadEvent(0, PAGE_FINISHED, url, contentType, -1, -1);
+            }
+
+            @Override
+            public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
+                fireLoadEvent(0, LOAD_FAILED, failingUrl, contentType, -1, errorCode);
+            }
+        });
+
+        nativeWebView.setWebChromeClient(new WebChromeClient() {
+            @Override
+            public void onProgressChanged(WebView view, int newProgress) {
+                fireLoadEvent(0, PROGRESS_CHANGED, url, contentType, newProgress, -1);
+            }
+        });
+
+        WebSettings settings = nativeWebView.getSettings();
+        settings.setSupportZoom(true);
+        settings.setJavaScriptEnabled(true);
+
+        initialized = true;        
+    }
+
+    private void fireLoadEvent(int frameID, int state, String url,
+            String content_type, int progress, int errorCode) {
+        _fireLoadEvent(this.internalID, frameID, state,
+                url == null ? "" : url,
+                content_type == null ? "" : content_type,
+                progress, errorCode);
+    }
+
+    private static int indexOf(long id) {
+        int i = 0;
+        for (InternalWebView wvp : views) {
+            if (id == wvp.internalID) {
+                return i;
+            }
+            i++;
+        }
+        return -1;
+    }
+
+    private static InternalWebView getViewByID(int id) {
+        for (InternalWebView wvp : views) {
+            if (id == wvp.internalID) {
+                return wvp;
+            }
+        }
+        throw new RuntimeException("No InternalWebView with id: " + id);
+    }
+
+    static void createNew() {
+        FXActivity.getInstance().runOnUiThread(new Runnable() {
+            public void run() {
+                new InternalWebView().getInternalID();
+            }
+        });
+    }
+
+    static void loadUrl(int id, String url) {
+        final InternalWebView iwv = InternalWebView.getViewByID(id);
+        iwv.setContent(null, null);
+        iwv.setUrl(url);
+        if (iwv.initialized && iwv.isLayedOut) {
+            FXActivity.getInstance().runOnUiThread(new Runnable() {
+                public void run() {
+                    int c = FXActivity.getViewGroup().getChildCount();                    
+                    iwv.nativeWebView.loadUrl(iwv.url);
+                }
+            });
+        }
+    }
+
+    static void loadContent(int id, String content, String contentType) {
+        final InternalWebView iwv = InternalWebView.getViewByID(id);
+        iwv.setUrl(null);
+        iwv.setContent(content, contentType);
+        if (iwv.initialized && iwv.isLayedOut) {
+            FXActivity.getInstance().runOnUiThread(new Runnable() {
+                public void run() {                    
+                    iwv.nativeWebView.loadData(iwv.content, iwv.contentType, iwv.encoding);
+                }
+            });
+        }
+    }
+
+    static void setEncoding(int id, String encoding) {
+        final InternalWebView iwv = InternalWebView.getViewByID(id);
+        iwv.setEncoding(encoding);
+    }
+
+    static void moveAndResize(int id, int x, int y, final int w, final int h) {
+        final boolean move;
+        final boolean resize;        
+
+        if (w == 0 || h == 0) {
+            return;
+        }
+
+        final InternalWebView iwv = InternalWebView.getViewByID(id);
+        if (iwv == null) {
+            return;
+        }
+        if (iwv.x == x
+                && iwv.y == y
+                && iwv.width == w
+                && iwv.height == h) {
+            return;
+        }
+
+        move = (iwv.x != x || iwv.y != y);
+        if (move) {
+            iwv.x = x;
+            iwv.y = y;
+        }
+        resize = (iwv.width != w || iwv.height != h);
+        if (resize) {
+            iwv.width = w;
+            iwv.height = h;
+        }
+        if (!iwv.visible) {
+            return;
+        }
+        
+        if (!iwv.isLayedOut) {
+            iwv.isLayedOut = true;
+            FXActivity.getInstance().runOnUiThread(new Runnable() {
+                public void run() {
+                    if (!iwv.initialized) {
+                        iwv.initialize();
+                    }
+                    FrameLayout.LayoutParams layout = new FrameLayout.LayoutParams(
+                            ViewGroup.LayoutParams.WRAP_CONTENT,
+                            ViewGroup.LayoutParams.WRAP_CONTENT,
+                            Gravity.NO_GRAVITY);
+                    layout.leftMargin = iwv.x;
+                    layout.topMargin = iwv.y;
+//                    iwv.nativeWebView.setTranslationX(iwv.x);
+//                    iwv.nativeWebView.setTranslationY(iwv.y);
+                    FXActivity.getViewGroup().addView(iwv.nativeWebView, layout);
+                    Log.v(TAG, String.format("WebView added to ViewGroup [x: %d, y: %d , w: %d h: %d]",
+                            iwv.x, iwv.y, iwv.width, iwv.height));
+                    if (iwv.contentType == null || iwv.contentType.length() == 0) {
+                        iwv.contentType = "text/html";
+                    }
+                    if (iwv.url != null && iwv.url.length() > 0) {
+                        Log.v(TAG, "Loading url: " + iwv.url);
+                        iwv.nativeWebView.loadUrl(iwv.url);
+                    } else if (iwv.content != null) {                        
+                        Log.v(TAG, String.format("Loading content: %s\ncontent type: %s\nencoding: %s",
+                                iwv.content, iwv.contentType, iwv.encoding));
+                        iwv.nativeWebView.loadData(iwv.content, iwv.contentType, iwv.encoding);
+                    }
+                }
+            });
+
+        }// end of not initialized
+        else {
+            FXActivity.getInstance().runOnUiThread(new Runnable() {
+                public void run() {
+                    if (move) {
+                        FrameLayout.LayoutParams layout =
+                                (FrameLayout.LayoutParams) iwv.nativeWebView.getLayoutParams();
+                        layout.leftMargin = iwv.x;
+                        layout.topMargin = iwv.y;
+                        FXActivity.getViewGroup().updateViewLayout(iwv.nativeWebView, layout);
+//                        iwv.nativeWebView.setTranslationX(iwv.x);
+//                        iwv.nativeWebView.setTranslationY(iwv.y);
+                    }
+                    if (move || resize) {
+                        iwv.nativeWebView.invalidate();
+                    }                    
+                }
+            });
+        }        
+    }
+
+    static void setVisible(int id, final boolean visible) {
+        final InternalWebView iwv = InternalWebView.getViewByID(id);
+        if (iwv == null) {
+            return;
+        }
+        if (!iwv.initialized) {
+            iwv.visible = visible;
+            return;
+        }
+        FXActivity.getInstance().runOnUiThread(new Runnable() {
+            public void run() {
+                iwv.nativeWebView.setVisibility(visible ? View.VISIBLE : View.GONE);
+                if (visible) {
+                    iwv.nativeWebView.invalidate();
+                }
+            }
+        });
+    }
+
+    static void dispose(int id) {
+        final InternalWebView iwv = InternalWebView.getViewByID(id);
+        InternalWebView.setVisible(id, false);
+
+        FXActivity.getInstance().runOnUiThread(new Runnable() {
+            public void run() {
+                iwv.nativeWebView.stopLoading();
+                iwv.nativeWebView.destroy();
+            }
+        });
+        views.remove(iwv);
+    }
+
+    private void setUrl(String url) {
+        this.url = url;
+    }
+
+    private void setContent(String content, String contentType) {
+        this.content = content;
+        this.contentType = contentType;
+    }
+
+    private void setEncoding(String encoding) {
+        this.encoding = encoding;
+    }
+
+    private native void _fireLoadEvent(int id, int frameID, int state, String url,
+            String contentType, int progress, int errorCode);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/modules/graphics/src/android/java/com/oracle/dalvik/MainActivity.java	Wed Jul 03 11:19:19 2013 -0700
@@ -0,0 +1,258 @@
+/*
+ * 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.oracle.dalvik;
+
+import java.io.File;
+import java.io.FilenameFilter;
+import java.util.ArrayList;
+import java.util.List;
+
+import android.app.Activity;
+import android.app.NativeActivity;
+import android.content.pm.ActivityInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.NameNotFoundException;
+import android.graphics.PixelFormat;
+import android.graphics.drawable.ColorDrawable;
+import android.os.AsyncTask;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.KeyEvent;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.Window;
+import android.view.WindowManager;
+
+
+public class MainActivity extends NativeActivity {
+
+    public static final String  TAG     = "MainActivity";
+    private static final String TAG_JVM = "JVM";
+    private static final String JAR     = ".jar";
+
+    private static final String META_DATA_MAIN_CLASS = "main.class";
+    private static final String META_DATA_JVM_ARGS   = "jvm.args";
+    private static final String META_DATA_APP_ARGS   = "app.args";
+    private static final String META_DATA_DEBUG_PORT = "debug.port";
+
+    private String                  appDataDir;
+    private String                  storageDir;    
+    private NativePipeReader        reader;
+    
+    private ViewGroup mViewGroup;
+    private View      mView;
+
+    static {
+        // load npr and vmlauncher
+        System.loadLibrary("vmlauncher");
+    }
+        
+    private NativePipeReader.OnTextReceivedListener textListener = 
+            new NativePipeReader.OnTextReceivedListener() {
+                public void onTextReceived(String text) {
+                    Log.v(TAG_JVM, text);
+                }
+            };
+
+    private void initDirInfo() {
+        appDataDir = this.getApplicationInfo().dataDir;
+        storageDir = appDataDir + "/storage";
+    }
+
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        getWindow().setFormat(PixelFormat.RGBA_8888);
+        getWindow().setSoftInputMode(
+                WindowManager.LayoutParams.SOFT_INPUT_STATE_UNSPECIFIED
+              | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING);
+
+        mViewGroup = (ViewGroup)getWindow().getDecorView()
+                    .findViewById(Window.ID_ANDROID_CONTENT);
+        mView = mViewGroup.getChildAt(0);
+        mView.setFocusableInTouchMode(true);
+
+        reader = NativePipeReader.getDefaultReader(textListener);
+        reader.start();
+        initDirInfo();
+        installJVMIfNeeded();
+    }
+
+    @Override
+    public boolean dispatchKeyEvent(KeyEvent event) {
+    	if (event.getAction() == KeyEvent.ACTION_MULTIPLE) {
+    		if (event.getKeyCode() == KeyEvent.KEYCODE_UNKNOWN) {
+    			Log.w(TAG, "KeyEvent (MULTIPLE) :" + event.getCharacters());
+    			Log.w(TAG, "Predictive text (T9) not supported!");
+    		}
+    	}
+    	return super.dispatchKeyEvent(event);
+    }
+    
+    private void installJVMIfNeeded() {
+        new InstallerTask().execute();
+    }
+
+    private void runJVM() {
+        Log.i(TAG, "Launch JVM + application");
+        JvmArgs args = new JvmArgs(appDataDir);
+        VMLauncher.initialize(args.getJavaHome());
+        VMLauncher.runOnDebugPort(args.getDebugPort(),
+                                  args.getArgArray());
+    }
+
+    private class InstallerTask extends AsyncTask<Void, Void, Void> {
+        protected Void doInBackground(Void... args) {
+           Log.i(TAG, "Installing JVM");
+            AppDataInstaller installer = 
+                new AppDataInstaller(storageDir,
+                                     MainActivity.this.getApplicationContext().getAssets());
+            installer.install();
+            return null;
+        }
+        protected void onPostExecute(Void result) {
+           Log.i(TAG, "JVM Installed");
+            runJVM();
+        }
+    }
+
+
+    private class JvmArgs {
+        private List<String> argList = new ArrayList<String>();
+        private String javaHome;
+
+        public JvmArgs(String appDir) {
+            String jvmRunCommand =
+                   "-Djava.library.path="
+                     + appDir + "/lib|"
+                     + "-Djava.home="
+                     + appDir + "/storage/jvm|"
+                     + "-Dsun.boot.library.path="
+                     + appDir + "/storage/jvm/lib|"
+                     + "-cp|"
+                     + getClasspath(appDir)
+                     + "|"                                         
+                     + "-Djavafx.platform=android|"
+                     + "-Djavafx.runtime.path="
+                     + appDir +"/storage/lib|"
+                     + getCustomJVMArgs()
+                     + "|"
+                     + getMainClass()
+                     + "|"
+                     + getApplicationArgs();
+
+            createArgList(jvmRunCommand);
+        }
+
+        private String[] listFiles(String dir, final String suffix) {
+           File dirf = new File(dir);
+           if (!dirf.exists()) {
+               return new String[]{};
+           }
+           String[] files = dirf.list(new FilenameFilter() {           
+               @Override
+               public boolean accept(File dir, String filename) {      
+                   return filename.endsWith(suffix);
+               }
+           });
+           return files;
+       }
+
+       private String getClasspath(String appDir) {
+           final String libDir = appDir + "/storage/lib/";
+           String[] libfiles = listFiles(libDir, JAR);
+           if (libfiles.length == 0) {
+               return "";
+           }
+           StringBuilder sb = new StringBuilder();
+           for(String file: libfiles) {
+               sb.append(libDir);
+               sb.append(file);
+               sb.append(File.pathSeparatorChar);
+           }
+           int len = sb.length();
+           return sb.substring(0, len - 1);
+       }
+
+       private String getMainClass() {
+           return getMetadata().getString(META_DATA_MAIN_CLASS);
+       }
+
+       private String getCustomJVMArgs() {
+           return getMetadata().getString(META_DATA_JVM_ARGS);
+       }
+
+       private String getApplicationArgs() {
+           return getMetadata().getString(META_DATA_APP_ARGS);
+       }
+
+       private int getDebugPort() {            
+           return getMetadata().getInt(META_DATA_DEBUG_PORT, 0);
+       }
+
+       private Bundle getMetadata() {
+           try {
+               ActivityInfo ai = MainActivity.this.getPackageManager().getActivityInfo(
+                       getIntent().getComponent(), PackageManager.GET_META_DATA);
+               return ai.metaData;
+               
+           } catch(NameNotFoundException e) {
+               throw new RuntimeException("Error getting activity info", e);
+           }
+       }
+
+        public void createArgList(String args) {
+            if (args != null) {
+                String sep = (args.contains("|")) ? "\\|" : " ";
+                for (String arg : args.split(sep)) {
+                    arg = arg.trim();
+                    if (arg.length() > 0) {
+                        this.argList.add(arg);
+                        if (javaHome == null) {
+                            String[] pair = arg.split("\\=");
+                            Log.v(TAG, "arg = " + arg);
+                            Log.v(TAG, "pair.length = " + pair.length);
+                            if (pair.length == 2) {
+                                if ("-Djava.home".equals(pair[0])) {
+                                    Log.v(TAG, "Setting javaHome to " + pair[1]);
+                                    javaHome = pair[1];
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        public String[] getArgArray() {
+            return argList.toArray(new String[0]);
+        }
+
+        public String getJavaHome() {
+           return javaHome;
+        }
+
+   }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/modules/graphics/src/android/java/com/oracle/dalvik/NativePipeReader.java	Wed Jul 03 11:19:19 2013 -0700
@@ -0,0 +1,156 @@
+/*
+ * 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.oracle.dalvik;
+
+import android.os.Handler;
+
+public class NativePipeReader extends Thread { 
+   
+    /**
+     * onTextReceived 
+     * callback to return read text from pipe 
+     * called on the same thread that NativePipeReader was 
+     * created on.
+     * 
+     * @param text
+     */
+    public interface OnTextReceivedListener {
+        public void onTextReceived(String text);
+    }
+
+    public interface Client extends OnTextReceivedListener {
+        /**
+         * initPipe 
+         * called to set up pipe and redirect 
+         * 
+         * @return int, fd of output end of pipe
+         */
+        public int initPipe();
+
+
+        public void onTextReceived(String text);
+
+        /**
+         * cleanupPipe 
+         * called after last data is read from pipe and thread 
+         * is about to exit
+         *
+         */
+        public void cleanupPipe();
+    }
+
+    private Client client;
+    private Handler handler;
+
+    public NativePipeReader(Client client) {
+        this.client = client;
+        this.handler = new Handler();    
+    }
+
+    private volatile boolean stop = false;
+
+    public void stopReading() {
+        stop = true;
+    }
+
+    public void run() {
+        int fd = client.initPipe();
+        while (!stop) {
+            String text = readPipe(fd);
+            if (text.length() > 0) {
+                // only notify client if we
+                // actually got something
+                client.onTextReceived(text);
+            }
+        }
+        client.cleanupPipe();
+    }
+
+    public static NativePipeReader 
+    getDefaultReader(OnTextReceivedListener listener) {
+        return new NativePipeReader(
+                                   new StdoutStderrClient(listener));
+    }
+
+    /**
+     * readPipe 
+     * native method to read text from the 
+     * pipe. 
+     * this method may(should) block
+     * 
+     * @return String 
+     */
+    private native String readPipe(int fd);
+
+    private static class StdoutStderrClient implements Client {
+
+        Handler handler;
+        OnTextReceivedListener listener;
+
+        public StdoutStderrClient(OnTextReceivedListener listener) {
+            this.handler = new Handler();
+            this.listener = listener;
+        }
+
+        private native int nativeInitPipe();
+        private native void nativeCleanupPipe();
+
+        /**
+         * initPipe
+         * called to set up pipe and redirect
+         *
+         * @return int, fd of read end of pipe
+         */
+        public int initPipe() {
+            return nativeInitPipe();
+        }
+
+        /**
+         * onTextReceived
+         * callback to return read text from pipe
+         * called on the same thread that NativePipeReader was
+         * created on.
+         *
+         * @param text
+         */
+        public void onTextReceived(final String text) {
+            handler.post(new Runnable() {
+                             public void run() {
+                                 listener.onTextReceived(text); 
+                             }
+                         });
+        }
+
+        /**
+         * cleanupPipe
+         * called after last data is read from pipe and thread
+         * is about to exit
+         */
+        public void cleanupPipe() {
+            nativeCleanupPipe();
+        }
+    }
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/modules/graphics/src/android/java/com/oracle/dalvik/VMLauncher.java	Wed Jul 03 11:19:19 2013 -0700
@@ -0,0 +1,140 @@
+/*
+ * 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.oracle.dalvik;
+
+import java.io.File;
+import java.io.FileReader;
+import java.io.Reader;
+import java.util.ArrayList;
+
+import android.util.Log;
+
+public class VMLauncher extends Thread {
+
+   private static final String TAG = "VMLauncher";
+    private static String sJavaHome;
+
+    private String[] args;
+
+    public static void initialize(String javaHome) {
+        if (javaHome != null) {
+            sJavaHome = javaHome;
+            loadNativeLibraries();
+        } else {
+            throw new NullPointerException();
+        }
+    }
+    
+    // java libs are located at architecture dependent 
+    // paths
+    // i386 for x86 arch
+    // arm  for ARM arch
+    public static String getJvmArch() {
+        String rawarch = System.getProperty("os.arch");
+        if (rawarch != null && rawarch.contains("86")) {
+            return "i386";
+        }
+        return "arm";
+    }
+
+    private static void loadNativeLibraries() {
+        System.load(sJavaHome + "/lib/" + getJvmArch() + "/client/libjvm.so");
+        System.load(sJavaHome + "/lib/" + getJvmArch() + "/jli/libjli.so");
+    }
+    
+    private static String getCmdLine() {
+        // /proc/self/cmdline contains apk
+        // package name
+        StringBuilder builder = new StringBuilder();
+        try {
+            Reader reader = new FileReader("/proc/self/cmdline");
+            int c = 0;
+            while ((c = reader.read()) > 0) {
+                builder.append((char)c);
+            }
+            reader.close();
+        } catch (Exception e) {
+            builder = new StringBuilder("dalvik.package");
+        }
+        return builder.toString();        
+    }
+
+    private static void listDirToStandardOut(String dirpath) {
+        File dir = new File(dirpath);
+        try {
+            for (File file : dir.listFiles()) {
+                if (file.isDirectory()) {
+                    listDirToStandardOut(file.getAbsolutePath());
+                }
+            }
+        } catch (Exception e) {
+            Log.e(TAG, "Exception listing dir " + dir);
+        }
+    }
+
+    private VMLauncher(String[] args) {
+        super("JVM");
+        this.args = args;
+    }
+
+    public void run()
+    {
+        launchJVM(this.args);
+    }
+
+    private static void startJavaInBackground(String[] args)
+    {
+        new VMLauncher(args).start();
+    }
+
+    public static void runOnDebugPort(Integer debugPort,
+                                      String[] args)
+    {
+        ArrayList<String> localArrayList = new ArrayList();
+        
+        // need to add apk pkg name to head of arg list
+        localArrayList.add(getCmdLine()); 
+        
+        if (debugPort.intValue() > 0) {
+            localArrayList.add("-Xdebug");
+            localArrayList.add("-agentlib:jdwp=server=y,suspend=y,transport=dt_socket,address=" + debugPort);
+        }
+
+        for (String arg : args) {
+            localArrayList.add(arg);
+        }
+
+        String[] processedArgs = localArrayList.toArray(new String[0]);
+
+        for (String arg : processedArgs) {
+            Log.v(TAG, "Processed JVM arg : " + arg);
+        }
+
+        startJavaInBackground(processedArgs);
+    }
+
+    private static native int launchJVM(String[] args);
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/modules/graphics/src/android/java/com/oracle/dalvik/net/DalvikProxySelector.java	Wed Jul 03 11:19:19 2013 -0700
@@ -0,0 +1,77 @@
+/*
+ * 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.oracle.dalvik.net;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.net.Proxy;
+import java.net.ProxySelector;
+import java.net.SocketAddress;
+import java.net.InetSocketAddress;
+import java.net.URI;
+
+
+public class DalvikProxySelector {
+    private String[] args;
+
+    private DalvikProxySelector(String[] args){
+        this.args = args;
+    }
+
+    //Result host and port are returned in a string in the format host:port
+    public static String[] getProxyForURL(String target) {
+        String[] proxyInfo = new String[0];
+        List<String> proxies = new ArrayList<String>();
+        URI uri = null;
+        try {
+            ProxySelector defaultProxySelector = ProxySelector.getDefault();
+            uri = new URI(target);
+            List<Proxy> proxyList = defaultProxySelector.select(uri);
+
+            Proxy proxy = proxyList.get(0);
+            if (proxy.equals(Proxy.NO_PROXY)) {
+                System.out.println("DalvikProxySelector.getProxyForURL(): No proxy found");
+                return null;
+            }
+            SocketAddress address = proxy.address();
+            InetSocketAddress inetSocketAddress = (InetSocketAddress) address;
+            String host = inetSocketAddress.getHostName();
+            int port = inetSocketAddress.getPort();
+            if (host == null) {
+                System.out.println("DalvikProxySelector.getProxyForURL(): No proxy found");
+                return null;
+            }
+
+            proxies.add(host);                      // even index, host
+            proxies.add(Integer.toString(port));    // odd index, port
+
+            System.out.println("DalvikProxySelector.getProxyForURL(): host=" + host + " port=" + port);
+            return proxies.toArray(new String[0]);
+        } catch (Exception e) {
+            System.out.println("DalvikProxySelector.getProxyForURL(): exception(ignored): " + e.toString());
+            return null;
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/modules/graphics/src/android/native/DalvikProxySelector.c	Wed Jul 03 11:19:19 2013 -0700
@@ -0,0 +1,67 @@
+/*
+ * 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 <jni.h>
+#include <android/log.h>
+#include "DalvikProxySelector.h"
+
+static jclass dalvikProxySelectorClass;
+static jmethodID getProxyMethodId;
+
+static jclass initDalvikProxySelectorClass(JNIEnv* env) {
+    jclass localClass = (*env)->FindClass(env, "com/oracle/dalvik/net/DalvikProxySelector");
+    dalvikProxySelectorClass = (jclass) (*env)->NewGlobalRef(env,localClass);
+    __android_log_print(3, "DalvikProxySelector", ">>> after FindClass DalvikProxySelectorClass = %x", dalvikProxySelectorClass);
+    if ((*env)->ExceptionCheck(env) == JNI_TRUE) {
+        __android_log_print(3, "DalvikProxySelector", ">>> initDalvikProxySelectorClass: ExceptionCheck = JNI_TRUE");
+        (*env)->ExceptionDescribe(env);
+        (*env)->ExceptionClear(env);
+    }
+    return dalvikProxySelectorClass;
+}
+
+static jmethodID initGetProxyMethod(JNIEnv* env, jclass clazz) {
+    getProxyMethodId = (*env)->GetStaticMethodID(env, clazz, "getProxyForURL", "(Ljava/lang/String;)[Ljava/lang/String;");
+    __android_log_print(3, "DalvikProxySelector", ">>> getProxyForURL: after GetStaticMethodID");
+    if ((*env)->ExceptionCheck(env) == JNI_TRUE) {
+        __android_log_print(3, "DalvikProxySelector", ">>> initGetProxyMethod: ExceptionCheck = JNI_TRUE");
+        (*env)->ExceptionDescribe(env);
+        (*env)->ExceptionClear(env);
+    }
+    return getProxyMethodId;
+}
+
+void initDalvikProxySelectorData(JNIEnv* env) {
+    jclass clazz = initDalvikProxySelectorClass(env);
+    initGetProxyMethod(env, clazz);
+}
+
+jclass getDalvikProxySelectorClass(void) {
+    return dalvikProxySelectorClass;
+}
+
+jmethodID getDPSGetProxyMethodID(void) {
+    return getProxyMethodId;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/modules/graphics/src/android/native/DalvikProxySelector.h	Wed Jul 03 11:19:19 2013 -0700
@@ -0,0 +1,34 @@
+/*
+ * 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 DALVIK_PROXY_SELECTOR_H
+#define DALVIK_PROXY_SELECTOR_H
+#include <jni.h>
+
+void initDalvikProxySelectorData(JNIEnv* env);
+jclass getDalvikProxySelectorClass(void);
+jmethodID getDPSGetProxyMethodID(void);
+
+#endif // DALVIK_PROXY_SELECTOR_H
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/modules/graphics/src/android/native/NativePipeReader.c	Wed Jul 03 11:19:19 2013 -0700
@@ -0,0 +1,96 @@
+/*
+ * 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 <unistd.h>
+#include <stdio.h>
+#include <android/log.h>
+#include "com_oracle_dalvik_NativePipeReader.h"
+#include "com_oracle_dalvik_NativePipeReader_StdoutStderrClient.h"
+
+#define NPR_BUF_SIZE 128
+static char buffer[NPR_BUF_SIZE + 1];
+static int readfd = -1;
+
+/*
+ * Class:     com_oracle_dalvik_NativePipeReader
+ * Method:    readPipe
+ * Signature: ()Ljava/lang/String;
+ */
+JNIEXPORT jstring JNICALL Java_com_oracle_dalvik_NativePipeReader_readPipe
+  (JNIEnv *env, jobject thiz, jint fd) {
+    int bytesread = -1;
+    if (fd >= 0) {
+        // read data from pipe (should block)
+        // __android_log_print(3, "NPR", "Calling read(%d)\n", fd);
+        bytesread = read((int)fd, buffer, NPR_BUF_SIZE);
+    }
+    if (bytesread > -1) {
+        buffer[bytesread] = '\0';
+        return (*env)->NewStringUTF(env, buffer);
+    } else {
+        buffer[0] = '\0';
+    }
+    // __android_log_print(3, "NPR", "Bytes read from pipe = %d\n", bytesread);
+    return (*env)->NewStringUTF(env, buffer);
+}
+
+/*
+ * Class:     com_oracle_dalvik_NativePipeReader_StdoutStderrClient
+ * Method:    nativeInitPipe
+ * Signature: ()I 
+ *  
+ * create a new pipe attaching stdout and stderr to the WRITE end 
+ *  
+ */
+JNIEXPORT jint JNICALL Java_com_oracle_dalvik_NativePipeReader_00024StdoutStderrClient_nativeInitPipe
+  (JNIEnv *env, jobject thiz) {
+    int fd[2];
+    int status = pipe(fd);
+    if (status >= 0) {
+        readfd = fd[0];
+        // we have the pipe now connect stdout/stderr
+        status = dup2(fd[1], STDOUT_FILENO); // connect stdin
+        // __android_log_print(3, "NPR", "connected stdout to pipe %d status = %d\n", fd[1], status);
+        status = dup2(fd[1], STDERR_FILENO); // connect sterr
+        if (status >= 0) {
+            status = fd[0];
+        }
+    }
+    // __android_log_print(3, "NPR", "nativeInitPipe f0 = %d f1 = %d status = =%d", fd[0], fd[1], status);
+    printf("nativeInitPipe f0 = %d f1 = %d status = =%d", fd[0], fd[1], status);
+    return status;
+}
+
+/*
+ * Class:     com_oracle_dalvik_NativePipeReader_StdoutStderrClient
+ * Method:    nativeCleanupPipe
+ * Signature: ()V 
+ *  
+ * Return stdout and stderr to previous settings and 
+ * shut down pipe 
+ *  
+ */
+JNIEXPORT void JNICALL Java_com_oracle_dalvik_NativePipeReader_00024StdoutStderrClient_nativeCleanupPipe
+  (JNIEnv *env, jobject thiz) {
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/modules/graphics/src/android/native/VMLauncher.c	Wed Jul 03 11:19:19 2013 -0700
@@ -0,0 +1,156 @@
+/*
+ * 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 <jni.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <android/log.h>
+#include <dlfcn.h>
+#include "DalvikProxySelector.h"
+#include "com_oracle_dalvik_VMLauncher.h"
+
+#define FULL_VERSION "1.7.0_04-ea-b19"
+#define DOT_VERSION "1.7.0_04"
+
+typedef jint JNI_CreateJavaVM_func(JavaVM **pvm, void **penv, void *args);
+
+typedef jint JLI_Launch_func(int argc, char ** argv, /* main argc, argc */
+        int jargc, const char** jargv,          /* java args */
+        int appclassc, const char** appclassv,  /* app classpath */
+        const char* fullversion,                /* full version defined */
+        const char* dotversion,                 /* dot version defined */
+        const char* pname,                      /* program name */
+        const char* lname,                      /* launcher name */
+        jboolean javaargs,                      /* JAVA_ARGS */
+        jboolean cpwildcard,                    /* classpath wildcard*/
+        jboolean javaw,                         /* windows-only javaw */
+        jint ergo                               /* ergonomics class policy */
+);
+
+JavaVM *dalvikJavaVMPtr = NULL;
+JNIEnv *dalvikJNIEnvPtr = NULL;
+
+jint JNI_OnLoad(JavaVM* vm, void* reserved)
+{
+    //Save dalvik global JavaVM pointer
+    dalvikJavaVMPtr = vm;
+    __android_log_print(3,"JVM", "JNI_OnLoad calling GetEnv()");
+    JNIEnv* env = NULL;
+    (*vm)->GetEnv(vm, (void**) &env, JNI_VERSION_1_4);
+    __android_log_print(3,"JVM", "JNI_OnLoad calling initDalvikProxySelectorData()");
+    initDalvikProxySelectorData(env);
+    __android_log_print(3,"JVM", "JNI_OnLoad returning()");
+    return JNI_VERSION_1_4;
+}
+
+static void logArgs(int argc, char** argv) {
+    int i;
+    
+    for (i = 0; i < argc; i++) {
+        __android_log_print(3,"JVM", "arg[%d]: %s", i, argv[i]);
+    }
+}
+
+static jint launchJVM(int argc, char** argv) {
+    logArgs(argc, argv);
+
+   void* libjli = dlopen("libjli.so", RTLD_LAZY | RTLD_GLOBAL);
+        __android_log_print(3,"JVM", "JLI lib = %x", (int)libjli);
+   if (NULL == libjli) {
+       return 0;
+   }
+        __android_log_print(3,"JVM", "Found JLI lib");
+
+   JLI_Launch_func *pJLI_Launch =
+          (JLI_Launch_func *)dlsym(libjli, "JLI_Launch");
+
+        __android_log_print(3,"JVM", "JLI_Launch = 0x%x", *(int*)&pJLI_Launch);
+
+   if (NULL == pJLI_Launch) {
+        __android_log_print(3,"JVM", "JLI_Launch = NULL");
+       return 0;
+   }
+
+        __android_log_print(3,"JVM", "Calling JLI_Launch");
+   return pJLI_Launch(argc, argv, 0, NULL, 0, NULL, FULL_VERSION,
+                          DOT_VERSION, *argv, *argv, JNI_FALSE, JNI_FALSE,
+                          JNI_FALSE, 0);
+}
+
+/*
+ * Class:     com_oracle_embedded_launcher_VMLauncher
+ * Method:    launchJVM
+ * Signature: ([Ljava/lang/String;)I
+ */
+JNIEXPORT jint JNICALL Java_com_oracle_dalvik_VMLauncher_launchJVM
+  (JNIEnv *env, jclass clazz, jobjectArray argsArray) {
+   jint res = 0;
+   char **argv = NULL;
+   int i;
+
+        // Save dalvik JNIEnv pointer for JVM launch thread
+        dalvikJNIEnvPtr = env;
+
+        if (argsArray == NULL) {
+          __android_log_print(3,"LaunchJVM", " args array null, returning ");
+       //handle error
+       return 0;
+   }
+
+   int argc = (*env)->GetArrayLength(env, argsArray);
+
+   argv = calloc( (argc+1), sizeof(jbyte*) );
+
+   //copy args
+   for (i = 0; i < argc; i++) {
+       jstring stringElement = (jstring) (*env)->GetObjectArrayElement(env, argsArray, i);
+       const jbyte *ansiString = (*env)->GetStringUTFChars(env, stringElement, NULL);
+       if (ansiString == NULL) {
+           //handle error
+           return 0;
+       }
+       argv[i] = calloc( (strlen(ansiString)+1), sizeof(jbyte) );
+       if (argv[i] == NULL) {
+           //handle error
+           return 0;
+       }
+       strcpy(argv[i], ansiString);
+       (*env)->ReleaseStringUTFChars(env, stringElement, (const char*)ansiString);
+   }
+   //add NULL element
+   argv[argc] = NULL;
+        __android_log_print(3,"LaunchJVM", " Done processing args ");
+
+   res = launchJVM(argc, argv);
+
+   //free args
+   for (i = 0; i < argc; i++) {
+       free(argv[i]);
+   }
+   free(argv);
+
+   return res;
+}
+
+
--- a/modules/graphics/src/main/android/com/oracle/dalvik/AppDataInstaller.java	Wed Jul 03 08:46:25 2013 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,209 +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.oracle.dalvik;
-
-import java.io.BufferedOutputStream;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipInputStream;
-
-import android.util.Log;
-import android.content.res.AssetManager;
-
-public class AppDataInstaller {
-    private static final String TAG = "AppDataInstaller";
-    
-   String       storageDir;
-    AssetManager assetManager;
-
-    public AppDataInstaller(String storageDir, AssetManager assetManager) {
-        this.storageDir = storageDir;
-        this.assetManager = assetManager;
-    }
-
-    public void handleAssetZipFile(String zipFileName, String dstDirName) {
-
-        try {
-            // Open the ZipInputStream
-            InputStream is = assetManager.open(zipFileName);
-            ZipInputStream zis = new ZipInputStream(is);
-
-            // Loop through all the files and folders
-            ZipEntry entry = null;
-            while ((entry = zis.getNextEntry()) != null) {
-                String innerFileName = dstDirName + File.separator 
-                    + entry.getName();
-                File innerFile = new File(innerFileName);
-                if (innerFile.exists()) {
-                    innerFile.delete();
-                }
-
-                if (entry.isDirectory()) {
-                    innerFile.mkdirs();
-                } else {
-                    // Create a file output stream
-                    FileOutputStream outputStream = 
-                        new FileOutputStream(innerFileName);
-                    final int BUFFER_SIZE = 2048;
-                    BufferedOutputStream bufferedOutputStream = 
-                        new BufferedOutputStream(outputStream, BUFFER_SIZE);
-
-                    // Write output
-                    int count = 0;
-                    byte[] data = new byte[BUFFER_SIZE];
-                    while ((count = zis.read(data, 0, BUFFER_SIZE)) != -1) {
-                        bufferedOutputStream.write(data, 0, count);
-                    }
-
-                    // Flush and close the buffers
-                    bufferedOutputStream.flush();
-                    bufferedOutputStream.close();
-                }
-
-                // Close the current entry
-                zis.closeEntry();
-            }
-            zis.close();
-        } catch (IOException e) {
-            Log.v(TAG, "handleAssetZipFile: IOException: " + e);
-            e.printStackTrace();
-        }
-    }
-
-    public void copyAssetsTree(String src, String dst) {
-        // scan assets
-        Log.v(TAG, "AppDataInstaller.copyAssetsTree(): copyDir: src=" 
-                           + src + " dst=" + dst);
-
-        try {
-            String[] fileList = assetManager.list(src);
-            Log.v(TAG, "Sample.onCreate: # of assets in " + src 
-                               + ": " + fileList.length);
-            if (fileList.length <= 0) {
-                // file
-                Log.v(TAG, "copyAssetsTree: Copy file " + src
-                                   + " to " + dst);
-
-                // TODO: copy
-                InputStream is = assetManager.open(src);
-                File dstFile = new File(dst);
-                OutputStream os = new FileOutputStream(dstFile);
-                final int BUFFER_SIZE = 2048;
-                BufferedOutputStream bufferedOutputStream = 
-                    new BufferedOutputStream(os, BUFFER_SIZE);
-
-                byte[] buf = new byte[BUFFER_SIZE];
-                int len;
-                while ((len = is.read(buf)) > 0) {
-                    bufferedOutputStream.write(buf, 0, len);
-                }
-                is.close();
-                // os.close();
-                bufferedOutputStream.flush();
-                bufferedOutputStream.close();
-            } else {
-                // dir
-                // create target directory
-                Log.v(TAG, 
-                     "copyAssetsTree: Creating dir: " + dst);
-                File dstFile = new File(dst);
-                if (dstFile.exists()) {
-                    if (dstFile.isDirectory()) {
-                        Log.v(TAG,
-                             "copyAssetsTree: " + dst + " already exists");
-                    } else {
-                        Log.v(TAG,
-                             "copyAssetsTree: " + dst + " exists but is not a dierctory");
-                        return;
-                    }
-                } else {
-                    if (!dstFile.mkdirs()) {
-                        Log.v(TAG,
-                             "copyAssetsTree: Failed creating dir: " + dst);
-                        return;
-                    } else {
-                    }
-                }
-
-                final String ZIPPED_RENAMED_JPG_SUFFIX = ".ZIPPED.RENAMED.jpg";
-                final String RENAMED_JPG_SUFFIX = ".RENAMED.jpg";
-                for (String fileName: fileList) {
-                    if (fileName.endsWith(ZIPPED_RENAMED_JPG_SUFFIX)) {
-                        String newSrc = src + "/" + fileName;
-                        handleAssetZipFile(newSrc, dst);
-                    } else if (fileName.length() > RENAMED_JPG_SUFFIX.length() 
-                               && fileName.endsWith(RENAMED_JPG_SUFFIX)) {
-                        String newSrc = src + "/" + fileName;
-                        String newDst = dst + "/" 
-                            + fileName.substring(0, fileName.length()
-                                                 - RENAMED_JPG_SUFFIX.length());
-                        copyAssetsTree(newSrc, newDst);
-                    } else { // normal file
-                        String newSrc = src + "/" + fileName;
-                        String newDst = dst + "/" + fileName;
-                        copyAssetsTree(newSrc, newDst);
-                    }
-                }
-            }
-        } catch (IOException e) {
-            Log.v(TAG,
-                 "copyAssetsTree: IOException: " + e);
-            e.printStackTrace();
-        }
-    }
-
-    public void install() {
-        String doneFileName = storageDir + "/installation.done";
-        File doneFile = new File(doneFileName);
-
-        if (doneFile.exists()) {
-            Log.v(TAG,
-                 "install: JVM data already installed. Skipping");
-        } else {
-            Log.v(TAG,
-                 "install: Installing JVM data");
-            copyAssetsTree("storage", storageDir);
-
-            // write done flag
-            Log.v(TAG,
-                 "install: Write file " + doneFileName);
-            try {
-                OutputStream os = new FileOutputStream(doneFile);
-                os.write(1);
-                os.close();
-            } catch (FileNotFoundException e) {
-                e.printStackTrace();
-            } catch (IOException e) {
-                e.printStackTrace();
-            }
-        }
-    }
-}
--- a/modules/graphics/src/main/android/com/oracle/dalvik/FXActivity.java	Wed Jul 03 08:46:25 2013 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,342 +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.oracle.dalvik;
-
-import java.io.File;
-import java.io.FilenameFilter;
-import java.util.ArrayList;
-import java.util.List;
-
-import android.app.Activity;
-import android.content.Context;
-import android.content.pm.ActivityInfo;
-import android.content.pm.PackageManager;
-import android.content.pm.PackageManager.NameNotFoundException;
-import android.graphics.PixelFormat;
-import android.os.AsyncTask;
-import android.os.Bundle;
-import android.util.Log;
-import android.view.KeyEvent;
-import android.view.MotionEvent;
-import android.view.Surface;
-import android.view.SurfaceHolder;
-import android.view.SurfaceView;
-import android.view.ViewGroup;
-import android.view.Window;
-import android.view.WindowManager;
-import android.view.inputmethod.InputMethodManager;
-import android.widget.FrameLayout;
-
-public class FXActivity extends Activity implements SurfaceHolder.Callback, 
-        SurfaceHolder.Callback2 {
-	
-    private static final String TAG     = "FXActivity";
-    private static final String TAG_JVM = "JVM";
-    private static final String JAR     = ".jar";
-    
-    private static final String META_DATA_MAIN_CLASS = "main.class";
-    private static final String META_DATA_JVM_ARGS   = "jvm.args";
-    private static final String META_DATA_APP_ARGS   = "app.args";
-    private static final String META_DATA_DEBUG_PORT = "debug.port";
-    private static final String ANDROID_WEBVIEW = "android_webview";
-    private static final String GLASS_LENS_ANDROID = "glass-lens-android";
-
-    static {        
-        System.loadLibrary("vmlauncher");
-    }
-    private static FXActivity instance;
-    private static FrameLayout mViewGroup;
-    private static SurfaceView mView;
-
-    private String            appDataDir;
-    private String            storageDir;    
-    private NativePipeReader  reader;
-    private InputMethodManager imm;   
-    private String ldPath;
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-            super.onCreate(savedInstanceState);
-
-        getWindow().requestFeature(Window.FEATURE_NO_TITLE);
-        getWindow().setSoftInputMode(
-                WindowManager.LayoutParams.SOFT_INPUT_STATE_UNSPECIFIED
-                | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING);
-        getWindow().setFormat(PixelFormat.RGBA_8888);
-
-        imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
-
-        mView = new InternalSurfaceView(this);
-        mView.getHolder().addCallback(this);        
-        mViewGroup = new FrameLayout(this);
-        mViewGroup.addView(mView);
-        setContentView(mViewGroup);
-        instance = this;
-        reader = NativePipeReader.getDefaultReader(textListener);
-        reader.start();
-        initDirInfo();
-        installJVMIfNeeded();
-        System.loadLibrary(GLASS_LENS_ANDROID);
-        System.loadLibrary(ANDROID_WEBVIEW);
-    }
-
-    public static FXActivity getInstance() {
-        return instance;
-    }
-
-    public String getLDPath() {
-        if (appDataDir == null) {
-            appDataDir = this.getApplicationInfo().dataDir;
-        }
-        if (ldPath == null) {
-            ldPath = appDataDir + "/lib";
-        }
-        return ldPath;
-    }
-
-    public static ViewGroup getViewGroup() {
-        return mViewGroup;
-    }    
-	
-    @Override
-    public void surfaceCreated(SurfaceHolder holder) {
-            _surfaceChanged(holder.getSurface());
-    }
-
-    @Override
-    public void surfaceChanged(SurfaceHolder holder, int format, int width,
-                    int height) {
-            _surfaceChanged(holder.getSurface(), format, width, height);
-
-    }
-
-    @Override
-    public void surfaceDestroyed(SurfaceHolder holder) {
-            _surfaceChanged(null);
-    }
-
-    @Override
-    public void surfaceRedrawNeeded(SurfaceHolder holder) {
-            _surfaceRedrawNeeded(holder.getSurface());		
-    }
-
-    private native void _surfaceChanged(Surface surface);
-
-    private native void _surfaceChanged(Surface surface, int format, int width, int height);
-
-    private native void _surfaceRedrawNeeded(Surface surface);
-
-    private void showIME() {
-        mView.requestFocus();
-        imm.showSoftInput(mView, 0);
-    }
-
-    private void hideIME() {
-        mView.requestFocus();
-        imm.hideSoftInputFromWindow(mView.getWindowToken(), 0);
-    }
-
-    private void installJVMIfNeeded() {
-        new InstallerTask().execute();
-    }
-	
-    private void runJVM() {
-        Log.i(TAG, "Launch JVM + application");
-        JvmArgs args = new JvmArgs(appDataDir);
-        VMLauncher.initialize(args.getJavaHome());
-        VMLauncher.runOnDebugPort(args.getDebugPort(),
-                                  args.getArgArray());
-    }
-	
-    private class InstallerTask extends AsyncTask<Void, Void, Void> {
-        protected Void doInBackground(Void... args) {
-           Log.i(TAG, "Installing JVM");
-            AppDataInstaller installer = 
-                new AppDataInstaller(storageDir,
-                    FXActivity.this.getApplicationContext().getAssets());
-            installer.install();
-            return null;
-        }
-    protected void onPostExecute(Void result) {
-            runJVM();
-        }
-    }
-	
-    private NativePipeReader.OnTextReceivedListener textListener = 
-            new NativePipeReader.OnTextReceivedListener() {
-                public void onTextReceived(String text) {
-                    Log.v(TAG_JVM, text);
-                }
-            };
-
-    private void initDirInfo() {
-        if (appDataDir == null) {
-            appDataDir = this.getApplicationInfo().dataDir;
-        }
-        storageDir = appDataDir + "/storage";
-    }
-	
-    private class JvmArgs {
-        private List<String> argList = new ArrayList<String>();
-        private String javaHome;
-
-        public JvmArgs(String appDir) {
-            String jvmRunCommand =
-                   "-Djava.library.path="
-                     + appDir + "/lib|"
-                     + "-Djava.home="
-                     + appDir + "/storage/jvm|"
-                     + "-Dsun.boot.library.path="
-                     + appDir + "/storage/jvm/lib|"
-                     + "-cp|"
-                     + getClasspath(appDir)
-                     + "|"                                         
-                     + "-Djavafx.platform=android|"
-                     + "-Djavafx.runtime.path="
-                     + appDir +"/storage/lib|"
-                     + getCustomJVMArgs()
-                     + "|"
-                     + getMainClass()
-                     + "|"
-                     + getApplicationArgs();
-
-            createArgList(jvmRunCommand);
-        }
-
-        private String[] listFiles(String dir, final String suffix) {
-            File dirf = new File(dir);
-            if (!dirf.exists()) {
-                return new String[]{};
-            }
-            String[] files = dirf.list(new FilenameFilter() {           
-                @Override
-                public boolean accept(File dir, String filename) {      
-                    return filename.endsWith(suffix);
-                }
-            });
-            return files;
-        }
-
-        private String getClasspath(String appDir) {
-            final String libDir = appDir + "/storage/lib/";
-            String[] libfiles = listFiles(libDir, JAR);
-            if (libfiles.length == 0) {
-                return "";
-            }
-            StringBuilder sb = new StringBuilder();
-            for(String file: libfiles) {
-                sb.append(libDir);
-                sb.append(file);
-                sb.append(File.pathSeparatorChar);
-            }
-            int len = sb.length();
-            return sb.substring(0, len - 1);
-        }
-
-        private String getMainClass() {
-             return getMetadata().getString(META_DATA_MAIN_CLASS);
-        }
-
-        private String getCustomJVMArgs() {
-             return getMetadata().getString(META_DATA_JVM_ARGS);
-        }
-
-        private String getApplicationArgs() {
-             return getMetadata().getString(META_DATA_APP_ARGS);
-        }
-
-        private int getDebugPort() {            
-             return getMetadata().getInt(META_DATA_DEBUG_PORT, 0);
-        }
-
-        private Bundle getMetadata() {
-            try {
-                ActivityInfo ai = FXActivity.this.getPackageManager().getActivityInfo(
-                        getIntent().getComponent(), PackageManager.GET_META_DATA);
-                return ai.metaData;
-
-            } catch(NameNotFoundException e) {
-                throw new RuntimeException("Error getting activity info", e);
-            }
-        }
-
-        public void createArgList(String args) {
-            if (args != null) {
-                String sep = (args.contains("|")) ? "\\|" : " ";
-                for (String arg : args.split(sep)) {
-                    arg = arg.trim();
-                    if (arg.length() > 0) {
-                        this.argList.add(arg);
-                        if (javaHome == null) {
-                            String[] pair = arg.split("\\=");
-                            Log.v(TAG, "arg = " + arg);
-                            Log.v(TAG, "pair.length = " + pair.length);
-                            if (pair.length == 2) {
-                                if ("-Djava.home".equals(pair[0])) {
-                                    Log.v(TAG, "Setting javaHome to " + pair[1]);
-                                    javaHome = pair[1];
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-        }
-        
-        public String[] getArgArray() {
-            return argList.toArray(new String[0]);
-        }
-
-        public String getJavaHome() {
-           return javaHome;
-        }
-    }
-	
-    class InternalSurfaceView extends SurfaceView {
-
-        public InternalSurfaceView(Context context) {
-            super(context);
-            setFocusableInTouchMode(true);
-        }
-
-        @Override
-        public boolean dispatchTouchEvent(MotionEvent event) {
-            onTouchEventNative(event.getAction(), (int) event.getX(), (int) event.getY());
-            return true;
-        }
-
-        @Override
-        public boolean dispatchKeyEvent(KeyEvent event) {
-            onKeyEventNative(event.getAction(), event.getKeyCode(), event.getCharacters());
-            return true;
-        }
-
-        private native void onTouchEventNative(int action, int absx, int absy);
-
-        private native void onKeyEventNative(int action, int keycode, String characters);
-
-    }
-
-}
--- a/modules/graphics/src/main/android/com/oracle/dalvik/InternalWebView.java	Wed Jul 03 08:46:25 2013 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,324 +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.oracle.dalvik;
-
-import android.graphics.Bitmap;
-import android.util.Log;
-import android.view.Gravity;
-import android.view.View;
-import android.view.ViewGroup;
-import android.webkit.WebChromeClient;
-import android.webkit.WebSettings;
-import android.webkit.WebView;
-import android.webkit.WebViewClient;
-import android.widget.FrameLayout;
-import java.util.ArrayList;
-import java.util.List;
-
-public class InternalWebView {
-
-    public final static int PAGE_STARTED = 0;
-    public final static int PAGE_FINISHED = 1;
-    public final static int PAGE_REDIRECTED = 2;
-    public final static int LOAD_FAILED = 5;
-    public final static int LOAD_STOPPED = 6;
-    public final static int CONTENT_RECEIVED = 10;
-    public final static int TITLE_RECEIVED = 11;
-    public final static int ICON_RECEIVED = 12;
-    public final static int CONTENTTYPE_RECEIVED = 13;
-    public final static int DOCUMENT_AVAILABLE = 14;
-    public final static int RESOURCE_STARTED = 20;
-    public final static int RESOURCE_REDIRECTED = 21;
-    public final static int RESOURCE_FINISHED = 22;
-    public final static int RESOURCE_FAILED = 23;
-    public final static int PROGRESS_CHANGED = 30;
-    private static final String TAG = "InternalWebView";
-    private static List<InternalWebView> views = new ArrayList<InternalWebView>();
-    private static int idcounter = 0;
-    private boolean isLayedOut = false;
-    private boolean initialized = false;
-    private int internalID;
-    private int x, y, width, height;
-    private WebView nativeWebView;
-    private String url, content;
-    private String contentType = "text/html";
-    private String encoding = "base64";
-    private boolean visible;
-
-    public InternalWebView() {
-        this.internalID = ++idcounter;
-        views.add(0, this);
-    }
-
-    public int getInternalID() {
-        return this.internalID;
-    }
-
-    private void initialize() {
-        nativeWebView = new WebView(FXActivity.getInstance()) {
-            @Override
-            protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
-                setMeasuredDimension(width, height);
-            }
-        };
-        nativeWebView.setWebViewClient(new WebViewClient() {
-            @Override
-            public boolean shouldOverrideUrlLoading(WebView view, String url) {
-                view.loadUrl(url);
-                return true;
-            }
-
-            @Override
-            public void onPageStarted(WebView view, String url, Bitmap favicon) {
-                fireLoadEvent(0, PAGE_STARTED, url, contentType, -1, -1);
-            }
-
-            @Override
-            public void onPageFinished(WebView view, String url) {
-                fireLoadEvent(0, PAGE_FINISHED, url, contentType, -1, -1);
-            }
-
-            @Override
-            public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
-                fireLoadEvent(0, LOAD_FAILED, failingUrl, contentType, -1, errorCode);
-            }
-        });
-
-        nativeWebView.setWebChromeClient(new WebChromeClient() {
-            @Override
-            public void onProgressChanged(WebView view, int newProgress) {
-                fireLoadEvent(0, PROGRESS_CHANGED, url, contentType, newProgress, -1);
-            }
-        });
-
-        WebSettings settings = nativeWebView.getSettings();
-        settings.setSupportZoom(true);
-        settings.setJavaScriptEnabled(true);
-
-        initialized = true;        
-    }
-
-    private void fireLoadEvent(int frameID, int state, String url,
-            String content_type, int progress, int errorCode) {
-        _fireLoadEvent(this.internalID, frameID, state,
-                url == null ? "" : url,
-                content_type == null ? "" : content_type,
-                progress, errorCode);
-    }
-
-    private static int indexOf(long id) {
-        int i = 0;
-        for (InternalWebView wvp : views) {
-            if (id == wvp.internalID) {
-                return i;
-            }
-            i++;
-        }
-        return -1;
-    }
-
-    private static InternalWebView getViewByID(int id) {
-        for (InternalWebView wvp : views) {
-            if (id == wvp.internalID) {
-                return wvp;
-            }
-        }
-        throw new RuntimeException("No InternalWebView with id: " + id);
-    }
-
-    static void createNew() {
-        FXActivity.getInstance().runOnUiThread(new Runnable() {
-            public void run() {
-                new InternalWebView().getInternalID();
-            }
-        });
-    }
-
-    static void loadUrl(int id, String url) {
-        final InternalWebView iwv = InternalWebView.getViewByID(id);
-        iwv.setContent(null, null);
-        iwv.setUrl(url);
-        if (iwv.initialized && iwv.isLayedOut) {
-            FXActivity.getInstance().runOnUiThread(new Runnable() {
-                public void run() {
-                    int c = FXActivity.getViewGroup().getChildCount();                    
-                    iwv.nativeWebView.loadUrl(iwv.url);
-                }
-            });
-        }
-    }
-
-    static void loadContent(int id, String content, String contentType) {
-        final InternalWebView iwv = InternalWebView.getViewByID(id);
-        iwv.setUrl(null);
-        iwv.setContent(content, contentType);
-        if (iwv.initialized && iwv.isLayedOut) {
-            FXActivity.getInstance().runOnUiThread(new Runnable() {
-                public void run() {                    
-                    iwv.nativeWebView.loadData(iwv.content, iwv.contentType, iwv.encoding);
-                }
-            });
-        }
-    }
-
-    static void setEncoding(int id, String encoding) {
-        final InternalWebView iwv = InternalWebView.getViewByID(id);
-        iwv.setEncoding(encoding);
-    }
-
-    static void moveAndResize(int id, int x, int y, final int w, final int h) {
-        final boolean move;
-        final boolean resize;        
-
-        if (w == 0 || h == 0) {
-            return;
-        }
-
-        final InternalWebView iwv = InternalWebView.getViewByID(id);
-        if (iwv == null) {
-            return;
-        }
-        if (iwv.x == x
-                && iwv.y == y
-                && iwv.width == w
-                && iwv.height == h) {
-            return;
-        }
-
-        move = (iwv.x != x || iwv.y != y);
-        if (move) {
-            iwv.x = x;
-            iwv.y = y;
-        }
-        resize = (iwv.width != w || iwv.height != h);
-        if (resize) {
-            iwv.width = w;
-            iwv.height = h;
-        }
-        if (!iwv.visible) {
-            return;
-        }
-        
-        if (!iwv.isLayedOut) {
-            iwv.isLayedOut = true;
-            FXActivity.getInstance().runOnUiThread(new Runnable() {
-                public void run() {
-                    if (!iwv.initialized) {
-                        iwv.initialize();
-                    }
-                    FrameLayout.LayoutParams layout = new FrameLayout.LayoutParams(
-                            ViewGroup.LayoutParams.WRAP_CONTENT,
-                            ViewGroup.LayoutParams.WRAP_CONTENT,
-                            Gravity.NO_GRAVITY);
-                    layout.leftMargin = iwv.x;
-                    layout.topMargin = iwv.y;
-//                    iwv.nativeWebView.setTranslationX(iwv.x);
-//                    iwv.nativeWebView.setTranslationY(iwv.y);
-                    FXActivity.getViewGroup().addView(iwv.nativeWebView, layout);
-                    Log.v(TAG, String.format("WebView added to ViewGroup [x: %d, y: %d , w: %d h: %d]",
-                            iwv.x, iwv.y, iwv.width, iwv.height));
-                    if (iwv.contentType == null || iwv.contentType.length() == 0) {
-                        iwv.contentType = "text/html";
-                    }
-                    if (iwv.url != null && iwv.url.length() > 0) {
-                        Log.v(TAG, "Loading url: " + iwv.url);
-                        iwv.nativeWebView.loadUrl(iwv.url);
-                    } else if (iwv.content != null) {                        
-                        Log.v(TAG, String.format("Loading content: %s\ncontent type: %s\nencoding: %s",
-                                iwv.content, iwv.contentType, iwv.encoding));
-                        iwv.nativeWebView.loadData(iwv.content, iwv.contentType, iwv.encoding);
-                    }
-                }
-            });
-
-        }// end of not initialized
-        else {
-            FXActivity.getInstance().runOnUiThread(new Runnable() {
-                public void run() {
-                    if (move) {
-                        FrameLayout.LayoutParams layout =
-                                (FrameLayout.LayoutParams) iwv.nativeWebView.getLayoutParams();
-                        layout.leftMargin = iwv.x;
-                        layout.topMargin = iwv.y;
-                        FXActivity.getViewGroup().updateViewLayout(iwv.nativeWebView, layout);
-//                        iwv.nativeWebView.setTranslationX(iwv.x);
-//                        iwv.nativeWebView.setTranslationY(iwv.y);
-                    }
-                    if (move || resize) {
-                        iwv.nativeWebView.invalidate();
-                    }                    
-                }
-            });
-        }        
-    }
-
-    static void setVisible(int id, final boolean visible) {
-        final InternalWebView iwv = InternalWebView.getViewByID(id);
-        if (iwv == null) {
-            return;
-        }
-        if (!iwv.initialized) {
-            iwv.visible = visible;
-            return;
-        }
-        FXActivity.getInstance().runOnUiThread(new Runnable() {
-            public void run() {
-                iwv.nativeWebView.setVisibility(visible ? View.VISIBLE : View.GONE);
-                if (visible) {
-                    iwv.nativeWebView.invalidate();
-                }
-            }
-        });
-    }
-
-    static void dispose(int id) {
-        final InternalWebView iwv = InternalWebView.getViewByID(id);
-        InternalWebView.setVisible(id, false);
-
-        FXActivity.getInstance().runOnUiThread(new Runnable() {
-            public void run() {
-                iwv.nativeWebView.stopLoading();
-                iwv.nativeWebView.destroy();
-            }
-        });
-        views.remove(iwv);
-    }
-
-    private void setUrl(String url) {
-        this.url = url;
-    }
-
-    private void setContent(String content, String contentType) {
-        this.content = content;
-        this.contentType = contentType;
-    }
-
-    private void setEncoding(String encoding) {
-        this.encoding = encoding;
-    }
-
-    private native void _fireLoadEvent(int id, int frameID, int state, String url,
-            String contentType, int progress, int errorCode);
-}
--- a/modules/graphics/src/main/android/com/oracle/dalvik/MainActivity.java	Wed Jul 03 08:46:25 2013 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,258 +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.oracle.dalvik;
-
-import java.io.File;
-import java.io.FilenameFilter;
-import java.util.ArrayList;
-import java.util.List;
-
-import android.app.Activity;
-import android.app.NativeActivity;
-import android.content.pm.ActivityInfo;
-import android.content.pm.PackageManager;
-import android.content.pm.PackageManager.NameNotFoundException;
-import android.graphics.PixelFormat;
-import android.graphics.drawable.ColorDrawable;
-import android.os.AsyncTask;
-import android.os.Bundle;
-import android.util.Log;
-import android.view.KeyEvent;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.Window;
-import android.view.WindowManager;
-
-
-public class MainActivity extends NativeActivity {
-
-    public static final String  TAG     = "MainActivity";
-    private static final String TAG_JVM = "JVM";
-    private static final String JAR     = ".jar";
-
-    private static final String META_DATA_MAIN_CLASS = "main.class";
-    private static final String META_DATA_JVM_ARGS   = "jvm.args";
-    private static final String META_DATA_APP_ARGS   = "app.args";
-    private static final String META_DATA_DEBUG_PORT = "debug.port";
-
-    private String                  appDataDir;
-    private String                  storageDir;    
-    private NativePipeReader        reader;
-    
-    private ViewGroup mViewGroup;
-    private View      mView;
-
-    static {
-        // load npr and vmlauncher
-        System.loadLibrary("vmlauncher");
-    }
-        
-    private NativePipeReader.OnTextReceivedListener textListener = 
-            new NativePipeReader.OnTextReceivedListener() {
-                public void onTextReceived(String text) {
-                    Log.v(TAG_JVM, text);
-                }
-            };
-
-    private void initDirInfo() {
-        appDataDir = this.getApplicationInfo().dataDir;
-        storageDir = appDataDir + "/storage";
-    }
-
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        getWindow().setFormat(PixelFormat.RGBA_8888);
-        getWindow().setSoftInputMode(
-                WindowManager.LayoutParams.SOFT_INPUT_STATE_UNSPECIFIED
-              | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING);
-
-        mViewGroup = (ViewGroup)getWindow().getDecorView()
-                    .findViewById(Window.ID_ANDROID_CONTENT);
-        mView = mViewGroup.getChildAt(0);
-        mView.setFocusableInTouchMode(true);
-
-        reader = NativePipeReader.getDefaultReader(textListener);
-        reader.start();
-        initDirInfo();
-        installJVMIfNeeded();
-    }
-
-    @Override
-    public boolean dispatchKeyEvent(KeyEvent event) {
-    	if (event.getAction() == KeyEvent.ACTION_MULTIPLE) {
-    		if (event.getKeyCode() == KeyEvent.KEYCODE_UNKNOWN) {
-    			Log.w(TAG, "KeyEvent (MULTIPLE) :" + event.getCharacters());
-    			Log.w(TAG, "Predictive text (T9) not supported!");
-    		}
-    	}
-    	return super.dispatchKeyEvent(event);
-    }
-    
-    private void installJVMIfNeeded() {
-        new InstallerTask().execute();
-    }
-
-    private void runJVM() {
-        Log.i(TAG, "Launch JVM + application");
-        JvmArgs args = new JvmArgs(appDataDir);
-        VMLauncher.initialize(args.getJavaHome());
-        VMLauncher.runOnDebugPort(args.getDebugPort(),
-                                  args.getArgArray());
-    }
-
-    private class InstallerTask extends AsyncTask<Void, Void, Void> {
-        protected Void doInBackground(Void... args) {
-           Log.i(TAG, "Installing JVM");
-            AppDataInstaller installer = 
-                new AppDataInstaller(storageDir,
-                                     MainActivity.this.getApplicationContext().getAssets());
-            installer.install();
-            return null;
-        }
-        protected void onPostExecute(Void result) {
-           Log.i(TAG, "JVM Installed");
-            runJVM();
-        }
-    }
-
-
-    private class JvmArgs {
-        private List<String> argList = new ArrayList<String>();
-        private String javaHome;
-
-        public JvmArgs(String appDir) {
-            String jvmRunCommand =
-                   "-Djava.library.path="
-                     + appDir + "/lib|"
-                     + "-Djava.home="
-                     + appDir + "/storage/jvm|"
-                     + "-Dsun.boot.library.path="
-                     + appDir + "/storage/jvm/lib|"
-                     + "-cp|"
-                     + getClasspath(appDir)
-                     + "|"                                         
-                     + "-Djavafx.platform=android|"
-                     + "-Djavafx.runtime.path="
-                     + appDir +"/storage/lib|"
-                     + getCustomJVMArgs()
-                     + "|"
-                     + getMainClass()
-                     + "|"
-                     + getApplicationArgs();
-
-            createArgList(jvmRunCommand);
-        }
-
-        private String[] listFiles(String dir, final String suffix) {
-           File dirf = new File(dir);
-           if (!dirf.exists()) {
-               return new String[]{};
-           }
-           String[] files = dirf.list(new FilenameFilter() {           
-               @Override
-               public boolean accept(File dir, String filename) {      
-                   return filename.endsWith(suffix);
-               }
-           });
-           return files;
-       }
-
-       private String getClasspath(String appDir) {
-           final String libDir = appDir + "/storage/lib/";
-           String[] libfiles = listFiles(libDir, JAR);
-           if (libfiles.length == 0) {
-               return "";
-           }
-           StringBuilder sb = new StringBuilder();
-           for(String file: libfiles) {
-               sb.append(libDir);
-               sb.append(file);
-               sb.append(File.pathSeparatorChar);
-           }
-           int len = sb.length();
-           return sb.substring(0, len - 1);
-       }
-
-       private String getMainClass() {
-           return getMetadata().getString(META_DATA_MAIN_CLASS);
-       }
-
-       private String getCustomJVMArgs() {
-           return getMetadata().getString(META_DATA_JVM_ARGS);
-       }
-
-       private String getApplicationArgs() {
-           return getMetadata().getString(META_DATA_APP_ARGS);
-       }
-
-       private int getDebugPort() {            
-           return getMetadata().getInt(META_DATA_DEBUG_PORT, 0);
-       }
-
-       private Bundle getMetadata() {
-           try {
-               ActivityInfo ai = MainActivity.this.getPackageManager().getActivityInfo(
-                       getIntent().getComponent(), PackageManager.GET_META_DATA);
-               return ai.metaData;
-               
-           } catch(NameNotFoundException e) {
-               throw new RuntimeException("Error getting activity info", e);
-           }
-       }
-
-        public void createArgList(String args) {
-            if (args != null) {
-                String sep = (args.contains("|")) ? "\\|" : " ";
-                for (String arg : args.split(sep)) {
-                    arg = arg.trim();
-                    if (arg.length() > 0) {
-                        this.argList.add(arg);
-                        if (javaHome == null) {
-                            String[] pair = arg.split("\\=");
-                            Log.v(TAG, "arg = " + arg);
-                            Log.v(TAG, "pair.length = " + pair.length);
-                            if (pair.length == 2) {
-                                if ("-Djava.home".equals(pair[0])) {
-                                    Log.v(TAG, "Setting javaHome to " + pair[1]);
-                                    javaHome = pair[1];
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-        }
-        public String[] getArgArray() {
-            return argList.toArray(new String[0]);
-        }
-
-        public String getJavaHome() {
-           return javaHome;
-        }
-
-   }
-}
--- a/modules/graphics/src/main/android/com/oracle/dalvik/NativePipeReader.java	Wed Jul 03 08:46:25 2013 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,156 +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.oracle.dalvik;
-
-import android.os.Handler;
-
-public class NativePipeReader extends Thread { 
-   
-    /**
-     * onTextReceived 
-     * callback to return read text from pipe 
-     * called on the same thread that NativePipeReader was 
-     * created on.
-     * 
-     * @param text
-     */
-    public interface OnTextReceivedListener {
-        public void onTextReceived(String text);
-    }
-
-    public interface Client extends OnTextReceivedListener {
-        /**
-         * initPipe 
-         * called to set up pipe and redirect 
-         * 
-         * @return int, fd of output end of pipe
-         */
-        public int initPipe();
-
-
-        public void onTextReceived(String text);
-
-        /**
-         * cleanupPipe 
-         * called after last data is read from pipe and thread 
-         * is about to exit
-         *
-         */
-        public void cleanupPipe();
-    }
-
-    private Client client;
-    private Handler handler;
-
-    public NativePipeReader(Client client) {
-        this.client = client;
-        this.handler = new Handler();    
-    }
-
-    private volatile boolean stop = false;
-
-    public void stopReading() {
-        stop = true;
-    }
-
-    public void run() {
-        int fd = client.initPipe();
-        while (!stop) {
-            String text = readPipe(fd);
-            if (text.length() > 0) {
-                // only notify client if we
-                // actually got something
-                client.onTextReceived(text);
-            }
-        }
-        client.cleanupPipe();
-    }
-
-    public static NativePipeReader 
-    getDefaultReader(OnTextReceivedListener listener) {
-        return new NativePipeReader(
-                                   new StdoutStderrClient(listener));
-    }
-
-    /**
-     * readPipe 
-     * native method to read text from the 
-     * pipe. 
-     * this method may(should) block
-     * 
-     * @return String 
-     */
-    private native String readPipe(int fd);
-
-    private static class StdoutStderrClient implements Client {
-
-        Handler handler;
-        OnTextReceivedListener listener;
-
-        public StdoutStderrClient(OnTextReceivedListener listener) {
-            this.handler = new Handler();
-            this.listener = listener;
-        }
-
-        private native int nativeInitPipe();
-        private native void nativeCleanupPipe();
-
-        /**
-         * initPipe
-         * called to set up pipe and redirect
-         *
-         * @return int, fd of read end of pipe
-         */
-        public int initPipe() {
-            return nativeInitPipe();
-        }
-
-        /**
-         * onTextReceived
-         * callback to return read text from pipe
-         * called on the same thread that NativePipeReader was
-         * created on.
-         *
-         * @param text
-         */
-        public void onTextReceived(final String text) {
-            handler.post(new Runnable() {
-                             public void run() {
-                                 listener.onTextReceived(text); 
-                             }
-                         });
-        }
-
-        /**
-         * cleanupPipe
-         * called after last data is read from pipe and thread
-         * is about to exit
-         */
-        public void cleanupPipe() {
-            nativeCleanupPipe();
-        }
-    }
-}
-
--- a/modules/graphics/src/main/android/com/oracle/dalvik/VMLauncher.java	Wed Jul 03 08:46:25 2013 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,140 +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.oracle.dalvik;
-
-import java.io.File;
-import java.io.FileReader;
-import java.io.Reader;
-import java.util.ArrayList;
-
-import android.util.Log;
-
-public class VMLauncher extends Thread {
-
-   private static final String TAG = "VMLauncher";
-    private static String sJavaHome;
-
-    private String[] args;
-
-    public static void initialize(String javaHome) {
-        if (javaHome != null) {
-            sJavaHome = javaHome;
-            loadNativeLibraries();
-        } else {
-            throw new NullPointerException();
-        }
-    }
-    
-    // java libs are located at architecture dependent 
-    // paths
-    // i386 for x86 arch
-    // arm  for ARM arch
-    public static String getJvmArch() {
-        String rawarch = System.getProperty("os.arch");
-        if (rawarch != null && rawarch.contains("86")) {
-            return "i386";
-        }
-        return "arm";
-    }
-
-    private static void loadNativeLibraries() {
-        System.load(sJavaHome + "/lib/" + getJvmArch() + "/client/libjvm.so");
-        System.load(sJavaHome + "/lib/" + getJvmArch() + "/jli/libjli.so");
-    }
-    
-    private static String getCmdLine() {
-        // /proc/self/cmdline contains apk
-        // package name
-        StringBuilder builder = new StringBuilder();
-        try {
-            Reader reader = new FileReader("/proc/self/cmdline");
-            int c = 0;
-            while ((c = reader.read()) > 0) {
-                builder.append((char)c);
-            }
-            reader.close();
-        } catch (Exception e) {
-            builder = new StringBuilder("dalvik.package");
-        }
-        return builder.toString();        
-    }
-
-    private static void listDirToStandardOut(String dirpath) {
-        File dir = new File(dirpath);
-        try {
-            for (File file : dir.listFiles()) {
-                if (file.isDirectory()) {
-                    listDirToStandardOut(file.getAbsolutePath());
-                }
-            }
-        } catch (Exception e) {
-            Log.e(TAG, "Exception listing dir " + dir);
-        }
-    }
-
-    private VMLauncher(String[] args) {
-        super("JVM");
-        this.args = args;
-    }
-
-    public void run()
-    {
-        launchJVM(this.args);
-    }
-
-    private static void startJavaInBackground(String[] args)
-    {
-        new VMLauncher(args).start();
-    }
-
-    public static void runOnDebugPort(Integer debugPort,
-                                      String[] args)
-    {
-        ArrayList<String> localArrayList = new ArrayList();
-        
-        // need to add apk pkg name to head of arg list
-        localArrayList.add(getCmdLine()); 
-        
-        if (debugPort.intValue() > 0) {
-            localArrayList.add("-Xdebug");
-            localArrayList.add("-agentlib:jdwp=server=y,suspend=y,transport=dt_socket,address=" + debugPort);
-        }
-
-        for (String arg : args) {
-            localArrayList.add(arg);
-        }
-
-        String[] processedArgs = localArrayList.toArray(new String[0]);
-
-        for (String arg : processedArgs) {
-            Log.v(TAG, "Processed JVM arg : " + arg);
-        }
-
-        startJavaInBackground(processedArgs);
-    }
-
-    private static native int launchJVM(String[] args);
-
-}
\ No newline at end of file
--- a/modules/graphics/src/main/android/com/oracle/dalvik/net/DalvikProxySelector.java	Wed Jul 03 08:46:25 2013 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,77 +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.oracle.dalvik.net;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.net.Proxy;
-import java.net.ProxySelector;
-import java.net.SocketAddress;
-import java.net.InetSocketAddress;
-import java.net.URI;
-
-
-public class DalvikProxySelector {
-    private String[] args;
-
-    private DalvikProxySelector(String[] args){
-        this.args = args;
-    }
-
-    //Result host and port are returned in a string in the format host:port
-    public static String[] getProxyForURL(String target) {
-        String[] proxyInfo = new String[0];
-        List<String> proxies = new ArrayList<String>();
-        URI uri = null;
-        try {
-            ProxySelector defaultProxySelector = ProxySelector.getDefault();
-            uri = new URI(target);
-            List<Proxy> proxyList = defaultProxySelector.select(uri);
-
-            Proxy proxy = proxyList.get(0);
-            if (proxy.equals(Proxy.NO_PROXY)) {
-                System.out.println("DalvikProxySelector.getProxyForURL(): No proxy found");
-                return null;
-            }
-            SocketAddress address = proxy.address();
-            InetSocketAddress inetSocketAddress = (InetSocketAddress) address;
-            String host = inetSocketAddress.getHostName();
-            int port = inetSocketAddress.getPort();
-            if (host == null) {
-                System.out.println("DalvikProxySelector.getProxyForURL(): No proxy found");
-                return null;
-            }
-
-            proxies.add(host);                      // even index, host
-            proxies.add(Integer.toString(port));    // odd index, port
-
-            System.out.println("DalvikProxySelector.getProxyForURL(): host=" + host + " port=" + port);
-            return proxies.toArray(new String[0]);
-        } catch (Exception e) {
-            System.out.println("DalvikProxySelector.getProxyForURL(): exception(ignored): " + e.toString());
-            return null;
-        }
-    }
-}
--- a/modules/graphics/src/main/native-android/DalvikProxySelector.c	Wed Jul 03 08:46:25 2013 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,67 +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.
- */
-
-#include <jni.h>
-#include <android/log.h>
-#include "DalvikProxySelector.h"
-
-static jclass dalvikProxySelectorClass;
-static jmethodID getProxyMethodId;
-
-static jclass initDalvikProxySelectorClass(JNIEnv* env) {
-    jclass localClass = (*env)->FindClass(env, "com/oracle/dalvik/net/DalvikProxySelector");
-    dalvikProxySelectorClass = (jclass) (*env)->NewGlobalRef(env,localClass);
-    __android_log_print(3, "DalvikProxySelector", ">>> after FindClass DalvikProxySelectorClass = %x", dalvikProxySelectorClass);
-    if ((*env)->ExceptionCheck(env) == JNI_TRUE) {
-        __android_log_print(3, "DalvikProxySelector", ">>> initDalvikProxySelectorClass: ExceptionCheck = JNI_TRUE");
-        (*env)->ExceptionDescribe(env);
-        (*env)->ExceptionClear(env);
-    }
-    return dalvikProxySelectorClass;
-}
-
-static jmethodID initGetProxyMethod(JNIEnv* env, jclass clazz) {
-    getProxyMethodId = (*env)->GetStaticMethodID(env, clazz, "getProxyForURL", "(Ljava/lang/String;)[Ljava/lang/String;");
-    __android_log_print(3, "DalvikProxySelector", ">>> getProxyForURL: after GetStaticMethodID");
-    if ((*env)->ExceptionCheck(env) == JNI_TRUE) {
-        __android_log_print(3, "DalvikProxySelector", ">>> initGetProxyMethod: ExceptionCheck = JNI_TRUE");
-        (*env)->ExceptionDescribe(env);
-        (*env)->ExceptionClear(env);
-    }
-    return getProxyMethodId;
-}
-
-void initDalvikProxySelectorData(JNIEnv* env) {
-    jclass clazz = initDalvikProxySelectorClass(env);
-    initGetProxyMethod(env, clazz);
-}
-
-jclass getDalvikProxySelectorClass(void) {
-    return dalvikProxySelectorClass;
-}
-
-jmethodID getDPSGetProxyMethodID(void) {
-    return getProxyMethodId;
-}
--- a/modules/graphics/src/main/native-android/DalvikProxySelector.h	Wed Jul 03 08:46:25 2013 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,34 +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.
- */
-
-#ifndef DALVIK_PROXY_SELECTOR_H
-#define DALVIK_PROXY_SELECTOR_H
-#include <jni.h>
-
-void initDalvikProxySelectorData(JNIEnv* env);
-jclass getDalvikProxySelectorClass(void);
-jmethodID getDPSGetProxyMethodID(void);
-
-#endif // DALVIK_PROXY_SELECTOR_H
--- a/modules/graphics/src/main/native-android/NativePipeReader.c	Wed Jul 03 08:46:25 2013 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,96 +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.
- */
-#include <unistd.h>
-#include <stdio.h>
-#include <android/log.h>
-#include "com_oracle_dalvik_NativePipeReader.h"
-#include "com_oracle_dalvik_NativePipeReader_StdoutStderrClient.h"
-
-#define NPR_BUF_SIZE 128
-static char buffer[NPR_BUF_SIZE + 1];
-static int readfd = -1;
-
-/*
- * Class:     com_oracle_dalvik_NativePipeReader
- * Method:    readPipe
- * Signature: ()Ljava/lang/String;
- */
-JNIEXPORT jstring JNICALL Java_com_oracle_dalvik_NativePipeReader_readPipe
-  (JNIEnv *env, jobject thiz, jint fd) {
-    int bytesread = -1;
-    if (fd >= 0) {
-        // read data from pipe (should block)
-        // __android_log_print(3, "NPR", "Calling read(%d)\n", fd);
-        bytesread = read((int)fd, buffer, NPR_BUF_SIZE);
-    }
-    if (bytesread > -1) {
-        buffer[bytesread] = '\0';
-        return (*env)->NewStringUTF(env, buffer);
-    } else {
-        buffer[0] = '\0';
-    }
-    // __android_log_print(3, "NPR", "Bytes read from pipe = %d\n", bytesread);
-    return (*env)->NewStringUTF(env, buffer);
-}
-
-/*
- * Class:     com_oracle_dalvik_NativePipeReader_StdoutStderrClient
- * Method:    nativeInitPipe
- * Signature: ()I 
- *  
- * create a new pipe attaching stdout and stderr to the WRITE end 
- *  
- */
-JNIEXPORT jint JNICALL Java_com_oracle_dalvik_NativePipeReader_00024StdoutStderrClient_nativeInitPipe
-  (JNIEnv *env, jobject thiz) {
-    int fd[2];
-    int status = pipe(fd);
-    if (status >= 0) {
-        readfd = fd[0];
-        // we have the pipe now connect stdout/stderr
-        status = dup2(fd[1], STDOUT_FILENO); // connect stdin
-        // __android_log_print(3, "NPR", "connected stdout to pipe %d status = %d\n", fd[1], status);
-        status = dup2(fd[1], STDERR_FILENO); // connect sterr
-        if (status >= 0) {
-            status = fd[0];
-        }
-    }
-    // __android_log_print(3, "NPR", "nativeInitPipe f0 = %d f1 = %d status = =%d", fd[0], fd[1], status);
-    printf("nativeInitPipe f0 = %d f1 = %d status = =%d", fd[0], fd[1], status);
-    return status;
-}
-
-/*
- * Class:     com_oracle_dalvik_NativePipeReader_StdoutStderrClient
- * Method:    nativeCleanupPipe
- * Signature: ()V 
- *  
- * Return stdout and stderr to previous settings and 
- * shut down pipe 
- *  
- */
-JNIEXPORT void JNICALL Java_com_oracle_dalvik_NativePipeReader_00024StdoutStderrClient_nativeCleanupPipe
-  (JNIEnv *env, jobject thiz) {
-}
--- a/modules/graphics/src/main/native-android/VMLauncher.c	Wed Jul 03 08:46:25 2013 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,156 +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.
- */
-#include <jni.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <android/log.h>
-#include <dlfcn.h>
-#include "DalvikProxySelector.h"
-#include "com_oracle_dalvik_VMLauncher.h"
-
-#define FULL_VERSION "1.7.0_04-ea-b19"
-#define DOT_VERSION "1.7.0_04"
-
-typedef jint JNI_CreateJavaVM_func(JavaVM **pvm, void **penv, void *args);
-
-typedef jint JLI_Launch_func(int argc, char ** argv, /* main argc, argc */
-        int jargc, const char** jargv,          /* java args */
-        int appclassc, const char** appclassv,  /* app classpath */
-        const char* fullversion,                /* full version defined */
-        const char* dotversion,                 /* dot version defined */
-        const char* pname,                      /* program name */
-        const char* lname,                      /* launcher name */
-        jboolean javaargs,                      /* JAVA_ARGS */
-        jboolean cpwildcard,                    /* classpath wildcard*/
-        jboolean javaw,                         /* windows-only javaw */
-        jint ergo                               /* ergonomics class policy */
-);
-
-JavaVM *dalvikJavaVMPtr = NULL;
-JNIEnv *dalvikJNIEnvPtr = NULL;
-
-jint JNI_OnLoad(JavaVM* vm, void* reserved)
-{
-    //Save dalvik global JavaVM pointer
-    dalvikJavaVMPtr = vm;
-    __android_log_print(3,"JVM", "JNI_OnLoad calling GetEnv()");
-    JNIEnv* env = NULL;
-    (*vm)->GetEnv(vm, (void**) &env, JNI_VERSION_1_4);
-    __android_log_print(3,"JVM", "JNI_OnLoad calling initDalvikProxySelectorData()");
-    initDalvikProxySelectorData(env);
-    __android_log_print(3,"JVM", "JNI_OnLoad returning()");
-    return JNI_VERSION_1_4;
-}
-
-static void logArgs(int argc, char** argv) {
-    int i;
-    
-    for (i = 0; i < argc; i++) {
-        __android_log_print(3,"JVM", "arg[%d]: %s", i, argv[i]);
-    }
-}
-
-static jint launchJVM(int argc, char** argv) {
-    logArgs(argc, argv);
-
-   void* libjli = dlopen("libjli.so", RTLD_LAZY | RTLD_GLOBAL);
-        __android_log_print(3,"JVM", "JLI lib = %x", (int)libjli);
-   if (NULL == libjli) {
-       return 0;
-   }
-        __android_log_print(3,"JVM", "Found JLI lib");
-
-   JLI_Launch_func *pJLI_Launch =
-          (JLI_Launch_func *)dlsym(libjli, "JLI_Launch");
-
-        __android_log_print(3,"JVM", "JLI_Launch = 0x%x", *(int*)&pJLI_Launch);
-
-   if (NULL == pJLI_Launch) {
-        __android_log_print(3,"JVM", "JLI_Launch = NULL");
-       return 0;
-   }
-
-        __android_log_print(3,"JVM", "Calling JLI_Launch");
-   return pJLI_Launch(argc, argv, 0, NULL, 0, NULL, FULL_VERSION,
-                          DOT_VERSION, *argv, *argv, JNI_FALSE, JNI_FALSE,
-                          JNI_FALSE, 0);
-}
-
-/*
- * Class:     com_oracle_embedded_launcher_VMLauncher
- * Method:    launchJVM
- * Signature: ([Ljava/lang/String;)I
- */
-JNIEXPORT jint JNICALL Java_com_oracle_dalvik_VMLauncher_launchJVM
-  (JNIEnv *env, jclass clazz, jobjectArray argsArray) {
-   jint res = 0;
-   char **argv = NULL;
-   int i;
-
-        // Save dalvik JNIEnv pointer for JVM launch thread
-        dalvikJNIEnvPtr = env;
-
-        if (argsArray == NULL) {
-          __android_log_print(3,"LaunchJVM", " args array null, returning ");
-       //handle error
-       return 0;
-   }
-
-   int argc = (*env)->GetArrayLength(env, argsArray);
-
-   argv = calloc( (argc+1), sizeof(jbyte*) );
-
-   //copy args
-   for (i = 0; i < argc; i++) {
-       jstring stringElement = (jstring) (*env)->GetObjectArrayElement(env, argsArray, i);
-       const jbyte *ansiString = (*env)->GetStringUTFChars(env, stringElement, NULL);
-       if (ansiString == NULL) {
-           //handle error
-           return 0;
-       }
-       argv[i] = calloc( (strlen(ansiString)+1), sizeof(jbyte) );
-       if (argv[i] == NULL) {
-           //handle error
-           return 0;
-       }
-       strcpy(argv[i], ansiString);
-       (*env)->ReleaseStringUTFChars(env, stringElement, (const char*)ansiString);
-   }
-   //add NULL element
-   argv[argc] = NULL;
-        __android_log_print(3,"LaunchJVM", " Done processing args ");
-
-   res = launchJVM(argc, argv);
-
-   //free args
-   for (i = 0; i < argc; i++) {
-       free(argv[i]);
-   }
-   free(argv);
-
-   return res;
-}
-
-
--- a/modules/swing/.classpath	Wed Jul 03 08:46:25 2013 -0400
+++ b/modules/swing/.classpath	Wed Jul 03 11:19:19 2013 -0700
@@ -1,7 +1,22 @@
 <classpath>
-  <classpathentry kind="src" path="src/main/java"/>
-  <classpathentry exported="true" kind="src" path="/graphics"/>
-  <classpathentry exported="true" kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
   <classpathentry kind="output" path="bin"/>
+  <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
   <classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
+  <classpathentry kind="src" exported="true" path="src/main/java"/>
+  <classpathentry kind="src" exported="true" path="src/test/java">
+  <attributes>
+      <attribute name="optional" value="true"/>
+    </attributes>
+  </classpathentry>
+  <classpathentry kind="src" exported="true" path="src/main/resources">
+  <attributes>
+      <attribute name="optional" value="true"/>
+    </attributes>
+  </classpathentry>
+  <classpathentry kind="src" exported="true" path="src/test/resources">
+  <attributes>
+      <attribute name="optional" value="true"/>
+    </attributes>
+  </classpathentry>
+  <classpathentry kind="src" exported="true" path="/graphics"/>
 </classpath>
--- a/modules/swt/.classpath	Wed Jul 03 08:46:25 2013 -0400
+++ b/modules/swt/.classpath	Wed Jul 03 11:19:19 2013 -0700
@@ -1,7 +1,22 @@
 <classpath>
-  <classpathentry kind="src" path="src/main/java"/>
-  <classpathentry exported="true" kind="src" path="/graphics"/>
-  <classpathentry exported="true" kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
   <classpathentry kind="output" path="bin"/>
+  <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
   <classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
+  <classpathentry kind="src" exported="true" path="src/main/java"/>
+  <classpathentry kind="src" exported="true" path="src/test/java">
+  <attributes>
+      <attribute name="optional" value="true"/>
+    </attributes>
+  </classpathentry>
+  <classpathentry kind="src" exported="true" path="src/main/resources">
+  <attributes>
+      <attribute name="optional" value="true"/>
+    </attributes>
+  </classpathentry>
+  <classpathentry kind="src" exported="true" path="src/test/resources">
+  <attributes>
+      <attribute name="optional" value="true"/>
+    </attributes>
+  </classpathentry>
+  <classpathentry kind="src" exported="true" path="/graphics"/>
 </classpath>
--- a/modules/web/.classpath	Wed Jul 03 08:46:25 2013 -0400
+++ b/modules/web/.classpath	Wed Jul 03 11:19:19 2013 -0700
@@ -1,15 +1,33 @@
 <classpath>
+  <classpathentry kind="output" path="bin"/>
   <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-  <classpathentry kind="output" path="bin"/>
+  <classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
   <classpathentry kind="src" exported="true" path="src/main/java"/>
+  <classpathentry kind="src" exported="true" path="src/test/java">
+  <attributes>
+      <attribute name="optional" value="true"/>
+    </attributes>
+  </classpathentry>
+  <classpathentry kind="src" exported="true" path="src/main/resources">
+  <attributes>
+      <attribute name="optional" value="true"/>
+    </attributes>
+  </classpathentry>
+  <classpathentry kind="src" exported="true" path="src/test/resources">
+  <attributes>
+      <attribute name="optional" value="true"/>
+    </attributes>
+  </classpathentry>
   <classpathentry kind="src" exported="true" path="src/main/native/WebKitBuild/Release/WebCore/generated/java">
     <attributes>
       <attribute name="optional" value="true"/>
     </attributes>
   </classpathentry>
-  <classpathentry kind="src" exported="true" path="src/test/java"/>
-  <classpathentry kind="src" exported="true" path="src/test/resources"/>
   <classpathentry kind="src" exported="true" path="/controls"/>
   <classpathentry kind="src" exported="true" path="/media"/>
-  <classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
+  <classpathentry kind="lib" exported="true" path="../../../caches/sdk/rt/lib/ext/jfxrt.jar">
+    <attributes>
+      <attribute name="optional" value="true"/>
+    </attributes>
+  </classpathentry>
 </classpath>