diff -r 95017b565e2a modules/controls/src/main/java/javafx/scene/control/Tooltip.java
--- a/modules/controls/src/main/java/javafx/scene/control/Tooltip.java	Tue Apr 01 12:38:08 2014 +0200
+++ b/modules/controls/src/main/java/javafx/scene/control/Tooltip.java	Wed Apr 02 13:46:47 2014 +0200
@@ -770,11 +770,11 @@
                         // (but not the popup placement) by setting the
                         // nodeOrientation on tooltip.getScene().getRoot().
                         NodeOrientation nodeOrientation = hoveredNode.getEffectiveNodeOrientation();
-                        activatedTooltip.getScene().setNodeOrientation(nodeOrientation);
                         if (nodeOrientation == NodeOrientation.RIGHT_TO_LEFT) {
                             x -= activatedTooltip.getWidth();
                         }
                         activatedTooltip.show(owner, x+TOOLTIP_XOFFSET, y+TOOLTIP_YOFFSET);
+                        activatedTooltip.getScene().setNodeOrientation(nodeOrientation);
                         visibleTooltip = activatedTooltip;
                         hoveredNode = null;
                         hideTimer.playFromStart();
diff -r 95017b565e2a modules/graphics/src/main/java/javafx/stage/PopupWindow.java
--- a/modules/graphics/src/main/java/javafx/stage/PopupWindow.java	Tue Apr 01 12:38:08 2014 +0200
+++ b/modules/graphics/src/main/java/javafx/stage/PopupWindow.java	Wed Apr 02 13:46:47 2014 +0200
@@ -117,6 +117,7 @@
                     updateWindow(getAnchorX(), getAnchorY());
                 }
             };
+    private final ChangeListener<Parent> sceneRootInvalidationListener;
 
     /**
      * RT-28454: When a parent node or parent window we are associated with is not
@@ -133,50 +134,42 @@
     };
     
     private WeakChangeListener<Boolean> weakOwnerNodeListener = new WeakChangeListener(changeListener);
+    private Parent popupRoot;
 
     public PopupWindow() {
-        final Pane popupRoot = new Pane();
-        popupRoot.setBackground(Background.EMPTY);
-        popupRoot.getStyleClass().add("popup");
+        Pane root = new Pane();
+        root.setBackground(Background.EMPTY);
+        root.getStyleClass().add("popup");
+        root.layoutBoundsProperty().addListener(popupWindowUpdater);
+        root.boundsInLocalProperty().addListener(popupWindowUpdater);
+        popupRoot = root;
 
-        final Scene scene = SceneHelper.createPopupScene(popupRoot);
-        scene.setFill(null);
-        super.setScene(scene);
+        sceneRootInvalidationListener = new ChangeListener<Parent>() {
+            @Override
+            public void changed(ObservableValue observable, Parent oldRoot, Parent newRoot) {
+                if (popupRoot != null) {
+                    popupRoot.layoutBoundsProperty()
+                            .removeListener(popupWindowUpdater);
+                    popupRoot.boundsInLocalProperty()
+                            .removeListener(popupWindowUpdater);
+                    popupRoot.getStyleClass().remove("popup");
+                }
 
-        popupRoot.layoutBoundsProperty().addListener(popupWindowUpdater);
-        popupRoot.boundsInLocalProperty().addListener(popupWindowUpdater);
-        scene.rootProperty().addListener(
-                new InvalidationListener() {
-                    private Node oldRoot = scene.getRoot();
+                if (newRoot != null) {
+                    newRoot.layoutBoundsProperty()
+                            .addListener(popupWindowUpdater);
+                    newRoot.boundsInLocalProperty()
+                            .addListener(popupWindowUpdater);
+                    newRoot.getStyleClass().add("popup");
+                }
 
-                    @Override
-                    public void invalidated(final Observable observable) {
-                        final Node newRoot = scene.getRoot();
-                        if (oldRoot != newRoot) {
-                            if (oldRoot != null) {
-                                oldRoot.layoutBoundsProperty()
-                                       .removeListener(popupWindowUpdater);
-                                oldRoot.boundsInLocalProperty()
-                                       .removeListener(popupWindowUpdater);
-                                oldRoot.getStyleClass().remove("popup");
-                            }
+                popupRoot = newRoot;
 
-                            if (newRoot != null) {
-                                newRoot.layoutBoundsProperty()
-                                       .addListener(popupWindowUpdater);
-                                newRoot.boundsInLocalProperty()
-                                       .addListener(popupWindowUpdater);
-                                newRoot.getStyleClass().add("popup");
-                            }
-
-                            oldRoot = newRoot;
-
-                            cachedExtendedBounds = null;
-                            cachedAnchorBounds = null;
-                            updateWindow(getAnchorX(), getAnchorY());
-                        }
-                    }
-                });
+                cachedExtendedBounds = null;
+                cachedAnchorBounds = null;
+                updateWindow(getAnchorX(), getAnchorY());
+            }
+        };
     }
 
     /**
@@ -189,13 +182,12 @@
      */
     @Deprecated
     protected ObservableList<Node> getContent() {
-        final Parent rootNode = getScene().getRoot();
-        if (rootNode instanceof Group) {
-            return ((Group) rootNode).getChildren();
+        if (popupRoot instanceof Group) {
+            return ((Group) popupRoot).getChildren();
         }
 
-        if (rootNode instanceof Pane) {
-            return ((Pane) rootNode).getChildren();
+        if (popupRoot instanceof Pane) {
+            return ((Pane) popupRoot).getChildren();
         }
 
         throw new IllegalStateException(
@@ -426,8 +418,16 @@
             owner.showingProperty().addListener(weakOwnerNodeListener);
         }
 
-        final Scene sceneValue = getScene();
-        SceneHelper.parentEffectiveOrientationInvalidated(sceneValue);            
+        Scene sceneValue = getScene();
+
+        if (sceneValue == null) {
+            sceneValue = SceneHelper.createPopupScene(popupRoot);
+            sceneValue.setFill(null);
+            sceneValue.rootProperty().addListener(sceneRootInvalidationListener);
+            super.setScene(sceneValue);
+        }
+
+        SceneHelper.parentEffectiveOrientationInvalidated(sceneValue);
         
         // RT-28447
         final Scene ownerScene = getRootWindow(owner).getScene();
@@ -681,9 +681,8 @@
 
     private Bounds getExtendedBounds() {
         if (cachedExtendedBounds == null) {
-            final Parent rootNode = getScene().getRoot();
-            cachedExtendedBounds = union(rootNode.getLayoutBounds(),
-                                         rootNode.getBoundsInLocal());
+            cachedExtendedBounds = union(popupRoot.getLayoutBounds(),
+                    popupRoot.getBoundsInLocal());
         }
 
         return cachedExtendedBounds;
@@ -692,8 +691,7 @@
     private Bounds getAnchorBounds() {
         if (cachedAnchorBounds == null) {
             cachedAnchorBounds = getAnchorLocation().isContentLocation()
-                                         ? getScene().getRoot()
-                                                     .getLayoutBounds()
+                                         ? popupRoot.getLayoutBounds()
                                          : getExtendedBounds();
         }
 
@@ -703,7 +701,6 @@
     private void updateWindow(final double newAnchorX,
                               final double newAnchorY) {
         final AnchorLocation anchorLocationValue = getAnchorLocation();
-        final Parent rootNode = getScene().getRoot();
         final Bounds extendedBounds = getExtendedBounds();
         final Bounds anchorBounds = getAnchorBounds();
 
@@ -763,8 +760,8 @@
         setWidth(extendedBounds.getWidth());
         setHeight(extendedBounds.getHeight());
         // update transform
-        rootNode.setTranslateX(-extendedBounds.getMinX());
-        rootNode.setTranslateY(-extendedBounds.getMinY());
+        popupRoot.setTranslateX(-extendedBounds.getMinX());
+        popupRoot.setTranslateY(-extendedBounds.getMinY());
 
         // update popup position
         // don't set Window.xExplicit unnecessarily
