diff --git a/scribus/ui/outlinepalette.cpp b/scribus/ui/outlinepalette.cpp
index eba2f42..1ffeb19 100644
--- a/scribus/ui/outlinepalette.cpp
+++ b/scribus/ui/outlinepalette.cpp
@@ -76,23 +76,24 @@ void OutlineWidget::dropEvent(QDropEvent *e)
 	bool haveLayers = false;
 	QModelIndex id;
 	QList<QTreeWidgetItem*> its;
-	QList<OutlineTreeItem*> itemPars;
+	QList<OutlineTreeItem*> sourcePages;
 	QList<QModelIndex> idxs = selectedIndexes();
 	for (int i = 0; i < idxs.count(); ++i)
 	{
 		id = idxs.at(i);
 		QTreeWidgetItem* it = id.isValid() ? itemFromIndex(id) : nullptr;
-		OutlineTreeItem *itemPar = it ? dynamic_cast<OutlineTreeItem*>(it->parent()) : nullptr;
-		while (itemPar && (itemPar->type != 2))
+		OutlineTreeItem* sourcePage = it ? dynamic_cast<OutlineTreeItem*>(it->parent()) : nullptr;
+		while (sourcePage && (sourcePage->type != 2))
 		{
-			if (itemPar->type == 5)
+			if (sourcePage->type == 5)
 				haveLayers = true;
-			itemPar = dynamic_cast<OutlineTreeItem*>(itemPar->parent());
+			sourcePage = dynamic_cast<OutlineTreeItem*>(sourcePage->parent());
 		}
 		its.append(it);
-		itemPars.append(itemPar);
+		sourcePages.append(sourcePage);
 	}
 
+	// this moves the selected items in the QTreeWidgets
 	QTreeWidget::dropEvent(e);
 
 	QList<QTreeWidgetItem*> selList;
@@ -101,156 +102,121 @@ void OutlineWidget::dropEvent(QDropEvent *e)
 		QTreeWidgetItem* it = its.at(i);
 		if (it == nullptr)
 			continue;
-		OutlineTreeItem *itemPar = itemPars.at(i);
-		OutlineTreeItem *item = dynamic_cast<OutlineTreeItem*>(it);
+		OutlineTreeItem* sourcePage = sourcePages.at(i);
+		OutlineTreeItem* item = dynamic_cast<OutlineTreeItem*>(it);
 		if (!item)
 			qFatal("OutlineWidget::dropEvent !item");
-		OutlineTreeItem *itemPl = dynamic_cast<OutlineTreeItem*>(it->parent());
-		if (!itemPl)
-			qFatal("OutlineWidget::dropEvent !itemPl");
-		OutlineTreeItem *itemPg;
-		if (itemPl->type == 5)
+		OutlineTreeItem* destParent = dynamic_cast<OutlineTreeItem*>(it->parent());
+		if (!destParent)
+			qFatal("OutlineWidget::dropEvent !destParent");
+		OutlineTreeItem* destPage;
+		if (destParent->type == 2)
 		{
-			itemPg = dynamic_cast<OutlineTreeItem*>(it->parent()->parent());
-			if (!itemPg)
-				qFatal("OutlineWidget::dropEvent !itemPg 1");
-		}
-		else if (itemPl->type == 2)
-		{
-			itemPg = dynamic_cast<OutlineTreeItem*>(it->parent());
-			if (!itemPg)
-				qFatal("OutlineWidget::dropEvent !itemPg 2");
+			destPage = dynamic_cast<OutlineTreeItem*>(it->parent());
+			if (!destPage)
+				qFatal("OutlineWidget::dropEvent !destPage 2");
 			if (haveLayers)
 			{
-				itemPl = dynamic_cast<OutlineTreeItem*>(itemPg->child(0));
-				if (!itemPl)
-					qFatal("OutlineWidget::dropEvent !itemPl");
-				for (int j = 0; j < itemPg->childCount(); ++j)
+				/*
+					we want to be able to drop items on a different page
+					without having to care about the layer. This here ensures the dropped items
+					appear on the same layer they came from.
+				*/
+				destParent = dynamic_cast<OutlineTreeItem*>(destPage->child(0));
+				if (!destParent)
+					qFatal("OutlineWidget::dropEvent !destParent");
+				for (int j = 0; j < destPage->childCount(); ++j)
 				{
-					OutlineTreeItem* childItem = dynamic_cast<OutlineTreeItem*>(itemPg->child(j));
+					OutlineTreeItem* childItem = dynamic_cast<OutlineTreeItem*>(destPage->child(j));
 					if (!childItem)
 						qFatal("OutlineWidget::dropEvent !childItem");
 					if (item->PageItemObject->m_layerID == childItem->LayerID)
 					{
-						itemPl = childItem;
+						destParent = childItem;
 						break;
 					}
 				}
-				itemPg->removeChild(it);
-				itemPl->addChild(it);
+				destPage->removeChild(it);
+				destParent->addChild(it);
 			}
 		}
 		else
 		{
-			itemPg = (OutlineTreeItem*)it->parent();
-			while (itemPg->type != 2)
+			destPage = (OutlineTreeItem*)it->parent();
+			while (destPage->type != 2)
 			{
-				itemPg = dynamic_cast<OutlineTreeItem*>(itemPg->parent());
-				if (!itemPg)
-					qFatal("OutlineWidget::dropEvent !itemPg 3");
+				destPage = dynamic_cast<OutlineTreeItem*>(destPage->parent());
+				if (!destPage)
+					qFatal("OutlineWidget::dropEvent !destPage 3");
 			}
 		}
-		if (itemPl->indexOfChild(it) != itemPl->childCount() - 1)
-		{
-			OutlineTreeItem *itemBe = dynamic_cast<OutlineTreeItem*>(itemPl->child(itemPl->indexOfChild(it) + 1));
-			if (!itemBe)
-				qFatal("OutlineWidget::dropEvent !itemBe");
-			if ((itemBe->type == 1) || (itemBe->type == 3) || (itemBe->type == 4))
+
+		// inserts into a groupItemList or the documents Items list
+		auto insertTo = [destParent, item, its, &idxs](QList<PageItem*>* list)
 			{
-				if (item->PageItemObject->isGroupChild())
-					item->DocObject->removeFromGroup(item->PageItemObject);
-				else
-					item->DocObject->Items->removeOne(item->PageItemObject);
-				if (itemBe->PageItemObject->isGroupChild())
-				{
-					PageItem* group = itemBe->PageItemObject->Parent;
-					int d = group->groupItemList.indexOf(itemBe->PageItemObject);
-					double xx = item->PageItemObject->xPos() - itemPar->PageObject->xOffset() + itemPg->PageObject->xOffset();
-					double yy = item->PageItemObject->yPos() - itemPar->PageObject->yOffset() + itemPg->PageObject->yOffset();
-					item->PageItemObject->setXYPos(xx, yy);
-					item->DocObject->addToGroup(group, item->PageItemObject);
-					group->groupItemList.insert(d, item->PageItemObject);
-					item->PageItemObject->setLayer(group->m_layerID);
-				}
-				else
-				{
-					int d = item->DocObject->Items->indexOf(itemBe->PageItemObject);
-					item->DocObject->Items->insert(d+1, item->PageItemObject);
-					if (itemPl->type == 5)
-						item->PageItemObject->setLayer(itemPl->LayerID);
-					double xx = item->PageItemObject->xPos() - itemPar->PageObject->xOffset() + itemPg->PageObject->xOffset();
-					double yy = item->PageItemObject->yPos() - itemPar->PageObject->yOffset() + itemPg->PageObject->yOffset();
-					item->PageItemObject->setXYPos(xx, yy);
-				}
-				item->PageItemObject->setRedrawBounding();
-				item->DocObject->setModified(true);
-				item->DocObject->scMW()->showLayer();
-				item->DocObject->scMW()->closeActiveWindowMasterPageEditor();
-				if (item->PageItemObject->isGroup())
-				{
-					item->DocObject->GroupOnPage(item->PageItemObject);
-					item->DocObject->scMW()->selectItemsFromOutlines(item->PageItemObject, false);
-				}
-				else
+				size_t d{ 0 };
+				if (destParent->indexOfChild(its.at(0)) < destParent->childCount() - idxs.size())
 				{
-					item->PageItemObject->OwnPage = item->DocObject->OnPage(item->PageItemObject);
-					item->DocObject->scMW()->selectItemsFromOutlines(item->PageItemObject, true);
+					OutlineTreeItem* dest = dynamic_cast<OutlineTreeItem*>(destParent->child(destParent->indexOfChild(its.at(0)) + idxs.size()));
+					if (!dest)
+						qFatal("OutlineWidget::dropEvent !dest 2");
+					d = list->indexOf(dest->PageItemObject) + 1;
 				}
-				selList.append(it);
+				list->insert(d, item->PageItemObject);
+			};
+
+		// moves the item.
+		// do not use this while the item is in a group
+		auto moveItem = [item, sourcePage, destPage]() {
+			double xx = item->PageItemObject->xPos() - sourcePage->PageObject->xOffset() + destPage->PageObject->xOffset();
+			double yy = item->PageItemObject->yPos() - sourcePage->PageObject->yOffset() + destPage->PageObject->yOffset();
+			item->PageItemObject->setXYPos(xx, yy);
+			};
+
+		if ((destParent->type == 2) || (destParent->type == 5))
+		{
+			if (item->PageItemObject->isGroupChild())
+			{
+				item->DocObject->removeFromGroup(item->PageItemObject);
+				insertTo(item->DocObject->Items);
 			}
+			if (destParent->type == 5)
+				item->PageItemObject->setLayer(destParent->LayerID);
+			moveItem();
 		}
 		else
 		{
-	//		itemPl->insertChild(0, itemPl->takeChild(itemPl->indexOfChild(it)));
-			if ((itemPl->type == 2) || (itemPl->type == 5))
+			if (!destParent)
+				qFatal("OutlineWidget::dropEvent !destParent 2");
+			double preRemoveyy = item->PageItemObject->yPos();
+			if ((destParent->type == 1) || (destParent->type == 3) || (destParent->type == 4))
 			{
 				if (item->PageItemObject->isGroupChild())
-				{
 					item->DocObject->removeFromGroup(item->PageItemObject);
-					item->DocObject->Items->append(item->PageItemObject);
-				}
-				if (itemPl->type == 5)
-					item->PageItemObject->setLayer(itemPl->LayerID);
-				double xx = item->PageItemObject->xPos() - itemPar->PageObject->xOffset() + itemPg->PageObject->xOffset();
-				double yy = item->PageItemObject->yPos() - itemPar->PageObject->yOffset() + itemPg->PageObject->yOffset();
-				item->PageItemObject->setXYPos(xx, yy);
-			}
-			else
-			{
-				OutlineTreeItem *itemBe = dynamic_cast<OutlineTreeItem*>(it->parent());
-				if (!itemBe)
-					qFatal("OutlineWidget::dropEvent !itemBe 2");
-				if ((itemBe->type == 1) || (itemBe->type == 3) || (itemBe->type == 4))
-				{
-					if (item->PageItemObject->isGroupChild())
-						item->DocObject->removeFromGroup(item->PageItemObject);
-					else
-						item->DocObject->Items->removeOne(item->PageItemObject);
-					PageItem* group = itemBe->PageItemObject;
-					double xx = item->PageItemObject->xPos() - itemPar->PageObject->xOffset() + itemPg->PageObject->xOffset();
-					double yy = item->PageItemObject->yPos() - itemPar->PageObject->yOffset() + itemPg->PageObject->yOffset();
-					item->PageItemObject->setXYPos(xx, yy);
-					item->DocObject->addToGroup(group, item->PageItemObject);
-					group->groupItemList.append(item->PageItemObject);
-					item->PageItemObject->setLayer(group->m_layerID);
-				}
-			}
-			item->PageItemObject->setRedrawBounding();
-			item->DocObject->setModified(true);
-			item->DocObject->scMW()->showLayer();
-			item->DocObject->scMW()->closeActiveWindowMasterPageEditor();
-			if (item->PageItemObject->isGroup())
-			{
-				item->DocObject->GroupOnPage(item->PageItemObject);
-				item->DocObject->scMW()->selectItemsFromOutlines(item->PageItemObject, false);
-			}
-			else
-			{
-				item->PageItemObject->OwnPage = item->DocObject->OnPage(item->PageItemObject);
-				item->DocObject->scMW()->selectItemsFromOutlines(item->PageItemObject, true, 1);
+				else
+					item->DocObject->Items->removeOne(item->PageItemObject);
+				moveItem();
+				PageItem* destGroup = destParent->PageItemObject;
+				item->DocObject->addToGroup(destGroup, item->PageItemObject);
+				insertTo(&destGroup->groupItemList);
+				item->PageItemObject->setLayer(destGroup->m_layerID);
 			}
-			selList.append(it);
 		}
+		item->PageItemObject->setRedrawBounding();
+		item->DocObject->setModified(true);
+		item->DocObject->scMW()->showLayer();
+		item->DocObject->scMW()->closeActiveWindowMasterPageEditor();
+		if (item->PageItemObject->isGroup())
+		{
+			item->DocObject->GroupOnPage(item->PageItemObject);
+			item->DocObject->scMW()->selectItemsFromOutlines(item->PageItemObject, false);
+		}
+		else
+		{
+			item->PageItemObject->OwnPage = item->DocObject->OnPage(item->PageItemObject);
+			item->DocObject->scMW()->selectItemsFromOutlines(item->PageItemObject, true, 1);
+		}
+		selList.append(it);
 	}
 	selectItems(selList);
 }
