diff --git a/src/quick/items/qquicktextedit.cpp b/src/quick/items/qquicktextedit.cpp
index e8c21990766c3bbf43338aad349db9ed15c6766a..aca7150ca2dff965c9fc0bc5b1ca498ab59fc28f 100644
--- a/src/quick/items/qquicktextedit.cpp
+++ b/src/quick/items/qquicktextedit.cpp
@@ -153,8 +153,10 @@ namespace {
                 removeChildNode(cursorNode);
             delete cursorNode;
             cursorNode = newNode;
-            appendChildNode(cursorNode);
-            cursorNode->setFlag(QSGNode::OwnedByParent);
+            if (cursorNode) {
+                appendChildNode(cursorNode);
+                cursorNode->setFlag(QSGNode::OwnedByParent);
+            }
         }
 
         QSGRectangleNode *cursorNode;
@@ -1903,10 +1905,10 @@ QSGNode *QQuickTextEdit::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *
     }
 
     if (d->cursorComponent == 0 && !isReadOnly()) {
-        QColor color = (!d->cursorVisible || !d->control->cursorOn())
-                ? QColor(0, 0, 0, 0)
-                : d->color;
-        rootNode->resetCursorNode(d->sceneGraphContext()->createRectangleNode(cursorRectangle(), color));
+        QSGRectangleNode* cursor = 0;
+        if (d->cursorVisible && d->control->cursorOn())
+            cursor = d->sceneGraphContext()->createRectangleNode(cursorRectangle(), d->color);
+        rootNode->resetCursorNode(cursor);
     }
 
     return rootNode;
diff --git a/src/quick/items/qquicktextinput.cpp b/src/quick/items/qquicktextinput.cpp
index d3d4bde36b84857d78e09970b29d3e096c9cea76..c91b79dd34a63b6a2b2597e2b8775742a29a160f 100644
--- a/src/quick/items/qquicktextinput.cpp
+++ b/src/quick/items/qquicktextinput.cpp
@@ -1852,17 +1852,13 @@ QSGNode *QQuickTextInput::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData
         node = new QQuickTextNode(this);
     d->textNode = node;
 
-    if (!d->textLayoutDirty && oldNode != 0) {
-        QSGRectangleNode *cursorNode = node->cursorNode();
-        if (cursorNode != 0 && !isReadOnly()) {
-            cursorNode->setRect(cursorRectangle());
+    const bool showCursor = !isReadOnly() && d->cursorItem == 0 && d->cursorVisible && (d->m_blinkStatus || d->m_blinkPeriod == 0);
 
-            if (!d->cursorVisible || d->cursorItem || (!d->m_blinkStatus && d->m_blinkPeriod > 0)) {
-                d->hideCursor();
-            } else {
-                d->showCursor();
-            }
-        }
+    if (!d->textLayoutDirty && oldNode != 0) {
+        if (showCursor)
+            node->setCursor(cursorRectangle(), d->color);
+        else
+            node->clearCursor();
     } else {
         node->setUseNativeRenderer(d->renderType == NativeRendering);
         node->deleteContent();
@@ -1890,14 +1886,8 @@ QSGNode *QQuickTextInput::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData
                                                                  // selection
         }
 
-        if (!isReadOnly() && d->cursorItem == 0) {
-            node->setCursor(cursorRectangle(), d->color);
-            if (!d->cursorVisible || (!d->m_blinkStatus && d->m_blinkPeriod > 0)) {
-                d->hideCursor();
-            } else {
-                d->showCursor();
-            }
-        }
+        if (showCursor)
+                node->setCursor(cursorRectangle(), d->color);
 
         d->textLayoutDirty = false;
     }
@@ -2696,24 +2686,6 @@ void QQuickTextInput::selectionChanged()
     }
 }
 
-void QQuickTextInputPrivate::showCursor()
-{
-    if (textNode != 0 && textNode->cursorNode() != 0) {
-        QSGRectangleNode *cursor = textNode->cursorNode();
-        cursor->setColor(color);
-        cursor->update();
-    }
-}
-
-void QQuickTextInputPrivate::hideCursor()
-{
-    if (textNode != 0 && textNode->cursorNode() != 0) {
-        QSGRectangleNode *cursor = textNode->cursorNode();
-        cursor->setColor(QColor(0, 0, 0, 0));
-        cursor->update();
-    }
-}
-
 QRectF QQuickTextInput::boundingRect() const
 {
     Q_D(const QQuickTextInput);
diff --git a/src/quick/items/qquicktextinput_p_p.h b/src/quick/items/qquicktextinput_p_p.h
index 2caca45bcef7278fa6d3c5ba6835f143ca51e2c8..7d9f3ff9cead86311a40bee9746c4ebd4373e424 100644
--- a/src/quick/items/qquicktextinput_p_p.h
+++ b/src/quick/items/qquicktextinput_p_p.h
@@ -150,8 +150,6 @@ public:
 #ifndef QT_NO_IM
     Qt::InputMethodHints effectiveInputMethodHints() const;
 #endif
-    void hideCursor();
-    void showCursor();
     void handleFocusEvent(QFocusEvent *event);
 
     struct MaskInputData {
diff --git a/src/quick/items/qquicktextnode.cpp b/src/quick/items/qquicktextnode.cpp
index 964dd0d4a53f4044cf04fe8ac6c8e46ba6028c62..5f246682ecd6c2e6e665f6fe8d0c1a870a2f90c4 100644
--- a/src/quick/items/qquicktextnode.cpp
+++ b/src/quick/items/qquicktextnode.cpp
@@ -179,6 +179,14 @@ void QQuickTextNode::setCursor(const QRectF &rect, const QColor &color)
     appendChildNode(m_cursorNode);
 }
 
+void QQuickTextNode::clearCursor()
+{
+    if (m_cursorNode)
+        removeChildNode(m_cursorNode);
+    delete m_cursorNode;
+    m_cursorNode = 0;
+}
+
 void QQuickTextNode::initEngine(const QColor& textColor, const QColor& selectedTextColor, const QColor& selectionColor, const QColor& anchorColor, const QPointF &position)
 {
     m_engine.reset(new QQuickTextNodeEngine);
diff --git a/src/quick/items/qquicktextnode_p.h b/src/quick/items/qquicktextnode_p.h
index fef17ae8e80f46094103e212a75e3f8f23c7454b..7f9cd77152e5cdd23b39ee368233436af00fd416 100644
--- a/src/quick/items/qquicktextnode_p.h
+++ b/src/quick/items/qquicktextnode_p.h
@@ -88,6 +88,7 @@ public:
                          int selectionStart = -1, int selectionEnd = -1);
 
     void setCursor(const QRectF &rect, const QColor &color);
+    void clearCursor();
     QSGRectangleNode *cursorNode() const { return m_cursorNode; }
 
     QSGGlyphNode *addGlyphs(const QPointF &position, const QGlyphRun &glyphs, const QColor &color,