diff --git a/src/plugins/qmljseditor/qmloutlinemodel.cpp b/src/plugins/qmljseditor/qmloutlinemodel.cpp
index 92bec0cee7a2aed7637225f4f21fdb6d1aa50de1..81919094bac880f300e51847b5d427fd5156deff 100644
--- a/src/plugins/qmljseditor/qmloutlinemodel.cpp
+++ b/src/plugins/qmljseditor/qmloutlinemodel.cpp
@@ -264,11 +264,15 @@ QMimeData *QmlOutlineModel::mimeData(const QModelIndexList &indexes) const
     QDataStream stream(&encoded, QIODevice::WriteOnly);
     stream << indexes.size();
 
-    // We store pointers to the QmlOutlineItems dropped.
-    // This works because we're only supporting drag&drop inside the model
     for (int i = 0; i < indexes.size(); ++i) {
-        QmlOutlineItem *item = static_cast<QmlOutlineItem*>(itemFromIndex(indexes.at(i)));
-        stream << (quint64)item;
+        QModelIndex index = indexes.at(i);
+
+        QList<int> rowPath;
+        for (QModelIndex i = index; i.isValid(); i = i.parent()) {
+            rowPath.prepend(i.row());
+        }
+
+        stream << rowPath;
     }
     data->setData(format, encoded);
     return data;
@@ -302,14 +306,23 @@ bool QmlOutlineModel::dropMimeData(const QMimeData *data, Qt::DropAction action,
     stream >> indexSize;
     QList<QmlOutlineItem*> itemsToMove;
     for (int i = 0; i < indexSize; ++i) {
-        quint64 itemPtr;
-        stream >> itemPtr;
-        itemsToMove << reinterpret_cast<QmlOutlineItem*>(itemPtr);
+        QList<int> rowPath;
+        stream >> rowPath;
+
+        QModelIndex index;
+        foreach (int row, rowPath) {
+            index = this->index(row, 0, index);
+            if (!index.isValid())
+                continue;
+        }
+
+        itemsToMove << static_cast<QmlOutlineItem*>(itemFromIndex(index));
     }
 
     QmlOutlineItem *targetItem = static_cast<QmlOutlineItem*>(itemFromIndex(parent));
     reparentNodes(targetItem, row, itemsToMove);
-    // Prevent view from calling insertRow(), removeRow() on it's own
+
+    // Prevent view from calling removeRow() on it's own
     return false;
 }