Index: resources/iconsets/1_7_0/16/page-binding-left.svg
===================================================================
--- resources/iconsets/1_7_0/16/page-binding-left.svg	(nicht existent)
+++ resources/iconsets/1_7_0/16/page-binding-left.svg	(Arbeitskopie)
@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><style>@import '../colors.css';</style>
+<path d="M13 15H3V13H2V11H3V9H2V7H3V5H2V3H3V1H13V15ZM4 3H5V5H4V7H5V9H4V11H5V13H4V14H12V2H4V3Z"/>
+</svg>
Index: resources/iconsets/1_7_0/16/page-binding-right.svg
===================================================================
--- resources/iconsets/1_7_0/16/page-binding-right.svg	(nicht existent)
+++ resources/iconsets/1_7_0/16/page-binding-right.svg	(Arbeitskopie)
@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><style>@import '../colors.css';</style>
+<path d="M13 3H14V5H13V7H14V9H13V11H14V13H13V15H3V1H13V3ZM4 14H12V13H11V11H12V9H11V7H12V5H11V3H12V2H4V14Z"/>
+</svg>
Index: resources/iconsets/1_7_0/1_7_0.xml
===================================================================
--- resources/iconsets/1_7_0/1_7_0.xml	(Revision 27164)
+++ resources/iconsets/1_7_0/1_7_0.xml	(Arbeitskopie)
@@ -385,6 +385,8 @@
 		<icon id="list-remove" file="16/action-remove.svg" />		
 		<icon id="lock" file="16/action-lock.svg" />
 		<icon id="lock-unlocked" file="16/action-unlock.svg" />
+		<icon id="page-binding-left" file="16/page-binding-left.svg" />
+		<icon id="page-binding-right" file="16/page-binding-right.svg" />
 		<icon id="page-3fold" file="16/page-type-threefold.svg" />
 		<icon id="page-4fold" file="16/page-type-fourfold.svg" />
 		<icon id="page-doublesided" file="16/page-type-facing.svg" />
Index: scribus/plugins/fileloader/scribus171format/scribus171format.cpp
===================================================================
--- scribus/plugins/fileloader/scribus171format/scribus171format.cpp	(Revision 27164)
+++ scribus/plugins/fileloader/scribus171format/scribus171format.cpp	(Arbeitskopie)
@@ -2533,6 +2533,7 @@
 		m_Doc->setPageOrientation(attrs.valueAsInt("ORIENTATION", 0));
 		m_Doc->FirstPnum = attrs.valueAsInt("FIRSTNUM", 1);
 		m_Doc->setPagePositioning(attrs.valueAsInt("BOOK", 0));
+		m_Doc->setBindingDirection(attrs.valueAsInt("BINDINGDIRECTION", 0));
 
 		m_Doc->setUsesAutomaticTextFrames( attrs.valueAsInt("AUTOTEXT") );
 		m_Doc->PageSp = attrs.valueAsInt("AUTOSPALTEN");
@@ -2599,6 +2600,7 @@
 		m_Doc->setPageOrientation(attrs.valueAsInt("PageOrientation", 0));
 		m_Doc->FirstPnum = attrs.valueAsInt("FirstPageNumber", 1);
 		m_Doc->setPagePositioning(attrs.valueAsInt("PagePositioning", 0));
+		m_Doc->setBindingDirection(attrs.valueAsInt("BindingDirection", 0));
 
 		m_Doc->setUsesAutomaticTextFrames( attrs.valueAsInt("AutomaticTextFrames") );
 		m_Doc->PageSp = attrs.valueAsInt("AutomaticTextFrameColumnCount");
Index: scribus/plugins/fileloader/scribus171format/scribus171format_save.cpp
===================================================================
--- scribus/plugins/fileloader/scribus171format/scribus171format_save.cpp	(Revision 27164)
+++ scribus/plugins/fileloader/scribus171format/scribus171format_save.cpp	(Arbeitskopie)
@@ -336,6 +336,7 @@
 	docu.writeAttribute("PageSize", m_Doc->pageSize());
 	docu.writeAttribute("FirstPageNumber", m_Doc->FirstPnum);
 	docu.writeAttribute("PagePositioning", m_Doc->pagePositioning());
+	docu.writeAttribute("BindingDirection", m_Doc->bindingDirection());
 	if (m_Doc->usesAutomaticTextFrames())
 		docu.writeAttribute("AutomaticTextFrames", 1);
 	docu.writeAttribute("AutomaticTextFrameColumnCount", m_Doc->PageSp);
Index: scribus/plugins/scriptplugin/cmddoc.cpp
===================================================================
--- scribus/plugins/scriptplugin/cmddoc.cpp	(Revision 27164)
+++ scribus/plugins/scriptplugin/cmddoc.cpp	(Arbeitskopie)
@@ -15,22 +15,20 @@
 
 #include <QApplication>
 
-/*
-newDocument(size, margins, orientation, firstPageNumber,
-            unit, pagesType, firstPageOrder)*/
 PyObject *scribus_newdocument(PyObject* /* self */, PyObject* args)
 {
 	double topMargin, bottomMargin, leftMargin, rightMargin;
 	double pageWidth, pageHeight;
 	int orientation, firstPageNr, unit, pagesType, firstPageOrder, numPages;
+	int bindingDirection = 0;
 
 	PyObject *p, *m;
 
-	if ((!PyArg_ParseTuple(args, "OOiiiiii", &p, &m, &orientation,
+	if ((!PyArg_ParseTuple(args, "OOiiiiii|i", &p, &m, &orientation,
 											&firstPageNr, &unit,
 											&pagesType,
 											&firstPageOrder,
-											&numPages)) ||
+											&numPages, &bindingDirection)) ||
 						(!PyArg_ParseTuple(p, "dd", &pageWidth, &pageHeight)) ||
 						(!PyArg_ParseTuple(m, "dddd", &leftMargin, &rightMargin,
 												&topMargin, &bottomMargin)))
@@ -39,12 +37,8 @@
 		numPages = 1;
 	if (pagesType == 0)
 	{
-	//	facingPages = 0;
 		firstPageOrder = 0;
 	}
-//	else
-//		facingPages = 1;
-	// checking the bounds
 	if (pagesType < firstPageOrder)
 	{
 		PyErr_SetString(ScribusException, QObject::tr("firstPageOrder is bigger than allowed.","python error").toUtf8().constData());
@@ -71,7 +65,8 @@
 								// columnDistance, numberCols, autoframes,
 								0, 1, false,
 								pagesType, unit, firstPageOrder,
-								orientation, firstPageNr, "Custom", true, numPages);
+								orientation, firstPageNr, "Custom", true,
+								numPages, true, 0, bindingDirection);
 	ScCore->primaryMainWindow()->doc->setPageSetFirstPage(pagesType, firstPageOrder);
 
 	return PyLong_FromLong(static_cast<long>(ret));
Index: scribus/plugins/scriptplugin/cmddoc.h
===================================================================
--- scribus/plugins/scriptplugin/cmddoc.h	(Revision 27164)
+++ scribus/plugins/scriptplugin/cmddoc.h	(Arbeitskopie)
@@ -14,7 +14,7 @@
 
 PyDoc_STRVAR(scribus_newdocument__doc__,
 QT_TR_NOOP("newDocument(size, margins, orientation, firstPageNumber,\n\
-                        unit, pagesType, firstPageOrder, numPages) -> bool\n\
+                        unit, pagesType, firstPageOrder, numPages, bindingDirection) -> bool\n\
 \n\
 Creates a new document and returns true if successful. The parameters have the\n\
 following meaning:\n\
@@ -42,8 +42,10 @@
 firstPageOrder = What is position of first page in the document.\n\
 Indexed from 0 (0 = first).\n\
 \n\
-numPage = Number of pages to be created.\n\
+numPages = Number of pages to be created.\n\
 \n\
+bindingDirection = 0 = LTR, 1 = RTL (optional, defaults to 0).\n\
+\n\
 The values for width, height and the margins are expressed in the given unit\n\
 for the document. PAPER_* constants are expressed in points. If your document\n\
 is not in points, make sure to account for this.\n\
Index: scribus/prefsmanager.cpp
===================================================================
--- scribus/prefsmanager.cpp	(Revision 27164)
+++ scribus/prefsmanager.cpp	(Arbeitskopie)
@@ -455,6 +455,7 @@
 	pageS.pageNames.append(CommonStrings::pageLocRight);
 	appPrefs.pageSets.append(pageS);
 	appPrefs.docSetupPrefs.pagePositioning = singlePage;
+	appPrefs.docSetupPrefs.bindingDirection = 0;
 	appPrefs.fontPrefs.askBeforeSubstitute = true;
 	appPrefs.miscPrefs.haveStylePreview = true;
 	appPrefs.miscPrefs.saveEmergencyFile = true;
@@ -1385,6 +1386,7 @@
 	deDocumentSetup.setAttribute("MarginRight", ScCLocale::toQStringC(appPrefs.docSetupPrefs.margins.right()));
 	deDocumentSetup.setAttribute("MarginPreset", appPrefs.docSetupPrefs.marginPreset);
 	deDocumentSetup.setAttribute("PagePositioning", appPrefs.docSetupPrefs.pagePositioning);
+	deDocumentSetup.setAttribute("BindingDirection", appPrefs.docSetupPrefs.bindingDirection);
 	deDocumentSetup.setAttribute("AutoSave", static_cast<int>(appPrefs.docSetupPrefs.AutoSave));
 	deDocumentSetup.setAttribute("AutoSaveTime", appPrefs.docSetupPrefs.AutoSaveTime);
 	deDocumentSetup.setAttribute("AutoSaveCount", appPrefs.docSetupPrefs.AutoSaveCount);
@@ -2080,6 +2082,7 @@
 			appPrefs.docSetupPrefs.margins.setRight(ScCLocale::toDoubleC(dc.attribute("MarginRight"), 9.0));
 			appPrefs.docSetupPrefs.marginPreset   = dc.attribute("MarginPreset", "0").toInt();
 			appPrefs.docSetupPrefs.pagePositioning	= dc.attribute("PagePositioning", "0").toInt();
+			appPrefs.docSetupPrefs.bindingDirection	= dc.attribute("BindingDirection", "0").toInt();
 			appPrefs.docSetupPrefs.AutoSave	  = static_cast<bool>(dc.attribute("AutoSave", "0").toInt());
 			appPrefs.docSetupPrefs.AutoSaveTime  = dc.attribute("AutoSaveTime", "600000").toInt();
 			appPrefs.docSetupPrefs.AutoSaveCount  = dc.attribute("AutoSaveCount", "1").toInt();
Index: scribus/prefsstructs.h
===================================================================
--- scribus/prefsstructs.h	(Revision 27164)
+++ scribus/prefsstructs.h	(Arbeitskopie)
@@ -168,6 +168,7 @@
 	bool AutoSaveLocation;
 	QString AutoSaveDir;
 	bool saveCompressed;
+	int bindingDirection; //! 0 = LTR, 1 = RTL
 };
 
 //Guides
Index: scribus/scribus.cpp
===================================================================
--- scribus/scribus.cpp	(Revision 27164)
+++ scribus/scribus.cpp	(Arbeitskopie)
@@ -337,7 +337,7 @@
 	internalCopy = false;
 	internalCopyBuffer.clear();
 	m_doc = new ScribusDoc();
-	m_doc->setup(0, 1, 1, 1, 1, "Custom", "Custom");
+	m_doc->setup(0, 1, 1, 1, 1, "Custom", "Custom", 0);
 	m_doc->setPage(100, 100, 0, 0, 0, 0, 0, 0, false, false);
 	m_doc->addPage(0);
 	m_doc->setGUI(false, this, nullptr);
@@ -2026,6 +2026,7 @@
 		{
 			int facingPages = dia->choosenLayout();
 			int firstPage = dia->layoutFirstPage();
+			int bindingDirection = dia->bindingDirection();
 			docSet = dia->startDocSetup->isChecked();
 			double topMargin = dia->marginGroup->margins().top();
 			double bottomMargin = dia->marginGroup->margins().bottom();
@@ -2039,7 +2040,11 @@
 			int orientation = dia->orientation();
 			int pageCount = dia->pageCountSpinBox->value();
 			QString pagesize = dia->pageSizeName();
-			doFileNew(pageWidth, pageHeight, topMargin, leftMargin, rightMargin, bottomMargin, columnDistance, numberCols, autoframes, facingPages, dia->unitOfMeasureComboBox->currentIndex(), firstPage, orientation, 1, pagesize, true, pageCount, true, dia->marginGroup->marginPreset());
+			doFileNew(pageWidth, pageHeight, topMargin, leftMargin, rightMargin, bottomMargin,
+				columnDistance, numberCols, autoframes, facingPages, dia->unitOfMeasureComboBox->currentIndex(),
+				firstPage, orientation, 1, pagesize, true, pageCount, true, dia->marginGroup->marginPreset(),
+				bindingDirection
+			);
 			doc->setPageSetFirstPage(facingPages, firstPage);
 			doc->bleeds()->set(dia->bleedTop(), dia->bleedLeft(), dia->bleedBottom(), dia->bleedRight());
 			HaveNewDoc();
@@ -2102,6 +2107,7 @@
 
 	int facingPages = dia->choosenLayout();
 	int firstPage = dia->layoutFirstPage();
+	int bindingDirection = dia->bindingDirection();
 	bool docSet = dia->startDocSetup->isChecked();
 	double topMargin = dia->marginGroup->margins().top();
 	double bottomMargin = dia->marginGroup->margins().bottom();
@@ -2116,7 +2122,9 @@
 	int pageCount = dia->pageCountSpinBox->value();
 	QString pagesize = dia->pageSizeName();
 
-	if (doFileNew(pageWidth, pageHeight, topMargin, leftMargin, rightMargin, bottomMargin, columnDistance, numberCols, autoframes, facingPages, dia->unitOfMeasureComboBox->currentIndex(), firstPage, orientation, 1, pagesize, true, pageCount, true, dia->marginGroup->marginPreset()))
+	if (doFileNew(pageWidth, pageHeight, topMargin, leftMargin, rightMargin, bottomMargin, columnDistance, numberCols,
+			autoframes, facingPages, dia->unitOfMeasureComboBox->currentIndex(), firstPage, orientation, 1,
+			pagesize, true, pageCount, true, dia->marginGroup->marginPreset(), bindingDirection))
 	{
 		doc->setPageSetFirstPage(facingPages, firstPage);
 		doc->bleeds()->set(dia->bleedTop(), dia->bleedLeft(), dia->bleedBottom(), dia->bleedRight());
@@ -2135,14 +2143,10 @@
 	return retVal;
 }
 
-//TODO move to core, assign doc to doc list, optionally create gui for it
-ScribusDoc *ScribusMainWindow::newDoc(double width, double height, double topMargin, double leftMargin, double rightMargin, double bottomMargin, double columnDistance, double columnCount, bool autoTextFrames, int pageArrangement, int unitIndex, int firstPageLocation, int orientation, int firstPageNumber, const QString& defaultPageSize, bool requiresGUI, int pageCount, bool showView, int marginPreset)
+ScribusDoc *ScribusMainWindow::doFileNew(double width, double height, double topMargin, double leftMargin, double rightMargin, double bottomMargin,
+	double columnDistance, double columnCount, bool autoTextFrames, int pageArrangement, int unitIndex, int firstPageLocation, int orientation,
+	int firstPageNumber, const QString& defaultPageSize, bool requiresGUI, int pageCount, bool showView, int marginPreset, int bindingDirection)
 {
-	return doFileNew(width, height, topMargin, leftMargin, rightMargin, bottomMargin, columnDistance, columnCount, autoTextFrames, pageArrangement, unitIndex, firstPageLocation, orientation, firstPageNumber, defaultPageSize, requiresGUI, pageCount, showView, marginPreset);
-}
-
-ScribusDoc *ScribusMainWindow::doFileNew(double width, double height, double topMargin, double leftMargin, double rightMargin, double bottomMargin, double columnDistance, double columnCount, bool autoTextFrames, int pageArrangement, int unitIndex, int firstPageLocation, int orientation, int firstPageNumber, const QString& defaultPageSize, bool requiresGUI, int pageCount, bool showView, int marginPreset)
-{
 	if (HaveDoc)
 		outlinePalette->buildReopenVals();
 	m_undoManager->setUndoEnabled(false);
@@ -2189,7 +2193,7 @@
 			doc->PageColors = m_prefsManager.appPrefs.colorPrefs.DColors;
 	}
 	tempDoc->PageColors.ensureDefaultColors();
-	tempDoc->setup(unitIndex, pageArrangement, firstPageLocation, orientation, firstPageNumber, defaultPageSize, newDocName);
+	tempDoc->setup(unitIndex, pageArrangement, firstPageLocation, orientation, firstPageNumber, defaultPageSize, newDocName, bindingDirection);
 	if (requiresGUI)
 	{
 		HaveDoc++;
@@ -9221,7 +9225,7 @@
 			if (fmt)
 			{
 				ScribusDoc *s_doc = new ScribusDoc();
-				s_doc->setup(0, 1, 1, 1, 1, "Custom", "Custom");
+				s_doc->setup(0, 1, 1, 1, 1, "Custom", "Custom", 0);
 				s_doc->setPage(100, 100, 0, 0, 0, 0, 0, 0, false, false);
 				s_doc->addPage(0);
 				s_doc->setGUI(false, this, nullptr);
Index: scribus/scribus.h
===================================================================
--- scribus/scribus.h	(Revision 27164)
+++ scribus/scribus.h	(Arbeitskopie)
@@ -154,8 +154,10 @@
 	inline bool scriptIsRunning(void) const { return (m_ScriptRunning > 0); }
 	inline void setScriptRunning(bool value) { m_ScriptRunning += (value ? 1 : -1); }
 
-	ScribusDoc* doFileNew(double width, double height, double topMargin, double leftMargin, double rightMargin, double bottomMargin, double columnDistance, double columnCount, bool autoTextFrames, int pageArrangement, int unitIndex, int firstPageLocation, int orientation, int firstPageNumber, const QString& defaultPageSize, bool requiresGUI, int pageCount = 1, bool showView = true, int marginPreset = 0);
-	ScribusDoc* newDoc(double width, double height, double topMargin, double leftMargin, double rightMargin, double bottomMargin, double columnDistance, double columnCount, bool autoTextFrames, int pageArrangement, int unitIndex, int firstPageLocation, int orientation, int firstPageNumber, const QString& defaultPageSize, bool requiresGUI, int pageCount = 1, bool showView = true, int marginPreset = 0);
+	ScribusDoc* doFileNew(double width, double height, double topMargin, double leftMargin, double rightMargin,
+		double bottomMargin, double columnDistance, double columnCount, bool autoTextFrames, int pageArrangement,
+		int unitIndex, int firstPageLocation, int orientation, int firstPageNumber, const QString& defaultPageSize,
+		bool requiresGUI, int pageCount = 1, bool showView = true, int marginPreset = 0, int bindingDirection = 0);
 	bool DoFileSave(const QString& fileName, QString* savedFileName = nullptr, uint formatID = FORMATID_CURRENTEXPORT);
 
 	void changeEvent(QEvent *e) override;
Index: scribus/scribusdoc.cpp
===================================================================
--- scribus/scribusdoc.cpp	(Revision 27164)
+++ scribus/scribusdoc.cpp	(Arbeitskopie)
@@ -680,7 +680,7 @@
 	return retList;
 }
 
-void ScribusDoc::setup(int unitIndex, int fp, int firstLeft, int orientation, int firstPageNumber, const QString& defaultPageSize, const QString& documentName)
+void ScribusDoc::setup(int unitIndex, int fp, int firstLeft, int orientation, int firstPageNumber, const QString& defaultPageSize, const QString& documentName, int bindingDirection)
 {
 	m_docPrefsData.docSetupPrefs.docUnitIndex = unitIndex;
 	setPageSetFirstPage(fp, firstLeft);
@@ -688,6 +688,7 @@
 	m_docPrefsData.docSetupPrefs.pageSize = defaultPageSize;
 	FirstPnum = firstPageNumber;
 	m_docPrefsData.docSetupPrefs.pagePositioning = fp;
+	m_docPrefsData.docSetupPrefs.bindingDirection = bindingDirection;
 	setDocumentFileName(documentName);
 	HasCMS = false;
 	if (!pdfOptions().UseLPI)
@@ -6067,11 +6068,21 @@
 	int rowcounter = 0;
 	double maxXPos = 0.0;
 	double maxYPos = 0.0;
+	double lastYPos = Pages->at(0)->initialHeight();
+
+	bool rtlBinding = m_docPrefsData.docSetupPrefs.bindingDirection == 1;
+
 	double currentXPos = m_docPrefsData.displayPrefs.scratch.left();
+	if (rtlBinding)
+	{
+		counter = counter == 1 ? 0 : 1;
+		currentXPos +=  m_docPrefsData.docSetupPrefs.pageWidth
+			- (m_docPrefsData.docSetupPrefs.pageWidth + m_docPrefsData.displayPrefs.pageGapHorizontal) * counter;
+	}
+	else
+		currentXPos += (Pages->at(0)->initialWidth() + m_docPrefsData.displayPrefs.pageGapHorizontal) * counter;
+
 	double currentYPos = m_docPrefsData.displayPrefs.scratch.top();
-	double lastYPos = Pages->at(0)->initialHeight();
-	currentXPos += (Pages->at(0)->initialWidth() + m_docPrefsData.displayPrefs.pageGapHorizontal) * counter;
-	// currentXPos += (m_docPrefsData.docSetupPrefs.pageWidth + m_docPrefsData.displayPrefs.pageGapHorizontal) * counter;
 
 	ScPage* page;
 	int docPageCount = Pages->count();
@@ -6111,29 +6122,63 @@
 			page->setYOffset(currentYPos);
 			if (counter < pageSets()[m_docPrefsData.docSetupPrefs.pagePositioning].Columns-1)
 			{
-				currentXPos += page->width() + m_docPrefsData.displayPrefs.pageGapHorizontal;
+				if (rtlBinding)
+				{
+					ScPage* next_page = Pages->at(i+1); // check width of next page for correct offset
+					int w = next_page ? next_page->width() : page->width();
+					currentXPos -= w + m_docPrefsData.displayPrefs.pageGapHorizontal;
+				}
+				else
+					currentXPos += page->width() + m_docPrefsData.displayPrefs.pageGapHorizontal;
 				lastYPos = qMax(lastYPos, page->height());
 				if (counter == 0)
 				{
-					page->Margins.setLeft(page->initialMargins.right());
-					page->Margins.setRight(page->initialMargins.left());
+					if (rtlBinding)
+					{
+						page->Margins.setLeft(page->initialMargins.left());
+						page->Margins.setRight(page->initialMargins.right());
+					}
+					else
+					{
+						page->Margins.setLeft(page->initialMargins.right());
+						page->Margins.setRight(page->initialMargins.left());
+					}
 				}
 				else
 				{
-					page->Margins.setLeft(page->initialMargins.left());
-					page->Margins.setRight(page->initialMargins.left());
+					if (rtlBinding)
+					{
+						page->Margins.setLeft(page->initialMargins.right());
+						page->Margins.setRight(page->initialMargins.right());
+					}
+					else
+					{
+						page->Margins.setLeft(page->initialMargins.left());
+						page->Margins.setRight(page->initialMargins.left());
+					}
 				}
 			}
 			else
 			{
-				currentXPos = m_docPrefsData.displayPrefs.scratch.left();
+				if (rtlBinding)
+					currentXPos = m_docPrefsData.displayPrefs.scratch.left() + m_docPrefsData.docSetupPrefs.pageWidth;
+				else
+					currentXPos = m_docPrefsData.displayPrefs.scratch.left();
 				if (pageSets()[m_docPrefsData.docSetupPrefs.pagePositioning].Columns > 1)
 					currentYPos += qMax(lastYPos, page->height())+m_docPrefsData.displayPrefs.pageGapVertical;
 				else
 					currentYPos += page->height()+m_docPrefsData.displayPrefs.pageGapVertical;
 				lastYPos = 0;
-				page->Margins.setRight(page->initialMargins.right());
-				page->Margins.setLeft(page->initialMargins.left());
+				if (rtlBinding)
+				{
+					page->Margins.setRight(page->initialMargins.left());
+					page->Margins.setLeft(page->initialMargins.right());
+				}
+				else
+				{
+					page->Margins.setRight(page->initialMargins.right());
+					page->Margins.setLeft(page->initialMargins.left());
+				}
 			}
 			counter++;
 			if (counter > pageSets()[m_docPrefsData.docSetupPrefs.pagePositioning].Columns-1)
Index: scribus/scribusdoc.h
===================================================================
--- scribus/scribusdoc.h	(Revision 27164)
+++ scribus/scribusdoc.h	(Arbeitskopie)
@@ -107,7 +107,10 @@
 	bool inASpecialEditMode() const;
 	QList<PageItem*> getAllItems(const QList<PageItem*> &items) const;
 	QList<PageItem*> *parentGroup(PageItem* item, QList<PageItem*> *list);
-	void setup(int, int, int, int, int, const QString&, const QString&);
+	/**
+	 * @param bindingDirection Defaults to 0 for all the one page temporary documents Scribus creates
+	 */
+	void setup(int unitIndex, int fp, int firstLeft, int orientation, int firstPageNumber, const QString& defaultPageSize, const QString& documentName, int bindingDirection = 0);
 	void setLoading(bool);
 	bool isLoading() const;
 	void setModified(bool);
@@ -217,6 +220,8 @@
 
 	int pageOrientation() const { return m_docPrefsData.docSetupPrefs.pageOrientation; }
 	void setPageOrientation(int o) { m_docPrefsData.docSetupPrefs.pageOrientation = o; }
+	int bindingDirection() const { return m_docPrefsData.docSetupPrefs.bindingDirection; }
+	void setBindingDirection(int d) { m_docPrefsData.docSetupPrefs.bindingDirection = d; }
 	int pagePositioning() const { return m_docPrefsData.docSetupPrefs.pagePositioning; }
 	void setPagePositioning(int p) { m_docPrefsData.docSetupPrefs.pagePositioning = p; }
 
Index: scribus/ui/newdocdialog.cpp
===================================================================
--- scribus/ui/newdocdialog.cpp	(Revision 27164)
+++ scribus/ui/newdocdialog.cpp	(Arbeitskopie)
@@ -63,6 +63,7 @@
 	m_unitRatio = unitGetRatioFromIndex(m_unitIndex);
 	m_unitSuffix = unitGetSuffixFromIndex(m_unitIndex);
 	m_orientation = prefsManager.appPrefs.docSetupPrefs.pageOrientation;
+	m_bindingDirection = prefsManager.appPrefs.docSetupPrefs.bindingDirection;
 
 	buttonVertical->setIcon(iconManager.loadIcon("page-orientation-vertical"));
 	buttonHorizontal->setIcon(iconManager.loadIcon("page-orientation-horizontal"));
@@ -69,6 +70,10 @@
 	buttonSinglePage->setIcon(iconManager.loadIcon("page-simple"));
 	buttonDoublePageLeft->setIcon(iconManager.loadIcon("page-first-left"));
 	buttonDoublePageRight->setIcon(iconManager.loadIcon("page-first-right"));
+	QIcon pageBindingIcon;
+	pageBindingIcon.addPixmap(iconManager.loadPixmap("page-binding-left"), QIcon::Normal, QIcon::Off);
+	pageBindingIcon.addPixmap(iconManager.loadPixmap("page-binding-right"), QIcon::Normal, QIcon::On);
+	buttonBindingDirection->setIcon(pageBindingIcon);
 	labelColumns->setPixmap(iconManager.loadPixmap("paragraph-columns"));
 
 	createNewDocPage();
@@ -98,6 +103,7 @@
 	buttonSinglePage->setToolTip(tr("Single page document"));
 	buttonDoublePageLeft->setToolTip(tr("A document with facing pages, with the first page on the left side"));
 	buttonDoublePageRight->setToolTip(tr("A document with facing pages, with the first page on the right side"));
+	buttonBindingDirection->setToolTip(tr("Bind the pages on the right (LTR) or left (RTL) side"));
 	widthSpinBox->setToolTip( tr( "Width of the document's pages, editable if you have chosen a custom page size" ) );
 	heightSpinBox->setToolTip( tr( "Height of the document's pages, editable if you have chosen a custom page size" ) );
 	pageCountSpinBox->setToolTip( tr( "Initial number of pages of the document" ) );
@@ -112,6 +118,7 @@
 
 	connect(pageOrientationButtons, &QButtonGroup::idClicked, this, &NewDocDialog::setOrientation);
 	connect(pageLayoutButtons, &QButtonGroup::idClicked, this, &NewDocDialog::setLayout);
+	connect(buttonBindingDirection, &QToolButton::toggled, this, &NewDocDialog::setBindingDirection);
 	connect(unitOfMeasureComboBox, SIGNAL(activated(int)), this, SLOT(setUnit(int)));
 	connect(Distance, SIGNAL(valueChanged(double)), this, SLOT(setDistance(double)));
 	connect(autoTextFrame, SIGNAL(clicked()), this, SLOT(handleAutoFrame()));
@@ -155,16 +162,21 @@
 	if (pagePositioning == singlePage)
 	{
 		pageLayoutButtons->button(0)->setChecked(true);
+		buttonBindingDirection->setDisabled(true);
 	}
 	else if (prefsManager.appPrefs.pageSets[pagePositioning].FirstPage == 0)
 	{
 		pageLayoutButtons->button(1)->setChecked(true);
+		buttonBindingDirection->setDisabled(false);
 	}
 	else
 	{
 		pageLayoutButtons->button(2)->setChecked(true);
+		buttonBindingDirection->setDisabled(false);
 	}
 
+	buttonBindingDirection->setChecked(m_bindingDirection);
+
 	listPageFormats->setValues(pageSize, orientation, PageSizeInfo::Preferred, PageSizeList::NameAsc);
 
 	pageSizeSelector->setHasFormatSelector(false);
@@ -525,20 +537,28 @@
 	{
 		case 0:
 			setDocLayout(0);
+			buttonBindingDirection->setDisabled(true);
 		break;
 		case 1:
 			setDocLayout(1);
 			pagePreview->setFirstPage(0);
 			setDocFirstPage(0);
+			buttonBindingDirection->setDisabled(false);
 		break;
 		case 2:
 			setDocLayout(1);
 			pagePreview->setFirstPage(1);
 			setDocFirstPage(1);
+			buttonBindingDirection->setDisabled(false);
 		break;
 	}
 }
 
+void NewDocDialog::setBindingDirection(bool checked)
+{
+	m_bindingDirection = int(checked);
+}
+
 void NewDocDialog::setPageSize(const QString &size)
 {
 	setSize(size);
Index: scribus/ui/newdocdialog.h
===================================================================
--- scribus/ui/newdocdialog.h	(Revision 27164)
+++ scribus/ui/newdocdialog.h	(Arbeitskopie)
@@ -76,6 +76,7 @@
 
 	int orientation() const { return m_orientation;}
 	int choosenLayout() const { return m_choosenLayout;}
+	int bindingDirection() const { return m_bindingDirection; }
 	int layoutFirstPage() const { return m_layoutFirstPage; }
 	double pageWidth() const { return m_pageWidth;}
 	double pageHeight() const { return m_pageHeight;}
@@ -94,6 +95,7 @@
 	void ExitOK();
 	void setOrientation(int ori);
 	void setLayout(int layoutId);
+	void setBindingDirection(bool checked);
 	void setPageSize(const QString &);
 	void setDocLayout(int layout);
 	void setDocFirstPage(int firstPage);
@@ -126,6 +128,7 @@
 	double m_unitRatio { 1.0 };
 	int m_orientation { 0 };
 	int m_choosenLayout { 0 };
+	int m_bindingDirection { 0 }; // 0 = LTR, 1 = RTL
 	int m_layoutFirstPage { 0 };
 	double m_pageWidth { 1.0 };
 	double m_pageHeight { 1.0 };
Index: scribus/ui/newdocdialog.ui
===================================================================
--- scribus/ui/newdocdialog.ui	(Revision 27164)
+++ scribus/ui/newdocdialog.ui	(Arbeitskopie)
@@ -474,6 +474,16 @@
                         </property>
                        </widget>
                       </item>
+                      <item>
+                       <widget class="QToolButton" name="buttonBindingDirection">
+                        <property name="text">
+                         <string/>
+                        </property>
+                        <property name="checkable">
+                         <bool>true</bool>
+                        </property>
+                       </widget>
+                      </item>
                      </layout>
                     </item>
                    </layout>
Index: scribus/ui/pagepalette_pages.cpp
===================================================================
--- scribus/ui/pagepalette_pages.cpp	(Revision 27164)
+++ scribus/ui/pagepalette_pages.cpp	(Arbeitskopie)
@@ -379,12 +379,10 @@
 	pageLayout->setScheme(currView->m_doc->pagePositioning());
 	pageLayout->setFirstPage(currentPageSet.FirstPage);
 
-	int counter = currentPageSet.FirstPage;
-	int cols = currentPageSet.Columns;
-
+	pageViewWidget->pageGrid()->setBindingDirection(currView->m_doc->bindingDirection());
 	pageViewWidget->pageGrid()->setDocumentPageSize(QSize(currView->m_doc->pageWidth(), currView->m_doc->pageHeight()));
-	pageViewWidget->pageGrid()->setPageInGroup(cols);
-	pageViewWidget->pageGrid()->setPageOffset(counter);
+	pageViewWidget->pageGrid()->setPageInGroup(currentPageSet.Columns);
+	pageViewWidget->pageGrid()->setPageOffset(currentPageSet.FirstPage);
 
 	m_pagePreviewUpdatePending = false;
 
@@ -456,6 +454,7 @@
 		return;
 
 	pageViewWidget->pageGrid()->setSelectionColor(PrefsManager::instance().appPrefs.displayPrefs.pageBorderColor);
+	pageViewWidget->pageGrid()->setBindingDirection(view->m_doc->bindingDirection());
 
 //	if (currView)
 //		connect(currView->m_doc, SIGNAL(pagePreviewChanged()), this, SLOT(updatePagePreview()));
Index: scribus/ui/pagepalette_widgets.cpp
===================================================================
--- scribus/ui/pagepalette_widgets.cpp	(Revision 27164)
+++ scribus/ui/pagepalette_widgets.cpp	(Arbeitskopie)
@@ -318,7 +318,8 @@
 
 void PageGrid::setPageOffset(int pageCount)
 {
-	m_pageOffset = pageCount;
+	m_pageOffset = columnNormalized(pageCount);
+
 	calculateSize();
 	update();
 }
@@ -328,6 +329,8 @@
 
 	if ( r == -1 || c == -1) return -1;
 
+	c = columnNormalized(c);
+
 	int id = (r == 0) ? c : r * columns() + c;
 	id -= m_pageOffset;
 
@@ -363,9 +366,9 @@
 	return m_rowHeight - m_fontSize - m_labelGap;
 }
 
-void PageGrid::setSelectedPage(int pageID)
+void PageGrid::setSelectedPage(int pageId)
 {
-	m_selectedPage = clampPageId(pageID);
+	m_selectedPage = clampPageId(pageId);
 	update();
 }
 
@@ -398,6 +401,11 @@
 	return qCeil( (double)(pageCount() + m_pageOffset + 1) / (double)columns() );
 }
 
+int PageGrid::columnNormalized(int column)
+{
+	return m_rtlBinding ? columns() - column - 1: column;
+}
+
 int PageGrid::columnAt(QPoint pos)
 {
 	if(pageCount() == 0) return -1;
@@ -407,28 +415,21 @@
 
 	int m_col = -1;
 
-	int cellId = row * m_cellsInGroup;
-	int pageId = cellId - m_pageOffset;
 	QRect cellRect(m_groupSpace, m_rowSpace + row * (rowHeight() + m_rowSpace), dummyPageSize().width(), rowHeight());
 	int width = 0;
 
-	for (int i = 0; i < m_cellsInGroup; ++i)
+	for (int i = 0; i <= m_cellsInGroup; ++i)
 	{
+		int id = pageId(row, i, false);
 
-		int id = cellId + i;
-
 		// skip empty cells
-		if (id < m_pageOffset || id >= pageCount() + m_pageOffset)
+		if (pageInRange(id))
 		{
-			//qDebug() << "Cell" << id << "is Empty";
-			width = dummyPageSize().width();
+			PageCell *pc = pageList.at(id);
+			width = pc->pageWidthByHeight(pageHeight());
 		}
 		else
-		{
-			//qDebug() << "Cell" << id << "is Page" << "PageId" << pageId + i;
-			PageCell *pc = pageList.at(pageId + i);
-			width = pc->pageWidthByHeight(pageHeight());
-		}
+			width = dummyPageSize().width();
 
 		cellRect.setWidth( width );
 
@@ -435,7 +436,6 @@
 		if(cellRect.contains(pos))
 		{
 			m_col = i;
-			//qDebug() << "Page" << pageId + i << "at" << pos << "in column"<< i;
 			break;
 		}
 
@@ -462,23 +462,19 @@
 {
 	if(pageCount() == 0 || rowId < 0) return -1;
 
-	int cellId = rowId * m_cellsInGroup;
-	int pageId = cellId - m_pageOffset;
 	int width = 0;
 
 	for (int i = 0; i < m_cellsInGroup; ++i)
 	{
-		int id = cellId + i;
+		int id = pageId(rowId, i, false);
 
-		if (id < m_pageOffset || id >= pageCount() + m_pageOffset)
+		if (pageInRange(id))
 		{
-			width += dummyPageSize().width();
+			PageCell *pc = pageList.at(id);
+			width += pc->pageWidthByHeight(pageHeight());
 		}
 		else
-		{
-			PageCell *pc = pageList.at(pageId + i);
-			width += pc->pageWidthByHeight(pageHeight());
-		}
+			width += dummyPageSize().width();
 
 		width += m_cellGap;
 
@@ -494,33 +490,26 @@
 {
 	if ( row == -1 || col == -1) return QRect();
 
-	int cellId = row * m_cellsInGroup;
-	int pageId = cellId - m_pageOffset;
 	QRect cellRect(m_groupSpace, m_rowSpace + row * (rowHeight() + m_rowSpace), dummyPageSize().width(), rowHeight());
 	int width = 0;
 
-	for (int i = 0; i < m_cellsInGroup; ++i)
+	for (int i = 0; i <= m_cellsInGroup; ++i)
 	{
+		int id = pageId(row, i, false);
 
-		int id = cellId + i;
-
 		// skip empty cells
-		if (id < m_pageOffset || id >= pageCount() + m_pageOffset)
+		if (pageInRange(id))
 		{
-			width = dummyPageSize().width();
+			PageCell *pc = pageList.at(id);
+			width = pc->pageWidthByHeight(pageHeight());
 		}
 		else
-		{
-			PageCell *pc = pageList.at(pageId + i);
-			width = pc->pageWidthByHeight(pageHeight());
-		}
+			width = dummyPageSize().width();
 
 		cellRect.setWidth( width );
 
-		if(i == col)
-		{
+		if(id == pageId(row, col, false))
 			return cellRect;
-		}
 
 		cellRect.setX(cellRect.x() + width + m_cellGap);
 	};
@@ -534,12 +523,10 @@
 	double ratio = m_documentPageSize.width() / m_documentPageSize.height();
 	QSize dummySize(pageHeight() * ratio, pageHeight());
 
-	//qDebug() << dummySize << ratio << m_documentPageSize.width() << m_documentPageSize.height();
-
 	return dummySize;
 }
 
-QPoint PageGrid::mapPosToCell(QPoint pos, Mode &mode)
+QRect PageGrid::mapPosToCell(QPoint pos, Mode &mode)
 {
 	int col = columnAt(pos);
 	int row = rowAt(pos);
@@ -548,7 +535,7 @@
 	if (col == -1 || row == -1)
 	{
 		mode = Mode::Invalid;
-		return QPoint();
+		return QRect();
 	}
 
 	int id = pageId(row, col, false);
@@ -557,7 +544,7 @@
 	int y = cellRect.y();
 
 	// cell doesn't have a page
-	if (id < 0 || id >= pageCount()){
+	if (!pageInRange(id)){
 		mode = Mode::Add;
 	}
 	else
@@ -564,6 +551,10 @@
 	{
 		// check if mouse is on "insert area"
 		QRect insertArea(x, y, 8, rowHeight());
+
+		if (m_rtlBinding)
+			insertArea = QRect(cellRect.right() - 8, y, 8, rowHeight());
+
 		if (insertArea.contains(pos))
 			mode = Mode::Insert;
 		else
@@ -570,26 +561,25 @@
 			mode = Mode::Hover;
 	}
 
-	return QPoint(x,y);
+	return cellRect;
 }
 
 QPoint PageGrid::pagePosition(int pageId)
 {
-	if (pageId < 0 || pageId >= pageCount()) return QPoint();
+	if (!pageInRange(pageId)) return QPoint();
 
 	int row = qCeil( (pageId + m_pageOffset) / m_cellsInGroup );
-	int col = 0;
 
-	return rectAt(row, col).topLeft();
+	return rectAt(row, 0).topLeft();
 }
 
-int PageGrid::clampPageId(int pageID, bool allowPlusOne)
+int PageGrid::clampPageId(int pageId, bool allowPlusOne)
 {
 	// Always returns 0 if there is no page in the page list
 	if (pageCount() == 0) return 0;
 
 	int max = (allowPlusOne) ? pageCount() : pageCount() -1;
-	return qBound( 0, pageID, max);
+	return qBound( 0, pageId, max);
 }
 
 
@@ -606,7 +596,7 @@
 	int id = pageId(row, col);
 
 	// check if page id is in range of an existing cell
-	if (id > -1 && id < pageCount() )
+	if (pageInRange(id))
 	{
 		int newSelectedPage = clampPageId( id );
 
@@ -623,7 +613,7 @@
 void PageGrid::updateModeMarker(QPoint pos)
 {	
 	Mode mode;
-	QPoint mapPos = mapPosToCell(pos, mode);
+	QRect mapPos = mapPosToCell(pos, mode);
 
 	// check if mouse is on "insert area"
 	switch (mode)
@@ -636,7 +626,13 @@
 	case Mode::Insert:
 	{
 		int selectorWidth = 4;
-		int offsetX = mapPos.x() - selectorWidth / 2 - qRound((double)m_cellGap / 2);
+		int offsetX;
+
+		if (m_rtlBinding)
+			offsetX = mapPos.right() - selectorWidth / 2 + qRound((double)m_cellGap / 2);
+		else
+			offsetX = mapPos.left() - selectorWidth / 2 - qRound((double)m_cellGap / 2);
+
 		m_rectInsert = QRect(offsetX, mapPos.y() - 4, selectorWidth, pageHeight() + 8 );
 		m_rectAdd = QRect();
 		m_hoveredPage = -1;
@@ -789,6 +785,12 @@
 	m_contextMenu->exec( mapToGlobal(pos) );
 }
 
+
+void PageGrid::setBindingDirection(int rtl_binding)
+{
+	m_rtlBinding = rtl_binding == 1;
+}
+
 /* ********************************************************************************* *
  *
  * Events
@@ -797,8 +799,6 @@
 
 void PageGrid::paintEvent(QPaintEvent *event)
 {
-
-	int count = 0;
 	int x = m_groupSpace;
 	int y = m_rowSpace;
 	int offset = 0;
@@ -812,9 +812,6 @@
 
 	if (pageCount() == 0) return;
 
-//	QElapsedTimer timer;
-//	timer.start();
-
 	// Draw pages
 	for (int r = 0; r < rows(); r++)
 	{
@@ -825,33 +822,42 @@
 		for (int c = 0; c < columns(); c++)
 		{
 
+			int id = pageId(r, c, false);
+
 			// cell is after last page cell
-			if (count >= pageCount() + m_pageOffset)
+			if (id >= pageCount() + columns())
 				break;
 
 			// cell is a page cell
-			if (count >= m_pageOffset && count < pageCount() + m_pageOffset)
+			if (pageInRange(id))
 			{
-				int id = count - m_pageOffset;
 				PageCell * cell = getPageItem(id);
+
 				if (id == m_selectedPage)
 					selectedPageRect = QRect(x, y, cell->pageWidthByHeight(pageHeight()), pageHeight() );
+
 				QPoint pos(x,y);
 				bool isRightPage = (m_cellsInGroup == c + 1 && m_cellsInGroup > 1);
 				drawTile(painter, pos, cell, (id == m_selectedPage) ? true : false, (id == m_hoveredPage) ? true : false, foregroundColor, isRightPage);
 
+				bool ltrLast = !m_rtlBinding && id == pageCount() -1;
+				bool rtlFirst = m_rtlBinding && id == 0;
+
 				// add space only between pages
-				if ((c + 1) % m_cellsInGroup == 0 || count == pageCount() + m_pageOffset -1)
+				if ((c + 1) % m_cellsInGroup == 0 || ltrLast || rtlFirst)
 					offset = 0;
 				else
 					offset = m_cellGap;
 
+				if(isLastRow(r + 1))
+					groupStart = m_rtlBinding ? x : m_groupSpace;
 
-				x += cell->pageWidthByHeight(pageHeight()) + offset;
-				groupWidth += cell->pageWidthByHeight(pageHeight()) + offset;
+				int w = cell->pageWidthByHeight(pageHeight()) + offset;
+				x += w;
+				groupWidth += w;
+
 				drawGroupRect = true;
 
-
 			}
 			// cell is before first page cell
 			else
@@ -860,11 +866,9 @@
 				x += dummyPageSize().width() + offset;
 
 				// adjust start on first row if first page has an offset
-				if(r == 0)
-					groupStart = x;
+				if(isFirstRow(r))
+					groupStart = m_rtlBinding ? m_groupSpace : x;
 			}
-
-			count++;
 		}
 
 		// Draw group border
@@ -952,7 +956,7 @@
 		if ( r == -1 || c == -1 )
 			return;
 
-		int p = pageId(r, c);
+		int id = pageId(r, c);
 		Mode mode;
 		mapPosToCell(dropEventPos, mode);
 
@@ -960,10 +964,10 @@
 		{
 		case Mode::Add:
 		case Mode::Insert:
-			emit newPage(p, tmp);
+			emit newPage(id, tmp);
 			break;
 		case Mode::Hover:
-			emit useTemplate(tmp, clampPageId(p));
+			emit useTemplate(tmp, clampPageId(id));
 			break;
 		case Mode::Invalid:
 			break;
@@ -1050,9 +1054,9 @@
 
 			int row = rowAt(mouseEventPos);
 			int col = columnAt(mouseEventPos);
-			int pageID = pageId(row, col);
+			int id = pageId(row, col);
 
-			if (pageID > -1 && pageID < pageCount() )
+			if (pageInRange(id))
 				emit click(m_selectedPage, event->button());
 		}
 		break;
Index: scribus/ui/pagepalette_widgets.h
===================================================================
--- scribus/ui/pagepalette_widgets.h	(Revision 27164)
+++ scribus/ui/pagepalette_widgets.h	(Arbeitskopie)
@@ -75,8 +75,8 @@
 	QPoint m_mousePos;
 	bool m_mousePressed {false};
 	bool m_thumb {false};
-	QString m_prefsContext = "PagePalette";
-	QString m_prefsName = "showMasterThumbnails";
+	QString m_prefsContext = "PagePalette";
+	QString m_prefsName = "showMasterThumbnails";
 
 };
 
@@ -134,6 +134,9 @@
 	void setPageLayout(PageLayout layout);
 	PageLayout pageLayout() { return m_pageLayout; };
 
+	/**
+	 * @param offset currrently it's 0 for single page document documents, 0 or 1 for double page document.
+	 */
 	void setPageOffset(int pageCount);
 	int pageOffset() { return m_pageOffset; };
 
@@ -147,7 +150,8 @@
 	int pageCount();
 	int pageHeight();
 
-	void setSelectedPage(int pageID);
+	void setSelectedPage(int pageId);
+	void setBindingDirection(int rtl_binding);
 	int selectedPage() { return m_selectedPage; };
 
 	void deleteSelectedPage();
@@ -190,10 +194,16 @@
 	int m_cellsInGroup {1}; // 1 for single page
 	int m_pageOffset {0};
 	QMenu *m_contextMenu {nullptr};
+	bool m_rtlBinding = false;
 
 	int columns();
 	int rows();
 
+	int columnNormalized(int column);
+
+	bool isFirstRow(int row) { return row == 0 ? true : false; };
+	bool isLastRow(int row) { return row == rows() ? true : false; };
+
 	int columnAt(QPoint pos);
 	int rowAt(QPoint pos);
 	int rowWidth(int rowId);
@@ -201,10 +211,11 @@
 
 	QSize dummyPageSize();
 
-	QPoint mapPosToCell(QPoint pos, Mode &mode);
+	QRect mapPosToCell(QPoint pos, Mode &mode);
 	QPoint pagePosition(int pageId);
 
-	int clampPageId(int pageID, bool allowPlusOne = false);
+	int clampPageId(int pageId, bool allowPlusOne = false);
+	bool pageInRange(int pageId) { return pageId >= 0 && pageId < pageCount(); };
 
 	void updateSelectedPage(QPoint pos);
 	void updateModeMarker(QPoint pos);
Index: scribus/ui/preferences/prefs_documentsetup.cpp
===================================================================
--- scribus/ui/preferences/prefs_documentsetup.cpp	(Revision 27164)
+++ scribus/ui/preferences/prefs_documentsetup.cpp	(Arbeitskopie)
@@ -63,6 +63,9 @@
 	layoutFirstPageIsComboBox->addItem(" ");
 	layoutFirstPageIsComboBox->setCurrentIndex(0);
 	layoutFirstPageIsComboBox->setEnabled(false);
+	bindingDirectionButtonGroup->setId(leftToRightRadioButton, 0);
+	bindingDirectionButtonGroup->setId(rightToLeftRadioButton, 1);
+	leftToRightRadioButton->setChecked(true);
 
 	pageWidthSpinBox->setMaximum(16777215);
 	pageHeightSpinBox->setMaximum(16777215);
@@ -176,6 +179,16 @@
 
 	layoutFirstPageIsComboBox->setCurrentIndex(prefsData->pageSets[prefsData->docSetupPrefs.pagePositioning].FirstPage);
 
+	switch (prefsData->docSetupPrefs.bindingDirection)
+	{
+		case 0:
+				leftToRightRadioButton->setChecked(true);
+				break;
+		case 1:
+				rightToLeftRadioButton->setChecked(true);
+				break;
+	}
+
 	pageWidthSpinBox->blockSignals(false);
 	pageHeightSpinBox->blockSignals(false);
 	pageOrientationComboBox->blockSignals(false);
@@ -221,6 +234,7 @@
 	prefsData->docSetupPrefs.pageWidth = pageW;
 	prefsData->docSetupPrefs.pageHeight = pageH;
 	prefsData->docSetupPrefs.pagePositioning = pageLayoutButtonGroup->checkedId();
+	prefsData->docSetupPrefs.bindingDirection = bindingDirectionButtonGroup->checkedId();
 	prefsData->pageSets[prefsData->docSetupPrefs.pagePositioning].FirstPage = layoutFirstPageIsComboBox->currentIndex();
 
 	prefsData->docSetupPrefs.margins = marginsWidget->margins();
Index: scribus/ui/preferences/prefs_documentsetupbase.ui
===================================================================
--- scribus/ui/preferences/prefs_documentsetupbase.ui	(Revision 27164)
+++ scribus/ui/preferences/prefs_documentsetupbase.ui	(Arbeitskopie)
@@ -39,7 +39,7 @@
    <item>
     <widget class="Line" name="line">
      <property name="orientation">
-      <enum>Qt::Orientation::Horizontal</enum>
+      <enum>Qt::Orientation::Horizontal</enum>
      </property>
     </widget>
    </item>
@@ -68,7 +68,7 @@
          <item>
           <spacer name="horizontalSpacer_3">
            <property name="orientation">
-            <enum>Qt::Orientation::Horizontal</enum>
+            <enum>Qt::Orientation::Horizontal</enum>
            </property>
            <property name="sizeHint" stdset="0">
             <size>
@@ -83,10 +83,10 @@
        <item>
         <spacer name="verticalSpacer">
          <property name="orientation">
-          <enum>Qt::Orientation::Vertical</enum>
+          <enum>Qt::Orientation::Vertical</enum>
          </property>
          <property name="sizeType">
-          <enum>QSizePolicy::Policy::Fixed</enum>
+          <enum>QSizePolicy::Policy::Fixed</enum>
          </property>
          <property name="sizeHint" stdset="0">
           <size>
@@ -111,7 +111,7 @@
        <item>
         <widget class="Line" name="line_2">
          <property name="orientation">
-          <enum>Qt::Orientation::Horizontal</enum>
+          <enum>Qt::Orientation::Horizontal</enum>
          </property>
         </widget>
        </item>
@@ -127,12 +127,12 @@
          <item row="0" column="1">
           <layout class="QHBoxLayout" name="pageSizeLayout">
            <item>
-            <widget class="PageSizeSelector" name="pageSizeSelector" native="true"/>
+            <widget class="PageSizeSelector" name="pageSizeSelector" native="true"/>
            </item>
            <item>
             <widget class="QToolButton" name="pageSizeLinkToolButton">
              <property name="arrowType">
-              <enum>Qt::ArrowType::NoArrow</enum>
+              <enum>Qt::ArrowType::NoArrow</enum>
              </property>
             </widget>
            </item>
@@ -209,7 +209,7 @@
        <item>
         <spacer name="verticalSpacer_5">
          <property name="orientation">
-          <enum>Qt::Orientation::Vertical</enum>
+          <enum>Qt::Orientation::Vertical</enum>
          </property>
          <property name="sizeHint" stdset="0">
           <size>
@@ -241,7 +241,7 @@
        <item>
         <widget class="Line" name="line_3">
          <property name="orientation">
-          <enum>Qt::Orientation::Horizontal</enum>
+          <enum>Qt::Orientation::Horizontal</enum>
          </property>
         </widget>
        </item>
@@ -260,7 +260,7 @@
          <item row="4" column="1">
           <widget class="QComboBox" name="layoutFirstPageIsComboBox">
            <property name="sizeAdjustPolicy">
-            <enum>QComboBox::SizeAdjustPolicy::AdjustToContents</enum>
+            <enum>QComboBox::SizeAdjustPolicy::AdjustToContents</enum>
            </property>
           </widget>
          </item>
@@ -307,12 +307,39 @@
            </attribute>
           </widget>
          </item>
+         <item row="5" column="0">
+          <widget class="QLabel" name="layoutBindingDirectionLabel">
+           <property name="text">
+            <string>Binding Direction:</string>
+           </property>
+          </widget>
+         </item>
+         <item row="5" column="1">
+          <widget class="QRadioButton" name="leftToRightRadioButton">
+           <property name="text">
+            <string>Left to Right</string>
+           </property>
+           <attribute name="buttonGroup">
+            <string notr="true">bindingDirectionButtonGroup</string>
+           </attribute>
+          </widget>
+         </item>
+         <item row="6" column="1">
+          <widget class="QRadioButton" name="rightToLeftRadioButton">
+           <property name="text">
+            <string>Right to Left</string>
+           </property>
+           <attribute name="buttonGroup">
+            <string notr="true">bindingDirectionButtonGroup</string>
+           </attribute>
+          </widget>
+         </item>
         </layout>
        </item>
        <item>
         <spacer name="verticalSpacer_8">
          <property name="orientation">
-          <enum>Qt::Orientation::Vertical</enum>
+          <enum>Qt::Orientation::Vertical</enum>
          </property>
          <property name="sizeHint" stdset="0">
           <size>
@@ -344,10 +371,10 @@
        <item>
         <widget class="QScrollArea" name="scrollArea">
          <property name="frameShape">
-          <enum>QFrame::Shape::NoFrame</enum>
+          <enum>QFrame::Shape::NoFrame</enum>
          </property>
          <property name="frameShadow">
-          <enum>QFrame::Shadow::Plain</enum>
+          <enum>QFrame::Shadow::Plain</enum>
          </property>
          <property name="lineWidth">
           <number>0</number>
@@ -360,8 +387,8 @@
            <rect>
             <x>0</x>
             <y>0</y>
-            <width>494</width>
-            <height>575</height>
+            <width>283</width>
+            <height>236</height>
            </rect>
           </property>
           <layout class="QVBoxLayout" name="verticalLayout_5">
@@ -380,7 +407,7 @@
            <item>
             <widget class="Line" name="line_5">
              <property name="orientation">
-              <enum>Qt::Orientation::Horizontal</enum>
+              <enum>Qt::Orientation::Horizontal</enum>
              </property>
             </widget>
            </item>
@@ -404,7 +431,7 @@
              <item>
               <spacer name="horizontalSpacer_6">
                <property name="orientation">
-                <enum>Qt::Orientation::Horizontal</enum>
+                <enum>Qt::Orientation::Horizontal</enum>
                </property>
                <property name="sizeHint" stdset="0">
                 <size>
@@ -433,10 +460,10 @@
            <item>
             <spacer name="verticalSpacer_3">
              <property name="orientation">
-              <enum>Qt::Orientation::Vertical</enum>
+              <enum>Qt::Orientation::Vertical</enum>
              </property>
              <property name="sizeType">
-              <enum>QSizePolicy::Policy::Fixed</enum>
+              <enum>QSizePolicy::Policy::Fixed</enum>
              </property>
              <property name="sizeHint" stdset="0">
               <size>
@@ -461,7 +488,7 @@
            <item>
             <widget class="Line" name="line_4">
              <property name="orientation">
-              <enum>Qt::Orientation::Horizontal</enum>
+              <enum>Qt::Orientation::Horizontal</enum>
              </property>
             </widget>
            </item>
@@ -485,7 +512,7 @@
              <item>
               <spacer name="horizontalSpacer_7">
                <property name="orientation">
-                <enum>Qt::Orientation::Horizontal</enum>
+                <enum>Qt::Orientation::Horizontal</enum>
                </property>
                <property name="sizeHint" stdset="0">
                 <size>
@@ -500,7 +527,7 @@
            <item>
             <spacer name="verticalSpacer_4">
              <property name="orientation">
-              <enum>Qt::Orientation::Vertical</enum>
+              <enum>Qt::Orientation::Vertical</enum>
              </property>
              <property name="sizeHint" stdset="0">
               <size>
@@ -538,10 +565,10 @@
        <item>
         <spacer name="verticalSpacer_6">
          <property name="orientation">
-          <enum>Qt::Orientation::Vertical</enum>
+          <enum>Qt::Orientation::Vertical</enum>
          </property>
          <property name="sizeType">
-          <enum>QSizePolicy::Policy::Fixed</enum>
+          <enum>QSizePolicy::Policy::Fixed</enum>
          </property>
          <property name="sizeHint" stdset="0">
           <size>
@@ -566,7 +593,7 @@
        <item>
         <widget class="Line" name="line_6">
          <property name="orientation">
-          <enum>Qt::Orientation::Horizontal</enum>
+          <enum>Qt::Orientation::Horizontal</enum>
          </property>
         </widget>
        </item>
@@ -617,7 +644,7 @@
          <item>
           <spacer name="horizontalSpacer_2">
            <property name="orientation">
-            <enum>Qt::Orientation::Horizontal</enum>
+            <enum>Qt::Orientation::Horizontal</enum>
            </property>
            <property name="sizeHint" stdset="0">
             <size>
@@ -680,10 +707,10 @@
        <item>
         <spacer name="verticalSpacer_7">
          <property name="orientation">
-          <enum>Qt::Orientation::Vertical</enum>
+          <enum>Qt::Orientation::Vertical</enum>
          </property>
          <property name="sizeType">
-          <enum>QSizePolicy::Policy::Maximum</enum>
+          <enum>QSizePolicy::Policy::Maximum</enum>
          </property>
          <property name="sizeHint" stdset="0">
           <size>
@@ -708,7 +735,7 @@
        <item>
         <widget class="Line" name="line_7">
          <property name="orientation">
-          <enum>Qt::Orientation::Horizontal</enum>
+          <enum>Qt::Orientation::Horizontal</enum>
          </property>
         </widget>
        </item>
@@ -734,7 +761,7 @@
          <item>
           <spacer name="horizontalSpacer">
            <property name="orientation">
-            <enum>Qt::Orientation::Horizontal</enum>
+            <enum>Qt::Orientation::Horizontal</enum>
            </property>
            <property name="sizeHint" stdset="0">
             <size>
@@ -749,7 +776,7 @@
        <item>
         <spacer name="verticalSpacer_2">
          <property name="orientation">
-          <enum>Qt::Orientation::Vertical</enum>
+          <enum>Qt::Orientation::Vertical</enum>
          </property>
          <property name="sizeHint" stdset="0">
           <size>
@@ -777,12 +804,12 @@
    <header location="global">ui/newmarginwidget.h</header>
    <container>1</container>
   </customwidget>
-  <customwidget>
-   <class>PageSizeSelector</class>
-   <extends>QWidget</extends>
-   <header>ui/widgets/pagesizeselector.h</header>
-   <container>1</container>
-  </customwidget>
+  <customwidget>
+   <class>PageSizeSelector</class>
+   <extends>QWidget</extends>
+   <header>ui/widgets/pagesizeselector.h</header>
+   <container>1</container>
+  </customwidget>
  </customwidgets>
  <tabstops>
   <tabstop>tabWidget</tabstop>
@@ -885,5 +912,6 @@
  </connections>
  <buttongroups>
   <buttongroup name="pageLayoutButtonGroup"/>
+  <buttongroup name="bindingDirectionButtonGroup"/>
  </buttongroups>
 </ui>
Index: scribus/ui/prefs_documentsetup.cpp
===================================================================
--- scribus/ui/prefs_documentsetup.cpp	(Revision 27146)
+++ scribus/ui/prefs_documentsetup.cpp	(Arbeitskopie)
@@ -63,6 +63,9 @@
 	layoutFirstPageIsComboBox->addItem(" ");
 	layoutFirstPageIsComboBox->setCurrentIndex(0);
 	layoutFirstPageIsComboBox->setEnabled(false);
+	bindingDirectionButtonGroup->setId(leftToRightRadioButton, 0);
+	bindingDirectionButtonGroup->setId(rightToLeftRadioButton, 1);
+	leftToRightRadioButton->setChecked(true);
 
 	pageWidthSpinBox->setMaximum(16777215);
 	pageHeightSpinBox->setMaximum(16777215);
@@ -176,6 +179,16 @@
 
 	layoutFirstPageIsComboBox->setCurrentIndex(prefsData->pageSets[prefsData->docSetupPrefs.pagePositioning].FirstPage);
 
+	switch (prefsData->docSetupPrefs.bindingDirection)
+	{
+		case 0:
+			leftToRightRadioButton->setChecked(true);
+			break;
+		case 1:
+			rightToLeftRadioButton->setChecked(true);
+			break;
+	}
+
 	pageWidthSpinBox->blockSignals(false);
 	pageHeightSpinBox->blockSignals(false);
 	pageOrientationComboBox->blockSignals(false);
@@ -221,6 +234,7 @@
 	prefsData->docSetupPrefs.pageWidth = pageW;
 	prefsData->docSetupPrefs.pageHeight = pageH;
 	prefsData->docSetupPrefs.pagePositioning = pageLayoutButtonGroup->checkedId();
+	prefsData->docSetupPrefs.bindingDirection = bindingDirectionButtonGroup->checkedId();
 	prefsData->pageSets[prefsData->docSetupPrefs.pagePositioning].FirstPage = layoutFirstPageIsComboBox->currentIndex();
 
 	prefsData->docSetupPrefs.margins = marginsWidget->margins();
Index: scribus/ui/prefs_documentsetupbase.ui
===================================================================
--- scribus/ui/prefs_documentsetupbase.ui	(Revision 27146)
+++ scribus/ui/prefs_documentsetupbase.ui	(Arbeitskopie)
@@ -307,6 +307,33 @@
            </attribute>
           </widget>
          </item>
+         <item row="5" column="0">
+          <widget class="QLabel" name="layoutBindingDirectionLabel">
+           <property name="text">
+            <string>Binding Direction:</string>
+           </property>
+          </widget>
+         </item>
+         <item row="5" column="1">
+          <widget class="QRadioButton" name="leftToRightRadioButton">
+           <property name="text">
+            <string>Left to Right</string>
+           </property>
+           <attribute name="buttonGroup">
+            <string notr="true">bindingDirectionButtonGroup</string>
+           </attribute>
+          </widget>
+         </item>
+         <item row="6" column="1">
+          <widget class="QRadioButton" name="rightToLeftRadioButton">
+           <property name="text">
+            <string>Right to Left</string>
+           </property>
+           <attribute name="buttonGroup">
+            <string notr="true">bindingDirectionButtonGroup</string>
+           </attribute>
+          </widget>
+         </item>
         </layout>
        </item>
        <item>
@@ -885,5 +912,6 @@
  </connections>
  <buttongroups>
   <buttongroup name="pageLayoutButtonGroup"/>
+  <buttongroup name="bindingDirectionButtonGroup"/>
  </buttongroups>
 </ui>
