diff -ur qtdeclarative/src/quick/items/qquickdrag_p.h qtdeclarative_new/src/quick/items/qquickdrag_p.h
--- qtdeclarative/src/quick/items/qquickdrag_p.h	2018-10-19 15:35:44.000000000 +0300
+++ qtdeclarative_new/src/quick/items/qquickdrag_p.h	2018-11-03 12:59:18.356807379 +0200
@@ -107,7 +107,7 @@
 
     void grab(QQuickItem *item) { m_items.insert(new Item(item)); }
     iterator release(iterator at) { Item *item = *at; at = at.erase(); delete item; return at; }
-
+    QIntrusiveList<QQuickDragGrabber::Item, &QQuickDragGrabber::Item::node> takeAll() { QIntrusiveList<QQuickDragGrabber::Item, &QQuickDragGrabber::Item::node> ret = m_items; m_items = m_itemsEmpty; return ret; }
 private:
+    ItemList m_itemsEmpty;
     ItemList m_items;
diff -ur qtdeclarative/src/quick/items/qquickwindow.cpp qtdeclarative_new/src/quick/items/qquickwindow.cpp
--- qtdeclarative/src/quick/items/qquickwindow.cpp	2018-10-19 15:35:44.000000000 +0300
+++ qtdeclarative_new/src/quick/items/qquickwindow.cpp	2018-11-03 13:04:57.025905461 +0200
@@ -2701,31 +2701,39 @@
             for (; grabItem != grabber->end(); grabItem = grabber->release(grabItem))
                 QCoreApplication::sendEvent(**grabItem, &leaveEvent);
             return;
-        } else for (; grabItem != grabber->end(); grabItem = grabber->release(grabItem)) {
+        } else {
             QDragMoveEvent *moveEvent = static_cast<QDragMoveEvent *>(event);
-            if (deliverDragEvent(grabber, **grabItem, moveEvent)) {
-                for (++grabItem; grabItem != grabber->end();) {
-                    QPointF p = (**grabItem)->mapFromScene(moveEvent->pos());
-                    if ((**grabItem)->contains(p)) {
-                        QDragMoveEvent translatedEvent(
-                                p.toPoint(),
-                                moveEvent->possibleActions(),
-                                moveEvent->mimeData(),
-                                moveEvent->mouseButtons(),
-                                moveEvent->keyboardModifiers());
-                        QQuickDropEventEx::copyActions(&translatedEvent, *moveEvent);
-                        QCoreApplication::sendEvent(**grabItem, &translatedEvent);
-                        ++grabItem;
-                    } else {
-                        QDragLeaveEvent leaveEvent;
-                        QCoreApplication::sendEvent(**grabItem, &leaveEvent);
-                        grabItem = grabber->release(grabItem);
-                    }
+            // Used to ensure we don't send DragEnterEvents to current drop
+            // targets and to detect which current drop targets we have left
+            QVector<QPointer<QQuickItem> > currentGrabItems = grabber->takeAll();
+
+            // Look for any other potential drop targets that are higher than
+            // the current ones
+            QDragEnterEvent enterEvent(
+                    moveEvent->pos(),
+                    moveEvent->possibleActions(),
+                    moveEvent->mimeData(),
+                    moveEvent->mouseButtons(),
+                    moveEvent->keyboardModifiers());
+            QQuickDropEventEx::copyActions(&enterEvent, *moveEvent);
+            event->setAccepted(deliverDragEvent(grabber, contentItem, &enterEvent, &currentGrabItems));
+
+            for (grabItem = grabber->begin(); grabItem != grabber->end(); ++grabItem) {
+                if (currentGrabItems.removeOne(**grabItem)) {
+                    // Still grabbed, send move event
+                    QDragMoveEvent translatedEvent(
+                            (**grabItem)->mapFromScene(moveEvent->pos()).toPoint(),
+                            moveEvent->possibleActions(),
+                            moveEvent->mimeData(),
+                            moveEvent->mouseButtons(),
+                            moveEvent->keyboardModifiers());
+                    QQuickDropEventEx::copyActions(&translatedEvent, *moveEvent);
+                    QCoreApplication::sendEvent(**grabItem, &translatedEvent);
                 }
                 return;
             } else {
                 QDragLeaveEvent leaveEvent;
-                QCoreApplication::sendEvent(**grabItem, &leaveEvent);
+                QCoreApplication::sendEvent(**i, &leaveEvent);
             }
         }
     }
@@ -2764,11 +2772,22 @@
     QQuickDropEventEx::copyActions(&enterEvent, *event);
     QList<QQuickItem *> children = itemPrivate->paintOrderChildItems();
     for (int ii = children.count() - 1; ii >= 0; --ii) {
-        if (deliverDragEvent(grabber, children.at(ii), &enterEvent))
+        if (children.at(ii)->z() < 0) {
+            continue;
+        }
+        if (deliverDragEvent(grabber, children.at(ii), &enterEvent, currentGrabItems))
             return true;
     }
 
     if (itemContained) {
+        // If this item is currently grabbed, don't send it another DragEnter,
+        // just grab it again if it's still contained.
+        if (currentGrabItems && currentGrabItems->contains(item)) {
+            grabber->grab(item);
+            grabber->setTarget(item);
+            return true;
+        }
+
         if (event->type() == QEvent::DragMove || itemPrivate->flags & QQuickItem::ItemAcceptsDrops) {
             QDragMoveEvent translatedEvent(
                     p.toPoint(),
@@ -2785,15 +2804,26 @@
             if (event->type() == QEvent::DragEnter) {
                 if (translatedEvent.isAccepted()) {
                     grabber->grab(item);
-                    accepted = true;
+                    grabber->setTarget(item);
+                    return true;
                 }
             } else {
-                accepted = true;
+                return true;
             }
         }
     }
 
-    return accepted;
+    // Check children behind this item if this item or any higher children have
+    // not accepted
+    for (int ii = children.count() - 1; ii >= 0; --ii) {
+        if (children.at(ii)->z() >= 0) {
+            continue;
+        }
+        if (deliverDragEvent(grabber, children.at(ii), &enterEvent, currentGrabItems))
+            return true;
+    }
+
+    return false;
 }
 #endif // draganddrop
 
diff -ur qtdeclarative/src/quick/items/qquickwindow_p.h qtdeclarative_new/src/quick/items/qquickwindow_p.h
--- qtdeclarative/src/quick/items/qquickwindow_p.h	2018-10-19 15:35:44.000000000 +0300
+++ qtdeclarative_new/src/quick/items/qquickwindow_p.h	2018-11-03 12:58:41.588773828 +0200
@@ -186,7 +186,7 @@
 
 #if QT_CONFIG(draganddrop)
     void deliverDragEvent(QQuickDragGrabber *, QEvent *);
-    bool deliverDragEvent(QQuickDragGrabber *, QQuickItem *, QDragMoveEvent *);
+    bool deliverDragEvent(QQuickDragGrabber *, QQuickItem *, QDragMoveEvent *, QVector<QPointer<QQuickItem> > *currentGrabItems=nullptr);
 #endif
 #if QT_CONFIG(cursor)
     void updateCursor(const QPointF &scenePos);
