diff --git a/src/qml/types/qqmldelegatemodel.cpp b/src/qml/types/qqmldelegatemodel.cpp
index be479ee..6f0e369 100644
--- a/src/qml/types/qqmldelegatemodel.cpp
+++ b/src/qml/types/qqmldelegatemodel.cpp
@@ -40,6 +40,7 @@
 ****************************************************************************/
 
 #include "qqmldelegatemodel_p_p.h"
+#include <QtCore/qdatetime.h>
 
 #include <QtQml/qqmlinfo.h>
 
@@ -1521,9 +1522,76 @@ void QQmlDelegateModel::_q_dataChanged(const QModelIndex &begin, const QModelInd
         _q_itemsChanged(begin.row(), end.row() - begin.row() + 1, roles);
 }
 
-void QQmlDelegateModel::_q_layoutChanged()
+bool QQmlDelegateModel::isDescendantOf(const QPersistentModelIndex &desc, const QList<QPersistentModelIndex> &parents)
 {
-    _q_modelReset();
+    if (parents.contains(QModelIndex()))
+      return true;
+
+    for (int i = 0, c = parents.count(); i < c; ++i) {
+      for (QPersistentModelIndex parent = desc; parent.isValid(); parent = parent.parent()) {
+        if (parent == parents[i])
+          return true;
+      }
+    }
+
+    return false;
+}
+
+void QQmlDelegateModel::_q_layoutAboutToBeChanged(const QList<QPersistentModelIndex> &parents, QAbstractItemModel::LayoutChangeHint hint)
+{
+    Q_D(QQmlDelegateModel);
+    if (!d->m_complete)
+        return;
+
+    if (hint == QAbstractItemModel::VerticalSortHint) {
+        d->m_storedPersistentIndexes.clear();
+        if (!parents.isEmpty() && !isDescendantOf(d->m_adaptorModel.rootIndex, parents)) {
+            return;
+        }
+
+        for (int i = 0; i < d->m_count; ++i) {
+            const QModelIndex index = d->m_adaptorModel.aim()->index(i, 0, d->m_adaptorModel.rootIndex);
+            d->m_storedPersistentIndexes.append(index);
+        }
+    } else if (hint == QAbstractItemModel::HorizontalSortHint) {
+        // Ignored
+    } else {
+        // Triggers model reset, no preparations for that are needed
+    }
+}
+
+void QQmlDelegateModel::_q_layoutChanged(const QList<QPersistentModelIndex> &parents, QAbstractItemModel::LayoutChangeHint hint)
+{
+    Q_D(QQmlDelegateModel);
+    if (!d->m_complete)
+        return;
+
+    if (hint == QAbstractItemModel::VerticalSortHint) {
+        if (!parents.isEmpty() && !isDescendantOf(d->m_adaptorModel.rootIndex, parents)) {
+            return;
+        }
+
+        for (int i = 0, c = d->m_storedPersistentIndexes.count(); i < c; ++i) {
+            const QPersistentModelIndex &index = d->m_storedPersistentIndexes.at(i);
+            if (i == index.row())
+                continue;
+
+            _q_itemsMoved(i, index.row(), 1);
+        }
+
+        d->m_storedPersistentIndexes.clear();
+
+        // layoutUpdate does not necessarily have any move changes, but it can
+        // also mean data changes. We can't detect what exactly has changed, so
+        // just emit it for all items
+        _q_itemsChanged(0, d->m_count, QVector<int>());
+
+    } else if (hint == QAbstractItemModel::HorizontalSortHint) {
+        // Ignored
+    } else {
+        // We don't know what's going on, so reset the model
+        _q_modelReset();
+    }
 }
 
 QQmlDelegateModelAttached *QQmlDelegateModel::qmlAttachedProperties(QObject *obj)
diff --git a/src/qml/types/qqmldelegatemodel_p.h b/src/qml/types/qqmldelegatemodel_p.h
index 51f846e..cba012c 100644
--- a/src/qml/types/qqmldelegatemodel_p.h
+++ b/src/qml/types/qqmldelegatemodel_p.h
@@ -139,9 +139,12 @@ private Q_SLOTS:
     void _q_rowsRemoved(const QModelIndex &,int,int);
     void _q_rowsMoved(const QModelIndex &, int, int, const QModelIndex &, int);
     void _q_dataChanged(const QModelIndex&,const QModelIndex&,const QVector<int> &);
-    void _q_layoutChanged();
+    void _q_layoutAboutToBeChanged(const QList<QPersistentModelIndex>&, QAbstractItemModel::LayoutChangeHint);
+    void _q_layoutChanged(const QList<QPersistentModelIndex>&, QAbstractItemModel::LayoutChangeHint);
 
 private:
+    bool isDescendantOf(const QPersistentModelIndex &desc, const QList<QPersistentModelIndex> &parents);
+
     Q_DISABLE_COPY(QQmlDelegateModel)
 };
 
diff --git a/src/qml/types/qqmldelegatemodel_p_p.h b/src/qml/types/qqmldelegatemodel_p_p.h
index 7da089c..d64f641 100644
--- a/src/qml/types/qqmldelegatemodel_p_p.h
+++ b/src/qml/types/qqmldelegatemodel_p_p.h
@@ -331,6 +331,8 @@ public:
         };
         QQmlDelegateModelGroup *m_groups[Compositor::MaximumGroupCount];
     };
+
+    QList<QPersistentModelIndex> m_storedPersistentIndexes;
 };
 
 class QQmlPartsModel : public QQmlInstanceModel, public QQmlDelegateModelGroupEmitter
diff --git a/src/qml/util/qqmladaptormodel.cpp b/src/qml/util/qqmladaptormodel.cpp
index d38e5ac..c1c8bfa 100644
--- a/src/qml/util/qqmladaptormodel.cpp
+++ b/src/qml/util/qqmladaptormodel.cpp
@@ -467,8 +467,10 @@ public:
                                 vdm, SLOT(_q_rowsMoved(QModelIndex,int,int,QModelIndex,int)));
             QObject::disconnect(aim, SIGNAL(modelReset()),
                                 vdm, SLOT(_q_modelReset()));
-            QObject::disconnect(aim, SIGNAL(layoutChanged()),
-                                vdm, SLOT(_q_layoutChanged()));
+            QObject::disconnect(aim, SIGNAL(layoutAboutToBeChanged(QList<QPersistentModelIndex>,QAbstractItemModel::LayoutChangeHint)),
+                                vdm, SLOT(_q_layoutAboutToBeChanged(QList<QPersistentModelIndex>,QAbstractItemModel::LayoutChangeHint)));
+            QObject::disconnect(aim, SIGNAL(layoutChanged(QList<QPersistentModelIndex>,QAbstractItemModel::LayoutChangeHint)),
+                                vdm, SLOT(_q_layoutChanged(QList<QPersistentModelIndex>,QAbstractItemModel::LayoutChangeHint)));
         }
 
         const_cast<VDMAbstractItemModelDataType *>(this)->release();
@@ -920,8 +922,10 @@ void QQmlAdaptorModel::setModel(const QVariant &variant, QQmlDelegateModel *vdm,
                               vdm, QQmlDelegateModel, SLOT(_q_rowsMoved(QModelIndex,int,int,QModelIndex,int)));
             qmlobject_connect(model, QAbstractItemModel, SIGNAL(modelReset()),
                               vdm, QQmlDelegateModel, SLOT(_q_modelReset()));
-            qmlobject_connect(model, QAbstractItemModel, SIGNAL(layoutChanged()),
-                              vdm, QQmlDelegateModel, SLOT(_q_layoutChanged()));
+            qmlobject_connect(model, QAbstractItemModel, SIGNAL(layoutAboutToBeChanged(QList<QPersistentModelIndex>,QAbstractItemModel::LayoutChangeHint)),
+                              vdm, QQmlDelegateModel, SLOT(_q_layoutAboutToBeChanged(QList<QPersistentModelIndex>,QAbstractItemModel::LayoutChangeHint)));
+            qmlobject_connect(model, QAbstractItemModel, SIGNAL(layoutChanged(QList<QPersistentModelIndex>,QAbstractItemModel::LayoutChangeHint)),
+                              vdm, QQmlDelegateModel, SLOT(_q_layoutChanged(QList<QPersistentModelIndex>,QAbstractItemModel::LayoutChangeHint)));
         } else {
             accessors = new VDMObjectDelegateDataType;
         }
