diff --git a/src/qml/compiler/qqmltypecompiler.cpp b/src/qml/compiler/qqmltypecompiler.cpp
index e2636a57c32039c77ae2921dbb4d4426345965b1..b8ada7ceaf8f2f22bb759a9363cd73b687f5a3a8 100644
--- a/src/qml/compiler/qqmltypecompiler.cpp
+++ b/src/qml/compiler/qqmltypecompiler.cpp
@@ -277,12 +277,12 @@ bool QQmlTypeCompiler::compile()
                 if (qmlType->parserStatusCast() != -1)
                     ++parserStatusCount;
             }
+            ++objectCount;
             if (typeRef->component) {
                 bindingCount += typeRef->component->totalBindingsCount;
                 parserStatusCount += typeRef->component->totalParserStatusCount;
                 objectCount += typeRef->component->totalObjectCount;
-            } else
-                ++objectCount;
+            }
         }
     }
 
diff --git a/src/qml/qml/qqmldata_p.h b/src/qml/qml/qqmldata_p.h
index 93060e97fb5f6c6e801177d00e549684c2cb7e8b..e3e14347464a9dfc144fbc8b3fd7903e7d3b8b2f 100644
--- a/src/qml/qml/qqmldata_p.h
+++ b/src/qml/qml/qqmldata_p.h
@@ -239,7 +239,7 @@ bool QQmlData::wasDeleted(QObject *object)
         return true;
 
     QObjectPrivate *priv = QObjectPrivate::get(object);
-    if (priv->wasDeleted)
+    if (!priv || priv->wasDeleted)
         return true;
 
     return priv->declarativeData &&
diff --git a/src/qml/qml/qqmlobjectcreator.cpp b/src/qml/qml/qqmlobjectcreator.cpp
index 9501b705ba29f93569b6d6c336cf28e5a4e596e3..72920f1ae24b6d8ca810e8ca79b9e3c9ff5cbc59 100644
--- a/src/qml/qml/qqmlobjectcreator.cpp
+++ b/src/qml/qml/qqmlobjectcreator.cpp
@@ -96,6 +96,7 @@ QQmlObjectCreator::QQmlObjectCreator(QQmlContextData *parentContext, QQmlCompile
     sharedState->allCreatedBindings.allocate(compiledData->totalBindingsCount);
     sharedState->allParserStatusCallbacks.allocate(compiledData->totalParserStatusCount);
     sharedState->allCreatedObjects.allocate(compiledData->totalObjectCount);
+    sharedState->allJavaScriptObjects = 0;
     sharedState->creationContext = creationContext;
     sharedState->rootContext = 0;
 
@@ -195,6 +196,13 @@ QObject *QQmlObjectCreator::create(int subComponentIndex, QObject *parent, QQmlI
         sharedState->rootContext->isRootObjectInCreation = true;
     }
 
+    QV4::ExecutionEngine *v4 = QV8Engine::getV4(engine);
+    QV4::Scope scope(v4);
+
+    Q_ASSERT(sharedState->allJavaScriptObjects || topLevelCreator);
+    if (topLevelCreator)
+        sharedState->allJavaScriptObjects = scope.alloc(compiledData->totalObjectCount);
+
     QVector<QQmlContextData::ObjectIdMapping> mapping(objectIndexToId.count());
     for (QHash<int, int>::ConstIterator it = objectIndexToId.constBegin(), end = objectIndexToId.constEnd();
          it != end; ++it) {
@@ -208,8 +216,6 @@ QObject *QQmlObjectCreator::create(int subComponentIndex, QObject *parent, QQmlI
     context->setIdPropertyData(mapping);
 
     if (subComponentIndex == -1) {
-        QV4::ExecutionEngine *v4 = QV8Engine::getV4(engine);
-        QV4::Scope scope(v4);
         QV4::ScopedObject scripts(scope, v4->newArrayObject(compiledData->scripts.count()));
         context->importedScripts = scripts;
         for (int i = 0; i < compiledData->scripts.count(); ++i) {
@@ -230,6 +236,9 @@ QObject *QQmlObjectCreator::create(int subComponentIndex, QObject *parent, QQmlI
         ddata->compiledData->addref();
     }
 
+    if (topLevelCreator)
+        sharedState->allJavaScriptObjects = 0;
+
     phase = CreatingObjectsPhase2;
 
     if (interrupt && interrupt->shouldInterrupt())
@@ -258,8 +267,11 @@ bool QQmlObjectCreator::populateDeferredProperties(QObject *instance)
 
     QV4::ExecutionEngine *v4 = QV8Engine::getV4(engine);
     QV4::Scope valueScope(v4);
-    QV4::ScopedValue scopeObjectProtector(valueScope, declarativeData->jsWrapper.value());
-    Q_UNUSED(scopeObjectProtector);
+
+    Q_ASSERT(topLevelCreator);
+    Q_ASSERT(!sharedState->allJavaScriptObjects);
+    sharedState->allJavaScriptObjects = valueScope.alloc(compiledData->totalObjectCount);
+
     QV4::ScopedObject qmlScope(valueScope, QV4::QmlContextWrapper::qmlScope(QV8Engine::get(engine), context, _scopeObject));
     QV4::Scoped<QV4::QmlBindingWrapper> qmlBindingWrapper(valueScope, v4->memoryManager->alloc<QV4::QmlBindingWrapper>(v4->rootContext, qmlScope));
     QV4::ExecutionContext *qmlContext = qmlBindingWrapper->context();
@@ -1159,9 +1171,12 @@ QObject *QQmlObjectCreator::createInstance(int index, QObject *parent, bool isCo
     qSwap(_scopeObject, scopeObject);
 
     QV4::ExecutionEngine *v4 = QV8Engine::getV4(engine);
+
+    Q_ASSERT(sharedState->allJavaScriptObjects);
+    QV4::ValueRef ref = QV4::ValueRef::fromRawValue(sharedState->allJavaScriptObjects++);
+    ref = QV4::QObjectWrapper::wrap(v4, instance);
+
     QV4::Scope valueScope(v4);
-    QV4::ScopedValue scopeObjectProtector(valueScope, ddata ? ddata->jsWrapper.value() : 0);
-    Q_UNUSED(scopeObjectProtector);
     QV4::ScopedObject qmlScope(valueScope, QV4::QmlContextWrapper::qmlScope(QV8Engine::get(engine), context, _scopeObject));
     QV4::Scoped<QV4::QmlBindingWrapper> qmlBindingWrapper(valueScope, v4->memoryManager->alloc<QV4::QmlBindingWrapper>(v4->rootContext, qmlScope));
     QV4::ExecutionContext *qmlContext = qmlBindingWrapper->context();
diff --git a/src/qml/qml/qqmlobjectcreator_p.h b/src/qml/qml/qqmlobjectcreator_p.h
index ad2d67624f0cc15f4363fbb3aae13affb6526c84..fb4d71d0540981b2e5aeafde01b5ccb23db10437 100644
--- a/src/qml/qml/qqmlobjectcreator_p.h
+++ b/src/qml/qml/qqmlobjectcreator_p.h
@@ -64,6 +64,7 @@ struct QQmlObjectCreatorSharedState : public QSharedData
     QFiniteStack<QQmlAbstractBinding*> allCreatedBindings;
     QFiniteStack<QQmlParserStatus*> allParserStatusCallbacks;
     QFiniteStack<QObject*> allCreatedObjects;
+    QV4::Value *allJavaScriptObjects; // pointer to vector on JS stack to reference JS wrappers during creation phase.
     QQmlComponentAttached *componentAttached;
     QList<QQmlEnginePrivate::FinalizeCallback> finalizeCallbacks;
     QQmlVmeProfiler profiler;
diff --git a/src/quick/items/qquickflickable.cpp b/src/quick/items/qquickflickable.cpp
index 3f072359d281333fc7433ad960db97551dd69e9b..ce2cedb7fc3ab9bd2b4acde126ac284e22fbd294 100644
--- a/src/quick/items/qquickflickable.cpp
+++ b/src/quick/items/qquickflickable.cpp
@@ -763,15 +763,8 @@ void QQuickFlickable::setInteractive(bool interactive)
     Q_D(QQuickFlickable);
     if (interactive != d->interactive) {
         d->interactive = interactive;
-        if (!interactive && (d->hData.flicking || d->vData.flicking)) {
-            d->clearTimeline();
-            d->hData.vTime = d->vData.vTime = d->timeline.time();
-            d->hData.flicking = false;
-            d->vData.flicking = false;
-            emit flickingChanged();
-            emit flickingHorizontallyChanged();
-            emit flickingVerticallyChanged();
-            emit flickEnded();
+        if (!interactive) {
+            d->cancelInteraction();
         }
         emit interactiveChanged();
     }
@@ -2015,18 +2008,24 @@ bool QQuickFlickable::yflick() const
 void QQuickFlickable::mouseUngrabEvent()
 {
     Q_D(QQuickFlickable);
-    if (d->pressed) {
-        // if our mouse grab has been removed (probably by another Flickable),
-        // fix our state
-        d->clearDelayedPress();
-        d->pressed = false;
-        d->draggingEnding();
-        d->stealMouse = false;
-        setKeepMouseGrab(false);
-        d->fixupX();
-        d->fixupY();
-        if (!d->isViewMoving())
-            movementEnding();
+    // if our mouse grab has been removed (probably by another Flickable),
+    // fix our state
+    d->cancelInteraction();
+}
+
+void QQuickFlickablePrivate::cancelInteraction()
+{
+    Q_Q(QQuickFlickable);
+    if (pressed) {
+        clearDelayedPress();
+        pressed = false;
+        draggingEnding();
+        stealMouse = false;
+        q->setKeepMouseGrab(false);
+        fixupX();
+        fixupY();
+        if (!isViewMoving())
+            q->movementEnding();
     }
 }
 
diff --git a/src/quick/items/qquickflickable_p_p.h b/src/quick/items/qquickflickable_p_p.h
index 33a642eb695ecb238419cceaaa0780ce7b78bb9b..13af2e055c6a2f68085b35fb71db8ea4170de5ea 100644
--- a/src/quick/items/qquickflickable_p_p.h
+++ b/src/quick/items/qquickflickable_p_p.h
@@ -200,6 +200,8 @@ public:
 
     bool isViewMoving() const;
 
+    void cancelInteraction();
+
 public:
     QQuickItem *contentItem;
 
diff --git a/src/quick/items/qquickmousearea_p.h b/src/quick/items/qquickmousearea_p.h
index d303852311472a326475e15b99fb2ec96061fe6f..5dcb6b46a400a007257d247aac184ecf823e3f40 100644
--- a/src/quick/items/qquickmousearea_p.h
+++ b/src/quick/items/qquickmousearea_p.h
@@ -144,25 +144,25 @@ protected:
     bool setPressed(Qt::MouseButton button, bool);
     bool sendMouseEvent(QMouseEvent *event);
 
-    virtual void mousePressEvent(QMouseEvent *event);
-    virtual void mouseReleaseEvent(QMouseEvent *event);
-    virtual void mouseDoubleClickEvent(QMouseEvent *event);
-    virtual void mouseMoveEvent(QMouseEvent *event);
-    virtual void mouseUngrabEvent();
-    virtual void hoverEnterEvent(QHoverEvent *event);
-    virtual void hoverMoveEvent(QHoverEvent *event);
-    virtual void hoverLeaveEvent(QHoverEvent *event);
+    void mousePressEvent(QMouseEvent *event) Q_DECL_OVERRIDE;
+    void mouseReleaseEvent(QMouseEvent *event) Q_DECL_OVERRIDE;
+    void mouseDoubleClickEvent(QMouseEvent *event) Q_DECL_OVERRIDE;
+    void mouseMoveEvent(QMouseEvent *event) Q_DECL_OVERRIDE;
+    void mouseUngrabEvent() Q_DECL_OVERRIDE;
+    void hoverEnterEvent(QHoverEvent *event) Q_DECL_OVERRIDE;
+    void hoverMoveEvent(QHoverEvent *event) Q_DECL_OVERRIDE;
+    void hoverLeaveEvent(QHoverEvent *event) Q_DECL_OVERRIDE;
 #ifndef QT_NO_WHEELEVENT
-    virtual void wheelEvent(QWheelEvent *event);
+    void wheelEvent(QWheelEvent *event) Q_DECL_OVERRIDE;
 #endif
-    virtual bool childMouseEventFilter(QQuickItem *i, QEvent *e);
-    virtual void timerEvent(QTimerEvent *event);
-    virtual void windowDeactivateEvent();
-
-    virtual void geometryChanged(const QRectF &newGeometry,
-                                 const QRectF &oldGeometry);
-    virtual void itemChange(ItemChange change, const ItemChangeData& value);
-    virtual QSGNode *updatePaintNode(QSGNode *, UpdatePaintNodeData *);
+    bool childMouseEventFilter(QQuickItem *i, QEvent *e) Q_DECL_OVERRIDE;
+    void timerEvent(QTimerEvent *event) Q_DECL_OVERRIDE;
+    void windowDeactivateEvent() Q_DECL_OVERRIDE;
+
+    void geometryChanged(const QRectF &newGeometry,
+                                 const QRectF &oldGeometry) Q_DECL_OVERRIDE;
+    void itemChange(ItemChange change, const ItemChangeData& value) Q_DECL_OVERRIDE;
+    QSGNode *updatePaintNode(QSGNode *, UpdatePaintNodeData *) Q_DECL_OVERRIDE;
 
 private:
     void handlePress();
diff --git a/src/quick/items/qquickscreen_p.h b/src/quick/items/qquickscreen_p.h
index a155ff184392719bbbb7012165384c5810ce1e02..25a1805a44091bf60ab51189aef6403b962af5b7 100644
--- a/src/quick/items/qquickscreen_p.h
+++ b/src/quick/items/qquickscreen_p.h
@@ -58,13 +58,13 @@ class Q_AUTOTEST_EXPORT QQuickScreenAttached : public QObject
 {
     Q_OBJECT
 
-    Q_PROPERTY(QString name READ name NOTIFY nameChanged REVISION 1);
+    Q_PROPERTY(QString name READ name NOTIFY nameChanged);
     Q_PROPERTY(int width READ width NOTIFY widthChanged)
     Q_PROPERTY(int height READ height NOTIFY heightChanged)
-    Q_PROPERTY(int desktopAvailableWidth READ desktopAvailableWidth NOTIFY desktopGeometryChanged REVISION 1)
-    Q_PROPERTY(int desktopAvailableHeight READ desktopAvailableHeight NOTIFY desktopGeometryChanged REVISION 1)
-    Q_PROPERTY(qreal logicalPixelDensity READ logicalPixelDensity NOTIFY logicalPixelDensityChanged REVISION 1)
-    Q_PROPERTY(qreal pixelDensity READ pixelDensity NOTIFY pixelDensityChanged REVISION 2)
+    Q_PROPERTY(int desktopAvailableWidth READ desktopAvailableWidth NOTIFY desktopGeometryChanged)
+    Q_PROPERTY(int desktopAvailableHeight READ desktopAvailableHeight NOTIFY desktopGeometryChanged)
+    Q_PROPERTY(qreal logicalPixelDensity READ logicalPixelDensity NOTIFY logicalPixelDensityChanged)
+    Q_PROPERTY(qreal pixelDensity READ pixelDensity NOTIFY pixelDensityChanged)
     Q_PROPERTY(Qt::ScreenOrientation primaryOrientation READ primaryOrientation NOTIFY primaryOrientationChanged)
     Q_PROPERTY(Qt::ScreenOrientation orientation READ orientation NOTIFY orientationChanged)
 
@@ -87,12 +87,12 @@ public:
     void windowChanged(QQuickWindow*);
 
 Q_SIGNALS:
-    Q_REVISION(1) void nameChanged();
+    void nameChanged();
     void widthChanged();
     void heightChanged();
-    Q_REVISION(1) void desktopGeometryChanged();
-    Q_REVISION(1) void logicalPixelDensityChanged();
-    Q_REVISION(2) void pixelDensityChanged();
+    void desktopGeometryChanged();
+    void logicalPixelDensityChanged();
+    void pixelDensityChanged();
     void primaryOrientationChanged();
     void orientationChanged();
 
diff --git a/src/quick/items/qquickshadereffectsource.cpp b/src/quick/items/qquickshadereffectsource.cpp
index 163ee3eada4ae7fc04b5b80b4f51f5fcd26d6b64..7603495e1b8c33076ef22ed1185a03ec1989215c 100644
--- a/src/quick/items/qquickshadereffectsource.cpp
+++ b/src/quick/items/qquickshadereffectsource.cpp
@@ -1037,7 +1037,7 @@ QSGNode *QQuickShaderEffectSource::updatePaintNode(QSGNode *oldNode, UpdatePaint
     }
 
     // Don't create the paint node if we're not spanning any area
-    if (width() == 0 || height() == 0) {
+    if (width() <= 0 || height() <= 0) {
         delete oldNode;
         return 0;
     }
diff --git a/tests/auto/qml/qqmlecmascript/testtypes.cpp b/tests/auto/qml/qqmlecmascript/testtypes.cpp
index 56e733a42383645cded4ffe3840032b50cc44a3a..c4e670995810d78a671966ab55df8e6006832605 100644
--- a/tests/auto/qml/qqmlecmascript/testtypes.cpp
+++ b/tests/auto/qml/qqmlecmascript/testtypes.cpp
@@ -338,6 +338,62 @@ static QObject *create_singletonWithEnum(QQmlEngine *, QJSEngine *)
     return new SingletonWithEnum;
 }
 
+QObjectContainer::QObjectContainer()
+    : widgetParent(0)
+    , gcOnAppend(false)
+{}
+
+QQmlListProperty<QObject> QObjectContainer::data()
+{
+    return QQmlListProperty<QObject>(this, 0, children_append, children_count, children_at, children_clear);
+}
+
+void QObjectContainer::children_append(QQmlListProperty<QObject> *prop, QObject *o)
+{
+    QObjectContainer *that = static_cast<QObjectContainer*>(prop->object);
+    that->dataChildren.append(o);
+    QObject::connect(o, SIGNAL(destroyed(QObject*)), prop->object, SLOT(childDestroyed(QObject*)));
+
+    if (that->gcOnAppend) {
+        QQmlEngine *engine = qmlEngine(that);
+        engine->collectGarbage();
+        QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete);
+        QCoreApplication::processEvents();
+    }
+}
+
+int QObjectContainer::children_count(QQmlListProperty<QObject> *prop)
+{
+    return static_cast<QObjectContainer*>(prop->object)->dataChildren.count();
+}
+
+QObject *QObjectContainer::children_at(QQmlListProperty<QObject> *prop, int index)
+{
+    return static_cast<QObjectContainer*>(prop->object)->dataChildren.at(index);
+}
+
+void QObjectContainer::children_clear(QQmlListProperty<QObject> *prop)
+{
+    QObjectContainer *that = static_cast<QObjectContainer*>(prop->object);
+    foreach (QObject *c, that->dataChildren)
+        QObject::disconnect(c, SIGNAL(destroyed(QObject*)), that, SLOT(childDestroyed(QObject*)));
+    that->dataChildren.clear();
+}
+
+void QObjectContainer::childDestroyed(QObject *child) {
+    dataChildren.removeAll(child);
+}
+
+void FloatingQObject::classBegin()
+{
+    setParent(0);
+}
+
+void FloatingQObject::componentComplete()
+{
+    Q_ASSERT(!parent());
+}
+
 void registerTypes()
 {
     qmlRegisterType<MyQmlObject>("Qt.test", 1,0, "MyQmlObjectAlias");
@@ -422,6 +478,10 @@ void registerTypes()
     qmlRegisterSingletonType<testImportOrderApi>("Qt.test.importOrderApi2",1,0,"Data",testImportOrder_api2);
 
     qmlRegisterSingletonType<SingletonWithEnum>("Qt.test.singletonWithEnum", 1, 0, "SingletonWithEnum", create_singletonWithEnum);
+
+    qmlRegisterType<QObjectContainer>("Qt.test", 1, 0, "QObjectContainer");
+    qmlRegisterType<QObjectContainerWithGCOnAppend>("Qt.test", 1, 0, "QObjectContainerWithGCOnAppend");
+    qmlRegisterType<FloatingQObject>("Qt.test", 1, 0, "FloatingQObject");
 }
 
 #include "testtypes.moc"
diff --git a/tests/auto/qml/qqmlecmascript/testtypes.h b/tests/auto/qml/qqmlecmascript/testtypes.h
index 928d594f62eaae43dca9e424d4c70fc38a98cee5..d5a1220f23eadcbccda4e970138b07c22bea3fd0 100644
--- a/tests/auto/qml/qqmlecmascript/testtypes.h
+++ b/tests/auto/qml/qqmlecmascript/testtypes.h
@@ -1661,6 +1661,51 @@ public:
     };
 };
 
+// Like QtObject, but with default property
+class QObjectContainer : public QObject
+{
+    Q_OBJECT
+    Q_CLASSINFO("DefaultProperty", "data")
+    Q_PROPERTY(QQmlListProperty<QObject> data READ data DESIGNABLE false)
+public:
+    QObjectContainer();
+
+    QQmlListProperty<QObject> data();
+
+    static void children_append(QQmlListProperty<QObject> *prop, QObject *o);
+    static int children_count(QQmlListProperty<QObject> *prop);
+    static QObject *children_at(QQmlListProperty<QObject> *prop, int index);
+    static void children_clear(QQmlListProperty<QObject> *prop);
+
+    QList<QObject*> dataChildren;
+    QWidget *widgetParent;
+    bool gcOnAppend;
+
+protected slots:
+    void childDestroyed(QObject *child);
+};
+
+class QObjectContainerWithGCOnAppend : public QObjectContainer
+{
+    Q_OBJECT
+public:
+    QObjectContainerWithGCOnAppend()
+    {
+        gcOnAppend = true;
+    }
+};
+
+class FloatingQObject : public QObject, public QQmlParserStatus
+{
+    Q_OBJECT
+    Q_INTERFACES(QQmlParserStatus)
+public:
+    FloatingQObject() {}
+
+    virtual void classBegin();
+    virtual void componentComplete();
+};
+
 void registerTypes();
 
 #endif // TESTTYPES_H
diff --git a/tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp b/tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp
index d0685847977ad451c4e660b5b816546d1876d85c..6b37163b4051e17c85928d9078c1addd8be4a039 100644
--- a/tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp
+++ b/tests/auto/qml/qqmlecmascript/tst_qqmlecmascript.cpp
@@ -324,6 +324,7 @@ private slots:
     void varPropertyAccessOnObjectWithInvalidContext();
     void importedScriptsAccessOnObjectWithInvalidContext();
     void contextObjectOnLazyBindings();
+    void garbageCollectionDuringCreation();
 
 private:
 //    static void propertyVarWeakRefCallback(v8::Persistent<v8::Value> object, void* parameter);
@@ -7637,6 +7638,33 @@ void tst_qqmlecmascript::contextObjectOnLazyBindings()
     QCOMPARE(subObject->property("testValue").toInt(), int(42));
 }
 
+void tst_qqmlecmascript::garbageCollectionDuringCreation()
+{
+    QQmlComponent component(&engine);
+    component.setData("import Qt.test 1.0\n"
+                      "QObjectContainerWithGCOnAppend {\n"
+                      "    objectName: \"root\"\n"
+                      "    FloatingQObject {\n"
+                      "        objectName: \"parentLessChild\"\n"
+                      "        property var blah;\n" // Ensure we have JS wrapper
+                      "    }\n"
+                      "}\n",
+                      QUrl());
+
+    QScopedPointer<QObject> object(component.create());
+    QVERIFY(!object.isNull());
+
+    QObjectContainer *container = qobject_cast<QObjectContainer*>(object.data());
+    QCOMPARE(container->dataChildren.count(), 1);
+
+    QObject *child = container->dataChildren.first();
+    QQmlData *ddata = QQmlData::get(child);
+    QVERIFY(!ddata->jsWrapper.isNullOrUndefined());
+
+    gc(engine);
+    QCOMPARE(container->dataChildren.count(), 0);
+}
+
 QTEST_MAIN(tst_qqmlecmascript)
 
 #include "tst_qqmlecmascript.moc"
diff --git a/tests/auto/qmltest/listview/tst_listview.qml b/tests/auto/qmltest/listview/tst_listview.qml
index 03be57909f1293b4ffa7006aa1f6992807c0faf8..069b62a7261fce5014304e939459f0245c92800f 100644
--- a/tests/auto/qmltest/listview/tst_listview.qml
+++ b/tests/auto/qmltest/listview/tst_listview.qml
@@ -108,6 +108,33 @@ Item {
         property int createdDelegates: 0
     }
 
+    ListView
+    {
+        id: listInteractiveCurrentIndexEnforce
+        width: 600
+        height: 600
+
+        snapMode: ListView.SnapOneItem
+        orientation: ListView.Horizontal
+        interactive: !currentItem.moving
+        highlightRangeMode: ListView.StrictlyEnforceRange
+
+        model: 4
+
+        focus: true
+        Keys.onPressed: if (event.key == Qt.Key_K) currentIndex = currentIndex + 1;
+
+        delegate: Flickable {
+            width: 600
+            height: 600
+            contentWidth: 600
+            contentHeight: 1200
+
+            MouseArea { anchors.fill: parent }
+            Rectangle { anchors.fill: parent; color: index == 0 ? "red" : index == 1 ? "green" : index == 2 ? "blue" : "white" }
+        }
+    }
+
     Component {
         id: delegateModelAfterCreateComponent
         Rectangle {
@@ -272,5 +299,19 @@ Item {
             listViewDelegateModelAfterCreate.model = 40;
             verify(listViewDelegateModelAfterCreate.createdDelegates > 0);
         }
+
+        function test_listInteractiveCurrentIndexEnforce() {
+            mousePress(listInteractiveCurrentIndexEnforce, 10, 50);
+            mouseMove(listInteractiveCurrentIndexEnforce, 10, 40);
+            mouseMove(listInteractiveCurrentIndexEnforce, 10, 30);
+            mouseMove(listInteractiveCurrentIndexEnforce, 10, 20);
+            mouseMove(listInteractiveCurrentIndexEnforce, 10, 10);
+            compare(listInteractiveCurrentIndexEnforce.interactive, false);
+            mouseRelease(listInteractiveCurrentIndexEnforce, 10, 10);
+            tryCompare(listInteractiveCurrentIndexEnforce, "interactive", true);
+            keyClick("k");
+            compare(listInteractiveCurrentIndexEnforce.currentIndex, 1);
+            tryCompare(listInteractiveCurrentIndexEnforce, "contentX", listInteractiveCurrentIndexEnforce.width);
+        }
     }
 }