diff -r 3ae1a875814f javafx-ui-common/src/com/sun/javafx/stage/PopupEventRedirector.java
--- a/javafx-ui-common/src/com/sun/javafx/stage/PopupEventRedirector.java	Thu Apr 26 18:06:47 2012 +0200
+++ b/javafx-ui-common/src/com/sun/javafx/stage/PopupEventRedirector.java	Tue May 01 20:29:16 2012 +0200
@@ -82,7 +82,7 @@
 
         final Scene scene = popupWindow.getScene();
         if (scene != null) {
-            final Node sceneFocusOwner = scene.impl_getFocusOwner();
+            final Node sceneFocusOwner = scene.getFocusOwner();
             final EventTarget eventTarget =
                     (sceneFocusOwner != null) ? sceneFocusOwner : scene;
             if (EventUtil.fireEvent(eventTarget, new DirectEvent(event))
diff -r 3ae1a875814f javafx-ui-common/src/javafx/scene/Node.java
--- a/javafx-ui-common/src/javafx/scene/Node.java	Thu Apr 26 18:06:47 2012 +0200
+++ b/javafx-ui-common/src/javafx/scene/Node.java	Tue May 01 20:29:16 2012 +0200
@@ -5855,7 +5855,7 @@
      */
     private void focusSetDirty(Scene s) {
         if (s != null &&
-            (this == s.impl_getFocusOwner() || isFocusTraversable())) {
+            (this == s.getFocusOwner() || isFocusTraversable())) {
                 s.setFocusDirty(true);
         }
     }
diff -r 3ae1a875814f javafx-ui-common/src/javafx/scene/Scene.java
--- a/javafx-ui-common/src/javafx/scene/Scene.java	Thu Apr 26 18:06:47 2012 +0200
+++ b/javafx-ui-common/src/javafx/scene/Scene.java	Tue May 01 20:29:16 2012 +0200
@@ -1314,7 +1314,7 @@
         final EventTarget eventTarget;
         if (!isKeyboardTrigger) Scene.inMousePick = true;
         if (isKeyboardTrigger) {
-            Node sceneFocusOwner = keyHandler.getFocusOwner();
+            Node sceneFocusOwner = getFocusOwner();
             eventTarget = sceneFocusOwner != null ? sceneFocusOwner : Scene.this;
         } else {
             eventTarget = pick(x2, y2);
@@ -1681,56 +1681,56 @@
         getKeyHandler().requestFocus(node);
     }
 
-    /**
-     * Gets the scene's current focus owner 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
-    public Node impl_getFocusOwner() {
-        return getKeyHandler().getFocusOwner();
-    }
+    private Node oldFocusOwner;
     /**
      * The scene's current focus owner node. This node's "focused"
      * variable might be false if this scene has no window, or if the
      * window is inactive (window.focused == false).
      *
-     * @treatAsPrivate implementation detail
-     * @deprecated This is an internal API that is not intended for use and will be removed in the next version
      */
-    @Deprecated
-    private ObjectProperty<Node> impl_focusOwner;
-
-    /**
-     * @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 setImpl_focusOwner(Node value) {
-        impl_focusOwnerProperty().set(value);
-    }
-
-    /**
-     * @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 Node getImpl_focusOwner() {
-        return impl_focusOwner == null ? null : impl_focusOwner.get();
-    }
-
-    /**
-     * @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 ObjectProperty<Node> impl_focusOwnerProperty() {
-        if (impl_focusOwner == null) {
-            impl_focusOwner = new SimpleObjectProperty<Node>(this, "impl_focusOwner");
-        }
-        return impl_focusOwner;
+    private ReadOnlyObjectWrapper<Node> focusOwner = new ReadOnlyObjectWrapper<Node>(this, "impl_focusOwner") {
+
+        @Override
+        protected void invalidated() {
+            if (oldFocusOwner != null) {
+                ((Node.FocusedProperty) oldFocusOwner.focusedProperty()).store(false);
+            }
+            Node value = get();
+
+            if (value != null) {
+                ((Node.FocusedProperty) value.focusedProperty()).store(keyHandler.windowFocused);
+                if (value != oldFocusOwner) {
+                    value.getScene().impl_enableInputMethodEvents(
+                        value.getInputMethodRequests() != null &&
+                        value.getOnInputMethodTextChanged() != null);
+                }
+            }
+
+            if (oldFocusOwner != null) {
+                ((Node.FocusedProperty) oldFocusOwner.focusedProperty()).notifyListeners();
+            }
+            if (value != null) {
+                ((Node.FocusedProperty) value.focusedProperty()).notifyListeners();
+            }
+
+            PlatformLogger logger = Logging.getFocusLogger();
+            if (logger.isLoggable(PlatformLogger.FINE)) {
+                logger.fine("Changed focus from "
+                            + oldFocusOwner + " to "
+                            + value);
+            }
+            
+            oldFocusOwner = value;
+        }
+
+    };
+
+    public final Node getFocusOwner() {
+        return focusOwner.get();
+    }
+
+    public final ReadOnlyObjectProperty<Node> focusOwnerProperty() {
+        return focusOwner.getReadOnlyProperty();
     }
 
     // For testing.
@@ -1744,7 +1744,7 @@
      */
     @Deprecated
     public void impl_processInputMethodEvent(InputMethodEvent e) {
-        Node node = impl_getFocusOwner();
+        Node node = getFocusOwner();
         if (node != null) {
             node.fireEvent(e);
         }
@@ -1942,7 +1942,7 @@
          */
         private void focusCleanup() {
             if (Scene.this.isFocusDirty()) {
-                final Node oldOwner = Scene.this.impl_getFocusOwner();
+                final Node oldOwner = Scene.this.getFocusOwner();
                 if (oldOwner == null) {
                     Scene.this.focusInitial();
                 } else if (oldOwner.getScene() != Scene.this) {
@@ -3213,40 +3213,8 @@
      ******************************************************************************/
 
     class KeyHandler {
-        private Node focusOwner = null;
-        private Node getFocusOwner() { return focusOwner; }
-
-        private void setFocusOwner(Node value) {
-            Node oldFocusOwner = focusOwner;
-            if (oldFocusOwner != null) {
-                ((Node.FocusedProperty) oldFocusOwner.focusedProperty()).store(false);
-            }
-            focusOwner = value;
-
-            Scene.this.setImpl_focusOwner(focusOwner);// = Scene{ impl_focusOwner = bind keyHandler.focusOwner };
-
-            if (focusOwner != null) {
-                ((Node.FocusedProperty) focusOwner.focusedProperty()).store(windowFocused);
-                if (focusOwner != oldFocusOwner) {
-                    focusOwner.getScene().impl_enableInputMethodEvents(
-                        focusOwner.getInputMethodRequests() != null &&
-                        focusOwner.getOnInputMethodTextChanged() != null);
-                }
-            }
-
-            if (oldFocusOwner != null) {
-                ((Node.FocusedProperty) oldFocusOwner.focusedProperty()).notifyListeners();
-            }
-            if (focusOwner != null) {
-                ((Node.FocusedProperty) focusOwner.focusedProperty()).notifyListeners();
-            }
-
-            PlatformLogger logger = Logging.getFocusLogger();
-            if (logger.isLoggable(PlatformLogger.FINE)) {
-                logger.fine("Changed focus from "
-                            + oldFocusOwner + " to "
-                            + focusOwner);
-            }
+        private void setFocusOwner(final Node value) {
+            focusOwner.set(value);
         }
 
         private boolean windowFocused = true;
@@ -3381,7 +3349,7 @@
         }
 
         private InputMethodRequests getClientRequests() {
-            Node focusOwner = impl_getFocusOwner();
+            Node focusOwner = getFocusOwner();
             if (focusOwner != null) {
                 return focusOwner.getInputMethodRequests();
             }
diff -r 3ae1a875814f javafx-ui-common/test/unit/javafx/scene/FocusTest.java
--- a/javafx-ui-common/test/unit/javafx/scene/FocusTest.java	Thu Apr 26 18:06:47 2012 +0200
+++ b/javafx-ui-common/test/unit/javafx/scene/FocusTest.java	Tue May 01 20:29:16 2012 +0200
@@ -95,17 +95,17 @@
     }
 
     private void assertIsFocused(Scene s, Node n) {
-        assertEquals(n, s.impl_getFocusOwner());
+        assertEquals(n, s.getFocusOwner());
         assertTrue(n.isFocused());
     }
 
     private void assertNotFocused(Scene s, Node n) {
-        assertTrue(n != s.impl_getFocusOwner());
+        assertTrue(n != s.getFocusOwner());
         assertFalse(n.isFocused());
     }
 
     private void assertNullFocus(Scene s) {
-        assertNull(s.impl_getFocusOwner());
+        assertNull(s.getFocusOwner());
     }
 
     /**
@@ -609,7 +609,7 @@
         nodes.get(0).requestFocus();
         fireTestPulse();
         assertNullFocus(scene);
-        assertEquals(nodes.get(0), scene2.impl_getFocusOwner());
+        assertEquals(nodes.get(0), scene2.getFocusOwner());
         assertFalse(nodes.get(0).isFocused());
         stage.setScene(scene2);
         fireTestPulse();
@@ -631,7 +631,7 @@
         stage.hide();
         nodes.get(0).requestFocus();
         fireTestPulse();
-        assertEquals(nodes.get(0), scene.impl_getFocusOwner());
+        assertEquals(nodes.get(0), scene.getFocusOwner());
         assertFalse(nodes.get(0).isFocused());     
     }
     
@@ -650,11 +650,11 @@
         fireTestPulse();
         assertIsFocused(scene, nodes.get(0));
         assertFalse(nodes.get(1).isFocused());
-        assertEquals(nodes.get(1), scene2.impl_getFocusOwner());
+        assertEquals(nodes.get(1), scene2.getFocusOwner());
         stage.setScene(scene2);
         fireTestPulse();
         assertFalse(nodes.get(0).isFocused());
-        assertEquals(nodes.get(0), scene.impl_getFocusOwner());
+        assertEquals(nodes.get(0), scene.getFocusOwner());
         assertIsFocused(scene2, nodes.get(1));
     }
 
diff -r 3ae1a875814f javafx-ui-controls/src/com/sun/javafx/scene/control/skin/TextInputControlSkin.java
--- a/javafx-ui-controls/src/com/sun/javafx/scene/control/skin/TextInputControlSkin.java	Thu Apr 26 18:06:47 2012 +0200
+++ b/javafx-ui-controls/src/com/sun/javafx/scene/control/skin/TextInputControlSkin.java	Tue May 01 20:29:16 2012 +0200
@@ -288,7 +288,7 @@
                         public void run() {
                             if (textInput.isFocused()) {
                                 FXVK.attach(textInput);
-                            } else if (!(getScene().impl_getFocusOwner() instanceof TextInputControl)) {
+                            } else if (!(getScene().getFocusOwner() instanceof TextInputControl)) {
                                 FXVK.detach();
                             }
                         }
diff -r 3ae1a875814f javafx-ui-controls/test/com/sun/javafx/scene/control/skin/ScrollPaneSkinTest.java
--- a/javafx-ui-controls/test/com/sun/javafx/scene/control/skin/ScrollPaneSkinTest.java	Thu Apr 26 18:06:47 2012 +0200
+++ b/javafx-ui-controls/test/com/sun/javafx/scene/control/skin/ScrollPaneSkinTest.java	Tue May 01 20:29:16 2012 +0200
@@ -390,7 +390,7 @@
         /*
         ** did it work?
         */
-        assertTrue(scene.getImpl_focusOwner() == scrollPane);
+        assertTrue(scene.getFocusOwner() == scrollPane);
     }
 
     /*
