diff -r -U 5 old/scribus-1.5.3/scribus/plugins/scriptplugin/cmdcell.cpp bug-submission/scribus/plugins/scriptplugin/cmdcell.cpp
--- old/scribus-1.5.3/scribus/plugins/scriptplugin/cmdcell.cpp	2017-05-28 11:10:24.000000000 +0200
+++ bug-submission/scribus/plugins/scriptplugin/cmdcell.cpp	2017-09-01 16:11:24.000000000 +0200
@@ -59,11 +59,11 @@
 	if (column < 0 || column >= table->columns() || row < 0 || row >= table->rows())
 	{
 		PyErr_SetString(PyExc_ValueError, QObject::tr("The cell %1,%2 does not exist in table", "python error").arg(row).arg(column).toLocal8Bit().constData());
 		return NULL;
 	}
-	return PyString_FromString(table->cellAt(row, column).styleName().toUtf8());
+	return Legacy_PyString_FromString(table->cellAt(row, column).styleName().toUtf8());
 }
 
 PyObject *scribus_setcellstyle(PyObject* /* self */, PyObject* args)
 {
 	char *Name = const_cast<char*>("");
@@ -151,11 +151,11 @@
 	if (column < 0 || column >= table->columns() || row < 0 || row >= table->rows())
 	{
 		PyErr_SetString(PyExc_ValueError, QObject::tr("The cell %1,%2 does not exist in table", "python error").arg(row).arg(column).toLocal8Bit().constData());
 		return NULL;
 	}
-	return PyString_FromString(table->cellAt(row, column).fillColor().toUtf8());
+	return Legacy_PyString_FromString(table->cellAt(row, column).fillColor().toUtf8());
 }
 
 PyObject *scribus_setcellfillcolor(PyObject* /* self */, PyObject* args)
 {
 	char *Name = const_cast<char*>("");
diff -r -U 5 old/scribus-1.5.3/scribus/plugins/scriptplugin/cmdcolor.cpp bug-submission/scribus/plugins/scriptplugin/cmdcolor.cpp
--- old/scribus-1.5.3/scribus/plugins/scriptplugin/cmdcolor.cpp	2017-05-28 11:10:24.000000000 +0200
+++ bug-submission/scribus/plugins/scriptplugin/cmdcolor.cpp	2017-09-01 16:15:55.000000000 +0200
@@ -20,11 +20,11 @@
 	edc = ScCore->primaryMainWindow()->HaveDoc ? ScCore->primaryMainWindow()->doc->PageColors : PrefsManager::instance()->colorSet();
 	ColorList::Iterator it;
 	l = PyList_New(edc.count());
 	for (it = edc.begin(); it != edc.end(); ++it)
 	{
-		PyList_SetItem(l, cc, PyString_FromString(it.key().toUtf8()));
+		PyList_SetItem(l, cc, Legacy_PyString_FromString(it.key().toUtf8()));
 		cc++;
 	}
 	return l;
 }
 
diff -r -U 5 old/scribus-1.5.3/scribus/plugins/scriptplugin/cmddialog.cpp bug-submission/scribus/plugins/scriptplugin/cmddialog.cpp
--- old/scribus-1.5.3/scribus/plugins/scriptplugin/cmddialog.cpp	2017-05-28 11:10:24.000000000 +0200
+++ bug-submission/scribus/plugins/scriptplugin/cmddialog.cpp	2017-09-01 16:13:00.000000000 +0200
@@ -66,11 +66,11 @@
 										 &nobool,
 										 &nobool
 										);
 //	QApplication::restoreOverrideCursor();
 	// FIXME: filename return unicode OK?
-	return PyString_FromString(fName.toUtf8());
+	return Legacy_PyString_FromString(fName.toUtf8());
 }
 
 PyObject *scribus_messdia(PyObject* /* self */, PyObject* args, PyObject* kw)
 {
 	char *caption = const_cast<char*>("");
@@ -118,11 +118,11 @@
 										QString::fromUtf8(caption),
 										QString::fromUtf8(message),
 										QLineEdit::Normal,
 										QString::fromUtf8(value));
 //	QApplication::restoreOverrideCursor();
-	return PyString_FromString(txt.toUtf8());
+	return Legacy_PyString_FromString(txt.toUtf8());
 }
 
 PyObject *scribus_newstyledialog(PyObject*, PyObject* args)
 {
 	if(!checkHaveDocument())
@@ -141,11 +141,11 @@
 		ParagraphStyle p;
 		p.setName(s);
 		st.create(p);
 		d->redefineStyles(st, false);
 		ScCore->primaryMainWindow()->styleMgr()->setDoc(d);
-		return PyString_FromString(s.toUtf8());
+		return Legacy_PyString_FromString(s.toUtf8());
 	}
 	else
 		Py_RETURN_NONE;
 }
 
diff -r -U 5 old/scribus-1.5.3/scribus/plugins/scriptplugin/cmddoc.cpp bug-submission/scribus/plugins/scriptplugin/cmddoc.cpp
--- old/scribus-1.5.3/scribus/plugins/scriptplugin/cmddoc.cpp	2017-05-28 11:10:24.000000000 +0200
+++ bug-submission/scribus/plugins/scriptplugin/cmddoc.cpp	2017-09-01 16:11:00.000000000 +0200
@@ -195,13 +195,13 @@
 {
 	if(!checkHaveDocument())
 		return NULL;
 	if (! ScCore->primaryMainWindow()->doc->hasName)
 	{
-		return PyString_FromString("");
+		return Legacy_PyString_FromString("");
 	}
-	return PyString_FromString(ScCore->primaryMainWindow()->doc->DocName.toUtf8());
+	return Legacy_PyString_FromString(ScCore->primaryMainWindow()->doc->DocName.toUtf8());
 }
 
 PyObject *scribus_savedocas(PyObject* /* self */, PyObject* args)
 {
 	char *Name;
@@ -316,11 +316,11 @@
 	QMap<QString,int>::const_iterator it(ScCore->primaryMainWindow()->doc->MasterNames.constBegin());
 	QMap<QString,int>::const_iterator itEnd(ScCore->primaryMainWindow()->doc->MasterNames.constEnd());
 	int n = 0;
 	for ( ; it != itEnd; ++it )
 	{
-		PyList_SET_ITEM(names, n++, PyString_FromString(it.key().toUtf8().data()) );
+		PyList_SET_ITEM(names, n++, Legacy_PyString_FromString(it.key().toUtf8().data()) );
 	}
 	return names;
 }
 
 PyObject *scribus_editmasterpage(PyObject* /* self */, PyObject* args)
@@ -401,11 +401,11 @@
 	if ((e < 0) || (e > static_cast<int>(ScCore->primaryMainWindow()->doc->Pages->count())-1))
 	{
 		PyErr_SetString(PyExc_IndexError, QObject::tr("Page number out of range: '%1'.","python error").arg(e+1).toLocal8Bit().constData());
 		return NULL;
 	}
-	return PyString_FromString(ScCore->primaryMainWindow()->doc->DocPages.at(e)->MPageNam.toUtf8());
+	return Legacy_PyString_FromString(ScCore->primaryMainWindow()->doc->DocPages.at(e)->MPageNam.toUtf8());
 }
 
 PyObject* scribus_applymasterpage(PyObject* /* self */, PyObject* args)
 {
 	char* name = 0;
diff -r -U 5 old/scribus-1.5.3/scribus/plugins/scriptplugin/cmdgetprop.cpp bug-submission/scribus/plugins/scriptplugin/cmdgetprop.cpp
--- old/scribus-1.5.3/scribus/plugins/scriptplugin/cmdgetprop.cpp	2017-05-28 11:10:24.000000000 +0200
+++ bug-submission/scribus/plugins/scriptplugin/cmdgetprop.cpp	2017-09-01 16:16:37.000000000 +0200
@@ -42,22 +42,22 @@
 		result = "LatexFrame";
 	} else if (item->itemType() == PageItem::Multiple) {
 		result = "Multiple";
 	}
 
-	return PyString_FromString(result.toUtf8());
+	return Legacy_PyString_FromString(result.toUtf8());
 }
 
 PyObject *scribus_getfillcolor(PyObject* /* self */, PyObject* args)
 {
 	char *Name = const_cast<char*>("");
 	if (!PyArg_ParseTuple(args, "|es", "utf-8", &Name))
 		return NULL;
 	if(!checkHaveDocument())
 		return NULL;
 	PageItem *i = GetUniqueItem(QString::fromUtf8(Name));
-	return i != NULL ? PyString_FromString(i->fillColor().toUtf8()) : NULL;
+	return i != NULL ? Legacy_PyString_FromString(i->fillColor().toUtf8()) : NULL;
 }
 
 PyObject *scribus_getfilltrans(PyObject* /* self */, PyObject* args)
 {
 	char *Name = const_cast<char*>("");
@@ -94,15 +94,15 @@
 	if ((it->HasSel) && ((it->itemType() == PageItem::TextFrame) || (it->itemType() == PageItem::PathText)))
 	{
 		for (int b = 0; b < it->itemText.length(); ++b)
 		{
 			if (it->itemText.selected(b))
-				return PyString_FromString(it->itemText.charStyle(b).fillColor().toUtf8());
+				return Legacy_PyString_FromString(it->itemText.charStyle(b).fillColor().toUtf8());
 		}
 	}
 	else
-		return PyString_FromString(it->lineColor().toUtf8());
+		return Legacy_PyString_FromString(it->lineColor().toUtf8());
 	PyErr_SetString(NotFoundError, QObject::tr("Color not found - python error", "python error").toLocal8Bit().constData());
 	return NULL;
 }
 
 PyObject *scribus_getlinetrans(PyObject* /* self */, PyObject* args)
@@ -234,11 +234,11 @@
 	if (!PyArg_ParseTuple(args, "|es", "utf-8", &Name))
 		return NULL;
 	if(!checkHaveDocument())
 		return NULL;
 	PageItem *i = GetUniqueItem(QString::fromUtf8(Name));
-	return i != NULL ? PyString_FromString(i->Pfile.toUtf8()) : NULL;
+	return i != NULL ? Legacy_PyString_FromString(i->Pfile.toUtf8()) : NULL;
 }
 
 PyObject *scribus_getposi(PyObject* /* self */, PyObject* args)
 {
 	char *Name = const_cast<char*>("");
@@ -311,17 +311,17 @@
 		{
 			if (typ != -1)
 			{
 				if (ScCore->primaryMainWindow()->doc->Items->at(lam)->itemType() == typ)
 				{
-					PyList_SetItem(l, counter2, PyString_FromString(ScCore->primaryMainWindow()->doc->Items->at(lam)->itemName().toUtf8()));
+					PyList_SetItem(l, counter2, Legacy_PyString_FromString(ScCore->primaryMainWindow()->doc->Items->at(lam)->itemName().toUtf8()));
 					counter2++;
 				}
 			}
 			else
 			{
-				PyList_SetItem(l, counter2, PyString_FromString(ScCore->primaryMainWindow()->doc->Items->at(lam)->itemName().toUtf8()));
+				PyList_SetItem(l, counter2, Legacy_PyString_FromString(ScCore->primaryMainWindow()->doc->Items->at(lam)->itemName().toUtf8()));
 				counter2++;
 			}
 		}
 	}
 	return l;
diff -r -U 5 old/scribus-1.5.3/scribus/plugins/scriptplugin/cmdgetsetprop.cpp bug-submission/scribus/plugins/scriptplugin/cmdgetsetprop.cpp
--- old/scribus-1.5.3/scribus/plugins/scriptplugin/cmdgetsetprop.cpp	2017-05-28 11:10:24.000000000 +0200
+++ bug-submission/scribus/plugins/scriptplugin/cmdgetsetprop.cpp	2017-09-01 16:12:26.000000000 +0200
@@ -86,21 +86,21 @@
 	if (type == NULL)
 	{
 		PyErr_SetString(PyExc_KeyError, QObject::tr("Property not found").toLocal8Bit().constData());
 		return NULL;
 	}
-	return PyString_FromString(type);
+	return Legacy_PyString_FromString(type);
 }
 
 PyObject* convert_QStringList_to_PyListObject(QStringList& origlist)
 {
 	PyObject* resultList = PyList_New(0);
 	if (!resultList)
 		return NULL;
 
 	for ( QStringList::Iterator it = origlist.begin(); it != origlist.end(); ++it )
-		if (PyList_Append(resultList, PyString_FromString((*it).toUtf8().data())) == -1)
+		if (PyList_Append(resultList, Legacy_PyString_FromString((*it).toUtf8().data())) == -1)
 			return NULL;
 
 	return resultList;
 }
 
@@ -287,13 +287,13 @@
 	// BOOLEAN
 	else if (prop.type() == QVariant::Bool)
 		resultobj = PyBool_FromLong(prop.toBool());
 	// STRING TYPES
 	else if (prop.type() == QVariant::ByteArray)
-		resultobj = PyString_FromString(prop.toByteArray().data());
+		resultobj = Legacy_PyString_FromString(prop.toByteArray().data());
 	else if (prop.type() == QVariant::String)
-		resultobj = PyString_FromString(prop.toString().toUtf8().data());
+		resultobj = Legacy_PyString_FromString(prop.toString().toUtf8().data());
 	// HIGHER ORDER TYPES
 	else if (prop.type() == QVariant::Point)
 	{
 		// Return a QPoint as an (x,y) tuple.
 		QPoint pt = prop.toPoint();
diff -r -U 5 old/scribus-1.5.3/scribus/plugins/scriptplugin/cmdmani.cpp bug-submission/scribus/plugins/scriptplugin/cmdmani.cpp
--- old/scribus-1.5.3/scribus/plugins/scriptplugin/cmdmani.cpp	2017-05-28 11:10:24.000000000 +0200
+++ bug-submission/scribus/plugins/scriptplugin/cmdmani.cpp	2017-09-01 16:14:21.000000000 +0200
@@ -404,11 +404,11 @@
 
 	const PageItem* group = ScCore->primaryMainWindow()->doc->itemSelection_GroupObjects(false, false, finalSelection);
 	finalSelection=0;
 	delete tempSelection;
 	
-	return (group ? PyString_FromString(group->itemName().toUtf8()) : NULL);
+	return (group ? Legacy_PyString_FromString(group->itemName().toUtf8()) : NULL);
 }
 
 PyObject *scribus_ungroupobj(PyObject* /* self */, PyObject* args)
 {
 	char *Name = const_cast<char*>("");
@@ -462,14 +462,14 @@
 	if (!PyArg_ParseTuple(args, "|i", &i))
 		return NULL;
 	if(!checkHaveDocument())
 		return NULL;
 	if ((i < static_cast<int>(ScCore->primaryMainWindow()->doc->m_Selection->count())) && (i > -1))
-		return PyString_FromString(ScCore->primaryMainWindow()->doc->m_Selection->itemAt(i)->itemName().toUtf8());
+		return Legacy_PyString_FromString(ScCore->primaryMainWindow()->doc->m_Selection->itemAt(i)->itemName().toUtf8());
 	else
 		// FIXME: Should probably return None if no selection?
-		return PyString_FromString("");
+		return Legacy_PyString_FromString("");
 }
 
 PyObject *scribus_selcount(PyObject* /* self */)
 {
 	if(!checkHaveDocument())
diff -r -U 5 old/scribus-1.5.3/scribus/plugins/scriptplugin/cmdmisc.cpp bug-submission/scribus/plugins/scriptplugin/cmdmisc.cpp
--- old/scribus-1.5.3/scribus/plugins/scriptplugin/cmdmisc.cpp	2017-05-28 11:10:24.000000000 +0200
+++ bug-submission/scribus/plugins/scriptplugin/cmdmisc.cpp	2017-09-01 16:16:17.000000000 +0200
@@ -47,11 +47,11 @@
 	int cc = 0;
 	for ( ; it.hasNext() ; it.next())
 	{
 		if (it.current().usable())
 		{
-			PyList_SetItem(l, cc, PyString_FromString(it.currentKey().toUtf8()));
+			PyList_SetItem(l, cc, Legacy_PyString_FromString(it.currentKey().toUtf8()));
 			cc++;
 		}
 	}
 	return l;
 }
@@ -126,11 +126,11 @@
 			return NULL;
 		}
 		int bufferSize = buffer.size();
 		buffer.close();
 		// Now make a Python string from the data we generated
-		PyObject* stringPython = PyString_FromStringAndSize(buffer_string,bufferSize);
+		PyObject* stringPython = Legacy_PyString_FromStringAndSize(buffer_string,bufferSize);
 		// Return even if the result is NULL (error) since an exception will have been
 		// set in that case.
 		return stringPython;
 	}
 	else
@@ -155,11 +155,11 @@
 	if(!checkHaveDocument())
 		return NULL;
 	PyObject *l;
 	l = PyList_New(ScCore->primaryMainWindow()->doc->Layers.count());
 	for (int lam=0; lam < ScCore->primaryMainWindow()->doc->Layers.count(); lam++)
-		PyList_SetItem(l, lam, PyString_FromString(ScCore->primaryMainWindow()->doc->Layers[lam].Name.toUtf8()));
+		PyList_SetItem(l, lam, Legacy_PyString_FromString(ScCore->primaryMainWindow()->doc->Layers[lam].Name.toUtf8()));
 	return l;
 }
 
 PyObject *scribus_setactlayer(PyObject* /* self */, PyObject* args)
 {
@@ -188,11 +188,11 @@
 
 PyObject *scribus_getactlayer(PyObject* /* self */)
 {
 	if(!checkHaveDocument())
 		return NULL;
-	return PyString_FromString(ScCore->primaryMainWindow()->doc->activeLayerName().toUtf8());
+	return Legacy_PyString_FromString(ScCore->primaryMainWindow()->doc->activeLayerName().toUtf8());
 }
 
 PyObject *scribus_senttolayer(PyObject* /* self */, PyObject* args)
 {
 	char *Name = const_cast<char*>("");
@@ -759,11 +759,11 @@
 	Py_RETURN_NONE;
 }
 
 PyObject *scribus_getlanguage(PyObject* /* self */)
 {
-	return PyString_FromString(ScCore->getGuiLanguage().toUtf8());
+	return Legacy_PyString_FromString(ScCore->getGuiLanguage().toUtf8());
 }
 
 /*! 04.01.2007 : Joachim Neu : Moves item selection to front. */
 PyObject *scribus_moveselectiontofront(PyObject*)
 {
diff -r -U 5 old/scribus-1.5.3/scribus/plugins/scriptplugin/cmdobj.cpp bug-submission/scribus/plugins/scriptplugin/cmdobj.cpp
--- old/scribus-1.5.3/scribus/plugins/scriptplugin/cmdobj.cpp	2017-05-28 11:10:24.000000000 +0200
+++ bug-submission/scribus/plugins/scriptplugin/cmdobj.cpp	2017-09-01 16:13:57.000000000 +0200
@@ -41,11 +41,11 @@
 	{
 		QString objName = QString::fromUtf8(Name);
 		if (!ItemExists(objName))
 			ScCore->primaryMainWindow()->doc->Items->at(i)->setItemName(objName);
 	}
-	return PyString_FromString(ScCore->primaryMainWindow()->doc->Items->at(i)->itemName().toUtf8());
+	return Legacy_PyString_FromString(ScCore->primaryMainWindow()->doc->Items->at(i)->itemName().toUtf8());
 }
 
 
 PyObject *scribus_newellipse(PyObject* /* self */, PyObject* args)
 {
@@ -67,11 +67,11 @@
 	{
 		QString objName = QString::fromUtf8(Name);
 		if (!ItemExists(objName))
 			ScCore->primaryMainWindow()->doc->Items->at(i)->setItemName(objName);
 	}
-	return PyString_FromString(ScCore->primaryMainWindow()->doc->Items->at(i)->itemName().toUtf8());
+	return Legacy_PyString_FromString(ScCore->primaryMainWindow()->doc->Items->at(i)->itemName().toUtf8());
 }
 
 
 PyObject *scribus_newimage(PyObject* /* self */, PyObject* args)
 {
@@ -92,11 +92,11 @@
 	{
 		QString objName = QString::fromUtf8(Name);
 		if (!ItemExists(objName))
 			ScCore->primaryMainWindow()->doc->Items->at(i)->setItemName(objName);
 	}
-	return PyString_FromString(ScCore->primaryMainWindow()->doc->Items->at(i)->itemName().toUtf8());
+	return Legacy_PyString_FromString(ScCore->primaryMainWindow()->doc->Items->at(i)->itemName().toUtf8());
 }
 
 
 PyObject *scribus_newtext(PyObject* /* self */, PyObject* args)
 {
@@ -117,11 +117,11 @@
 	{
 		QString objName = QString::fromUtf8(Name);
 		if (!ItemExists(objName))
 			ScCore->primaryMainWindow()->doc->Items->at(i)->setItemName(objName);
 	}
-	return PyString_FromString(ScCore->primaryMainWindow()->doc->Items->at(i)->itemName().toUtf8());
+	return Legacy_PyString_FromString(ScCore->primaryMainWindow()->doc->Items->at(i)->itemName().toUtf8());
 }
 
 PyObject *scribus_newtable(PyObject* /* self */, PyObject* args)
 {
 	double x, y, w, h;
@@ -153,11 +153,11 @@
 	{
 		QString objName = QString::fromUtf8(Name);
 		if (!ItemExists(objName))
 			ScCore->primaryMainWindow()->doc->Items->at(i)->setItemName(objName);
 	}
-	return PyString_FromString(table->itemName().toUtf8());
+	return Legacy_PyString_FromString(table->itemName().toUtf8());
 }
 
 PyObject *scribus_newline(PyObject* /* self */, PyObject* args)
 {
 	double x, y, w, h;
@@ -213,11 +213,11 @@
 	{
 		QString objName = QString::fromUtf8(Name);
 		if (!ItemExists(objName))
 			ScCore->primaryMainWindow()->doc->Items->at(i)->setItemName(objName);
 	}
-	return PyString_FromString(it->itemName().toUtf8());
+	return Legacy_PyString_FromString(it->itemName().toUtf8());
 }
 
 
 PyObject *scribus_polyline(PyObject* /* self */, PyObject* args)
 {
@@ -290,11 +290,11 @@
 	{
 		QString objName = QString::fromUtf8(Name);
 		if (!ItemExists(objName))
 			ScCore->primaryMainWindow()->doc->Items->at(ic)->setItemName(objName);
 	}
-	return PyString_FromString(it->itemName().toUtf8());
+	return Legacy_PyString_FromString(it->itemName().toUtf8());
 }
 
 
 PyObject *scribus_polygon(PyObject* /* self */, PyObject* args)
 {
@@ -372,11 +372,11 @@
 	{
 		QString objName = QString::fromUtf8(Name);
 		if (!ItemExists(objName))
 			ScCore->primaryMainWindow()->doc->Items->at(ic)->setItemName(objName);
 	}
-	return PyString_FromString(it->itemName().toUtf8());
+	return Legacy_PyString_FromString(it->itemName().toUtf8());
 }
 
 PyObject *scribus_bezierline(PyObject* /* self */, PyObject* args)
 {
 	char *Name = const_cast<char*>("");
@@ -463,11 +463,11 @@
 	{
 		QString objName = QString::fromUtf8(Name);
 		if (!ItemExists(objName))
 			ScCore->primaryMainWindow()->doc->Items->at(ic)->setItemName(objName);
 	}
-	return PyString_FromString(it->itemName().toUtf8());
+	return Legacy_PyString_FromString(it->itemName().toUtf8());
 }
 
 
 /* 03/31/2004 - xception handling
  */
@@ -504,11 +504,11 @@
 	{
 		QString objName = QString::fromUtf8(Name);
 		if (!ItemExists(objName))
 			i->setItemName(objName);
 	}
-	return PyString_FromString(i->itemName().toUtf8());
+	return Legacy_PyString_FromString(i->itemName().toUtf8());
 }
 
 
 /* 03/21/2004 - exception raised when Name doesn't exists. Doesn't crash then. (subik)
  */
@@ -660,11 +660,11 @@
 	if(!checkHaveDocument())
 		return NULL;
 	styleList = PyList_New(0);
 	for (int i=0; i < ScCore->primaryMainWindow()->doc->paragraphStyles().count(); ++i)
 	{
-		if (PyList_Append(styleList, PyString_FromString(ScCore->primaryMainWindow()->doc->paragraphStyles()[i].name().toUtf8())))
+		if (PyList_Append(styleList, Legacy_PyString_FromString(ScCore->primaryMainWindow()->doc->paragraphStyles()[i].name().toUtf8())))
 		{
 			// An exception will have already been set by PyList_Append apparently.
 			return NULL;
 		}
 	}
@@ -677,11 +677,11 @@
 	if(!checkHaveDocument())
 		return NULL;
 	charStyleList = PyList_New(0);
 	for (int i=0; i < ScCore->primaryMainWindow()->doc->charStyles().count(); ++i)
 	{
-		if (PyList_Append(charStyleList, PyString_FromString(ScCore->primaryMainWindow()->doc->charStyles()[i].name().toUtf8())))
+		if (PyList_Append(charStyleList, Legacy_PyString_FromString(ScCore->primaryMainWindow()->doc->charStyles()[i].name().toUtf8())))
 		{
 			// An exception will have already been set by PyList_Append apparently.
 			return NULL;
 		}
 	}
diff -r -U 5 old/scribus-1.5.3/scribus/plugins/scriptplugin/cmdtable.cpp bug-submission/scribus/plugins/scriptplugin/cmdtable.cpp
--- old/scribus-1.5.3/scribus/plugins/scriptplugin/cmdtable.cpp	2017-05-28 11:10:24.000000000 +0200
+++ bug-submission/scribus/plugins/scriptplugin/cmdtable.cpp	2017-09-01 16:15:25.000000000 +0200
@@ -336,11 +336,11 @@
 	if (!table)
 	{
 		PyErr_SetString(WrongFrameTypeError, QObject::tr("Cannot get table style on a non-table item.","python error").toLocal8Bit().constData());
 		return NULL;
 	}
-	return PyString_FromString(table->styleName().toUtf8());
+	return Legacy_PyString_FromString(table->styleName().toUtf8());
 }
 
 PyObject *scribus_settablestyle(PyObject* /* self */, PyObject* args)
 {
 	char *Name = const_cast<char*>("");
@@ -376,11 +376,11 @@
 	if (!table)
 	{
 		PyErr_SetString(WrongFrameTypeError, QObject::tr("Cannot get table fill color on a non-table item.","python error").toLocal8Bit().constData());
 		return NULL;
 	}
-	return PyString_FromString(table->fillColor().toUtf8());
+	return Legacy_PyString_FromString(table->fillColor().toUtf8());
 }
 
 PyObject *scribus_settablefillcolor(PyObject* /* self */, PyObject* args)
 {
 	char *Name = const_cast<char*>("");
diff -r -U 5 old/scribus-1.5.3/scribus/plugins/scriptplugin/cmdtext.cpp bug-submission/scribus/plugins/scriptplugin/cmdtext.cpp
--- old/scribus-1.5.3/scribus/plugins/scriptplugin/cmdtext.cpp	2017-05-28 11:10:24.000000000 +0200
+++ bug-submission/scribus/plugins/scriptplugin/cmdtext.cpp	2017-09-01 16:14:43.000000000 +0200
@@ -89,15 +89,15 @@
 	}
 	if (it->HasSel)
 	{
 		for (int b = 0; b < it->itemText.length(); b++)
 			if (it->itemText.selected(b))
-				return PyString_FromString(it->itemText.charStyle(b).font().scName().toUtf8());
+				return Legacy_PyString_FromString(it->itemText.charStyle(b).font().scName().toUtf8());
 		return NULL;
 	}
 	else
-		return PyString_FromString(it->currentCharStyle().font().scName().toUtf8());
+		return Legacy_PyString_FromString(it->currentCharStyle().font().scName().toUtf8());
 }
 
 PyObject *scribus_gettextsize(PyObject* /* self */, PyObject* args)
 {
 	char *Name = const_cast<char*>("");
@@ -169,15 +169,15 @@
 	}
 	if (it->HasSel)
 	{
 		for (int b = 0; b < it->itemText.length(); b++)
 			if (it->itemText.selected(b))
-				return PyString_FromString(it->itemText.charStyle(b).fontFeatures().toUtf8());
+				return Legacy_PyString_FromString(it->itemText.charStyle(b).fontFeatures().toUtf8());
 		return NULL;
 	}
 	else
-		return PyString_FromString(it->currentCharStyle().fontFeatures().toUtf8());
+		return Legacy_PyString_FromString(it->currentCharStyle().fontFeatures().toUtf8());
 }
 
 PyObject *scribus_getlinespace(PyObject* /* self */, PyObject* args)
 {
 	char *Name = const_cast<char*>("");
@@ -262,11 +262,11 @@
 		else
 		{
 			text += it->itemText.text(a);
 		}
 	}
-	return PyString_FromString(text.toUtf8());
+	return Legacy_PyString_FromString(text.toUtf8());
 }
 
 PyObject *scribus_gettext(PyObject* /* self */, PyObject* args)
 {
 	char *Name = const_cast<char*>("");
@@ -295,11 +295,11 @@
 		else
 		{
 			text += it->itemText.text(a);
 		}
 	} // for
-	return PyString_FromString(text.toUtf8());
+	return Legacy_PyString_FromString(text.toUtf8());
 }
 
 PyObject *scribus_setboxtext(PyObject* /* self */, PyObject* args)
 {
 	char *Name = const_cast<char*>("");
diff -r -U 5 old/scribus-1.5.3/scribus/plugins/scriptplugin/cmdvar.h bug-submission/scribus/plugins/scriptplugin/cmdvar.h
--- old/scribus-1.5.3/scribus/plugins/scriptplugin/cmdvar.h	2017-05-28 11:10:24.000000000 +0200
+++ bug-submission/scribus/plugins/scriptplugin/cmdvar.h	2017-10-25 23:55:59.000000000 +0200
@@ -30,10 +30,34 @@
 
 #ifndef Py_RETURN_TRUE
 	#define Py_RETURN_TRUE return Py_INCREF(Py_True), Py_True
 #endif
 
+
+// Python 2 -> Python 3 transition:
+#define Legacy_PyString_FromString PyBytes_FromString
+//#define PyString_FromStringAndSize PyBytes_FromStringAndSize
+#define Legacy_PyString_FromStringAndSize PyBytes_FromStringAndSize
+#define PyString_Check PyBytes_Check
+// rather CheckExact?
+#define PyString_Size PyBytes_Size
+#define PyString_AsString PyBytes_AsString
+#define PyInt_FromLong PyLong_FromLong
+#define PyInt_Check PyLong_Check
+#define PyInt_AsLong PyLong_AsLong
+#define PyCObject_Check PyCapsule_CheckExact
+#define PyCObject_AsVoidPtr(capsule) \
+		(PyCapsule_GetPointer(capsule, NULL))
+#define PyCObject_FromVoidPtr(pointer, destructor) \
+		(PyCapsule_New(pointer, NULL, destructor))
+// Helpful is:
+// https://docs.python.org/3/howto/cporting.html#cobject-replaced-with-capsule
+// as well as:
+// https://docs.python.org/3/c-api/bytes.html 
+// etc.
+
+
 #include <QString>
 
 #include "scribus.h"
 
 
@@ -49,10 +73,11 @@
 /** @brief A pointer to the ScripterCore instance */
 extern ScripterCore* scripterCore;
 
 /** @brief Initialize the 'scribus' Python module in the currently active interpreter */
 extern "C" void initscribus(ScribusMainWindow *pl);
+/*static*/ PyObject* PyInit_scribus(void);
 
 /* Exceptions */
 /*! Common scribus Exception */
 extern PyObject* ScribusException;
 /*! Exception raised when no document opened - see checkHaveDocument() in cmdutil.cpp */
diff -r -U 5 old/scribus-1.5.3/scribus/plugins/scriptplugin/objimageexport.cpp bug-submission/scribus/plugins/scriptplugin/objimageexport.cpp
--- old/scribus-1.5.3/scribus/plugins/scriptplugin/objimageexport.cpp	2017-05-28 11:10:24.000000000 +0200
+++ bug-submission/scribus/plugins/scriptplugin/objimageexport.cpp	2017-10-25 23:54:47.000000000 +0200
@@ -31,23 +31,23 @@
 static void ImageExport_dealloc(ImageExport* self)
 {
 	Py_XDECREF(self->name);
 	Py_XDECREF(self->type);
 	Py_XDECREF(self->allTypes);
-	self->ob_type->tp_free((PyObject *)self);
+	Py_TYPE(self)->tp_free((PyObject *)self);
 }
 
 static PyObject * ImageExport_new(PyTypeObject *type, PyObject * /*args*/, PyObject * /*kwds*/)
 {
 	if(!checkHaveDocument())
 		return NULL;
 
 	ImageExport *self;
 	self = (ImageExport *)type->tp_alloc(type, 0);
 	if (self != NULL) {
-		self->name = PyString_FromString("ImageExport.png");
-		self->type = PyString_FromString("PNG");
+		self->name = Legacy_PyString_FromString("ImageExport.png");
+		self->type = Legacy_PyString_FromString("PNG");
 		self->allTypes = PyList_New(0);
 		self->dpi = 72;
 		self->scale = 100;
 		self->quality = 100;
 	}
@@ -117,11 +117,11 @@
 	int pos = 0;
 	QList<QByteArray> list = QImageWriter::supportedImageFormats();
 	l = PyList_New(list.count());
 	for (QList<QByteArray>::Iterator it = list.begin(); it != list.end(); ++it)
 	{
-		PyList_SetItem(l, pos, PyString_FromString(QString((*it)).toLatin1().constData()));
+		PyList_SetItem(l, pos, Legacy_PyString_FromString(QString((*it)).toLatin1().constData()));
 		++pos;
 	}
 	return l;
 }
 
@@ -203,11 +203,10 @@
 	{NULL, (PyCFunction)(0), 0, NULL} // sentinel
 };
 
 PyTypeObject ImageExport_Type = {
 	PyObject_HEAD_INIT(NULL)   // PyObject_VAR_HEAD
-	0,
 	const_cast<char*>("scribus.ImageExport"), // char *tp_name; /* For printing, in format "<module>.<name>" */
 	sizeof(ImageExport),   // int tp_basicsize, /* For allocation */
 	0,  // int tp_itemsize; /* For allocation */
 	(destructor) ImageExport_dealloc, //	 destructor tp_dealloc;
 	0, //	 printfunc tp_print;
@@ -249,11 +248,14 @@
 	0, //	 PyObject *tp_mro; /* method resolution order */
 	0, //	 PyObject *tp_cache;
 	0, //	 PyObject *tp_subclasses;
 	0, //	 PyObject *tp_weaklist;
 	0, //	 destructor tp_del;
-
+	// Added in version 2.6:
+	0, //	 unsigned int tp_version_tag;
+	0, //	 destructor tp_finalize;
+	
 #ifdef COUNT_ALLOCS
 	/* these must be last and never explicitly initialized */
 	//	int tp_allocs;
 	//	int tp_frees;
 	//	int tp_maxalloc;
diff -r -U 5 old/scribus-1.5.3/scribus/plugins/scriptplugin/objpdffile.cpp bug-submission/scribus/plugins/scriptplugin/objpdffile.cpp
--- old/scribus-1.5.3/scribus/plugins/scriptplugin/objpdffile.cpp	2017-05-28 11:10:24.000000000 +0200
+++ bug-submission/scribus/plugins/scriptplugin/objpdffile.cpp	2017-10-25 23:53:29.000000000 +0200
@@ -133,11 +133,11 @@
 	Py_XDECREF(self->imagepr);
 	Py_XDECREF(self->printprofc);
 	Py_XDECREF(self->info);
 	Py_XDECREF(self->rotateDeg);
 	Py_XDECREF(self->openAction);
-	self->ob_type->tp_free((PyObject *)self);
+	Py_TYPE(self)->tp_free((PyObject *)self);
 }
 
 static PyObject * PDFfile_new(PyTypeObject *type, PyObject * /*args*/, PyObject * /*kwds*/)
 {
 // do not create new object if there is no opened document
@@ -148,11 +148,11 @@
 	PDFfile *self;
 
 	self = (PDFfile *)type->tp_alloc(type, 0);
 	if (self) {
 // set file attribute
-		self->file = PyString_FromString("");
+		self->file = Legacy_PyString_FromString("");
 		if (!self->file) {
 			Py_DECREF(self);
 			return NULL;
 		}
 // set font embedding mode attribute
@@ -237,17 +237,17 @@
 		if (!self->lpival){
 			Py_DECREF(self);
 			return NULL;
 		}
 // set owner attribute
-		self->owner = PyString_FromString("");
+		self->owner = Legacy_PyString_FromString("");
 		if (!self->owner){
 			Py_DECREF(self);
 			return NULL;
 		}
 // set user attribute
-		self->user = PyString_FromString("");
+		self->user = Legacy_PyString_FromString("");
 		if (!self->user){
 			Py_DECREF(self);
 			return NULL;
 		}
 // set allowPrinting attribute
@@ -267,26 +267,26 @@
 		self->profiles = 0; // bool
 		self->profilei = 0; // bool
 		self->intents = 0; // int - 0 - ?
 		self->intenti = 0; // int - 0 - ?
 		self->noembicc = 0; // bool
-		self->solidpr = PyString_FromString("");
+		self->solidpr = Legacy_PyString_FromString("");
 		if (!self->solidpr){
 			Py_DECREF(self);
 			return NULL;
 		}
-		self->imagepr = PyString_FromString("");
+		self->imagepr = Legacy_PyString_FromString("");
 		if (!self->imagepr){
 			Py_DECREF(self);
 			return NULL;
 		}
-		self->printprofc = PyString_FromString("");
+		self->printprofc = Legacy_PyString_FromString("");
 		if (!self->printprofc){
 			Py_DECREF(self);
 			return NULL;
 		}
-		self->info = PyString_FromString("");
+		self->info = Legacy_PyString_FromString("");
 		if (!self->info){
 			Py_DECREF(self);
 			return NULL;
 		}
 		self->bleedt = 0; // double -
@@ -311,11 +311,11 @@
 		self->displayLayers = 0;
 		self->displayFullscreen = 0;
 		self->hideToolBar = 0;
 		self->hideMenuBar = 0;
 		self->fitWindow = 0;
-		self->openAction = PyString_FromString("");
+		self->openAction = Legacy_PyString_FromString("");
 		if (!self->openAction){
 			Py_DECREF(self);
 			return NULL;
 		}
 	}
@@ -337,11 +337,11 @@
 	if (tf.isEmpty()) {
 		QFileInfo fi = QFileInfo(currentDoc->DocName);
 		tf = fi.path()+"/"+fi.baseName()+".pdf";
 	}
 	PyObject *file = NULL;
-	file = PyString_FromString(tf.toLatin1());
+	file = Legacy_PyString_FromString(tf.toLatin1());
 	if (file){
 		Py_DECREF(self->file);
 		self->file = file;
 	} else {
 		PyErr_SetString(PyExc_SystemError, "Can not initialize 'file' attribute");
@@ -373,11 +373,11 @@
 	QList<QString> tmpEm = ReallyUsed.keys();
 	for (int i = 0; i < tmpEm.count(); ++i) 
 	{
 		QString fontName = tmpEm.at(i);
 		PyObject *tmp= NULL;
-		tmp = PyString_FromString(fontName.toLatin1());
+		tmp = Legacy_PyString_FromString(fontName.toLatin1());
 		if (tmp) {
 			PyList_Append(self->fonts, tmp);
 // do i need Py_DECREF(tmp) here?
 // Does PyList_Append increase reference or 'steal' one from provided argument
 // If it 'steal' reference comment next line
@@ -399,11 +399,11 @@
 	}
 // copied from TabPDFOptions::restoreDefaults()
 	for (int fe = 0; fe < pdfOptions.SubsetList.count(); ++fe)
 	{
 		PyObject *tmp= NULL;
-		tmp = PyString_FromString(pdfOptions.SubsetList[fe].toLatin1().data());
+		tmp = Legacy_PyString_FromString(pdfOptions.SubsetList[fe].toLatin1().data());
 		if (tmp) {
 			PyList_Append(self->subsetList, tmp);
 			Py_DECREF(tmp);
 		}
 		else {
@@ -547,21 +547,21 @@
 	PyList_Reverse(lpival);
 	Py_DECREF(self->lpival);
 	self->lpival = lpival;
 // set owner's password
 	PyObject *owner = NULL;
-	owner = PyString_FromString(pdfOptions.PassOwner.toLatin1());
+	owner = Legacy_PyString_FromString(pdfOptions.PassOwner.toLatin1());
 	if (owner){
 		Py_DECREF(self->owner);
 		self->owner = owner;
 	} else {
 		PyErr_SetString(PyExc_SystemError, "Can not initialize 'owner' attribute");
 		return -1;
 	}
 // set user'a password
 	PyObject *user = NULL;
-	user = PyString_FromString(pdfOptions.PassUser.toLatin1());
+	user = Legacy_PyString_FromString(pdfOptions.PassUser.toLatin1());
 	if (user){
 		Py_DECREF(self->user);
 		self->user = user;
 	} else {
 		PyErr_SetString(PyExc_SystemError, "Can not initialize 'user' attribute");
@@ -587,11 +587,11 @@
 	self->intenti = pdfOptions.Intent2; // int - 0 - 3
 	QString tp = pdfOptions.SolidProf;
 	if (!ScCore->InputProfiles.contains(tp))
 		tp = currentDoc->cmsSettings().DefaultSolidColorRGBProfile;
 	PyObject *solidpr = NULL;
-	solidpr = PyString_FromString(tp.toLatin1());
+	solidpr = Legacy_PyString_FromString(tp.toLatin1());
 	if (solidpr){
 		Py_DECREF(self->solidpr);
 		self->solidpr = solidpr;
 	} else {
 		PyErr_SetString(PyExc_SystemError, "Can not initialize 'solidpr' attribute");
@@ -599,11 +599,11 @@
 	}
 	QString tp2 = pdfOptions.ImageProf;
 	if (!ScCore->InputProfiles.contains(tp2))
 		tp2 = currentDoc->cmsSettings().DefaultSolidColorRGBProfile;
 	PyObject *imagepr = NULL;
-	imagepr = PyString_FromString(tp2.toLatin1());
+	imagepr = Legacy_PyString_FromString(tp2.toLatin1());
 	if (imagepr){
 		Py_DECREF(self->imagepr);
 		self->imagepr = imagepr;
 	} else {
 		PyErr_SetString(PyExc_SystemError, "Can not initialize 'imagepr' attribute");
@@ -611,21 +611,21 @@
 	}
 	QString tp3 = pdfOptions.PrintProf;
 	if (!ScCore->PDFXProfiles.contains(tp3))
 		tp3 = currentDoc->cmsSettings().DefaultPrinterProfile;
 	PyObject *printprofc = NULL;
-	printprofc = PyString_FromString(tp3.toLatin1());
+	printprofc = Legacy_PyString_FromString(tp3.toLatin1());
 	if (printprofc){
 		Py_DECREF(self->printprofc);
 		self->printprofc = printprofc;
 	} else {
 		PyErr_SetString(PyExc_SystemError, "Can not initialize 'printprofc' attribute");
 		return -1;
 	}
 	QString tinfo = pdfOptions.Info;
 	PyObject *info = NULL;
-	info = PyString_FromString(tinfo.toLatin1());
+	info = Legacy_PyString_FromString(tinfo.toLatin1());
 	if (info){
 		Py_DECREF(self->info);
 		self->info = info;
 	} else {
 		PyErr_SetString(PyExc_SystemError, "Can not initialize 'info' attribute");
@@ -659,11 +659,11 @@
 	self->hideToolBar = pdfOptions.hideToolBar; // bool
 	self->hideMenuBar = pdfOptions.hideMenuBar; // bool
 	self->fitWindow = pdfOptions.fitWindow; // bool
 
 	PyObject *openAction = NULL;
-	openAction = PyString_FromString(pdfOptions.openAction.toLatin1().data());
+	openAction = Legacy_PyString_FromString(pdfOptions.openAction.toLatin1().data());
 	if (openAction){
 		Py_DECREF(self->openAction);
 		self->openAction = openAction;
 	} else {
 		PyErr_SetString(PyExc_SystemError, "Can not initialize 'openAction' attribute");
@@ -1544,11 +1544,10 @@
 	{NULL, (PyCFunction)(0), 0, NULL} // sentinel
 };
 
 PyTypeObject PDFfile_Type = {
 	PyObject_HEAD_INIT(NULL) // PyObject_VAR_HEAD
-	0,		      //
 	const_cast<char*>("scribus.PDFfile"), // char *tp_name; /* For printing, in format "<module>.<name>" */
 	sizeof(PDFfile),     // int tp_basicsize, /* For allocation */
 	0,		    // int tp_itemsize; /* For allocation */
 
 	/* Methods to implement standard operations */
diff -r -U 5 old/scribus-1.5.3/scribus/plugins/scriptplugin/objprinter.cpp bug-submission/scribus/plugins/scriptplugin/objprinter.cpp
--- old/scribus-1.5.3/scribus/plugins/scriptplugin/objprinter.cpp	2017-05-28 11:10:24.000000000 +0200
+++ bug-submission/scribus/plugins/scriptplugin/objprinter.cpp	2017-10-25 23:52:35.000000000 +0200
@@ -57,11 +57,11 @@
 	Py_XDECREF(self->printer);
 	Py_XDECREF(self->file);
 	Py_XDECREF(self->cmd);
 	Py_XDECREF(self->pages);
 	Py_XDECREF(self->separation);
-	self->ob_type->tp_free((PyObject *)self);
+	Py_TYPE(self)->tp_free((PyObject *)self);
 }
 
 static PyObject * Printer_new(PyTypeObject *type, PyObject * /*args*/, PyObject * /*kwds*/)
 {
 // do not create new object if there is no opened document
@@ -77,23 +77,23 @@
 		if (self->allPrinters == NULL){
 			Py_DECREF(self);
 			return NULL;
 		}
 // set printer attribute
-		self->printer = PyString_FromString("");
+		self->printer = Legacy_PyString_FromString("");
 		if (self->printer == NULL){
 			Py_DECREF(self);
 			return NULL;
 		}
 // set file attribute
-		self->file = PyString_FromString("");
+		self->file = Legacy_PyString_FromString("");
 		if (self->file == NULL){
 			Py_DECREF(self);
 			return NULL;
 		}
 // set cmd attribute
-		self->cmd = PyString_FromString("");
+		self->cmd = Legacy_PyString_FromString("");
 		if (self->cmd == NULL){
 			Py_DECREF(self);
 			return NULL;
 		}
 // set pages attribute
@@ -101,11 +101,11 @@
 		if (self->pages == NULL){
 			Py_DECREF(self);
 			return NULL;
 		}
 // set separation attribute
-		self->separation = PyString_FromString("No");
+		self->separation = Legacy_PyString_FromString("No");
 		if (self->separation == NULL){
 			Py_DECREF(self);
 			return NULL;
 		}
 // set color attribute
@@ -142,22 +142,22 @@
 	for (int i = 0; i < printers.count(); ++i)
 	{
 		QString prn = printers[i];
 		if (prn.isEmpty())
 			continue;
-		PyObject *tmppr = PyString_FromString(prn.toLocal8Bit().constData());
+		PyObject *tmppr = Legacy_PyString_FromString(prn.toLocal8Bit().constData());
 		if (tmppr){
 			PyList_Append(self->allPrinters, tmppr);
 			Py_DECREF(tmppr);
 		}
 	}
-	PyObject *tmp2 = PyString_FromString("File");
+	PyObject *tmp2 = Legacy_PyString_FromString("File");
 	PyList_Append(self->allPrinters, tmp2);
 	Py_DECREF(tmp2);
 // as defaut set to print into file
 	PyObject *printer = NULL;
-	printer = PyString_FromString("File");
+	printer = Legacy_PyString_FromString("File");
 	if (printer){
 		Py_DECREF(self->printer);
 		self->printer = printer;
 	}
 // set defaul name of file to print into
@@ -165,21 +165,21 @@
 	if (tf.isEmpty()) {
 		QFileInfo fi = QFileInfo(ScCore->primaryMainWindow()->doc->DocName);
 		tf = fi.path()+"/"+fi.baseName()+".pdf";
 	}
 	PyObject *file = NULL;
-	file = PyString_FromString(tf.toLatin1());
+	file = Legacy_PyString_FromString(tf.toLatin1());
 	if (file){
 		Py_DECREF(self->file);
 		self->file = file;
 	} else {
 		PyErr_SetString(PyExc_SystemError, "Can not initialize 'file' attribute");
 		return -1;
 	}
 // alternative printer commands default to ""
 	PyObject *cmd = NULL;
-	cmd = PyString_FromString("");
+	cmd = Legacy_PyString_FromString("");
 	if (cmd){
 		Py_DECREF(self->cmd);
 		self->cmd = cmd;
 	}
 // if document exist when created Printer instance
@@ -197,11 +197,11 @@
 		if (tmp)
 			PyList_SetItem(self->pages, i, tmp);
 	}
 // do not print separation
 	PyObject *separation = NULL;
-	separation = PyString_FromString("No");
+	separation = Legacy_PyString_FromString("No");
 	if (separation){
 		Py_DECREF(self->separation);
 		self->separation = separation;
 	}
 // print in color
@@ -512,11 +512,10 @@
 	{NULL, (PyCFunction)(0), 0, NULL} // sentinel
 };
 
 PyTypeObject Printer_Type = {
 	PyObject_HEAD_INIT(NULL)   // PyObject_VAR_HEAD
-	0,			 //
 	const_cast<char*>("scribus.Printer"), // char *tp_name; /* For printing, in format "<module>.<name>" */
 	sizeof(Printer),   // int tp_basicsize, /* For allocation */
 	0,		       // int tp_itemsize; /* For allocation */
 
 	/* Methods to implement standard operations */
diff -r -U 5 old/scribus-1.5.3/scribus/plugins/scriptplugin/scriptercore.cpp bug-submission/scribus/plugins/scriptplugin/scriptercore.cpp
--- old/scribus-1.5.3/scribus/plugins/scriptplugin/scriptercore.cpp	2017-05-28 11:10:24.000000000 +0200
+++ bug-submission/scribus/plugins/scriptplugin/scriptercore.cpp	2017-10-26 00:03:20.000000000 +0200
@@ -264,22 +264,24 @@
 
 	// Make sure sys.argv[0] is the path to the script
 	arguments.prepend(na.data());
 	//convert arguments (QListString) to char** for Python bridge
 	/* typically arguments == ['path/to/script.py','--argument1','valueforarg1','--flag']*/
-	char **comm = new char*[arguments.size()];
+	wchar_t **comm = new wchar_t*[arguments.size()];
 	for (int i = 0; i < arguments.size(); i++)
 	{
 		QByteArray localStr = arguments.at(i).toLocal8Bit();
-		comm[i] = new char[localStr.size() + 1]; //+1 to allow adding '\0'. may be useless, don't know how to check.
-		comm[i][localStr.size()] = 0;
-		strncpy(comm[i], localStr.data(), localStr.size());
+		char * tmp = new char[localStr.size() + 1];
+		tmp[localStr.size()] = 0;
+		strncpy(tmp, localStr.data(), localStr.size());
+		comm[i] = Py_DecodeLocale(tmp, NULL);
+		delete[] tmp;
 	}
 	PySys_SetArgv(arguments.size(), comm);
 
 	for (int i = 0; i < arguments.size(); i++)
-		delete[] comm[i];
+		PyMem_RawFree(comm[i]);
 	delete[] comm;
 	
 	// call python script
 	PyObject* m = PyImport_AddModule((char*)"__main__");
 	if (m == NULL)
@@ -292,19 +294,19 @@
 		// FIXME: If filename contains chars outside 7bit ascii, might be problems
 		PyObject* globals = PyModule_GetDict(m);
 		// Build the Python code to run the script
 		//QString cm = QString("from __future__ import division\n"); removed due #5252 PV
 		QString cm = QString("import sys\n");
-		cm        += QString("import cStringIO\n");
+		cm        += QString("import io\n");
 		/* Implementation of the help() in pydoc.py reads some OS variables
 		 * for output settings. I use ugly hack to stop freezing calling help()
 		 * in script. pv. */
 		cm        += QString("import os\nos.environ['PAGER'] = '/bin/false'\n"); // HACK
 		cm        += QString("sys.path[0] = \"%1\"\n").arg(escapedAbsPath);
 		// Replace sys.stdin with a dummy StringIO that always returns
 		// "" for read
-		cm        += QString("sys.stdin = cStringIO.StringIO()\n");
+		cm        += QString("sys.stdin = io.StringIO()\n");
 		// tell the script if it's running in the main intepreter or a subinterpreter
 		cm        += QString("import scribus\n");
 		if (inMainInterpreter)
 			cm+= QString("scribus.mainInterpreter = True\n");
 		else
@@ -409,25 +411,26 @@
 		Calling all code in one command:
 		ia = code.InteractiveInterpreter() ia.runsource(getval())
 		works fine in plain Python. Not here. WTF? */
 		cm += (
 				"try:\n"
-				"    import cStringIO\n"
-				"    scribus._bu = cStringIO.StringIO()\n"
+				"    print('Started script console.') # Outputs to stdout of scribus\n"
+				"    import io\n"
+				"    scribus._bu = io.StringIO()\n"
 				"    sys.stdout = scribus._bu\n"
 				"    sys.stderr = scribus._bu\n"
 				"    sys.argv = ['scribus']\n" // this is the PySys_SetArgv replacement
 				"    scribus.mainInterpreter = True\n" // the scripter console runs everything in the main interpreter
 				"    for i in scribus.getval().splitlines():\n"
 				"        scribus._ia.push(i)\n"
 				"    scribus.retval(scribus._bu.getvalue())\n"
 				"    sys.stdout = sys.__stdout__\n"
 				"    sys.stderr = sys.__stderr__\n"
 				"except SystemExit:\n"
-				"    print 'Catched SystemExit - it is not good for Scribus'\n"
+				"    print ('Catched SystemExit - it is not good for Scribus')\n"
 				"except KeyboardInterrupt:\n"
-				"    print 'Catched KeyboardInterrupt - it is not good for Scribus'\n"
+				"    print ('Catched KeyboardInterrupt - it is not good for Scribus')\n"
 			  );
 	}
 	// Set up sys.argv
 	/* PV - WARNING: THIS IS EVIL! This code summons a crash - see
 	bug #3510. I don't know why as the Python C API is a little
@@ -594,18 +597,20 @@
 	menuMgr->setText("RecentScripts", QObject::tr("&Recent Scripts"));
 }
 
 bool ScripterCore::setupMainInterpreter()
 {
+	// Code duplication - StringIO several times assigned to sys.stdin?
 	QString cm = QString(
 		"# -*- coding: utf-8 -*-\n"
 		"import scribus\n"
 		"import sys\n"
 		"import code\n"
 		"sys.path.insert(0, \"%1\")\n"
-		"import cStringIO\n"
-		"sys.stdin = cStringIO.StringIO()\n"
+		"import io\n"
+		"sys.stdin = io.StringIO()\n"
+		"#print('    scriptercore.cpp: This is the .so plugin loading code.')\n"
 		"scribus._ia = code.InteractiveConsole(globals())\n"
 		).arg(ScPaths::instance().scriptDir());
 	if (m_importAllNames)
 		cm += "from scribus import *\n";
 	QByteArray cmd = cm.toUtf8();
diff -r -U 5 old/scribus-1.5.3/scribus/plugins/scriptplugin/scriptplugin.cpp bug-submission/scribus/plugins/scriptplugin/scriptplugin.cpp
--- old/scribus-1.5.3/scribus/plugins/scriptplugin/scriptplugin.cpp	2017-05-28 11:10:24.000000000 +0200
+++ bug-submission/scribus/plugins/scriptplugin/scriptplugin.cpp	2017-09-01 17:26:00.000000000 +0200
@@ -168,20 +168,22 @@
 		QString ph = QDir::toNativeSeparators(pyHome);
 		pythonHome = ph.toLocal8Bit();
 		Py_SetPythonHome(pythonHome.data());
 	}
 #endif
+	scripterCore = new ScripterCore(ScCore->primaryMainWindow());
+	Q_CHECK_PTR(scripterCore);
+	
+	PyImport_AppendInittab("scribus", &PyInit_scribus);
 	Py_Initialize();
-	if (PyUnicode_SetDefaultEncoding("utf-8"))
+	/*if (PyUnicode_SetDefaultEncoding("utf-8"))
 	{
 		qDebug("Failed to set default encoding to utf-8.\n");
 		PyErr_Clear();
-	}
+	}*/
 
-	scripterCore = new ScripterCore(ScCore->primaryMainWindow());
-	Q_CHECK_PTR(scripterCore);
-	initscribus(ScCore->primaryMainWindow());
+	//initscribus(ScCore->primaryMainWindow());
 #ifdef HAVE_SCRIPTER2
 	scripter2_init();
 #endif
 	scripterCore->setupMainInterpreter();
 	scripterCore->initExtensionScripts();
@@ -252,11 +254,11 @@
 	return PyInt_FromLong(0L);
 }
 
 /*static */PyObject *scribus_getval(PyObject* /*self*/)
 {
-	return PyString_FromString(scripterCore->inValue.toUtf8().data());
+	return PyUnicode_FromString(scripterCore->inValue.toUtf8().data());
 }
 
 /*! \brief Translate a docstring. Small helper function for use with the
  * PyMethodDef struct.
  */
@@ -573,32 +575,70 @@
 	{const_cast<char*>("retval"), (PyCFunction)scribus_retval, METH_VARARGS, const_cast<char*>("Scribus internal.")},
 	{const_cast<char*>("getval"), (PyCFunction)scribus_getval, METH_NOARGS, const_cast<char*>("Scribus internal.")},
 	{NULL, (PyCFunction)(0), 0, NULL} /* sentinel */
 };
 
+
+struct module_state {
+    PyObject *error;
+};
+#define GETSTATE(m) ((struct module_state*)PyModule_GetState(m))
+
+static int myextension_traverse(PyObject *m, visitproc visit, void *arg) {
+    Py_VISIT(GETSTATE(m)->error);
+    return 0;
+}
+
+static int myextension_clear(PyObject *m) {
+    Py_CLEAR(GETSTATE(m)->error);
+    return 0;
+}
+
+static struct PyModuleDef moduledef = {
+        PyModuleDef_HEAD_INIT,
+        "scribus",
+        NULL,
+        sizeof(struct module_state),
+        scribus_methods,
+        NULL,
+        myextension_traverse,
+        myextension_clear,
+        NULL
+};
+
+
 void initscribus_failed(const char* fileName, int lineNo)
 {
 	qDebug("Scripter setup failed (%s:%i)", fileName, lineNo);
 	if (PyErr_Occurred())
 		PyErr_Print();
 	return;
 }
 
+// explanation on how it's to be done: https://docs.python.org/3/howto/cporting.html
+// Additional hint: has to be called by PyImport_AppendInittab before Py_Initialize
+/*static*/ PyObject* PyInit_scribus(void) {
+	PyObject *m;
+	m = PyModule_Create(&moduledef);
+	return m;
+}
 void initscribus(ScribusMainWindow *pl)
 {
+	
 	if (!scripterCore)
 	{
 		qWarning("scriptplugin: Tried to init scribus module, but no scripter core. Aborting.");
 		return;
 	}
 	PyObject *m, *d;
-	PyImport_AddModule((char*)"scribus");
+	m = PyImport_AddModule((char*)"scribus");
 
 	PyType_Ready(&Printer_Type);
 	PyType_Ready(&PDFfile_Type);
 	PyType_Ready(&ImageExport_Type);
-	m = Py_InitModule((char*)"scribus", scribus_methods);
+	//m = Py_InitModule((char*)"scribus", scribus_methods);
+	
 	Py_INCREF(&Printer_Type);
 	PyModule_AddObject(m, (char*)"Printer", (PyObject *) &Printer_Type);
 	Py_INCREF(&PDFfile_Type);
 	PyModule_AddObject(m, (char*)"PDFfile", (PyObject *) &PDFfile_Type);
 	Py_INCREF(&ImageExport_Type);
@@ -631,116 +671,116 @@
 	Py_INCREF(NameExistsError);
 	PyModule_AddObject(m, (char*)"NameExistsError", NameExistsError);
 	// Done with exception setup
 
 	// CONSTANTS
-	PyDict_SetItemString(d, const_cast<char*>("UNIT_POINTS"), PyInt_FromLong(unitIndexFromString("pt")));
-	PyDict_SetItemString(d, const_cast<char*>("UNIT_MILLIMETERS"), PyInt_FromLong(unitIndexFromString("mm")));
-	PyDict_SetItemString(d, const_cast<char*>("UNIT_INCHES"), PyInt_FromLong(unitIndexFromString("in")));
-	PyDict_SetItemString(d, const_cast<char*>("UNIT_PICAS"), PyInt_FromLong(unitIndexFromString("p")));
-	PyDict_SetItemString(d, const_cast<char*>("UNIT_CENTIMETRES"), PyInt_FromLong(unitIndexFromString("cm")));
-	PyDict_SetItemString(d, const_cast<char*>("UNIT_CICERO"), PyInt_FromLong(unitIndexFromString("c")));
-        PyDict_SetItemString(d, const_cast<char*>("UNIT_PT"), PyInt_FromLong(unitIndexFromString("pt")));
-        PyDict_SetItemString(d, const_cast<char*>("UNIT_MM"), PyInt_FromLong(unitIndexFromString("mm")));
-        PyDict_SetItemString(d, const_cast<char*>("UNIT_IN"), PyInt_FromLong(unitIndexFromString("in")));
-        PyDict_SetItemString(d, const_cast<char*>("UNIT_P"), PyInt_FromLong(unitIndexFromString("p")));
-        PyDict_SetItemString(d, const_cast<char*>("UNIT_CM"), PyInt_FromLong(unitIndexFromString("cm")));
-        PyDict_SetItemString(d, const_cast<char*>("UNIT_C"), PyInt_FromLong(unitIndexFromString("c")));
-	PyDict_SetItemString(d, const_cast<char*>("PORTRAIT"), Py_BuildValue(const_cast<char*>("i"), portraitPage));
-	PyDict_SetItemString(d, const_cast<char*>("LANDSCAPE"), Py_BuildValue(const_cast<char*>("i"), landscapePage));
-	PyDict_SetItemString(d, const_cast<char*>("NOFACINGPAGES"), Py_BuildValue(const_cast<char*>("i"), 0));
-	PyDict_SetItemString(d, const_cast<char*>("FACINGPAGES"),  Py_BuildValue(const_cast<char*>("i"), 1));
-	PyDict_SetItemString(d, const_cast<char*>("FIRSTPAGERIGHT"), Py_BuildValue(const_cast<char*>("i"), 1));
-	PyDict_SetItemString(d, const_cast<char*>("FIRSTPAGELEFT"), Py_BuildValue(const_cast<char*>("i"), 0));
-	PyDict_SetItemString(d, const_cast<char*>("ALIGN_LEFT"), Py_BuildValue(const_cast<char*>("i"), 0));
-	PyDict_SetItemString(d, const_cast<char*>("ALIGN_RIGHT"), Py_BuildValue(const_cast<char*>("i"), 2));
-	PyDict_SetItemString(d, const_cast<char*>("ALIGN_CENTERED"), Py_BuildValue(const_cast<char*>("i"), 1));
-	PyDict_SetItemString(d, const_cast<char*>("ALIGN_BLOCK"), Py_BuildValue(const_cast<char*>("i"), 3));
-	PyDict_SetItemString(d, const_cast<char*>("ALIGN_FORCED"), Py_BuildValue(const_cast<char*>("i"), 4));
-	PyDict_SetItemString(d, const_cast<char*>("DIRECTION_LTR"), Py_BuildValue(const_cast<char*>("i"), 0));
-	PyDict_SetItemString(d, const_cast<char*>("DIRECTION_RTL"), Py_BuildValue(const_cast<char*>("i"), 1));
-	PyDict_SetItemString(d, const_cast<char*>("FILL_NOG"), Py_BuildValue(const_cast<char*>("i"), 0));
-	PyDict_SetItemString(d, const_cast<char*>("FILL_HORIZONTALG"), Py_BuildValue(const_cast<char*>("i"), 1));
-	PyDict_SetItemString(d, const_cast<char*>("FILL_VERTICALG"), Py_BuildValue(const_cast<char*>("i"), 2));
-	PyDict_SetItemString(d, const_cast<char*>("FILL_DIAGONALG"), Py_BuildValue(const_cast<char*>("i"), 3));
-	PyDict_SetItemString(d, const_cast<char*>("FILL_CROSSDIAGONALG"), Py_BuildValue(const_cast<char*>("i"), 4));
-	PyDict_SetItemString(d, const_cast<char*>("FILL_RADIALG"), Py_BuildValue(const_cast<char*>("i"), 5));
-	PyDict_SetItemString(d, const_cast<char*>("LINE_SOLID"), Py_BuildValue(const_cast<char*>("i"), Qt::SolidLine));
-	PyDict_SetItemString(d, const_cast<char*>("LINE_DASH"), Py_BuildValue(const_cast<char*>("i"), Qt::DashLine));
-	PyDict_SetItemString(d, const_cast<char*>("LINE_DOT"), Py_BuildValue(const_cast<char*>("i"), Qt::DotLine));
-	PyDict_SetItemString(d, const_cast<char*>("LINE_DASHDOT"), Py_BuildValue(const_cast<char*>("i"), Qt::DashDotLine));
-	PyDict_SetItemString(d, const_cast<char*>("LINE_DASHDOTDOT"), Py_BuildValue(const_cast<char*>("i"), Qt::DashDotDotLine));
-	PyDict_SetItemString(d, const_cast<char*>("JOIN_MITTER"), Py_BuildValue(const_cast<char*>("i"), Qt::MiterJoin));
-	PyDict_SetItemString(d, const_cast<char*>("JOIN_BEVEL"), Py_BuildValue(const_cast<char*>("i"), Qt::BevelJoin));
-	PyDict_SetItemString(d, const_cast<char*>("JOIN_ROUND"), Py_BuildValue(const_cast<char*>("i"), Qt::RoundJoin));
-	PyDict_SetItemString(d, const_cast<char*>("CAP_FLAT"), Py_BuildValue(const_cast<char*>("i"), Qt::FlatCap));
-	PyDict_SetItemString(d, const_cast<char*>("CAP_SQUARE"), Py_BuildValue(const_cast<char*>("i"), Qt::SquareCap));
-	PyDict_SetItemString(d, const_cast<char*>("CAP_ROUND"), Py_BuildValue(const_cast<char*>("i"), Qt::RoundCap));
-	PyDict_SetItemString(d, const_cast<char*>("BUTTON_NONE"), Py_BuildValue(const_cast<char*>("i"), QMessageBox::NoButton));
-	PyDict_SetItemString(d, const_cast<char*>("BUTTON_OK"), Py_BuildValue(const_cast<char*>("i"), QMessageBox::Ok));
-	PyDict_SetItemString(d, const_cast<char*>("BUTTON_CANCEL"), Py_BuildValue(const_cast<char*>("i"), QMessageBox::Cancel));
-	PyDict_SetItemString(d, const_cast<char*>("BUTTON_YES"), Py_BuildValue(const_cast<char*>("i"), QMessageBox::Yes));
-	PyDict_SetItemString(d, const_cast<char*>("BUTTON_NO"), Py_BuildValue(const_cast<char*>("i"), QMessageBox::No));
-	PyDict_SetItemString(d, const_cast<char*>("BUTTON_ABORT"), Py_BuildValue(const_cast<char*>("i"), QMessageBox::Abort));
-	PyDict_SetItemString(d, const_cast<char*>("BUTTON_RETRY"), Py_BuildValue(const_cast<char*>("i"), QMessageBox::Retry));
-	PyDict_SetItemString(d, const_cast<char*>("BUTTON_IGNORE"), Py_BuildValue(const_cast<char*>("i"), QMessageBox::Ignore));
-	PyDict_SetItemString(d, const_cast<char*>("BUTTON_DEFAULT"), Py_BuildValue(const_cast<char*>("i"), QMessageBox::Default));
-	PyDict_SetItemString(d, const_cast<char*>("ICON_NONE"), Py_BuildValue(const_cast<char*>("i"), QMessageBox::NoIcon));
-	PyDict_SetItemString(d, const_cast<char*>("ICON_INFORMATION"), Py_BuildValue(const_cast<char*>("i"), QMessageBox::Information));
-	PyDict_SetItemString(d, const_cast<char*>("ICON_WARNING"), Py_BuildValue(const_cast<char*>("i"), QMessageBox::Warning));
-	PyDict_SetItemString(d, const_cast<char*>("ICON_CRITICAL"), Py_BuildValue(const_cast<char*>("i"), QMessageBox::Critical));
-	PyDict_SetItemString(d, const_cast<char*>("PAPER_A0"), Py_BuildValue(const_cast<char*>("(ff)"), 2380.0, 3368.0));
-	PyDict_SetItemString(d, const_cast<char*>("PAPER_A1"), Py_BuildValue(const_cast<char*>("(ff)"), 1684.0, 2380.0));
-	PyDict_SetItemString(d, const_cast<char*>("PAPER_A2"), Py_BuildValue(const_cast<char*>("(ff)"), 1190.0, 1684.0));
-	PyDict_SetItemString(d, const_cast<char*>("PAPER_A3"), Py_BuildValue(const_cast<char*>("(ff)"), 842.0, 1190.0));
-	PyDict_SetItemString(d, const_cast<char*>("PAPER_A4"), Py_BuildValue(const_cast<char*>("(ff)"), 595.0, 842.0));
-	PyDict_SetItemString(d, const_cast<char*>("PAPER_A5"), Py_BuildValue(const_cast<char*>("(ff)"), 421.0, 595.0));
-	PyDict_SetItemString(d, const_cast<char*>("PAPER_A6"), Py_BuildValue(const_cast<char*>("(ff)"), 297.0, 421.0));
-	PyDict_SetItemString(d, const_cast<char*>("PAPER_A7"), Py_BuildValue(const_cast<char*>("(ff)"), 210.0, 297.0));
-	PyDict_SetItemString(d, const_cast<char*>("PAPER_A8"), Py_BuildValue(const_cast<char*>("(ff)"), 148.0, 210.0));
-	PyDict_SetItemString(d, const_cast<char*>("PAPER_A9"), Py_BuildValue(const_cast<char*>("(ff)"), 105.0, 148.0));
-	PyDict_SetItemString(d, const_cast<char*>("PAPER_B0"), Py_BuildValue(const_cast<char*>("(ff)"), 2836.0, 4008.0));
-	PyDict_SetItemString(d, const_cast<char*>("PAPER_B1"), Py_BuildValue(const_cast<char*>("(ff)"), 2004.0, 2836.0));
-	PyDict_SetItemString(d, const_cast<char*>("PAPER_B2"), Py_BuildValue(const_cast<char*>("(ff)"), 1418.0, 2004.0));
-	PyDict_SetItemString(d, const_cast<char*>("PAPER_B3"), Py_BuildValue(const_cast<char*>("(ff)"), 1002.0, 1418.0));
-	PyDict_SetItemString(d, const_cast<char*>("PAPER_B4"), Py_BuildValue(const_cast<char*>("(ff)"), 709.0, 1002.0));
-	PyDict_SetItemString(d, const_cast<char*>("PAPER_B5"), Py_BuildValue(const_cast<char*>("(ff)"), 501.0, 709.0));
-	PyDict_SetItemString(d, const_cast<char*>("PAPER_B6"), Py_BuildValue(const_cast<char*>("(ff)"), 355.0, 501.0));
-	PyDict_SetItemString(d, const_cast<char*>("PAPER_B7"), Py_BuildValue(const_cast<char*>("(ff)"), 250.0, 355.0));
-	PyDict_SetItemString(d, const_cast<char*>("PAPER_B8"), Py_BuildValue(const_cast<char*>("(ff)"), 178.0, 250.0));
-	PyDict_SetItemString(d, const_cast<char*>("PAPER_B9"), Py_BuildValue(const_cast<char*>("(ff)"), 125.0, 178.0));
-	PyDict_SetItemString(d, const_cast<char*>("PAPER_B10"), Py_BuildValue(const_cast<char*>("(ff)"), 89.0, 125.0));
-	PyDict_SetItemString(d, const_cast<char*>("PAPER_C5E"), Py_BuildValue(const_cast<char*>("(ff)"), 462.0, 649.0));
-	PyDict_SetItemString(d, const_cast<char*>("PAPER_COMM10E"), Py_BuildValue(const_cast<char*>("(ff)"), 298.0, 683.0));
-	PyDict_SetItemString(d, const_cast<char*>("PAPER_DLE"),  Py_BuildValue(const_cast<char*>("(ff)"), 312.0, 624.0));
-	PyDict_SetItemString(d, const_cast<char*>("PAPER_EXECUTIVE"), Py_BuildValue(const_cast<char*>("(ff)"), 542.0, 720.0));
-	PyDict_SetItemString(d, const_cast<char*>("PAPER_FOLIO"), Py_BuildValue(const_cast<char*>("(ff)"), 595.0, 935.0));
-	PyDict_SetItemString(d, const_cast<char*>("PAPER_LEDGER"), Py_BuildValue(const_cast<char*>("(ff)"), 1224.0, 792.0));
-	PyDict_SetItemString(d, const_cast<char*>("PAPER_LEGAL"), Py_BuildValue(const_cast<char*>("(ff)"), 612.0, 1008.0));
-	PyDict_SetItemString(d, const_cast<char*>("PAPER_LETTER"), Py_BuildValue(const_cast<char*>("(ff)"), 612.0, 792.0));
-	PyDict_SetItemString(d, const_cast<char*>("PAPER_TABLOID"), Py_BuildValue(const_cast<char*>("(ff)"), 792.0, 1224.0));
-	PyDict_SetItemString(d, const_cast<char*>("NORMAL"), Py_BuildValue(const_cast<char*>("i"), 0));
-	PyDict_SetItemString(d, const_cast<char*>("DARKEN"), Py_BuildValue(const_cast<char*>("i"), 1));
-	PyDict_SetItemString(d, const_cast<char*>("LIGHTEN"), Py_BuildValue(const_cast<char*>("i"), 2));
-	PyDict_SetItemString(d, const_cast<char*>("MULTIPLY"), Py_BuildValue(const_cast<char*>("i"), 3));
-	PyDict_SetItemString(d, const_cast<char*>("SCREEN"), Py_BuildValue(const_cast<char*>("i"), 4));
-	PyDict_SetItemString(d, const_cast<char*>("OVERLAY"), Py_BuildValue(const_cast<char*>("i"), 5));
-	PyDict_SetItemString(d, const_cast<char*>("HARD_LIGHT"), Py_BuildValue(const_cast<char*>("i"), 6));
-	PyDict_SetItemString(d, const_cast<char*>("SOFT_LIGHT"), Py_BuildValue(const_cast<char*>("i"), 7));
-	PyDict_SetItemString(d, const_cast<char*>("DIFFERENCE"), Py_BuildValue(const_cast<char*>("i"), 8));
-	PyDict_SetItemString(d, const_cast<char*>("EXCLUSION"), Py_BuildValue(const_cast<char*>("i"), 9));
-	PyDict_SetItemString(d, const_cast<char*>("COLOR_DODGE"), Py_BuildValue(const_cast<char*>("i"), 10));
-	PyDict_SetItemString(d, const_cast<char*>("COLOR_BURN"), Py_BuildValue(const_cast<char*>("i"), 11));
-	PyDict_SetItemString(d, const_cast<char*>("HUE"), Py_BuildValue(const_cast<char*>("i"), 12));
-	PyDict_SetItemString(d, const_cast<char*>("SATURATION"), Py_BuildValue(const_cast<char*>("i"), 13));
-	PyDict_SetItemString(d, const_cast<char*>("COLOR"), Py_BuildValue(const_cast<char*>("i"), 14));
-	PyDict_SetItemString(d, const_cast<char*>("LUMINOSITY"), Py_BuildValue(const_cast<char*>("i"), 15));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("UNIT_POINTS")), PyInt_FromLong(unitIndexFromString("pt")));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("UNIT_MILLIMETERS")), PyInt_FromLong(unitIndexFromString("mm")));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("UNIT_INCHES")), PyInt_FromLong(unitIndexFromString("in")));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("UNIT_PICAS")), PyInt_FromLong(unitIndexFromString("p")));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("UNIT_CENTIMETRES")), PyInt_FromLong(unitIndexFromString("cm")));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("UNIT_CICERO")), PyInt_FromLong(unitIndexFromString("c")));
+        PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("UNIT_PT")), PyInt_FromLong(unitIndexFromString("pt")));
+        PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("UNIT_MM")), PyInt_FromLong(unitIndexFromString("mm")));
+        PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("UNIT_IN")), PyInt_FromLong(unitIndexFromString("in")));
+        PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("UNIT_P")), PyInt_FromLong(unitIndexFromString("p")));
+        PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("UNIT_CM")), PyInt_FromLong(unitIndexFromString("cm")));
+        PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("UNIT_C")), PyInt_FromLong(unitIndexFromString("c")));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("PORTRAIT")), Py_BuildValue(const_cast<char*>("i"), portraitPage));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("LANDSCAPE")), Py_BuildValue(const_cast<char*>("i"), landscapePage));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("NOFACINGPAGES")), Py_BuildValue(const_cast<char*>("i"), 0));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("FACINGPAGES")),  Py_BuildValue(const_cast<char*>("i"), 1));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("FIRSTPAGERIGHT")), Py_BuildValue(const_cast<char*>("i"), 1));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("FIRSTPAGELEFT")), Py_BuildValue(const_cast<char*>("i"), 0));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("ALIGN_LEFT")), Py_BuildValue(const_cast<char*>("i"), 0));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("ALIGN_RIGHT")), Py_BuildValue(const_cast<char*>("i"), 2));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("ALIGN_CENTERED")), Py_BuildValue(const_cast<char*>("i"), 1));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("ALIGN_BLOCK")), Py_BuildValue(const_cast<char*>("i"), 3));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("ALIGN_FORCED")), Py_BuildValue(const_cast<char*>("i"), 4));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("DIRECTION_LTR")), Py_BuildValue(const_cast<char*>("i"), 0));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("DIRECTION_RTL")), Py_BuildValue(const_cast<char*>("i"), 1));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("FILL_NOG")), Py_BuildValue(const_cast<char*>("i"), 0));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("FILL_HORIZONTALG")), Py_BuildValue(const_cast<char*>("i"), 1));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("FILL_VERTICALG")), Py_BuildValue(const_cast<char*>("i"), 2));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("FILL_DIAGONALG")), Py_BuildValue(const_cast<char*>("i"), 3));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("FILL_CROSSDIAGONALG")), Py_BuildValue(const_cast<char*>("i"), 4));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("FILL_RADIALG")), Py_BuildValue(const_cast<char*>("i"), 5));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("LINE_SOLID")), Py_BuildValue(const_cast<char*>("i"), Qt::SolidLine));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("LINE_DASH")), Py_BuildValue(const_cast<char*>("i"), Qt::DashLine));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("LINE_DOT")), Py_BuildValue(const_cast<char*>("i"), Qt::DotLine));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("LINE_DASHDOT")), Py_BuildValue(const_cast<char*>("i"), Qt::DashDotLine));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("LINE_DASHDOTDOT")), Py_BuildValue(const_cast<char*>("i"), Qt::DashDotDotLine));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("JOIN_MITTER")), Py_BuildValue(const_cast<char*>("i"), Qt::MiterJoin));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("JOIN_BEVEL")), Py_BuildValue(const_cast<char*>("i"), Qt::BevelJoin));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("JOIN_ROUND")), Py_BuildValue(const_cast<char*>("i"), Qt::RoundJoin));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("CAP_FLAT")), Py_BuildValue(const_cast<char*>("i"), Qt::FlatCap));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("CAP_SQUARE")), Py_BuildValue(const_cast<char*>("i"), Qt::SquareCap));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("CAP_ROUND")), Py_BuildValue(const_cast<char*>("i"), Qt::RoundCap));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("BUTTON_NONE")), Py_BuildValue(const_cast<char*>("i"), QMessageBox::NoButton));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("BUTTON_OK")), Py_BuildValue(const_cast<char*>("i"), QMessageBox::Ok));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("BUTTON_CANCEL")), Py_BuildValue(const_cast<char*>("i"), QMessageBox::Cancel));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("BUTTON_YES")), Py_BuildValue(const_cast<char*>("i"), QMessageBox::Yes));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("BUTTON_NO")), Py_BuildValue(const_cast<char*>("i"), QMessageBox::No));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("BUTTON_ABORT")), Py_BuildValue(const_cast<char*>("i"), QMessageBox::Abort));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("BUTTON_RETRY")), Py_BuildValue(const_cast<char*>("i"), QMessageBox::Retry));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("BUTTON_IGNORE")), Py_BuildValue(const_cast<char*>("i"), QMessageBox::Ignore));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("BUTTON_DEFAULT")), Py_BuildValue(const_cast<char*>("i"), QMessageBox::Default));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("ICON_NONE")), Py_BuildValue(const_cast<char*>("i"), QMessageBox::NoIcon));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("ICON_INFORMATION")), Py_BuildValue(const_cast<char*>("i"), QMessageBox::Information));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("ICON_WARNING")), Py_BuildValue(const_cast<char*>("i"), QMessageBox::Warning));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("ICON_CRITICAL")), Py_BuildValue(const_cast<char*>("i"), QMessageBox::Critical));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("PAPER_A0")), Py_BuildValue(const_cast<char*>("(ff)"), 2380.0, 3368.0));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("PAPER_A1")), Py_BuildValue(const_cast<char*>("(ff)"), 1684.0, 2380.0));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("PAPER_A2")), Py_BuildValue(const_cast<char*>("(ff)"), 1190.0, 1684.0));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("PAPER_A3")), Py_BuildValue(const_cast<char*>("(ff)"), 842.0, 1190.0));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("PAPER_A4")), Py_BuildValue(const_cast<char*>("(ff)"), 595.0, 842.0));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("PAPER_A5")), Py_BuildValue(const_cast<char*>("(ff)"), 421.0, 595.0));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("PAPER_A6")), Py_BuildValue(const_cast<char*>("(ff)"), 297.0, 421.0));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("PAPER_A7")), Py_BuildValue(const_cast<char*>("(ff)"), 210.0, 297.0));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("PAPER_A8")), Py_BuildValue(const_cast<char*>("(ff)"), 148.0, 210.0));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("PAPER_A9")), Py_BuildValue(const_cast<char*>("(ff)"), 105.0, 148.0));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("PAPER_B0")), Py_BuildValue(const_cast<char*>("(ff)"), 2836.0, 4008.0));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("PAPER_B1")), Py_BuildValue(const_cast<char*>("(ff)"), 2004.0, 2836.0));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("PAPER_B2")), Py_BuildValue(const_cast<char*>("(ff)"), 1418.0, 2004.0));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("PAPER_B3")), Py_BuildValue(const_cast<char*>("(ff)"), 1002.0, 1418.0));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("PAPER_B4")), Py_BuildValue(const_cast<char*>("(ff)"), 709.0, 1002.0));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("PAPER_B5")), Py_BuildValue(const_cast<char*>("(ff)"), 501.0, 709.0));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("PAPER_B6")), Py_BuildValue(const_cast<char*>("(ff)"), 355.0, 501.0));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("PAPER_B7")), Py_BuildValue(const_cast<char*>("(ff)"), 250.0, 355.0));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("PAPER_B8")), Py_BuildValue(const_cast<char*>("(ff)"), 178.0, 250.0));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("PAPER_B9")), Py_BuildValue(const_cast<char*>("(ff)"), 125.0, 178.0));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("PAPER_B10")), Py_BuildValue(const_cast<char*>("(ff)"), 89.0, 125.0));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("PAPER_C5E")), Py_BuildValue(const_cast<char*>("(ff)"), 462.0, 649.0));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("PAPER_COMM10E")), Py_BuildValue(const_cast<char*>("(ff)"), 298.0, 683.0));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("PAPER_DLE")),  Py_BuildValue(const_cast<char*>("(ff)"), 312.0, 624.0));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("PAPER_EXECUTIVE")), Py_BuildValue(const_cast<char*>("(ff)"), 542.0, 720.0));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("PAPER_FOLIO")), Py_BuildValue(const_cast<char*>("(ff)"), 595.0, 935.0));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("PAPER_LEDGER")), Py_BuildValue(const_cast<char*>("(ff)"), 1224.0, 792.0));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("PAPER_LEGAL")), Py_BuildValue(const_cast<char*>("(ff)"), 612.0, 1008.0));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("PAPER_LETTER")), Py_BuildValue(const_cast<char*>("(ff)"), 612.0, 792.0));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("PAPER_TABLOID")), Py_BuildValue(const_cast<char*>("(ff)"), 792.0, 1224.0));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("NORMAL")), Py_BuildValue(const_cast<char*>("i"), 0));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("DARKEN")), Py_BuildValue(const_cast<char*>("i"), 1));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("LIGHTEN")), Py_BuildValue(const_cast<char*>("i"), 2));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("MULTIPLY")), Py_BuildValue(const_cast<char*>("i"), 3));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("SCREEN")), Py_BuildValue(const_cast<char*>("i"), 4));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("OVERLAY")), Py_BuildValue(const_cast<char*>("i"), 5));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("HARD_LIGHT")), Py_BuildValue(const_cast<char*>("i"), 6));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("SOFT_LIGHT")), Py_BuildValue(const_cast<char*>("i"), 7));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("DIFFERENCE")), Py_BuildValue(const_cast<char*>("i"), 8));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("EXCLUSION")), Py_BuildValue(const_cast<char*>("i"), 9));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("COLOR_DODGE")), Py_BuildValue(const_cast<char*>("i"), 10));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("COLOR_BURN")), Py_BuildValue(const_cast<char*>("i"), 11));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("HUE")), Py_BuildValue(const_cast<char*>("i"), 12));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("SATURATION")), Py_BuildValue(const_cast<char*>("i"), 13));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("COLOR")), Py_BuildValue(const_cast<char*>("i"), 14));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("LUMINOSITY")), Py_BuildValue(const_cast<char*>("i"), 15));
 	// preset page layouts
-	PyDict_SetItemString(d, const_cast<char*>("PAGE_1"), Py_BuildValue(const_cast<char*>("i"), 0));
-	PyDict_SetItemString(d, const_cast<char*>("PAGE_2"), Py_BuildValue(const_cast<char*>("i"), 1));
-	PyDict_SetItemString(d, const_cast<char*>("PAGE_3"), Py_BuildValue(const_cast<char*>("i"), 2));
-	PyDict_SetItemString(d, const_cast<char*>("PAGE_4"), Py_BuildValue(const_cast<char*>("i"), 3));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("PAGE_1")), Py_BuildValue(const_cast<char*>("i"), 0));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("PAGE_2")), Py_BuildValue(const_cast<char*>("i"), 1));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("PAGE_3")), Py_BuildValue(const_cast<char*>("i"), 2));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("PAGE_4")), Py_BuildValue(const_cast<char*>("i"), 3));
 
 	// Measurement units understood by Scribus's units.cpp functions are exported as constant conversion
 	// factors to be used from Python.
 	for (int i = 0; i <= unitGetMaxIndex()-2; ++i)
 	{
@@ -751,13 +791,13 @@
 			return;
 		}
 		// `in' is a reserved word in Python so we must replace it
 		PyObject* name;
 		if (unitGetUntranslatedStrFromIndex(i) == "in")
-			name = PyString_FromString("inch");
+			name = PyUnicode_FromString("inch");
 		else
-			name = PyString_FromString(unitGetUntranslatedStrFromIndex(i).toLatin1().constData());
+			name = PyUnicode_FromString(unitGetUntranslatedStrFromIndex(i).toLatin1().constData());
 		if (!name)
 		{
 			initscribus_failed(__FILE__, __LINE__);
 			return;
 		}
@@ -767,11 +807,11 @@
 			return;
 		}
 	}
 
 	// Export the Scribus version into the module namespace so scripts know what they're running in
-	PyDict_SetItemString(d, const_cast<char*>("scribus_version"), PyString_FromString(const_cast<char*>(VERSION)));
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("scribus_version")), PyUnicode_FromString(const_cast<char*>(VERSION)));
 	// Now build a version tuple like that provided by Python in sys.version_info
 	// The tuple is of the form (major, minor, patchlevel, extraversion, reserved)
 	QRegExp version_re("(\\d+)\\.(\\d+)\\.(\\d+)(.*)");
 	int pos = version_re.indexIn(QString(VERSION));
 	// We ignore errors, causing the scribus_version_info attribute to simply not be created.
@@ -783,47 +823,52 @@
 		int patchVersion = version_re.cap(3).toInt();
 		QString extraVersion = version_re.cap(4);
 		PyObject* versionTuple = Py_BuildValue(const_cast<char*>("(iiisi)"),\
 				majorVersion, minorVersion, patchVersion, (const char*)extraVersion.toUtf8(), 0);
 		if (versionTuple != NULL)
-			PyDict_SetItemString(d, const_cast<char*>("scribus_version_info"), versionTuple);
+			PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("scribus_version_info")), versionTuple);
 		else
 			qDebug("Failed to build version tuple for version string '%s' in scripter", VERSION);
 	}
 	else
 		qDebug("Couldn't parse version string '%s' in scripter", VERSION);
 
 // 	ScMW = pl;
 	// Function aliases for compatibility
-	// We need to import the __builtins__, warnings and exceptions modules to be able to run
+	// We need to import the builtins, warnings and exceptions modules to be able to run
 	// the generated Python functions from inside the `scribus' module's context.
 	// This code makes it possible to extend the `scribus' module by running Python code
 	// from C in other ways too.
-	PyObject* builtinModule = PyImport_ImportModuleEx(const_cast<char*>("__builtin__"),
+	// JONAS: __builtin__ -> builtins (Python3)
+	PyObject* builtinModule = PyImport_ImportModuleEx(const_cast<char*>("builtins"),
 			d, d, Py_BuildValue(const_cast<char*>("[]")));
 	if (builtinModule == NULL)
 	{
-		qDebug("Failed to import __builtin__ module. Something is probably broken with your Python.");
+		qDebug("Failed to import builtins module. Something is probably broken with your Python.");
 		return;
 	}
-	PyDict_SetItemString(d, const_cast<char*>("__builtin__"), builtinModule);
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("builtins")), builtinModule);
+	
+	/* JONAS: "exceptions" has been merged into "builtins" in Python 3
 	PyObject* exceptionsModule = PyImport_ImportModuleEx(const_cast<char*>("exceptions"),
 			d, d, Py_BuildValue(const_cast<char*>("[]")));
 	if (exceptionsModule == NULL)
 	{
 		qDebug("Failed to import exceptions module. Something is probably broken with your Python.");
 		return;
 	}
-	PyDict_SetItemString(d, const_cast<char*>("exceptions"), exceptionsModule);
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("exceptions")), exceptionsModule);
+	*/
+	
 	PyObject* warningsModule = PyImport_ImportModuleEx(const_cast<char*>("warnings"),
 			d, d, Py_BuildValue(const_cast<char*>("[]")));
 	if (warningsModule == NULL)
 	{
 		qDebug("Failed to import warnings module. Something is probably broken with your Python.");
 		return;
 	}
-	PyDict_SetItemString(d, const_cast<char*>("warnings"), warningsModule);
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("warnings")), warningsModule);
 	// Create the module-level docstring. This can be a proper unicode string, unlike
 	// the others, because we can just create a Unicode object and insert it in our
 	// module dictionary.
 	QString docstring = QObject::tr("Scribus Python interface module\n\
 \n\
@@ -855,24 +900,26 @@
 Details of what exceptions each function may throw are provided on the\n\
 function's documentation, though as with most Python code this list\n\
 is not exhaustive due to exceptions from called functions.\n\
 ");
 
-	PyObject* docStr = PyString_FromString(docstring.toUtf8().data());
+	PyObject* docStr = PyUnicode_FromString(docstring.toUtf8().data());
 	if (!docStr)
 		qDebug("Failed to create module-level docstring (couldn't make str)");
 	else
 	{
-		PyObject* uniDocStr = PyUnicode_FromEncodedObject(docStr, "utf-8", NULL);
+		PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("__doc__")), docStr);
+		/*PyObject* uniDocStr = PyUnicode_FromEncodedObject(docStr, "utf-8", NULL);
 		Py_DECREF(docStr);
 		docStr = NULL;
 		if (!uniDocStr)
 			qDebug("Failed to create module-level docstring object (couldn't make unicode)");
 		else
-			PyDict_SetItemString(d, const_cast<char*>("__doc__"), uniDocStr);
+			PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("__doc__")), uniDocStr);
 		Py_DECREF(uniDocStr);
 		uniDocStr = NULL;
+		*/
 	}
 
 	// Wrap up pointers to the the QApp and main window and push them out
 	// to Python.
 	wrappedQApp = wrapQObject(qApp);
@@ -880,24 +927,26 @@
 	{
 		qDebug("Failed to wrap up QApp");
 		PyErr_Print();
 	}
 	// Push it into the module dict, stealing a ref in the process
-	PyDict_SetItemString(d, const_cast<char*>("qApp"), wrappedQApp);
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("qApp")), wrappedQApp);
 	Py_DECREF(wrappedQApp);
 	wrappedQApp = NULL;
 
 	wrappedMainWindow = wrapQObject(pl);
 	if (!wrappedMainWindow)
 	{
 		qDebug("Failed to wrap up ScMW");
 		PyErr_Print();
 	}
 	// Push it into the module dict, stealing a ref in the process
-	PyDict_SetItemString(d, const_cast<char*>("mainWindow"), wrappedMainWindow);
+	PyDict_SetItem(d, PyUnicode_FromString(const_cast<char*>("mainWindow")), wrappedMainWindow);
 	Py_DECREF(wrappedMainWindow);
 	wrappedMainWindow = NULL;
+	
+	return;
 }
 
 /*! HACK: this removes "warning: 'blah' defined but not used" compiler warnings
 with header files structure untouched (docstrings are kept near declarations)
 PV */
