diff --git a/scribus/plugins/scriptplugin/cmdmani.cpp b/scribus/plugins/scriptplugin/cmdmani.cpp
index ce0ea2ba3..18ec52595 100644
--- a/scribus/plugins/scriptplugin/cmdmani.cpp
+++ b/scribus/plugins/scriptplugin/cmdmani.cpp
@@ -316,18 +316,41 @@ PyObject *scribus_rotateobjectrel(PyObject* /* self */, PyObject* args)
 	Py_RETURN_NONE;
 }
 
-PyObject *scribus_rotateobjectabs(PyObject* /* self */, PyObject* args)
+PyObject *scribus_setrotation(PyObject* /* self */, PyObject* args, PyObject* kw)
 {
-	char *Name = const_cast<char*>("");
-	double x;
-	if (!PyArg_ParseTuple(args, "d|es", &x, "utf-8", &Name))
+
+	double rotation;
+	char* name = const_cast<char*>("");
+	int basepoint = (int) AnchorPoint::None;
+	char* kwargs[] = {
+		const_cast<char*>("rotation"),
+		const_cast<char*>("name"),
+		const_cast<char*>("basepoint"),
+		nullptr};
+	if (!PyArg_ParseTupleAndKeywords(args, kw, "d|esi", kwargs, &rotation, "utf-8", &name, &basepoint))
 		return nullptr;
+
 	if (!checkHaveDocument())
 		return nullptr;
-	PageItem *item = GetUniqueItem(QString::fromUtf8(Name));
+
+	PageItem *item = GetUniqueItem(QString::fromUtf8(name));
 	if (item == nullptr)
 		return nullptr;
-	ScCore->primaryMainWindow()->doc->rotateItem(x * -1.0, item);
+
+	AnchorPoint oldBasePoint = AnchorPoint::None;
+	if (basepoint != (int) AnchorPoint::None)
+	{
+		oldBasePoint = ScCore->primaryMainWindow()->doc->rotationMode();
+		ScCore->primaryMainWindow()->doc->setRotationMode(static_cast<AnchorPoint>(basepoint));
+	}
+
+	ScCore->primaryMainWindow()->doc->rotateItem(rotation * -1.0, item);
+
+	if (basepoint != (int) AnchorPoint::None)
+	{
+		ScCore->primaryMainWindow()->doc->setRotationMode(oldBasePoint);
+	}
+
 	Py_RETURN_NONE;
 }
 
@@ -726,6 +749,7 @@ void cmdmanidocwarnings()
 	  << scribus_setimageoffset__doc__
 	  << scribus_setimagescale__doc__
 	  << scribus_setnormalmode__doc__
+	  << scribus_setrotation__doc__
 	  << scribus_setscaleframetoimage__doc__
 	  << scribus_setscaleimagetoframe__doc__
 	  << scribus_sizeobject__doc__ 
diff --git a/scribus/plugins/scriptplugin/cmdmani.h b/scribus/plugins/scriptplugin/cmdmani.h
index e4d4253a7..f7fd346d0 100644
--- a/scribus/plugins/scriptplugin/cmdmani.h
+++ b/scribus/plugins/scriptplugin/cmdmani.h
@@ -53,12 +53,24 @@ PyObject *scribus_rotateobjectrel(PyObject * /*self*/, PyObject* args);
 PyDoc_STRVAR(scribus_rotateobjectabs__doc__,
 QT_TR_NOOP("rotateObjectAbs(rot [, \"name\"])\n\
 \n\
-Sets the rotation of the object \"name\" to \"rot\". Positive values\n\
+Deprecated. Please use setRotation().\n\
+"));
+
+PyDoc_STRVAR(scribus_setrotation__doc__,
+QT_TR_NOOP("setRotation(rotation [, name=\"\", basepoint=None])\n\
+\n\
+Sets the rotation of the object \"name\" to \"rotation\". Positive values\n\
 mean counter clockwise rotation. If \"name\" is not given the currently\n\
 selected item is used.\n\
+\n\
+If basepoint is not set, the current basepoint is used.\n\
+Valid values for basepoint are:\n\
+BASEPOINT_TOPLEFT, BASEPOINT_TOP, BASEPOINT_TOPRIGHT,\n\
+BASEPOINT_LEFT, BASEPOINT_CENTER, BASEPOINT_RIGHT,\n\
+BASEPOINT_BOTTOMLEFT, BASEPOINT_BOTTOM, BASEPOINT_BOTTOMRIGHT\n\
 "));
-/*! Rotate ABS the object */
-PyObject *scribus_rotateobjectabs(PyObject * /*self*/, PyObject* args);
+/*! Set the rotation of the object */
+PyObject *scribus_setrotation(PyObject * /*self*/, PyObject* args, PyObject* kw);
 
 /*! docstring */
 PyDoc_STRVAR(scribus_sizeobject__doc__,
diff --git a/scribus/plugins/scriptplugin/scriptplugin.cpp b/scribus/plugins/scriptplugin/scriptplugin.cpp
index 2836dfb96..59407e81d 100644
--- a/scribus/plugins/scriptplugin/scriptplugin.cpp
+++ b/scribus/plugins/scriptplugin/scriptplugin.cpp
@@ -485,7 +485,7 @@ PyMethodDef scribus_methods[] = {
 	{const_cast<char*>("resizeTableRow"), scribus_resizetablerow, METH_VARARGS, tr(scribus_resizetablerow__doc__)},
 	{const_cast<char*>("revertDoc"), (PyCFunction)scribus_revertdoc, METH_NOARGS, tr(scribus_revertdoc__doc__)},
 	{const_cast<char*>("rotateObject"), scribus_rotateobjectrel, METH_VARARGS, tr(scribus_rotateobjectrel__doc__)},
-	{const_cast<char*>("rotateObjectAbs"), scribus_rotateobjectabs, METH_VARARGS, tr(scribus_rotateobjectabs__doc__)},
+	{const_cast<char*>("rotateObjectAbs"), (PyCFunction)scribus_setrotation, METH_VARARGS|METH_KEYWORDS, tr(scribus_rotateobjectabs__doc__)}, // Deprecated, alias to setRotation
 	{const_cast<char*>("saveDoc"), (PyCFunction)scribus_savedoc, METH_NOARGS, tr(scribus_savedoc__doc__)},
 	{const_cast<char*>("saveDocAs"), scribus_savedocas, METH_VARARGS, tr(scribus_savedocas__doc__)},
 	{const_cast<char*>("savePDFOptions"), (PyCFunction)scribus_savepdfoptions, METH_VARARGS, tr(scribus_savepdfoptions__doc__)},
@@ -564,6 +564,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*>("setRotation"), (PyCFunction)scribus_setrotation, METH_VARARGS|METH_KEYWORDS, tr(scribus_setrotation__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__)},
@@ -914,6 +915,16 @@ PyObject* PyInit_scribus(void)
 	PyDict_SetItemString(d, "TAB_PERIOD", Py_BuildValue("i", 2));
 	PyDict_SetItemString(d, "TAB_COMMA", Py_BuildValue("i", 3));
 	PyDict_SetItemString(d, "TAB_CENTER", Py_BuildValue("i", 4));
+	// Basepoint / AnchorPoint
+	PyDict_SetItemString(d, "BASEPOINT_TOPLEFT", Py_BuildValue("i", (int) AnchorPoint::TopLeft));
+	PyDict_SetItemString(d, "BASEPOINT_TOP", Py_BuildValue("i", (int) AnchorPoint::Top));
+	PyDict_SetItemString(d, "BASEPOINT_TOPRIGHT", Py_BuildValue("i", (int) AnchorPoint::TopRight));
+	PyDict_SetItemString(d, "BASEPOINT_LEFT", Py_BuildValue("i", (int) AnchorPoint::Left));
+	PyDict_SetItemString(d, "BASEPOINT_CENTER", Py_BuildValue("i", (int) AnchorPoint::Center));
+	PyDict_SetItemString(d, "BASEPOINT_RIGHT", Py_BuildValue("i", (int) AnchorPoint::Right));
+	PyDict_SetItemString(d, "BASEPOINT_BOTTOMLEFT", Py_BuildValue("i", (int) AnchorPoint::BottomLeft));
+	PyDict_SetItemString(d, "BASEPOINT_BOTTOM", Py_BuildValue("i", (int) AnchorPoint::Bottom));
+	PyDict_SetItemString(d, "BASEPOINT_BOTTOMRIGHT", Py_BuildValue("i", (int) AnchorPoint::BottomRight));
 
 	// Measurement units understood by Scribus's units.cpp functions are exported as constant conversion
 	// factors to be used from Python.
