Index: scribus/canvasmode_drawcalligraphic.cpp
===================================================================
--- scribus/canvasmode_drawcalligraphic.cpp	(revision 19541)
+++ scribus/canvasmode_drawcalligraphic.cpp	(working copy)
@@ -331,28 +331,4 @@
 	}
 }
 
-void CalligraphicMode::selectPage(QMouseEvent *m)
-{
-	m_MouseButtonPressed = true;
-	FPoint mousePointDoc = m_canvas->globalToCanvas(m->globalPos());
-	Mxp = mousePointDoc.x(); //static_cast<int>(m->x()/m_canvas->scale());
-	Myp = mousePointDoc.y(); //static_cast<int>(m->y()/m_canvas->scale());
-	QRect mpo(m->x()-m_doc->guidesPrefs().grabRadius, m->y()-m_doc->guidesPrefs().grabRadius, m_doc->guidesPrefs().grabRadius*2, m_doc->guidesPrefs().grabRadius*2);
-	m_doc->nodeEdit.deselect();
-	m_view->Deselect(false);
-	if (!m_doc->masterPageMode())
-	{
-		int i = m_doc->OnPage(Mxp, Myp);
-		if (i!=-1)
-		{
-			uint docCurrPageNo=m_doc->currentPageNumber();
-			uint j=static_cast<uint>(i);
-			if (docCurrPageNo != j)
-			{
-				m_doc->setCurrentPage(m_doc->Pages->at(j));
-				m_view->m_ScMW->slotSetCurrentPage(j);
-				m_view->DrawNew();
-			}
-		}
-	}
-}
+
Index: scribus/canvasmode_drawcalligraphic.h
===================================================================
--- scribus/canvasmode_drawcalligraphic.h	(revision 19541)
+++ scribus/canvasmode_drawcalligraphic.h	(working copy)
@@ -48,7 +48,6 @@
 	
 private:
 	inline bool GetItem(PageItem** pi); 
-	void selectPage(QMouseEvent *m);
 
 	bool   m_MouseButtonPressed;
 	double Mxp, Myp, Dxp, Dyp;
Index: scribus/canvasmode_drawfreehand.cpp
===================================================================
--- scribus/canvasmode_drawfreehand.cpp	(revision 19541)
+++ scribus/canvasmode_drawfreehand.cpp	(working copy)
@@ -318,28 +318,3 @@
 	}
 }
 
-void FreehandMode::selectPage(QMouseEvent *m)
-{
-	m_MouseButtonPressed = true;
-	FPoint mousePointDoc = m_canvas->globalToCanvas(m->globalPos());
-	Mxp = mousePointDoc.x(); //static_cast<int>(m->x()/m_canvas->scale());
-	Myp = mousePointDoc.y(); //static_cast<int>(m->y()/m_canvas->scale());
-	QRect mpo(m->x()-m_doc->guidesPrefs().grabRadius, m->y()-m_doc->guidesPrefs().grabRadius, m_doc->guidesPrefs().grabRadius*2, m_doc->guidesPrefs().grabRadius*2);
-	m_doc->nodeEdit.deselect();
-	m_view->Deselect(false);
-	if (!m_doc->masterPageMode())
-	{
-		int i = m_doc->OnPage(Mxp, Myp);
-		if (i!=-1)
-		{
-			uint docCurrPageNo=m_doc->currentPageNumber();
-			uint j=static_cast<uint>(i);
-			if (docCurrPageNo != j)
-			{
-				m_doc->setCurrentPage(m_doc->Pages->at(j));
-				m_view->m_ScMW->slotSetCurrentPage(j);
-				m_view->DrawNew();
-			}
-		}
-	}
-}
Index: scribus/canvasmode_drawfreehand.h
===================================================================
--- scribus/canvasmode_drawfreehand.h	(revision 19541)
+++ scribus/canvasmode_drawfreehand.h	(working copy)
@@ -48,7 +48,6 @@
 	
 private:
 	inline bool GetItem(PageItem** pi); 
-	void selectPage(QMouseEvent *m);
 
 	bool   m_MouseButtonPressed;
 	double Mxp, Myp, Dxp, Dyp;
Index: scribus/canvasmode_framelinks.cpp
===================================================================
--- scribus/canvasmode_framelinks.cpp	(revision 19541)
+++ scribus/canvasmode_framelinks.cpp	(working copy)
@@ -178,12 +178,19 @@
 			if (currItem==NULL)
 				break;
 			SeleItem(m);
-			if (GetItem(&bb) && (bb->asTextFrame()))
+			bb = m_doc->m_Selection->itemAt(0);
+			if (!bb) {
+				// clicked outside anything, make a new one with a matching size
+				int page = m_doc->OnPage(Mxp, Myp);
+				int frame = -1;
+				if (page != -1) frame = m_doc->addFullTextFrame(page, Mxp, Myp, currItem->width(), currItem->height());
+				if (frame != -1)
+					bb = m_doc->Items->at(frame);
+			}
+			if (bb && bb->asTextFrame())
 			{
-				PageItem* bblast = bb;
-				while (bblast->nextInChain())
-					bblast = bblast->nextInChain();
-				
+				PageItem* bblast = bb->lastInChain();
+
 				if (currItem->nextInChain() == NULL && currItem != bblast) //possibility to insert empty frames into chain
 				{
 					if (bb->prevInChain() != NULL)
@@ -316,32 +323,6 @@
 	m_view->m_ScMW->pageSelector->clearFocus();
 }
 
-void CanvasMode_FrameLinks::selectPage(QMouseEvent *m)
-{
-	m_canvas->m_viewMode.m_MouseButtonPressed = true;
-	FPoint mousePointDoc = m_canvas->globalToCanvas(m->globalPos());
-	Mxp = mousePointDoc.x(); //static_cast<int>(m->x()/m_canvas->scale());
-	Myp = mousePointDoc.y(); //static_cast<int>(m->y()/m_canvas->scale());
-	m_doc->nodeEdit.deselect();
-	m_view->Deselect(false);
-	if (!m_doc->masterPageMode())
-	{
-		int i = m_doc->OnPage(Mxp, Myp);
-		if (i!=-1)
-		{
-			uint docCurrPageNo=m_doc->currentPageNumber();
-			uint j=static_cast<uint>(i);
-			if (docCurrPageNo != j)
-			{
-				m_doc->setCurrentPage(m_doc->Pages->at(j));
-				m_view->m_ScMW->slotSetCurrentPage(j);
-				m_view->DrawNew();
-			}
-		}
-		m_view->setRulerPos(m_view->contentsX(), m_view->contentsY());
-	}
-}
-
 //CB-->Doc/Fix
 bool CanvasMode_FrameLinks::SeleItem(QMouseEvent *m)
 {
Index: scribus/canvasmode_framelinks.h
===================================================================
--- scribus/canvasmode_framelinks.h	(revision 19541)
+++ scribus/canvasmode_framelinks.h	(working copy)
@@ -57,7 +57,6 @@
 
 private:
 	inline bool GetItem(PageItem** pi);
-	void selectPage(QMouseEvent *m);
 	bool SeleItem(QMouseEvent *m);
 	void createContextMenu(PageItem *currItem, double mx, double my);
 
Index: scribus/scribusdoc.cpp
===================================================================
--- scribus/scribusdoc.cpp	(revision 19541)
+++ scribus/scribusdoc.cpp	(working copy)
@@ -2899,29 +2899,37 @@
 {
 	if (!automaticTextFrames)
 		return -1;
+	if (masterPageMode())
+		return -1;
 	ScPage *addToPage=DocPages.at(pageNumber);
-	if ((!masterPageMode()) && (usesAutomaticTextFrames()))// && (!isLoading()))
-	{
-		int z = itemAdd(PageItem::TextFrame, PageItem::Unspecified,
-		                     addToPage->Margins.Left+addToPage->xOffset(),
-							 addToPage->Margins.Top+addToPage->yOffset(), docPrefsData.docSetupPrefs.pageWidth-addToPage->Margins.Right-addToPage->Margins.Left,
-							 docPrefsData.docSetupPrefs.pageHeight-addToPage->Margins.Bottom-addToPage->Margins.Top,
-							 1, CommonStrings::None, docPrefsData.itemToolPrefs.shapeLineColor, true);
+	if (!addToPage) return -1;
+	const MarginStruct mg = addToPage->Margins;
+	int z = addFullTextFrame(pageNumber, mg.Left + addToPage->xOffset(), mg.Top + addToPage->yOffset(),
+			docPrefsData.docSetupPrefs.pageWidth - mg.Right - mg.Left,
+			docPrefsData.docSetupPrefs.pageHeight - mg.Bottom - mg.Top);
+	if (z != -1) {
 		Items->at(z)->isAutoText = true;
-		Items->at(z)->Cols = qRound(PageSp);
-		Items->at(z)->ColGap = PageSpa;
 		if (LastAuto != 0)
 			LastAuto->link(Items->at(z));
 		else
 			FirstAuto = Items->at(z);
 		LastAuto = Items->at(z);
-		Items->at(z)->setRedrawBounding();
 		updateEndnotesFrames();
-		return z;
 	}
-	return -1;
+	return z;
 }
 
+int ScribusDoc::addFullTextFrame(const int pageNumber, double x, double y, double w, double h)
+{
+	if (masterPageMode()) return -1;
+	int z = itemAdd(PageItem::TextFrame, PageItem::Unspecified,
+		           x, y, w, h, 
+							 1, CommonStrings::None, docPrefsData.itemToolPrefs.shapeLineColor, true);
+	Items->at(z)->Cols = qRound(PageSp);
+	Items->at(z)->ColGap = PageSpa;
+	Items->at(z)->setRedrawBounding();
+	return z;
+}
 
 int ScribusDoc::addLayer(const QString& layerName, const bool activate)
 {
@@ -13753,7 +13761,90 @@
 	}
 	DoDrawing = false;
 	view()->updatesOn(false);
-	if (mdData.type==0) // Copy and offset or set a gap
+
+	// should we link frames? Only valid if we have a single item, which is a text frame
+	PageItem *frameToLink = 0;
+	if ((m_Selection->count() == 1) && m_Selection->itemAt(0)->isTextFrame())
+		frameToLink = m_Selection->itemAt(0);
+	bool linkFrames = frameToLink ? mdData.linkFrames : false;
+
+	// if we'll be linking frames, clear the text first - this majorly speeds up the operation (adding text is very slow)
+	StoryText stext;
+	if (linkFrames) {
+		stext = frameToLink->itemText;
+		frameToLink->itemText = StoryText();
+	}
+
+	ScriXmlDoc ss;
+	QString BufferS = ss.WriteElem(this, m_Selection);
+
+	if (linkFrames) frameToLink->itemText = stext;
+
+	// First create all the items, then move them as desired
+	int startIdx = Items->count();
+	int copyDiff = 0;
+	int copyCount = (mdData.type == 0) ? mdData.copyCount : mdData.gridRows * mdData.gridCols - 1;
+	double pageX = currentPage()->xOffset();
+	double pageY = currentPage()->yOffset();
+	int page = currentPage()->pageNr();
+
+	for (int i = 0; i < copyCount; ++i) {
+
+		if (mdData.copyNewPage) {
+			// Each item is on a new page, so grab the next one
+			bool correct = false;
+			int newPage = page;
+      do {
+				newPage++;
+				if (newPage >= DocPages.size()) break;
+			  // if we want same-side pages only, keep going until the correct side is found
+			  if (mdData.newPageSameSide && (locationOfPage(newPage) != locationOfPage(page))) continue;
+
+				correct = true;
+			} while (!correct);
+
+			// If the page doesn't exist, we bail out and only copy what we can.
+			if (!correct) {
+				copyCount = i;  // set copyCount so that this one is not included (its page doesn't exist)
+				break;
+			}
+
+			page = newPage;
+			ScPage *addToPage = DocPages.at(page);
+			pageX = addToPage->xOffset();
+			pageY = addToPage->yOffset();
+		}
+
+		ss.ReadElem(BufferS, appPrefsData.fontPrefs.AvailFonts, this, pageX, pageY, false, true, appPrefsData.fontPrefs.GFontSub);
+		if (i == 0) copyDiff = Items->count() - startIdx;
+		// link the frames if requested
+		// we do that right away so that we don't retain multiple copies of the text needlessly
+		if (linkFrames) {
+		  PageItem* bItem = Items->at(Items->count() - 1);
+			bItem->itemText = StoryText();  // clear the existing text, as link() would otherwise append the two, which we do not want
+			frameToLink->link(bItem);
+			frameToLink = bItem;
+		}
+	}
+	for (int i = startIdx; i < startIdx + copyCount * copyDiff; ++i) {
+		PageItem* bItem = Items->at(i);
+		bItem->setLocked(false);
+	}
+
+	if ((mdData.type == 0) && mdData.copyNewPage) {
+		// duplicating each item on a new page - nothing to do here
+		for (int diff = 0; diff < copyCount * copyDiff; ++diff)
+		{
+			// is this actually needed?
+			PageItem* bItem = Items->at(startIdx + diff);
+			bItem->connectToGUI();
+			bItem->emitAllToGUI();
+		}
+
+		tooltip = tr("Number of copies: %1").arg(copyCount);
+	}
+
+	else if (mdData.type==0) // Copy and offset or set a gap
 	{
 		double dH = mdData.copyShiftGapH / docUnitRatio;
 		double dV = mdData.copyShiftGapV / docUnitRatio;
@@ -13761,7 +13852,7 @@
 		double dV2 = dV;
 		double dR = mdData.copyRotation;
 		double dR2 = dR;
-		if (mdData.copyShiftOrGap==1)
+		if (mdData.copyShiftOrGap)
 		{
 			if (dH != 0.0)
 				dH2 += m_Selection->width();
@@ -13768,20 +13859,17 @@
 			if (dV != 0.0)
 				dV2 += m_Selection->height();
 		}
-		ScriXmlDoc ss;
-		QString BufferS = ss.WriteElem(this, m_Selection);
+
 		//FIXME: stop using m_View
 		m_View->Deselect(true);
-		for (int i=0; i<mdData.copyCount; ++i)
+		for (int i = 0; i < copyCount; ++i)
 		{
-			uint ac = Items->count();
-			ss.ReadElem(BufferS, appPrefsData.fontPrefs.AvailFonts, this, currentPage()->xOffset(), currentPage()->yOffset(), false, true, appPrefsData.fontPrefs.GFontSub);
+			uint ac = startIdx + copyDiff * i;
 			m_Selection->delaySignalsOn();
-			for (int as = ac; as < Items->count(); ++as)
+			for (int diff = 0; diff < copyDiff; ++diff)
 			{
-				PageItem* bItem = Items->at(as);
-				bItem->setLocked(false);
-				bItem->moveBy(dH2, dV2, true);
+				PageItem* bItem = Items->at(ac + diff);
+				bItem->moveBy(dH2 * (i + 1), dV2 * (i + 1), true);
 				m_Selection->addItem(bItem);
 			}
 			m_Selection->delaySignalsOff();
@@ -13789,19 +13877,10 @@
 			if (dR != 0.0)
 			{
 				if (m_Selection->count() > 1)
-					rotateGroup(dR2, FPoint(0,0)); //FIXME:av
+					rotateGroup(dR2 * (i + 1), FPoint(0,0)); //FIXME:av
 				else
-					RotateItem(dR2, m_Selection->itemAt(0));
+					RotateItem(dR2 * (i + 1), m_Selection->itemAt(0));
 			}
-			dH2 += dH;
-			dV2 += dV;
-			if (mdData.copyShiftOrGap==1)
-			{
-				if (dH != 0.0)
-					dH2 += m_Selection->width();
-				if (dV != 0.0)
-					dV2 += m_Selection->height();
-			}
 			dR2 += dR;
 			if (m_Selection->count() > 0)
 			{
@@ -13815,39 +13894,34 @@
 		QString hString = QString::number(dH * docUnitRatio, 'f', unitPrecision) + " " + unitSuffix;
 		QString vString = QString::number(dV * docUnitRatio, 'f', unitPrecision) + " " + unitSuffix;
 		QString dString = QString::number(dR) + " " + unitGetStrFromIndex(SC_DEGREES);
-		tooltip = tr("Number of copies: %1\nHorizontal shift: %2\nVertical shift: %3\nRotation: %4").arg(mdData.copyCount).arg(hString).arg(vString).arg(dString);
+		tooltip = tr("Number of copies: %1\nHorizontal shift: %2\nVertical shift: %3\nRotation: %4").arg(copyCount).arg(hString).arg(vString).arg(dString);
 	}
+
 	else if (mdData.type==1) // Create a grid of duplicated items
 	{
-		int copyCount = mdData.gridRows * mdData.gridCols;
 		double dX = mdData.gridGapH/docUnitRatio + m_Selection->width();
 		double dY = mdData.gridGapV/docUnitRatio + m_Selection->height();
-		ScriXmlDoc ss;
-		QString BufferS = ss.WriteElem(this, m_Selection);
-		for (int i = 0; i < mdData.gridRows; ++i) //skip 0, the item is the one we are copying
+
+		for (int i = 0; i < copyCount; ++i)
 		{
-			for (int j = 0; j < mdData.gridCols; ++j) //skip 0, the item is the one we are copying
+			// compute coords; 0,0 is the original item, which we skip
+			int row = (i + 1) / mdData.gridCols;   // gridCols non-zero, or we wouldn't be inside this loop
+			int col = (i + 1) % mdData.gridCols;
+			uint ac = startIdx + copyDiff * i;
+			for (int diff = 0; diff < copyDiff; ++diff)
 			{
-				// We can comment out this conditional jump if we use slotEditCut(), would not be cool? ;-)
-				if (i==0 && j==0)
-					continue;
-				uint ac = Items->count();
-				ss.ReadElem(BufferS, appPrefsData.fontPrefs.AvailFonts, this, currentPage()->xOffset(), currentPage()->yOffset(), false, true, appPrefsData.fontPrefs.GFontSub);
-				for (int as = ac; as < Items->count(); ++as)
-				{
-					PageItem* bItem = Items->at(as);
-					bItem->setLocked(false);
-					bItem->moveBy(j*dX, i*dY, true);
-					bItem->connectToGUI();
-					bItem->emitAllToGUI();
-				}
+				PageItem* bItem = Items->at(ac + diff);
+				bItem->moveBy(col * dX, row * dY, true);
+				bItem->connectToGUI();
+				bItem->emitAllToGUI();
 			}
 		}
+
 		QString unitSuffix = unitGetStrFromIndex(this->unitIndex());
 		int unitPrecision = unitGetPrecisionFromIndex(this->unitIndex());
 		QString hString = QString::number(mdData.gridGapH, 'f', unitPrecision) + " " + unitSuffix;
 		QString vString = QString::number(mdData.gridGapV, 'f', unitPrecision) + " " + unitSuffix;
-		tooltip = tr("Number of copies: %1\nHorizontal gap: %2\nVertical gap: %3").arg(copyCount-1).arg(hString).arg(vString).arg(unitSuffix);
+		tooltip = tr("Number of copies: %1\nHorizontal gap: %2\nVertical gap: %3").arg(copyCount).arg(hString).arg(vString).arg(unitSuffix);
 	}
 	if (activeTransaction)
 	{
Index: scribus/scribusdoc.h
===================================================================
--- scribus/scribusdoc.h	(revision 19541)
+++ scribus/scribusdoc.h	(working copy)
@@ -264,6 +264,18 @@
 	 */
 	int addAutomaticTextFrame(const int pageNumber);
 	/**
+	 * @brief Add a full-size text frame to the page. Similar to addAutomaticTextFrame,
+	 * but works regardless on whether automaticTextFrames is set, and it also
+	 * doesn't connect the frame with other automatically created frames
+	 * @param pageNumber page number
+	 * @param x x position
+	 * @param y y position
+	 * @param w width
+	 * @param h height
+	 * @return number of frame
+	 */
+	int addFullTextFrame(const int pageNumber, double x, double y, double w, double h);
+	/**
 	 * Set the left and right margins based on the location of the page
 	 * @param pageIndex 
 	 */
Index: scribus/scribusview.cpp
===================================================================
--- scribus/scribusview.cpp	(revision 19541)
+++ scribus/scribusview.cpp	(working copy)
@@ -158,7 +158,6 @@
 	m_groupTransactions(0),
 	m_groupTransaction(),
 	_isGlobalMode(true),
-	linkAfterDraw(false),
 	ImageAfterDraw(false),
 	m_vhRulerHW(17)
 {
@@ -4101,17 +4100,6 @@
 		QMouseEvent* m = static_cast<QMouseEvent*> (event);
 		m_canvasMode->mouseReleaseEvent(m);
 		m_canvas->m_viewMode.m_MouseButtonPressed = false;
-		if (linkAfterDraw)
-		{
-			//user creates new frame using linking tool
-			PageItem * secondFrame = Doc->m_Selection->itemAt(0);
-			if (secondFrame && firstFrame)
-			{
-				firstFrame->link(secondFrame);
-				firstFrame = NULL;
-			}
-			linkAfterDraw = false;
-		}
 		if (ImageAfterDraw)
 		{
 			//user creates new frame using linking tool
@@ -4129,20 +4117,7 @@
 	else if (obj == widget() && event->type() == QEvent::MouseButtonPress)
 	{
 		QMouseEvent* m = static_cast<QMouseEvent*> (event);
-		bool linkmode = (Doc->appMode == modeLinkFrames);
-		firstFrame = Doc->m_Selection->itemAt(0);
 		m_canvasMode->mousePressEvent(m);
-		//if user dont click any frame he want to draw new frame and link it
-		bool requestDrawMode = (Doc->ElemToLink == NULL);
-		if (linkmode && requestDrawMode)
-		{
-			//switch to drawing new text frame
-			linkAfterDraw = true;
-			requestMode(modeDrawText);
-			m_canvasMode->mousePressEvent(m);
-		}
-		else
-			firstFrame = NULL;
 		if(Doc->appMode == modeImportImage && ImageAfterDraw)
 		{
 			//switch to drawing new text frame
Index: scribus/scribusview.h
===================================================================
--- scribus/scribusview.h	(revision 19541)
+++ scribus/scribusview.h	(working copy)
@@ -262,10 +262,6 @@
 	void PasteToPage();
 	void TextToPath();
 
-//for linking frame after draw new frame
-private:
-	PageItem * firstFrame;
-
 private: // Private attributes
 	int m_previousMode;
 	QMenu *pmen3;
@@ -282,7 +278,6 @@
 	int m_oldCanvasWidth;
 	UndoTransaction m_groupTransaction;
 	bool _isGlobalMode;
-	bool linkAfterDraw;
 	bool ImageAfterDraw;
 	bool m_oldSnapToElem;
 
Index: scribus/ui/contextmenu.cpp
===================================================================
--- scribus/ui/contextmenu.cpp	(revision 19541)
+++ scribus/ui/contextmenu.cpp	(working copy)
@@ -97,6 +97,7 @@
 	QMenu *menuPDF = new QMenu(this);
 	QMenu *menuMark = new QMenu(this);
 	QMenu *menuResolution = new QMenu(this);
+	QMenu *menuDuplicate = new QMenu(this);
 	QMenu *menuLocking = new QMenu(this);
 	QMenu *menuSendTo = new QMenu(this);
 	QMenu *menuScrapbook = new QMenu(this);
@@ -362,6 +363,14 @@
 	
 	if (selectedItemCount>0)
 	{
+		// <-- Duplicate
+		menuDuplicate->addAction(m_ScMW->scrActions["itemDuplicate"]);
+		menuDuplicate->addAction(m_ScMW->scrActions["itemMulDuplicate"]);
+		menuDuplicate->addAction(m_ScMW->scrActions["itemTransform"]);
+		QAction *actDT = addMenu(menuDuplicate);
+		actDT->setText( tr("Duplicate/Transform"));
+		//-->
+
 		//<-- Item Locking
 		menuLocking->addAction(m_ScMW->scrActions["itemLock"]);
 		menuLocking->addAction(m_ScMW->scrActions["itemLockSize"]);
Index: scribus/ui/multipleduplicate.cpp
===================================================================
--- scribus/ui/multipleduplicate.cpp	(revision 19541)
+++ scribus/ui/multipleduplicate.cpp	(working copy)
@@ -45,11 +45,9 @@
 	rotationSpinBox->setDecimals(1);
 	rotationSpinBox->setNewUnit(6);
 	
+	// signals and slots connections
+	connect(shiftButtonGroup, SIGNAL(buttonToggled(QAbstractButton *, bool)), this, SLOT(shiftRadioToggled(QAbstractButton *, bool)));
 	createGapRadioButton->setChecked(true);
-	setCopiesGap();
-	// signals and slots connections
-	connect(createGapRadioButton, SIGNAL(clicked()), this, SLOT(setCopiesGap()));
-	connect(shiftCreatedItemsRadioButton, SIGNAL(clicked()), this, SLOT(setCopiesShift()));
 }
 
 MultipleDuplicate::~MultipleDuplicate()
@@ -72,7 +70,10 @@
 {
 	mdData.type = tabWidget->currentIndex();
 	mdData.copyCount = numberOfCopiesSpinBox->value();
-	mdData.copyShiftOrGap = createGapRadioButton->isChecked() ? 1 : 0;
+	mdData.copyShiftOrGap = createGapRadioButton->isChecked();
+	mdData.copyNewPage = eachItemOnNewPageRadioButton->isChecked();
+	mdData.newPageSameSide = newPageSameSide->isChecked();
+	mdData.linkFrames = linkFrames->isChecked();
 	mdData.copyShiftGapH = horizShiftSpinBox->value();
 	mdData.copyShiftGapV = vertShiftSpinBox->value();
 	mdData.copyRotation = rotationSpinBox->value();
@@ -81,3 +82,20 @@
 	mdData.gridGapH = horizRCGapSpinBox->value();
 	mdData.gridGapV = vertRCGapSpinBox->value();
 }
+
+void MultipleDuplicate::shiftRadioToggled(QAbstractButton *button, bool checked)
+{
+	if (!checked) return;
+	if (button == eachItemOnNewPageRadioButton) {
+	  duplicateOptions->hide();
+		newPageSameSide->show();
+		return;
+	}
+	newPageSameSide->hide();
+	duplicateOptions->show();
+	if (button == createGapRadioButton)
+		setCopiesGap();
+	else
+		setCopiesShift();
+}
+
Index: scribus/ui/multipleduplicate.h
===================================================================
--- scribus/ui/multipleduplicate.h	(revision 19541)
+++ scribus/ui/multipleduplicate.h	(working copy)
@@ -20,9 +20,11 @@
 	protected:
 		int m_unitIndex;
 		double m_unitRatio;
-	protected slots:
+
 		void setCopiesShift();
 		void setCopiesGap();
+	protected slots:
+		void shiftRadioToggled(QAbstractButton *button, bool checked);
 };
 
 #endif
Index: scribus/ui/multipleduplicate.ui
===================================================================
--- scribus/ui/multipleduplicate.ui	(revision 19541)
+++ scribus/ui/multipleduplicate.ui	(working copy)
@@ -6,8 +6,8 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>303</width>
-    <height>350</height>
+    <width>363</width>
+    <height>394</height>
    </rect>
   </property>
   <property name="windowTitle">
@@ -45,9 +45,18 @@
              <property name="spacing">
               <number>5</number>
              </property>
-             <property name="margin">
+             <property name="leftMargin">
               <number>5</number>
              </property>
+             <property name="topMargin">
+              <number>5</number>
+             </property>
+             <property name="rightMargin">
+              <number>5</number>
+             </property>
+             <property name="bottomMargin">
+              <number>5</number>
+             </property>
              <item>
               <widget class="QLabel" name="numberOfCopiesLabel">
                <property name="text">
@@ -74,6 +83,13 @@
             </layout>
            </item>
            <item>
+            <widget class="QCheckBox" name="linkFrames">
+             <property name="text">
+              <string>&amp;Link Text Frames</string>
+             </property>
+            </widget>
+           </item>
+           <item>
             <widget class="QGroupBox" name="copiesCreateButtonGroup">
              <property name="title">
               <string/>
@@ -87,6 +103,9 @@
                 <property name="shortcut">
                  <string>Alt+G</string>
                 </property>
+                <attribute name="buttonGroup">
+                 <string notr="true">shiftButtonGroup</string>
+                </attribute>
                </widget>
               </item>
               <item>
@@ -97,86 +116,111 @@
                 <property name="shortcut">
                  <string>Alt+S</string>
                 </property>
+                <attribute name="buttonGroup">
+                 <string notr="true">shiftButtonGroup</string>
+                </attribute>
                </widget>
               </item>
+              <item>
+               <widget class="QRadioButton" name="eachItemOnNewPageRadioButton">
+                <property name="text">
+                 <string>Each Item on a Separate &amp;Page</string>
+                </property>
+                <attribute name="buttonGroup">
+                 <string notr="true">shiftButtonGroup</string>
+                </attribute>
+               </widget>
+              </item>
              </layout>
             </widget>
            </item>
            <item>
-            <layout class="QGridLayout">
-             <property name="margin">
-              <number>5</number>
+            <widget class="QFrame" name="duplicateOptions">
+             <layout class="QGridLayout">
+              <property name="leftMargin">
+               <number>5</number>
+              </property>
+              <property name="topMargin">
+               <number>5</number>
+              </property>
+              <property name="rightMargin">
+               <number>5</number>
+              </property>
+              <property name="bottomMargin">
+               <number>5</number>
+              </property>
+              <property name="spacing">
+               <number>5</number>
+              </property>
+              <item row="0" column="0">
+               <widget class="QLabel" name="horizShiftLabel">
+                <property name="text">
+                 <string>&amp;Horizontal Shift:</string>
+                </property>
+                <property name="wordWrap">
+                 <bool>false</bool>
+                </property>
+               </widget>
+              </item>
+              <item row="2" column="1">
+               <widget class="ScrSpinBox" name="rotationSpinBox">
+                <property name="minimumSize">
+                 <size>
+                  <width>50</width>
+                  <height>24</height>
+                 </size>
+                </property>
+               </widget>
+              </item>
+              <item row="1" column="1">
+               <widget class="ScrSpinBox" name="vertShiftSpinBox">
+                <property name="minimumSize">
+                 <size>
+                  <width>50</width>
+                  <height>24</height>
+                 </size>
+                </property>
+               </widget>
+              </item>
+              <item row="2" column="0">
+               <widget class="QLabel" name="rotationLabel">
+                <property name="text">
+                 <string>Rotation:</string>
+                </property>
+                <property name="wordWrap">
+                 <bool>false</bool>
+                </property>
+               </widget>
+              </item>
+              <item row="0" column="1">
+               <widget class="ScrSpinBox" name="horizShiftSpinBox">
+                <property name="minimumSize">
+                 <size>
+                  <width>50</width>
+                  <height>24</height>
+                 </size>
+                </property>
+               </widget>
+              </item>
+              <item row="1" column="0">
+               <widget class="QLabel" name="vertShiftLabel">
+                <property name="text">
+                 <string>&amp;Vertical Shift:</string>
+                </property>
+                <property name="wordWrap">
+                 <bool>false</bool>
+                </property>
+               </widget>
+              </item>
+             </layout>
+            </widget>
+           </item>
+           <item>
+            <widget class="QCheckBox" name="newPageSameSide">
+             <property name="text">
+              <string>Duplicate to &amp;Same Side Pages Only</string>
              </property>
-             <property name="spacing">
-              <number>5</number>
-             </property>
-             <item row="0" column="0">
-              <widget class="QLabel" name="horizShiftLabel">
-               <property name="text">
-                <string>&amp;Horizontal Shift:</string>
-               </property>
-               <property name="wordWrap">
-                <bool>false</bool>
-               </property>
-               <property name="buddy">
-                <cstring>horizShiftSpinBox</cstring>
-               </property>
-              </widget>
-             </item>
-             <item row="2" column="1">
-              <widget class="ScrSpinBox" name="rotationSpinBox">
-               <property name="minimumSize">
-                <size>
-                 <width>50</width>
-                 <height>24</height>
-                </size>
-               </property>
-              </widget>
-             </item>
-             <item row="1" column="1">
-              <widget class="ScrSpinBox" name="vertShiftSpinBox">
-               <property name="minimumSize">
-                <size>
-                 <width>50</width>
-                 <height>24</height>
-                </size>
-               </property>
-              </widget>
-             </item>
-             <item row="2" column="0">
-              <widget class="QLabel" name="rotationLabel">
-               <property name="text">
-                <string>Rotation:</string>
-               </property>
-               <property name="wordWrap">
-                <bool>false</bool>
-               </property>
-              </widget>
-             </item>
-             <item row="0" column="1">
-              <widget class="ScrSpinBox" name="horizShiftSpinBox">
-               <property name="minimumSize">
-                <size>
-                 <width>50</width>
-                 <height>24</height>
-                </size>
-               </property>
-              </widget>
-             </item>
-             <item row="1" column="0">
-              <widget class="QLabel" name="vertShiftLabel">
-               <property name="text">
-                <string>&amp;Vertical Shift:</string>
-               </property>
-               <property name="wordWrap">
-                <bool>false</bool>
-               </property>
-               <property name="buddy">
-                <cstring>vertShiftSpinBox</cstring>
-               </property>
-              </widget>
-             </item>
-            </layout>
+            </widget>
            </item>
           </layout>
          </item>
@@ -221,16 +265,34 @@
        <string>By &amp;Rows &amp;&amp; Columns</string>
       </attribute>
       <layout class="QVBoxLayout">
-       <property name="margin">
+       <property name="leftMargin">
         <number>0</number>
        </property>
+       <property name="topMargin">
+        <number>0</number>
+       </property>
+       <property name="rightMargin">
+        <number>0</number>
+       </property>
+       <property name="bottomMargin">
+        <number>0</number>
+       </property>
        <item>
         <layout class="QHBoxLayout">
          <item>
           <layout class="QGridLayout">
-           <property name="margin">
+           <property name="leftMargin">
             <number>5</number>
            </property>
+           <property name="topMargin">
+            <number>5</number>
+           </property>
+           <property name="rightMargin">
+            <number>5</number>
+           </property>
+           <property name="bottomMargin">
+            <number>5</number>
+           </property>
            <property name="spacing">
             <number>5</number>
            </property>
@@ -410,7 +472,6 @@
  <tabstops>
   <tabstop>tabWidget</tabstop>
   <tabstop>numberOfCopiesSpinBox</tabstop>
-  <tabstop>createGapRadioButton</tabstop>
   <tabstop>shiftCreatedItemsRadioButton</tabstop>
   <tabstop>horizShiftSpinBox</tabstop>
   <tabstop>vertShiftSpinBox</tabstop>
@@ -464,4 +525,7 @@
    </hints>
   </connection>
  </connections>
+ <buttongroups>
+  <buttongroup name="shiftButtonGroup"/>
+ </buttongroups>
 </ui>
Index: scribus/usertaskstructs.h
===================================================================
--- scribus/usertaskstructs.h	(revision 19541)
+++ scribus/usertaskstructs.h	(working copy)
@@ -36,7 +36,10 @@
 {
 	int type;
 	int copyCount;
-	int copyShiftOrGap;
+	bool copyShiftOrGap;
+	bool copyNewPage;
+	bool linkFrames;
+	bool newPageSameSide;
 	double copyShiftGapH;
 	double copyShiftGapV;
 	double copyRotation;
