diff --git a/tests/auto/quick/qquicktextedit/data/RemoteCursor.qml b/tests/auto/quick/qquicktextedit/data/RemoteCursor.qml
new file mode 100644
index 0000000000000000000000000000000000000000..7f459f5cc4dcd1f977c693ef2f888a318880b317
--- /dev/null
+++ b/tests/auto/quick/qquicktextedit/data/RemoteCursor.qml
@@ -0,0 +1,5 @@
+import QtQuick 2.0
+
+Rectangle {
+    objectName: "cursorInstance"
+}
diff --git a/tests/auto/quick/qquicktextedit/data/cursorTestRemote.qml b/tests/auto/quick/qquicktextedit/data/cursorTestRemote.qml
new file mode 100644
index 0000000000000000000000000000000000000000..77e070d151272bb8ee9bfe812975bec618b8b724
--- /dev/null
+++ b/tests/auto/quick/qquicktextedit/data/cursorTestRemote.qml
@@ -0,0 +1,13 @@
+import QtQuick 2.0
+
+Rectangle { width: 300; height: 300; color: "white"
+    property string contextualProperty: "Hello"
+    TextEdit {
+        text: "Hello world!"
+        id: textEditObject;
+        objectName: "textEditObject"
+        width: 300; height: 300
+        wrapMode: TextEdit.WordWrap
+        cursorDelegate: contextDelegate
+    }
+}
diff --git a/tests/auto/quick/qquicktextedit/tst_qquicktextedit.cpp b/tests/auto/quick/qquicktextedit/tst_qquicktextedit.cpp
index 61c2df2e2766bc469d8393b5603e44c44800edc9..26d64e72d49fb5c86f7f7e90e65a5911095391c1 100644
--- a/tests/auto/quick/qquicktextedit/tst_qquicktextedit.cpp
+++ b/tests/auto/quick/qquicktextedit/tst_qquicktextedit.cpp
@@ -68,6 +68,8 @@
 #include <Carbon/Carbon.h>
 #endif
 
+#define SERVER_PORT 42332
+#define SERVER_ADDR "http://localhost:42332"
 
 Q_DECLARE_METATYPE(QQuickTextEdit::SelectionMode)
 Q_DECLARE_METATYPE(Qt::Key)
@@ -138,6 +140,7 @@ private slots:
 
     void cursorDelegate_data();
     void cursorDelegate();
+    void remoteCursorDelegate();
     void cursorVisible();
     void delegateLoading_data();
     void delegateLoading();
@@ -2161,6 +2164,38 @@ void tst_qquicktextedit::cursorDelegate()
     QVERIFY(!textEditObject->findChild<QQuickItem*>("cursorInstance"));
 }
 
+void tst_qquicktextedit::remoteCursorDelegate()
+{
+    TestHTTPServer server(SERVER_PORT);
+    server.serveDirectory(dataDirectory());
+
+    QQuickView view;
+
+    QQmlComponent component(view.engine(), QUrl(SERVER_ADDR "/RemoteCursor.qml"));
+
+    view.rootContext()->setContextProperty("contextDelegate", &component);
+    view.setSource(testFileUrl("cursorTestRemote.qml"));
+    view.show();
+    view.requestActivateWindow();
+    QQuickTextEdit *textEditObject = view.rootObject()->findChild<QQuickTextEdit*>("textEditObject");
+    QVERIFY(textEditObject != 0);
+
+    // Delegate is created on demand, and so won't be available immediately.  Focus in or
+    // setCursorVisible(true) will trigger creation.
+    QTRY_VERIFY(!textEditObject->findChild<QQuickItem*>("cursorInstance"));
+    QVERIFY(!textEditObject->isCursorVisible());
+
+    textEditObject->setFocus(true);
+    QVERIFY(textEditObject->isCursorVisible());
+
+    QCOMPARE(component.status(), QQmlComponent::Loading);
+    QVERIFY(!textEditObject->findChild<QQuickItem*>("cursorInstance"));
+
+    // Wait for component to load.
+    QTRY_COMPARE(component.status(), QQmlComponent::Ready);
+    QVERIFY(textEditObject->findChild<QQuickItem*>("cursorInstance"));
+}
+
 void tst_qquicktextedit::cursorVisible()
 {
     QQuickTextEdit edit;
@@ -2270,12 +2305,12 @@ void tst_qquicktextedit::delegateLoading()
     QFETCH(QString, qmlfile);
     QFETCH(QString, error);
 
-    TestHTTPServer server(42332);
+    TestHTTPServer server(SERVER_PORT);
     server.serveDirectory(testFile("httpfail"), TestHTTPServer::Disconnect);
     server.serveDirectory(testFile("httpslow"), TestHTTPServer::Delay);
     server.serveDirectory(testFile("http"));
 
-    QQuickView view(QUrl(QLatin1String("http://localhost:42332/") + qmlfile));
+    QQuickView view(QUrl(QLatin1String(SERVER_ADDR "/") + qmlfile));
     view.show();
     view.requestActivateWindow();
 
@@ -4504,7 +4539,7 @@ void tst_qquicktextedit::embeddedImages()
     QFETCH(QUrl, qmlfile);
     QFETCH(QString, error);
 
-    TestHTTPServer server(42332);
+    TestHTTPServer server(SERVER_PORT);
     server.serveDirectory(testFile("http"));
 
     if (!error.isEmpty())
diff --git a/tests/auto/quick/qquicktextinput/data/RemoteCursor.qml b/tests/auto/quick/qquicktextinput/data/RemoteCursor.qml
new file mode 100644
index 0000000000000000000000000000000000000000..7f459f5cc4dcd1f977c693ef2f888a318880b317
--- /dev/null
+++ b/tests/auto/quick/qquicktextinput/data/RemoteCursor.qml
@@ -0,0 +1,5 @@
+import QtQuick 2.0
+
+Rectangle {
+    objectName: "cursorInstance"
+}
diff --git a/tests/auto/quick/qquicktextinput/data/cursorTestRemote.qml b/tests/auto/quick/qquicktextinput/data/cursorTestRemote.qml
new file mode 100644
index 0000000000000000000000000000000000000000..8ae872a7143de7aab711e872c868c8d0806cfc2c
--- /dev/null
+++ b/tests/auto/quick/qquicktextinput/data/cursorTestRemote.qml
@@ -0,0 +1,12 @@
+import QtQuick 2.0
+
+Rectangle { width: 300; height: 300; color: "white"
+    TextInput {
+        text: "Hello world!"
+        id: textInputObject;
+        objectName: "textInputObject"
+        width: 300; height: 300
+        wrapMode: TextInput.Wrap
+        cursorDelegate: contextDelegate
+    }
+}
diff --git a/tests/auto/quick/qquicktextinput/qquicktextinput.pro b/tests/auto/quick/qquicktextinput/qquicktextinput.pro
index 13b087eef5ac1756cede86f29b41aaf5365b6a74..76cb177c3d8cc6c0bfeffb5239a50cfedaaad51f 100644
--- a/tests/auto/quick/qquicktextinput/qquicktextinput.pro
+++ b/tests/auto/quick/qquicktextinput/qquicktextinput.pro
@@ -2,7 +2,10 @@ CONFIG += testcase
 TARGET = tst_qquicktextinput
 macx:CONFIG -= app_bundle
 
-SOURCES += tst_qquicktextinput.cpp
+SOURCES += tst_qquicktextinput.cpp \
+           ../../shared/testhttpserver.cpp
+
+HEADERS += ../../shared/testhttpserver.h
 
 include (../../shared/util.pri)
 
diff --git a/tests/auto/quick/qquicktextinput/tst_qquicktextinput.cpp b/tests/auto/quick/qquicktextinput/tst_qquicktextinput.cpp
index 4261fafec4c8a88a165169d2572e927f87db1c3f..46267673a85091359d80ba71717024854bb40c24 100644
--- a/tests/auto/quick/qquicktextinput/tst_qquicktextinput.cpp
+++ b/tests/auto/quick/qquicktextinput/tst_qquicktextinput.cpp
@@ -41,6 +41,7 @@
 #include <qtest.h>
 #include <QtTest/QSignalSpy>
 #include "../../shared/util.h"
+#include "../../shared/testhttpserver.h"
 #include <private/qinputmethod_p.h>
 #include <QtQml/qqmlengine.h>
 #include <QtQml/qqmlexpression.h>
@@ -62,6 +63,9 @@
 #include "qplatformdefs.h"
 #include "../../shared/platforminputcontext.h"
 
+#define SERVER_PORT 14460
+#define SERVER_ADDR "http://localhost:14460"
+
 Q_DECLARE_METATYPE(QQuickTextInput::SelectionMode)
 Q_DECLARE_METATYPE(QQuickTextInput::EchoMode)
 Q_DECLARE_METATYPE(Qt::Key)
@@ -142,6 +146,7 @@ private slots:
     void passwordCharacter();
     void cursorDelegate_data();
     void cursorDelegate();
+    void remoteCursorDelegate();
     void cursorVisible();
     void cursorRectangle_data();
     void cursorRectangle();
@@ -2603,6 +2608,38 @@ void tst_qquicktextinput::cursorDelegate()
     QVERIFY(!textInputObject->findChild<QQuickItem*>("cursorInstance"));
 }
 
+void tst_qquicktextinput::remoteCursorDelegate()
+{
+    TestHTTPServer server(SERVER_PORT);
+    server.serveDirectory(dataDirectory());
+
+    QQuickView view;
+
+    QQmlComponent component(view.engine(), QUrl(SERVER_ADDR "/RemoteCursor.qml"));
+
+    view.rootContext()->setContextProperty("contextDelegate", &component);
+    view.setSource(testFileUrl("cursorTestRemote.qml"));
+    view.show();
+    view.requestActivateWindow();
+    QQuickTextInput *textInputObject = view.rootObject()->findChild<QQuickTextInput*>("textInputObject");
+    QVERIFY(textInputObject != 0);
+
+    // Delegate is created on demand, and so won't be available immediately.  Focus in or
+    // setCursorVisible(true) will trigger creation.
+    QTRY_VERIFY(!textInputObject->findChild<QQuickItem*>("cursorInstance"));
+    QVERIFY(!textInputObject->isCursorVisible());
+
+    textInputObject->setFocus(true);
+    QVERIFY(textInputObject->isCursorVisible());
+
+    QCOMPARE(component.status(), QQmlComponent::Loading);
+    QVERIFY(!textInputObject->findChild<QQuickItem*>("cursorInstance"));
+
+    // Wait for component to load.
+    QTRY_COMPARE(component.status(), QQmlComponent::Ready);
+    QVERIFY(textInputObject->findChild<QQuickItem*>("cursorInstance"));
+}
+
 void tst_qquicktextinput::cursorVisible()
 {
     QQuickTextInput input;