changeset 9839:1316c5515887 jdk-9+123

Merge
author ddhill
date Fri, 10 Jun 2016 09:43:53 -0400
parents a981d0f1a556 5700e10a5875
children c234af6e261f a5db562e15c6
files buildSrc/src/main/java/com/sun/javafx/beans/annotations/Default.java buildSrc/src/main/java/com/sun/javafx/beans/annotations/Delegate.java buildSrc/src/main/java/com/sun/javafx/collections/annotations/ReturnsUnmodifiableCollection.java modules/fxpackager/src/main/java/com/oracle/tools/packager/JDepHelper.java modules/fxpackager/src/main/java/com/oracle/tools/packager/JLinkBundlerHelper.java modules/fxpackager/src/main/java/com/oracle/tools/packager/Module.java modules/fxpackager/src/main/java/com/oracle/tools/packager/ModuleManager.java modules/fxpackager/src/main/resources/com/oracle/tools/packager/JLinkBundlerHelper.properties
diffstat 243 files changed, 4633 insertions(+), 2754 deletions(-) [+]
line wrap: on
line diff
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/css/CssContentMaker.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/css/CssContentMaker.java	Fri Jun 10 09:43:53 2016 -0400
@@ -363,7 +363,7 @@
     protected static List<Style> removeUserAgentStyles(List<Style> allStyles) {
         // With SB 2, we apply explicitly Modena/Caspian theme css on user scene graph.
         // The rules that appear with an AUTHOR origin has already been considered as USER_AGENT.
-        // So when an internal css method (such as impl_getMatchingStyles()) is called,
+        // So when an internal css method (such as getMatchingStyles()) is called,
         // we need here to remove all USER_AGENT styles, to avoid doublons.
         List<Style> matchingStyles = new ArrayList<>();
         for (Style style : allStyles) {
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/metadata/Metadata.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/metadata/Metadata.java	Fri Jun 10 09:43:53 2016 -0400
@@ -5810,13 +5810,6 @@
         hiddenProperties.add(new PropertyName("focusModel"));
         hiddenProperties.add(new PropertyName("graphicsContext2D"));
         hiddenProperties.add(new PropertyName("hover"));
-        hiddenProperties.add(new PropertyName("impl_caretBias"));
-        hiddenProperties.add(new PropertyName("impl_caretPosition"));
-        hiddenProperties.add(new PropertyName("impl_caretShape"));
-        hiddenProperties.add(new PropertyName("impl_selectionEnd"));
-        hiddenProperties.add(new PropertyName("impl_selectionShape"));
-        hiddenProperties.add(new PropertyName("impl_selectionStart"));
-        hiddenProperties.add(new PropertyName("impl_traversalEngine"));
         hiddenProperties.add(new PropertyName("inputMethodRequests"));
         hiddenProperties.add(new PropertyName("localToParentTransform"));
         hiddenProperties.add(new PropertyName("localToSceneTransform"));
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/Deprecation.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/Deprecation.java	Fri Jun 10 09:43:53 2016 -0400
@@ -86,22 +86,26 @@
     // Deprecated stuff in Node
 //    // RT-21247 : Promote impl_getAllParentStylesheets to public API
     public static Group createGroupWithNullParentStylesheets() {
+        System.err.println("Error: impl_getAllParentStylesheets is no longer publicly accessible");
         return new Group() {
-            @Override
-            public List<String> impl_getAllParentStylesheets() {
-                return null;
-            }
+//            @Override
+//            public List<String> impl_getAllParentStylesheets() {
+//                return null;
+//            }
         };
     }
 
 //    // RT-21096 : Promote impl_getStyleMap / impl_setStyleMap to public API
     public static void setStyleMap(Node node, ObservableMap<StyleableProperty<?>, List<javafx.css.Style>> map) {
-        node.impl_setStyleMap(map);
+        // node.impl_setStyleMap(map);
+        System.err.println("Error: impl_setStyleMap is no longer publicly accessible");
     }
 
 //    // RT-21096 : Promote impl_getStyleMap / impl_setStyleMap to public API
     public static Map<StyleableProperty<?>, List<Style>> getStyleMap(Node node) {
-        return node.impl_findStyles(null);
+//        return node.impl_findStyles(null);
+        System.err.println("Error: findStyles is no longer publicly accessible");
+        return null;
     }
 
     public static void reapplyCSS(Parent parent, String stylesheetPath) {
@@ -131,7 +135,9 @@
 
     @SuppressWarnings("rawtypes")
     public static List<Style> getMatchingStyles(CssMetaData cssMetaData, Styleable styleable) {
-        return Node.impl_getMatchingStyles(cssMetaData, styleable);
+//        return Node.impl_getMatchingStyles(cssMetaData, styleable);
+        System.err.println("Error: impl_getMatchingStyles is no longer publicly accessible");
+        return null;
     }
 
     // Deprecated stuff in Parent
@@ -139,7 +145,8 @@
     // Deprecated stuff in FXMLLoader
     // RT-21226 : Promote setStaticLoad to public API
     public static void setStaticLoad(FXMLLoader loader, boolean staticLoad) {
-        loader.impl_setStaticLoad(staticLoad);
+//        loader.impl_setStaticLoad(staticLoad);
+        System.err.println("Error: impl_setStaticLoad is no longer publicly accessible");
     }
 
     // RT-20184 : FX should provide a Parent.pick() routine
--- a/apps/toys/Hello/src/main/java/hello/HelloCSS.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/apps/toys/Hello/src/main/java/hello/HelloCSS.java	Fri Jun 10 09:43:53 2016 -0400
@@ -172,9 +172,6 @@
             super(100, 100);
         }
 
-        @Override public void impl_processCSS() {
-            super.impl_processCSS();
-        }
         StyleablePropertyFactory<TestNode> factory = new StyleablePropertyFactory<>(Rectangle.getClassCssMetaData());
         StyleableProperty<Duration> myDuration = factory.createStyleableDurationProperty(this, "myDuration", "-my-duration", (s) -> s.myDuration, Duration.millis(1000));
 
--- a/buildSrc/src/main/java/com/sun/javafx/beans/annotations/Default.java	Thu Jun 09 04:49:32 2016 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,61 +0,0 @@
-/*
- * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package com.sun.javafx.beans.annotations;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * <p>
- * Specifies the default value for the property corresponding to a constructor
- * parameter in an immutable class. This allows the generated Builder class to
- * work correctly when no value is supplied for that parameter.
- *
- */
-@Retention(RetentionPolicy.SOURCE)
-@Target(ElementType.PARAMETER)
-public @interface Default {
-    /**
-     * <p>
-     * The default value for this parameter, specified as a string value that
-     * can be used in an initializer. For example, it could be {@code "1.0"} for
-     * a parameter of type {@code double}. An empty string can be used to
-     * indicate the default value for the parameter of this type, so
-     * {@code @Default("")} would indicate {@code 0.0} for a parameter of type
-     * {@code double} or {@code null} for a parameter of type {@code String}.
-     * </p>
-     *
-     * <p>
-     * Note: for parameters of type {@code String}, it is easy to forget the
-     * quotes around a string literal. A string parameter whose default is the
-     * empty string would be specified like this:<br>
-     * {@code @Default("\"\"") name}.
-     * </p>
-     */
-    public String value();
-}
--- a/buildSrc/src/main/java/com/sun/javafx/beans/annotations/Delegate.java	Thu Jun 09 04:49:32 2016 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,42 +0,0 @@
-/*
- * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package com.sun.javafx.beans.annotations;
-
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.RetentionPolicy.SOURCE;
-
-import java.lang.annotation.*;
-
-/**
- * Indicates that a field is a "delegate": public methods of the type of such
- * field are present in the type containing the field, and their implementation
- * simply delegates to the field.
- *
- */
-@Target(FIELD)
-@Retention(SOURCE)
-public @interface Delegate {
-}
--- a/buildSrc/src/main/java/com/sun/javafx/collections/annotations/ReturnsUnmodifiableCollection.java	Thu Jun 09 04:49:32 2016 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,39 +0,0 @@
-/*
- * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package com.sun.javafx.collections.annotations;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-/**
- * This annotation is to be used for methods that return unmodifiable
- * collections.
- */
-@Target(value={java.lang.annotation.ElementType.METHOD})
-@Retention(value=java.lang.annotation.RetentionPolicy.SOURCE)
-public @interface ReturnsUnmodifiableCollection {
-
-}
--- a/modules/base/src/main/java/com/sun/javafx/binding/SelectBinding.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/base/src/main/java/com/sun/javafx/binding/SelectBinding.java	Fri Jun 10 09:43:53 2016 -0400
@@ -42,7 +42,6 @@
 import javafx.collections.FXCollections;
 import javafx.collections.ObservableList;
 
-import com.sun.javafx.collections.annotations.ReturnsUnmodifiableCollection;
 import com.sun.javafx.property.JavaBeanAccessHelper;
 import sun.util.logging.PlatformLogger;
 import sun.util.logging.PlatformLogger.Level;
@@ -103,7 +102,6 @@
 
 
         @Override
-        @ReturnsUnmodifiableCollection
         public ObservableList<ObservableValue<?>> getDependencies() {
             return helper.getDependencies();
         }
@@ -154,7 +152,6 @@
         }
 
         @Override
-        @ReturnsUnmodifiableCollection
         public ObservableList<ObservableValue<?>> getDependencies() {
             return helper.getDependencies();
         }
@@ -205,7 +202,6 @@
         }
 
         @Override
-        @ReturnsUnmodifiableCollection
         public ObservableList<ObservableValue<?>> getDependencies() {
             return helper.getDependencies();
         }
@@ -256,7 +252,6 @@
         }
 
         @Override
-        @ReturnsUnmodifiableCollection
         public ObservableList<ObservableValue<?>> getDependencies() {
             return helper.getDependencies();
         }
@@ -307,7 +302,6 @@
         }
 
         @Override
-        @ReturnsUnmodifiableCollection
         public ObservableList<ObservableValue<?>> getDependencies() {
             return helper.getDependencies();
         }
@@ -358,7 +352,6 @@
         }
 
         @Override
-        @ReturnsUnmodifiableCollection
         public ObservableList<ObservableValue<?>> getDependencies() {
             return helper.getDependencies();
         }
@@ -405,7 +398,6 @@
         }
 
         @Override
-        @ReturnsUnmodifiableCollection
         public ObservableList<ObservableValue<?>> getDependencies() {
             return helper.getDependencies();
         }
@@ -546,7 +538,6 @@
             }
         }
 
-        @ReturnsUnmodifiableCollection
         public ObservableList<ObservableValue<?>> getDependencies() {
             if (dependencies == null) {
                 dependencies = FXCollections.observableArrayList();
--- a/modules/base/src/main/java/com/sun/javafx/binding/StringFormatter.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/base/src/main/java/com/sun/javafx/binding/StringFormatter.java	Fri Jun 10 09:43:53 2016 -0400
@@ -35,7 +35,6 @@
 import javafx.collections.FXCollections;
 import javafx.collections.ObservableList;
 
-import com.sun.javafx.collections.annotations.ReturnsUnmodifiableCollection;
 
 public abstract class StringFormatter extends StringBinding {
 
@@ -86,7 +85,6 @@
                 }
 
                 @Override
-                @ReturnsUnmodifiableCollection
                 public ObservableList<ObservableValue<?>> getDependencies() {
                     return FXCollections.<ObservableValue<?>> singletonObservableList(observableValue);
                 }
@@ -130,7 +128,6 @@
             }
 
             @Override
-            @ReturnsUnmodifiableCollection
             public ObservableList<ObservableValue<?>> getDependencies() {
                 return FXCollections.unmodifiableObservableList(FXCollections
                         .observableArrayList(extractDependencies(args)));
@@ -162,7 +159,6 @@
             }
 
             @Override
-            @ReturnsUnmodifiableCollection
             public ObservableList<ObservableValue<?>> getDependencies() {
                 return FXCollections.unmodifiableObservableList(FXCollections
                         .observableArrayList(extractDependencies(args)));
@@ -197,7 +193,6 @@
             }
 
             @Override
-            @ReturnsUnmodifiableCollection
             public ObservableList<ObservableValue<?>> getDependencies() {
                 return FXCollections.unmodifiableObservableList(FXCollections
                         .observableArrayList(extractDependencies(args)));
--- a/modules/base/src/main/java/com/sun/javafx/collections/UnmodifiableObservableMap.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/base/src/main/java/com/sun/javafx/collections/UnmodifiableObservableMap.java	Fri Jun 10 09:43:53 2016 -0400
@@ -37,7 +37,6 @@
 import javafx.collections.ObservableMap;
 import javafx.collections.WeakMapChangeListener;
 
-import com.sun.javafx.collections.annotations.ReturnsUnmodifiableCollection;
 
 /**
  * ObservableMap wrapper that does not allow changes to the underlying container.
@@ -110,7 +109,6 @@
         return backingMap.get(key);
     }
 
-    @Override @ReturnsUnmodifiableCollection
     public Set<K> keySet() {
         if (keyset == null) {
             keyset = Collections.unmodifiableSet(backingMap.keySet());
@@ -118,7 +116,6 @@
         return keyset;
     }
 
-    @Override @ReturnsUnmodifiableCollection
     public Collection<V> values() {
         if (values == null) {
             values = Collections.unmodifiableCollection(backingMap.values());
@@ -126,7 +123,6 @@
         return values;
     }
 
-    @Override @ReturnsUnmodifiableCollection
     public Set<Entry<K,V>> entrySet() {
         if (entryset == null) {
             entryset = Collections.unmodifiableMap(backingMap).entrySet();
--- a/modules/base/src/main/java/javafx/beans/binding/Binding.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/base/src/main/java/javafx/beans/binding/Binding.java	Fri Jun 10 09:43:53 2016 -0400
@@ -27,7 +27,6 @@
 
 import javafx.beans.value.ObservableValue;
 import javafx.collections.ObservableList;
-import com.sun.javafx.collections.annotations.ReturnsUnmodifiableCollection;
 
 /**
  * A {@code Binding} calculates a value that depends on one or more sources. The
@@ -84,7 +83,6 @@
      *
      * @return an unmodifiable {@code} ObservableList of the dependencies
      */
-    @ReturnsUnmodifiableCollection
     ObservableList<?> getDependencies();
 
     /**
--- a/modules/base/src/main/java/javafx/beans/binding/Bindings.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/base/src/main/java/javafx/beans/binding/Bindings.java	Fri Jun 10 09:43:53 2016 -0400
@@ -62,7 +62,6 @@
 import com.sun.javafx.binding.StringConstant;
 import com.sun.javafx.binding.StringFormatter;
 import com.sun.javafx.collections.ImmutableObservableList;
-import com.sun.javafx.collections.annotations.ReturnsUnmodifiableCollection;
 import javafx.collections.ObservableArray;
 import javafx.collections.ObservableFloatArray;
 import javafx.collections.ObservableIntegerArray;
@@ -143,7 +142,6 @@
             }
 
             @Override
-            @ReturnsUnmodifiableCollection
             public ObservableList<?> getDependencies() {
                 return  ((dependencies == null) || (dependencies.length == 0))?
                             FXCollections.emptyObservableList()
@@ -184,7 +182,6 @@
             }
 
             @Override
-            @ReturnsUnmodifiableCollection
             public ObservableList<?> getDependencies() {
                 return  ((dependencies == null) || (dependencies.length == 0))?
                             FXCollections.emptyObservableList()
@@ -225,7 +222,6 @@
             }
 
             @Override
-            @ReturnsUnmodifiableCollection
             public ObservableList<?> getDependencies() {
                 return  ((dependencies == null) || (dependencies.length == 0))?
                             FXCollections.emptyObservableList()
@@ -266,7 +262,6 @@
             }
 
             @Override
-            @ReturnsUnmodifiableCollection
             public ObservableList<?> getDependencies() {
                 return  ((dependencies == null) || (dependencies.length == 0))?
                             FXCollections.emptyObservableList()
@@ -307,7 +302,6 @@
             }
 
             @Override
-            @ReturnsUnmodifiableCollection
             public ObservableList<?> getDependencies() {
                 return  ((dependencies == null) || (dependencies.length == 0))?
                             FXCollections.emptyObservableList()
@@ -348,7 +342,6 @@
             }
 
             @Override
-            @ReturnsUnmodifiableCollection
             public ObservableList<?> getDependencies() {
                 return  ((dependencies == null) || (dependencies.length == 0))?
                             FXCollections.emptyObservableList()
@@ -389,7 +382,6 @@
             }
 
             @Override
-            @ReturnsUnmodifiableCollection
             public ObservableList<?> getDependencies() {
                 return  ((dependencies == null) || (dependencies.length == 0))?
                             FXCollections.emptyObservableList()
@@ -1130,7 +1122,6 @@
                 }
 
                 @Override
-                @ReturnsUnmodifiableCollection
                 public ObservableList<?> getDependencies() {
                     return FXCollections.singletonObservableList(value);
                 }
@@ -1152,7 +1143,6 @@
                 }
 
                 @Override
-                @ReturnsUnmodifiableCollection
                 public ObservableList<?> getDependencies() {
                     return FXCollections.singletonObservableList(value);
                 }
@@ -1174,7 +1164,6 @@
                 }
 
                 @Override
-                @ReturnsUnmodifiableCollection
                 public ObservableList<?> getDependencies() {
                     return FXCollections.singletonObservableList(value);
                 }
@@ -1196,7 +1185,6 @@
                 }
 
                 @Override
-                @ReturnsUnmodifiableCollection
                 public ObservableList<?> getDependencies() {
                     return FXCollections.singletonObservableList(value);
                 }
@@ -1230,7 +1218,6 @@
                 }
 
                 @Override
-                @ReturnsUnmodifiableCollection
                 public ObservableList<?> getDependencies() {
                     return (dependencies.length == 1)?
                             FXCollections.singletonObservableList(dependencies[0])
@@ -1254,7 +1241,6 @@
                 }
 
                 @Override
-                @ReturnsUnmodifiableCollection
                 public ObservableList<?> getDependencies() {
                     return (dependencies.length == 1)?
                             FXCollections.singletonObservableList(dependencies[0])
@@ -1278,7 +1264,6 @@
                 }
 
                 @Override
-                @ReturnsUnmodifiableCollection
                 public ObservableList<?> getDependencies() {
                     return (dependencies.length == 1)?
                             FXCollections.singletonObservableList(dependencies[0])
@@ -1302,7 +1287,6 @@
                 }
 
                 @Override
-                @ReturnsUnmodifiableCollection
                 public ObservableList<?> getDependencies() {
                     return (dependencies.length == 1)?
                             FXCollections.singletonObservableList(dependencies[0])
@@ -1491,7 +1475,6 @@
                 }
 
                 @Override
-                @ReturnsUnmodifiableCollection
                 public ObservableList<?> getDependencies() {
                     return (dependencies.length == 1)?
                             FXCollections.singletonObservableList(dependencies[0])
@@ -1515,7 +1498,6 @@
                 }
 
                 @Override
-                @ReturnsUnmodifiableCollection
                 public ObservableList<?> getDependencies() {
                     return (dependencies.length == 1)?
                             FXCollections.singletonObservableList(dependencies[0])
@@ -1539,7 +1521,6 @@
                 }
 
                 @Override
-                @ReturnsUnmodifiableCollection
                 public ObservableList<?> getDependencies() {
                     return (dependencies.length == 1)?
                             FXCollections.singletonObservableList(dependencies[0])
@@ -1563,7 +1544,6 @@
                 }
 
                 @Override
-                @ReturnsUnmodifiableCollection
                 public ObservableList<?> getDependencies() {
                     return (dependencies.length == 1)?
                             FXCollections.singletonObservableList(dependencies[0])
@@ -1752,7 +1732,6 @@
                 }
 
                 @Override
-                @ReturnsUnmodifiableCollection
                 public ObservableList<?> getDependencies() {
                     return (dependencies.length == 1)?
                             FXCollections.singletonObservableList(dependencies[0])
@@ -1776,7 +1755,6 @@
                 }
 
                 @Override
-                @ReturnsUnmodifiableCollection
                 public ObservableList<?> getDependencies() {
                     return (dependencies.length == 1)?
                             FXCollections.singletonObservableList(dependencies[0])
@@ -1800,7 +1778,6 @@
                 }
 
                 @Override
-                @ReturnsUnmodifiableCollection
                 public ObservableList<?> getDependencies() {
                     return (dependencies.length == 1)?
                             FXCollections.singletonObservableList(dependencies[0])
@@ -1824,7 +1801,6 @@
                 }
 
                 @Override
-                @ReturnsUnmodifiableCollection
                 public ObservableList<?> getDependencies() {
                     return (dependencies.length == 1)?
                             FXCollections.singletonObservableList(dependencies[0])
@@ -2013,7 +1989,6 @@
                 }
 
                 @Override
-                @ReturnsUnmodifiableCollection
                 public ObservableList<?> getDependencies() {
                     return (dependencies.length == 1)?
                             FXCollections.singletonObservableList(dependencies[0])
@@ -2037,7 +2012,6 @@
                 }
 
                 @Override
-                @ReturnsUnmodifiableCollection
                 public ObservableList<?> getDependencies() {
                     return (dependencies.length == 1)?
                             FXCollections.singletonObservableList(dependencies[0])
@@ -2061,7 +2035,6 @@
                 }
 
                 @Override
-                @ReturnsUnmodifiableCollection
                 public ObservableList<?> getDependencies() {
                     return (dependencies.length == 1)?
                             FXCollections.singletonObservableList(dependencies[0])
@@ -2085,7 +2058,6 @@
                 }
 
                 @Override
-                @ReturnsUnmodifiableCollection
                 public ObservableList<?> getDependencies() {
                     return (dependencies.length == 1)?
                             FXCollections.singletonObservableList(dependencies[0])
@@ -2274,7 +2246,6 @@
                 }
 
                 @Override
-                @ReturnsUnmodifiableCollection
                 public ObservableList<?> getDependencies() {
                     return (dependencies.length == 1)?
                             FXCollections.singletonObservableList(dependencies[0])
@@ -2298,7 +2269,6 @@
                 }
 
                 @Override
-                @ReturnsUnmodifiableCollection
                 public ObservableList<?> getDependencies() {
                     return (dependencies.length == 1)?
                             FXCollections.singletonObservableList(dependencies[0])
@@ -2322,7 +2292,6 @@
                 }
 
                 @Override
-                @ReturnsUnmodifiableCollection
                 public ObservableList<?> getDependencies() {
                     return (dependencies.length == 1)?
                             FXCollections.singletonObservableList(dependencies[0])
@@ -2346,7 +2315,6 @@
                 }
 
                 @Override
-                @ReturnsUnmodifiableCollection
                 public ObservableList<?> getDependencies() {
                     return (dependencies.length == 1)?
                             FXCollections.singletonObservableList(dependencies[0])
@@ -2713,7 +2681,6 @@
                 }
 
                 @Override
-                @ReturnsUnmodifiableCollection
                 public ObservableList<?> getDependencies() {
                     return (dependencies.length == 1)?
                             FXCollections.singletonObservableList(dependencies[0])
@@ -2737,7 +2704,6 @@
                 }
 
                 @Override
-                @ReturnsUnmodifiableCollection
                 public ObservableList<?> getDependencies() {
                     return (dependencies.length == 1)?
                             FXCollections.singletonObservableList(dependencies[0])
@@ -2761,7 +2727,6 @@
                 }
 
                 @Override
-                @ReturnsUnmodifiableCollection
                 public ObservableList<?> getDependencies() {
                     return (dependencies.length == 1)?
                             FXCollections.singletonObservableList(dependencies[0])
@@ -2785,7 +2750,6 @@
                 }
 
                 @Override
-                @ReturnsUnmodifiableCollection
                 public ObservableList<?> getDependencies() {
                     return (dependencies.length == 1)?
                             FXCollections.singletonObservableList(dependencies[0])
@@ -3152,7 +3116,6 @@
                 }
 
                 @Override
-                @ReturnsUnmodifiableCollection
                 public ObservableList<?> getDependencies() {
                     return (dependencies.length == 1)?
                             FXCollections.singletonObservableList(dependencies[0])
@@ -3176,7 +3139,6 @@
                 }
 
                 @Override
-                @ReturnsUnmodifiableCollection
                 public ObservableList<?> getDependencies() {
                     return (dependencies.length == 1)?
                             FXCollections.singletonObservableList(dependencies[0])
@@ -3200,7 +3162,6 @@
                 }
 
                 @Override
-                @ReturnsUnmodifiableCollection
                 public ObservableList<?> getDependencies() {
                     return (dependencies.length == 1)?
                             FXCollections.singletonObservableList(dependencies[0])
@@ -3224,7 +3185,6 @@
                 }
 
                 @Override
-                @ReturnsUnmodifiableCollection
                 public ObservableList<?> getDependencies() {
                     return (dependencies.length == 1)?
                             FXCollections.singletonObservableList(dependencies[0])
@@ -3575,7 +3535,6 @@
                 }
 
                 @Override
-                @ReturnsUnmodifiableCollection
                 public ObservableList<?> getDependencies() {
                     return (dependencies.length == 1)?
                             FXCollections.singletonObservableList(dependencies[0])
@@ -3599,7 +3558,6 @@
                 }
 
                 @Override
-                @ReturnsUnmodifiableCollection
                 public ObservableList<?> getDependencies() {
                     return (dependencies.length == 1)?
                             FXCollections.singletonObservableList(dependencies[0])
@@ -3623,7 +3581,6 @@
                 }
 
                 @Override
-                @ReturnsUnmodifiableCollection
                 public ObservableList<?> getDependencies() {
                     return (dependencies.length == 1)?
                             FXCollections.singletonObservableList(dependencies[0])
@@ -3647,7 +3604,6 @@
                 }
 
                 @Override
-                @ReturnsUnmodifiableCollection
                 public ObservableList<?> getDependencies() {
                     return (dependencies.length == 1)?
                             FXCollections.singletonObservableList(dependencies[0])
@@ -3999,7 +3955,6 @@
                 }
 
                 @Override
-                @ReturnsUnmodifiableCollection
                 public ObservableList<?> getDependencies() {
                     return (dependencies.length == 1)?
                             FXCollections.singletonObservableList(dependencies[0])
@@ -4023,7 +3978,6 @@
                 }
 
                 @Override
-                @ReturnsUnmodifiableCollection
                 public ObservableList<?> getDependencies() {
                     return (dependencies.length == 1)?
                             FXCollections.singletonObservableList(dependencies[0])
@@ -4047,7 +4001,6 @@
                 }
 
                 @Override
-                @ReturnsUnmodifiableCollection
                 public ObservableList<?> getDependencies() {
                     return (dependencies.length == 1)?
                             FXCollections.singletonObservableList(dependencies[0])
@@ -4071,7 +4024,6 @@
                 }
 
                 @Override
-                @ReturnsUnmodifiableCollection
                 public ObservableList<?> getDependencies() {
                     return (dependencies.length == 1)?
                             FXCollections.singletonObservableList(dependencies[0])
@@ -4260,7 +4212,6 @@
                 }
 
                 @Override
-                @ReturnsUnmodifiableCollection
                 public ObservableList<?> getDependencies() {
                     return (dependencies.length == 1)?
                             FXCollections.singletonObservableList(dependencies[0])
@@ -4284,7 +4235,6 @@
                 }
 
                 @Override
-                @ReturnsUnmodifiableCollection
                 public ObservableList<?> getDependencies() {
                     return (dependencies.length == 1)?
                             FXCollections.singletonObservableList(dependencies[0])
@@ -4308,7 +4258,6 @@
                 }
 
                 @Override
-                @ReturnsUnmodifiableCollection
                 public ObservableList<?> getDependencies() {
                     return (dependencies.length == 1)?
                             FXCollections.singletonObservableList(dependencies[0])
@@ -4332,7 +4281,6 @@
                 }
 
                 @Override
-                @ReturnsUnmodifiableCollection
                 public ObservableList<?> getDependencies() {
                     return (dependencies.length == 1)?
                             FXCollections.singletonObservableList(dependencies[0])
@@ -4527,7 +4475,6 @@
         }
 
         @Override
-        @ReturnsUnmodifiableCollection
         public ObservableList<?> getDependencies() {
             return new ImmutableObservableList<>(op1, op2);
         }
@@ -4607,7 +4554,6 @@
         }
 
         @Override
-        @ReturnsUnmodifiableCollection
         public ObservableList<?> getDependencies() {
             return new ImmutableObservableList<>(op1, op2);
         }
@@ -4692,7 +4638,6 @@
             }
 
             @Override
-            @ReturnsUnmodifiableCollection
             public ObservableList<?> getDependencies() {
                 return FXCollections.singletonObservableList(op);
             }
@@ -4732,7 +4677,6 @@
             }
 
             @Override
-            @ReturnsUnmodifiableCollection
             public ObservableList<?> getDependencies() {
                 return new ImmutableObservableList<ObservableBooleanValue>(op1, op2);
             }
@@ -4773,7 +4717,6 @@
             }
 
             @Override
-            @ReturnsUnmodifiableCollection
             public ObservableList<?> getDependencies() {
                 return new ImmutableObservableList<ObservableBooleanValue>(op1, op2);
             }
@@ -4901,7 +4844,6 @@
             }
 
             @Override
-            @ReturnsUnmodifiableCollection
             public ObservableList<?> getDependencies() {
                 return (dependencies.length == 1)?
                         FXCollections.singletonObservableList(dependencies[0])
@@ -4994,7 +4936,6 @@
             }
 
             @Override
-            @ReturnsUnmodifiableCollection
             public ObservableList<?> getDependencies() {
                 return (dependencies.length == 1)?
                         FXCollections.singletonObservableList(dependencies[0])
@@ -5087,7 +5028,6 @@
             }
 
             @Override
-            @ReturnsUnmodifiableCollection
             public ObservableList<?> getDependencies() {
                 return (dependencies.length == 1)?
                         FXCollections.singletonObservableList(dependencies[0])
@@ -5180,7 +5120,6 @@
             }
 
             @Override
-            @ReturnsUnmodifiableCollection
             public ObservableList<?> getDependencies() {
                 return (dependencies.length == 1)?
                         FXCollections.singletonObservableList(dependencies[0])
@@ -5274,7 +5213,6 @@
             }
 
             @Override
-            @ReturnsUnmodifiableCollection
             public ObservableList<?> getDependencies() {
                 return (dependencies.length == 1)?
                         FXCollections.singletonObservableList(dependencies[0])
@@ -5433,7 +5371,6 @@
             }
 
             @Override
-            @ReturnsUnmodifiableCollection
             public ObservableList<?> getDependencies() {
                 return (dependencies.length == 1)?
                         FXCollections.singletonObservableList(dependencies[0])
@@ -5603,7 +5540,6 @@
             }
 
             @Override
-            @ReturnsUnmodifiableCollection
             public ObservableList<?> getDependencies() {
                 return FXCollections.singletonObservableList(op);
             }
@@ -5645,7 +5581,6 @@
             }
 
             @Override
-            @ReturnsUnmodifiableCollection
             public ObservableList<?> getDependencies() {
                 return FXCollections.singletonObservableList(op);
             }
@@ -5687,7 +5622,6 @@
             }
 
             @Override
-            @ReturnsUnmodifiableCollection
             public ObservableList<?> getDependencies() {
                 return FXCollections.singletonObservableList(op);
             }
@@ -5721,7 +5655,6 @@
             }
 
             @Override
-            @ReturnsUnmodifiableCollection
             public ObservableList<?> getDependencies() {
                 return (dependencies.length == 1)?
                         FXCollections.singletonObservableList(dependencies[0])
@@ -5805,7 +5738,6 @@
             }
 
             @Override
-            @ReturnsUnmodifiableCollection
             public ObservableList<?> getDependencies() {
                 return (dependencies.length == 1)?
                         FXCollections.singletonObservableList(dependencies[0])
@@ -5897,7 +5829,6 @@
             }
 
             @Override
-            @ReturnsUnmodifiableCollection
             public ObservableList<?> getDependencies() {
                 return FXCollections.singletonObservableList(op);
             }
@@ -5936,7 +5867,6 @@
             }
 
             @Override
-            @ReturnsUnmodifiableCollection
             public ObservableList<?> getDependencies() {
                 return FXCollections.singletonObservableList(op);
             }
@@ -5979,7 +5909,6 @@
             }
 
             @Override
-            @ReturnsUnmodifiableCollection
             public ObservableList<?> getDependencies() {
                 return FXCollections.singletonObservableList(op);
             }
@@ -6019,7 +5948,6 @@
             }
 
             @Override
-            @ReturnsUnmodifiableCollection
             public ObservableList<?> getDependencies() {
                 return FXCollections.singletonObservableList(op);
             }
@@ -6059,7 +5987,6 @@
             }
 
             @Override
-            @ReturnsUnmodifiableCollection
             public ObservableList<?> getDependencies() {
                 return FXCollections.singletonObservableList(op);
             }
@@ -6108,7 +6035,6 @@
             }
 
             @Override
-            @ReturnsUnmodifiableCollection
             public ObservableList<?> getDependencies() {
                 return FXCollections.singletonObservableList(op);
             }
@@ -6169,7 +6095,6 @@
             }
 
             @Override
-            @ReturnsUnmodifiableCollection
             public ObservableList<?> getDependencies() {
                 return new ImmutableObservableList<Observable>(op, index);
             }
@@ -6222,7 +6147,6 @@
             }
 
             @Override
-            @ReturnsUnmodifiableCollection
             public ObservableList<?> getDependencies() {
                 return FXCollections.singletonObservableList(op);
             }
@@ -6286,7 +6210,6 @@
             }
 
             @Override
-            @ReturnsUnmodifiableCollection
             public ObservableList<?> getDependencies() {
                 return new ImmutableObservableList<Observable>(op, index);
             }
@@ -6339,7 +6262,6 @@
             }
 
             @Override
-            @ReturnsUnmodifiableCollection
             public ObservableList<?> getDependencies() {
                 return FXCollections.singletonObservableList(op);
             }
@@ -6403,7 +6325,6 @@
             }
 
             @Override
-            @ReturnsUnmodifiableCollection
             public ObservableList<?> getDependencies() {
                 return new ImmutableObservableList<Observable>(op, index);
             }
@@ -6456,7 +6377,6 @@
             }
 
             @Override
-            @ReturnsUnmodifiableCollection
             public ObservableList<?> getDependencies() {
                 return FXCollections.singletonObservableList(op);
             }
@@ -6520,7 +6440,6 @@
             }
 
             @Override
-            @ReturnsUnmodifiableCollection
             public ObservableList<?> getDependencies() {
                 return new ImmutableObservableList<Observable>(op, index);
             }
@@ -6573,7 +6492,6 @@
             }
 
             @Override
-            @ReturnsUnmodifiableCollection
             public ObservableList<?> getDependencies() {
                 return FXCollections.singletonObservableList(op);
             }
@@ -6637,7 +6555,6 @@
             }
 
             @Override
-            @ReturnsUnmodifiableCollection
             public ObservableList<?> getDependencies() {
                 return new ImmutableObservableList<Observable>(op, index);
             }
@@ -6690,7 +6607,6 @@
             }
 
             @Override
-            @ReturnsUnmodifiableCollection
             public ObservableList<?> getDependencies() {
                 return FXCollections.singletonObservableList(op);
             }
@@ -6754,7 +6670,6 @@
             }
 
             @Override
-            @ReturnsUnmodifiableCollection
             public ObservableList<?> getDependencies() {
                 return new ImmutableObservableList<Observable>(op, index);
             }
@@ -6802,7 +6717,6 @@
             }
 
             @Override
-            @ReturnsUnmodifiableCollection
             public ObservableList<?> getDependencies() {
                 return FXCollections.singletonObservableList(op);
             }
@@ -6861,7 +6775,6 @@
             }
 
             @Override
-            @ReturnsUnmodifiableCollection
             public ObservableList<?> getDependencies() {
                 return new ImmutableObservableList<Observable>(op, index);
             }
@@ -6904,7 +6817,6 @@
             }
 
             @Override
-            @ReturnsUnmodifiableCollection
             public ObservableList<?> getDependencies() {
                 return FXCollections.singletonObservableList(op);
             }
@@ -6944,7 +6856,6 @@
             }
 
             @Override
-            @ReturnsUnmodifiableCollection
             public ObservableList<?> getDependencies() {
                 return FXCollections.singletonObservableList(op);
             }
@@ -6984,7 +6895,6 @@
             }
 
             @Override
-            @ReturnsUnmodifiableCollection
             public ObservableList<?> getDependencies() {
                 return FXCollections.singletonObservableList(op);
             }
@@ -7025,7 +6935,6 @@
             }
 
             @Override
-            @ReturnsUnmodifiableCollection
             public ObservableList<?> getDependencies() {
                 return FXCollections.singletonObservableList(op);
             }
@@ -7073,7 +6982,6 @@
             }
 
             @Override
-            @ReturnsUnmodifiableCollection
             public ObservableList<?> getDependencies() {
                 return FXCollections.singletonObservableList(op);
             }
@@ -7132,7 +7040,6 @@
             }
 
             @Override
-            @ReturnsUnmodifiableCollection
             public ObservableList<?> getDependencies() {
                 return new ImmutableObservableList<>(op, index);
             }
@@ -7180,7 +7087,6 @@
             }
 
             @Override
-            @ReturnsUnmodifiableCollection
             public ObservableList<?> getDependencies() {
                 return FXCollections.singletonObservableList(op);
             }
@@ -7239,7 +7145,6 @@
             }
 
             @Override
-            @ReturnsUnmodifiableCollection
             public ObservableList<?> getDependencies() {
                 return new ImmutableObservableList<>(op, index);
             }
@@ -7284,7 +7189,6 @@
             }
 
             @Override
-            @ReturnsUnmodifiableCollection
             public ObservableList<?> getDependencies() {
                 return FXCollections.singletonObservableList(op);
             }
@@ -7325,7 +7229,6 @@
             }
 
             @Override
-            @ReturnsUnmodifiableCollection
             public ObservableList<?> getDependencies() {
                 return FXCollections.singletonObservableList(op);
             }
@@ -7366,7 +7269,6 @@
             }
 
             @Override
-            @ReturnsUnmodifiableCollection
             public ObservableList<?> getDependencies() {
                 return FXCollections.singletonObservableList(op);
             }
@@ -7415,7 +7317,6 @@
             }
 
             @Override
-            @ReturnsUnmodifiableCollection
             public ObservableList<?> getDependencies() {
                 return FXCollections.singletonObservableList(op);
             }
@@ -7464,7 +7365,6 @@
             }
 
             @Override
-            @ReturnsUnmodifiableCollection
             public ObservableList<?> getDependencies() {
                 return new ImmutableObservableList<Observable>(op, key);
             }
@@ -7518,7 +7418,6 @@
             }
 
             @Override
-            @ReturnsUnmodifiableCollection
             public ObservableList<?> getDependencies() {
                 return FXCollections.singletonObservableList(op);
             }
@@ -7572,7 +7471,6 @@
             }
 
             @Override
-            @ReturnsUnmodifiableCollection
             public ObservableList<?> getDependencies() {
                 return new ImmutableObservableList<Observable>(op, key);
             }
@@ -7626,7 +7524,6 @@
             }
 
             @Override
-            @ReturnsUnmodifiableCollection
             public ObservableList<?> getDependencies() {
                 return FXCollections.singletonObservableList(op);
             }
@@ -7680,7 +7577,6 @@
             }
 
             @Override
-            @ReturnsUnmodifiableCollection
             public ObservableList<?> getDependencies() {
                 return new ImmutableObservableList<Observable>(op, key);
             }
@@ -7734,7 +7630,6 @@
             }
 
             @Override
-            @ReturnsUnmodifiableCollection
             public ObservableList<?> getDependencies() {
                 return FXCollections.singletonObservableList(op);
             }
@@ -7788,7 +7683,6 @@
             }
 
             @Override
-            @ReturnsUnmodifiableCollection
             public ObservableList<?> getDependencies() {
                 return new ImmutableObservableList<Observable>(op, key);
             }
@@ -7842,7 +7736,6 @@
             }
 
             @Override
-            @ReturnsUnmodifiableCollection
             public ObservableList<?> getDependencies() {
                 return FXCollections.singletonObservableList(op);
             }
@@ -7896,7 +7789,6 @@
             }
 
             @Override
-            @ReturnsUnmodifiableCollection
             public ObservableList<?> getDependencies() {
                 return new ImmutableObservableList<Observable>(op, key);
             }
@@ -7950,7 +7842,6 @@
             }
 
             @Override
-            @ReturnsUnmodifiableCollection
             public ObservableList<?> getDependencies() {
                 return FXCollections.singletonObservableList(op);
             }
@@ -8004,7 +7895,6 @@
             }
 
             @Override
-            @ReturnsUnmodifiableCollection
             public ObservableList<?> getDependencies() {
                 return new ImmutableObservableList<Observable>(op, key);
             }
@@ -8053,7 +7943,6 @@
             }
 
             @Override
-            @ReturnsUnmodifiableCollection
             public ObservableList<?> getDependencies() {
                 return FXCollections.singletonObservableList(op);
             }
@@ -8102,7 +7991,6 @@
             }
 
             @Override
-            @ReturnsUnmodifiableCollection
             public ObservableList<?> getDependencies() {
                 return new ImmutableObservableList<Observable>(op, key);
             }
--- a/modules/base/src/main/java/javafx/beans/binding/BooleanBinding.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/base/src/main/java/javafx/beans/binding/BooleanBinding.java	Fri Jun 10 09:43:53 2016 -0400
@@ -30,7 +30,6 @@
 import javafx.beans.value.ChangeListener;
 import javafx.collections.FXCollections;
 import javafx.collections.ObservableList;
-import com.sun.javafx.collections.annotations.ReturnsUnmodifiableCollection;
 
 import com.sun.javafx.binding.BindingHelperObserver;
 import com.sun.javafx.binding.ExpressionHelper;
@@ -138,7 +137,6 @@
      * @return an empty {@code ObservableList}
      */
     @Override
-    @ReturnsUnmodifiableCollection
     public ObservableList<?> getDependencies() {
         return FXCollections.emptyObservableList();
     }
--- a/modules/base/src/main/java/javafx/beans/binding/BooleanExpression.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/base/src/main/java/javafx/beans/binding/BooleanExpression.java	Fri Jun 10 09:43:53 2016 -0400
@@ -30,7 +30,6 @@
 import javafx.collections.ObservableList;
 
 import com.sun.javafx.binding.StringFormatter;
-import com.sun.javafx.collections.annotations.ReturnsUnmodifiableCollection;
 import javafx.beans.value.ObservableValue;
 
 /**
@@ -93,7 +92,6 @@
                     }
 
                     @Override
-                    @ReturnsUnmodifiableCollection
                     public ObservableList<ObservableBooleanValue> getDependencies() {
                         return FXCollections.singletonObservableList(value);
                     }
@@ -140,7 +138,6 @@
             }
 
             @Override
-            @ReturnsUnmodifiableCollection
             public ObservableList<ObservableValue<Boolean>> getDependencies() {
                 return FXCollections.singletonObservableList(value);
             }
--- a/modules/base/src/main/java/javafx/beans/binding/DoubleBinding.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/base/src/main/java/javafx/beans/binding/DoubleBinding.java	Fri Jun 10 09:43:53 2016 -0400
@@ -30,7 +30,6 @@
 import javafx.beans.value.ChangeListener;
 import javafx.collections.FXCollections;
 import javafx.collections.ObservableList;
-import com.sun.javafx.collections.annotations.ReturnsUnmodifiableCollection;
 
 import com.sun.javafx.binding.BindingHelperObserver;
 import com.sun.javafx.binding.ExpressionHelper;
@@ -184,7 +183,6 @@
      * @return an empty {@code ObservableList}
      */
     @Override
-    @ReturnsUnmodifiableCollection
     public ObservableList<?> getDependencies() {
         return FXCollections.emptyObservableList();
     }
--- a/modules/base/src/main/java/javafx/beans/binding/DoubleExpression.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/base/src/main/java/javafx/beans/binding/DoubleExpression.java	Fri Jun 10 09:43:53 2016 -0400
@@ -29,7 +29,6 @@
 import javafx.beans.value.ObservableNumberValue;
 import javafx.collections.FXCollections;
 import javafx.collections.ObservableList;
-import com.sun.javafx.collections.annotations.ReturnsUnmodifiableCollection;
 import javafx.beans.value.ObservableValue;
 
 /**
@@ -107,7 +106,6 @@
                     }
 
                     @Override
-                    @ReturnsUnmodifiableCollection
                     public ObservableList<ObservableDoubleValue> getDependencies() {
                         return FXCollections.singletonObservableList(value);
                     }
@@ -165,7 +163,6 @@
             }
 
             @Override
-            @ReturnsUnmodifiableCollection
             public ObservableList<ObservableValue<T>> getDependencies() {
                 return FXCollections.singletonObservableList(value);
             }
--- a/modules/base/src/main/java/javafx/beans/binding/FloatBinding.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/base/src/main/java/javafx/beans/binding/FloatBinding.java	Fri Jun 10 09:43:53 2016 -0400
@@ -30,7 +30,6 @@
 import javafx.beans.value.ChangeListener;
 import javafx.collections.FXCollections;
 import javafx.collections.ObservableList;
-import com.sun.javafx.collections.annotations.ReturnsUnmodifiableCollection;
 
 import com.sun.javafx.binding.BindingHelperObserver;
 import com.sun.javafx.binding.ExpressionHelper;
@@ -134,7 +133,6 @@
      * @return an empty {@code ObservableList}
      */
     @Override
-    @ReturnsUnmodifiableCollection
     public ObservableList<?> getDependencies() {
         return FXCollections.emptyObservableList();
     }
--- a/modules/base/src/main/java/javafx/beans/binding/FloatExpression.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/base/src/main/java/javafx/beans/binding/FloatExpression.java	Fri Jun 10 09:43:53 2016 -0400
@@ -28,7 +28,6 @@
 import javafx.beans.value.ObservableFloatValue;
 import javafx.collections.FXCollections;
 import javafx.collections.ObservableList;
-import com.sun.javafx.collections.annotations.ReturnsUnmodifiableCollection;
 import javafx.beans.value.ObservableValue;
 
 /**
@@ -106,7 +105,6 @@
                     }
 
                     @Override
-                    @ReturnsUnmodifiableCollection
                     public ObservableList<ObservableFloatValue> getDependencies() {
                         return FXCollections.singletonObservableList(value);
                     }
@@ -164,7 +162,6 @@
             }
 
             @Override
-            @ReturnsUnmodifiableCollection
             public ObservableList<ObservableValue<T>> getDependencies() {
                 return FXCollections.singletonObservableList(value);
             }
--- a/modules/base/src/main/java/javafx/beans/binding/IntegerBinding.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/base/src/main/java/javafx/beans/binding/IntegerBinding.java	Fri Jun 10 09:43:53 2016 -0400
@@ -30,7 +30,6 @@
 import javafx.beans.value.ChangeListener;
 import javafx.collections.FXCollections;
 import javafx.collections.ObservableList;
-import com.sun.javafx.collections.annotations.ReturnsUnmodifiableCollection;
 
 import com.sun.javafx.binding.BindingHelperObserver;
 import com.sun.javafx.binding.ExpressionHelper;
@@ -134,7 +133,6 @@
      * @return an empty {@code ObservableList}
      */
     @Override
-    @ReturnsUnmodifiableCollection
     public ObservableList<?> getDependencies() {
         return FXCollections.emptyObservableList();
     }
--- a/modules/base/src/main/java/javafx/beans/binding/IntegerExpression.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/base/src/main/java/javafx/beans/binding/IntegerExpression.java	Fri Jun 10 09:43:53 2016 -0400
@@ -28,7 +28,6 @@
 import javafx.beans.value.ObservableIntegerValue;
 import javafx.collections.FXCollections;
 import javafx.collections.ObservableList;
-import com.sun.javafx.collections.annotations.ReturnsUnmodifiableCollection;
 import javafx.beans.value.ObservableValue;
 
 /**
@@ -106,7 +105,6 @@
                     }
 
                     @Override
-                    @ReturnsUnmodifiableCollection
                     public ObservableList<ObservableIntegerValue> getDependencies() {
                         return FXCollections.singletonObservableList(value);
                     }
@@ -164,7 +162,6 @@
             }
 
             @Override
-            @ReturnsUnmodifiableCollection
             public ObservableList<ObservableValue<T>> getDependencies() {
                 return FXCollections.singletonObservableList(value);
             }
--- a/modules/base/src/main/java/javafx/beans/binding/ListBinding.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/base/src/main/java/javafx/beans/binding/ListBinding.java	Fri Jun 10 09:43:53 2016 -0400
@@ -27,7 +27,6 @@
 
 import com.sun.javafx.binding.BindingHelperObserver;
 import com.sun.javafx.binding.ListExpressionHelper;
-import com.sun.javafx.collections.annotations.ReturnsUnmodifiableCollection;
 import javafx.beans.InvalidationListener;
 import javafx.beans.Observable;
 import javafx.beans.property.ReadOnlyBooleanProperty;
@@ -222,7 +221,6 @@
      * @return an empty {@code ObservableList}
      */
     @Override
-    @ReturnsUnmodifiableCollection
     public ObservableList<?> getDependencies() {
         return FXCollections.emptyObservableList();
     }
--- a/modules/base/src/main/java/javafx/beans/binding/ListExpression.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/base/src/main/java/javafx/beans/binding/ListExpression.java	Fri Jun 10 09:43:53 2016 -0400
@@ -26,7 +26,6 @@
 package javafx.beans.binding;
 
 import com.sun.javafx.binding.StringFormatter;
-import com.sun.javafx.collections.annotations.ReturnsUnmodifiableCollection;
 import javafx.beans.property.ReadOnlyBooleanProperty;
 import javafx.beans.property.ReadOnlyIntegerProperty;
 import javafx.beans.value.ObservableIntegerValue;
@@ -99,7 +98,6 @@
             }
 
             @Override
-            @ReturnsUnmodifiableCollection
             public ObservableList<ObservableListValue<E>> getDependencies() {
                 return FXCollections.singletonObservableList(value);
             }
--- a/modules/base/src/main/java/javafx/beans/binding/LongBinding.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/base/src/main/java/javafx/beans/binding/LongBinding.java	Fri Jun 10 09:43:53 2016 -0400
@@ -30,7 +30,6 @@
 import javafx.beans.value.ChangeListener;
 import javafx.collections.FXCollections;
 import javafx.collections.ObservableList;
-import com.sun.javafx.collections.annotations.ReturnsUnmodifiableCollection;
 
 import com.sun.javafx.binding.BindingHelperObserver;
 import com.sun.javafx.binding.ExpressionHelper;
@@ -134,7 +133,6 @@
      * @return an empty {@code ObservableList}
      */
     @Override
-    @ReturnsUnmodifiableCollection
     public ObservableList<?> getDependencies() {
         return FXCollections.emptyObservableList();
     }
--- a/modules/base/src/main/java/javafx/beans/binding/LongExpression.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/base/src/main/java/javafx/beans/binding/LongExpression.java	Fri Jun 10 09:43:53 2016 -0400
@@ -28,7 +28,6 @@
 import javafx.beans.value.ObservableLongValue;
 import javafx.collections.FXCollections;
 import javafx.collections.ObservableList;
-import com.sun.javafx.collections.annotations.ReturnsUnmodifiableCollection;
 import javafx.beans.value.ObservableValue;
 
 /**
@@ -103,7 +102,6 @@
                     }
 
                     @Override
-                    @ReturnsUnmodifiableCollection
                     public ObservableList<ObservableLongValue> getDependencies() {
                         return FXCollections.singletonObservableList(value);
                     }
@@ -161,7 +159,6 @@
             }
 
             @Override
-            @ReturnsUnmodifiableCollection
             public ObservableList<ObservableValue<T>> getDependencies() {
                 return FXCollections.singletonObservableList(value);
             }
--- a/modules/base/src/main/java/javafx/beans/binding/MapBinding.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/base/src/main/java/javafx/beans/binding/MapBinding.java	Fri Jun 10 09:43:53 2016 -0400
@@ -27,7 +27,6 @@
 
 import com.sun.javafx.binding.BindingHelperObserver;
 import com.sun.javafx.binding.MapExpressionHelper;
-import com.sun.javafx.collections.annotations.ReturnsUnmodifiableCollection;
 import javafx.beans.InvalidationListener;
 import javafx.beans.Observable;
 import javafx.beans.property.ReadOnlyBooleanProperty;
@@ -225,7 +224,6 @@
      * @return an empty {@code ObservableList}
      */
     @Override
-    @ReturnsUnmodifiableCollection
     public ObservableList<?> getDependencies() {
         return FXCollections.emptyObservableList();
     }
--- a/modules/base/src/main/java/javafx/beans/binding/MapExpression.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/base/src/main/java/javafx/beans/binding/MapExpression.java	Fri Jun 10 09:43:53 2016 -0400
@@ -26,7 +26,6 @@
 package javafx.beans.binding;
 
 import com.sun.javafx.binding.StringFormatter;
-import com.sun.javafx.collections.annotations.ReturnsUnmodifiableCollection;
 import javafx.beans.InvalidationListener;
 import javafx.beans.property.ReadOnlyBooleanProperty;
 import javafx.beans.property.ReadOnlyIntegerProperty;
@@ -128,7 +127,6 @@
             }
 
             @Override
-            @ReturnsUnmodifiableCollection
             public ObservableList<?> getDependencies() {
                 return FXCollections.singletonObservableList(value);
             }
--- a/modules/base/src/main/java/javafx/beans/binding/ObjectBinding.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/base/src/main/java/javafx/beans/binding/ObjectBinding.java	Fri Jun 10 09:43:53 2016 -0400
@@ -30,7 +30,6 @@
 import javafx.beans.value.ChangeListener;
 import javafx.collections.FXCollections;
 import javafx.collections.ObservableList;
-import com.sun.javafx.collections.annotations.ReturnsUnmodifiableCollection;
 
 import com.sun.javafx.binding.BindingHelperObserver;
 import com.sun.javafx.binding.ExpressionHelper;
@@ -134,7 +133,6 @@
      * @return an empty {@code ObservableList}
      */
     @Override
-    @ReturnsUnmodifiableCollection
     public ObservableList<?> getDependencies() {
         return FXCollections.emptyObservableList();
     }
--- a/modules/base/src/main/java/javafx/beans/binding/ObjectExpression.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/base/src/main/java/javafx/beans/binding/ObjectExpression.java	Fri Jun 10 09:43:53 2016 -0400
@@ -30,7 +30,6 @@
 import javafx.collections.FXCollections;
 import javafx.collections.ObservableList;
 
-import com.sun.javafx.collections.annotations.ReturnsUnmodifiableCollection;
 import java.util.Locale;
 
 /**
@@ -87,7 +86,6 @@
                     }
 
                     @Override
-                    @ReturnsUnmodifiableCollection
                     public ObservableList<ObservableObjectValue<T>> getDependencies() {
                         return FXCollections.singletonObservableList(value);
                     }
--- a/modules/base/src/main/java/javafx/beans/binding/SetBinding.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/base/src/main/java/javafx/beans/binding/SetBinding.java	Fri Jun 10 09:43:53 2016 -0400
@@ -27,7 +27,6 @@
 
 import com.sun.javafx.binding.BindingHelperObserver;
 import com.sun.javafx.binding.SetExpressionHelper;
-import com.sun.javafx.collections.annotations.ReturnsUnmodifiableCollection;
 import javafx.beans.InvalidationListener;
 import javafx.beans.Observable;
 import javafx.beans.property.ReadOnlyBooleanProperty;
@@ -223,7 +222,6 @@
      * @return an empty {@code ObservableList}
      */
     @Override
-    @ReturnsUnmodifiableCollection
     public ObservableList<?> getDependencies() {
         return FXCollections.emptyObservableList();
     }
--- a/modules/base/src/main/java/javafx/beans/binding/SetExpression.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/base/src/main/java/javafx/beans/binding/SetExpression.java	Fri Jun 10 09:43:53 2016 -0400
@@ -26,7 +26,6 @@
 package javafx.beans.binding;
 
 import com.sun.javafx.binding.StringFormatter;
-import com.sun.javafx.collections.annotations.ReturnsUnmodifiableCollection;
 import javafx.beans.InvalidationListener;
 import javafx.beans.property.ReadOnlyBooleanProperty;
 import javafx.beans.property.ReadOnlyIntegerProperty;
@@ -152,7 +151,6 @@
             }
 
             @Override
-            @ReturnsUnmodifiableCollection
             public ObservableList<?> getDependencies() {
                 return FXCollections.singletonObservableList(value);
             }
--- a/modules/base/src/main/java/javafx/beans/binding/StringBinding.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/base/src/main/java/javafx/beans/binding/StringBinding.java	Fri Jun 10 09:43:53 2016 -0400
@@ -30,7 +30,6 @@
 import javafx.beans.value.ChangeListener;
 import javafx.collections.FXCollections;
 import javafx.collections.ObservableList;
-import com.sun.javafx.collections.annotations.ReturnsUnmodifiableCollection;
 
 import com.sun.javafx.binding.BindingHelperObserver;
 import com.sun.javafx.binding.ExpressionHelper;
@@ -133,7 +132,6 @@
      * @return an empty {@code ObservableList}
      */
     @Override
-    @ReturnsUnmodifiableCollection
     public ObservableList<?> getDependencies() {
         return FXCollections.emptyObservableList();
     }
--- a/modules/base/src/main/java/javafx/beans/binding/When.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/base/src/main/java/javafx/beans/binding/When.java	Fri Jun 10 09:43:53 2016 -0400
@@ -46,7 +46,6 @@
 import com.sun.javafx.binding.IntegerConstant;
 import com.sun.javafx.binding.Logging;
 import com.sun.javafx.binding.LongConstant;
-import com.sun.javafx.collections.annotations.ReturnsUnmodifiableCollection;
 
 /**
  * Starting point for a binding that calculates a ternary expression.
@@ -142,7 +141,6 @@
                 }
 
                 @Override
-                @ReturnsUnmodifiableCollection
                 public ObservableList<ObservableValue<?>> getDependencies() {
                     return FXCollections.unmodifiableObservableList(
                             FXCollections.<ObservableValue<?>> observableArrayList(condition, thenValue, otherwiseValue));
@@ -172,7 +170,6 @@
                 }
 
                 @Override
-                @ReturnsUnmodifiableCollection
                 public ObservableList<ObservableValue<?>> getDependencies() {
                     return FXCollections.unmodifiableObservableList(
                             FXCollections.<ObservableValue<?>> observableArrayList(condition, thenValue, otherwiseValue));
@@ -202,7 +199,6 @@
                 }
 
                 @Override
-                @ReturnsUnmodifiableCollection
                 public ObservableList<ObservableValue<?>> getDependencies() {
                     return FXCollections.unmodifiableObservableList(
                             FXCollections.<ObservableValue<?>> observableArrayList(condition, thenValue, otherwiseValue));
@@ -232,7 +228,6 @@
                 }
 
                 @Override
-                @ReturnsUnmodifiableCollection
                 public ObservableList<ObservableValue<?>> getDependencies() {
                     return FXCollections.unmodifiableObservableList(
                             FXCollections.<ObservableValue<?>> observableArrayList(condition, thenValue, otherwiseValue));
@@ -457,7 +452,6 @@
         }
 
         @Override
-        @ReturnsUnmodifiableCollection
         public ObservableList<ObservableValue<?>> getDependencies() {
             assert condition != null;
             final ObservableList<ObservableValue<?>> seq = FXCollections.<ObservableValue<?>> observableArrayList(condition);
@@ -629,7 +623,6 @@
 
 
         @Override
-        @ReturnsUnmodifiableCollection
         public ObservableList<ObservableValue<?>> getDependencies() {
             assert condition != null;
             final ObservableList<ObservableValue<?>> seq = FXCollections.<ObservableValue<?>> observableArrayList(condition);
@@ -798,7 +791,6 @@
 
 
         @Override
-        @ReturnsUnmodifiableCollection
         public ObservableList<ObservableValue<?>> getDependencies() {
             assert condition != null;
             final ObservableList<ObservableValue<?>> seq = FXCollections.<ObservableValue<?>> observableArrayList(condition);
--- a/modules/base/src/main/java/javafx/collections/FXCollections.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/base/src/main/java/javafx/collections/FXCollections.java	Fri Jun 10 09:43:53 2016 -0400
@@ -59,7 +59,6 @@
 import com.sun.javafx.collections.SetAdapterChange;
 import com.sun.javafx.collections.SortableList;
 import com.sun.javafx.collections.SourceAdapterChange;
-import com.sun.javafx.collections.annotations.ReturnsUnmodifiableCollection;
 import java.util.RandomAccess;
 import javafx.beans.Observable;
 import javafx.collections.ListChangeListener.Change;
@@ -183,7 +182,6 @@
      * @param map an ObservableMap that is to be monitored by this interface
      * @return a newly created UnmodifiableObservableMap
      */
-    @ReturnsUnmodifiableCollection
     public static <K, V> ObservableMap<K, V> unmodifiableObservableMap(ObservableMap<K, V> map) {
         if (map == null) {
             throw new NullPointerException();
@@ -230,7 +228,6 @@
      * @since JavaFX 8.0
      */
     @SuppressWarnings("unchecked")
-    @ReturnsUnmodifiableCollection
     public static <K, V> ObservableMap<K, V> emptyObservableMap() {
         return EMPTY_OBSERVABLE_MAP;
     }
@@ -379,7 +376,6 @@
      * @return an ObserableList wrapper that is unmodifiable
      * @see Collections#unmodifiableList(java.util.List)
      */
-    @ReturnsUnmodifiableCollection
     public static<E> ObservableList<E> unmodifiableObservableList(ObservableList<E> list) {
         if (list == null) {
             throw new NullPointerException();
@@ -423,7 +419,6 @@
      * @see Collections#emptyList()
      */
     @SuppressWarnings("unchecked")
-    @ReturnsUnmodifiableCollection
     public static<E> ObservableList<E> emptyObservableList() {
         return EMPTY_OBSERVABLE_LIST;
     }
@@ -434,7 +429,6 @@
      * @return a singleton observable list
      * @see Collections#singletonList(java.lang.Object)
      */
-    @ReturnsUnmodifiableCollection
     public static<E> ObservableList<E> singletonObservableList(E e) {
         return new SingletonObservableList<E>(e);
     }
@@ -446,7 +440,6 @@
      * @see Collections#unmodifiableSet(java.util.Set)
      * @since JavaFX 8.0
      */
-    @ReturnsUnmodifiableCollection
     public static<E> ObservableSet<E> unmodifiableObservableSet(ObservableSet<E> set) {
         if (set == null) {
             throw new NullPointerException();
@@ -492,7 +485,6 @@
      * @since JavaFX 8.0
      */
     @SuppressWarnings("unchecked")
-    @ReturnsUnmodifiableCollection
     public static<E> ObservableSet<E> emptyObservableSet() {
         return EMPTY_OBSERVABLE_SET;
     }
--- a/modules/base/src/test/java/test/javafx/binding/GenericBindingTest.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/base/src/test/java/test/javafx/binding/GenericBindingTest.java	Fri Jun 10 09:43:53 2016 -0400
@@ -25,7 +25,6 @@
 
 package test.javafx.binding;
 
-import com.sun.javafx.collections.annotations.ReturnsUnmodifiableCollection;
 import test.javafx.beans.InvalidationListenerMock;
 import javafx.beans.Observable;
 import javafx.beans.binding.*;
@@ -398,7 +397,6 @@
             return value;
         }
 
-        @Override @ReturnsUnmodifiableCollection
         public ObservableList<?> getDependencies() {
             fail("Should not reach here");
             return null;
@@ -431,7 +429,6 @@
             return value;
         }
 
-        @Override @ReturnsUnmodifiableCollection
         public ObservableList<?> getDependencies() {
             fail("Should not reach here");
             return null;
@@ -464,7 +461,6 @@
             return value;
         }
 
-        @Override @ReturnsUnmodifiableCollection
         public ObservableList<?> getDependencies() {
             fail("Should not reach here");
             return null;
@@ -497,7 +493,6 @@
             return value;
         }
 
-        @Override @ReturnsUnmodifiableCollection
         public ObservableList<?> getDependencies() {
             fail("Should not reach here");
             return null;
@@ -530,7 +525,6 @@
             return value;
         }
 
-        @Override @ReturnsUnmodifiableCollection
         public ObservableList<?> getDependencies() {
             fail("Should not reach here");
             return null;
@@ -563,7 +557,6 @@
             return value;
         }
 
-        @Override @ReturnsUnmodifiableCollection
         public ObservableList<?> getDependencies() {
             fail("Should not reach here");
             return null;
@@ -596,7 +589,6 @@
             return value;
         }
 
-        @Override @ReturnsUnmodifiableCollection
         public ObservableList<?> getDependencies() {
             fail("Should not reach here");
             return null;
@@ -629,7 +621,6 @@
             return value;
         }
 
-        @Override @ReturnsUnmodifiableCollection
         public ObservableList<?> getDependencies() {
             fail("Should not reach here");
             return null;
--- a/modules/base/src/test/java/test/javafx/binding/ListBindingTest.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/base/src/test/java/test/javafx/binding/ListBindingTest.java	Fri Jun 10 09:43:53 2016 -0400
@@ -25,7 +25,6 @@
 
 package test.javafx.binding;
 
-import com.sun.javafx.collections.annotations.ReturnsUnmodifiableCollection;
 import test.javafx.beans.InvalidationListenerMock;
 import javafx.beans.Observable;
 import javafx.beans.binding.ListBinding;
@@ -280,7 +279,6 @@
             return value;
         }
 
-        @Override @ReturnsUnmodifiableCollection
         public ObservableList<?> getDependencies() {
             fail("Should not reach here");
             return null;
--- a/modules/base/src/test/java/test/javafx/binding/MapBindingTest.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/base/src/test/java/test/javafx/binding/MapBindingTest.java	Fri Jun 10 09:43:53 2016 -0400
@@ -25,7 +25,6 @@
 
 package test.javafx.binding;
 
-import com.sun.javafx.collections.annotations.ReturnsUnmodifiableCollection;
 import test.javafx.beans.InvalidationListenerMock;
 import javafx.beans.Observable;
 import javafx.beans.binding.MapBinding;
@@ -301,7 +300,6 @@
             return value;
         }
 
-        @Override @ReturnsUnmodifiableCollection
         public ObservableList<?> getDependencies() {
             fail("Should not reach here");
             return null;
--- a/modules/base/src/test/java/test/javafx/binding/SetBindingTest.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/base/src/test/java/test/javafx/binding/SetBindingTest.java	Fri Jun 10 09:43:53 2016 -0400
@@ -25,7 +25,6 @@
 
 package test.javafx.binding;
 
-import com.sun.javafx.collections.annotations.ReturnsUnmodifiableCollection;
 import test.javafx.beans.InvalidationListenerMock;
 import javafx.beans.Observable;
 import javafx.beans.binding.SetBinding;
@@ -291,7 +290,6 @@
             return value;
         }
 
-        @Override @ReturnsUnmodifiableCollection
         public ObservableList<?> getDependencies() {
             fail("Should not reach here");
             return null;
--- a/modules/controls/src/main/java/com/sun/javafx/scene/control/ContextMenuContent.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/controls/src/main/java/com/sun/javafx/scene/control/ContextMenuContent.java	Fri Jun 10 09:43:53 2016 -0400
@@ -25,6 +25,7 @@
 
 package com.sun.javafx.scene.control;
 
+import com.sun.javafx.scene.NodeHelper;
 import com.sun.javafx.scene.control.behavior.TwoLevelFocusPopupBehavior;
 import com.sun.javafx.scene.control.skin.Utils;
 import javafx.animation.Animation.Status;
@@ -280,8 +281,8 @@
             getProperties().put(Menu.class, item.getParentMenu());
         }
 
-        // RT-36513 made this applyCss(). Modified by RT-36995 to impl_reapplyCSS()
-        impl_reapplyCSS();
+        // RT-36513 made this applyCss(). Modified by RT-36995 to NodeHelper.reapplyCSS()
+        NodeHelper.reapplyCSS(this);
     }
 
     private void disposeVisualItems() {
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/modules/controls/src/main/java/com/sun/javafx/scene/control/ControlHelper.java	Fri Jun 10 09:43:53 2016 -0400
@@ -0,0 +1,84 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.javafx.scene.control;
+
+import com.sun.javafx.scene.layout.RegionHelper;
+import com.sun.javafx.util.Utils;
+import javafx.beans.property.StringProperty;
+import javafx.scene.Node;
+import javafx.scene.control.Control;
+
+/*
+ * Used to access internal methods of Control.
+ */
+public class ControlHelper extends RegionHelper {
+    private static final ControlHelper theInstance;
+    private static ControlAccessor controlAccessor;
+
+    static {
+        theInstance = new ControlHelper();
+        Utils.forceInit(Control.class);
+    }
+
+    private static ControlHelper getInstance() {
+        return theInstance;
+    }
+
+    public static void initHelper(Control control) {
+        setHelper(control, getInstance());
+    }
+
+    public static void superProcessCSS(Node node) {
+        ((ControlHelper) getHelper(node)).superProcessCSSImpl(node);
+    }
+
+    public static StringProperty skinClassNameProperty(Control control) {
+        return controlAccessor.skinClassNameProperty(control);
+    }
+
+    void superProcessCSSImpl(Node node) {
+        super.processCSSImpl(node);
+    }
+
+    protected void processCSSImpl(Node node) {
+        controlAccessor.doProcessCSS(node);
+    }
+
+
+    public static void setControlAccessor(final ControlAccessor newAccessor) {
+        if (controlAccessor != null) {
+            throw new IllegalStateException();
+        }
+
+        controlAccessor = newAccessor;
+    }
+
+    public interface ControlAccessor {
+        void doProcessCSS(Node node);
+        StringProperty skinClassNameProperty(Control control);
+    }
+
+}
--- a/modules/controls/src/main/java/com/sun/javafx/scene/control/DatePickerContent.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/controls/src/main/java/com/sun/javafx/scene/control/DatePickerContent.java	Fri Jun 10 09:43:53 2016 -0400
@@ -68,6 +68,7 @@
 import com.sun.javafx.scene.traversal.Direction;
 
 import static com.sun.javafx.PlatformUtil.*;
+import com.sun.javafx.scene.NodeHelper;
 
 /**
  * The full content for the DatePicker popup. This class could
@@ -169,7 +170,7 @@
                 if (newFocusOwner == gridPane) {
                     if (oldFocusOwner instanceof DateCell) {
                         // Backwards traversal, skip gridPane.
-                        gridPane.impl_traverse(Direction.PREVIOUS);
+                        NodeHelper.traverse(gridPane, Direction.PREVIOUS);
                     } else {
                         // Forwards traversal, pass focus to day cell.
                         if (lastFocusedDayCell != null) {
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/modules/controls/src/main/java/com/sun/javafx/scene/control/TableColumnBaseHelper.java	Fri Jun 10 09:43:53 2016 -0400
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.javafx.scene.control;
+
+import com.sun.javafx.util.Utils;
+import javafx.scene.control.TableColumnBase;
+
+/*
+ * Used to access internal TableColumnBase methods.
+ */
+public class TableColumnBaseHelper {
+
+    private static TableColumnBaseAccessor tableColumnBaseAccessor;
+
+    static {
+        Utils.forceInit(TableColumnBase.class);
+    }
+
+    private TableColumnBaseHelper() {
+    }
+
+    public static void setWidth(TableColumnBase tableColumnBase, double width) {
+        tableColumnBaseAccessor.setWidth(tableColumnBase, width);
+    }
+
+    public static void setTableColumnBaseAccessor(final TableColumnBaseAccessor newAccessor) {
+        if (tableColumnBaseAccessor != null) {
+            throw new IllegalStateException();
+        }
+
+        tableColumnBaseAccessor = newAccessor;
+    }
+
+    public interface TableColumnBaseAccessor {
+
+        void setWidth(TableColumnBase tableColumnBase, double width);
+
+    }
+}
--- a/modules/controls/src/main/java/com/sun/javafx/scene/control/TableColumnComparatorBase.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/controls/src/main/java/com/sun/javafx/scene/control/TableColumnComparatorBase.java	Fri Jun 10 09:43:53 2016 -0400
@@ -25,7 +25,6 @@
 
 package com.sun.javafx.scene.control;
 
-import com.sun.javafx.collections.annotations.ReturnsUnmodifiableCollection;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
@@ -48,7 +47,6 @@
         this.columns = new ArrayList<TableColumnBase>(columns);
     }
 
-    @ReturnsUnmodifiableCollection
     public List<? extends TableColumnBase> getColumns() {
         return Collections.unmodifiableList(columns);
     }
--- a/modules/controls/src/main/java/com/sun/javafx/scene/control/behavior/FocusTraversalInputMap.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/controls/src/main/java/com/sun/javafx/scene/control/behavior/FocusTraversalInputMap.java	Fri Jun 10 09:43:53 2016 -0400
@@ -24,6 +24,7 @@
  */
 package com.sun.javafx.scene.control.behavior;
 
+import com.sun.javafx.scene.NodeHelper;
 import com.sun.javafx.scene.traversal.Direction;
 import javafx.event.EventTarget;
 import javafx.scene.Node;
@@ -83,10 +84,10 @@
     /**
      * Called by any of the BehaviorBase traverse methods to actually effect a
      * traversal of the focus. The default behavior of this method is to simply
-     * call impl_traverse on the given node, passing the given direction. A
+     * traverse on the given node, passing the given direction. A
      * subclass may override this method.
      *
-     * @param node The node to call impl_traverse on
+     * @param node The node to traverse on
      * @param dir The direction to traverse
      */
     public static void traverse(final Node node, final Direction dir) {
@@ -94,7 +95,7 @@
             throw new IllegalArgumentException("Attempting to traverse on a null Node. " +
                     "Most probably a KeyEvent has been fired with a null target specified.");
         }
-        node.impl_traverse(dir);
+        NodeHelper.traverse(node, dir);
     }
 
     /**
--- a/modules/controls/src/main/java/com/sun/javafx/scene/control/behavior/TextFieldBehavior.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/controls/src/main/java/com/sun/javafx/scene/control/behavior/TextFieldBehavior.java	Fri Jun 10 09:43:53 2016 -0400
@@ -50,6 +50,7 @@
 
 import static com.sun.javafx.PlatformUtil.isMac;
 import static com.sun.javafx.PlatformUtil.isWindows;
+import com.sun.javafx.scene.NodeHelper;
 import com.sun.javafx.stage.WindowHelper;
 
 /**
@@ -162,7 +163,7 @@
     static Affine3D calculateNodeToSceneTransform(Node node) {
         final Affine3D transform = new Affine3D();
         do {
-            transform.preConcatenate(node.impl_getLeafTransform());
+            transform.preConcatenate(NodeHelper.getLeafTransform(node));
             node = node.getParent();
         } while (node != null);
 
--- a/modules/controls/src/main/java/com/sun/javafx/scene/control/behavior/ToggleButtonBehavior.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/controls/src/main/java/com/sun/javafx/scene/control/behavior/ToggleButtonBehavior.java	Fri Jun 10 09:43:53 2016 -0400
@@ -34,6 +34,7 @@
 import javafx.scene.control.ToggleButton;
 import javafx.scene.control.ToggleGroup;
 import com.sun.javafx.scene.control.inputmap.InputMap;
+import javafx.scene.input.KeyEvent;
 
 import static com.sun.javafx.scene.control.inputmap.InputMap.*;
 import static javafx.scene.input.KeyCode.*;
@@ -44,10 +45,10 @@
         super(button);
 
         ObservableList<Mapping<?>> mappings = FXCollections.observableArrayList(
-            new KeyMapping(RIGHT, e -> traverse("ToggleNext-Right")),
-            new KeyMapping(LEFT, e -> traverse("TogglePrevious-Left")),
-            new KeyMapping(DOWN, e -> traverse("ToggleNext-Down")),
-            new KeyMapping(UP, e -> traverse("TogglePrevious-Up"))
+            new KeyMapping(RIGHT, e -> traverse(e, "ToggleNext-Right")),
+            new KeyMapping(LEFT, e -> traverse(e, "TogglePrevious-Left")),
+            new KeyMapping(DOWN, e -> traverse(e, "ToggleNext-Down")),
+            new KeyMapping(UP, e -> traverse(e, "TogglePrevious-Up"))
         );
 
         // we disable auto-consuming, so that unconsumed events work their way
@@ -90,7 +91,7 @@
         return i;
     }
 
-    private void traverse(String name) {
+    private void traverse(KeyEvent e, String name) {
         ToggleButton toggleButton = getNode();
         final ToggleGroup toggleGroup = toggleButton.getToggleGroup();
         // A ToggleButton does not have to be in a group.
@@ -118,6 +119,7 @@
                 Toggle toggle = toggles.get(nextToggleIndex);
                 toggleGroup.selectToggle(toggle);
                 ((Control)toggle).requestFocus();
+                e.consume();
             }
         } else {
             int prevToggleIndex = previousToggleIndex(toggles, currentToggleIdx);
@@ -129,6 +131,7 @@
                 Toggle toggle = toggles.get(prevToggleIndex);
                 toggleGroup.selectToggle(toggle);
                 ((Control)toggle).requestFocus();
+                e.consume();
             }
         }
     }
--- a/modules/controls/src/main/java/com/sun/javafx/scene/control/behavior/TwoLevelFocusBehavior.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/controls/src/main/java/com/sun/javafx/scene/control/behavior/TwoLevelFocusBehavior.java	Fri Jun 10 09:43:53 2016 -0400
@@ -25,6 +25,7 @@
 
 package com.sun.javafx.scene.control.behavior;
 
+import com.sun.javafx.scene.NodeHelper;
 import javafx.css.PseudoClass;
 import javafx.scene.Node;
 import javafx.scene.control.Control;
@@ -103,27 +104,27 @@
                     switch (((KeyEvent)event).getCode()) {
                       case TAB :
                           if (((KeyEvent)event).isShiftDown()) {
-                              ((Node)obj).impl_traverse(com.sun.javafx.scene.traversal.Direction.PREVIOUS);
+                              NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.PREVIOUS);
                           }
                           else {
-                              ((Node)obj).impl_traverse(com.sun.javafx.scene.traversal.Direction.NEXT);
+                              NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.NEXT);
                           }
                           event.consume();
                           break;
                       case UP :
-                          ((Node)obj).impl_traverse(com.sun.javafx.scene.traversal.Direction.UP);
+                          NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.UP);
                           event.consume();
                           break;
                       case DOWN :
-                          ((Node)obj).impl_traverse(com.sun.javafx.scene.traversal.Direction.DOWN);
+                          NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.DOWN);
                           event.consume();
                           break;
                       case LEFT :
-                          ((Node)obj).impl_traverse(com.sun.javafx.scene.traversal.Direction.LEFT);
+                          NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.LEFT);
                           event.consume();
                           break;
                       case RIGHT :
-                          ((Node)obj).impl_traverse(com.sun.javafx.scene.traversal.Direction.RIGHT);
+                          NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.RIGHT);
                           event.consume();
                           break;
                       case ENTER :
--- a/modules/controls/src/main/java/com/sun/javafx/scene/control/behavior/TwoLevelFocusComboBehavior.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/controls/src/main/java/com/sun/javafx/scene/control/behavior/TwoLevelFocusComboBehavior.java	Fri Jun 10 09:43:53 2016 -0400
@@ -25,6 +25,7 @@
 
 package com.sun.javafx.scene.control.behavior;
 
+import com.sun.javafx.scene.NodeHelper;
 import javafx.scene.Node;
 
 import javafx.scene.Scene;
@@ -83,27 +84,27 @@
                     switch (((KeyEvent)event).getCode()) {
                       case TAB :
                           if (((KeyEvent)event).isShiftDown()) {
-                              ((Node)obj).impl_traverse(com.sun.javafx.scene.traversal.Direction.PREVIOUS);
+                              NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.PREVIOUS);
                           }
                           else {
-                              ((Node)obj).impl_traverse(com.sun.javafx.scene.traversal.Direction.NEXT);
+                              NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.NEXT);
                           }
                           event.consume();
                           break;
                       case UP :
-                          ((Node)obj).impl_traverse(com.sun.javafx.scene.traversal.Direction.UP);
+                          NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.UP);
                           event.consume();
                           break;
                       case DOWN :
-                          ((Node)obj).impl_traverse(com.sun.javafx.scene.traversal.Direction.DOWN);
+                          NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.DOWN);
                           event.consume();
                           break;
                       case LEFT :
-                          ((Node)obj).impl_traverse(com.sun.javafx.scene.traversal.Direction.LEFT);
+                          NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.LEFT);
                           event.consume();
                           break;
                       case RIGHT :
-                          ((Node)obj).impl_traverse(com.sun.javafx.scene.traversal.Direction.RIGHT);
+                          NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.RIGHT);
                           event.consume();
                           break;
                       case ENTER :
--- a/modules/controls/src/main/java/com/sun/javafx/scene/control/behavior/TwoLevelFocusListBehavior.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/controls/src/main/java/com/sun/javafx/scene/control/behavior/TwoLevelFocusListBehavior.java	Fri Jun 10 09:43:53 2016 -0400
@@ -25,6 +25,7 @@
 
 package com.sun.javafx.scene.control.behavior;
 
+import com.sun.javafx.scene.NodeHelper;
 import com.sun.javafx.scene.control.Properties;
 import javafx.scene.Node;
 import javafx.scene.Parent;
@@ -85,27 +86,27 @@
                     switch (((KeyEvent)event).getCode()) {
                       case TAB :
                           if (((KeyEvent)event).isShiftDown()) {
-                              ((Node)obj).impl_traverse(com.sun.javafx.scene.traversal.Direction.PREVIOUS);
+                              NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.PREVIOUS);
                           }
                           else {
-                              ((Node)obj).impl_traverse(com.sun.javafx.scene.traversal.Direction.NEXT);
+                              NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.NEXT);
                           }
                           event.consume();
                           break;
                       case UP :
-                          ((Node)obj).impl_traverse(com.sun.javafx.scene.traversal.Direction.UP);
+                          NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.UP);
                           event.consume();
                           break;
                       case DOWN :
-                          ((Node)obj).impl_traverse(com.sun.javafx.scene.traversal.Direction.DOWN);
+                          NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.DOWN);
                           event.consume();
                           break;
                       case LEFT :
-                          ((Node)obj).impl_traverse(com.sun.javafx.scene.traversal.Direction.LEFT);
+                          NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.LEFT);
                           event.consume();
                           break;
                       case RIGHT :
-                          ((Node)obj).impl_traverse(com.sun.javafx.scene.traversal.Direction.RIGHT);
+                          NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.RIGHT);
                           event.consume();
                           break;
                       case ENTER :
--- a/modules/controls/src/main/java/com/sun/javafx/scene/control/behavior/TwoLevelFocusPopupBehavior.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/controls/src/main/java/com/sun/javafx/scene/control/behavior/TwoLevelFocusPopupBehavior.java	Fri Jun 10 09:43:53 2016 -0400
@@ -25,6 +25,7 @@
 
 package com.sun.javafx.scene.control.behavior;
 
+import com.sun.javafx.scene.NodeHelper;
 import javafx.scene.Node;
 import javafx.scene.control.PopupControl;
 
@@ -104,27 +105,27 @@
                     switch (((KeyEvent)event).getCode()) {
                       case TAB :
                           if (((KeyEvent)event).isShiftDown()) {
-                              ((Node)obj).impl_traverse(com.sun.javafx.scene.traversal.Direction.PREVIOUS);
+                              NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.PREVIOUS);
                           }
                           else {
-                              ((Node)obj).impl_traverse(com.sun.javafx.scene.traversal.Direction.NEXT);
+                              NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.NEXT);
                           }
                           event.consume();
                           break;
                       case UP :
-                          ((Node)obj).impl_traverse(com.sun.javafx.scene.traversal.Direction.UP);
+                          NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.UP);
                           event.consume();
                           break;
                       case DOWN :
-                          ((Node)obj).impl_traverse(com.sun.javafx.scene.traversal.Direction.DOWN);
+                          NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.DOWN);
                           event.consume();
                           break;
                       case LEFT :
-                          ((Node)obj).impl_traverse(com.sun.javafx.scene.traversal.Direction.LEFT);
+                          NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.LEFT);
                           event.consume();
                           break;
                       case RIGHT :
-                          ((Node)obj).impl_traverse(com.sun.javafx.scene.traversal.Direction.RIGHT);
+                          NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.RIGHT);
                           event.consume();
                           break;
                       case ENTER :
@@ -164,26 +165,26 @@
                           break;
                       case LEFT :
                           if (obj instanceof Node) {
-                              ((Node)obj).impl_traverse(com.sun.javafx.scene.traversal.Direction.LEFT);
+                              NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.LEFT);
                               event.consume();
                           }
                           else if (obj instanceof Scene) {
                               Node node = ((Scene)obj).getFocusOwner();
                               if (node != null) {
-                                  node.impl_traverse(com.sun.javafx.scene.traversal.Direction.LEFT);
+                                  NodeHelper.traverse(node, com.sun.javafx.scene.traversal.Direction.LEFT);
                                   event.consume();
                               }
                           }
                           break;
                       case RIGHT :
                           if (obj instanceof Node) {
-                              ((Node)obj).impl_traverse(com.sun.javafx.scene.traversal.Direction.RIGHT);
+                              NodeHelper.traverse((Node) obj, com.sun.javafx.scene.traversal.Direction.RIGHT);
                               event.consume();
                           }
                           else if (obj instanceof Scene) {
                               Node node = ((Scene)obj).getFocusOwner();
                               if (node != null) {
-                                  node.impl_traverse(com.sun.javafx.scene.traversal.Direction.RIGHT);
+                                  NodeHelper.traverse(node, com.sun.javafx.scene.traversal.Direction.RIGHT);
                                   event.consume();
                               }
                           }
--- a/modules/controls/src/main/java/com/sun/javafx/scene/control/skin/Utils.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/controls/src/main/java/com/sun/javafx/scene/control/skin/Utils.java	Fri Jun 10 09:43:53 2016 -0400
@@ -30,6 +30,7 @@
 
 package com.sun.javafx.scene.control.skin;
 
+import com.sun.javafx.scene.NodeHelper;
 import com.sun.javafx.scene.control.behavior.TextBinding;
 import com.sun.javafx.scene.text.TextLayout;
 import com.sun.javafx.tk.Toolkit;
@@ -666,7 +667,7 @@
                         KeyCombination mnemonicKeyCombo = bindings.getMnemonicKeyCombination();
                         Mnemonic myMnemonic = new Mnemonic(cmContent.getLabelAt(i), mnemonicKeyCombo);
                         scene.addMnemonic(myMnemonic);
-                        cmContent.getLabelAt(i).impl_setShowMnemonics(initialState);
+                        NodeHelper.setShowMnemonics(cmContent.getLabelAt(i), initialState);
                     }
                 }
             }
--- a/modules/controls/src/main/java/javafx/scene/chart/Axis.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/controls/src/main/java/javafx/scene/chart/Axis.java	Fri Jun 10 09:43:53 2016 -0400
@@ -25,6 +25,7 @@
 
 package javafx.scene.chart;
 
+import com.sun.javafx.scene.NodeHelper;
 import javafx.css.Styleable;
 import javafx.css.CssMetaData;
 import javafx.css.PseudoClass;
@@ -437,7 +438,7 @@
      * @return true if animations should happen
      */
     protected final boolean shouldAnimate(){
-        return getAnimated() && impl_isTreeVisible() && getScene() != null;
+        return getAnimated() && NodeHelper.isTreeVisible(this) && getScene() != null;
     }
 
     /**
@@ -654,7 +655,7 @@
                 // auto range
                 range = autoRange(length);
                 // set current range to new range
-                setRange(range, getAnimated() && !isFirstPass && impl_isTreeVisible() && rangeInvalid);
+                setRange(range, getAnimated() && !isFirstPass && NodeHelper.isTreeVisible(this) && rangeInvalid);
             } else {
                 range = getRange();
             }
--- a/modules/controls/src/main/java/javafx/scene/chart/Chart.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/controls/src/main/java/javafx/scene/chart/Chart.java	Fri Jun 10 09:43:53 2016 -0400
@@ -51,6 +51,7 @@
 
 import com.sun.javafx.charts.ChartLayoutAnimator;
 import com.sun.javafx.charts.Legend;
+import com.sun.javafx.scene.NodeHelper;
 
 import javafx.css.StyleableBooleanProperty;
 import javafx.css.StyleableObjectProperty;
@@ -310,7 +311,7 @@
      * is visible and in a scene.
      */
     protected final boolean shouldAnimate(){
-        return getAnimated() && impl_isTreeVisible() && getScene() != null;
+        return getAnimated() && NodeHelper.isTreeVisible(this) && getScene() != null;
     }
 
     /**
--- a/modules/controls/src/main/java/javafx/scene/control/Control.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/controls/src/main/java/javafx/scene/control/Control.java	Fri Jun 10 09:43:53 2016 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2016, 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
@@ -50,6 +50,8 @@
 import com.sun.javafx.application.PlatformImpl;
 import javafx.css.CssMetaData;
 import com.sun.javafx.css.StyleManager;
+import com.sun.javafx.scene.NodeHelper;
+import com.sun.javafx.scene.control.ControlHelper;
 import javafx.css.StyleableObjectProperty;
 import javafx.css.StyleableStringProperty;
 import javafx.css.converter.StringConverter;
@@ -81,6 +83,17 @@
 public abstract class Control extends Region implements Skinnable {
 
     static {
+        ControlHelper.setControlAccessor(new ControlHelper.ControlAccessor() {
+            @Override
+            public void doProcessCSS(Node node) {
+                ((Control) node).doProcessCSS();
+            }
+            @Override
+            public StringProperty skinClassNameProperty(Control control) {
+                return control.skinClassNameProperty();
+            }
+        });
+
         // Ensures that the default application user agent stylesheet is loaded
         if (Application.getUserAgentStylesheet() == null) {
             PlatformImpl.setDefaultPlatformUserAgentStylesheet();
@@ -291,12 +304,12 @@
             // next time they are requested.
             styleableProperties = null;
 
-            // calling impl_reapplyCSS() as the styleable properties may now
+            // calling NodeHelper.reapplyCSS() as the styleable properties may now
             // be different, as we will now be able to return styleable properties
-            // belonging to the skin. If impl_reapplyCSS() is not called, the
+            // belonging to the skin. If NodeHelper.reapplyCSS() is not called, the
             // getCssMetaData() method is never called, so the
             // skin properties are never exposed.
-            impl_reapplyCSS();
+            NodeHelper.reapplyCSS(Control.this);
 
             // DEBUG: Log that we've changed the skin
             final PlatformLogger logger = Logging.getControlsLogger();
@@ -406,6 +419,10 @@
      *                                                                         *
      **************************************************************************/
 
+    {
+        // To initialize the class helper at the begining each constructor of this class
+        ControlHelper.initHelper(this);
+    }
     /**
      *  Create a new Control.
      */
@@ -642,11 +659,7 @@
     private String currentSkinClassName = null;
     private StringProperty skinClassName;
 
-    /**
-     * @treatAsPrivate
-     * @since JavaFX 2.1
-     */
-    @Deprecated protected StringProperty skinClassNameProperty() {
+    StringProperty skinClassNameProperty() {
         if (skinClassName == null) {
             skinClassName = new StyleableStringProperty() {
 
@@ -862,21 +875,19 @@
         return getClassCssMetaData();
     }
 
-    /**
-     * @treatAsPrivate implementation detail
-     * @deprecated This is an internal API that is not intended for use and will be removed in the next version
+    /*
+     * Note: This method MUST only be called via its accessor method.
      */
-    @Deprecated
-    @Override protected void impl_processCSS() {
+    private void doProcessCSS() {
 
-        super.impl_processCSS();
+        ControlHelper.superProcessCSS(this);
 
         if (getSkin() == null) {
             // try to create default skin
             final Skin<?> defaultSkin = createDefaultSkin();
             if (defaultSkin != null) {
                 skinProperty().set(defaultSkin);
-                super.impl_processCSS();
+                ControlHelper.superProcessCSS(this);
             } else {
                 final String msg = "The -fx-skin property has not been defined in CSS for " + this +
                                    " and createDefaultSkin() returned null.";
--- a/modules/controls/src/main/java/javafx/scene/control/DatePicker.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/controls/src/main/java/javafx/scene/control/DatePicker.java	Fri Jun 10 09:43:53 2016 -0400
@@ -475,6 +475,7 @@
 
     /**
      * {@inheritDoc}
+     * @since JavaFX 8.0
      */
     @Override
     public List<CssMetaData<? extends Styleable, ?>> getControlCssMetaData() {
--- a/modules/controls/src/main/java/javafx/scene/control/Label.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/controls/src/main/java/javafx/scene/control/Label.java	Fri Jun 10 09:43:53 2016 -0400
@@ -102,7 +102,7 @@
      **************************************************************************/
 
     private ChangeListener<Boolean> mnemonicStateListener = (observable, oldValue, newValue) -> {
-        Label.this.impl_showMnemonicsProperty().setValue(newValue);
+        NodeHelper.showMnemonicsProperty(Label.this).setValue(newValue);
     };
 
     /**
@@ -117,15 +117,15 @@
                 @Override protected void invalidated() {
                     if (oldValue != null) {
                         NodeHelper.getNodeAccessor().setLabeledBy(oldValue, null);
-                        oldValue.impl_showMnemonicsProperty().removeListener(mnemonicStateListener);
+                        NodeHelper.showMnemonicsProperty(oldValue).removeListener(mnemonicStateListener);
                     }
                     final Node node = get();
                     if (node != null) {
                         NodeHelper.getNodeAccessor().setLabeledBy(node, Label.this);
-                        node.impl_showMnemonicsProperty().addListener(mnemonicStateListener);
-                        impl_setShowMnemonics(node.impl_isShowMnemonics());
+                        NodeHelper.showMnemonicsProperty(node).addListener(mnemonicStateListener);
+                        NodeHelper.setShowMnemonics(Label.this, NodeHelper.isShowMnemonics(node));
                     } else {
-                        impl_setShowMnemonics(false);
+                        NodeHelper.setShowMnemonics(Label.this, false);
                     }
                     oldValue = node;
                 }
--- a/modules/controls/src/main/java/javafx/scene/control/Labeled.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/controls/src/main/java/javafx/scene/control/Labeled.java	Fri Jun 10 09:43:53 2016 -0400
@@ -27,6 +27,7 @@
 
 
 import com.sun.javafx.css.StyleManager;
+import com.sun.javafx.scene.NodeHelper;
 import javafx.css.converter.BooleanConverter;
 import javafx.css.converter.EnumConverter;
 import javafx.css.converter.InsetsConverter;
@@ -330,7 +331,7 @@
                 public void applyStyle(StyleOrigin newOrigin, Font value) {
 
                     //
-                    // RT-20727 - if CSS is setting the font, then make sure invalidate doesn't call impl_reapplyCSS
+                    // RT-20727 - if CSS is setting the font, then make sure invalidate doesn't call NodeHelper.reapplyCSS
                     //
                     try {
                         // super.applyStyle calls set which might throw if value is bound.
@@ -360,7 +361,7 @@
                     // css might need to be reapplied since font size affects
                     // calculated values for styles with relative values
                     if(fontSetByCss == false) {
-                        Labeled.this.impl_reapplyCSS();
+                        NodeHelper.reapplyCSS(Labeled.this);
                     }
                 }
 
--- a/modules/controls/src/main/java/javafx/scene/control/PopupControl.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/controls/src/main/java/javafx/scene/control/PopupControl.java	Fri Jun 10 09:43:53 2016 -0400
@@ -49,10 +49,13 @@
 import javafx.css.CssMetaData;
 import javafx.css.PseudoClass;
 import com.sun.javafx.css.StyleManager;
+import com.sun.javafx.scene.NodeHelper;
+import com.sun.javafx.scene.ParentHelper;
 import javafx.css.Styleable;
 import javafx.css.StyleableStringProperty;
 import javafx.css.converter.StringConverter;
 import com.sun.javafx.scene.control.Logging;
+import com.sun.javafx.scene.layout.PaneHelper;
 import com.sun.javafx.stage.PopupWindowHelper;
 import javafx.css.StyleableProperty;
 import javafx.stage.Window;
@@ -270,12 +273,12 @@
                 bridge.getChildren().clear();
             }
 
-            // calling impl_reapplyCSS() as the styleable properties may now
+            // calling NodeHelper.reapplyCSS() as the styleable properties may now
             // be different, as we will now be able to return styleable properties
-            // belonging to the skin. If impl_reapplyCSS() is not called, the
+            // belonging to the skin. If NodeHelper.reapplyCSS() is not called, the
             // getCssMetaData() method is never called, so the
             // skin properties are never exposed.
-            bridge.impl_reapplyCSS();
+            NodeHelper.reapplyCSS(bridge);
 
             // DEBUG: Log that we've changed the skin
             final PlatformLogger logger = Logging.getControlsLogger();
@@ -1108,6 +1111,11 @@
 
         private final PopupControl popupControl = PopupControl.this;
 
+        {
+            // To initialize the class helper at the begining each constructor of this class
+            CSSBridgeHelper.initHelper(this);
+        }
+
         /**
          * Requests a layout pass to be performed before the next scene is
          * rendered. This is batched up asynchronously to happen once per
@@ -1136,45 +1144,34 @@
             return PopupControl.this.getStyleableParent();
         }
 
-        /**
-         * @treatAsPrivate implementation detail
-         * @deprecated This is an internal API that is not intended for use and will be removed in the next version
-         */
-        @Deprecated
-        protected void setSkinClassName(String skinClassName) { /* no-op - retain for binary compatibility */ }
-
         @Override
         public List<CssMetaData<? extends Styleable, ?>> getCssMetaData() {
             return PopupControl.this.getCssMetaData();
         }
 
-        /**
-         * @treatAsPrivate implementation detail
-         * @deprecated This is an internal API that is not intended for use and will be removed in the next version
+        /*
+         * Note: This method MUST only be called via its accessor method.
          */
-        @Deprecated
-        @Override public List<String> impl_getAllParentStylesheets() {
+        private List<String> doGetAllParentStylesheets() {
             Styleable styleable = getStyleableParent();
             if (styleable instanceof Parent) {
-                return ((Parent)styleable).impl_getAllParentStylesheets();
+                return ParentHelper.getAllParentStylesheets((Parent)styleable);
             }
             return null;
         }
 
-        /**
-         * @treatAsPrivate implementation detail
-         * @deprecated This is an internal API that is not intended for use and will be removed in the next version
+        /*
+         * Note: This method MUST only be called via its accessor method.
          */
-        @Deprecated
-        @Override protected void impl_processCSS() {
-            super.impl_processCSS();
+        private void doProcessCSS() {
+            CSSBridgeHelper.superProcessCSS(this);
 
             if (getSkin() == null) {
                 // try to create default skin
                 final Skin<?> defaultSkin = createDefaultSkin();
                 if (defaultSkin != null) {
                     skinProperty().set(defaultSkin);
-                    super.impl_processCSS();
+                    CSSBridgeHelper.superProcessCSS(this);
                 } else {
                     final String msg = "The -fx-skin property has not been defined in CSS for " + this +
                             " and createDefaultSkin() returned null.";
@@ -1190,4 +1187,41 @@
 
     }
 
+    /*
+     * Used to access internal methods of CSSBridge.
+     */
+    static final class CSSBridgeHelper extends PaneHelper {
+        private static final CSSBridgeHelper theInstance;
+
+        static {
+            theInstance = new CSSBridgeHelper();
+        }
+
+        private static CSSBridgeHelper getInstance() {
+            return theInstance;
+        }
+
+        public static void initHelper(CSSBridge cssBridge) {
+            setHelper(cssBridge, getInstance());
+        }
+
+        public static void superProcessCSS(Node node) {
+            ((CSSBridgeHelper) getHelper(node)).superProcessCSSImpl(node);
+        }
+
+        void superProcessCSSImpl(Node node) {
+            super.processCSSImpl(node);
+        }
+
+        @Override
+        protected void processCSSImpl(Node node) {
+            ((CSSBridge) node).doProcessCSS();
+        }
+
+        @Override
+        protected List<String> getAllParentStylesheetsImpl(Parent parent) {
+            return ((CSSBridge) parent).doGetAllParentStylesheets();
+        }
+    }
+
 }
--- a/modules/controls/src/main/java/javafx/scene/control/Separator.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/controls/src/main/java/javafx/scene/control/Separator.java	Fri Jun 10 09:43:53 2016 -0400
@@ -312,12 +312,9 @@
     }
 
     /**
-     * RT-19263
-     * @treatAsPrivate implementation detail
-     * @deprecated This is an experimental API that is not intended for general use and is subject to change in future versions
+     * {@inheritDoc}
      * @since JavaFX 8.0
      */
-    @Deprecated
     @Override protected List<CssMetaData<? extends Styleable, ?>> getControlCssMetaData() {
         return getClassCssMetaData();
     }
--- a/modules/controls/src/main/java/javafx/scene/control/Slider.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/controls/src/main/java/javafx/scene/control/Slider.java	Fri Jun 10 09:43:53 2016 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2016, 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
@@ -792,12 +792,9 @@
     }
 
     /**
-     * RT-19263
-     * @treatAsPrivate implementation detail
-     * @deprecated This is an experimental API that is not intended for general use and is subject to change in future versions
+     * {@inheritDoc}
      * @since JavaFX 8.0
      */
-    @Deprecated
     @Override protected List<CssMetaData<? extends Styleable, ?>> getControlCssMetaData() {
         return getClassCssMetaData();
     }
--- a/modules/controls/src/main/java/javafx/scene/control/SplitPane.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/controls/src/main/java/javafx/scene/control/SplitPane.java	Fri Jun 10 09:43:53 2016 -0400
@@ -41,8 +41,6 @@
 import javafx.geometry.Orientation;
 import javafx.scene.Node;
 
-import com.sun.javafx.collections.annotations.ReturnsUnmodifiableCollection;
-
 import javafx.css.StyleableObjectProperty;
 import javafx.css.CssMetaData;
 import javafx.css.PseudoClass;
@@ -335,7 +333,7 @@
      *
      * @return the list of dividers.
      */
-    @ReturnsUnmodifiableCollection public ObservableList<Divider> getDividers() {
+    public ObservableList<Divider> getDividers() {
         return unmodifiableDividers;
     }
 
--- a/modules/controls/src/main/java/javafx/scene/control/Tab.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/controls/src/main/java/javafx/scene/control/Tab.java	Fri Jun 10 09:43:53 2016 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2016, 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
@@ -789,20 +789,13 @@
     private final EventHandlerManager eventHandlerManager =
             new EventHandlerManager(this);
 
-    /**
-     * @treatAsPrivate implementation detail
-     * @deprecated This is an internal API that is not intended for use and will be removed in the next version
-     */
+     /** {@inheritDoc} */
     @Override
     public EventDispatchChain buildEventDispatchChain(EventDispatchChain tail) {
         return tail.prepend(eventHandlerManager);
     }
 
-    /**
-     * @treatAsPrivate implementation detail
-     * @deprecated This is an internal API that is not intended for use and will be removed in the next version
-     */
-    protected <E extends Event> void setEventHandler(EventType<E> eventType, EventHandler<E> eventHandler) {
+    <E extends Event> void setEventHandler(EventType<E> eventType, EventHandler<E> eventHandler) {
         eventHandlerManager.setEventHandler(eventType, eventHandler);
     }
 
--- a/modules/controls/src/main/java/javafx/scene/control/TableColumnBase.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/controls/src/main/java/javafx/scene/control/TableColumnBase.java	Fri Jun 10 09:43:53 2016 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2016, 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
@@ -51,6 +51,7 @@
 import javafx.scene.Node;
 
 import com.sun.javafx.event.EventHandlerManager;
+import com.sun.javafx.scene.control.TableColumnBaseHelper;
 import java.util.HashMap;
 
 import javafx.beans.property.ReadOnlyDoubleProperty;
@@ -99,6 +100,17 @@
  */
 @IDProperty("id")
 public abstract class TableColumnBase<S,T> implements EventTarget, Styleable {
+    static {
+        TableColumnBaseHelper.setTableColumnBaseAccessor(
+                new TableColumnBaseHelper.TableColumnBaseAccessor() {
+
+                    @Override
+                    public void setWidth(TableColumnBase tableColumnBase, double width) {
+                        tableColumnBase.doSetWidth(width);
+                    }
+
+                });
+    }
 
     /***************************************************************************
      *                                                                         *
@@ -415,7 +427,7 @@
                         setMinWidth(0.0F);
                     }
 
-                    impl_setWidth(getWidth());
+                    doSetWidth(getWidth());
                 }
             };
         }
@@ -432,7 +444,7 @@
     public final double getPrefWidth() { return prefWidth.get(); }
     private final DoubleProperty prefWidth = new SimpleDoubleProperty(this, "prefWidth", DEFAULT_WIDTH) {
         @Override protected void invalidated() {
-            impl_setWidth(getPrefWidth());
+            doSetWidth(getPrefWidth());
         }
     };
 
@@ -448,7 +460,7 @@
     public final double getMaxWidth() { return maxWidth.get(); }
     private DoubleProperty maxWidth = new SimpleDoubleProperty(this, "maxWidth", DEFAULT_MAX_WIDTH) {
         @Override protected void invalidated() {
-            impl_setWidth(getWidth());
+            doSetWidth(getWidth());
         }
     };
 
@@ -753,12 +765,7 @@
      *                                                                         *
      **************************************************************************/
 
-    /**
-     * @treatAsPrivate implementation detail
-     * @deprecated This is an internal API that is not intended for use and will be removed in the next version
-     */
-    @Deprecated
-    public void impl_setWidth(double width) {
+    void doSetWidth(double width) {
         setWidth(Utils.boundedSize(width, getMinWidth(), getMaxWidth()));
     }
 
--- a/modules/controls/src/main/java/javafx/scene/control/TableUtil.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/controls/src/main/java/javafx/scene/control/TableUtil.java	Fri Jun 10 09:43:53 2016 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2016, 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
@@ -376,13 +376,13 @@
             double newWidth = column.getWidth() + delta;
 
             if (newWidth > column.getMaxWidth()) {
-                column.impl_setWidth(column.getMaxWidth());
+                column.doSetWidth(column.getMaxWidth());
                 return newWidth - column.getMaxWidth();
             } else if (newWidth < column.getMinWidth()) {
-                column.impl_setWidth(column.getMinWidth());
+                column.doSetWidth(column.getMinWidth());
                 return newWidth - column.getMinWidth();
             } else {
-                column.impl_setWidth(newWidth);
+                column.doSetWidth(newWidth);
                 return 0.0F;
             }
         }
--- a/modules/controls/src/main/java/javafx/scene/control/TableView.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/controls/src/main/java/javafx/scene/control/TableView.java	Fri Jun 10 09:43:53 2016 -0400
@@ -74,7 +74,6 @@
 
 import com.sun.javafx.collections.MappingChange;
 import com.sun.javafx.collections.NonIterableChange;
-import com.sun.javafx.collections.annotations.ReturnsUnmodifiableCollection;
 import javafx.css.converter.SizeConverter;
 import com.sun.javafx.scene.control.ReadOnlyUnbackedObservableList;
 import com.sun.javafx.scene.control.TableColumnComparatorBase.TableColumnComparator;
@@ -1485,7 +1484,6 @@
     /**
      * Returns an unmodifiable list containing the currently visible leaf columns.
      */
-    @ReturnsUnmodifiableCollection
     public ObservableList<TableColumn<S,?>> getVisibleLeafColumns() {
         return unmodifiableVisibleLeafColumns;
     }
--- a/modules/controls/src/main/java/javafx/scene/control/TextArea.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/controls/src/main/java/javafx/scene/control/TextArea.java	Fri Jun 10 09:43:53 2016 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2016, 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
@@ -430,11 +430,7 @@
      */
     public static final int DEFAULT_PREF_ROW_COUNT = 10;
 
-    /**
-     * @treatAsPrivate implementation detail
-     * @deprecated This is an internal API that is not intended for use and will be removed in the next version
-     */
-    public static final int DEFAULT_PARAGRAPH_CAPACITY = 32;
+    private static final int DEFAULT_PARAGRAPH_CAPACITY = 32;
 
     /**
      * Creates a {@code TextArea} with empty text content.
--- a/modules/controls/src/main/java/javafx/scene/control/TextInputControl.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/controls/src/main/java/javafx/scene/control/TextInputControl.java	Fri Jun 10 09:43:53 2016 -0400
@@ -69,6 +69,7 @@
 
 import com.sun.javafx.util.Utils;
 import com.sun.javafx.binding.ExpressionHelper;
+import com.sun.javafx.scene.NodeHelper;
 import javafx.util.StringConverter;
 
 /**
@@ -203,7 +204,7 @@
                 public void applyStyle(StyleOrigin newOrigin, Font value) {
 
                     //
-                    // RT-20727 - if CSS is setting the font, then make sure invalidate doesn't call impl_reapplyCSS
+                    // RT-20727 - if CSS is setting the font, then make sure invalidate doesn't call NodeHelper.reapplyCSS
                     //
                     try {
                         // super.applyStyle calls set which might throw if value is bound.
@@ -234,7 +235,7 @@
                     // css might need to be reapplied since font size affects
                     // calculated values for styles with relative values
                     if(fontSetByCss == false) {
-                        TextInputControl.this.impl_reapplyCSS();
+                        NodeHelper.reapplyCSS(TextInputControl.this);
                     }
                 }
 
--- a/modules/controls/src/main/java/javafx/scene/control/Tooltip.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/controls/src/main/java/javafx/scene/control/Tooltip.java	Fri Jun 10 09:43:53 2016 -0400
@@ -28,6 +28,7 @@
 
 import com.sun.javafx.beans.IDProperty;
 import com.sun.javafx.css.StyleManager;
+import com.sun.javafx.scene.NodeHelper;
 import com.sun.javafx.stage.PopupWindowHelper;
 
 import javafx.css.SimpleStyleableBooleanProperty;
@@ -268,7 +269,7 @@
         private boolean fontSetByCss = false;
 
         @Override public void applyStyle(StyleOrigin newOrigin, Font value) {
-            // RT-20727 - if CSS is setting the font, then make sure invalidate doesn't call impl_reapplyCSS
+            // RT-20727 - if CSS is setting the font, then make sure invalidate doesn't call NodeHelper.reapplyCSS
             try {
                 // super.applyStyle calls set which might throw if value is bound.
                 // Have to make sure fontSetByCss is reset.
@@ -294,7 +295,7 @@
             // css might need to be reapplied since font size affects
             // calculated values for styles with relative values
             if(fontSetByCss == false) {
-                Tooltip.this.bridge.impl_reapplyCSS();
+                NodeHelper.reapplyCSS(Tooltip.this.bridge);
             }
         }
 
--- a/modules/controls/src/main/java/javafx/scene/control/TreeTableView.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/controls/src/main/java/javafx/scene/control/TreeTableView.java	Fri Jun 10 09:43:53 2016 -0400
@@ -27,7 +27,6 @@
 
 import com.sun.javafx.collections.MappingChange;
 import com.sun.javafx.collections.NonIterableChange;
-import com.sun.javafx.collections.annotations.ReturnsUnmodifiableCollection;
 import com.sun.javafx.scene.control.Properties;
 import com.sun.javafx.scene.control.SelectedCellsMap;
 
@@ -1743,7 +1742,6 @@
     /**
      * Returns an unmodifiable list containing the currently visible leaf columns.
      */
-    @ReturnsUnmodifiableCollection
     public ObservableList<TreeTableColumn<S,?>> getVisibleLeafColumns() {
         return unmodifiableVisibleLeafColumns;
     }
@@ -2002,6 +2000,7 @@
 
     /**
      * {@inheritDoc}
+     * @since JavaFX 8.0
      */
     @Override
     public List<CssMetaData<? extends Styleable, ?>> getControlCssMetaData() {
--- a/modules/controls/src/main/java/javafx/scene/control/skin/ButtonSkin.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/controls/src/main/java/javafx/scene/control/skin/ButtonSkin.java	Fri Jun 10 09:43:53 2016 -0400
@@ -25,6 +25,7 @@
 
 package javafx.scene.control.skin;
 
+import com.sun.javafx.scene.NodeHelper;
 import com.sun.javafx.scene.control.behavior.BehaviorBase;
 import com.sun.javafx.scene.control.skin.Utils;
 import javafx.scene.Node;
@@ -63,13 +64,13 @@
      **************************************************************************/
 
     Runnable defaultButtonRunnable = () -> {
-        if (getSkinnable().getScene() != null && getSkinnable().impl_isTreeVisible() && !getSkinnable().isDisabled()) {
+        if (getSkinnable().getScene() != null && NodeHelper.isTreeVisible(getSkinnable()) && !getSkinnable().isDisabled()) {
             getSkinnable().fire();
         }
     };
 
     Runnable cancelButtonRunnable = () -> {
-        if (getSkinnable().getScene() != null && getSkinnable().impl_isTreeVisible() && !getSkinnable().isDisabled()) {
+        if (getSkinnable().getScene() != null && NodeHelper.isTreeVisible(getSkinnable()) && !getSkinnable().isDisabled()) {
             getSkinnable().fire();
         }
     };
--- a/modules/controls/src/main/java/javafx/scene/control/skin/ColorPalette.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/controls/src/main/java/javafx/scene/control/skin/ColorPalette.java	Fri Jun 10 09:43:53 2016 -0400
@@ -25,6 +25,7 @@
 
 package javafx.scene.control.skin;
 
+import com.sun.javafx.scene.NodeHelper;
 import com.sun.javafx.scene.ParentHelper;
 import com.sun.javafx.scene.control.CustomColorDialog;
 import com.sun.javafx.scene.control.skin.Utils;
@@ -430,7 +431,7 @@
                         if (isCustom && contextMenu != null) {
                             if (!contextMenu.isShowing()) {
                                 contextMenu.show(ColorSquare.this, Side.RIGHT, 0, 0);
-                                Utils.addMnemonics(contextMenu, ColorSquare.this.getScene(), colorPicker.impl_isShowMnemonics());
+                                Utils.addMnemonics(contextMenu, ColorSquare.this.getScene(), NodeHelper.isShowMnemonics(colorPicker));
                             } else {
                                 contextMenu.hide();
                                 Utils.removeMnemonics(contextMenu, ColorSquare.this.getScene());
--- a/modules/controls/src/main/java/javafx/scene/control/skin/ContextMenuSkin.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/controls/src/main/java/javafx/scene/control/skin/ContextMenuSkin.java	Fri Jun 10 09:43:53 2016 -0400
@@ -31,6 +31,7 @@
 import com.sun.javafx.scene.control.skin.Utils;
 import javafx.event.Event;
 import javafx.event.EventHandler;
+import javafx.geometry.Bounds;
 import javafx.scene.AccessibleAttribute;
 import javafx.scene.Node;
 import javafx.scene.control.ContextMenu;
@@ -67,6 +68,14 @@
     private final Region root;
     private TwoLevelFocusPopupBehavior tlFocus;
 
+    // used to handle the situation where CSS is applied to the popup
+    // after it is displayed, and we need to modify the position of the
+    // popup to account for this.
+    private double prefHeight;
+    private double shiftY;
+    private double prefWidth;
+    private double shiftX;
+
 
 
     /***************************************************************************
@@ -108,6 +117,13 @@
     public ContextMenuSkin(final ContextMenu control) {
         this.popupMenu = control;
 
+        popupMenu.addEventHandler(Menu.ON_SHOWING, new EventHandler<Event>() {
+            @Override public void handle(Event event) {
+                prefHeight = root.prefHeight(-1);
+                prefWidth = root.prefWidth(-1);
+            }
+        });
+
         // When a contextMenu is shown, requestFocus on its content to enable
         // keyboard navigation.
         popupMenu.addEventHandler(Menu.ON_SHOWN, new EventHandler<Event>() {
@@ -122,6 +138,8 @@
                 }
 
                 root.addEventHandler(KeyEvent.KEY_PRESSED, keyListener);
+
+                performPopupShifts();
             }
         });
         popupMenu.addEventHandler(Menu.ON_HIDDEN, new EventHandler<Event>() {
@@ -186,4 +204,34 @@
         root.styleProperty().unbind();
         if (tlFocus != null) tlFocus.dispose();
     }
+
+
+
+    /***************************************************************************
+     *                                                                         *
+     * Private Implementation                                                  *
+     *                                                                         *
+     **************************************************************************/
+
+    private void performPopupShifts() {
+        final ContextMenu contextMenu = getSkinnable();
+        final Node ownerNode = contextMenu.getOwnerNode();
+        if (ownerNode == null) return;
+
+        final Bounds ownerBounds = ownerNode.localToScreen(ownerNode.getLayoutBounds());
+
+        // shifting vertically
+        final double rootPrefHeight = root.prefHeight(-1);
+        shiftY = prefHeight - rootPrefHeight;
+        if (shiftY > 0 && (contextMenu.getY() + rootPrefHeight) < ownerBounds.getMinY()) {
+            contextMenu.setY(contextMenu.getY() + shiftY);
+        }
+
+        // shifting horizontally
+        final double rootPrefWidth = root.prefWidth(-1);
+        shiftX = prefWidth - rootPrefWidth;
+        if (shiftX > 0 && (contextMenu.getX() + rootPrefWidth) < ownerBounds.getMinX()) {
+            contextMenu.setX(contextMenu.getX() + shiftX);
+        }
+    }
 }
--- a/modules/controls/src/main/java/javafx/scene/control/skin/MenuButtonSkinBase.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/controls/src/main/java/javafx/scene/control/skin/MenuButtonSkinBase.java	Fri Jun 10 09:43:53 2016 -0400
@@ -25,6 +25,7 @@
 
 package javafx.scene.control.skin;
 
+import com.sun.javafx.scene.NodeHelper;
 import com.sun.javafx.scene.control.ContextMenuContent;
 import com.sun.javafx.scene.control.ControlAcceleratorSupport;
 import com.sun.javafx.scene.control.LabeledImpl;
@@ -186,7 +187,7 @@
             }
 
             if (popup.isShowing()) {
-                Utils.addMnemonics(popup, getSkinnable().getScene(), getSkinnable().impl_isShowMnemonics());
+                Utils.addMnemonics(popup, getSkinnable().getScene(), NodeHelper.isShowMnemonics(getSkinnable()));
             } else {
                 // we wrap this in a runLater so that mnemonics are not removed
                 // before all key events are fired (because KEY_PRESSED might have
--- a/modules/controls/src/main/java/javafx/scene/control/skin/NestedTableColumnHeader.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/controls/src/main/java/javafx/scene/control/skin/NestedTableColumnHeader.java	Fri Jun 10 09:43:53 2016 -0400
@@ -25,7 +25,6 @@
 
 package javafx.scene.control.skin;
 
-import com.sun.javafx.collections.annotations.ReturnsUnmodifiableCollection;
 import com.sun.javafx.scene.control.skin.Utils;
 import javafx.beans.property.ObjectProperty;
 import javafx.collections.WeakListChangeListener;
@@ -268,7 +267,6 @@
      * Returns an unmodifiable list of the {@link TableColumnHeader} instances
      * that are children of this NestedTableColumnHeader.
      */
-    @ReturnsUnmodifiableCollection
     public final ObservableList<TableColumnHeader> getColumnHeaders() {
         if (columnHeaders == null) {
             columnHeaders = FXCollections.<TableColumnHeader>observableArrayList();
--- a/modules/controls/src/main/java/javafx/scene/control/skin/ProgressBarSkin.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/controls/src/main/java/javafx/scene/control/skin/ProgressBarSkin.java	Fri Jun 10 09:43:53 2016 -0400
@@ -25,6 +25,7 @@
 
 package javafx.scene.control.skin;
 
+import com.sun.javafx.scene.NodeHelper;
 import java.lang.ref.WeakReference;
 import java.util.ArrayList;
 import java.util.Collections;
@@ -297,7 +298,7 @@
         // width might have changed so recreate our animation if needed
         if (isIndeterminate) {
             createIndeterminateTimeline();
-            if (getSkinnable().impl_isTreeVisible()) {
+            if (NodeHelper.isTreeVisible(getSkinnable())) {
                 indeterminateTransition.play();
             }
 
--- a/modules/controls/src/main/java/javafx/scene/control/skin/ProgressIndicatorSkin.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/controls/src/main/java/javafx/scene/control/skin/ProgressIndicatorSkin.java	Fri Jun 10 09:43:53 2016 -0400
@@ -25,6 +25,7 @@
 
 package javafx.scene.control.skin;
 
+import com.sun.javafx.scene.NodeHelper;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
@@ -275,7 +276,7 @@
             // create spinner
             spinner = new IndeterminateSpinner(spinEnabled.get(), progressColor.get());
             getChildren().setAll(spinner);
-            if (control.impl_isTreeVisible()) {
+            if (NodeHelper.isTreeVisible(control)) {
                 if (indeterminateTransition != null) {
                     indeterminateTransition.play();
                 }
--- a/modules/controls/src/main/java/javafx/scene/control/skin/TableColumnHeader.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/controls/src/main/java/javafx/scene/control/skin/TableColumnHeader.java	Fri Jun 10 09:43:53 2016 -0400
@@ -27,6 +27,7 @@
 
 import com.sun.javafx.scene.control.LambdaMultiplePropertyChangeListenerHandler;
 import com.sun.javafx.scene.control.Properties;
+import com.sun.javafx.scene.control.TableColumnBaseHelper;
 import javafx.beans.property.DoubleProperty;
 import javafx.beans.property.ReadOnlyObjectProperty;
 import javafx.beans.property.ReadOnlyObjectWrapper;
@@ -393,7 +394,7 @@
             double width = getNestedColumnHeader().prefWidth(height);
 
             if (getTableColumn() != null) {
-                getTableColumn().impl_setWidth(width);
+                TableColumnBaseHelper.setWidth(getTableColumn(), width);
             }
 
             return width;
--- a/modules/controls/src/main/java/javafx/scene/control/skin/TableRowSkinBase.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/controls/src/main/java/javafx/scene/control/skin/TableRowSkinBase.java	Fri Jun 10 09:43:53 2016 -0400
@@ -31,7 +31,6 @@
 import java.util.*;
 
 import com.sun.javafx.PlatformUtil;
-import com.sun.javafx.collections.annotations.ReturnsUnmodifiableCollection;
 import javafx.animation.FadeTransition;
 import javafx.beans.property.DoubleProperty;
 import javafx.beans.property.ObjectProperty;
@@ -227,7 +226,6 @@
     /**
      * Returns an unmodifiable list containing the currently visible leaf columns.
      */
-    @ReturnsUnmodifiableCollection
     protected abstract ObservableList<? extends TableColumnBase/*<T,?>*/> getVisibleLeafColumns();
 
 
--- a/modules/controls/src/main/java/javafx/scene/control/skin/TableSkinUtils.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/controls/src/main/java/javafx/scene/control/skin/TableSkinUtils.java	Fri Jun 10 09:43:53 2016 -0400
@@ -25,6 +25,7 @@
 package javafx.scene.control.skin;
 
 import com.sun.javafx.scene.control.Properties;
+import com.sun.javafx.scene.control.TableColumnBaseHelper;
 import com.sun.javafx.scene.control.TreeTableViewBackingList;
 import com.sun.javafx.scene.control.skin.Utils;
 import javafx.beans.property.BooleanProperty;
@@ -143,7 +144,7 @@
             maxWidth = Math.max(maxWidth, tc.getWidth());
         }
 
-        tc.impl_setWidth(maxWidth);
+        TableColumnBaseHelper.setWidth(tc, maxWidth);
     }
 
 
@@ -218,7 +219,7 @@
             maxWidth = Math.max(maxWidth, tc.getWidth());
         }
 
-        tc.impl_setWidth(maxWidth);
+        TableColumnBaseHelper.setWidth(tc, maxWidth);
     }
 
     public static ObjectProperty<Callback<ResizeFeaturesBase,Boolean>> columnResizePolicyProperty(TableViewSkinBase<?,?,?,?,?> tableSkin) {
--- a/modules/controls/src/main/java/javafx/scene/control/skin/ToolBarSkin.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/controls/src/main/java/javafx/scene/control/skin/ToolBarSkin.java	Fri Jun 10 09:43:53 2016 -0400
@@ -25,6 +25,7 @@
 
 package javafx.scene.control.skin;
 
+import com.sun.javafx.scene.NodeHelper;
 import com.sun.javafx.scene.ParentHelper;
 import java.util.ArrayList;
 import java.util.Collections;
@@ -135,7 +136,7 @@
             private Node selectPrev(int from, TraversalContext context) {
                 for (int i = from; i >= 0; --i) {
                     Node n = box.getChildren().get(i);
-                    if (n.isDisabled() || !n.impl_isTreeVisible()) continue;
+                    if (n.isDisabled() || !NodeHelper.isTreeVisible(n)) continue;
                     if (n instanceof Parent) {
                         Node selected = context.selectLastInParent((Parent)n);
                         if (selected != null) return selected;
@@ -150,7 +151,7 @@
             private Node selectNext(int from, TraversalContext context) {
                 for (int i = from, max = box.getChildren().size(); i < max; ++i) {
                     Node n = box.getChildren().get(i);
-                    if (n.isDisabled() || !n.impl_isTreeVisible()) continue;
+                    if (n.isDisabled() || !NodeHelper.isTreeVisible(n)) continue;
                     if (n.isFocusTraversable()) {
                         return n;
                     }
--- a/modules/controls/src/main/module-info/module-info.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/controls/src/main/module-info/module-info.java	Fri Jun 10 09:43:53 2016 -0400
@@ -32,6 +32,8 @@
     exports javafx.scene.control.cell;
     exports javafx.scene.control.skin;
 
+    exports com.sun.javafx.scene.control to
+        javafx.web;
     exports com.sun.javafx.scene.control.behavior to
         javafx.web;
     exports com.sun.javafx.scene.control.inputmap to
--- a/modules/controls/src/test/java/test/javafx/scene/control/LabelTest.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/controls/src/test/java/test/javafx/scene/control/LabelTest.java	Fri Jun 10 09:43:53 2016 -0400
@@ -25,6 +25,7 @@
 
 package test.javafx.scene.control;
 
+import com.sun.javafx.scene.NodeHelper;
 import javafx.css.CssMetaData;
 import static test.com.sun.javafx.scene.control.infrastructure.ControlTestUtils.*;
 import static org.junit.Assert.assertEquals;
@@ -171,40 +172,40 @@
     @Test public void showMnemonicsHasNoListenersOnTextFieldByDefault() {
         // This is a sanity check test, so the following tests make sense
         TextField textField = new TextField();
-        assertEquals(0, getListenerCount(textField.impl_showMnemonicsProperty()));
+        assertEquals(0, getListenerCount(NodeHelper.showMnemonicsProperty(textField)));
     }
 
     @Test public void settingLabelForShouldAddListenerToShowMnemonics() {
         TextField textField = new TextField();
         label.setLabelFor(textField);
-        assertEquals(1, getListenerCount(textField.impl_showMnemonicsProperty()));
+        assertEquals(1, getListenerCount(NodeHelper.showMnemonicsProperty(textField)));
     }
 
     @Test public void settingLabelForShouldAddListenerToShowMnemonics_SetThroughProperty() {
         TextField textField = new TextField();
         label.labelForProperty().set(textField);
-        assertEquals(1, getListenerCount(textField.impl_showMnemonicsProperty()));
+        assertEquals(1, getListenerCount(NodeHelper.showMnemonicsProperty(textField)));
     }
 
     @Test public void settingLabelForShouldAddListenerToShowMnemonics_WhenBound() {
         TextField textField = new TextField();
         ObjectProperty<TextField> other = new SimpleObjectProperty<TextField>(textField);
         label.labelForProperty().bind(other);
-        assertEquals(1, getListenerCount(textField.impl_showMnemonicsProperty()));
+        assertEquals(1, getListenerCount(NodeHelper.showMnemonicsProperty(textField)));
     }
 
     @Test public void clearingLabelForShouldRemoveListenerFromShowMnemonics() {
         TextField textField = new TextField();
         label.setLabelFor(textField);
         label.setLabelFor(null);
-        assertEquals(0, getListenerCount(textField.impl_showMnemonicsProperty()));
+        assertEquals(0, getListenerCount(NodeHelper.showMnemonicsProperty(textField)));
     }
 
     @Test public void clearingLabelForShouldRemoveListenerFromShowMnemonics_SetThroughProperty() {
         TextField textField = new TextField();
         label.labelForProperty().set(textField);
         label.labelForProperty().set(null);
-        assertEquals(0, getListenerCount(textField.impl_showMnemonicsProperty()));
+        assertEquals(0, getListenerCount(NodeHelper.showMnemonicsProperty(textField)));
     }
 
     @Test public void clearingLabelForShouldRemoveListenerFromShowMnemonics_WhenBound() {
@@ -212,7 +213,7 @@
         ObjectProperty<TextField> other = new SimpleObjectProperty<TextField>(textField);
         label.labelForProperty().bind(other);
         other.set(null);
-        assertEquals(0, getListenerCount(textField.impl_showMnemonicsProperty()));
+        assertEquals(0, getListenerCount(NodeHelper.showMnemonicsProperty(textField)));
     }
 
     @Test public void swappingLabelForShouldAddAndRemoveListenerFromShowMnemonics() {
@@ -220,8 +221,8 @@
         TextField b = new TextField();
         label.setLabelFor(a);
         label.setLabelFor(b);
-        assertEquals(0, getListenerCount(a.impl_showMnemonicsProperty()));
-        assertEquals(1, getListenerCount(b.impl_showMnemonicsProperty()));
+        assertEquals(0, getListenerCount(NodeHelper.showMnemonicsProperty(a)));
+        assertEquals(1, getListenerCount(NodeHelper.showMnemonicsProperty(b)));
     }
 
     @Test public void swappingLabelForShouldAddAndRemoveListenerFromShowMnemonics_SetThroughProperty() {
@@ -229,8 +230,8 @@
         TextField b = new TextField();
         label.labelForProperty().set(a);
         label.labelForProperty().set(b);
-        assertEquals(0, getListenerCount(a.impl_showMnemonicsProperty()));
-        assertEquals(1, getListenerCount(b.impl_showMnemonicsProperty()));
+        assertEquals(0, getListenerCount(NodeHelper.showMnemonicsProperty(a)));
+        assertEquals(1, getListenerCount(NodeHelper.showMnemonicsProperty(b)));
     }
 
     @Test public void swappingLabelForShouldAddAndRemoveListenerFromShowMnemonics_WhenBound() {
@@ -239,34 +240,34 @@
         ObjectProperty<TextField> other = new SimpleObjectProperty<TextField>(a);
         label.labelForProperty().bind(other);
         other.set(b);
-        assertEquals(0, getListenerCount(a.impl_showMnemonicsProperty()));
-        assertEquals(1, getListenerCount(b.impl_showMnemonicsProperty()));
+        assertEquals(0, getListenerCount(NodeHelper.showMnemonicsProperty(a)));
+        assertEquals(1, getListenerCount(NodeHelper.showMnemonicsProperty(b)));
     }
 
     @Test public void changingShowMnemonicsOnLabelForUpdatesStateForLabel() {
         TextField textField = new TextField();
         label.setLabelFor(textField);
-        assertFalse(textField.impl_isShowMnemonics());
-        assertFalse(label.impl_isShowMnemonics());
-        textField.impl_setShowMnemonics(true);
-        assertTrue(textField.impl_isShowMnemonics());
-        assertTrue(label.impl_isShowMnemonics());
+        assertFalse(NodeHelper.isShowMnemonics(textField));
+        assertFalse(NodeHelper.isShowMnemonics(label));
+        NodeHelper.setShowMnemonics(textField, true);
+        assertTrue(NodeHelper.isShowMnemonics(textField));
+        assertTrue(NodeHelper.isShowMnemonics(label));
     }
 
     @Test public void showMnemonicsOfLabelIsUpdatedWhenLabelForIsSet() {
         TextField textField = new TextField();
-        textField.impl_setShowMnemonics(true);
+        NodeHelper.setShowMnemonics(textField, true);
         label.setLabelFor(textField);
-        assertTrue(textField.impl_isShowMnemonics());
-        assertTrue(label.impl_isShowMnemonics());
+        assertTrue(NodeHelper.isShowMnemonics(textField));
+        assertTrue(NodeHelper.isShowMnemonics(label));
     }
 
     @Test public void showMnemonicsOfLabelIsSetToFalseWhenLabelForIsCleared() {
         TextField textField = new TextField();
-        textField.impl_setShowMnemonics(true);
+        NodeHelper.setShowMnemonics(textField, true);
         label.setLabelFor(textField);
         label.setLabelFor(null);
-        assertTrue(textField.impl_isShowMnemonics());
-        assertFalse(label.impl_isShowMnemonics());
+        assertTrue(NodeHelper.isShowMnemonics(textField));
+        assertFalse(NodeHelper.isShowMnemonics(label));
     }
 }
--- a/modules/controls/src/test/java/test/javafx/scene/control/TableViewTest.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/controls/src/test/java/test/javafx/scene/control/TableViewTest.java	Fri Jun 10 09:43:53 2016 -0400
@@ -36,6 +36,7 @@
 
 import com.sun.javafx.scene.control.ReadOnlyUnbackedObservableList;
 import com.sun.javafx.scene.control.SelectedCellsMap;
+import com.sun.javafx.scene.control.TableColumnBaseHelper;
 import com.sun.javafx.scene.control.behavior.TableCellBehavior;
 import javafx.beans.InvalidationListener;
 import test.com.sun.javafx.scene.control.infrastructure.ControlTestUtils;
@@ -1955,7 +1956,7 @@
         StageLoader sl = new StageLoader(table);
 
         // resize the last column
-        last.impl_setWidth(400);
+        TableColumnBaseHelper.setWidth(last, 400);
         assertEquals(400, last.getWidth(), 0.0);
 
         // hide the first column
@@ -3344,7 +3345,7 @@
             // sneak some hidden columns in there
             column = new TableColumn<>("h" + i);
             column.setVisible( false );
-            column.impl_setWidth(50);
+            TableColumnBaseHelper.setWidth(column, 50);
             column.setResizable(false);
             table.getColumns().add( column );
         }
@@ -3465,7 +3466,7 @@
             // sneak some hidden columns in there
             column = new TableColumn<>("h" + i);
             column.setVisible( false );
-            column.impl_setWidth(50);
+            TableColumnBaseHelper.setWidth(column, 50);
             column.setResizable(false);
             table.getColumns().add( column );
         }
--- a/modules/controls/src/test/java/test/javafx/scene/control/TextAreaTest.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/controls/src/test/java/test/javafx/scene/control/TextAreaTest.java	Fri Jun 10 09:43:53 2016 -0400
@@ -89,10 +89,6 @@
         assertEquals(TextArea.DEFAULT_PREF_ROW_COUNT, 10);
     }
 
-    @Test public void checkDefaultParagraphCapacity() {
-        assertEquals(TextArea.DEFAULT_PARAGRAPH_CAPACITY, 32);
-    }
-
     @Test public void checkDefaultWrapText() {
         assertFalse(txtArea.isWrapText());
     }
--- a/modules/controls/src/test/java/test/javafx/scene/control/TreeTableViewTest.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/controls/src/test/java/test/javafx/scene/control/TreeTableViewTest.java	Fri Jun 10 09:43:53 2016 -0400
@@ -25,6 +25,7 @@
 
 package test.javafx.scene.control;
 
+import com.sun.javafx.scene.control.TableColumnBaseHelper;
 import static com.sun.xml.internal.fastinfoset.alphabet.BuiltInRestrictedAlphabets.table;
 import static test.com.sun.javafx.scene.control.infrastructure.ControlTestUtils.assertStyleClassContains;
 import static javafx.scene.control.TreeTableColumn.SortType.ASCENDING;
@@ -2722,7 +2723,7 @@
         StageLoader sl = new StageLoader(table);
 
         // resize the last column
-        last.impl_setWidth(400);
+        TableColumnBaseHelper.setWidth(last, 400);
         assertEquals(400, last.getWidth(), 0.0);
 
         // hide the first column
--- a/modules/controls/src/test/java/test/javafx/scene/control/skin/VirtualFlowTest.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/controls/src/test/java/test/javafx/scene/control/skin/VirtualFlowTest.java	Fri Jun 10 09:43:53 2016 -0400
@@ -117,7 +117,6 @@
     }
 
     private void pulse() {
-//        flow.impl_processCSS(true);
         flow.layout();
     }
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/modules/fxml/src/main/java/com/sun/javafx/fxml/FXMLLoaderHelper.java	Fri Jun 10 09:43:53 2016 -0400
@@ -0,0 +1,59 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.javafx.fxml;
+
+import com.sun.javafx.util.Utils;
+import javafx.fxml.FXMLLoader;
+
+/**
+ * Used to access internal FXMLLoader methods.
+ */
+public class FXMLLoaderHelper {
+    private static FXMLLoaderAccessor fxmlLoaderAccessor;
+
+    static {
+        Utils.forceInit(FXMLLoader.class);
+    }
+
+    private FXMLLoaderHelper() {
+    }
+
+    public static void setStaticLoad(FXMLLoader fxmlLoader, boolean staticLoad) {
+        fxmlLoaderAccessor.setStaticLoad(fxmlLoader, staticLoad);
+    }
+
+    public static void setFXMLLoaderAccessor(final FXMLLoaderAccessor newAccessor) {
+        if (fxmlLoaderAccessor != null) {
+            throw new IllegalStateException();
+        }
+
+        fxmlLoaderAccessor = newAccessor;
+    }
+
+    public interface FXMLLoaderAccessor {
+        void setStaticLoad(FXMLLoader fxmlLoader, boolean staticLoad);
+    }
+}
--- a/modules/fxml/src/main/java/com/sun/javafx/fxml/ParseTraceElement.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/fxml/src/main/java/com/sun/javafx/fxml/ParseTraceElement.java	Fri Jun 10 09:43:53 2016 -0400
@@ -27,11 +27,10 @@
 
 import java.net.URL;
 
-/**
+/*
  * An element in a parse trace, as returned by
- * {@link javafx.fxml.FXMLLoader#impl_getParseTrace()}.
+ * {@link javafx.fxml.FXMLLoader#getParseTrace()}.
  *
- * @treatAsPrivate
  * @since JavaFX 2.1
  */
 public class ParseTraceElement {
--- a/modules/fxml/src/main/java/javafx/fxml/FXMLLoader.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/fxml/src/main/java/javafx/fxml/FXMLLoader.java	Fri Jun 10 09:43:53 2016 -0400
@@ -82,6 +82,7 @@
 import com.sun.javafx.fxml.expression.ExpressionValue;
 import com.sun.javafx.fxml.expression.KeyPath;
 import static com.sun.javafx.FXPermissions.MODIFY_FXML_CLASS_LOADER_PERMISSION;
+import com.sun.javafx.fxml.FXMLLoaderHelper;
 import java.net.MalformedURLException;
 import java.security.AccessController;
 import java.security.PrivilegedAction;
@@ -306,7 +307,7 @@
                     throw constructLoadException("Cannot bind to builder property.");
                 }
 
-                if (!impl_isStaticLoad()) {
+                if (!isStaticLoad()) {
                     value = value.substring(BINDING_EXPRESSION_PREFIX.length(),
                             value.length() - 1);
                     expression = Expression.valueOf(value);
@@ -1143,7 +1144,7 @@
                         FXMLLoader.this.location.toExternalForm()));
             }
             fxmlLoader.setClassLoader(cl);
-            fxmlLoader.impl_setStaticLoad(staticLoad);
+            fxmlLoader.setStaticLoad(staticLoad);
 
             Object value = fxmlLoader.loadImpl(callerClass);
 
@@ -2045,6 +2046,13 @@
                 return System.getProperty("javafx.version");
             }
         });
+
+        FXMLLoaderHelper.setFXMLLoaderAccessor(new FXMLLoaderHelper.FXMLLoaderAccessor() {
+            @Override
+            public void setStaticLoad(FXMLLoader fxmlLoader, boolean staticLoad) {
+                fxmlLoader.setStaticLoad(staticLoad);
+            }
+        });
     }
 
     /**
@@ -2353,26 +2361,20 @@
         clearImports();
     }
 
-    /**
+    /*
      * Returns the static load flag.
-     *
-     * @treatAsPrivate
-     * @deprecated
      */
-    public boolean impl_isStaticLoad() {
+    boolean isStaticLoad() {
         // SB-dependency: RT-21226 has been filed to track this
         return staticLoad;
     }
 
-    /**
+    /*
      * Sets the static load flag.
      *
      * @param staticLoad
-     *
-     * @treatAsPrivate
-     * @deprecated
      */
-    public void impl_setStaticLoad(boolean staticLoad) {
+    void setStaticLoad(boolean staticLoad) {
         // SB-dependency: RT-21226 has been filed to track this
         this.staticLoad = staticLoad;
     }
@@ -2613,7 +2615,7 @@
 
             if (loader.current != null) {
                 messageBuilder.append(":");
-                messageBuilder.append(loader.impl_getLineNumber());
+                messageBuilder.append(loader.getLineNumber());
             }
 
             messageBuilder.append("\n");
@@ -2623,30 +2625,21 @@
 
     /**
      * Returns the current line number.
-     *
-     * @treatAsPrivate
-     * @deprecated
-     * @since JavaFX 2.2
      */
-    public int impl_getLineNumber() {
+    int getLineNumber() {
         return xmlStreamReader.getLocation().getLineNumber();
     }
 
     /**
      * Returns the current parse trace.
-     *
-     * @treatAsPrivate
-     * @deprecated
-     * @since JavaFX 2.1
      */
-    // SB-dependency: RT-21475 has been filed to track this
-    public ParseTraceElement[] impl_getParseTrace() {
+    ParseTraceElement[] getParseTrace() {
         ParseTraceElement[] parseTrace = new ParseTraceElement[loaders.size()];
 
         int i = 0;
         for (FXMLLoader loader : loaders) {
             parseTrace[i++] = new ParseTraceElement(loader.location, (loader.current != null) ?
-                loader.impl_getLineNumber() : -1);
+                loader.getLineNumber() : -1);
         }
 
         return parseTrace;
--- a/modules/fxml/src/test/addExports	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/fxml/src/test/addExports	Fri Jun 10 09:43:53 2016 -0400
@@ -10,5 +10,6 @@
 -XaddExports:javafx.graphics/com.sun.prism=ALL-UNNAMED
 -XaddExports:javafx.graphics/com.sun.scenario.animation=ALL-UNNAMED
 #
+-XaddExports:javafx.fxml/com.sun.javafx.fxml=ALL-UNNAMED
 -XaddExports:javafx.fxml/com.sun.javafx.fxml.builder=ALL-UNNAMED
 -XaddExports:javafx.fxml/com.sun.javafx.fxml.expression=ALL-UNNAMED
--- a/modules/fxml/src/test/java/test/javafx/fxml/FXMLLoader_ScriptTest.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/fxml/src/test/java/test/javafx/fxml/FXMLLoader_ScriptTest.java	Fri Jun 10 09:43:53 2016 -0400
@@ -24,6 +24,7 @@
  * questions.
  */
 
+import com.sun.javafx.fxml.FXMLLoaderHelper;
 import org.junit.Test;
 
 import java.io.IOException;
@@ -38,7 +39,7 @@
     @SuppressWarnings("deprecation")
     public void testStaticScriptLoad() throws IOException {
         FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("static_script_load.fxml"));
-        fxmlLoader.impl_setStaticLoad(true);
+        FXMLLoaderHelper.setStaticLoad(fxmlLoader, true);
         AtomicBoolean scriptCalled = new AtomicBoolean();
         AtomicBoolean scriptEndCalled = new AtomicBoolean();
         fxmlLoader.setLoadListener(new LoadListener() {
--- a/modules/fxml/src/test/java/test/javafx/fxml/RT_18218Test.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/fxml/src/test/java/test/javafx/fxml/RT_18218Test.java	Fri Jun 10 09:43:53 2016 -0400
@@ -25,6 +25,7 @@
 
 package test.javafx.fxml;
 
+import com.sun.javafx.fxml.FXMLLoaderHelper;
 import java.io.IOException;
 import java.util.Map;
 import javafx.fxml.FXMLLoader;
@@ -38,7 +39,7 @@
     @SuppressWarnings({"unchecked", "deprecation"})
     public void testStaticScriptLoad() throws IOException {
         FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("rt_18218.fxml"));
-        fxmlLoader.impl_setStaticLoad(true);
+        FXMLLoaderHelper.setStaticLoad(fxmlLoader, true);
         fxmlLoader.setLoadListener(new LoadListener() {
             private String unknownStaticPropertyElementName = null;
 
--- a/modules/fxpackager/src/main/java/com/oracle/tools/packager/AbstractImageBundler.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/fxpackager/src/main/java/com/oracle/tools/packager/AbstractImageBundler.java	Fri Jun 10 09:43:53 2016 -0400
@@ -37,6 +37,9 @@
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
+import jdk.packager.internal.JLinkBundlerHelper;
+
+
 import static com.oracle.tools.packager.StandardBundlerParam.*;
 
 /**
@@ -61,10 +64,20 @@
             }
         }
 
-        if (MAIN_JAR.fetchFrom(p) == null) {
-            throw new ConfigException(
-                    I18N.getString("error.no-application-jar"),
-                    I18N.getString("error.no-application-jar.advice"));
+        boolean hasMainJar = MAIN_JAR.fetchFrom(p) != null;
+        boolean hasMainModule = JLinkBundlerHelper.MAIN_MODULE.fetchFrom(p) != null;
+
+        if (!hasMainJar && !hasMainModule) {
+            if (!hasMainJar) {
+                throw new ConfigException(
+                        I18N.getString("error.no-application-jar"),
+                        I18N.getString("error.no-application-jar.advice"));
+            }
+            else {
+                throw new ConfigException(
+                        I18N.getString("error.no-main-module"),
+                        I18N.getString("error.no-main-module.advice"));
+            }
         }
 
         if (ENABLE_APP_CDS.fetchFrom(p)) {
@@ -121,6 +134,4 @@
             }
         }
     }
-
-
 }
--- a/modules/fxpackager/src/main/java/com/oracle/tools/packager/JDepHelper.java	Thu Jun 09 04:49:32 2016 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,97 +0,0 @@
-/*
- * Copyright (c) 2016, 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.tools.packager;
-
-
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.nio.file.Path;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-import com.sun.tools.jdeps.Main;
-import java.io.PrintWriter;
-
-
-public final class JDepHelper {
-
-    private JDepHelper() {}
-
-    private static int execute(String[] args, PrintWriter out) {
-        return com.sun.tools.jdeps.Main.run(args, out);
-    }
-
-    public static Set<String> calculateModules(List<String> Files, List<Path> modulePath) {
-        try (ByteArrayOutputStream baos = new ByteArrayOutputStream();
-             PrintWriter writer = new PrintWriter(baos)) {
-
-            List<String> arguments = new ArrayList<>();
-            arguments.add("-s");
-
-            if (modulePath != null || !modulePath.isEmpty()) {
-                arguments.add("-modulepath");
-                arguments.add(ListOfPathToString(modulePath));
-            }
-
-            arguments.addAll(Files);
-
-            execute(arguments.toArray(new String[arguments.size()]), writer);
-
-            // output format is multiple lines of "this.jar -> that.module.name"
-            // we only care about what is to the right of the arrow
-            return Arrays.stream(baos.toString().split("\\s*\\S+\\s+->\\s+"))
-                    .map(String::trim)
-                    .filter(s -> !s.isEmpty() && !arguments.contains(s) && !"not found".equals(s))
-                    .collect(Collectors.toSet());
-        } catch (IOException ioe) {
-            Log.verbose(ioe);
-            return new LinkedHashSet();
-        }
-    }
-
-    private static String ListOfPathToString(List<Path> Value) {
-        String result = "";
-
-        for (Path path : Value) {
-            if (result.isEmpty()) {
-                result = path.toString();
-            }
-            else {
-                result = File.pathSeparator + path.toString();
-            }
-        }
-
-        return result;
-    }
-}
--- a/modules/fxpackager/src/main/java/com/oracle/tools/packager/JLinkBundlerHelper.java	Thu Jun 09 04:49:32 2016 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,407 +0,0 @@
-/*
- * Copyright (c) 2015, 2016, 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.tools.packager;
-
-import jdk.tools.jlink.internal.packager.AppRuntimeImageBuilder;
-
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.io.StringReader;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.EnumSet;
-import java.util.HashSet;
-import java.util.HashMap;
-import java.util.LinkedHashMap;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-import java.util.ResourceBundle;
-import java.util.Set;
-import java.util.TreeSet;
-import java.util.stream.Collectors;
-import jdk.packager.builders.AbstractAppImageBuilder;
-
-
-public class JLinkBundlerHelper {
-
-    private static final ResourceBundle I18N =
-            ResourceBundle.getBundle(JLinkBundlerHelper.class.getName());
-
-    //TODO Remove and replace with programmatic implementation JDK-8149975
-    private static final String[] JRE_MODULES = {"java.se",
-                                                "java.smartcardio",
-                                                "javafx.base",
-                                                "javafx.controls",
-                                                "javafx.deploy",
-                                                "javafx.fxml",
-                                                "javafx.graphics",
-                                                "javafx.media",
-                                                "javafx.swing",
-                                                "javafx.web",
-                                                "javafx.base",
-                                                "javafx.deploy",
-                                                "javafx.graphics",
-                                                "javafx.swing",
-                                                "javafx.controls",
-                                                "javafx.fxml",
-                                                "javafx.media",
-                                                "javafx.web",
-                                                "jdk.packager.services",
-                                                "jdk.accessibility",
-                                                "jdk.charsets",
-                                                "jdk.crypto.ec",
-                                                "jdk.crypto.pkcs11",
-                                                "jdk.dynalink",
-                                                "jdk.httpserver",
-                                                "jdk.internal.le",
-                                                "jdk.jfr",
-                                                "jdk.jvmstat",
-                                                "jdk.jvmstat.rmi",
-                                                "jdk.localedata",
-                                                "jdk.management",
-                                                "jdk.management.cmm",
-                                                "jdk.management.resource",
-                                                "jdk.naming.dns",
-                                                "jdk.naming.rmi",
-                                                "jdk.pack200",
-                                                "jdk.scripting.nashorn",
-                                                "jdk.scripting.nashorn.shell",
-                                                "jdk.sctp",
-                                                "jdk.security.auth",
-                                                "jdk.security.jgss",
-                                                "jdk.snmp",
-                                                "jdk.vm.cds",
-                                                "jdk.vm.ci",
-                                                "jdk.xml.dom",
-                                                "jdk.zipfs",
-                                                "jdk.crypto.mscapi",
-                                                "jdk.crypto.ucrypto",
-                                                "jdk.deploy.osx"}; // going away JDK-8148187
-
-    @SuppressWarnings("unchecked")
-    public static final BundlerParamInfo<List<Path>> MODULE_PATH =
-            new StandardBundlerParam<>(
-                    I18N.getString("param.module-path.name"),
-                    I18N.getString("param.module-path.description"),
-                    "modulepath",
-                    (Class<List<Path>>) (Object)List.class,
-                    p -> new ArrayList(),
-                    (s, p) -> Arrays.asList(s.split("(\\s" + File.pathSeparator + ")+")).stream()
-                        .map(ss -> new File(ss).toPath())
-                        .collect(Collectors.toList()));
-
-    @SuppressWarnings("unchecked")
-    public static final BundlerParamInfo<String> JDK_MODULE_PATH =
-            new StandardBundlerParam<>(
-                    I18N.getString("param.jdk-module-path.name"),
-                    I18N.getString("param.jdk-module-path.description"),
-                    "jdkmodulepath",
-                    String.class,
-                    p -> Paths.get(System.getProperty("java.home"), "jmods").toAbsolutePath().toString(),
-                    (s, p) -> String.valueOf(s));
-
-    @SuppressWarnings("unchecked")
-    public static final BundlerParamInfo<Set<String>> ADD_MODULES =
-            new StandardBundlerParam<>(
-                    I18N.getString("param.add-modules.name"),
-                    I18N.getString("param.add-modules.description"),
-                    "addmods",
-                    (Class<Set<String>>) (Object) Set.class,
-                    p -> new LinkedHashSet(),
-                    (s, p) -> new LinkedHashSet<>(Arrays.asList(s.split("[,;: ]+"))));
-
-    @SuppressWarnings("unchecked")
-    public static final BundlerParamInfo<Set<String>> LIMIT_MODULES =
-            new StandardBundlerParam<>(
-                    I18N.getString("param.limit-modules.name"),
-                    I18N.getString("param.limit-modules.description"),
-                    "limitmods",
-                    (Class<Set<String>>) (Object) Set.class,
-                    p -> new LinkedHashSet(),
-                    (s, p) -> new LinkedHashSet<>(Arrays.asList(s.split("[,;: ]+"))));
-
-    @SuppressWarnings("unchecked")
-    public static final BundlerParamInfo<Boolean> DETECT_MODULES =
-            new StandardBundlerParam<>(
-                    I18N.getString("param.detect-modules.name"),
-                    I18N.getString("param.detect-modules.description"),
-                    "detectmods",
-                    Boolean.class,
-                    p -> Boolean.FALSE,
-                    (s, p) -> Boolean.valueOf(s));
-
-    @SuppressWarnings("unchecked")
-    public static final BundlerParamInfo<Boolean> DETECT_JRE_MODULES =
-            new StandardBundlerParam<>(
-                    I18N.getString("param.detect-jre-modules.name"),
-                    I18N.getString("param.detect-jre-modules.description"),
-                    "detectjremods",
-                    Boolean.class,
-                    p -> Boolean.FALSE,
-                    (s, p) -> Boolean.valueOf(s));
-
-    @SuppressWarnings("unchecked")
-    public static final BundlerParamInfo<Boolean> STRIP_NATIVE_COMMANDS =
-            new StandardBundlerParam<>(
-                    I18N.getString("param.strip-executables.name"),
-                    I18N.getString("param.strip-executables.description"),
-                    "stripexecutables",
-                    Boolean.class,
-                    p -> Boolean.TRUE,
-                    (s, p) -> Boolean.valueOf(s));
-
-    @SuppressWarnings("unchecked")
-    public static final BundlerParamInfo<Map<String, Object>> JLINK_OPTIONS =
-            new StandardBundlerParam<>(
-                    I18N.getString("param.jlink-options.name"),
-                    I18N.getString("param.jlink-options.description"),
-                    "jlinkOptions",
-                    (Class<Map<String, Object>>) (Object) Map.class,
-                    p -> Collections.emptyMap(),
-                    (s, p) -> {
-                        try {
-                            Properties props = new Properties();
-                            props.load(new StringReader(s));
-                            return new LinkedHashMap<>((Map)props);
-                        } catch (IOException e) {
-                            return new LinkedHashMap<>();
-                        }
-                    });
-
-    @SuppressWarnings("unchecked")
-    public static final BundlerParamInfo<String> JLINK_BUILDER =
-            new StandardBundlerParam<>(
-                    I18N.getString("param.jlink-builder.name"),
-                    I18N.getString("param.jlink-builder.description"),
-                    "jlink.builder",
-                    String.class,
-                    null,
-                    (s, p) -> s);
-
-
-    public static void execute(Map<String, ? super Object> params, AbstractAppImageBuilder imageBuilder) throws IOException {
-        String jdkmodulePath = JDK_MODULE_PATH.fetchFrom(params);
-        List<Path> modulePath = MODULE_PATH.fetchFrom(params);
-        Set<String> addModules = ADD_MODULES.fetchFrom(params);
-        boolean detectModules = DETECT_MODULES.fetchFrom(params);
-        boolean detectJreModules = DETECT_JRE_MODULES.fetchFrom(params);
-        File jdkModulePathFile = new File(jdkmodulePath);
-
-        if (!jdkModulePathFile.exists() || !jdkModulePathFile.isDirectory()) {
-            Log.info("JDK Module path doesn't exist: " + jdkmodulePath);
-            //TODO fail?
-            jdkModulePathFile = null;
-        }
-
-        Collection<String> moduleNames = getModuleNamesForApp(getResourceFileJarList(params),
-                                                              jdkModulePathFile,
-                                                              modulePath,
-                                                              detectJreModules,
-                                                              detectModules,
-                                                              addModules.isEmpty());
-
-        if (moduleNames != null) {
-            addModules.addAll(moduleNames);
-        }
-
-        // Add JDK path to the module path for JLINK.
-        if (jdkModulePathFile != null) {
-            modulePath.add(jdkModulePathFile.toPath());
-        }
-
-        Map<String, String> userArguments = convertMapOfObjectToMapOfStrings(JLINK_OPTIONS.fetchFrom(params));
-
-        AppRuntimeImageBuilder appRuntimeBuilder = new AppRuntimeImageBuilder();
-        appRuntimeBuilder.setOutputDir(imageBuilder.getRoot());
-        appRuntimeBuilder.setModulePath(modulePath);
-        appRuntimeBuilder.setAddModules(addModules);
-        appRuntimeBuilder.setLimitModules(LIMIT_MODULES.fetchFrom(params));
-        appRuntimeBuilder.setExcludeFileList(imageBuilder.getExcludeFileList());
-        appRuntimeBuilder.setStripNativeCommands(STRIP_NATIVE_COMMANDS.fetchFrom(params));
-        appRuntimeBuilder.setUserArguments(userArguments);
-
-        appRuntimeBuilder.build();
-        imageBuilder.prepareApplicationFiles();
-    }
-
-    private static Map<String, String> convertMapOfObjectToMapOfStrings(Map<String, Object> options) {
-        Map<String, String> result = new LinkedHashMap<String, String>();
-
-        for (Map.Entry<String, Object> entry : options.entrySet()) {
-            Object o = entry.getValue();
-
-            if (o instanceof String) {
-                String key = entry.getKey();
-                String value = (String)entry.getValue();
-                result.put(key, value);
-            }
-        }
-
-        return result;
-    }
-
-    private static Set<String> getModuleNamesFromPath(List<Path> Value) {
-        Set<String> result = new LinkedHashSet();
-        ModuleManager mm = new ModuleManager(Value);
-        List<Module> modules = mm.getModules(EnumSet.of(ModuleManager.SearchType.ModularJar,
-                                             ModuleManager.SearchType.Jmod,
-                                             ModuleManager.SearchType.ExplodedModule));
-
-        for (Module module : modules) {
-            result.add(module.getModuleName());
-        }
-
-        return result;
-    }
-
-    private static Set<String> getModuleNamesFromPath(Path Value) {
-        return getModuleNamesFromPath(new ArrayList<Path>(Arrays.asList(Value)));
-    }
-
-    //TODO make this per bundler.
-    private static String getExcludeFileList() {
-        // strip debug symbols
-        String result = "*diz";
-
-        if (System.getProperty("os.name").toLowerCase().indexOf("mac") >= 0) {
-            // strip mac osx quicktime
-            result += ",*libjfxmedia_qtkit.dylib";
-        }
-
-        return result;
-    }
-
-    private static Set<String> getAllJDKModuleNames(File jdkModulePathFile) {
-        Set<String> result;
-
-        if (jdkModulePathFile != null) {
-            result = getModuleNamesFromPath(jdkModulePathFile.toPath());
-            Set<String> javaseModules = new HashSet<>(Arrays.asList(JRE_MODULES));
-
-            //TODO JDK-8149975 programmatically determine JRE vs JDK modules
-            result.retainAll(javaseModules); // strip out JDK modules
-        }
-        else {
-            result = new LinkedHashSet();
-        }
-
-        return result;
-    }
-
-    private static Collection<String> getAllDetectedModuleNames(List<String> appJars, File jdkModulePathFile, List<Path> modulePath) {
-            List<Path> lmodulePath = new ArrayList();
-            lmodulePath.addAll(modulePath);
-
-            // Add JDK modules to the module path.
-            if (jdkModulePathFile != null) {
-                lmodulePath.add(jdkModulePathFile.toPath());
-            }
-
-            // Ask Jdeps for the list of dependent modules.
-            Collection<String> detectedModules = JDepHelper.calculateModules(appJars, lmodulePath);
-            Log.info("Automatically adding detected modules " + detectedModules);
-
-            return detectedModules;
-    }
-
-    public static List<String> getResourceFileJarList(Map<String, ? super Object> params) {
-        List<String> files = new ArrayList();
-
-        for (RelativeFileSet rfs : StandardBundlerParam.APP_RESOURCES_LIST.fetchFrom(params)) {
-            for (String s : rfs.files) {
-                if (s.endsWith(".jar")) {
-                    files.add(rfs.getBaseDirectory() + File.separator + s);
-                }
-            }
-        }
-
-        return files;
-    }
-
-    private static Collection<String> getModuleNamesForApp(List<String> jars,
-                                                           File jdkModulePathFile,
-                                                           List<Path> modulePath,
-                                                           boolean detectJreModules,
-                                                           boolean detectModules,
-                                                           boolean manualModules) {
-        Collection<String> result = new LinkedHashSet();
-
-        Set<String> moduleNames = null;
-        Set<String> jdkModuleNames = null;
-        Collection<String> detectedModules = null;
-
-        // There are five options. 1. Manual, If none the options below apply,
-        // user specified modules with -addmods with no detection so they want
-        // complete manual control.
-
-        // 2. Detect JRE modules or detect other modules.
-        if (detectJreModules || detectModules) {
-            detectedModules = getAllDetectedModuleNames(jars, jdkModulePathFile, modulePath);
-
-            // 3. All JRE modules and detect other modules.
-            if (!detectJreModules) {
-                // Only retain Java SE Modules.
-                jdkModuleNames = getAllJDKModuleNames(jdkModulePathFile);
-            }
-
-            // 4. Detect JRE modules and all other modules.
-            if (!detectModules) {
-                // Add all modules on user specified path (-modulepath).
-                moduleNames = getModuleNamesFromPath(modulePath);
-            }
-        }
-        else if (manualModules) {
-            // 5. All Modules.
-            // Only retain Java SE Modules.
-            jdkModuleNames = getAllJDKModuleNames(jdkModulePathFile);
-
-            // Add all modules on user specified path (-modulepath).
-            moduleNames = getModuleNamesFromPath(modulePath);
-        }
-
-        if (moduleNames != null) {
-            result.addAll(moduleNames);
-        }
-
-        if (jdkModuleNames != null) {
-            result.addAll(jdkModuleNames);
-        }
-
-        if (detectedModules != null) {
-            result.addAll(detectedModules);
-        }
-
-        return result;
-    }
-}
--- a/modules/fxpackager/src/main/java/com/oracle/tools/packager/Module.java	Thu Jun 09 04:49:32 2016 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,144 +0,0 @@
-/*
- * Copyright (c) 2016, 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.tools.packager;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipInputStream;
-
-
-public final class Module {
-    private String FFileName;
-    private ModuleType FModuleType;
-
-    private enum JarType {Unknown, UnnamedJar, ModularJar}
-
-
-    public enum ModuleType {Unknown, UnnamedJar, ModularJar, Jmod, ExplodedModule}
-
-    public Module(File AFile) {
-        super();
-        FFileName = AFile.getPath();
-        FModuleType = getModuleType(AFile);
-    }
-
-    public String getFileName() {
-        return FFileName;
-    }
-
-    public String getModulePath() {
-        File file = new File(getFileName());
-        return file.getParent();
-    }
-
-    public String getModuleName() {
-        File file = new File(getFileName());
-        return getFileWithoutExtension(file.getName());
-    }
-
-    public ModuleType getModuleType() {
-        return FModuleType;
-    }
-
-    public List<Module> getRequiredModules() {
-        List<Module> result = new ArrayList();
-
-        List<String> files = new ArrayList();
-        files.add(getFileName());
-        Collection<String> detectedModules = JDepHelper.calculateModules(files, null);
-
-        for (String filename : detectedModules) {
-            Module module = new Module(new File(filename));
-            result.add(module);
-        }
-
-        return result;
-    }
-
-    private static ModuleType getModuleType(File AFile) {
-        ModuleType result = ModuleType.Unknown;
-        String filename = AFile.getAbsolutePath();
-
-        if (AFile.isFile()) {
-            if (filename.endsWith(".jmod")) {
-                result = ModuleType.Jmod;
-            }
-            else if (filename.endsWith(".jar")) {
-                JarType status = isModularJar(filename);
-
-                if (status == JarType.ModularJar) {
-                    result = ModuleType.ModularJar;
-                }
-                else if (status == JarType.UnnamedJar) {
-                    result = ModuleType.UnnamedJar;
-                }
-            }
-        }
-        else if (AFile.isDirectory()) {
-            File moduleInfo = new File(filename + File.separator + "module-info.class");
-
-            if (moduleInfo.exists()) {
-                result = ModuleType.ExplodedModule;
-            }
-        }
-
-        return result;
-    }
-
-    private static JarType isModularJar(String FileName) {
-        JarType result = JarType.Unknown;
-        List<String> classNames = new ArrayList<String>();
-
-        try {
-            ZipInputStream zip = new ZipInputStream(new FileInputStream(FileName));
-            result = JarType.UnnamedJar;
-
-            try {
-                for (ZipEntry entry = zip.getNextEntry(); entry != null; entry = zip.getNextEntry()) {
-                    if (entry.getName().matches("module-info.class")) {
-                        result = JarType.ModularJar;
-                        break;
-                    }
-                }
-
-                zip.close();
-            } catch (IOException ex) {
-            }
-        } catch (FileNotFoundException e) {
-        }
-
-        return result;
-    }
-
-    private static String getFileWithoutExtension(String FileName) {
-        return FileName.replaceFirst("[.][^.]+$", "");
-    }
-}
--- a/modules/fxpackager/src/main/java/com/oracle/tools/packager/ModuleManager.java	Thu Jun 09 04:49:32 2016 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,120 +0,0 @@
-/*
- * Copyright (c) 2016, 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.tools.packager;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.nio.file.Path;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.EnumSet;
-import java.util.List;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipInputStream;
-
-
-public final class ModuleManager {
-    private List<String> FFolders = new ArrayList();
-
-    public enum SearchType {UnnamedJar, ModularJar, Jmod, ExplodedModule}
-
-    public ModuleManager(String Folders) {
-        super();
-        String lfolders = Folders.replaceAll("^\"|\"$", "");
-        List<Path> paths = new ArrayList();
-
-        for (String folder : Arrays.asList(lfolders.split(File.pathSeparator))) {
-            File file = new File(folder);
-            paths.add(file.toPath());
-        }
-
-        initialize(paths);
-    }
-
-    public ModuleManager(List<Path> Paths) {
-        super();
-        initialize(Paths);
-    }
-
-    private void initialize(List<Path> Paths) {
-        for (Path path : Paths) {
-            FFolders.add(path.toString().replaceAll("^\"|\"$", ""));
-        }
-    }
-
-    public List<Module> getModules() {
-        return getModules(EnumSet.of(SearchType.UnnamedJar,
-                SearchType.ModularJar, SearchType.Jmod, SearchType.ExplodedModule));
-    }
-
-    public List<Module> getModules(EnumSet<SearchType> Search) {
-        List<Module> result = new ArrayList();
-
-        for (String folder : FFolders) {
-            result.addAll(getAllModulesInDirectory(folder, Search));
-        }
-
-        return result;
-    }
-
-    private static List<Module> getAllModulesInDirectory(String Folder, EnumSet<SearchType> Search) {
-        List<Module> result = new ArrayList();
-        File lfolder = new File(Folder);
-        File[] files = lfolder.listFiles();
-
-        for (File file : files) {
-            Module module = new Module(file);
-
-            switch (module.getModuleType()) {
-                case Unknown:
-                    break;
-                case UnnamedJar:
-                    if (Search.contains(SearchType.UnnamedJar)) {
-                        result.add(module);
-                    }
-                    break;
-                case ModularJar:
-                    if (Search.contains(SearchType.ModularJar)) {
-                        result.add(module);
-                    }
-                    break;
-                case Jmod:
-                    if (Search.contains(SearchType.Jmod)) {
-                        result.add(module);
-                    }
-                    break;
-                case ExplodedModule:
-                    if (Search.contains(SearchType.ExplodedModule)) {
-                        result.add(module);
-                    }
-                    break;
-            }
-        }
-
-        return result;
-    }
-}
\ No newline at end of file
--- a/modules/fxpackager/src/main/java/com/oracle/tools/packager/RelativeFileSet.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/fxpackager/src/main/java/com/oracle/tools/packager/RelativeFileSet.java	Fri Jun 10 09:43:53 2016 -0400
@@ -43,7 +43,7 @@
     private String arch;
 
     private File basedir;
-    Set<String> files = new LinkedHashSet<>();
+    private Set<String> files = new LinkedHashSet<>();
 
     public RelativeFileSet(RelativeFileSet copy) {
         type = copy.type;
--- a/modules/fxpackager/src/main/java/com/oracle/tools/packager/StandardBundlerParam.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/fxpackager/src/main/java/com/oracle/tools/packager/StandardBundlerParam.java	Fri Jun 10 09:43:53 2016 -0400
@@ -25,12 +25,15 @@
 
 package com.oracle.tools.packager;
 
+import jdk.packager.internal.JLinkBundlerHelper;
+
 import com.sun.javafx.tools.packager.bundlers.BundleParams;
 
 import java.io.File;
 import java.io.IOException;
 import java.io.StringReader;
 import java.nio.file.Files;
+import java.nio.file.Path;
 import java.text.MessageFormat;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -230,9 +233,17 @@
                     (s, p) -> {
                         for (RelativeFileSet rfs : APP_RESOURCES_LIST.fetchFrom(p)) {
                             File appResourcesRoot = rfs.getBaseDirectory();
-                            File f = new File(appResourcesRoot, s);
-                            if (f.exists()) {
-                                return new RelativeFileSet(appResourcesRoot, new LinkedHashSet<>(Collections.singletonList(f)));
+                            File mainJarFile = new File(appResourcesRoot, s);
+                            if (mainJarFile.exists()) {
+                                return new RelativeFileSet(appResourcesRoot, new LinkedHashSet<>(Collections.singletonList(mainJarFile)));
+                            }
+                            else {
+                                List<Path> modulePath = JLinkBundlerHelper.MODULE_PATH.fetchFrom(p);
+                                Path modularJarPath = JLinkBundlerHelper.findModulePath(modulePath, s);
+
+                                if (modularJarPath != null && Files.exists(modularJarPath)) {
+                                    return new RelativeFileSet(appResourcesRoot, new LinkedHashSet<>(Collections.singletonList(modularJarPath.toFile())));
+                                }
                             }
                         }
                         throw new IllegalArgumentException(
@@ -653,8 +664,9 @@
         boolean hasMainJar = params.containsKey(MAIN_JAR.getID());
         boolean hasMainJarClassPath = params.containsKey(CLASSPATH.getID());
         boolean hasPreloader = params.containsKey(PRELOADER_CLASS.getID());
+        boolean haMainModule = params.containsKey(JLinkBundlerHelper.MAIN_MODULE.getID());
 
-        if (hasMainClass && hasMainJar && hasMainJarClassPath) {
+        if (hasMainClass && hasMainJar && hasMainJarClassPath || haMainModule) {
             return;
         }
         // it's a pair.  The [0] is the srcdir [1] is the file relative to sourcedir
@@ -667,7 +679,9 @@
             }
         } else if (hasMainJarClassPath) {
             for (String s : CLASSPATH.fetchFrom(params).split("\\s+")) {
-                filesToCheck.add(new String[] {APP_RESOURCES.fetchFrom(params).getBaseDirectory().toString(), s});
+                if (APP_RESOURCES.fetchFrom(params) != null) {
+                    filesToCheck.add(new String[] {APP_RESOURCES.fetchFrom(params).getBaseDirectory().toString(), s});
+                }
             }
         } else {
             List<RelativeFileSet> rfsl = APP_RESOURCES_LIST.fetchFrom(params);
@@ -754,12 +768,14 @@
         boolean hasMainClass = params.containsKey(MAIN_CLASS.getID());
         boolean hasMainJar = params.containsKey(MAIN_JAR.getID());
         boolean hasMainJarClassPath = params.containsKey(CLASSPATH.getID());
+        boolean haMainModule = params.containsKey(JLinkBundlerHelper.MAIN_MODULE.getID());
 
-        if (hasMainClass && hasMainJar && hasMainJarClassPath) {
+        if (hasMainClass && hasMainJar && hasMainJarClassPath || haMainModule) {
             return;
         }
 
         extractMainClassInfoFromAppResources(params);
+
         if (!params.containsKey(MAIN_CLASS.getID())) {
             if (hasMainJar) {
                 throw new ConfigException(
--- a/modules/fxpackager/src/main/java/com/oracle/tools/packager/linux/LinuxAppBundler.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/fxpackager/src/main/java/com/oracle/tools/packager/linux/LinuxAppBundler.java	Fri Jun 10 09:43:53 2016 -0400
@@ -29,7 +29,6 @@
 import com.oracle.tools.packager.BundlerParamInfo;
 import com.oracle.tools.packager.ConfigException;
 import com.oracle.tools.packager.IOUtils;
-import com.oracle.tools.packager.JLinkBundlerHelper;
 import com.oracle.tools.packager.JreUtils;
 import com.oracle.tools.packager.JreUtils.Rule;
 import com.oracle.tools.packager.Log;
@@ -40,6 +39,8 @@
 import com.sun.javafx.tools.packager.bundlers.BundleParams;
 import jdk.packager.builders.linux.LinuxAppImageBuilder;
 
+import jdk.packager.internal.JLinkBundlerHelper;
+
 import java.io.File;
 import java.io.IOException;
 import java.net.MalformedURLException;
@@ -197,6 +198,10 @@
             Log.info("Exception: "+ex);
             Log.debug(ex);
             return null;
+        } catch (Exception ex) {
+            Log.info("Exception: "+ex);
+            Log.debug(ex);
+            return null;
         }
     }
 
--- a/modules/fxpackager/src/main/java/com/oracle/tools/packager/mac/MacAppBundler.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/fxpackager/src/main/java/com/oracle/tools/packager/mac/MacAppBundler.java	Fri Jun 10 09:43:53 2016 -0400
@@ -29,13 +29,14 @@
 import com.oracle.tools.packager.ConfigException;
 import com.oracle.tools.packager.EnumeratedBundlerParam;
 import com.oracle.tools.packager.IOUtils;
-import com.oracle.tools.packager.JLinkBundlerHelper;
 import com.oracle.tools.packager.Log;
 import com.oracle.tools.packager.Platform;
 import com.oracle.tools.packager.StandardBundlerParam;
 import com.oracle.tools.packager.UnsupportedPlatformException;
 import jdk.packager.builders.mac.MacAppImageBuilder;
 
+import jdk.packager.internal.JLinkBundlerHelper;
+
 import java.io.File;
 import java.io.IOException;
 import java.math.BigInteger;
@@ -347,6 +348,10 @@
             Log.info(ex.toString());
             Log.verbose(ex);
             return null;
+        } catch (Exception ex) {
+            Log.info("Exception: "+ex);
+            Log.debug(ex);
+            return null;
         }
     }
 
@@ -391,7 +396,6 @@
         return Arrays.asList(
                 APP_NAME,
                 APP_RESOURCES,
-                // APP_RESOURCES_LIST, // ??
                 ARGUMENTS,
                 BUNDLE_ID_SIGNING_PREFIX,
                 CLASSPATH,
@@ -403,7 +407,6 @@
                 MAC_CF_BUNDLE_IDENTIFIER,
                 MAC_CF_BUNDLE_NAME,
                 MAC_CF_BUNDLE_VERSION,
-//                MAC_RUNTIME,
                 MAIN_CLASS,
                 MAIN_JAR,
                 PREFERENCES_ID,
--- a/modules/fxpackager/src/main/java/com/oracle/tools/packager/windows/WinAppBundler.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/fxpackager/src/main/java/com/oracle/tools/packager/windows/WinAppBundler.java	Fri Jun 10 09:43:53 2016 -0400
@@ -29,7 +29,6 @@
 import com.oracle.tools.packager.BundlerParamInfo;
 import com.oracle.tools.packager.ConfigException;
 import com.oracle.tools.packager.IOUtils;
-import com.oracle.tools.packager.JLinkBundlerHelper;
 import com.oracle.tools.packager.Log;
 import com.oracle.tools.packager.Platform;
 import com.oracle.tools.packager.RelativeFileSet;
@@ -37,6 +36,8 @@
 import com.oracle.tools.packager.UnsupportedPlatformException;
 import jdk.packager.builders.windows.WindowsAppImageBuilder;
 
+import jdk.packager.internal.JLinkBundlerHelper;
+
 import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.IOException;
@@ -183,6 +184,10 @@
             Log.info(ex.toString());
             Log.verbose(ex);
             return null;
+        } catch (Exception ex) {
+            Log.info("Exception: "+ex);
+            Log.debug(ex);
+            return null;
         }
     }
 
--- a/modules/fxpackager/src/main/java/com/sun/javafx/tools/ant/Application.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/fxpackager/src/main/java/com/sun/javafx/tools/ant/Application.java	Fri Jun 10 09:43:53 2016 -0400
@@ -63,9 +63,7 @@
 
     public List<Argument> addModule = new LinkedList<Argument>();
     public List<Argument> limitModule = new LinkedList<Argument>();
-    String jdkModulePath;
-    boolean detectModules;
-    boolean detectJreModules;
+    String modulepath;
     boolean stripExecutables;
 
     public void setVersion(String v) {
@@ -245,49 +243,17 @@
     }
 
     /**
-     * Whether or not the bundler should attempt to detect and add used modules
+     *
      */
-    public boolean getDetectModules() {
-        return detectModules;
+    public String getModulePath() {
+        return modulepath;
     }
 
     /**
-     * Whether or not the bundler should attempt to detect and add used modules
-     * @ant.not-required default is false
+     *
      */
-    public void setDetectModules(boolean Value) {
-        this.detectModules = Value;
-    }
-
-    /**
-     * Whether or not the bundler should attempt to detect and add used JRE modules
-     */
-    public boolean getDetectJreModules() {
-        return detectJreModules;
-    }
-
-    /**
-     * Whether or not the bundler should attempt to detect and add used JRE modules
-     * @ant.not-required default is false
-     */
-    public void setDetectJreModules(boolean Value) {
-        this.detectJreModules = Value;
-    }
-
-    /**
-     * Module path within the running applicaiton
-     */
-    public String getJdkModulePath() {
-        return jdkModulePath;
-    }
-
-    /**
-     * Module path within the running applicaiton
-     *
-     * @ant.not-required default is $PACKAGEPATH/modules
-     */
-    public void setJdkModulePath(String Value) {
-        this.jdkModulePath = Value;
+    public void setModulePath(String Value) {
+        this.modulepath = Value;
     }
 
     /**
--- a/modules/fxpackager/src/main/java/com/sun/javafx/tools/ant/DeployFXTask.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/fxpackager/src/main/java/com/sun/javafx/tools/ant/DeployFXTask.java	Fri Jun 10 09:43:53 2016 -0400
@@ -193,10 +193,7 @@
             for (String s : app.getLimitModule()) {
                 deployParams.addLimitModule(s);
             }
-            deployParams.setDetectModules(app.getDetectModules());
-            deployParams.setDetectJreModules(app.getDetectJreModules());
-            deployParams.setJdkModulePath(app.getJdkModulePath());
-            deployParams.setStripExecutables(app.getStripExecutables());
+            deployParams.setStripNativeCommands(app.getStripExecutables());
         }
 
         if (appInfo != null) {
--- a/modules/fxpackager/src/main/java/com/sun/javafx/tools/packager/DeployParams.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/fxpackager/src/main/java/com/sun/javafx/tools/packager/DeployParams.java	Fri Jun 10 09:43:53 2016 -0400
@@ -44,6 +44,8 @@
 import java.util.TreeMap;
 import java.util.TreeSet;
 
+import jdk.packager.internal.JLinkBundlerHelper;
+
 import static com.oracle.tools.packager.jnlp.JNLPBundler.*;
 
 public class DeployParams extends CommonParams {
@@ -75,13 +77,13 @@
     List<String> arguments; //unnamed arguments
 
     // Java 9 modules support
-    Set<String> addModules = new LinkedHashSet<>();
-    Set<String> limitModules = new LinkedHashSet<>();
-    boolean detectModules = false;
-    boolean detectJreModules = false;
-    boolean stripExecutables = false;
-    String modulePath;
-    String jdkModulePath;
+    Set<String> addModules = null;
+    Set<String> limitModules = null;
+    Boolean stripNativeCommands = null;
+    Boolean detectmods = null;
+    String modulePath = null;
+    String mainModule = null;
+    File srcdir;
 
     int width;
     int height;
@@ -251,10 +253,18 @@
     }
 
     public void addAddModule(String module) {
+        if (addModules == null) {
+            addModules = new LinkedHashSet<>();
+        }
+
         addModules.add(module);
     }
 
     public void addLimitModule(String module) {
+        if (limitModules == null) {
+            limitModules = new LinkedHashSet<>();
+        }
+
         limitModules.add(module);
     }
 
@@ -262,20 +272,16 @@
         this.modulePath = value;
     }
 
-    public void setJdkModulePath(String value) {
-        this.jdkModulePath = value;
+    public void setMainModule(String value) {
+        this.mainModule = value;
     }
 
-    public void setDetectModules(boolean value) {
-        this.detectModules = value;
+    public void setStripNativeCommands(boolean value) {
+        this.stripNativeCommands = value;
     }
 
-    public void setDetectJreModules(boolean value) {
-        this.detectJreModules = value;
-    }
-
-    public void setStripExecutables(boolean value) {
-        this.stripExecutables = value;
+    public void setDetectMods(boolean value) {
+        this.detectmods = value;
     }
 
     public void setDescription(String description) {
@@ -486,11 +492,47 @@
         if (resources.isEmpty()) {
             throw new PackagerException("ERR_MissingAppResources");
         }
-        if (applicationClass == null) {
+        if (applicationClass == null && mainModule == null) { //TODO better error here for mainmodule
             throw new PackagerException("ERR_MissingArgument", "-appclass");
         }
     }
 
+    public boolean validateForJNLP() {
+        boolean result = false;
+
+        // Success
+        if (applicationClass != null && !applicationClass.isEmpty() &&
+            (getBundleType() == BundleType.JNLP || getBundleType() == BundleType.ALL)) {
+            result = true;
+        }
+
+        // Failed
+        if ((mainModule != null && !mainModule.isEmpty()) ||
+            (addModules != null && !addModules.isEmpty()) ||
+            (limitModules != null && !limitModules.isEmpty()) |
+            (modulePath != null && !modulePath.isEmpty()) ||
+            getBundleType() == BundleType.INSTALLER ||
+            getBundleType() == BundleType.NATIVE ||
+            getBundleType() == BundleType.IMAGE) {
+
+            result = false;
+        }
+
+        return result;
+    }
+
+    public boolean validateForBundle() {
+        boolean result = false;
+
+        // Success
+        if (((applicationClass != null && !applicationClass.isEmpty()) ||
+            !mainModule.isEmpty())) {
+            result = true;
+        }
+
+        return result;
+    }
+
     //could be icon or splash
     static class Icon {
         final static int UNDEFINED = -1;
@@ -561,12 +603,11 @@
             StandardBundlerParam.JVM_OPTIONS.getID(),
             StandardBundlerParam.USER_JVM_OPTIONS.getID(),
             StandardBundlerParam.ARGUMENTS.getID(),
-            //StandardBundlerParam.MODULE_NAME.getID(),
             JLinkBundlerHelper.MODULE_PATH.getID(),
-            JLinkBundlerHelper.JDK_MODULE_PATH.getID(),
             JLinkBundlerHelper.ADD_MODULES.getID(),
             JLinkBundlerHelper.LIMIT_MODULES.getID(),
-            JLinkBundlerHelper.STRIP_NATIVE_COMMANDS.getID()
+            JLinkBundlerHelper.STRIP_NATIVE_COMMANDS.getID(),
+            JLinkBundlerHelper.DETECT_MODS.getID()
     ));
 
     @SuppressWarnings("unchecked")
@@ -647,13 +688,31 @@
         bundleParams.setJvmUserArgs(jvmUserArgs);
         bundleParams.setArguments(arguments);
 
-        bundleParams.setAddModules(addModules);
-        bundleParams.setLimitModules(limitModules);
-        bundleParams.setDetectModules(detectModules);
-        bundleParams.setDetectJreModules(detectJreModules);
-        bundleParams.setStripExecutables(stripExecutables);
-        bundleParams.setJdkModulePath(jdkModulePath);
-        bundleParams.setModulePath(modulePath);
+        if (addModules != null && !addModules.isEmpty()) {
+            bundleParams.setAddModules(addModules);
+        }
+
+        if (limitModules != null && !limitModules.isEmpty()) {
+            bundleParams.setLimitModules(limitModules);
+        }
+
+        if (stripNativeCommands != null) {
+            bundleParams.setStripNativeCommands(stripNativeCommands);
+        }
+
+        bundleParams.setSrcDir(srcdir);
+
+        if (modulePath != null && !modulePath.isEmpty()) {
+            bundleParams.setModulePath(modulePath);
+        }
+
+        if (mainModule != null && !mainModule.isEmpty()) {
+            bundleParams.setMainModule(mainModule);
+        }
+
+        if (detectmods != null) {
+            bundleParams.setDetectMods(detectmods);
+        }
 
         File appIcon = null;
         List<Map<String, ? super Object>> bundlerIcons = new ArrayList<>();
--- a/modules/fxpackager/src/main/java/com/sun/javafx/tools/packager/Main.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/fxpackager/src/main/java/com/sun/javafx/tools/packager/Main.java	Fri Jun 10 09:43:53 2016 -0400
@@ -59,6 +59,7 @@
     private static boolean verbose = false;
     private static boolean packageAsJar = false;
     private static boolean genJNLP = false;
+    private static boolean genPackages = false;
     private static boolean css2Bin = false;
     private static boolean signJar = false;
     private static boolean makeAll = false;
@@ -193,6 +194,7 @@
                             createJarParams.setCss2bin(false);
                         } else if (arg.equalsIgnoreCase("-runtimeVersion")) {
                             createJarParams.setFxVersion(nextArg(args, i++));
+                            System.out.println("-runtimeVersion is deprecated");
                         } else if (arg.equalsIgnoreCase("-verbose") || arg.equalsIgnoreCase("-v")) {
                             createJarParams.setVerbose(true);
                             verbose = true;
@@ -333,6 +335,7 @@
                             deployParams.setOutfile(nextArg(args, i++));
                         } else if (arg.equalsIgnoreCase("-srcdir")) {
                             srcdir = new File(nextArg(args, i++));
+                            deployParams.srcdir = srcdir;
                         } else if (arg.equalsIgnoreCase("-srcfiles")) {
                             addResources(deployParams, srcdir, nextArg(args, i++));
                             srcfilesSet = true;
@@ -344,30 +347,14 @@
                             deployParams.addModules.add(nextArg(args, i++));
                         } else if (arg.equals("-limitmods")) {
                             deployParams.limitModules.add(nextArg(args, i++));
-                        } else if (arg.equals("-detectmods")) {
-                            deployParams.detectModules = true;
-                        } else if (arg.equals("-detectjremods")) {
-                            deployParams.detectJreModules = true;
-                        } else if (arg.equals("-stripexecutables")) {
-                            deployParams.stripExecutables = true;
-                        } else if (arg.equals("-modulepath")) {
-                            if (deployParams.modulePath == null) {
-                                deployParams.modulePath = nextArg(args, i++);
-                            } else {
-                                deployParams.modulePath =
-                                        deployParams.modulePath
-                                        + File.pathSeparator
-                                        + nextArg(args, i++);
-                            }
-                        } else if (arg.equals("-jdkmodulepath")) {
-                            if (deployParams.jdkModulePath == null) {
-                                deployParams.jdkModulePath = nextArg(args, i++);
-                            } else {
-                                deployParams.jdkModulePath =
-                                        deployParams.jdkModulePath
-                                        + File.pathSeparator
-                                        + nextArg(args, i++);
-                            }
+                        } else if (arg.equals("-strip-native-commands")) {
+                            deployParams.setStripNativeCommands(Boolean.valueOf(nextArg(args, i++)));
+                        } else if (arg.equals("-Xdetectmods")) {
+                            deployParams.setDetectMods(true);
+                        } else if (arg.equals("-modulepath") || arg.equals("-mp")) {
+                            deployParams.modulePath = nextArg(args, i++);
+                        } else if (arg.equals("-m")) {
+                            deployParams.setMainModule(nextArg(args, i++));
                         } else {
                             throw new PackagerException("ERR_UnknownArgument", arg);
                         }
@@ -375,17 +362,18 @@
                     if (templateInFile != null) {
                         deployParams.addTemplate(templateInFile, templateOutFile);
                     }
-                    if (srcdir != null && !srcdir.isDirectory()) {
-                        throw new PackagerException("ERR_InvalidDirectory", srcdir.getAbsolutePath());
+
+                    if (deployParams.validateForJNLP()) {
+                        genJNLP = true;
                     }
+
+                    if (deployParams.validateForBundle()) {
+                        genPackages = true;
+                    }
+
                     if (!srcfilesSet) {
-                        //using "." as default dir is confusing. Require explicit list of inputs
-                        if (srcdir == null) {
-                            throw new PackagerException("ERR_MissingArgument", "-srcfiles (-srcdir)");
-                        }
                         addResources(deployParams, srcdir, ".");
                     }
-                    genJNLP = true;
                 } else if (args[0].equalsIgnoreCase("-createbss")) {
                     boolean srcfilesSet = false;
                     for (int i = 1; i < args.length; i++) {
@@ -505,6 +493,11 @@
                     deployParams.validate();
                     packager.generateDeploymentPackages(deployParams);
                 }
+                if (genPackages) {
+                    deployParams.setBundleType(BundleType.NATIVE);
+                    deployParams.validate();
+                    packager.generateDeploymentPackages(deployParams);
+                }
                 if (signJar) {
                     signJarParams.validate();
                     if (signJarParams.storePass == null) {
--- a/modules/fxpackager/src/main/java/com/sun/javafx/tools/packager/PackagerLib.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/fxpackager/src/main/java/com/sun/javafx/tools/packager/PackagerLib.java	Fri Jun 10 09:43:53 2016 -0400
@@ -314,26 +314,41 @@
 
         try {
             BundleParams bp = deployParams.getBundleParams();
-            if (bp != null) {
-                if (deployParams.getBundleType().equals(BundleType.ALL) && deployParams.getTargetFormat() == null) {
-                    // generate everything.
+            if (bp != null && deployParams.getTargetFormat() == null) {
+                switch(deployParams.getBundleType()) {
+                    case NATIVE: {
+                        // Generate disk images.
+                        generateNativeBundles(new File(deployParams.outdir, "bundles"),
+                                              bp.getBundleParamsAsMap(),
+                                              BundleType.IMAGE.toString(),
+                                              deployParams.getTargetFormat());
 
-                    // generate JNLP in the main directory
-                    generateNativeBundles(deployParams.outdir, bp.getBundleParamsAsMap(), BundleType.JNLP.toString(), "jnlp");
-                    // generate the rest in .../bundles
+                        //TODO generate installers referencing disk image
+                        // For now just generate all images.
+                        generateNativeBundles(new File(deployParams.outdir, "bundles"),
+                                              bp.getBundleParamsAsMap(),
+                                              BundleType.INSTALLER.toString(),
+                                              deployParams.getTargetFormat());
+                        break;
+                    }
 
-                    // generate disk images
-                    generateNativeBundles(new File(deployParams.outdir, "bundles"), bp.getBundleParamsAsMap(), BundleType.IMAGE.toString(), deployParams.getTargetFormat());
+                    case JNLP:
+                    case NONE: {
+                        // Old school default.  Just generate JNLP.
+                        generateNativeBundles(deployParams.outdir,
+                                              bp.getBundleParamsAsMap(),
+                                              BundleType.JNLP.toString(),
+                                              "jnlp");
+                        break;
+                    }
 
-                    //TODO generate installers referencing disk image
-                    // for now just generate all images
-                    generateNativeBundles(new File(deployParams.outdir, "bundles"), bp.getBundleParamsAsMap(), BundleType.INSTALLER.toString(), deployParams.getTargetFormat());
-                } else if (deployParams.getBundleType().equals(BundleType.NONE) && deployParams.getTargetFormat() == null) {
-                    // old school default.  Just generate JNLP.
-                    generateNativeBundles(deployParams.outdir, bp.getBundleParamsAsMap(), BundleType.JNLP.toString(), "jnlp");
-                } else {
-                    // a specefic output format, just generate that.
-                    generateNativeBundles(deployParams.outdir, bp.getBundleParamsAsMap(), deployParams.getBundleType().toString(), deployParams.getTargetFormat());
+                    default: {
+                        // A specefic output format, just generate that.
+                        generateNativeBundles(deployParams.outdir,
+                                              bp.getBundleParamsAsMap(),
+                                              deployParams.getBundleType().toString(),
+                                              deployParams.getTargetFormat());
+                    }
                 }
             }
         } catch (PackagerException ex) {
--- a/modules/fxpackager/src/main/java/com/sun/javafx/tools/packager/bundlers/BundleParams.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/fxpackager/src/main/java/com/sun/javafx/tools/packager/bundlers/BundleParams.java	Fri Jun 10 09:43:53 2016 -0400
@@ -36,7 +36,9 @@
 import java.util.jar.Manifest;
 
 import static com.oracle.tools.packager.StandardBundlerParam.*;
-import static com.oracle.tools.packager.JLinkBundlerHelper.*;
+
+import jdk.packager.internal.JLinkBundlerHelper;
+
 
 public class BundleParams {
 
@@ -169,34 +171,33 @@
     }
 
     public void setAddModules(Set<String> addModules) {
-        putUnlessNullOrEmpty(ADD_MODULES.getID(), addModules);
+        putUnlessNullOrEmpty(JLinkBundlerHelper.ADD_MODULES.getID(), addModules);
     }
 
     public void setLimitModules(Set<String> limitModules)  {
-        putUnlessNullOrEmpty(LIMIT_MODULES.getID(), limitModules);
+        putUnlessNullOrEmpty(JLinkBundlerHelper.LIMIT_MODULES.getID(), limitModules);
     }
 
-    public void setDetectModules(Boolean detectModules) {
-        putUnlessNull(DETECT_MODULES.getID(), detectModules);
+    public void setStripNativeCommands(boolean value) {
+        putUnlessNull(JLinkBundlerHelper.STRIP_NATIVE_COMMANDS.getID(), value);
     }
 
-    public void setDetectJreModules(Boolean value) {
-        putUnlessNull(DETECT_JRE_MODULES.getID(), value);
+    public void setDetectMods(boolean value) {
+        putUnlessNull(JLinkBundlerHelper.DETECT_MODS.getID(), value);
     }
 
-    public void setStripExecutables(Boolean value) {
-        putUnlessNull(STRIP_NATIVE_COMMANDS.getID(), value);
+    public void setSrcDir(File value) {
+        //putUnlessNull(JDK_MODULE_PATH.getID(), appModulePath); //TODO remove?
     }
 
-    public void setJdkModulePath(String appModulePath) {
-        putUnlessNull(JDK_MODULE_PATH.getID(), appModulePath);
+    public void setModulePath(String value) {
+        putUnlessNull(JLinkBundlerHelper.MODULE_PATH.getID(), value);
     }
 
-    public void setModulePath(String linkModulePath) {
-        putUnlessNull(MODULE_PATH.getID(), linkModulePath);
+    public void setMainModule(String value) {
+        putUnlessNull(JLinkBundlerHelper.MAIN_MODULE.getID(), value);
     }
 
-
     public String getApplicationID() {
         return fetchParam(IDENTIFIER);
     }
--- a/modules/fxpackager/src/main/java/com/sun/javafx/tools/packager/bundlers/Bundler.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/fxpackager/src/main/java/com/sun/javafx/tools/packager/bundlers/Bundler.java	Fri Jun 10 09:43:53 2016 -0400
@@ -33,7 +33,7 @@
      */
     @Deprecated
     public enum BundleType {
-        NONE, IMAGE, INSTALLER, ALL, JNLP
+        NONE, IMAGE, INSTALLER, ALL, JNLP, NATIVE
     }
 
 }
--- a/modules/fxpackager/src/main/java/jdk/packager/builders/AbstractAppImageBuilder.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/fxpackager/src/main/java/jdk/packager/builders/AbstractAppImageBuilder.java	Fri Jun 10 09:43:53 2016 -0400
@@ -26,10 +26,11 @@
 package jdk.packager.builders;
 
 
-import com.oracle.tools.packager.JLinkBundlerHelper;
+import jdk.packager.internal.JLinkBundlerHelper;
 import com.oracle.tools.packager.RelativeFileSet;
 
 import com.oracle.tools.packager.Log;
+import jdk.packager.internal.Module;
 
 import java.io.ByteArrayOutputStream;
 import java.io.File;
@@ -50,6 +51,7 @@
 import static com.oracle.tools.packager.StandardBundlerParam.*;
 import static com.oracle.tools.packager.StandardBundlerParam.ARGUMENTS;
 import static com.oracle.tools.packager.StandardBundlerParam.USER_JVM_OPTIONS;
+import java.util.ArrayList;
 
 
 public abstract class AbstractAppImageBuilder {
@@ -63,10 +65,12 @@
 
     private Map<String, Object> properties;
     private Path root;
+    protected List<String> excludeFileList = new ArrayList<>();
 
     public AbstractAppImageBuilder(Map<String, Object> properties, Path root) throws IOException {
         this.properties = properties;
         this.root = root;
+        excludeFileList.add(".*\\.diz");
     }
 
     public abstract InputStream getResourceAsStream(String name);
@@ -81,7 +85,17 @@
     }
 
     public String getExcludeFileList() {
-        return "*diz";
+        String result = "";
+
+        for (String item : excludeFileList) {
+            if (!result.isEmpty()) {
+                result += ",";
+            }
+
+            result += item;
+        }
+
+        return result;
     }
 
     protected InputStream locateResource(String publicName, String category,
@@ -158,22 +172,51 @@
 
         boolean appCDEnabled = UNLOCK_COMMERCIAL_FEATURES.fetchFrom(params) && ENABLE_APP_CDS.fetchFrom(params);
         String appCDSCacheMode = APP_CDS_CACHE_MODE.fetchFrom(params);
+        File mainJar = JLinkBundlerHelper.getMainJar(params);
+        Module.ModuleType mainJarType = Module.ModuleType.Unknown;
+
+        if (mainJar != null) {
+            mainJarType = new Module(mainJar).getModuleType();
+        }
+
+        String mainModule = JLinkBundlerHelper.MAIN_MODULE.fetchFrom(params);
 
         PrintStream out = new PrintStream(cfgFileName);
 
         out.println("[Application]");
         out.println("app.name=" + APP_NAME.fetchFrom(params));
-        out.println("app.mainjar=" + MAIN_JAR.fetchFrom(params).getIncludedFiles().iterator().next());
         out.println("app.version=" + VERSION.fetchFrom(params));
         out.println("app.preferences.id=" + PREFERENCES_ID.fetchFrom(params));
-        out.println("app.mainclass=" +
-                MAIN_CLASS.fetchFrom(params).replaceAll("\\.", "/"));
-        out.println("app.classpath=" +
-                String.join(File.pathSeparator, CLASSPATH.fetchFrom(params).split("[ :;]")));
-        out.println("app.modulepath=" +
-                String.join(File.pathSeparator, JLinkBundlerHelper.JDK_MODULE_PATH.fetchFrom(params)));
         out.println("app.runtime=" + runtimeLocation);
         out.println("app.identifier=" + IDENTIFIER.fetchFrom(params));
+        out.println("app.classpath=" + String.join(File.pathSeparator, CLASSPATH.fetchFrom(params).split("[ :;]")));
+
+        // The main app is required to be a jar, modular or unnamed.
+        if (mainJarType == Module.ModuleType.Unknown || mainJarType == Module.ModuleType.ModularJar) {
+            if (mainModule != null) {
+                out.println("app.mainmodule=" + mainModule);
+            }
+        }
+        else {
+            String mainClass = JLinkBundlerHelper.getMainClass(params);
+
+            if (mainJar != null && mainClass != null) {
+                // If the app is contained in an unnamed jar then launch it the old
+                // fashioned way and the main class string must be of the format com/foo/Main
+                out.println("app.mainclass=" + mainClass.replaceAll("\\.", "/"));
+                out.println("app.mainjar=" + mainJar);
+            }
+        }
+
+        Integer port = JLinkBundlerHelper.DEBUG_PORT.fetchFrom(params);
+
+        if (port != null) {
+            out.println("app.debug=-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=localhost:" + port);
+        }
+
+        //TODO this is a little tricky now with a modular JDK.
+        //out.println("app.java.version=" + );
+
         if (appCDEnabled) {
             out.println("app.appcds.cache=" + appCDSCacheMode.split("\\+")[0]);
         }
--- a/modules/fxpackager/src/main/java/jdk/packager/builders/mac/MacAppImageBuilder.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/fxpackager/src/main/java/jdk/packager/builders/mac/MacAppImageBuilder.java	Fri Jun 10 09:43:53 2016 -0400
@@ -31,7 +31,9 @@
 import com.oracle.tools.packager.RelativeFileSet;
 import com.oracle.tools.packager.StandardBundlerParam;
 import com.oracle.tools.packager.mac.MacResources;
+
 import jdk.packager.builders.AbstractAppImageBuilder;
+import jdk.packager.internal.JLinkBundlerHelper;
 
 import java.io.BufferedWriter;
 import java.io.File;
@@ -518,7 +520,15 @@
                 //TODO parameters should provide set of values for IDEs
                 MAC_CATEGORY.fetchFrom(params));
 
-        data.put("DEPLOY_MAIN_JAR_NAME", MAIN_JAR.fetchFrom(params).getIncludedFiles().iterator().next());
+        boolean hasMainJar = MAIN_JAR.fetchFrom(params) != null;
+        boolean hasMainModule = JLinkBundlerHelper.MAIN_MODULE.fetchFrom(params) != null;
+
+        if (hasMainJar) {
+            data.put("DEPLOY_MAIN_JAR_NAME", MAIN_JAR.fetchFrom(params).getIncludedFiles().iterator().next());
+        }
+        else if (hasMainModule) {
+            //TODO??
+        }
 
         data.put("DEPLOY_PREFERENCES_ID", PREFERENCES_ID.fetchFrom(params).toLowerCase());
 
@@ -713,7 +723,6 @@
                 data, VERBOSE.fetchFrom(params),
                 DROP_IN_RESOURCES_ROOT.fetchFrom(params)));
         w.close();
-
     }
 
     private void writePkgInfo(File file) throws IOException {
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/modules/fxpackager/src/main/java/jdk/packager/internal/JDepHelper.java	Fri Jun 10 09:43:53 2016 -0400
@@ -0,0 +1,110 @@
+/*
+ * Copyright (c) 2016, 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 jdk.packager.internal;
+
+
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import com.sun.tools.jdeps.Main;
+import java.io.PrintWriter;
+import java.util.Collection;
+
+import com.oracle.tools.packager.Log;
+
+
+public final class JDepHelper {
+
+    private JDepHelper() {}
+
+    private static int execute(String[] args, PrintWriter out) {
+        return com.sun.tools.jdeps.Main.run(args, out);
+    }
+
+    public static Set<String> calculateModules(Collection<String> Files, List<Path> modulePath) {
+        Set<String> result = null;
+
+        if (!Files.isEmpty()) {
+            try (ByteArrayOutputStream baos = new ByteArrayOutputStream();
+                PrintWriter writer = new PrintWriter(baos)) {
+
+                List<String> arguments = new ArrayList<>();
+                arguments.add("-s");
+
+                // TODO Uncomment out once JDK-8151729 is fixed
+                /*if (modulePath != null || !modulePath.isEmpty()) {
+                    arguments.add("-modulepath");
+                    arguments.add(ListOfPathToString(modulePath));
+                }*/
+
+                arguments.addAll(Files);
+
+                execute(arguments.toArray(new String[arguments.size()]), writer);
+
+                // Output format is multiple lines of "this.jar -> that.module.name"
+                // we only care about what is to the right of the arrow.
+                result = Arrays.stream(baos.toString().split("\\s*\\S+\\s+->\\s+"))
+                                       .map(String::trim)
+                                       .filter(s -> !s.isEmpty() && !arguments.contains(s) && !"not found".equals(s))
+                                       .collect(Collectors.toSet());
+            } catch (IOException exception) {
+                Log.verbose(exception);
+            }
+        }
+
+        if (result == null) {
+            result = new LinkedHashSet();
+        }
+
+        return result;
+    }
+
+    private static String ListOfPathToString(List<Path> Value) {
+        String result = "";
+
+        for (Path path : Value) {
+            if (result.isEmpty()) {
+                result = path.toString();
+            }
+            else {
+                result = File.pathSeparator + path.toString();
+            }
+        }
+
+        return result;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/modules/fxpackager/src/main/java/jdk/packager/internal/JLinkBundlerHelper.java	Fri Jun 10 09:43:53 2016 -0400
@@ -0,0 +1,517 @@
+/*
+ * Copyright (c) 2015, 2016, 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 jdk.packager.internal;
+
+
+import static com.oracle.tools.packager.StandardBundlerParam.APP_RESOURCES;
+import static com.oracle.tools.packager.StandardBundlerParam.MAIN_CLASS;
+import static com.oracle.tools.packager.StandardBundlerParam.MAIN_JAR;
+import jdk.tools.jlink.internal.packager.AppRuntimeImageBuilder;
+
+import com.oracle.tools.packager.BundlerParamInfo;
+import com.oracle.tools.packager.StandardBundlerParam;
+import com.oracle.tools.packager.RelativeFileSet;
+import com.oracle.tools.packager.Log;
+
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.PrintWriter;
+import java.io.StringReader;
+import java.net.URI;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.EnumSet;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Properties;
+import java.util.ResourceBundle;
+import java.util.Set;
+import java.util.TreeSet;
+import java.util.function.Supplier;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipInputStream;
+import jdk.packager.builders.AbstractAppImageBuilder;
+import jdk.packager.internal.Module;
+
+
+public class JLinkBundlerHelper {
+
+    private static final ResourceBundle I18N =
+            ResourceBundle.getBundle(JLinkBundlerHelper.class.getName());
+
+    @SuppressWarnings("unchecked")
+    public static final BundlerParamInfo<List<Path>> MODULE_PATH =
+            new StandardBundlerParam<>(
+                    I18N.getString("param.module-path.name"),
+                    I18N.getString("param.module-path.description"),
+                    "modulepath",
+                    (Class<List<Path>>) (Object)List.class,
+                    p -> new ArrayList(),
+                    (s, p) -> Arrays.asList(s.split("[;:]")).stream()
+                        .map(ss -> new File(ss).toPath())
+                        .collect(Collectors.toList()));
+
+    @SuppressWarnings("unchecked")
+    public static final BundlerParamInfo<String> MAIN_MODULE =
+            new StandardBundlerParam<>(
+                    I18N.getString("param.main.module.name"),
+                    I18N.getString("param.main.module.description"),
+                    "m",
+                    String.class,
+                    p -> null,
+                    (s, p) -> {
+                        return String.valueOf(s);
+                    });
+
+    @SuppressWarnings("unchecked")
+    public static final BundlerParamInfo<Set<String>> ADD_MODULES =
+            new StandardBundlerParam<>(
+                    I18N.getString("param.add-modules.name"),
+                    I18N.getString("param.add-modules.description"),
+                    "addmods",
+                    (Class<Set<String>>) (Object) Set.class,
+                    p -> new LinkedHashSet(),
+                    (s, p) -> new LinkedHashSet<>(Arrays.asList(s.split("[,;: ]+"))));
+
+    @SuppressWarnings("unchecked")
+    public static final BundlerParamInfo<Set<String>> LIMIT_MODULES =
+            new StandardBundlerParam<>(
+                    I18N.getString("param.limit-modules.name"),
+                    I18N.getString("param.limit-modules.description"),
+                    "limitmods",
+                    (Class<Set<String>>) (Object) Set.class,
+                    p -> new LinkedHashSet(),
+                    (s, p) -> new LinkedHashSet<>(Arrays.asList(s.split("[,;: ]+"))));
+
+    @SuppressWarnings("unchecked")
+    public static final BundlerParamInfo<Boolean> STRIP_NATIVE_COMMANDS =
+            new StandardBundlerParam<>(
+                    I18N.getString("param.strip-executables.name"),
+                    I18N.getString("param.strip-executables.description"),
+                    "strip-native-commands",
+                    Boolean.class,
+                    p -> Boolean.TRUE,
+                    (s, p) -> Boolean.valueOf(s));
+
+    @SuppressWarnings("unchecked")
+    public static final BundlerParamInfo<Boolean> DETECT_MODS =
+            new StandardBundlerParam<>(
+                    I18N.getString("param.detect-modules.name"),
+                    I18N.getString("param.detect-modules.description"),
+                    "Xdetectmods",
+                    Boolean.class,
+                    p -> Boolean.FALSE,
+                    (s, p) -> Boolean.valueOf(s));
+
+    @SuppressWarnings("unchecked")
+    public static final BundlerParamInfo<Map<String, String>> JLINK_OPTIONS =
+            new StandardBundlerParam<>(
+                    I18N.getString("param.jlink-options.name"),
+                    I18N.getString("param.jlink-options.description"),
+                    "jlinkOptions",
+                    (Class<Map<String, String>>) (Object) Map.class,
+                    p -> Collections.emptyMap(),
+                    (s, p) -> {
+                        try {
+                            Properties props = new Properties();
+                            props.load(new StringReader(s));
+                            return new LinkedHashMap<>((Map)props);
+                        } catch (IOException e) {
+                            return new LinkedHashMap<>();
+                        }
+                    });
+
+    @SuppressWarnings("unchecked")
+    public static final BundlerParamInfo<String> JLINK_BUILDER =
+            new StandardBundlerParam<>(
+                    I18N.getString("param.jlink-builder.name"),
+                    I18N.getString("param.jlink-builder.description"),
+                    "jlink.builder",
+                    String.class,
+                    null,
+                    (s, p) -> s);
+
+    @SuppressWarnings("unchecked")
+    public static final BundlerParamInfo<Integer> DEBUG_PORT =
+            new StandardBundlerParam<>(
+                    I18N.getString("param.main.module.name"),
+                    I18N.getString("param.main.module.description"),
+                    "Xdebug",
+                    Integer.class,
+                    p -> null,
+                    (s, p) -> {
+                        return Integer.valueOf(s);
+                    });
+
+    public static String ListOfPathToString(List<Path> value) {
+        String result = "";
+
+        for (Path path : value) {
+            if (result.length() > 0) {
+                result += File.pathSeparator;
+            }
+
+            result += path.toString();
+        }
+
+        return result;
+    }
+
+    public static String SetOfStringToString(Set<String> value) {
+        String result = "";
+
+        for (String element : value) {
+            if (result.length() > 0) {
+                result += ",";
+            }
+
+            result += element;
+        }
+
+        return result;
+    }
+
+    public static File getMainJar(Map<String, ? super Object> params) {
+        File result = null;
+        RelativeFileSet fileset = MAIN_JAR.fetchFrom(params);
+
+        if (fileset != null) {
+            result = new File(fileset.getIncludedFiles().iterator().next());
+        }
+
+        return result;
+    }
+
+    public static String getMainClass(Map<String, ? super Object> params) {
+        String result = "";
+        File mainJar = getMainJar(params);
+
+        if (mainJar != null) {
+            result = MAIN_CLASS.fetchFrom(params);
+        }
+        else {
+            String mainModule = MAIN_MODULE.fetchFrom(params);
+
+            if (mainModule != null) {
+                int index = mainModule.indexOf("/");
+
+                if (index > 0) {
+                    result = mainModule.substring(index + 1);
+                }
+            }
+        }
+
+        return result;
+    }
+
+    public static String getMainModule(Map<String, ? super Object> params) {
+        String result = "";
+        String mainModule = MAIN_MODULE.fetchFrom(params);
+
+        if (mainModule != null) {
+            int index = mainModule.indexOf("/");
+
+            if (index > 0) {
+                result = mainModule.substring(0, index);
+            }
+            else {
+                result = mainModule;
+            }
+        }
+
+        return result;
+    }
+
+    public static void execute(Map<String, ? super Object> params, AbstractAppImageBuilder imageBuilder) throws IOException, Exception {
+        List<Path> modulePath = MODULE_PATH.fetchFrom(params);
+        Set<String> addModules = ADD_MODULES.fetchFrom(params);
+        Set<String> limitModules = LIMIT_MODULES.fetchFrom(params);
+        boolean stripNativeCommands = STRIP_NATIVE_COMMANDS.fetchFrom(params);
+        Map<String, String> userArguments = JLINK_OPTIONS.fetchFrom(params);
+        Path outputDir = imageBuilder.getRoot();
+        String excludeFileList = imageBuilder.getExcludeFileList();
+        Set<String> jars = getResourceFileJarList(params, Module.JarType.UnnamedJar);
+        Path jdkModulePath = setupDefaultModulePathIfNecessary(params, modulePath);
+        File mainJar = getMainJar(params);
+        Module.ModuleType mainJarType = Module.ModuleType.Unknown;
+
+        if (mainJar != null) {
+            mainJarType = new Module(mainJar).getModuleType();
+        }
+
+        //--------------------------------------------------------------------
+        // Modules
+
+        boolean detectModules = DETECT_MODS.fetchFrom(params);
+
+        // The default for an unnamed jar is ALL_DEFAULT with the
+        // non-redistributable modules removed.
+        if (mainJarType == Module.ModuleType.UnnamedJar && !detectModules) {
+            addModules.add(ModuleHelper.ALL_RUNTIME);
+        }
+        else if (mainJarType == Module.ModuleType.Unknown || mainJarType == Module.ModuleType.ModularJar) {
+            String mainModule = getMainModule(params);
+            addModules.add(mainModule);
+
+            // Error if any of the srcfiles are modular jars.
+            Set<String> modularJars = getResourceFileJarList(params, Module.JarType.ModularJar);
+
+            if (!modularJars.isEmpty()) {
+                throw new Exception(String.format(I18N.getString("error.srcfiles.contain.modules"), modularJars.toString()));
+            }
+        }
+
+        ModuleHelper moduleHelper = new ModuleHelper(modulePath, addModules, limitModules);
+        addModules.addAll(moduleHelper.modules());
+
+        //--------------------------------------------------------------------
+        // Jars
+
+        // Bundle with minimum dependencies that unnamed jars depend on.
+        if (detectModules && !jars.isEmpty()) {
+            Collection<String> detectedModules = JDepHelper.calculateModules(jars, modulePath);
+
+            if (!detectedModules.isEmpty()) {
+                addModules.addAll(detectedModules);
+            }
+        }
+
+        Log.info(String.format(I18N.getString("message.modules"), addModules.toString()));
+
+        AppRuntimeImageBuilder appRuntimeBuilder = new AppRuntimeImageBuilder();
+        appRuntimeBuilder.setOutputDir(outputDir);
+        appRuntimeBuilder.setModulePath(modulePath);
+        appRuntimeBuilder.setAddModules(addModules);
+        appRuntimeBuilder.setLimitModules(limitModules);
+        appRuntimeBuilder.setExcludeFileList(excludeFileList);
+        appRuntimeBuilder.setStripNativeCommands(stripNativeCommands);
+        appRuntimeBuilder.setUserArguments(userArguments);
+
+        appRuntimeBuilder.build();
+        imageBuilder.prepareApplicationFiles();
+    }
+
+    // Returns the path to the JDK modules in the user defined module path.
+    public static Path findModulePath(List<Path> modulePath, String moduleName) {
+        Path result = null;
+
+        for (Path path : modulePath) {
+            Path moduleNamePath = path.resolve(moduleName);
+
+            if (Files.exists(moduleNamePath)) {
+                result = path;
+                break;
+            }
+        }
+
+        return result;
+    }
+
+    private static Path setupDefaultModulePathIfNecessary(Map<String, ? super Object> params, List<Path> modulePath) {
+        Path result = null;
+        Path userDefinedJdkModulePath = findModulePath(modulePath, "java.base.jmod");
+
+        //TODO Fix JDK-8158977
+
+        // Add the default JDK module path to the module path.
+        if (userDefinedJdkModulePath != null) {
+            result = userDefinedJdkModulePath;
+        }
+        else {
+            Path jdkModulePath = Paths.get(System.getProperty("java.home"), "jmods").toAbsolutePath();
+
+            if (jdkModulePath != null && Files.exists(jdkModulePath)) {
+                result = jdkModulePath;
+                modulePath.add(result);
+            }
+        }
+
+        if (result == null) {
+            Log.info(String.format(I18N.getString("warning.no.jdk.modules.found")));
+        }
+
+        return result;
+    }
+
+    private static Set<String> getResourceFileJarList(Map<String, ? super Object> params, Module.JarType Query) {
+        Set<String> files = new LinkedHashSet();
+
+        for (RelativeFileSet appResources : StandardBundlerParam.APP_RESOURCES_LIST.fetchFrom(params)) {
+            for (String resource : appResources.getIncludedFiles()) {
+                if (resource.endsWith(".jar")) {
+                    String filename = appResources.getBaseDirectory() + File.separator + resource;
+
+                    switch (Query) {
+                        case All: {
+                            files.add(filename);
+                            break;
+                        }
+                        case ModularJar: {
+                            Module module = new Module(new File(filename));
+
+                            if (module.getModuleType() == Module.ModuleType.ModularJar) {
+                                files.add(filename);
+                            }
+                            break;
+                        }
+                        case UnnamedJar: {
+                            Module module = new Module(new File(filename));
+
+                            if (module.getModuleType() == Module.ModuleType.UnnamedJar) {
+                                files.add(filename);
+                            }
+                            break;
+                        }
+                    }
+                }
+            }
+        }
+
+        return files;
+    }
+
+    /**
+     * This helper class
+     */
+    private static class ModuleHelper {
+        private static final Set<String> REDISTRIBUTBLE_MODULES = Set.of(
+            "java.base",
+            "java.compiler",
+            "java.datatransfer",
+            "java.desktop",
+            "java.httpclient",
+            "java.instrument",
+            "java.logging",
+            "java.management",
+            "java.naming",
+            "java.prefs",
+            "java.rmi",
+            "java.scripting",
+            "java.security.jgss",
+            "java.security.sasl",
+            "java.sql",
+            "java.sql.rowset",
+            "java.xml",
+            "java.xml.crypto",
+            "javafx.base",
+            "javafx.controls",
+            "javafx.fxml",
+            "javafx.graphics",
+            "javafx.media",
+            "javafx.swing",
+            "javafx.web",
+            "jdk.accessibility",
+            "jdk.dynalink",
+            "jdk.httpserver",
+            "jdk.jfr",
+            "jdk.jsobject",
+            "jdk.management",
+            "jdk.management.cmm",
+            "jdk.management.jfr",
+            "jdk.management.resource",
+            "jdk.net",
+            "jdk.scripting.nashorn",
+            "jdk.sctp",
+            "jdk.security.auth",
+            "jdk.security.jgss",
+            "jdk.unsupported",
+            "jdk.vm.cds",
+            "jdk.xml.dom");
+
+        // The token for "all modules on the module path"
+        private static final String ALL_MODULE_PATH = "ALL-MODULE-PATH";
+
+        public static final String ALL_RUNTIME = "X-ALL-RUNTIME";
+
+        private final Set<String> modules = new HashSet<>();
+
+        public ModuleHelper(List<Path> paths, Set<String> roots, Set<String> limitMods) {
+            boolean found = false;
+
+            for (Iterator<String> iterator = roots.iterator(); iterator.hasNext();) {
+                String module = iterator.next();
+
+                switch (module) {
+                    case ALL_MODULE_PATH:
+                        iterator.remove();
+
+                        if (!found) {
+                            modules.addAll(getModuleNamesFromPath(paths));
+                            found = true;
+                        }
+                        break;
+                    case ALL_RUNTIME:
+                        iterator.remove();
+
+                        if (!found) {
+                            modules.addAll(REDISTRIBUTBLE_MODULES);
+                            found = true;
+                        }
+                        break;
+                    default:
+                        modules.add(module);
+                }
+            }
+        }
+
+        public Set<String> modules() {
+            return modules;
+        }
+
+        private static Set<String> getModuleNamesFromPath(List<Path> Value) {
+                Set<String> result = new LinkedHashSet();
+                ModuleManager mm = new ModuleManager(Value);
+                List<Module> modules = mm.getModules(EnumSet.of(ModuleManager.SearchType.ModularJar,
+                                                     ModuleManager.SearchType.Jmod,
+                                                     ModuleManager.SearchType.ExplodedModule));
+
+                for (Module module : modules) {
+                    result.add(module.getModuleName());
+                }
+
+                return result;
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/modules/fxpackager/src/main/java/jdk/packager/internal/Module.java	Fri Jun 10 09:43:53 2016 -0400
@@ -0,0 +1,122 @@
+/*
+ * Copyright (c) 2016, 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 jdk.packager.internal;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipInputStream;
+
+
+public final class Module {
+    private String filename;
+    private ModuleType moduleType;
+
+    public enum JarType {All, UnnamedJar, ModularJar}
+    public enum ModuleType {Unknown, UnnamedJar, ModularJar, Jmod, ExplodedModule}
+
+    public Module(File AFile) {
+        super();
+        filename = AFile.getPath();
+        moduleType = getModuleType(AFile);
+    }
+
+    public String getModuleName() {
+        File file = new File(getFileName());
+        return getFileWithoutExtension(file.getName());
+    }
+
+    public String getFileName() {
+        return filename;
+    }
+
+    public ModuleType getModuleType() {
+        return moduleType;
+    }
+
+    private static ModuleType getModuleType(File AFile) {
+        ModuleType result = ModuleType.Unknown;
+        String filename = AFile.getAbsolutePath();
+
+        if (AFile.isFile()) {
+            if (filename.endsWith(".jmod")) {
+                result = ModuleType.Jmod;
+            }
+            else if (filename.endsWith(".jar")) {
+                JarType status = isModularJar(filename);
+
+                if (status == JarType.ModularJar) {
+                    result = ModuleType.ModularJar;
+                }
+                else if (status == JarType.UnnamedJar) {
+                    result = ModuleType.UnnamedJar;
+                }
+            }
+        }
+        else if (AFile.isDirectory()) {
+            File moduleInfo = new File(filename + File.separator + "module-info.class");
+
+            if (moduleInfo.exists()) {
+                result = ModuleType.ExplodedModule;
+            }
+        }
+
+        return result;
+    }
+
+    private static JarType isModularJar(String FileName) {
+        JarType result = JarType.All;
+        List<String> classNames = new ArrayList<String>();
+
+        try {
+            ZipInputStream zip = new ZipInputStream(new FileInputStream(FileName));
+            result = JarType.UnnamedJar;
+
+            try {
+                for (ZipEntry entry = zip.getNextEntry(); entry != null; entry = zip.getNextEntry()) {
+                    if (entry.getName().matches("module-info.class")) {
+                        result = JarType.ModularJar;
+                        break;
+                    }
+                }
+
+                zip.close();
+            } catch (IOException ex) {
+            }
+        } catch (FileNotFoundException e) {
+        }
+
+        return result;
+    }
+
+    private static String getFileWithoutExtension(String FileName) {
+        return FileName.replaceFirst("[.][^.]+$", "");
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/modules/fxpackager/src/main/java/jdk/packager/internal/ModuleManager.java	Fri Jun 10 09:43:53 2016 -0400
@@ -0,0 +1,120 @@
+/*
+ * Copyright (c) 2016, 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 jdk.packager.internal;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.EnumSet;
+import java.util.List;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipInputStream;
+
+
+public final class ModuleManager {
+    private List<String> folders = new ArrayList();
+
+    public enum SearchType {UnnamedJar, ModularJar, Jmod, ExplodedModule}
+
+    public ModuleManager(String folders) {
+        super();
+        String lfolders = folders.replaceAll("^\"|\"$", "");
+        List<Path> paths = new ArrayList();
+
+        for (String folder : Arrays.asList(lfolders.split(File.pathSeparator))) {
+            File file = new File(folder);
+            paths.add(file.toPath());
+        }
+
+        initialize(paths);
+    }
+
+    public ModuleManager(List<Path> Paths) {
+        super();
+        initialize(Paths);
+    }
+
+    private void initialize(List<Path> Paths) {
+        for (Path path : Paths) {
+            folders.add(path.toString().replaceAll("^\"|\"$", ""));
+        }
+    }
+
+    public List<Module> getModules() {
+        return getModules(EnumSet.of(SearchType.UnnamedJar,
+                SearchType.ModularJar, SearchType.Jmod, SearchType.ExplodedModule));
+    }
+
+    public List<Module> getModules(EnumSet<SearchType> Search) {
+        List<Module> result = new ArrayList();
+
+        for (String folder : folders) {
+            result.addAll(getAllModulesInDirectory(folder, Search));
+        }
+
+        return result;
+    }
+
+    private static List<Module> getAllModulesInDirectory(String Folder, EnumSet<SearchType> Search) {
+        List<Module> result = new ArrayList();
+        File lfolder = new File(Folder);
+        File[] files = lfolder.listFiles();
+
+        for (File file : files) {
+            Module module = new Module(file);
+
+            switch (module.getModuleType()) {
+                case Unknown:
+                    break;
+                case UnnamedJar:
+                    if (Search.contains(SearchType.UnnamedJar)) {
+                        result.add(module);
+                    }
+                    break;
+                case ModularJar:
+                    if (Search.contains(SearchType.ModularJar)) {
+                        result.add(module);
+                    }
+                    break;
+                case Jmod:
+                    if (Search.contains(SearchType.Jmod)) {
+                        result.add(module);
+                    }
+                    break;
+                case ExplodedModule:
+                    if (Search.contains(SearchType.ExplodedModule)) {
+                        result.add(module);
+                    }
+                    break;
+            }
+        }
+
+        return result;
+    }
+}
\ No newline at end of file
--- a/modules/fxpackager/src/main/native/library/common/GenericPlatform.cpp	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/fxpackager/src/main/native/library/common/GenericPlatform.cpp	Fri Jun 10 09:43:53 2016 -0400
@@ -164,6 +164,7 @@
     std::map<TString, TString> keys;
     keys.insert(std::map<TString, TString>::value_type(CONFIG_VERSION,           _T("app.version")));
     keys.insert(std::map<TString, TString>::value_type(CONFIG_MAINJAR_KEY,       _T("app.mainjar")));
+    keys.insert(std::map<TString, TString>::value_type(CONFIG_MAINMODULE_KEY,    _T("app.mainmodule")));
     keys.insert(std::map<TString, TString>::value_type(CONFIG_MAINCLASSNAME_KEY, _T("app.mainclass")));
     keys.insert(std::map<TString, TString>::value_type(CONFIG_CLASSPATH_KEY,     _T("app.classpath")));
     keys.insert(std::map<TString, TString>::value_type(CONFIG_MODULEPATH_KEY,    _T("app.modulepath")));
--- a/modules/fxpackager/src/main/native/library/common/Helpers.cpp	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/fxpackager/src/main/native/library/common/Helpers.cpp	Fri Jun 10 09:43:53 2016 -0400
@@ -211,6 +211,7 @@
 
         // Application Section
         AppendToIni(propertyFile, Container, keys[CONFIG_MAINJAR_KEY]);
+        AppendToIni(propertyFile, Container, keys[CONFIG_MAINMODULE_KEY]);
         AppendToIni(propertyFile, Container, keys[CONFIG_MAINCLASSNAME_KEY]);
         AppendToIni(propertyFile, Container, keys[CONFIG_CLASSPATH_KEY]);
         AppendToIni(propertyFile, Container, keys[APP_NAME_KEY]);
--- a/modules/fxpackager/src/main/native/library/common/JavaVirtualMachine.cpp	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/fxpackager/src/main/native/library/common/JavaVirtualMachine.cpp	Fri Jun 10 09:43:53 2016 -0400
@@ -380,8 +380,8 @@
 #ifdef DEBUG
     if (package.Debugging() == dsJava) {
         options.AppendValue(_T("-Xdebug"), _T(""));
-        options.AppendValue(_T("-Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=localhost:8000"), _T(""));
-        platform.ShowMessage(_T("localhost:8000"));
+        options.AppendValue(_T("-Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=localhost:5005"), _T(""));
+        platform.ShowMessage(_T("localhost:5005"));
     }
 #endif //DEBUG
 
@@ -404,8 +404,9 @@
     }
 
     TString mainClassName = package.GetMainClassName();
+    TString mainModule = package.GetMainModule();
 
-    if (mainClassName.empty() == true) {
+    if (mainClassName.empty() == true && mainModule.empty() == true) {
         Messages& messages = Messages::GetInstance();
         platform.ShowMessage(messages.GetMessage(NO_MAIN_CLASS_SPECIFIED));
         return false;
@@ -478,7 +479,14 @@
     if (package.HasSplashScreen() == true) {
         options.AppendValue(TString(_T("-splash:")) + package.GetSplashScreenFileName(), _T(""));
     }
-    options.AppendValue(Helpers::ConvertJavaPathToId(mainClassName), _T(""));
+
+    if (mainModule.empty() == true) {
+        options.AppendValue(Helpers::ConvertJavaPathToId(mainClassName), _T(""));
+    }
+    else {
+        options.AppendValue(_T("-m"));
+        options.AppendValue(mainModule);
+    }
 
 #ifdef MAC
     // Mac adds a ProcessSerialNumber to args when launched from .app
--- a/modules/fxpackager/src/main/native/library/common/MacPlatform.mm	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/fxpackager/src/main/native/library/common/MacPlatform.mm	Fri Jun 10 09:43:53 2016 -0400
@@ -328,6 +328,7 @@
     else {
         keys.insert(std::map<TString, TString>::value_type(CONFIG_VERSION,            _T("app.version")));
         keys.insert(std::map<TString, TString>::value_type(CONFIG_MAINJAR_KEY,        _T("JVMMainJarName")));
+        keys.insert(std::map<TString, TString>::value_type(CONFIG_MAINMODULE_KEY,     _T("JVMMainModuleName")));
         keys.insert(std::map<TString, TString>::value_type(CONFIG_MAINCLASSNAME_KEY,  _T("JVMMainClassName")));
         keys.insert(std::map<TString, TString>::value_type(CONFIG_CLASSPATH_KEY,      _T("JVMAppClasspath")));
         keys.insert(std::map<TString, TString>::value_type(APP_NAME_KEY,              _T("CFBundleName")));
--- a/modules/fxpackager/src/main/native/library/common/Package.cpp	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/fxpackager/src/main/native/library/common/Package.cpp	Fri Jun 10 09:43:53 2016 -0400
@@ -86,6 +86,9 @@
     FBootFields->FMainJar = FilePath::IncludeTrailingSeparater(GetPackageAppDirectory()) +
                             FilePath::FixPathForPlatform(FBootFields->FMainJar);
 
+    // Main Module.
+    config->GetValue(keys[CONFIG_SECTION_APPLICATION], keys[CONFIG_MAINMODULE_KEY], FBootFields->FMainModule);
+
     // Classpath.
     // 1. If the provided class path contains main jar then only use provided class path.
     // 2. If class path provided by config file is empty then add main jar.
@@ -576,6 +579,11 @@
     return FBootFields->FMainJar;
 }
 
+TString Package::GetMainModule() {
+    assert(FBootFields != NULL);
+    return FBootFields->FMainModule;
+}
+
 TString Package::GetMainClassName() {
     assert(FBootFields != NULL);
     return FBootFields->FMainClassName;
--- a/modules/fxpackager/src/main/native/library/common/Package.h	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/fxpackager/src/main/native/library/common/Package.h	Fri Jun 10 09:43:53 2016 -0400
@@ -60,6 +60,7 @@
     TString FClassPath;
     TString FModulePath;
     TString FMainJar;
+    TString FMainModule;
     TString FMainClassName;
     bool FIsRuntimeBundled;
     TString FJVMRuntimeDirectory;
@@ -117,6 +118,7 @@
     OrderedMap<TString, TString> GetJVMUserArgOverrides();
     void SetJVMUserArgOverrides(OrderedMap<TString, TString> Value);
     OrderedMap<TString, TString> GetJVMUserArgs();
+    TString GetMainModule();
 
     std::list<TString> GetArgs();
 
--- a/modules/fxpackager/src/main/native/library/common/Platform.h	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/fxpackager/src/main/native/library/common/Platform.h	Fri Jun 10 09:43:53 2016 -0400
@@ -124,17 +124,18 @@
 
 
 // Config file sections
-#define CONFIG_SECTION_APPLICATION            _T("CONFIG_SECTION_APPLICATION")
-#define CONFIG_SECTION_JVMOPTIONS             _T("CONFIG_SECTION_JVMOPTIONS")
-#define CONFIG_SECTION_JVMUSEROPTIONS         _T("CONFIG_SECTION_JVMUSEROPTIONS")
-#define CONFIG_SECTION_JVMUSEROVERRIDESOPTIONS         _T("CONFIG_SECTION_JVMUSEROVERRIDESOPTIONS")
-#define CONFIG_SECTION_APPCDSJVMOPTIONS       _T("CONFIG_SECTION_APPCDSJVMOPTIONS")
+#define CONFIG_SECTION_APPLICATION                   _T("CONFIG_SECTION_APPLICATION")
+#define CONFIG_SECTION_JVMOPTIONS                    _T("CONFIG_SECTION_JVMOPTIONS")
+#define CONFIG_SECTION_JVMUSEROPTIONS                _T("CONFIG_SECTION_JVMUSEROPTIONS")
+#define CONFIG_SECTION_JVMUSEROVERRIDESOPTIONS       _T("CONFIG_SECTION_JVMUSEROVERRIDESOPTIONS")
+#define CONFIG_SECTION_APPCDSJVMOPTIONS              _T("CONFIG_SECTION_APPCDSJVMOPTIONS")
 #define CONFIG_SECTION_APPCDSGENERATECACHEJVMOPTIONS _T("CONFIG_SECTION_APPCDSGENERATECACHEJVMOPTIONS")
-#define CONFIG_SECTION_ARGOPTIONS             _T("CONFIG_SECTION_ARGOPTIONS")
+#define CONFIG_SECTION_ARGOPTIONS                    _T("CONFIG_SECTION_ARGOPTIONS")
 
 // Config file keys.
 #define CONFIG_VERSION            _T("CONFIG_VERSION")
 #define CONFIG_MAINJAR_KEY        _T("CONFIG_MAINJAR_KEY")
+#define CONFIG_MAINMODULE_KEY     _T("CONFIG_MAINMODULE_KEY")
 #define CONFIG_MAINCLASSNAME_KEY  _T("CONFIG_MAINCLASSNAME_KEY")
 #define CONFIG_CLASSPATH_KEY      _T("CONFIG_CLASSPATH_KEY")
 #define CONFIG_MODULEPATH_KEY     _T("CONFIG_MODULEPATH_KEY")
--- a/modules/fxpackager/src/main/resources/com/oracle/tools/packager/AbstractImageBundler.properties	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/fxpackager/src/main/resources/com/oracle/tools/packager/AbstractImageBundler.properties	Fri Jun 10 09:43:53 2016 -0400
@@ -10,6 +10,9 @@
 error.no-application-jar=Main application jar is missing.
 error.no-application-jar.advice=Make sure to use fx\:jar task to create main application jar.
 
+error.no-main-module=Main application module is missing.
+error.no-main-module.advice=Make sure to use fx\:m task to create main application jar or fx\:mainmodule task to create modular application.
+
 error.app-cds-bad-version=AppCDS Not Supported in Bundled Runtime.
 error.app-cds-bad-version.advice=AppCDS support was added in 8u40.  Use an 8u40 or later Java Runtime
 
--- a/modules/fxpackager/src/main/resources/com/oracle/tools/packager/JLinkBundlerHelper.properties	Thu Jun 09 04:49:32 2016 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,26 +0,0 @@
-param.jdk-module-path.name=JDK Module Path
-param.jdk-module-path.description=When packaging the Java Runtime, this defaults the Packager's JDK modules directory but can be overriden with a different JDK modules directory.
-
-param.module-path.name=Module Path
-param.module-path.description=When packaging the Java Runtime, this is the path JLink will look in for modules.
-
-param.add-modules.name=Add Modules
-param.add-modules.description=List of Modules to add to JImage creation, including possible services.
-
-param.limit-modules.name=Limit Modules
-param.limit-modules.description=Modules to Limit JImage creation to.
-
-param.detect-modules.name=Auto Modules
-param.detect-modules.description=Automatically calculate modules to Limit JImage creation to.
-
-param.detect-jre-modules.name=Auto JRE Modules
-param.detect-jre-modules.description=Automatically calculate JRE modules to Limit JImage creation to.
-
-param.jlink-options.name=JLink Options
-param.jlink-options.description=Options to be added to JLink invocation.
-
-param.jlink-builder.name=JLink Builder
-param.jlink-builder.description=Name of the JLink Builder to build the applicaiton image with.
-
-param.strip-executables.name=Strip Native Executables
-param.strip-executables.description=Removes native executables from the JImage creation.
--- a/modules/fxpackager/src/main/resources/com/oracle/tools/packager/StandardBundlerParam.properties	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/fxpackager/src/main/resources/com/oracle/tools/packager/StandardBundlerParam.properties	Fri Jun 10 09:43:53 2016 -0400
@@ -53,6 +53,9 @@
 param.main-class.name=Main Class
 param.main-class.description=The main class for the application.  Either a javafx.application.Application instance or a java class with a main method.
 
+param.main-module.name=Main Module
+param.main-module.description=The main module for the application.  This is the module containing the main class.
+
 param.classpath.name=Main Jar Classpath
 param.classpath.description=The classpath from the main jar of the application, relative to the assembled application directory.
 
--- a/modules/fxpackager/src/main/resources/com/sun/javafx/tools/packager/Bundle.properties	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/fxpackager/src/main/resources/com/sun/javafx/tools/packager/Bundle.properties	Fri Jun 10 09:43:53 2016 -0400
@@ -52,30 +52,36 @@
 \          is a mandatory argument in this case) will be packed.\n\
 \n
 MSG_Help_3=Options for deploy command include:\n\
+\  -native <type>\n\
+\          generate self-contained application bundles (if possible).\n\
+\          If type is specified then only bundle of this type is created.\n\
+\          List of supported types includes: installer, image, exe, msi, dmg, pkg, rpm, deb.\n\
+\  -name <name>\n\
+\          name of the application.\n\
+\  -appclass <application class>\n\
+\          qualified name of the application class to be executed.\n\
+\  -outdir <dir>\n\
+\          name of the directory to generate output file to.\n\
+\  -outfile <filename>\n\
+\          The name (without the extension) of the resulting file.\n\
+\  -srcdir <dir>\n\
+\          Base dir of the files to pack.\n\
+\  -srcfiles <files>\n\
+\          List of files in srcdir. If omitted, all files in srcdir (which\n\
+\          is a mandatory argument in this case) will be used.\n\
+\  -m <modulename>[/<mainclass>]\n\
+\          the initial module to resolve, and the name of the main class\n\
+\          to execute if not specified by the module\n\
+\  -addmods <modulename>[,<modulename>...]\n\
+\          root modules to resolve in addition to the initial module\n\
+\  -limitmods <modulename>[,<modulename>...]\n\
+\          limit the universe of observable modules\n\
 \  -title <title>\n\
 \          title of the application.\n\
 \  -vendor <vendor>\n\
 \          vendor of the application.\n\
 \  -description <description>\n\
 \          description of the application.\n\
-\  -appclass <application class>\n\
-\          qualified name of the application class to be executed.\n\
-\  -preloader <preloader class>\n\
-\          qualified name of the preloader class to be executed.\n\
-\  -paramfile <file>\n\
-\          properties file with default named application parameters.\n\
-\  -htmlparamfile <file>\n\
-\          properties file with parameters for the resulting applet.\n\
-\  -width <width>\n\
-\          width of the application.\n\
-\  -height <height>\n\
-\          height of the application.\n\
-\  -native <type>\n\
-\          generate self-contained application bundles (if possible).\n\
-\          If type is specified then only bundle of this type is created.\n\
-\          List of supported types includes: installer, image, exe, msi, dmg, rpm, deb.\n\
-\  -name <name>\n\
-\          name of the application.\n\
 \  -embedjnlp\n\
 \          If present, the jnlp file will be embedded in the html document.\n\
 \  -embedCertificates\n\
@@ -100,15 +106,16 @@
 \  -argument arg\n\
 \          An unnamed argument to be put in <fx:argument> element in the JNLP\n\
 \          file.\n\
-\  -outdir <dir>\n\
-\          name of the directory to generate output file to.\n\
-\  -outfile <filename>\n\
-\          The name (without the extension) of the resulting file.\n\
-\  -srcdir <dir>\n\
-\          Base dir of the files to pack.\n\
-\  -srcfiles <files>\n\
-\          List of files in srcdir. If omitted, all files in srcdir (which\n\
-\          is a mandatory argument in this case) will be used.\n\
+\  -preloader <preloader class>\n\
+\          qualified name of the preloader class to be executed.\n\
+\  -paramfile <file>\n\
+\          properties file with default named application parameters.\n\
+\  -htmlparamfile <file>\n\
+\          properties file with parameters for the resulting applet.\n\
+\  -width <width>\n\
+\          width of the application.\n\
+\  -height <height>\n\
+\          height of the application.\n\
 \n
 MSG_Help_4=Options for createbss command include:\n\
 \  -outdir <dir>\n\
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/modules/fxpackager/src/main/resources/jdk/packager/internal/JLinkBundlerHelper.properties	Fri Jun 10 09:43:53 2016 -0400
@@ -0,0 +1,33 @@
+param.jdk-module-path.name=JDK Module Path
+param.jdk-module-path.description=When packaging the Java Runtime, this defaults the Packager's JDK modules directory but can be overriden with a different JDK modules directory.
+
+param.module-path.name=Module Path
+param.module-path.description=When packaging the Java Runtime, this is the path JLink will look in for modules.
+
+param.add-modules.name=Add Modules
+param.add-modules.description=List of Modules to add to JImage creation, including possible services.
+
+param.limit-modules.name=Limit Modules
+param.limit-modules.description=Modules to Limit JImage creation to.
+
+param.detect-modules.name=Auto Modules
+param.detect-modules.description=Automatically calculate modules to Limit JImage creation to.
+
+param.jlink-options.name=JLink Options
+param.jlink-options.description=Options to be added to JLink invocation.
+
+param.jlink-builder.name=JLink Builder
+param.jlink-builder.description=Name of the JLink Builder to build the applicaiton image with.
+
+param.strip-executables.name=Strip Native Executables
+param.strip-executables.description=Removes native executables from the JImage creation.
+
+param.main.module.name=Main Module
+param.main.module.description=The main module of the application.  This module should have the main-class, and is on the module path.
+
+error.srcfiles.contain.modules=Error: Modules are not allowed in srcfiles: %s.
+
+warning.no.jdk.modules.found=Warning: No JDK Modules found.
+
+message.detected.modules="Automatically adding detected modules: %s."
+message.modules="Adding modules: %s to jimage."
--- a/modules/graphics/src/main/java/com/sun/javafx/css/StyleManager.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/graphics/src/main/java/com/sun/javafx/css/StyleManager.java	Fri Jun 10 09:43:53 2016 -0400
@@ -25,6 +25,8 @@
 
 package com.sun.javafx.css;
 
+import com.sun.javafx.scene.NodeHelper;
+import com.sun.javafx.scene.ParentHelper;
 import javafx.application.Application;
 import javafx.collections.FXCollections;
 import javafx.collections.ListChangeListener.Change;
@@ -741,9 +743,9 @@
                 //
                 // tell parent it needs to reapply css
                 // No harm is done if parent is in a scene that has had
-                // impl_reapplyCSS called on the root.
+                // NodeHelper.reapplyCSS called on the root.
                 //
-                parent.impl_reapplyCSS();
+                NodeHelper.reapplyCSS(parent);
             }
         }
     }
@@ -1510,7 +1512,7 @@
             }
         }
 
-        for (Parent root : parents) root.impl_reapplyCSS();
+        for (Parent root : parents) NodeHelper.reapplyCSS(root);
     }
 
     private List<StylesheetContainer> processStylesheets(List<String> stylesheets, Parent parent) {
@@ -1579,7 +1581,7 @@
             return Collections.<StylesheetContainer>emptyList();
         }
 
-        final List<String> parentStylesheets = parent.impl_getAllParentStylesheets();
+        final List<String> parentStylesheets = ParentHelper.getAllParentStylesheets(parent);
 
         if (parentStylesheets == null || parentStylesheets.isEmpty()) {
             return Collections.<StylesheetContainer>emptyList();
--- a/modules/graphics/src/main/java/com/sun/javafx/scene/CameraHelper.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/graphics/src/main/java/com/sun/javafx/scene/CameraHelper.java	Fri Jun 10 09:43:53 2016 -0400
@@ -25,6 +25,10 @@
 
 package com.sun.javafx.scene;
 
+import com.sun.javafx.geom.BaseBounds;
+import com.sun.javafx.geom.transform.BaseTransform;
+import com.sun.javafx.jmx.MXNodeAlgorithm;
+import com.sun.javafx.jmx.MXNodeAlgorithmContext;
 import com.sun.javafx.sg.prism.NGNode;
 import com.sun.javafx.util.Utils;
 import javafx.geometry.Point2D;
@@ -70,6 +74,22 @@
         cameraAccessor.doMarkDirty(node, dirtyBit);
     }
 
+    @Override
+    protected BaseBounds computeGeomBoundsImpl(Node node, BaseBounds bounds,
+            BaseTransform tx) {
+        return cameraAccessor.doComputeGeomBounds(node, bounds, tx);
+    }
+
+    @Override
+    protected boolean computeContainsImpl(Node node, double localX, double localY) {
+        return cameraAccessor.doComputeContains(node, localX, localY);
+    }
+
+    @Override
+    protected Object processMXNodeImpl(Node node, MXNodeAlgorithm alg, MXNodeAlgorithmContext ctx) {
+        return cameraAccessor.doProcessMXNode(node, alg, ctx);
+    }
+
     public static Point2D project(Camera camera, Point3D p) {
         return cameraAccessor.project(camera, p);
     }
@@ -93,6 +113,9 @@
     public interface CameraAccessor {
         void doMarkDirty(Node node, DirtyBits dirtyBit);
         void doUpdatePeer(Node node);
+        BaseBounds doComputeGeomBounds(Node node, BaseBounds bounds, BaseTransform tx);
+        boolean doComputeContains(Node node, double localX, double localY);
+        Object doProcessMXNode(Node node, MXNodeAlgorithm alg, MXNodeAlgorithmContext ctx);
         Point2D project(Camera camera, Point3D p);
         Point2D pickNodeXYPlane(Camera camera, Node node, double x, double y);
         Point3D pickProjectPlane(Camera camera, double x, double y);
--- a/modules/graphics/src/main/java/com/sun/javafx/scene/GroupHelper.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/graphics/src/main/java/com/sun/javafx/scene/GroupHelper.java	Fri Jun 10 09:43:53 2016 -0400
@@ -27,6 +27,7 @@
 
 import com.sun.javafx.sg.prism.NGNode;
 import com.sun.javafx.util.Utils;
+import javafx.geometry.Bounds;
 import javafx.scene.Group;
 import javafx.scene.Node;
 
@@ -56,6 +57,12 @@
         return super.createPeerImpl(node);
     }
 
+    @Override
+    protected Bounds computeLayoutBoundsImpl(Node node) {
+        groupAccessor.doComputeLayoutBounds(node);
+        return super.computeLayoutBoundsImpl(node);
+    }
+
     public static void setGroupAccessor(final GroupAccessor newAccessor) {
         if (groupAccessor != null) {
             throw new IllegalStateException();
@@ -65,6 +72,7 @@
     }
 
     public interface GroupAccessor {
+        Bounds doComputeLayoutBounds(Node node);
     }
 
 }
--- a/modules/graphics/src/main/java/com/sun/javafx/scene/ImageViewHelper.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/graphics/src/main/java/com/sun/javafx/scene/ImageViewHelper.java	Fri Jun 10 09:43:53 2016 -0400
@@ -25,6 +25,10 @@
 
 package com.sun.javafx.scene;
 
+import com.sun.javafx.geom.BaseBounds;
+import com.sun.javafx.geom.transform.BaseTransform;
+import com.sun.javafx.jmx.MXNodeAlgorithm;
+import com.sun.javafx.jmx.MXNodeAlgorithmContext;
 import static com.sun.javafx.scene.NodeHelper.setHelper;
 import com.sun.javafx.sg.prism.NGNode;
 import com.sun.javafx.util.Utils;
@@ -63,6 +67,22 @@
         imageViewAccessor.doUpdatePeer(node);
     }
 
+    @Override
+    protected BaseBounds computeGeomBoundsImpl(Node node, BaseBounds bounds,
+            BaseTransform tx) {
+        return imageViewAccessor.doComputeGeomBounds(node, bounds, tx);
+    }
+
+    @Override
+    protected boolean computeContainsImpl(Node node, double localX, double localY) {
+        return imageViewAccessor.doComputeContains(node, localX, localY);
+    }
+
+    @Override
+    protected Object processMXNodeImpl(Node node, MXNodeAlgorithm alg, MXNodeAlgorithmContext ctx) {
+        return imageViewAccessor.doProcessMXNode(node, alg, ctx);
+    }
+
     public static void setImageViewAccessor(final ImageViewAccessor newAccessor) {
         if (imageViewAccessor != null) {
             throw new IllegalStateException();
@@ -74,6 +94,9 @@
     public interface ImageViewAccessor {
         NGNode doCreatePeer(Node node);
         void doUpdatePeer(Node node);
+        BaseBounds doComputeGeomBounds(Node node, BaseBounds bounds, BaseTransform tx);
+        boolean doComputeContains(Node node, double localX, double localY);
+        Object doProcessMXNode(Node node, MXNodeAlgorithm alg, MXNodeAlgorithmContext ctx);
     }
 
 }
--- a/modules/graphics/src/main/java/com/sun/javafx/scene/KeyboardShortcutsHandler.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/graphics/src/main/java/com/sun/javafx/scene/KeyboardShortcutsHandler.java	Fri Jun 10 09:43:53 2016 -0400
@@ -99,7 +99,7 @@
     }
 
     private void traverse(Event event, Node node, Direction dir) {
-        if (node.impl_traverse(dir)) {
+        if (NodeHelper.traverse(node, dir)) {
             event.consume();
         }
     }
@@ -281,11 +281,11 @@
             Mnemonic mnemonic = mnemonicsList.get(i);
             Node currentNode = mnemonic.getNode();
 
-            if (firstMnemonics == null && (currentNode.impl_isTreeVisible() && !currentNode.isDisabled())) {
+            if (firstMnemonics == null && (NodeHelper.isTreeVisible(currentNode) && !currentNode.isDisabled())) {
                 firstMnemonics = mnemonic;
             }
 
-            if (currentNode.impl_isTreeVisible() && (currentNode.isFocusTraversable() && !currentNode.isDisabled())) {
+            if (NodeHelper.isTreeVisible(currentNode) && (currentNode.isFocusTraversable() && !currentNode.isDisabled())) {
                 if (firstNode == null) {
                     firstNode = currentNode;
                 } else {
@@ -390,7 +390,7 @@
                 if (mnemonicsList != null) {
                     for (int i = 0 ; i < mnemonicsList.size() ; i++) {
                         Node currentNode = (Node)mnemonicsList.get(i).getNode();
-                        currentNode.impl_setShowMnemonics(mnemonicsDisplayEnabled);
+                        NodeHelper.setShowMnemonics(currentNode, mnemonicsDisplayEnabled);
                     }
                 }
             }
--- a/modules/graphics/src/main/java/com/sun/javafx/scene/LightBaseHelper.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/graphics/src/main/java/com/sun/javafx/scene/LightBaseHelper.java	Fri Jun 10 09:43:53 2016 -0400
@@ -25,6 +25,10 @@
 
 package com.sun.javafx.scene;
 
+import com.sun.javafx.geom.BaseBounds;
+import com.sun.javafx.geom.transform.BaseTransform;
+import com.sun.javafx.jmx.MXNodeAlgorithm;
+import com.sun.javafx.jmx.MXNodeAlgorithmContext;
 import com.sun.javafx.sg.prism.NGNode;
 import com.sun.javafx.util.Utils;
 import javafx.scene.LightBase;
@@ -68,6 +72,22 @@
         lightBaseAccessor.doMarkDirty(node, dirtyBit);
     }
 
+    @Override
+    protected BaseBounds computeGeomBoundsImpl(Node node, BaseBounds bounds,
+            BaseTransform tx) {
+        return lightBaseAccessor.doComputeGeomBounds(node, bounds, tx);
+    }
+
+    @Override
+    protected boolean computeContainsImpl(Node node, double localX, double localY) {
+        return lightBaseAccessor.doComputeContains(node, localX, localY);
+    }
+
+    @Override
+    protected Object processMXNodeImpl(Node node, MXNodeAlgorithm alg, MXNodeAlgorithmContext ctx) {
+        return lightBaseAccessor.doProcessMXNode(node, alg, ctx);
+    }
+
     public static void setLightBaseAccessor(final LightBaseAccessor newAccessor) {
         if (lightBaseAccessor != null) {
             throw new IllegalStateException();
@@ -79,6 +99,9 @@
     public interface LightBaseAccessor {
         void doMarkDirty(Node node, DirtyBits dirtyBit);
         void doUpdatePeer(Node node);
+        BaseBounds doComputeGeomBounds(Node node, BaseBounds bounds, BaseTransform tx);
+        boolean doComputeContains(Node node, double localX, double localY);
+        Object doProcessMXNode(Node node, MXNodeAlgorithm alg, MXNodeAlgorithmContext ctx);
     }
 
 }
--- a/modules/graphics/src/main/java/com/sun/javafx/scene/NodeHelper.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/graphics/src/main/java/com/sun/javafx/scene/NodeHelper.java	Fri Jun 10 09:43:53 2016 -0400
@@ -26,8 +26,24 @@
 package com.sun.javafx.scene;
 
 import com.sun.glass.ui.Accessible;
+import com.sun.javafx.geom.BaseBounds;
+import com.sun.javafx.geom.PickRay;
+import com.sun.javafx.geom.transform.BaseTransform;
+import com.sun.javafx.jmx.MXNodeAlgorithm;
+import com.sun.javafx.jmx.MXNodeAlgorithmContext;
+import com.sun.javafx.scene.input.PickResultChooser;
+import com.sun.javafx.scene.traversal.Direction;
 import com.sun.javafx.sg.prism.NGNode;
 import com.sun.javafx.util.Utils;
+import java.util.List;
+import java.util.Map;
+import javafx.beans.binding.BooleanExpression;
+import javafx.beans.property.BooleanProperty;
+import javafx.css.CssMetaData;
+import javafx.css.Style;
+import javafx.css.Styleable;
+import javafx.css.StyleableProperty;
+import javafx.geometry.Bounds;
 import javafx.scene.Node;
 import javafx.scene.SubScene;
 
@@ -70,11 +86,69 @@
         getHelper(node).updatePeerImpl(node);
     }
 
+    public static Bounds computeLayoutBounds(Node node) {
+        return getHelper(node).computeLayoutBoundsImpl(node);
+    }
+
+    /*
+     * Computes the geometric bounds for this Node. This method is abstract
+     * and must be implemented by each Node subclass.
+     */
+    public static BaseBounds computeGeomBounds(Node node,
+            BaseBounds bounds, BaseTransform tx) {
+        return getHelper(node).computeGeomBoundsImpl(node, bounds, tx);
+    }
+
+    public static void transformsChanged(Node node) {
+        getHelper(node).transformsChangedImpl(node);
+    }
+
+    public static boolean computeContains(Node node, double localX, double localY) {
+        return getHelper(node).computeContainsImpl(node, localX, localY);
+    }
+
+    public static void pickNodeLocal(Node node, PickRay localPickRay,
+            PickResultChooser result) {
+        getHelper(node).pickNodeLocalImpl(node, localPickRay, result);
+    }
+
+    public static boolean computeIntersects(Node node, PickRay pickRay,
+            PickResultChooser pickResult) {
+        return getHelper(node).computeIntersectsImpl(node, pickRay, pickResult);
+    }
+
+    public static void geomChanged(Node node) {
+        getHelper(node).geomChangedImpl(node);
+    }
+
+    public static void notifyLayoutBoundsChanged(Node node) {
+        getHelper(node).notifyLayoutBoundsChangedImpl(node);
+    }
+
+    public static void processCSS(Node node) {
+        getHelper(node).processCSSImpl(node);
+    }
+
+    /*
+     * This method is used by Scene-graph JMX bean to obtain the Scene-graph structure.
+     *
+     * @param alg current algorithm to process this node
+     * @param ctx current context
+     * @return the algorithm specific result for this node
+     */
+    public static Object processMXNode(Node node, MXNodeAlgorithm alg, MXNodeAlgorithmContext ctx) {
+        return getHelper(node).processMXNodeImpl(node, alg, ctx);
+    }
+
     /*
      * Methods that will be overridden by subclasses
      */
 
     protected abstract NGNode createPeerImpl(Node node);
+    protected abstract boolean computeContainsImpl(Node node, double localX, double localY);
+    protected abstract BaseBounds computeGeomBoundsImpl(Node node,
+            BaseBounds bounds, BaseTransform tx);
+    protected abstract Object processMXNodeImpl(Node node, MXNodeAlgorithm alg, MXNodeAlgorithmContext ctx);
 
     protected void markDirtyImpl(Node node, DirtyBits dirtyBit) {
         nodeAccessor.doMarkDirty(node, dirtyBit);
@@ -84,6 +158,36 @@
         nodeAccessor.doUpdatePeer(node);
     }
 
+    protected Bounds computeLayoutBoundsImpl(Node node) {
+        return nodeAccessor.doComputeLayoutBounds(node);
+    }
+
+    protected void transformsChangedImpl(Node node) {
+        nodeAccessor.doTransformsChanged(node);
+    }
+
+    protected void pickNodeLocalImpl(Node node, PickRay localPickRay,
+            PickResultChooser result) {
+        nodeAccessor.doPickNodeLocal(node, localPickRay, result);
+    }
+
+    protected boolean computeIntersectsImpl(Node node, PickRay pickRay,
+            PickResultChooser pickResult) {
+        return nodeAccessor.doComputeIntersects(node, pickRay, pickResult);
+    }
+
+    protected void geomChangedImpl(Node node) {
+        nodeAccessor.doGeomChanged(node);
+    }
+
+    protected void notifyLayoutBoundsChangedImpl(Node node) {
+        nodeAccessor.doNotifyLayoutBoundsChanged(node);
+    }
+
+    protected void processCSSImpl(Node node) {
+        nodeAccessor.doProcessCSS(node);
+    }
+
     /*
      * Methods used by Node (base) class only
      */
@@ -104,21 +208,91 @@
         return nodeAccessor.getPeer(node);
     }
 
+    public static BaseTransform getLeafTransform(Node node) {
+        return nodeAccessor.getLeafTransform(node);
+    }
+
+    public static void layoutBoundsChanged(Node node) {
+        nodeAccessor.layoutBoundsChanged(node);
+    }
+
+    public static void setShowMnemonics(Node node, boolean value) {
+        nodeAccessor.setShowMnemonics(node, value);
+    }
+
+    public static boolean isShowMnemonics(Node node) {
+        return nodeAccessor.isShowMnemonics(node);
+    }
+
+    public static BooleanProperty showMnemonicsProperty(Node node) {
+        return nodeAccessor.showMnemonicsProperty(node);
+    }
+
+    public static boolean traverse(Node node, Direction direction) {
+        return nodeAccessor.traverse(node, direction);
+    }
+
+    public static double getPivotX(Node node) {
+        return nodeAccessor.getPivotX(node);
+    }
+
+    public static double getPivotY(Node node) {
+        return nodeAccessor.getPivotY(node);
+    }
+
+    public static double getPivotZ(Node node) {
+        return nodeAccessor.getPivotZ(node);
+    }
+
+    public static void pickNode(Node node, PickRay pickRay,
+            PickResultChooser result) {
+        nodeAccessor.pickNode(node, pickRay, result);
+    }
+
+    public static boolean intersects(Node node, PickRay pickRay,
+            PickResultChooser pickResult) {
+        return nodeAccessor.intersects(node, pickRay, pickResult);
+    }
+
+    public static double intersectsBounds(Node node, PickRay pickRay) {
+        return nodeAccessor.intersectsBounds(node, pickRay);
+    }
+
     public static void layoutNodeForPrinting(Node node) {
         nodeAccessor.layoutNodeForPrinting(node);
     }
 
     public static boolean isDerivedDepthTest(Node node) {
         return nodeAccessor.isDerivedDepthTest(node);
-    };
+    }
 
     public static SubScene getSubScene(Node node) {
         return nodeAccessor.getSubScene(node);
-    };
+    }
 
     public static Accessible getAccessible(Node node) {
         return nodeAccessor.getAccessible(node);
-    };
+    }
+
+    public static void reapplyCSS(Node node) {
+        nodeAccessor.reapplyCSS(node);
+    }
+
+    public static boolean isTreeVisible(Node node) {
+        return nodeAccessor.isTreeVisible(node);
+    }
+
+    public static BooleanExpression treeVisibleProperty(Node node) {
+        return nodeAccessor.treeVisibleProperty(node);
+    }
+
+    public static List<Style> getMatchingStyles(CssMetaData cssMetaData, Styleable styleable) {
+        return nodeAccessor.getMatchingStyles(cssMetaData, styleable);
+    }
+
+    public static Map<StyleableProperty<?>,List<Style>> findStyles(Node node, Map<StyleableProperty<?>,List<Style>> styleMap) {
+        return nodeAccessor.findStyles(node, styleMap);
+    }
 
     public static void setNodeAccessor(final NodeAccessor newAccessor) {
         if (nodeAccessor != null) {
@@ -141,15 +315,42 @@
         void setHelper(Node node, NodeHelper nodeHelper);
         void doMarkDirty(Node node, DirtyBits dirtyBit);
         void doUpdatePeer(Node node);
+        BaseTransform getLeafTransform(Node node);
+        Bounds doComputeLayoutBounds(Node node);
+        void doTransformsChanged(Node node);
+        void doPickNodeLocal(Node node, PickRay localPickRay,
+                PickResultChooser result);
+        boolean doComputeIntersects(Node node, PickRay pickRay,
+                PickResultChooser pickResult);
+        void doGeomChanged(Node node);
+        void doNotifyLayoutBoundsChanged(Node node);
+        void doProcessCSS(Node node);
         boolean isDirty(Node node, DirtyBits dirtyBit);
         boolean isDirtyEmpty(Node node);
         void syncPeer(Node node);
         <P extends NGNode> P getPeer(Node node);
+        void layoutBoundsChanged(Node node);
+        void setShowMnemonics(Node node, boolean value);
+        boolean isShowMnemonics(Node node);
+        BooleanProperty showMnemonicsProperty(Node node);
+        boolean traverse(Node node, Direction direction);
+        double getPivotX(Node node);
+        double getPivotY(Node node);
+        double getPivotZ(Node node);
+        void pickNode(Node node, PickRay pickRay, PickResultChooser result);
+        boolean intersects(Node node, PickRay pickRay, PickResultChooser pickResult);
+        double intersectsBounds(Node node, PickRay pickRay);
         void layoutNodeForPrinting(Node node);
         boolean isDerivedDepthTest(Node node);
         SubScene getSubScene(Node node);
         void setLabeledBy(Node node, Node labeledBy);
         Accessible getAccessible(Node node);
+        void reapplyCSS(Node node);
+        boolean isTreeVisible(Node node);
+        BooleanExpression treeVisibleProperty(Node node);
+        List<Style> getMatchingStyles(CssMetaData cssMetaData, Styleable styleable);
+        Map<StyleableProperty<?>,List<Style>> findStyles(Node node,
+                Map<StyleableProperty<?>,List<Style>> styleMap);
     }
 
 }
--- a/modules/graphics/src/main/java/com/sun/javafx/scene/ParentHelper.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/graphics/src/main/java/com/sun/javafx/scene/ParentHelper.java	Fri Jun 10 09:43:53 2016 -0400
@@ -25,11 +25,16 @@
 
 package com.sun.javafx.scene;
 
+import com.sun.javafx.geom.BaseBounds;
 import com.sun.javafx.geom.PickRay;
+import com.sun.javafx.geom.transform.BaseTransform;
+import com.sun.javafx.jmx.MXNodeAlgorithm;
+import com.sun.javafx.jmx.MXNodeAlgorithmContext;
 import com.sun.javafx.scene.input.PickResultChooser;
 import com.sun.javafx.scene.traversal.ParentTraversalEngine;
 import com.sun.javafx.sg.prism.NGNode;
 import com.sun.javafx.util.Utils;
+import java.util.List;
 import javafx.scene.Node;
 import javafx.scene.Parent;
 
@@ -56,6 +61,14 @@
         setHelper(parent, getInstance());
     }
 
+    public static void superProcessCSS(Node node) {
+        ((ParentHelper) getHelper(node)).superProcessCSSImpl(node);
+    }
+
+    public static List<String> getAllParentStylesheets(Parent parent) {
+        return ((ParentHelper) getHelper(parent)).getAllParentStylesheetsImpl(parent);
+    }
+
     @Override
     protected NGNode createPeerImpl(Node node) {
         return parentAccessor.doCreatePeer(node);
@@ -67,6 +80,41 @@
         parentAccessor.doUpdatePeer(node);
     }
 
+    @Override
+    protected BaseBounds computeGeomBoundsImpl(Node node, BaseBounds bounds,
+            BaseTransform tx) {
+        return parentAccessor.doComputeGeomBounds(node, bounds, tx);
+    }
+
+    @Override
+    protected boolean computeContainsImpl(Node node, double localX, double localY) {
+        return parentAccessor.doComputeContains(node, localX, localY);
+    }
+
+    void superProcessCSSImpl(Node node) {
+        super.processCSSImpl(node);
+    }
+
+    @Override
+    protected void processCSSImpl(Node node) {
+        parentAccessor.doProcessCSS(node);
+    }
+
+    protected List<String> getAllParentStylesheetsImpl(Parent parent) {
+        return parentAccessor.doGetAllParentStylesheets(parent);
+    }
+
+    @Override
+    protected Object processMXNodeImpl(Node node, MXNodeAlgorithm alg, MXNodeAlgorithmContext ctx) {
+        return parentAccessor.doProcessMXNode(node, alg, ctx);
+    }
+
+    @Override
+    protected void pickNodeLocalImpl(Node node, PickRay localPickRay,
+            PickResultChooser result) {
+        parentAccessor.doPickNodeLocal(node, localPickRay, result);
+    }
+
     public static boolean pickChildrenNode(Parent parent, PickRay pickRay,
             PickResultChooser result) {
         return parentAccessor.pickChildrenNode(parent, pickRay, result);
@@ -91,9 +139,15 @@
     public interface ParentAccessor {
         NGNode doCreatePeer(Node node);
         void doUpdatePeer(Node node);
+        boolean doComputeContains(Node node, double localX, double localY);
+        BaseBounds doComputeGeomBounds(Node node, BaseBounds bounds, BaseTransform tx);
+        void doProcessCSS(Node node);
+        Object doProcessMXNode(Node node, MXNodeAlgorithm alg, MXNodeAlgorithmContext ctx);
+        void doPickNodeLocal(Node node, PickRay localPickRay, PickResultChooser result);
         boolean pickChildrenNode(Parent parent, PickRay pickRay, PickResultChooser result);
         void setTraversalEngine(Parent parent, ParentTraversalEngine value);
         ParentTraversalEngine getTraversalEngine(Parent parent);
+        List<String> doGetAllParentStylesheets(Parent parent);
     }
 
 }
--- a/modules/graphics/src/main/java/com/sun/javafx/scene/SceneUtils.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/graphics/src/main/java/com/sun/javafx/scene/SceneUtils.java	Fri Jun 10 09:43:53 2016 -0400
@@ -134,7 +134,7 @@
 //
 //        // compute the intersection
 //        final PickResultChooser result = new PickResultChooser();
-//        impl_computeIntersects(pickRay, result);
+//        NodeHelper.computeIntersects(this, pickRay, result);
 //        if (result.getIntersectedNode() == n) {
 //            return result.getIntersectedPoint();
 //        }
--- a/modules/graphics/src/main/java/com/sun/javafx/scene/SubSceneHelper.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/graphics/src/main/java/com/sun/javafx/scene/SubSceneHelper.java	Fri Jun 10 09:43:53 2016 -0400
@@ -25,6 +25,12 @@
 
 package com.sun.javafx.scene;
 
+import com.sun.javafx.geom.BaseBounds;
+import com.sun.javafx.geom.PickRay;
+import com.sun.javafx.geom.transform.BaseTransform;
+import com.sun.javafx.jmx.MXNodeAlgorithm;
+import com.sun.javafx.jmx.MXNodeAlgorithmContext;
+import com.sun.javafx.scene.input.PickResultChooser;
 import com.sun.javafx.sg.prism.NGNode;
 import com.sun.javafx.util.Utils;
 import javafx.scene.Camera;
@@ -52,6 +58,10 @@
         setHelper(subScene, getInstance());
     }
 
+    public static void superProcessCSS(Node node) {
+        ((SubSceneHelper) getHelper(node)).superProcessCSSImpl(node);
+    }
+
     @Override
     protected NGNode createPeerImpl(Node node) {
         return subSceneAccessor.doCreatePeer(node);
@@ -63,6 +73,36 @@
         subSceneAccessor.doUpdatePeer(node);
     }
 
+    @Override
+    protected BaseBounds computeGeomBoundsImpl(Node node, BaseBounds bounds,
+            BaseTransform tx) {
+        return subSceneAccessor.doComputeGeomBounds(node, bounds, tx);
+    }
+
+    @Override
+    protected boolean computeContainsImpl(Node node, double localX, double localY) {
+        return subSceneAccessor.doComputeContains(node, localX, localY);
+    }
+
+    void superProcessCSSImpl(Node node) {
+        super.processCSSImpl(node);
+    }
+
+    protected void processCSSImpl(Node node) {
+        subSceneAccessor.doProcessCSS(node);
+    }
+
+    @Override
+    protected Object processMXNodeImpl(Node node, MXNodeAlgorithm alg, MXNodeAlgorithmContext ctx) {
+        return subSceneAccessor.doProcessMXNode(node, alg, ctx);
+    }
+
+    @Override
+    protected void pickNodeLocalImpl(Node node, PickRay localPickRay,
+            PickResultChooser result) {
+        subSceneAccessor.doPickNodeLocal(node, localPickRay, result);
+    }
+
     public static boolean isDepthBuffer(SubScene subScene) {
         return subSceneAccessor.isDepthBuffer(subScene);
     }
@@ -82,6 +122,12 @@
     public interface SubSceneAccessor {
         NGNode doCreatePeer(Node node);
         void doUpdatePeer(Node node);
+        BaseBounds doComputeGeomBounds(Node node, BaseBounds bounds, BaseTransform tx);
+        boolean doComputeContains(Node node, double localX, double localY);
+        void doProcessCSS(Node node);
+        Object doProcessMXNode(Node node, MXNodeAlgorithm alg, MXNodeAlgorithmContext ctx);
+        void doPickNodeLocal(Node node, PickRay localPickRay,
+                PickResultChooser result);
         boolean isDepthBuffer(SubScene subScene);
         Camera getEffectiveCamera(SubScene subScene);
     }
--- a/modules/graphics/src/main/java/com/sun/javafx/scene/canvas/CanvasHelper.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/graphics/src/main/java/com/sun/javafx/scene/canvas/CanvasHelper.java	Fri Jun 10 09:43:53 2016 -0400
@@ -25,6 +25,10 @@
 
 package com.sun.javafx.scene.canvas;
 
+import com.sun.javafx.geom.BaseBounds;
+import com.sun.javafx.geom.transform.BaseTransform;
+import com.sun.javafx.jmx.MXNodeAlgorithm;
+import com.sun.javafx.jmx.MXNodeAlgorithmContext;
 import com.sun.javafx.scene.NodeHelper;
 import com.sun.javafx.sg.prism.NGNode;
 import com.sun.javafx.util.Utils;
@@ -62,6 +66,21 @@
         canvasAccessor.doUpdatePeer(node);
     }
 
+    @Override
+    protected BaseBounds computeGeomBoundsImpl(Node node, BaseBounds bounds,
+            BaseTransform tx) {
+        return canvasAccessor.doComputeGeomBounds(node, bounds, tx);
+    }
+
+    @Override
+    protected boolean computeContainsImpl(Node node, double localX, double localY) {
+        return canvasAccessor.doComputeContains(node, localX, localY);
+    }
+
+    @Override
+    protected Object processMXNodeImpl(Node node, MXNodeAlgorithm alg, MXNodeAlgorithmContext ctx) {
+        return canvasAccessor.doProcessMXNode(node, alg, ctx);
+    }
     public static void setCanvasAccessor(final CanvasAccessor newAccessor) {
         if (canvasAccessor != null) {
             throw new IllegalStateException();
@@ -73,6 +92,9 @@
     public interface CanvasAccessor {
         NGNode doCreatePeer(Node node);
         void doUpdatePeer(Node node);
+        BaseBounds doComputeGeomBounds(Node node, BaseBounds bounds, BaseTransform tx);
+        boolean doComputeContains(Node node, double localX, double localY);
+        Object doProcessMXNode(Node node, MXNodeAlgorithm alg, MXNodeAlgorithmContext ctx);
     }
 
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/modules/graphics/src/main/java/com/sun/javafx/scene/layout/PaneHelper.java	Fri Jun 10 09:43:53 2016 -0400
@@ -0,0 +1,64 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.javafx.scene.layout;
+
+import com.sun.javafx.util.Utils;
+import javafx.scene.layout.Pane;
+
+/*
+ * Used to access internal methods of Pane.
+ */
+public class PaneHelper extends RegionHelper {
+
+    private static final PaneHelper theInstance;
+    private static PaneAccessor paneAccessor;
+
+    static {
+        theInstance = new PaneHelper();
+        Utils.forceInit(Pane.class);
+    }
+
+    private static PaneHelper getInstance() {
+        return theInstance;
+    }
+
+    public static void initHelper(Pane pane) {
+        setHelper(pane, getInstance());
+    }
+
+
+    public static void setPaneAccessor(final PaneAccessor newAccessor) {
+        if (paneAccessor != null) {
+            throw new IllegalStateException();
+        }
+
+        paneAccessor = newAccessor;
+    }
+
+    public interface PaneAccessor {
+    }
+
+}
--- a/modules/graphics/src/main/java/com/sun/javafx/scene/layout/RegionHelper.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/graphics/src/main/java/com/sun/javafx/scene/layout/RegionHelper.java	Fri Jun 10 09:43:53 2016 -0400
@@ -25,9 +25,14 @@
 
 package com.sun.javafx.scene.layout;
 
+import com.sun.javafx.geom.BaseBounds;
+import com.sun.javafx.geom.PickRay;
+import com.sun.javafx.geom.transform.BaseTransform;
 import com.sun.javafx.scene.ParentHelper;
+import com.sun.javafx.scene.input.PickResultChooser;
 import com.sun.javafx.sg.prism.NGNode;
 import com.sun.javafx.util.Utils;
+import javafx.geometry.Bounds;
 import javafx.scene.Node;
 import javafx.scene.layout.Region;
 
@@ -52,6 +57,11 @@
         setHelper(region, getInstance());
     }
 
+    public static BaseBounds superComputeGeomBounds(Node node, BaseBounds bounds,
+            BaseTransform tx) {
+        return ((RegionHelper) getHelper(node)).superComputeGeomBoundsImpl(node, bounds, tx);
+    }
+
     @Override
     protected NGNode createPeerImpl(Node node) {
         return regionAccessor.doCreatePeer(node);
@@ -63,6 +73,37 @@
         regionAccessor.doUpdatePeer(node);
     }
 
+   BaseBounds superComputeGeomBoundsImpl(Node node, BaseBounds bounds,
+            BaseTransform tx) {
+        return super.computeGeomBoundsImpl(node, bounds, tx);
+   }
+
+   @Override
+    protected Bounds computeLayoutBoundsImpl(Node node) {
+        return regionAccessor.doComputeLayoutBounds(node);
+    }
+
+    @Override
+    protected BaseBounds computeGeomBoundsImpl(Node node, BaseBounds bounds,
+            BaseTransform tx) {
+        return regionAccessor.doComputeGeomBounds(node, bounds, tx);
+    }
+
+    @Override
+    protected boolean computeContainsImpl(Node node, double localX, double localY) {
+        return regionAccessor.doComputeContains(node, localX, localY);
+    }
+
+    @Override
+    protected void notifyLayoutBoundsChangedImpl(Node node) {
+        regionAccessor.doNotifyLayoutBoundsChanged(node);
+    }
+    @Override
+    protected void pickNodeLocalImpl(Node node, PickRay localPickRay,
+            PickResultChooser result) {
+        regionAccessor.doPickNodeLocal(node, localPickRay, result);
+    }
+
     public static void setRegionAccessor(final RegionAccessor newAccessor) {
         if (regionAccessor != null) {
             throw new IllegalStateException();
@@ -74,6 +115,12 @@
     public interface RegionAccessor {
         void doUpdatePeer(Node node);
         NGNode doCreatePeer(Node node);
+        Bounds doComputeLayoutBounds(Node node);
+        BaseBounds doComputeGeomBounds(Node node, BaseBounds bounds, BaseTransform tx);
+        boolean doComputeContains(Node node, double localX, double localY);
+        void doNotifyLayoutBoundsChanged(Node node);
+        void doPickNodeLocal(Node node, PickRay localPickRay,
+                PickResultChooser result);
     }
 
 }
--- a/modules/graphics/src/main/java/com/sun/javafx/scene/shape/BoxHelper.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/graphics/src/main/java/com/sun/javafx/scene/shape/BoxHelper.java	Fri Jun 10 09:43:53 2016 -0400
@@ -25,6 +25,10 @@
 
 package com.sun.javafx.scene.shape;
 
+import com.sun.javafx.geom.BaseBounds;
+import com.sun.javafx.geom.PickRay;
+import com.sun.javafx.geom.transform.BaseTransform;
+import com.sun.javafx.scene.input.PickResultChooser;
 import com.sun.javafx.sg.prism.NGNode;
 import com.sun.javafx.util.Utils;
 import javafx.scene.Node;
@@ -62,6 +66,22 @@
         boxAccessor.doUpdatePeer(node);
     }
 
+    @Override
+    protected BaseBounds computeGeomBoundsImpl(Node node, BaseBounds bounds,
+            BaseTransform tx) {
+        return boxAccessor.doComputeGeomBounds(node, bounds, tx);
+    }
+
+    @Override
+    protected boolean computeContainsImpl(Node node, double localX, double localY) {
+        return boxAccessor.doComputeContains(node, localX, localY);
+    }
+
+    protected boolean computeIntersectsImpl(Node node, PickRay pickRay,
+            PickResultChooser pickResult) {
+        return boxAccessor.doComputeIntersects(node, pickRay, pickResult);
+    }
+
     public static void setBoxAccessor(final BoxAccessor newAccessor) {
         if (boxAccessor != null) {
             throw new IllegalStateException();
@@ -73,6 +93,10 @@
     public interface BoxAccessor {
         NGNode doCreatePeer(Node node);
         void doUpdatePeer(Node node);
+        BaseBounds doComputeGeomBounds(Node node, BaseBounds bounds, BaseTransform tx);
+        boolean doComputeContains(Node node, double localX, double localY);
+        boolean doComputeIntersects(Node node, PickRay pickRay,
+                PickResultChooser pickResult);
     }
 
 }
--- a/modules/graphics/src/main/java/com/sun/javafx/scene/shape/CircleHelper.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/graphics/src/main/java/com/sun/javafx/scene/shape/CircleHelper.java	Fri Jun 10 09:43:53 2016 -0400
@@ -25,6 +25,8 @@
 
 package com.sun.javafx.scene.shape;
 
+import com.sun.javafx.geom.BaseBounds;
+import com.sun.javafx.geom.transform.BaseTransform;
 import com.sun.javafx.sg.prism.NGNode;
 import com.sun.javafx.util.Utils;
 import javafx.scene.Node;
@@ -64,6 +66,12 @@
     }
 
     @Override
+    protected BaseBounds computeGeomBoundsImpl(Node node, BaseBounds bounds,
+            BaseTransform tx) {
+        return circleAccessor.doComputeGeomBounds(node, bounds, tx);
+    }
+
+    @Override
     protected  com.sun.javafx.geom.Shape configShapeImpl(Shape shape) {
         return circleAccessor.doConfigShape(shape);
     }
@@ -79,6 +87,7 @@
     public interface CircleAccessor {
         NGNode doCreatePeer(Node node);
         void doUpdatePeer(Node node);
+        BaseBounds doComputeGeomBounds(Node node, BaseBounds bounds, BaseTransform tx);
         com.sun.javafx.geom.Shape doConfigShape(Shape shape);
     }
 
--- a/modules/graphics/src/main/java/com/sun/javafx/scene/shape/CylinderHelper.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/graphics/src/main/java/com/sun/javafx/scene/shape/CylinderHelper.java	Fri Jun 10 09:43:53 2016 -0400
@@ -25,6 +25,10 @@
 
 package com.sun.javafx.scene.shape;
 
+import com.sun.javafx.geom.BaseBounds;
+import com.sun.javafx.geom.PickRay;
+import com.sun.javafx.geom.transform.BaseTransform;
+import com.sun.javafx.scene.input.PickResultChooser;
 import com.sun.javafx.sg.prism.NGNode;
 import com.sun.javafx.util.Utils;
 import javafx.scene.Node;
@@ -62,6 +66,22 @@
         cylinderAccessor.doUpdatePeer(node);
     }
 
+    @Override
+    protected BaseBounds computeGeomBoundsImpl(Node node, BaseBounds bounds,
+            BaseTransform tx) {
+        return cylinderAccessor.doComputeGeomBounds(node, bounds, tx);
+    }
+
+    @Override
+    protected boolean computeContainsImpl(Node node, double localX, double localY) {
+        return cylinderAccessor.doComputeContains(node, localX, localY);
+    }
+
+    protected boolean computeIntersectsImpl(Node node, PickRay pickRay,
+            PickResultChooser pickResult) {
+        return cylinderAccessor.doComputeIntersects(node, pickRay, pickResult);
+    }
+
     public static void setCylinderAccessor(final CylinderAccessor newAccessor) {
         if (cylinderAccessor != null) {
             throw new IllegalStateException();
@@ -73,6 +93,10 @@
     public interface CylinderAccessor {
         NGNode doCreatePeer(Node node);
         void doUpdatePeer(Node node);
+        BaseBounds doComputeGeomBounds(Node node, BaseBounds bounds, BaseTransform tx);
+        boolean doComputeContains(Node node, double localX, double localY);
+        boolean doComputeIntersects(Node node, PickRay pickRay,
+                PickResultChooser pickResult);
     }
 
 }
--- a/modules/graphics/src/main/java/com/sun/javafx/scene/shape/EllipseHelper.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/graphics/src/main/java/com/sun/javafx/scene/shape/EllipseHelper.java	Fri Jun 10 09:43:53 2016 -0400
@@ -25,6 +25,8 @@
 
 package com.sun.javafx.scene.shape;
 
+import com.sun.javafx.geom.BaseBounds;
+import com.sun.javafx.geom.transform.BaseTransform;
 import com.sun.javafx.sg.prism.NGNode;
 import com.sun.javafx.util.Utils;
 import javafx.scene.Node;
@@ -64,6 +66,12 @@
     }
 
     @Override
+    protected BaseBounds computeGeomBoundsImpl(Node node, BaseBounds bounds,
+            BaseTransform tx) {
+        return ellipseAccessor.doComputeGeomBounds(node, bounds, tx);
+    }
+
+    @Override
     protected  com.sun.javafx.geom.Shape configShapeImpl(Shape shape) {
         return ellipseAccessor.doConfigShape(shape);
     }
@@ -79,6 +87,7 @@
     public interface EllipseAccessor {
         NGNode doCreatePeer(Node node);
         void doUpdatePeer(Node node);
+        BaseBounds doComputeGeomBounds(Node node, BaseBounds bounds, BaseTransform tx);
         com.sun.javafx.geom.Shape doConfigShape(Shape shape);
     }
 
--- a/modules/graphics/src/main/java/com/sun/javafx/scene/shape/LineHelper.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/graphics/src/main/java/com/sun/javafx/scene/shape/LineHelper.java	Fri Jun 10 09:43:53 2016 -0400
@@ -25,6 +25,8 @@
 
 package com.sun.javafx.scene.shape;
 
+import com.sun.javafx.geom.BaseBounds;
+import com.sun.javafx.geom.transform.BaseTransform;
 import com.sun.javafx.sg.prism.NGNode;
 import com.sun.javafx.util.Utils;
 import javafx.scene.Node;
@@ -63,6 +65,13 @@
         super.updatePeerImpl(node);
         lineAccessor.doUpdatePeer(node);
     }
+
+    @Override
+    protected BaseBounds computeGeomBoundsImpl(Node node, BaseBounds bounds,
+            BaseTransform tx) {
+        return lineAccessor.doComputeGeomBounds(node, bounds, tx);
+    }
+
     @Override
     protected Paint cssGetFillInitialValueImpl(Shape shape) {
         return lineAccessor.doCssGetFillInitialValue(shape);
@@ -89,6 +98,7 @@
     public interface LineAccessor {
         NGNode doCreatePeer(Node node);
         void doUpdatePeer(Node node);
+        BaseBounds doComputeGeomBounds(Node node, BaseBounds bounds, BaseTransform tx);
         Paint doCssGetFillInitialValue(Shape shape);
         Paint doCssGetStrokeInitialValue(Shape shape);
         com.sun.javafx.geom.Shape doConfigShape(Shape shape);
--- a/modules/graphics/src/main/java/com/sun/javafx/scene/shape/MeshViewHelper.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/graphics/src/main/java/com/sun/javafx/scene/shape/MeshViewHelper.java	Fri Jun 10 09:43:53 2016 -0400
@@ -25,6 +25,10 @@
 
 package com.sun.javafx.scene.shape;
 
+import com.sun.javafx.geom.BaseBounds;
+import com.sun.javafx.geom.PickRay;
+import com.sun.javafx.geom.transform.BaseTransform;
+import com.sun.javafx.scene.input.PickResultChooser;
 import com.sun.javafx.sg.prism.NGNode;
 import com.sun.javafx.util.Utils;
 import javafx.scene.Node;
@@ -62,6 +66,22 @@
         meshViewAccessor.doUpdatePeer(node);
     }
 
+    @Override
+    protected BaseBounds computeGeomBoundsImpl(Node node, BaseBounds bounds,
+            BaseTransform tx) {
+        return meshViewAccessor.doComputeGeomBounds(node, bounds, tx);
+    }
+
+    @Override
+    protected boolean computeContainsImpl(Node node, double localX, double localY) {
+        return meshViewAccessor.doComputeContains(node, localX, localY);
+    }
+
+    protected boolean computeIntersectsImpl(Node node, PickRay pickRay,
+            PickResultChooser pickResult) {
+        return meshViewAccessor.doComputeIntersects(node, pickRay, pickResult);
+    }
+
     public static void setMeshViewAccessor(final MeshViewAccessor newAccessor) {
         if (meshViewAccessor != null) {
             throw new IllegalStateException();
@@ -73,6 +93,10 @@
     public interface MeshViewAccessor {
         NGNode doCreatePeer(Node node);
         void doUpdatePeer(Node node);
+        BaseBounds doComputeGeomBounds(Node node, BaseBounds bounds, BaseTransform tx);
+        boolean doComputeContains(Node node, double localX, double localY);
+        boolean doComputeIntersects(Node node, PickRay pickRay,
+                PickResultChooser pickResult);
     }
 
 }
--- a/modules/graphics/src/main/java/com/sun/javafx/scene/shape/PathHelper.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/graphics/src/main/java/com/sun/javafx/scene/shape/PathHelper.java	Fri Jun 10 09:43:53 2016 -0400
@@ -27,6 +27,7 @@
 
 import com.sun.javafx.sg.prism.NGNode;
 import com.sun.javafx.util.Utils;
+import javafx.geometry.Bounds;
 import javafx.scene.Node;
 import javafx.scene.paint.Paint;
 import javafx.scene.shape.Path;
@@ -65,6 +66,15 @@
     }
 
     @Override
+    protected Bounds computeLayoutBoundsImpl(Node node) {
+        Bounds bounds = pathAccessor.doComputeLayoutBounds(node);
+        if (bounds != null) {
+            return bounds;
+        }
+        return super.computeLayoutBoundsImpl(node);
+    }
+
+    @Override
     protected Paint cssGetFillInitialValueImpl(Shape shape) {
         return pathAccessor.doCssGetFillInitialValue(shape);
     }
@@ -90,6 +100,7 @@
     public interface PathAccessor {
         NGNode doCreatePeer(Node node);
         void doUpdatePeer(Node node);
+        Bounds doComputeLayoutBounds(Node node);
         Paint doCssGetFillInitialValue(Shape shape);
         Paint doCssGetStrokeInitialValue(Shape shape);
         com.sun.javafx.geom.Shape doConfigShape(Shape shape);
--- a/modules/graphics/src/main/java/com/sun/javafx/scene/shape/PolygonHelper.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/graphics/src/main/java/com/sun/javafx/scene/shape/PolygonHelper.java	Fri Jun 10 09:43:53 2016 -0400
@@ -25,6 +25,8 @@
 
 package com.sun.javafx.scene.shape;
 
+import com.sun.javafx.geom.BaseBounds;
+import com.sun.javafx.geom.transform.BaseTransform;
 import com.sun.javafx.sg.prism.NGNode;
 import com.sun.javafx.util.Utils;
 import javafx.scene.Node;
@@ -64,6 +66,12 @@
     }
 
     @Override
+    protected BaseBounds computeGeomBoundsImpl(Node node, BaseBounds bounds,
+            BaseTransform tx) {
+        return polygonAccessor.doComputeGeomBounds(node, bounds, tx);
+    }
+
+    @Override
     protected  com.sun.javafx.geom.Shape configShapeImpl(Shape shape) {
         return polygonAccessor.doConfigShape(shape);
     }
@@ -79,6 +87,7 @@
     public interface PolygonAccessor {
         NGNode doCreatePeer(Node node);
         void doUpdatePeer(Node node);
+        BaseBounds doComputeGeomBounds(Node node, BaseBounds bounds, BaseTransform tx);
         com.sun.javafx.geom.Shape doConfigShape(Shape shape);
     }
 
--- a/modules/graphics/src/main/java/com/sun/javafx/scene/shape/PolylineHelper.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/graphics/src/main/java/com/sun/javafx/scene/shape/PolylineHelper.java	Fri Jun 10 09:43:53 2016 -0400
@@ -25,6 +25,8 @@
 
 package com.sun.javafx.scene.shape;
 
+import com.sun.javafx.geom.BaseBounds;
+import com.sun.javafx.geom.transform.BaseTransform;
 import com.sun.javafx.sg.prism.NGNode;
 import com.sun.javafx.util.Utils;
 import javafx.scene.Node;
@@ -65,6 +67,12 @@
     }
 
     @Override
+    protected BaseBounds computeGeomBoundsImpl(Node node, BaseBounds bounds,
+            BaseTransform tx) {
+        return polylineAccessor.doComputeGeomBounds(node, bounds, tx);
+    }
+
+    @Override
     protected Paint cssGetFillInitialValueImpl(Shape shape) {
         return polylineAccessor.doCssGetFillInitialValue(shape);
     }
@@ -90,6 +98,7 @@
     public interface PolylineAccessor {
         NGNode doCreatePeer(Node node);
         void doUpdatePeer(Node node);
+        BaseBounds doComputeGeomBounds(Node node, BaseBounds bounds, BaseTransform tx);
         Paint doCssGetFillInitialValue(Shape shape);
         Paint doCssGetStrokeInitialValue(Shape shape);
         com.sun.javafx.geom.Shape doConfigShape(Shape shape);
--- a/modules/graphics/src/main/java/com/sun/javafx/scene/shape/RectangleHelper.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/graphics/src/main/java/com/sun/javafx/scene/shape/RectangleHelper.java	Fri Jun 10 09:43:53 2016 -0400
@@ -25,6 +25,8 @@
 
 package com.sun.javafx.scene.shape;
 
+import com.sun.javafx.geom.BaseBounds;
+import com.sun.javafx.geom.transform.BaseTransform;
 import com.sun.javafx.sg.prism.NGNode;
 import com.sun.javafx.util.Utils;
 import javafx.scene.Node;
@@ -64,6 +66,12 @@
     }
 
     @Override
+    protected BaseBounds computeGeomBoundsImpl(Node node, BaseBounds bounds,
+            BaseTransform tx) {
+        return rectangleAccessor.doComputeGeomBounds(node, bounds, tx);
+    }
+
+    @Override
     protected  com.sun.javafx.geom.Shape configShapeImpl(Shape shape) {
         return rectangleAccessor.doConfigShape(shape);
     }
@@ -79,6 +87,7 @@
     public interface RectangleAccessor {
         NGNode doCreatePeer(Node node);
         void doUpdatePeer(Node node);
+        BaseBounds doComputeGeomBounds(Node node, BaseBounds bounds, BaseTransform tx);
         com.sun.javafx.geom.Shape doConfigShape(Shape shape);
     }
 
--- a/modules/graphics/src/main/java/com/sun/javafx/scene/shape/Shape3DHelper.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/graphics/src/main/java/com/sun/javafx/scene/shape/Shape3DHelper.java	Fri Jun 10 09:43:53 2016 -0400
@@ -25,6 +25,10 @@
 
 package com.sun.javafx.scene.shape;
 
+import com.sun.javafx.geom.BaseBounds;
+import com.sun.javafx.geom.transform.BaseTransform;
+import com.sun.javafx.jmx.MXNodeAlgorithm;
+import com.sun.javafx.jmx.MXNodeAlgorithmContext;
 import com.sun.javafx.scene.NodeHelper;
 import com.sun.javafx.util.Utils;
 import javafx.scene.Node;
@@ -47,6 +51,22 @@
         shape3DAccessor.doUpdatePeer(node);
     }
 
+    @Override
+    protected BaseBounds computeGeomBoundsImpl(Node node, BaseBounds bounds,
+            BaseTransform tx) {
+        return shape3DAccessor.doComputeGeomBounds(node, bounds, tx);
+    }
+
+    @Override
+    protected boolean computeContainsImpl(Node node, double localX, double localY) {
+        return shape3DAccessor.doComputeContains(node, localX, localY);
+    }
+
+    @Override
+    protected Object processMXNodeImpl(Node node, MXNodeAlgorithm alg, MXNodeAlgorithmContext ctx) {
+        return shape3DAccessor.doProcessMXNode(node, alg, ctx);
+    }
+
     public static void setShape3DAccessor(final Shape3DAccessor newAccessor) {
         if (shape3DAccessor != null) {
             throw new IllegalStateException();
@@ -57,6 +77,9 @@
 
     public interface Shape3DAccessor {
         void doUpdatePeer(Node node);
+        BaseBounds doComputeGeomBounds(Node node, BaseBounds bounds, BaseTransform tx);
+        boolean doComputeContains(Node node, double localX, double localY);
+        Object doProcessMXNode(Node node, MXNodeAlgorithm alg, MXNodeAlgorithmContext ctx);
     }
 
 }
--- a/modules/graphics/src/main/java/com/sun/javafx/scene/shape/ShapeHelper.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/graphics/src/main/java/com/sun/javafx/scene/shape/ShapeHelper.java	Fri Jun 10 09:43:53 2016 -0400
@@ -25,6 +25,10 @@
 
 package com.sun.javafx.scene.shape;
 
+import com.sun.javafx.geom.BaseBounds;
+import com.sun.javafx.geom.transform.BaseTransform;
+import com.sun.javafx.jmx.MXNodeAlgorithm;
+import com.sun.javafx.jmx.MXNodeAlgorithmContext;
 import com.sun.javafx.scene.DirtyBits;
 import com.sun.javafx.scene.NodeHelper;
 import com.sun.javafx.sg.prism.NGNode;
@@ -78,6 +82,22 @@
         super.markDirtyImpl(node, dirtyBit);
     }
 
+    @Override
+    protected BaseBounds computeGeomBoundsImpl(Node node, BaseBounds bounds,
+            BaseTransform tx) {
+        return shapeAccessor.doComputeGeomBounds(node, bounds, tx);
+    }
+
+    @Override
+    protected boolean computeContainsImpl(Node node, double localX, double localY) {
+        return shapeAccessor.doComputeContains(node, localX, localY);
+    }
+
+    @Override
+    protected Object processMXNodeImpl(Node node, MXNodeAlgorithm alg, MXNodeAlgorithmContext ctx) {
+        return shapeAccessor.doProcessMXNode(node, alg, ctx);
+    }
+
     protected Paint cssGetFillInitialValueImpl(Shape shape) {
         return shapeAccessor.doCssGetFillInitialValue(shape);
     }
@@ -115,6 +135,9 @@
     public interface ShapeAccessor {
         void doUpdatePeer(Node node);
         void doMarkDirty(Node node, DirtyBits dirtyBit);
+        BaseBounds doComputeGeomBounds(Node node, BaseBounds bounds, BaseTransform tx);
+        boolean doComputeContains(Node node, double localX, double localY);
+        Object doProcessMXNode(Node node, MXNodeAlgorithm alg, MXNodeAlgorithmContext ctx);
         Paint doCssGetFillInitialValue(Shape shape);
         Paint doCssGetStrokeInitialValue(Shape shape);
         NGShape.Mode getMode(Shape shape);
--- a/modules/graphics/src/main/java/com/sun/javafx/scene/shape/SphereHelper.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/graphics/src/main/java/com/sun/javafx/scene/shape/SphereHelper.java	Fri Jun 10 09:43:53 2016 -0400
@@ -25,6 +25,10 @@
 
 package com.sun.javafx.scene.shape;
 
+import com.sun.javafx.geom.BaseBounds;
+import com.sun.javafx.geom.PickRay;
+import com.sun.javafx.geom.transform.BaseTransform;
+import com.sun.javafx.scene.input.PickResultChooser;
 import com.sun.javafx.sg.prism.NGNode;
 import com.sun.javafx.util.Utils;
 import javafx.scene.Node;
@@ -62,6 +66,22 @@
         sphereAccessor.doUpdatePeer(node);
     }
 
+    @Override
+    protected BaseBounds computeGeomBoundsImpl(Node node, BaseBounds bounds,
+            BaseTransform tx) {
+        return sphereAccessor.doComputeGeomBounds(node, bounds, tx);
+    }
+
+    @Override
+    protected boolean computeContainsImpl(Node node, double localX, double localY) {
+        return sphereAccessor.doComputeContains(node, localX, localY);
+    }
+
+    protected boolean computeIntersectsImpl(Node node, PickRay pickRay,
+          PickResultChooser pickResult) {
+        return sphereAccessor.doComputeIntersects(node, pickRay, pickResult);
+    }
+
     public static void setSphereAccessor(final SphereAccessor newAccessor) {
         if (sphereAccessor != null) {
             throw new IllegalStateException();
@@ -73,6 +93,10 @@
     public interface SphereAccessor {
         NGNode doCreatePeer(Node node);
         void doUpdatePeer(Node node);
+        BaseBounds doComputeGeomBounds(Node node, BaseBounds bounds, BaseTransform tx);
+        boolean doComputeContains(Node node, double localX, double localY);
+        boolean doComputeIntersects(Node node, PickRay pickRay,
+                PickResultChooser pickResult);
     }
 
 }
--- a/modules/graphics/src/main/java/com/sun/javafx/scene/shape/TextHelper.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/graphics/src/main/java/com/sun/javafx/scene/shape/TextHelper.java	Fri Jun 10 09:43:53 2016 -0400
@@ -25,8 +25,11 @@
 
 package com.sun.javafx.scene.shape;
 
+import com.sun.javafx.geom.BaseBounds;
+import com.sun.javafx.geom.transform.BaseTransform;
 import com.sun.javafx.sg.prism.NGNode;
 import com.sun.javafx.util.Utils;
+import javafx.geometry.Bounds;
 import javafx.scene.Node;
 import javafx.scene.shape.Shape;
 import javafx.scene.text.Text;
@@ -52,6 +55,15 @@
         setHelper(text, getInstance());
     }
 
+    public static BaseBounds superComputeGeomBounds(Node node, BaseBounds bounds,
+            BaseTransform tx) {
+        return ((TextHelper) getHelper(node)).superComputeGeomBoundsImpl(node, bounds, tx);
+    }
+
+    public static Bounds superComputeLayoutBounds(Node node) {
+        return ((TextHelper) getHelper(node)).superComputeLayoutBoundsImpl(node);
+    }
+
     @Override
     protected NGNode createPeerImpl(Node node) {
         return textAccessor.doCreatePeer(node);
@@ -63,6 +75,37 @@
         textAccessor.doUpdatePeer(node);
     }
 
+    BaseBounds superComputeGeomBoundsImpl(Node node, BaseBounds bounds,
+            BaseTransform tx) {
+        return super.computeGeomBoundsImpl(node, bounds, tx);
+    }
+
+    Bounds superComputeLayoutBoundsImpl(Node node) {
+        return super.computeLayoutBoundsImpl(node);
+    }
+
+    @Override
+    protected BaseBounds computeGeomBoundsImpl(Node node, BaseBounds bounds,
+            BaseTransform tx) {
+        return textAccessor.doComputeGeomBounds(node, bounds, tx);
+    }
+
+    @Override
+    protected Bounds computeLayoutBoundsImpl(Node node) {
+        return textAccessor.doComputeLayoutBounds(node);
+    }
+
+    @Override
+    protected boolean computeContainsImpl(Node node, double localX, double localY) {
+        return textAccessor.doComputeContains(node, localX, localY);
+    }
+
+    @Override
+    protected void geomChangedImpl(Node node) {
+        super.geomChangedImpl(node);
+        textAccessor.doGeomChanged(node);
+    }
+
     @Override
     protected  com.sun.javafx.geom.Shape configShapeImpl(Shape shape) {
         return textAccessor.doConfigShape(shape);
@@ -79,6 +122,10 @@
     public interface TextAccessor {
         NGNode doCreatePeer(Node node);
         void doUpdatePeer(Node node);
+        BaseBounds doComputeGeomBounds(Node node, BaseBounds bounds, BaseTransform tx);
+        Bounds doComputeLayoutBounds(Node node);
+        boolean doComputeContains(Node node, double localX, double localY);
+        void doGeomChanged(Node node);
         com.sun.javafx.geom.Shape doConfigShape(Shape shape);
     }
 
--- a/modules/graphics/src/main/java/com/sun/javafx/scene/traversal/TabOrderHelper.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/graphics/src/main/java/com/sun/javafx/scene/traversal/TabOrderHelper.java	Fri Jun 10 09:43:53 2016 -0400
@@ -25,6 +25,7 @@
 
 package com.sun.javafx.scene.traversal;
 
+import com.sun.javafx.scene.NodeHelper;
 import com.sun.javafx.scene.ParentHelper;
 import javafx.collections.ObservableList;
 import javafx.scene.Node;
@@ -66,7 +67,7 @@
     }
 
     private static boolean isDisabledOrInvisible(Node prevNode) {
-        return prevNode.isDisabled() || !prevNode.impl_isTreeVisible();
+        return prevNode.isDisabled() || !NodeHelper.isTreeVisible(prevNode);
     }
 
     public static Node findPreviousFocusablePeer(Node node, Parent root) {
--- a/modules/graphics/src/main/java/com/sun/javafx/scene/traversal/TraversalEngine.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/graphics/src/main/java/com/sun/javafx/scene/traversal/TraversalEngine.java	Fri Jun 10 09:43:53 2016 -0400
@@ -26,6 +26,7 @@
 package com.sun.javafx.scene.traversal;
 
 import com.sun.javafx.application.PlatformImpl;
+import com.sun.javafx.scene.NodeHelper;
 import javafx.geometry.BoundingBox;
 import javafx.geometry.Bounds;
 import javafx.scene.Node;
@@ -204,7 +205,7 @@
         private void addFocusableChildrenToList(List<Node> list, Parent parent) {
             List<Node> parentsNodes = parent.getChildrenUnmodifiable();
             for (Node n : parentsNodes) {
-                if (n.isFocusTraversable() && !n.isFocused() && n.impl_isTreeVisible() && !n.isDisabled()) {
+                if (n.isFocusTraversable() && !n.isFocused() && NodeHelper.isTreeVisible(n) && !n.isDisabled()) {
                     list.add(n);
                 }
                 if (n instanceof Parent) {
--- a/modules/graphics/src/main/java/javafx/animation/PathTransition.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/graphics/src/main/java/javafx/animation/PathTransition.java	Fri Jun 10 09:43:53 2016 -0400
@@ -35,6 +35,7 @@
 import com.sun.javafx.geom.Path2D;
 import com.sun.javafx.geom.PathIterator;
 import com.sun.javafx.geom.transform.BaseTransform;
+import com.sun.javafx.scene.NodeHelper;
 import com.sun.javafx.scene.shape.ShapeHelper;
 import java.util.ArrayList;
 
@@ -341,8 +342,8 @@
                 }
             }
         }
-        cachedNode.setTranslateX(x - cachedNode.impl_getPivotX());
-        cachedNode.setTranslateY(y - cachedNode.impl_getPivotY());
+        cachedNode.setTranslateX(x - NodeHelper.getPivotX(cachedNode));
+        cachedNode.setTranslateY(y - NodeHelper.getPivotY(cachedNode));
         // Need to handle orientation if it is requested
         if (cachedIsNormalRequired) {
             cachedNode.setRotate(rotateAngle);
@@ -378,7 +379,7 @@
         Segment lastSeg = Segment.getZeroSegment();
 
         float[] coords = new float[6];
-        for (PathIterator i = ShapeHelper.configShape(p).getPathIterator(p.impl_getLeafTransform(), 1.0f); !i.isDone(); i.next()) {
+        for (PathIterator i = ShapeHelper.configShape(p).getPathIterator(NodeHelper.getLeafTransform(p), 1.0f); !i.isDone(); i.next()) {
             Segment newSeg = null;
             int segType = i.currentSegment(coords);
             double x = coords[0];
--- a/modules/graphics/src/main/java/javafx/scene/Camera.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/graphics/src/main/java/javafx/scene/Camera.java	Fri Jun 10 09:43:53 2016 -0400
@@ -120,6 +120,22 @@
             }
 
             @Override
+            public BaseBounds doComputeGeomBounds(Node node,
+                    BaseBounds bounds, BaseTransform tx) {
+                return ((Camera) node).doComputeGeomBounds(bounds, tx);
+            }
+
+            @Override
+            public boolean doComputeContains(Node node, double localX, double localY) {
+                return ((Camera) node).doComputeContains(localX, localY);
+            }
+
+            @Override
+            public Object doProcessMXNode(Node node, MXNodeAlgorithm alg, MXNodeAlgorithmContext ctx) {
+                return ((Camera) node).doProcessMXNode(alg, ctx);
+            }
+
+            @Override
             public Point2D project(Camera camera, Point3D p) {
                 return camera.project(p);
             }
@@ -496,33 +512,24 @@
      */
     abstract Vec3d computePosition(Vec3d position);
 
-    /**
-     * @treatAsPrivate implementation detail
-     * @deprecated This is an internal API that is not intended for use and will be removed in the next version
+    /*
+     * Note: This method MUST only be called via its accessor method.
      */
-    @Deprecated
-    @Override
-    public BaseBounds impl_computeGeomBounds(BaseBounds bounds, BaseTransform tx) {
+    private BaseBounds doComputeGeomBounds(BaseBounds bounds, BaseTransform tx) {
         return new BoxBounds(0, 0, 0, 0, 0, 0);
     }
 
-    /**
-     * @treatAsPrivate implementation detail
-     * @deprecated This is an internal API that is not intended for use and will be removed in the next version
+    /*
+     * Note: This method MUST only be called via its accessor method.
      */
-    @Deprecated
-    @Override
-    protected boolean impl_computeContains(double localX, double localY) {
+    private boolean doComputeContains(double localX, double localY) {
         return false;
     }
 
-    /**
-     * @treatAsPrivate implementation detail
-     * @deprecated This is an internal API that is not intended for use and will be removed in the next version
+    /*
+     * Note: This method MUST only be called via its accessor method.
      */
-    @Deprecated
-    @Override
-    public Object impl_processMXNode(MXNodeAlgorithm alg, MXNodeAlgorithmContext ctx) {
+    private Object doProcessMXNode(MXNodeAlgorithm alg, MXNodeAlgorithmContext ctx) {
         throw new UnsupportedOperationException("Not supported yet.");
     }
 
--- a/modules/graphics/src/main/java/javafx/scene/CssStyleHelper.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/graphics/src/main/java/javafx/scene/CssStyleHelper.java	Fri Jun 10 09:43:53 2016 -0400
@@ -574,7 +574,7 @@
         final StyleMap styleMap = getStyleMap(node);
         if (styleMap == null) {
             cacheContainer = null;
-            node.impl_reapplyCSS();
+            node.reapplyCSS();
             return;
         }
 
@@ -591,7 +591,7 @@
             // Shared cache was blown away by StyleManager.
             // Therefore, this CssStyleHelper is no good.
             cacheContainer = null;
-            node.impl_reapplyCSS();
+            node.reapplyCSS();
             return;
 
         }
@@ -1997,7 +1997,7 @@
 
 
     /**
-     * Called from Node impl_getMatchingStyles
+     * Called from Node NodeHelper.getMatchingStyles
      * @param styleable
      * @param styleableProperty
      * @return
--- a/modules/graphics/src/main/java/javafx/scene/Group.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/graphics/src/main/java/javafx/scene/Group.java	Fri Jun 10 09:43:53 2016 -0400
@@ -80,6 +80,10 @@
          // This is used by classes in different packages to get access to
          // private and package private methods.
         GroupHelper.setGroupAccessor(new GroupHelper.GroupAccessor() {
+            @Override
+            public Bounds doComputeLayoutBounds(Node node) {
+                return ((Group) node).doComputeLayoutBounds();
+            }
         });
     }
 
@@ -165,16 +169,12 @@
         return super.getChildren();
     }
 
-
-    /**
-     * @treatAsPrivate implementation detail
-     * @deprecated This is an internal API that is not intended for use and will be removed in the next version
+    /*
+     * Note: This method MUST only be called via its accessor method.
      */
-    @Deprecated
-    @Override
-    protected Bounds impl_computeLayoutBounds() {
+    private Bounds doComputeLayoutBounds() {
         layout(); // Needs to done prematurely, as we otherwise don't know the bounds of the children
-        return super.impl_computeLayoutBounds();
+        return null; // helper only requires this node to call layout().
     }
 
     /**
--- a/modules/graphics/src/main/java/javafx/scene/LightBase.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/graphics/src/main/java/javafx/scene/LightBase.java	Fri Jun 10 09:43:53 2016 -0400
@@ -80,6 +80,22 @@
             public void doUpdatePeer(Node node) {
                 ((LightBase) node).doUpdatePeer();
             }
+
+            @Override
+            public BaseBounds doComputeGeomBounds(Node node,
+                    BaseBounds bounds, BaseTransform tx) {
+                return ((LightBase) node).doComputeGeomBounds(bounds, tx);
+            }
+
+            @Override
+            public boolean doComputeContains(Node node, double localX, double localY) {
+                return ((LightBase) node).doComputeContains(localX, localY);
+            }
+
+            @Override
+            public Object doProcessMXNode(Node node, MXNodeAlgorithm alg, MXNodeAlgorithmContext ctx) {
+                return ((LightBase) node).doProcessMXNode(alg, ctx);
+            }
         });
     }
 
@@ -300,35 +316,26 @@
         }
     }
 
-     /**
-     * @treatAsPrivate implementation detail
-     * @deprecated This is an internal API that is not intended for use and will be removed in the next version
+    /*
+     * Note: This method MUST only be called via its accessor method.
      */
-    @Deprecated
-    @Override
-    public BaseBounds impl_computeGeomBounds(BaseBounds bounds, BaseTransform tx) {
+    private BaseBounds doComputeGeomBounds(BaseBounds bounds, BaseTransform tx) {
         // TODO: 3D - Check is this the right default
         return new BoxBounds();
     }
 
-    /**
-     * @treatAsPrivate implementation detail
-     * @deprecated This is an internal API that is not intended for use and will be removed in the next version
+    /*
+     * Note: This method MUST only be called via its accessor method.
      */
-    @Deprecated
-    @Override
-    protected boolean impl_computeContains(double localX, double localY) {
+    private boolean doComputeContains(double localX, double localY) {
         // TODO: 3D - Check is this the right default
         return false;
     }
 
-    /**
-     * @treatAsPrivate implementation detail
-     * @deprecated This is an internal API that is not intended for use and will be removed in the next version
+    /*
+     * Note: This method MUST only be called via its accessor method.
      */
-    @Deprecated
-    @Override
-    public Object impl_processMXNode(MXNodeAlgorithm alg, MXNodeAlgorithmContext ctx) {
+    private Object doProcessMXNode(MXNodeAlgorithm alg, MXNodeAlgorithmContext ctx) {
         throw new UnsupportedOperationException("Not supported yet.");
     }
 
--- a/modules/graphics/src/main/java/javafx/scene/Node.java	Thu Jun 09 04:49:32 2016 -0700
+++ b/modules/graphics/src/main/java/javafx/scene/Node.java	Fri Jun 10 09:43:53 2016 -0400
@@ -418,6 +418,48 @@
             }
 
             @Override
+            public BaseTransform getLeafTransform(Node node) {
+                return node.getLeafTransform();
+            }
+
+            @Override
+            public Bounds doComputeLayoutBounds(Node node) {
+                return node.doComputeLayoutBounds();
+            }
+
+            @Override
+            public void doTransformsChanged(Node node) {
+                node.doTransformsChanged();
+            }
+
+            @Override
+            public void doPickNodeLocal(Node node, PickRay localPickRay,
+                    PickResultChooser result) {
+                node.doPickNodeLocal(localPickRay, result);
+            }
+
+            @Override
+            public boolean doComputeIntersects(Node node, PickRay pickRay,
+                    PickResultChooser pickResult) {
+                return node.doComputeIntersects(pickRay, pickResult);
+            }
+
+            @Override
+            public void doGeomChanged(Node node) {
+                node.doGeomChanged();
+            }
+
+            @Override
+            public void doNotifyLayoutBoundsChanged(Node node) {
+                node.doNotifyLayoutBoundsChanged();
+            }
+
+            @Override
+            public void doProcessCSS(Node node) {
+                node.doProcessCSS();
+            }
+
+            @Override
             public boolean isDirty(Node node, DirtyBits dirtyBit) {
                 return node.isDirty(dirtyBit);
             }
@@ -433,11 +475,68 @@
             }
 
             @Override
+            public void layoutBoundsChanged(Node node) {
+                node.layoutBoundsChanged();
+            }
+
+            @Override
             public <P extends NGNode> P getPeer(Node node) {
                 return node.getPeer();
             }
 
             @Override
+            public void setShowMnemonics(Node node, boolean value) {
+                node.setShowMnemonics(value);
+            }
+
+            @Override
+            public boolean isShowMnemonics(Node node) {
+                return node.isShowMnemonics();
+            }
+
+            @Override
+            public BooleanProperty showMnemonicsProperty(Node node) {
+                return node.showMnemonicsProperty();
+            }
+
+            @Override
+            public boolean traverse(Node node, Direction direction) {
+                return node.traverse(direction);
+            }
+
+            @Override
+            public double getPivotX(Node node) {
+                return node.getPivotX();
+            }
+
+            @Override
+            public double getPivotY(Node node) {
+                return node.getPivotY();
+            }
+
+            @Override
+            public double getPivotZ(Node node) {
+                return node.getPivotZ();
+            }
+
+            @Override
+            public void pickNode(Node node,PickRay pickRay,
+                    PickResultChooser result) {
+                node.pickNode(pickRay, result);
+            }
+
+            @Override
+            public boolean intersects(Node node, PickRay pickRay,
+                    PickResultChooser pickResult) {
+                return node.intersects(pickRay, pickResult);
+            }
+
+            @Override
+            public double intersectsBounds(Node node, PickRay pickRay) {
+                return node.intersectsBounds(pickRay);
+            }
+
+            @Override
             public void layoutNodeForPrinting(Node node) {
                 node.doCSSLayoutSyncForSnapshot();
             }
@@ -461,6 +560,33 @@
             public Accessible getAccessible(Node node) {
                 return node.getAccessible();
             }
+
+            @Override
+            public void reapplyCSS(Node node) {
+                node.reapplyCSS();
+            }
+
+            @Override
+            public boolean isTreeVisible(Node node) {
+                return node.isTreeVisible();
+            }
+
+            @Override
+            public BooleanExpression treeVisibleProperty(Node node) {
+                return node.treeVisibleProperty();
+            }
+
+            @Override
+            public List<Style> getMatchingStyles(CssMetaData cssMetaData,
+                    Styleable styleable) {
+                return Node.getMatchingStyles(cssMetaData, styleable);
+            }
+
+            @Override
+            public Map<StyleableProperty<?>, List<Style>> findStyles(Node node,
+                    Map<StyleableProperty<?>, List<Style>> styleMap) {
+                return node.findStyles(styleMap);
+            }
         });
     }
 
@@ -798,7 +924,7 @@
                 protected void invalidated() {
                     if (oldParent != null) {
                         oldParent.disabledProperty().removeListener(parentDisabledChangedListener);
-                        oldParent.impl_treeVisibleProperty().removeListener(parentTreeVisibleChangedListener);
+                        oldParent.treeVisibleProperty().removeListener(parentTreeVisibleChangedListener);
                         if (nodeTransformation != null && nodeTransformation.listenerReasons > 0) {
                             ((Node) oldParent).localToSceneTransformProperty().removeListener(
                                     nodeTransformation.getLocalToSceneInvalidationListener());
@@ -809,7 +935,7 @@
                     final Parent newParent = get();
                     if (newParent != null) {
                         newParent.disabledProperty().addListener(parentDisabledChangedListener);
-                        newParent.impl_treeVisibleProperty().addListener(parentTreeVisibleChangedListener);
+                        newParent.treeVisibleProperty().addListener(parentTreeVisibleChangedListener);
                         if (nodeTransformation != null && nodeTransformation.listenerReasons > 0) {
                             ((Node) newParent).localToSceneTransformProperty().addListener(
                                     nodeTransformation.getLocalToSceneInvalidationListener());
@@ -820,10 +946,10 @@
                         // to be done from Parent.children's onChanged method.
                         // See the comments there, also.
                         //
-                        impl_reapplyCSS();
+                        reapplyCSS();
                     } else {
                         // RT-31168: reset CssFlag to clean so css will be reapplied if the node is added back later.
-                        // If flag is REAPPLY, then impl_reapplyCSS() will just return and the call to
+                        // If flag is REAPPLY, then reapplyCSS() will just return and the call to
                         // notifyParentsOfInvalidatedCSS() will be skipped thus leaving the node un-styled.
                         cssFlag = CssFlags.CLEAN;
                     }
@@ -914,7 +1040,7 @@
             focusSetDirty(newScene);
         }
         scenesChanged(newScene, newSubScene, oldScene, oldSubScene);
-        if (sceneChanged && reapplyCSS) impl_reapplyCSS();
+        if (sceneChanged && reapplyCSS) reapplyCSS();
 
         if (sceneChanged && !isDirtyEmpty()) {
             //Note: no need to remove from scene's dirty list
@@ -1050,7 +1176,7 @@
 
                 @Override
                 protected void invalidated() {
-                    impl_reapplyCSS();
+                    reapplyCSS();
                     if (PrismSettings.printRenderGraph) {
                         NodeHelper.markDirty(Node.this, DirtyBits.DEBUG);
                     }
@@ -1083,7 +1209,7 @@
     private ObservableList<String> styleClass = new TrackableObservableList<String>() {
         @Override
         protected void onChanged(Change<String> c) {
-            impl_reapplyCSS();
+            reapplyCSS();
         }
 
         @Override
@@ -1168,7 +1294,7 @@
                 protected void invalidated() {
                     // If the style has changed, then styles of this node
                     // and child nodes might be affected.
-                    impl_reapplyCSS();
+                    reapplyCSS();
                 }
 
                 @Override
@@ -1213,7 +1339,7 @@
                 protected void invalidated() {
                     if (oldValue != get()) {
                         NodeHelper.markDirty(Node.this, DirtyBits.NODE_VISIBLE);
-                        impl_geomChanged();
+                        NodeHelper.geomChanged(Node.this);
                         updateTreeVisible(false);
                         if (getParent() != null) {
                             // notify the parent of the potential change in visibility
@@ -1859,7 +1985,7 @@
         if (this.cssFlag != CssFlags.CLEAN) {
             // The dirty bit isn't checked but we must ensure it is cleared.
             // The cssFlag is set to clean in either Node.processCSS or
-            // Node.impl_processCSS(boolean)
+            // NodeHelper.processCSS
 
             // Don't clear the dirty bit in case it will cause problems
             // with a full CSS pass on the scene.
@@ -2547,7 +2673,7 @@
 
                 @Override
                 protected void invalidated() {
-                    impl_transformsChanged();
+                    NodeHelper.transformsChanged(Node.this);
                     final Parent p = getParent();
 
                     // Propagate layout if this change isn't triggered by its parent
@@ -2621,7 +2747,7 @@
 
                 @Override
                 protected void invalidated() {
-                    impl_transformsChanged();
+                    NodeHelper.transformsChanged(Node.this);
                     final Parent p = getParent();
 
                     // Propagate layout if this change isn't triggered by its parent
@@ -3298,7 +3424,7 @@
     private LazyBoundsProperty layoutBounds = new LazyBoundsProperty() {
         @Override
         protected Bounds computeBounds() {
-            return impl_computeLayoutBounds();
+            return NodeHelper.computeLayoutBounds(Node.this);
         }
 
         @Override
@@ -3377,7 +3503,7 @@
      *  functions essentially populate the supplied bounds2D with the
      *  appropriate bounds information, leveraging cached bounds if possible.
      *
-     *  There is a single impl_computeGeomBounds function which is abstract.
+     *  There is a single NodeHelper.computeGeomBoundsImpl function which is abstract.
      *  This must be implemented in each subclass, and is responsible for
      *  computing the actual geometric bounds for the Node. For example, Parent
      *  is written such that this function is the union of the transformed
@@ -3441,13 +3567,10 @@
      */
     boolean boundsChanged;
 
-    /**
+    /*
      * Returns geometric bounds, but may be over-ridden by a subclass.
-     * @treatAsPrivate implementation detail
-     * @deprecated This is an internal API that is not intended for use and will be removed in the next version
-     */
-    @Deprecated
-    protected Bounds impl_computeLayoutBounds() {
+     */
+    private Bounds doComputeLayoutBounds() {
         BaseBounds tempBounds = TempState.getInstance().bounds;
         tempBounds = getGeomBounds(tempBounds,
                                    BaseTransform.IDENTITY_TRANSFORM);
@@ -3459,20 +3582,16 @@
                                tempBounds.getDepth());
     }
 
-    /**
+    /*
      * Subclasses may customize the layoutBounds by means of overriding the
-     * impl_computeLayoutBounds method. If the layout bounds need to be
+     * NodeHelper.computeLayoutBoundsImpl method. If the layout bounds need to be
      * recomputed, the subclass must notify the Node implementation of this
      * fact so that appropriate notifications and internal state can be
-     * kept in sync. Subclasses must call impl_layoutBoundsChanged to
+     * kept in sync. Subclasses must call NodeHelper.layoutBoundsChanged to
      * let Node know that the layout bounds are invalid and need to be
      * recomputed.
-     *
-     * @treatAsPrivate implementation detail
-     * @deprecated This is an internal API that is not intended for use and will be removed in the next version
-     */
-    @Deprecated
-    protected final void impl_layoutBoundsChanged() {
+     */
+    final void layoutBoundsChanged() {
         if (!layoutBounds.valid) {
             return;
         }
@@ -3481,7 +3600,7 @@
             // if either the scale or rotate convenience variables are used,
             // then we need a valid pivot point. Since the layoutBounds
             // affects the pivot we need to invalidate the transform
-            impl_transformsChanged();
+            NodeHelper.transformsChanged(this);
         }
     }
 
@@ -3624,7 +3743,7 @@
                 & ~(BaseTransform.TYPE_UNIFORM_SCALE | BaseTransform.TYPE_TRANSLATION
                 | BaseTransform.TYPE_FLIP | BaseTransform.TYPE_QUADRANT_ROTATION)) != 0) {
             // this is a non-uniform scale / non-quadrant rotate / skew transform
-            return impl_computeGeomBounds(bounds, tx);
+            return NodeHelper.computeGeomBounds(this, bounds, tx);
         } else {
             // 3D transformations and
             // selected 2D transformations (unifrom transform, flip, quadrant rotation).
@@ -3638,21 +3757,12 @@
     }
 
     /**
-     * Computes the geometric bounds for this Node. This method is abstract
-     * and must be implemented by each Node subclass.
-     * @treatAsPrivate implementation detail
-     * @deprecated This is an internal API that is not intended for use and will be removed in the next version
-     */
-    @Deprecated
-    public abstract BaseBounds impl_computeGeomBounds(BaseBounds bounds, BaseTransform tx);
-
-    /**
      * If necessary, recomputes the cached geom bounds. If the bounds are not
      * invalid, then this method is a no-op.
      */
     void updateGeomBounds() {
         if (geomBoundsInvalid) {
-            geomBounds = impl_computeGeomBounds(geomBounds, BaseTransform.IDENTITY_TRANSFORM);
+            geomBounds = NodeHelper.computeGeomBounds(this, geomBounds, BaseTransform.IDENTITY_TRANSFORM);
             geomBoundsInvalid = false;
         }
     }
@@ -3721,13 +3831,6 @@
         }
     }
 
-    /**
-     * @treatAsPrivate implementation detail
-     * @deprecated This is an internal API that is not intended for use and will be removed in the next version
-     */
-    @Deprecated
-    protected abstract boolean impl_computeContains(double localX, double localY);
-
     /*
      *                   Bounds Invalidation And Notification
      *
@@ -3742,13 +3845,13 @@
      *  normal bounds invalidation occurs.
      *
      *  When a node's geometry changes (for example, if the width of a
-     *  Rectangle is changed) then the Node must call impl_geomChanged().
+     *  Rectangle is changed) then the Node must call NodeHelper.geomChanged().
      *  Invoking this function will eventually clear all cached bounds and
      *  notify to each parent up the tree that their bounds may have changed.
      *
      *  After invalidating geomBounds (and after kicking off layout bounds
-     *  notification), impl_geomChanged calls localBoundsChanged(). It should
-     *  be noted that impl_geomChanged should only be called when the geometry
+     *  notification), NodeHelper.geomChanged calls localBoundsChanged(). It should
+     *  be noted that NodeHelper.geomChanged should only be called when the geometry
      *  of the node has changed such that it may result in the geom bounds
      *  actually changing.
      *
@@ -3760,7 +3863,7 @@
      *  no need to notify the parent of the bounds change because the parent's
      *  bounds do not include invisible nodes. If the node is visible, then
      *  it must tell the parent that this child node's bounds have changed.
-     *  It is up to the parent to eventually invoke its own impl_geomChanged
+     *  It is up to the parent to eventually invoke its own NodeHelper.geomChanged
      *  function. If instead of a parent this node has a clipParent, then the
      *  clipParent's localBoundsChanged() is called instead.
      *
@@ -3788,10 +3891,10 @@
      *  bounds. This is both useful and provides a very nice performance
      *  optimization for regions and controls. In this case, subclasses
      *  need some way to interpose themselves such that a call to
-     *  impl_geomChanged() *does not* invalidate the layout bounds.
+     *  NodeHelper.geomChanged() *does not* invalidate the layout bounds.
      *
      *  This interposition happens by providing the
-     *  impl_notifyLayoutBoundsChanged function. The default implementation
+     *  NodeHelper.notifyLayoutBoundsChanged function. The default implementation
      *  simply invalidates boundsInLocal. Subclasses (such as Region and
      *  Control) can override this function so that it does not invalidate
      *  the layout bounds.
@@ -3806,41 +3909,39 @@
      *  have changed.
      */
 
-    /**
+    /*
      * Invoked by subclasses whenever their geometric bounds have changed.
      * Because the default layout bounds is based on the node geometry, this
-     * function will invoke impl_notifyLayoutBoundsChanged. The default
-     * implementation of impl_notifyLayoutBoundsChanged() will simply invalidate
+     * function will invoke NodeHelper.notifyLayoutBoundsChanged. The default
+     * implementation of NodeHelper.notifyLayoutBoundsChanged() will simply invalidate
      * layoutBounds. Resizable subclasses will want to override this function
      * in most cases to be a no-op.
-     * <p>
+     *
      * This function will also invalidate the cached geom bounds, and then
      * invoke localBoundsChanged() which will eventually end up invoking a
      * chain of functions up the tree to ensure that each parent of this
      * Node is notified that its bounds may have also changed.
-     * <p>
+     *
      * This function should be treated as though it were final. It is not
      * intended to be overridden by subclasses.
      *
-     * @treatAsPrivate implementation detail
-     * @deprecated This is an internal API that is not intended for use and will be removed in the next version
-     */
-    @Deprecated
-    protected void impl_geomChanged() {
+     * Note: This method MUST only be called via its accessor method.
+     */
+    private void doGeomChanged() {
         if (geomBoundsInvalid) {
             // GeomBoundsInvalid is false when node geometry changed and
             // the untransformed node bounds haven't been recalculated yet.
             // Most of the time, the recalculation of layout and transformed
             // node bounds don't require validation of untransformed bounds
             // and so we can not skip the following notifications.
-            impl_notifyLayoutBoundsChanged();
+            NodeHelper.notifyLayoutBoundsChanged(this);
             transformedBoundsChanged();
             return;
         }
         geomBounds.makeEmpty();
         geomBoundsInvalid = true;
         NodeHelper.markDirty(this, DirtyBits.NODE_BOUNDS);
-        impl_notifyLayoutBoundsChanged();
+        NodeHelper.notifyLayoutBoundsChanged(this);
         localBoundsChanged();
     }
 
@@ -3877,19 +3978,17 @@
         }
     }
 
-    /**
-     * Invoked by impl_geomChanged(). Since layoutBounds is by default based
+    /*
+     * Invoked by geomChanged(). Since layoutBounds is by default based
      * on the geometric bounds, the default implementation of this function will
      * invalidate the layoutBounds. Resizable Node subclasses generally base
      * layoutBounds on the width/height instead of the geometric bounds, and so
      * will generally want to override this function to be a no-op.
      *
-     * @treatAsPrivate implementation detail
-     * @deprecated This is an internal API that is not intended for use and will be removed in the next version
-     */
-    @Deprecated
-    protected void impl_notifyLayoutBoundsChanged() {
-        impl_layoutBoundsChanged();
+     * Note: This method MUST only be called via its accessor method.
+     */
+    private void doNotifyLayoutBoundsChanged() {
+        layoutBoundsChanged();
         // notify the parent
         // Group instanceof check a little hoaky, but it allows us to disable
         // unnecessary layout for the case of a non-resizable within a group
@@ -3939,23 +4038,20 @@
      */
     public boolean contains(double localX, double localY) {
         if (containsBounds(localX, localY)) {
-            return (isPickOnBounds() || impl_computeContains(localX, localY));
+            return (isPickOnBounds() || NodeHelper.computeContains(this, localX, localY));
         }
         return false;
     }
 
-    /**
+    /*
      * This method only does the contains check based on the bounds, clip and
      * effect of this node, excluding its shape (or geometry).
      *
      * Returns true if the given point (specified in the local
      * coordinate space of this {@code Node}) is contained within the bounds,
      * clip and effect of this node.
-     * @treatAsPrivate implementation detail
-     * @deprecated This is an internal API that is not intended for use and will be removed in the next version
-     */
-    @Deprecated
-    protected boolean containsBounds(double localX, double localY) {
+     */
+    private boolean containsBounds(double localX, double localY) {
         final TempState tempState = TempState.getInstance();
         BaseBounds tempBounds = tempState.bounds;
 
@@ -4750,24 +4846,20 @@
         return tx;
     }
 
-    /**
+    /*
      * Currently used only by PathTransition
-     * @treatAsPrivate implementation detail
-     * @deprecated This is an internal API that is not intended for use and will be removed in the next version
-     */
-    @Deprecated
-    public final BaseTransform impl_getLeafTransform() {
+     */
+    final BaseTransform getLeafTransform() {
         return getLocalToParentTransform(TempState.getInstance().leafTx);
     }
 
-    /**
+    /*
      * Invoked whenever the transforms[] ObservableList changes, or by the transforms
      * in that ObservableList whenever they are changed.
-     * @treatAsPrivate implementation detail
-     * @deprecated This is an internal API that is not intended for use and will be removed in the next version
-     */
-    @Deprecated
-    public void impl_transformsChanged() {
+     *
+     * Note: This method MUST only be called via its accessor method.
+     */
+    private void doTransformsChanged() {
         if (!transformDirty) {
             NodeHelper.markDirty(this, DirtyBits.NODE_TRANSFORM);
             transformDirty = true;
@@ -4777,32 +4869,17 @@
         invalidateLocalToSceneTransform();
     }
 
-    /**
-     * @treatAsPrivate implementation detail
-     * @deprecated This is an internal API that is not intended for use and will be removed in the next version
-     */
-    @Deprecated
-    public final double impl_getPivotX() {
+    final double getPivotX() {
         final Bounds bounds = getLayoutBounds();
         return bounds.getMinX() + bounds.getWidth()/2;
     }
 
-    /**
-     * @treatAsPrivate implementation detail
-     * @deprecated This is an internal API that is not intended for use and will be removed in the next version
-     */
-    @Deprecated
-    public final double impl_getPivotY() {
+    final double getPivotY() {
         final Bounds bounds = getLayoutBounds();
         return bounds.getMinY() + bounds.getHeight()/2;
     }
 
-    /**
-     * @treatAsPrivate implementation detail
-     * @deprecated This is an internal API that is not intended for use and will be removed in the next version
-     */
-    @Deprecated
-    public final double impl_getPivotZ() {
+    final double getPivotZ() {
         final Bounds bounds = getLayoutBounds();
         return bounds.getMinZ() + bounds.getDepth()/2;
     }
@@ -4824,7 +4901,7 @@
                     // (must be the last transformation)
                     mirroringCenter = sceneValue.getWidth() / 2;
                     if (mirroringCenter == 0.0) {
-                        mirroringCenter = impl_getPivotX();
+                        mirroringCenter = getPivotX();
                     }
 
                     localToParentTx = localToParentTx.deriveWithTranslation(
@@ -4836,15 +4913,15 @@
                 } else {
                     // mirror later
                     mirror = true;
-                    mirroringCenter = impl_getPivotX();
+                    mirroringCenter = getPivotX();
                 }
             }
 
             if (getScaleX() != 1 || getScaleY() != 1 || getScaleZ() != 1 || getRotate() != 0) {
                 // recompute pivotX, pivotY and pivotZ
-                double pivotX = impl_getPivotX();
-                double pivotY = impl_getPivotY();
-                double pivotZ = impl_getPivotZ();
+                double pivotX = getPivotX();
+                double pivotY = getPivotY();
+                double pivotZ = getPivotZ();
 
                 localToParentTx = localToParentTx.deriveWithTranslation(
                         getTranslateX() + getLayoutX() + pivotX,
@@ -4864,7 +4941,7 @@
                         getTranslateZ());
             }
 
-            if (impl_hasTransforms()) {
+            if (hasTransforms()) {
                 for (Transform t : getTransforms()) {
                     localToParentTx = TransformHelper.derive(t, localToParentTx);
                 }
@@ -4946,27 +5023,23 @@
         localToParentTx.transform(pt, pt);
     }
 
-    /**
+    /*
      * Finds a top-most child node that contains the given local coordinates.
      *
      * The result argument is used for storing the picking result.
-     * @treatAsPrivate implementation detail
-     * @deprecated This is an internal API that is not intended for use and will be removed in the next version
-     */
-    @Deprecated
-    protected void impl_pickNodeLocal(PickRay localPickRay, PickResultChooser result) {
-        impl_intersects(localPickRay, result);
-    }
-
-    /**
+     *
+     * Note: This method MUST only be called via its accessor method.
+     */
+    private void doPickNodeLocal(PickRay localPickRay, PickResultChooser result) {
+        intersects(localPickRay, result);
+    }
+
+    /*
      * Finds a top-most child node that intersects the given ray.
      *
      * The result argument is used for storing the picking result.
-     * @treatAsPrivate implementation detail
-     * @deprecated This is an internal API that is not intended for use and will be removed in the next version
-     */
-    @Deprecated
-    public final void impl_pickNode(PickRay pickRay, PickResultChooser result) {
+     */
+    final void pickNode(PickRay pickRay, PickResultChooser result) {
 
         // In some conditions we can omit picking this node or subgraph
         if (!isVisible() || isDisable() || isMouseTransparent()) {
@@ -4990,7 +5063,7 @@
             // Delegate to a function which can be overridden by subclasses which
             // actually does the pick. The implementation is markedly different
             // for leaf nodes vs. parent nodes vs. region nodes.
-            impl_pickNodeLocal(pickRay, result);
+            NodeHelper.pickNodeLocal(this, pickRay, result);
         } catch (NoninvertibleTransformException e) {
             // in this case we just don't pick anything
         }
@@ -4999,7 +5072,7 @@
         pickRay.setDirection(dx, dy, dz);
     }
 
-    /**
+    /*
      * Returns {@code true} if the given ray (start, dir), specified in the
      * local coordinate space of this {@code Node}, intersects the
      * shape of this {@code Node}. Note that this method does not take visibility
@@ -5011,13 +5084,9 @@
      * Note that this is a conditional feature. See
      * {@link javafx.application.ConditionalFeature#SCENE3D ConditionalFeature.SCENE3D}
      * for more information.
-     *
-     * @treatAsPrivate implementation detail
-     * @deprecated This is an internal API that is not intended for use and will be removed in the next version
-     */
-    @Deprecated
-    protected final boolean impl_intersects(PickRay pickRay, PickResultChooser pickResult) {
-        double boundsDistance = impl_intersectsBounds(pickRay);
+     */
+    final boolean intersects(PickRay pickRay, PickResultChooser pickResult) {
+        double boundsDistance = intersectsBounds(pickRay);
         if (!Double.isNaN(boundsDistance)) {
             if (isPickOnBounds()) {
                 if (pickResult != null) {
@@ -5025,24 +5094,20 @@
                 }
                 return true;
             } else {
-                return impl_computeIntersects(pickRay, pickResult);
+                return NodeHelper.computeIntersects(this, pickRay, pickResult);
             }
         }
         return false;
     }
 
-    /**
+    /*
      * Computes the intersection of the pickRay with this node.
      * The pickResult argument is updated if the found intersection
      * is closer than the passed one. On the other hand, the return value
      * specifies whether the intersection exists, regardless of its comparison
      * with the given pickResult.
-     *
-     * @treatAsPrivate implementation detail
-     * @deprecated This is an internal API that is not intended for use and will be removed in the next version
-     */
-    @Deprecated
-    protected boolean impl_computeIntersects(PickRay pickRay, PickResultChooser pickResult) {
+     */
+    private boolean doComputeIntersects(PickRay pickRay, PickResultChooser pickResult) {
         double origZ = pickRay.getOriginNoClone().z;
         double dirZ = pickRay.getDirectionNoClone().z;
         // Handle the case where pickRay is almost parallel to the Z-plane
@@ -5065,7 +5130,7 @@
         return false;
     }
 
-    /**
+    /*
      * Computes the intersection of the pickRay with the bounds of this node.
      * The return value is the distance between the camera and the intersection
      * point, measured in pickRay direction magnitudes. If there is
@@ -5074,11 +5139,8 @@
      * @param pickRay The pick ray
      * @return Distance of the intersection point, a NaN if there
      *         is no intersection
-     * @treatAsPrivate implementation detail
-     * @deprecated This is an internal API that is not intended for use and will be removed in the next version
-     */
-    @Deprecated
-    protected final double impl_intersectsBounds(PickRay pickRay) {
+     */
+    final double intersectsBounds(PickRay pickRay) {
 
         final Vec3d dir = pickRay.getDirectionNoClone();
         double tmin, tmax;
@@ -5229,7 +5291,7 @@
             } catch (NoninvertibleTransformException e) {
                 hitClip = false;
             }
-            hitClip = hitClip && clip.impl_intersects(pickRay, null);
+            hitClip = hitClip && clip.intersects(pickRay, null);
             pickRay.setOrigin(originX, originY, originZ);
             pickRay.setDirection(dirX, dirY, dirZ);
 
@@ -5629,12 +5691,7 @@
         return nodeTransformation;
     }
 
-    /**
-     * @treatAsPrivate implementation detail
-     * @deprecated This is an internal API that is not intended for use and will be removed in the next version
-     */
-    @Deprecated
-    public boolean impl_hasTransforms() {
+    private boolean hasTransforms() {
         return (nodeTransformation != null)
                 && nodeTransformation.hasTransforms();
     }
@@ -5892,7 +5949,7 @@
                 translateX = new StyleableDoubleProperty(DEFAULT_TRANSLATE_X) {
                     @Override
                     public void invalidated() {
-                        impl_transformsChanged();
+                        NodeHelper.transformsChanged(Node.this);
                     }
 
                     @Override
@@ -5923,7 +5980,7 @@
                 translateY = new StyleableDoubleProperty(DEFAULT_TRANSLATE_Y) {
                     @Override
                     public void invalidated() {
-                        impl_transformsChanged();
+                        NodeHelper.transformsChanged(Node.this);
                     }
 
                     @Override
@@ -5954,7 +6011,7 @@
                 translateZ = new StyleableDoubleProperty(DEFAULT_TRANSLATE_Z) {
                     @Override
                     public void invalidated() {
-                        impl_transformsChanged();
+                        NodeHelper.transformsChanged(Node.this);
                     }
 
                     @Override
@@ -5985,7 +6042,7 @@
                 scaleX = new StyleableDoubleProperty(DEFAULT_SCALE_X) {
                     @Override
                     public void invalidated() {
-                        impl_transformsChanged();
+                        NodeHelper.transformsChanged(Node.this);
                     }
 
                     @Override
@@ -6016,7 +6073,7 @@
                 scaleY = new StyleableDoubleProperty(DEFAULT_SCALE_Y) {
                     @Override
                     public void invalidated() {
-                        impl_transformsChanged();
+                        NodeHelper.transformsChanged(Node.this);
                     }
 
                     @Override
@@ -6047,7 +6104,7 @@
                 scaleZ = new StyleableDoubleProperty(DEFAULT_SCALE_Z) {
                     @Override
                     public void invalidated() {
-                        impl_transformsChanged();
+                        NodeHelper.transformsChanged(Node.this);