diff --git a/scribus/guidemanagercore.cpp b/scribus/guidemanagercore.cpp
index 6ea38a1bce7ec2ef71ba47159d9fcc07f04ca7de..aa6d643bec538c0207f476e6b9cd476fc1838c09 100644
--- a/scribus/guidemanagercore.cpp
+++ b/scribus/guidemanagercore.cpp
@@ -638,6 +638,31 @@ double GuideManagerCore::closestVertRight(double x) const
 	return closest;
 }
 
+void GuideManagerCore::resetSelectionForPage(ScPage* page)
+{
+	auto doc = page->doc();
+	int docSelectionCount = doc->m_Selection->count();
+
+	page->guides.gx = page->guides.gy = page->guides.gw = page->guides.gh = 0.0;
+
+	// multiselection
+	if (docSelectionCount > 1)
+	{
+		double x, y;
+		doc->m_Selection->getGroupRect(&x, &y, &page->guides.gw, &page->guides.gh);
+		page->guides.gx = x - page->xOffset();
+		page->guides.gy = y - page->yOffset();
+	}
+	// only one item selected
+	else if (docSelectionCount == 1)
+	{
+		PageItem *currItem = doc->m_Selection->itemAt(0);
+		page->guides.gx = currItem->xPos() - page->xOffset();
+		page->guides.gy = currItem->yPos() - page->yOffset();
+		page->guides.gw = currItem->width();
+		page->guides.gh = currItem->height();
+	}
+}
 
 void GuideManagerIO::readVerticalGuides(const QString& guideString, ScPage *page, GuideManagerCore::GuideType type, bool useOldGuides)
 {
diff --git a/scribus/guidemanagercore.h b/scribus/guidemanagercore.h
index 4d0781de777eb42a6c95ecbefb470b2ce93cf4b5..ec8fcb322e5e3cb61afed9231539dfbdbef8b138 100644
--- a/scribus/guidemanagercore.h
+++ b/scribus/guidemanagercore.h
@@ -103,6 +103,12 @@ public:
 	//! \brief Properties for Auto guides remembrance. See GuideManager.
 	void setVerticalAutoRefer(int val) { m_verticalAutoRefer = val; }
 
+	/*! \brief Recalculate the selection position and measurements for the current page.
+	It's used for automatic guides position. It's called for every
+	selection GUI widgets change to handle selection change only
+	when needed. */
+	void resetSelectionForPage(ScPage* page);
+
 	/*! \brief Selection/group coordinates
 	It's used to simulate the original selection "freezed in time"
 	for parent page */
diff --git a/scribus/plugins/scriptplugin/cmdpage.cpp b/scribus/plugins/scriptplugin/cmdpage.cpp
index 32f38e3f4a61ab0cb595a8ef2f02e70258b652c9..7bd612433a4275fed4d76cbe640b88f5b279ce06 100644
--- a/scribus/plugins/scriptplugin/cmdpage.cpp
+++ b/scribus/plugins/scriptplugin/cmdpage.cpp
@@ -11,6 +11,7 @@ for which a new license (GPL+exception) is in place.
 #include "scribuscore.h"
 #include "scribusdoc.h"
 #include "scribusview.h"
+#include "selection.h"
 
 #include <QApplication>
 
@@ -377,6 +378,176 @@ PyObject *scribus_setVguides(PyObject* /* self */, PyObject* args)
 	Py_RETURN_NONE;
 }
 
+PyObject *scribus_getColumnGuides(PyObject* /* self */)
+{
+	if (!checkHaveDocument())
+		return nullptr;
+	auto guides = PyDict_New();
+
+	auto page = ScCore->primaryMainWindow()->doc->currentPage();
+
+	{
+		const char keyString[] = "number";
+		PyObject *key = PyUnicode_FromString(keyString);
+		PyDict_SetItem(guides, key, PyLong_FromLong((long) page->guides.verticalAutoCount()));
+	}
+	{
+		const char keyString[] = "gap";
+		PyObject *key = PyUnicode_FromString(keyString);
+		PyDict_SetItem(guides, key, Py_BuildValue("d", PointToValue(page->guides.verticalAutoGap())));
+	}
+	{
+		const char keyString[] = "refer_to";
+		PyObject *key = PyUnicode_FromString(keyString);
+		PyDict_SetItem(guides, key, PyLong_FromLong((long) page->guides.verticalAutoRefer()));
+	}
+	{
+		auto rowsList = PyList_New(0);
+		for (auto column: page->guides.getAutoVerticals(page)) // QList<double> Guides
+		{
+			PyList_Append(rowsList, Py_BuildValue("d", PointToValue(column)));
+		}
+		const char keyString[] = "guides";
+		PyObject *key = PyUnicode_FromString(keyString);
+		PyDict_SetItem(guides, key, rowsList);
+	}
+
+	return guides;
+}
+
+PyObject *scribus_getRowGuides(PyObject* /* self */)
+{
+	if (!checkHaveDocument())
+		return nullptr;
+	auto guides = PyDict_New();
+
+	auto page = ScCore->primaryMainWindow()->doc->currentPage();
+
+	{
+		const char keyString[] = "number";
+		PyObject *key = PyUnicode_FromString(keyString);
+		PyDict_SetItem(guides, key, PyLong_FromLong((long) page->guides.horizontalAutoCount()));
+	}
+	{
+		const char keyString[] = "gap";
+		PyObject *key = PyUnicode_FromString(keyString);
+		PyDict_SetItem(guides, key, Py_BuildValue("d", PointToValue(page->guides.horizontalAutoGap())));
+	}
+	{
+		const char keyString[] = "refer_to";
+		PyObject *key = PyUnicode_FromString(keyString);
+		PyDict_SetItem(guides, key, PyLong_FromLong((long) page->guides.horizontalAutoRefer()));
+	}
+	{
+		auto rowsList = PyList_New(0);
+		for (auto row: page->guides.getAutoHorizontals(page)) // QList<double> Guides
+		{
+			PyList_Append(rowsList, Py_BuildValue("d", PointToValue(row)));
+		}
+		const char keyString[] = "guides";
+		PyObject *key = PyUnicode_FromString(keyString);
+		PyDict_SetItem(guides, key, rowsList);
+	}
+	return guides;
+}
+
+PyObject *scribus_setColumnGuides(PyObject* /* self */, PyObject* args, PyObject* kw)
+{
+	if (!checkHaveDocument())
+		return nullptr;
+
+	int number;
+	double gap = 0.0;
+	int referTo = 0;
+	char* kwargs[] = {const_cast<char*>("number"), const_cast<char*>("gap"), const_cast<char*>("refer_to"), nullptr};
+	if (!PyArg_ParseTupleAndKeywords(args, kw, "i|di", kwargs, &number, &gap, &referTo))
+		return nullptr;
+
+	auto doc = ScCore->primaryMainWindow()->doc;
+
+	if (referTo < 0 || referTo > 2)
+	{
+		QString message = QObject::tr("refer_to=0|1|2.","python error");
+		PyErr_SetString(ScribusException, message.toLocal8Bit().constData());
+		return nullptr;
+	}
+	else if (referTo == 2)
+	{
+		// refertTo a selection is only active, when there is a selection in the document
+		if (doc->m_Selection->isEmpty())
+		{
+			QString message = QObject::tr("setColumnGuides() with refer_to=2 needs a selection.","python error");
+			PyErr_SetString(ScribusException, message.toLocal8Bit().constData());
+			return nullptr;
+		}
+		doc->currentPage()->guides.resetSelectionForPage(doc->currentPage());
+	}
+
+
+	// If there are no guides, reset the values for the gap and for the reference
+	if (number == 0)
+	{
+		doc->currentPage()->guides.setVerticalAutoGap(0);
+		doc->currentPage()->guides.setVerticalAutoRefer(0);
+		doc->currentPage()->guides.setVerticalAutoCount(0);
+		Py_RETURN_NONE;
+	}
+
+	doc->currentPage()->guides.setVerticalAutoGap(ValueToPoint(gap));
+	doc->currentPage()->guides.setVerticalAutoRefer(referTo);
+	doc->currentPage()->guides.setVerticalAutoCount(number);
+
+	Py_RETURN_NONE;
+}
+
+PyObject *scribus_setRowGuides(PyObject* /* self */, PyObject* args, PyObject* kw)
+{
+	if (!checkHaveDocument())
+		return nullptr;
+
+	int number;
+	double gap = 0.0;
+	int referTo = 0;
+	char* kwargs[] = {const_cast<char*>("number"), const_cast<char*>("gap"), const_cast<char*>("refer_to"), nullptr};
+	if (!PyArg_ParseTupleAndKeywords(args, kw, "i|di", kwargs, &number, &gap, &referTo))
+		return nullptr;
+
+	auto doc = ScCore->primaryMainWindow()->doc;
+
+	if (referTo < 0 || referTo > 2)
+	{
+		QString message = QObject::tr("refer_to=0|1|2.","python error");
+		PyErr_SetString(ScribusException, message.toLocal8Bit().constData());
+		return nullptr;
+	}
+	else if (referTo == 2)
+	{
+		if (doc->m_Selection->isEmpty())
+		{
+			// refertTo a selection is only active, when there is a selection in the document
+			QString message = QObject::tr("setRowGuides() with refer_to=2 needs a selection.","python error");
+			PyErr_SetString(ScribusException, message.toLocal8Bit().constData());
+			return nullptr;
+		}
+		doc->currentPage()->guides.resetSelectionForPage(doc->currentPage());
+	}
+
+	doc->currentPage()->guides.setHorizontalAutoCount(number);
+
+	// If there are no guides, reset the values for the gap and for the reference
+	if (number == 0)
+	{
+		doc->currentPage()->guides.setHorizontalAutoGap(0);
+		doc->currentPage()->guides.setHorizontalAutoRefer(0);
+		Py_RETURN_NONE;
+	}
+
+	doc->currentPage()->guides.setHorizontalAutoGap(ValueToPoint(gap));
+	doc->currentPage()->guides.setHorizontalAutoRefer(referTo);
+
+	Py_RETURN_NONE;
+}
+
 PyObject *scribus_getpagemargins(PyObject* /* self */)
 {
 	PyObject *margins = nullptr;
@@ -550,5 +721,9 @@ void cmdpagedocwarnings()
 	  << scribus_redraw__doc__
 	  << scribus_savepageeps__doc__           
 	  << scribus_setHguides__doc__
-	  << scribus_setVguides__doc__;
+	  << scribus_setVguides__doc__
+	  << scribus_getColumnGuides__doc__
+	  << scribus_getRowGuides__doc__
+	  << scribus_setColumnGuides__doc__
+	  << scribus_setRowGuides__doc__;
 }
diff --git a/scribus/plugins/scriptplugin/cmdpage.h b/scribus/plugins/scriptplugin/cmdpage.h
index e8c79b8fe18f3c3af9ccd9875aac65b6210451aa..e0edf552868f6fd891dc48552a462b8f71adb86b 100644
--- a/scribus/plugins/scriptplugin/cmdpage.h
+++ b/scribus/plugins/scriptplugin/cmdpage.h
@@ -153,6 +153,56 @@ See setHGuides.\n\
 /*! set V guides */
 PyObject *scribus_setVguides(PyObject * /*self*/, PyObject* args);
 
+/*! docstring */
+PyDoc_STRVAR(scribus_getColumnGuides__doc__,
+QT_TR_NOOP("getColumnGuides()\n\
+\n\
+Return the column guides for the current page.\n\
+\n\
+The return a dictionary containing:\n\
+{'number': int, 'gap': int, 'reference': 0|1|2, guides: [real]}\n\
+"));
+/*! get column guides */
+PyObject *scribus_getColumnGuides(PyObject * /*self*/);
+
+/*! docstring */
+PyDoc_STRVAR(scribus_getRowGuides__doc__,
+QT_TR_NOOP("getRowGuides()\n\
+\n\
+Return the row guides for the current page.\n\
+\n\
+The return a dictionary containing:\n\
+{'number': int, 'gap': int, 'reference': 0|1|2, guides: [real]}\n\
+"));
+/*! get row guides */
+PyObject *scribus_getRowGuides(PyObject * /*self*/);
+
+/*! docstring */
+PyDoc_STRVAR(scribus_setColumnGuides__doc__,
+QT_TR_NOOP("setColumnGuides(number, gap=0.0, refer_to=0)\n\
+\n\
+Set the column guides for the current page.\n\
+\n\
+number is the number of guides to be defined (if 0, all values get reset to their default)\n\
+\n\
+refer_to can have the values 0 (page), 1 (margin), 2 (selection)\n\
+"));
+/*! set column guides */
+PyObject *scribus_setColumnGuides(PyObject * /*self*/, PyObject* args, PyObject* kw);
+
+/*! docstring */
+PyDoc_STRVAR(scribus_setRowGuides__doc__,
+QT_TR_NOOP("setRowGuides(number, gap=0.0, refer_to=0)\n\
+\n\
+Set the row guides for the current page.\n\
+\n\
+number is the number of guides to be defined (if 0, all values get reset to their default)\n\
+\n\
+refer_to can have the values 0 (page), 1 (margin), 2 (selection)\n\
+"));
+/*! set row guides */
+PyObject *scribus_setRowGuides(PyObject * /*self*/, PyObject* args, PyObject* kw);
+
 /*! docstring */
 PyDoc_STRVAR(scribus_getpagesize__doc__,
 QT_TR_NOOP("getPageSize() -> tuple\n\
diff --git a/scribus/plugins/scriptplugin/scriptplugin.cpp b/scribus/plugins/scriptplugin/scriptplugin.cpp
index dd2b93e2aeece0f7b0e08caa4b9fcbc80bfc568c..c1c56f8806394e9b321f3ba3e8280173f87f8dc0 100644
--- a/scribus/plugins/scriptplugin/scriptplugin.cpp
+++ b/scribus/plugins/scriptplugin/scriptplugin.cpp
@@ -349,6 +349,7 @@ PyMethodDef scribus_methods[] = {
 	{const_cast<char*>("getColorNames"), (PyCFunction)scribus_getcolornames, METH_NOARGS, tr(scribus_getcolornames__doc__)},
 	{const_cast<char*>("getColumnGap"), scribus_getcolumngap, METH_VARARGS, tr(scribus_getcolumngap__doc__)},
 	{const_cast<char*>("getColumns"), scribus_getcolumns, METH_VARARGS, tr(scribus_getcolumns__doc__)},
+	{const_cast<char*>("getColumnGuides"), (PyCFunction)scribus_getColumnGuides, METH_VARARGS|METH_KEYWORDS, tr(scribus_getColumnGuides__doc__)},
 	{const_cast<char*>("getCornerRadius"), scribus_getcornerradius, METH_VARARGS, tr(scribus_getcornerradius__doc__)},
 	{const_cast<char*>("getCustomLineStyle"), scribus_getcustomlinestyle, METH_VARARGS, tr(scribus_getcustomlinestyle__doc__)},
 	{const_cast<char*>("getDocName"), (PyCFunction)scribus_getdocname, METH_NOARGS, tr(scribus_getdocname__doc__)},
@@ -401,6 +402,7 @@ PyMethodDef scribus_methods[] = {
 	{const_cast<char*>("getPosition"), scribus_getposition, METH_VARARGS, tr(scribus_getposition__doc__)},
 	{const_cast<char*>("getPrevLinkedFrame"), scribus_getprevlinkedframe, METH_VARARGS, tr(scribus_getprevlinkedframe__doc__)},
 	{const_cast<char*>("getRotation"), scribus_getrotation, METH_VARARGS, tr(scribus_getrotation__doc__)},
+	{const_cast<char*>("getRowGuides"), (PyCFunction)scribus_getRowGuides, METH_VARARGS|METH_KEYWORDS, tr(scribus_getRowGuides__doc__)},
 	{const_cast<char*>("getSelectedObject"), scribus_getselectedobject, METH_VARARGS, tr(scribus_getselectedobject__doc__)},
 	{const_cast<char*>("getSize"), scribus_getsize, METH_VARARGS, tr(scribus_getsize__doc__)},
 	{const_cast<char*>("getStyle"), scribus_getparagraphstyle, METH_VARARGS, tr(scribus_getstyle__doc__) }, // Deprecated
@@ -514,6 +516,7 @@ PyMethodDef scribus_methods[] = {
 	{const_cast<char*>("setCharacterStyle"), scribus_setcharstyle, METH_VARARGS, tr(scribus_setcharstyle__doc__) },
 	{const_cast<char*>("setColumnGap"), scribus_setcolumngap, METH_VARARGS, tr(scribus_setcolumngap__doc__)},
 	{const_cast<char*>("setColumns"), scribus_setcolumns, METH_VARARGS, tr(scribus_setcolumns__doc__)},
+	{const_cast<char*>("setColumnGuides"), (PyCFunction)scribus_setColumnGuides, METH_VARARGS|METH_KEYWORDS, tr(scribus_setColumnGuides__doc__)},
 	{const_cast<char*>("setCornerRadius"), scribus_setcornerradius, METH_VARARGS, tr(scribus_setcornerradius__doc__)},
 	{const_cast<char*>("setCursor"), scribus_setcursor, METH_VARARGS, tr(scribus_setcursor__doc__)},
 	{const_cast<char*>("setCustomLineStyle"), scribus_setcustomlinestyle, METH_VARARGS, tr(scribus_setcustomlinestyle__doc__)},
@@ -559,6 +562,7 @@ PyMethodDef scribus_methods[] = {
 	{const_cast<char*>("setPDFBookmark"), scribus_setpdfbookmark, METH_VARARGS, tr(scribus_setpdfbookmark__doc__)},
 	{const_cast<char*>("setParagraphStyle"), scribus_setparagraphstyle, METH_VARARGS, tr(scribus_setparagraphstyle__doc__)},
 	{const_cast<char*>("setRedraw"), scribus_setredraw, METH_VARARGS, tr(scribus_setredraw__doc__)},
+	{const_cast<char*>("setRowGuides"), (PyCFunction)scribus_setRowGuides, METH_VARARGS|METH_KEYWORDS, tr(scribus_setRowGuides__doc__)},
 	{const_cast<char*>("setScaleFrameToImage"), (PyCFunction)scribus_setscaleframetoimage, METH_VARARGS, tr(scribus_setscaleframetoimage__doc__)},
 	{const_cast<char*>("setScaleImageToFrame"), (PyCFunction)scribus_setscaleimagetoframe, METH_VARARGS|METH_KEYWORDS, tr(scribus_setscaleimagetoframe__doc__)},
 	{const_cast<char*>("setSpotColor"), scribus_setspotcolor, METH_VARARGS, tr(scribus_setspotcolor__doc__)},
diff --git a/scribus/ui/guidemanager.cpp b/scribus/ui/guidemanager.cpp
index a66bf4d81ff5050f63a0d5352d9b80ae77b7a181..5db1c306488e099d6ff2632cce2f1d3cdf2c1e21 100644
--- a/scribus/ui/guidemanager.cpp
+++ b/scribus/ui/guidemanager.cpp
@@ -591,31 +591,6 @@ Guides GuideManager::getAutoHorizontals(const ScPage * page) const
 	return guides.getAutoHorizontals(page);
 }
 
-void GuideManager::resetSelectionForPage()
-{
-	int docSelectionCount = currentPage->doc()->m_Selection->count();
-
-	currentPage->guides.gx = currentPage->guides.gy = currentPage->guides.gw = currentPage->guides.gh = 0.0;
-
-	// multiselection
-	if (docSelectionCount > 1)
-	{
-		double x, y;
-		m_Doc->m_Selection->getGroupRect(&x, &y, &currentPage->guides.gw, &currentPage->guides.gh);
-		currentPage->guides.gx = x - currentPage->xOffset();
-		currentPage->guides.gy = y - currentPage->yOffset();
-	}
-	// only one item selected
-	else if (docSelectionCount == 1)
-	{
-		const PageItem *currItem = m_Doc->m_Selection->itemAt(0);
-		currentPage->guides.gx = currItem->xPos() - currentPage->xOffset();
-		currentPage->guides.gy = currItem->yPos() - currentPage->yOffset();
-		currentPage->guides.gw = currItem->width();
-		currentPage->guides.gh = currItem->height();
-	}
-}
-
 void GuideManager::verticalModel_valueChanged()
 {
 	currentPage->guides.clearVerticals(GuideManagerCore::Standard);
@@ -706,7 +681,7 @@ void GuideManager::horizontalSelectionAutoButton_toggled(bool state)
 		return;
 	currentPage->guides.setHorizontalAutoRefer(2);
 	if (horizontalSelectionAutoButton->isEnabled())
-		resetSelectionForPage();
+		currentPage->guides.resetSelectionForPage(currentPage);
 	drawGuides();
 }
 
@@ -734,7 +709,7 @@ void GuideManager::verticalSelectionAutoButton_toggled(bool state)
 		return;
 	currentPage->guides.setVerticalAutoRefer(2);
 	if (verticalSelectionAutoButton->isEnabled())
-		resetSelectionForPage();
+		currentPage->guides.resetSelectionForPage(currentPage);
 	drawGuides();
 	m_Doc->changed();
 }
diff --git a/scribus/ui/guidemanager.h b/scribus/ui/guidemanager.h
index 7d62de476c8fd5d9f3b4cc70fcc87c63dcbb2286..a51bd6de13732af236a03dd23c9c2a4385a458ef 100644
--- a/scribus/ui/guidemanager.h
+++ b/scribus/ui/guidemanager.h
@@ -117,12 +117,6 @@ private:
 	*/
 	Guides getAutoVerticals(const ScPage * p) const;
 
-	/*! \brief Recalculate the selection position and measurements for the current page.
-	It's used for automatic guides position. It's called for every
-	selection GUI widgets change to handle selection change only
-	when needed. */
-	void resetSelectionForPage();
-
 	/*! \brief Draw guides into painter */
 	void drawGuides();
 
