diff -r 26bf7b829a87 modules/controls/src/main/java/com/sun/javafx/scene/control/skin/ScrollPaneSkin.java
--- a/modules/controls/src/main/java/com/sun/javafx/scene/control/skin/ScrollPaneSkin.java	Mon Jul 01 13:27:40 2013 +0200
+++ b/modules/controls/src/main/java/com/sun/javafx/scene/control/skin/ScrollPaneSkin.java	Tue Jul 02 08:33:04 2013 +0200
@@ -85,8 +85,8 @@
 
     private Node scrollNode;
 
-    private double nodeWidth;
-    private double nodeHeight;
+    protected double nodeWidth;
+    protected double nodeHeight;
 
     private double posX;
     private double posY;
@@ -888,7 +888,7 @@
         control.setViewportBounds(new BoundingBox(snapPosition(viewContent.getLayoutX()), snapPosition(viewContent.getLayoutY()), snapSize(contentWidth), snapSize(contentHeight)));
     }
     
-    private void computeScrollNodeSize(double contentWidth, double contentHeight) {
+    protected void computeScrollNodeSize(double contentWidth, double contentHeight) {
         if (scrollNode != null) {
             if (scrollNode.isResizable()) {
                 ScrollPane control = getSkinnable();
diff -r 26bf7b829a87 modules/controls/src/main/java/com/sun/javafx/scene/control/skin/TextAreaSkin.java
--- a/modules/controls/src/main/java/com/sun/javafx/scene/control/skin/TextAreaSkin.java	Mon Jul 01 13:27:40 2013 +0200
+++ b/modules/controls/src/main/java/com/sun/javafx/scene/control/skin/TextAreaSkin.java	Tue Jul 02 08:33:04 2013 +0200
@@ -90,6 +90,21 @@
         computedPrefWidth = Double.NEGATIVE_INFINITY;
         computedPrefHeight = Double.NEGATIVE_INFINITY;
     }
+    
+    private static class StretchedScrollPaneSkin extends ScrollPaneSkin {
+
+        public StretchedScrollPaneSkin(ScrollPane scrollpane) {
+            super(scrollpane);
+        }
+
+        @Override
+        protected void computeScrollNodeSize(double contentWidth, double contentHeight) {
+            super.computeScrollNodeSize(contentWidth, contentHeight);
+            nodeWidth = Math.max(nodeWidth, contentWidth);
+            nodeHeight = Math.max(nodeHeight, contentHeight);
+        }
+        
+    }
 
     private class ContentView extends Region {
         {
@@ -138,8 +153,7 @@
 
                 prefWidth += snappedLeftInset() + snappedRightInset();
 
-                Bounds viewPortBounds = scrollPane.getViewportBounds();
-                computedPrefWidth = Math.max(prefWidth, (viewPortBounds != null) ? viewPortBounds.getWidth() : 0);
+                computedPrefWidth = prefWidth;
             }
             return computedPrefWidth;
         }
@@ -172,8 +186,7 @@
 
                 prefHeight += snappedTopInset() + snappedBottomInset();
 
-                Bounds viewPortBounds = scrollPane.getViewportBounds();
-                computedPrefHeight = Math.max(prefHeight, (viewPortBounds != null) ? viewPortBounds.getHeight() : 0);
+                computedPrefHeight = prefHeight;
             }
             return computedPrefHeight;
         }
@@ -436,6 +449,7 @@
 
         // Initialize content
         scrollPane = new ScrollPane();
+        scrollPane.setSkin(new StretchedScrollPaneSkin(scrollPane));
         scrollPane.setMinWidth(0);
         scrollPane.setMinHeight(0);
         scrollPane.setFitToWidth(textArea.isWrapText());
@@ -548,25 +562,6 @@
             }
         });
 
-        scrollPane.viewportBoundsProperty().addListener(new InvalidationListener() {
-            @Override public void invalidated(Observable valueModel) {
-                if (scrollPane.getViewportBounds() != null) {
-                    // ScrollPane creates a new Bounds instance for each
-                    // layout pass, so we need to check if the width/height
-                    // have really changed to avoid infinite layout requests.
-                    Bounds newViewportBounds = scrollPane.getViewportBounds();
-                    if (oldViewportBounds == null ||
-                        oldViewportBounds.getWidth() != newViewportBounds.getWidth() ||
-                        oldViewportBounds.getHeight() != newViewportBounds.getHeight()) {
-
-                        invalidateMetrics();
-                        oldViewportBounds = newViewportBounds;
-                        contentView.requestLayout();
-                    }
-                }
-            }
-        });
-
         textArea.scrollTopProperty().addListener(new ChangeListener<Number>() {
             @Override
             public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
