diff -r d6029d0df92b 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 Jan 10 15:46:26 2013 +0100
+++ b/javafx-ui-controls/src/com/sun/javafx/scene/control/skin/TextInputControlSkin.java	Mon Jan 14 10:12:30 2013 +0100
@@ -25,6 +25,7 @@
 
 package com.sun.javafx.scene.control.skin;
 
+import java.lang.ref.WeakReference;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
@@ -240,7 +241,8 @@
 
     private BooleanProperty blink = new SimpleBooleanProperty(this, "blink", true);
     protected ObservableBooleanValue caretVisible;
-    private Timeline caretTimeline = new Timeline();
+    private CaretBlinking caretBlinking = new CaretBlinking(blink);
+
     /**
      * A path, provided by the textNode, which represents the caret.
      * I assume this has to be updated whenever the caretPosition
@@ -288,25 +290,9 @@
         }
     }
 
-
     public TextInputControlSkin(final T textInput, final B behavior) {
         super(textInput, behavior);
 
-        caretTimeline.setCycleCount(Timeline.INDEFINITE);
-        caretTimeline.getKeyFrames().addAll(
-            new KeyFrame(Duration.ZERO, new EventHandler<ActionEvent>() {
-                @Override public void handle(ActionEvent event) {
-                    blink.set(false);
-                }
-            }),
-            new KeyFrame(Duration.seconds(.5), new EventHandler<ActionEvent>() {
-                @Override public void handle(ActionEvent event) {
-                    blink.set(true);
-                }
-            }),
-            new KeyFrame(Duration.seconds(1))
-        );
-
         /**
          * The caret is visible when the text box is focused AND when the selection
          * is empty. If the selection is non empty or the text box is not focused
@@ -436,11 +422,6 @@
         });
     }
     
-    @Override public void dispose() {
-        caretTimeline.stop();
-        caretTimeline = null;
-    }
-
     // For PasswordFieldSkin
     protected String maskText(String txt) {
         return txt;
@@ -613,10 +594,57 @@
 
     public void setCaretAnimating(boolean value) {
         if (value) {
+            caretBlinking.start();
+        } else {
+            caretBlinking.stop();
+            blink.set(true);
+        }
+    }
+
+    private static final class CaretBlinking {
+        private final Timeline caretTimeline;
+        private final WeakReference<BooleanProperty> blinkPropertyRef;
+
+        public CaretBlinking(final BooleanProperty blinkProperty) {
+            blinkPropertyRef =
+                    new WeakReference<BooleanProperty>(blinkProperty);
+
+            caretTimeline = new Timeline();
+            caretTimeline.setCycleCount(Timeline.INDEFINITE);
+            caretTimeline.getKeyFrames().addAll(
+                new KeyFrame(Duration.ZERO,
+                             new EventHandler<ActionEvent>() {
+                                 @Override
+                                 public void handle(final ActionEvent event) {
+                                     setBlink(false);
+                                 }
+                             }),
+                new KeyFrame(Duration.seconds(.5),
+                             new EventHandler<ActionEvent>() {
+                                 @Override
+                                 public void handle(final ActionEvent event) {
+                                     setBlink(true);
+                                 }
+                             }),
+                new KeyFrame(Duration.seconds(1)));
+        }
+
+        public void start() {
             caretTimeline.play();
-        } else {
+        }
+
+        public void stop() {
             caretTimeline.stop();
-            blink.set(true);
+        }
+
+        private void setBlink(final boolean value) {
+            final BooleanProperty blinkProperty = blinkPropertyRef.get();
+            if (blinkProperty == null) {
+                caretTimeline.stop();
+                return;
+            }
+
+            blinkProperty.set(value);
         }
     }
 
