diff --git a/scribus/plugins/scriptplugin/cmdtext.cpp b/scribus/plugins/scriptplugin/cmdtext.cpp
index fff491b..811d24a 100644
--- a/scribus/plugins/scriptplugin/cmdtext.cpp
+++ b/scribus/plugins/scriptplugin/cmdtext.cpp
@@ -241,6 +241,40 @@ PyObject *scribus_gettext(PyObject* /* self */, PyObject* args)
 	return PyString_FromString(text.toUtf8());
 }
 
+PyObject *scribus_setboxtextpreservestyle(PyObject* /* self */, PyObject* args)
+{
+	char *Name = const_cast<char*>("");
+	char *Text;
+	if (!PyArg_ParseTuple(args, "es|es", "utf-8", &Text, "utf-8", &Name))
+		return NULL;
+	if(!checkHaveDocument())
+		return NULL;
+	PageItem *currItem = GetUniqueItem(QString::fromUtf8(Name));
+	if (currItem == NULL)
+		return NULL;
+	if (!(currItem->asTextFrame()) && !(currItem->asPathText()))
+	{
+		PyErr_SetString(WrongFrameTypeError, QObject::tr("Cannot set text of non-text frame.","python error").toLocal8Bit().constData());
+		return NULL;
+	}
+	QString Daten = QString::fromUtf8(Text);
+	Daten.replace("\r\n", SpecialChars::PARSEP);
+	Daten.replace(QChar('\n') , SpecialChars::PARSEP);
+	PyMem_Free(Text);
+	currItem->itemText.clearpreservestyle();
+	currItem->oldCPos = 0;
+	for (int a = 0; a < ScCore->primaryMainWindow()->doc->FrameItems.count(); ++a)
+	{
+		ScCore->primaryMainWindow()->doc->FrameItems.at(a)->ItemNr = a;
+	}
+	currItem->itemText.insertChars(0, Daten);
+	currItem->invalidateLayout();
+	currItem->Dirty = false;
+	//      Py_INCREF(Py_None);
+	//      return Py_None;
+	Py_RETURN_NONE;
+}
+
 PyObject *scribus_setboxtext(PyObject* /* self */, PyObject* args)
 {
 	char *Name = const_cast<char*>("");
@@ -1105,5 +1139,6 @@ void cmdtextdocwarnings()
 	  << scribus_setpdfbookmark__doc__ << scribus_ispdfbookmark__doc__
 	  << scribus_hyphenatetext__doc__ << scribus_dehyphenatetext__doc__
 	  << scribus_gettextdistances__doc__ << scribus_settextdistances__doc__
-	  << scribus_settextscalingh__doc__ << scribus_settextscalingv__doc__;
+	  << scribus_settextscalingh__doc__ << scribus_settextscalingv__doc__
+	  << scribus_setboxtextpreservestyle__doc__;
 }
diff --git a/scribus/plugins/scriptplugin/cmdtext.h b/scribus/plugins/scriptplugin/cmdtext.h
index 1a9a142..956c063 100644
--- a/scribus/plugins/scriptplugin/cmdtext.h
+++ b/scribus/plugins/scriptplugin/cmdtext.h
@@ -134,6 +134,18 @@ used.\n\
 PyObject *scribus_setboxtext(PyObject * /*self*/, PyObject* args);
 
 /*! docstring */
+PyDoc_STRVAR(scribus_setboxtextpreservestyle__doc__,
+QT_TR_NOOP("setTextPreserveStyle(\"text\", [\"name\"])\n\
+\n\
+Sets the text of the text frame \"name\" to the text of the string \"text\".\n\
+Text must be UTF8 encoded - use e.g. unicode(text, 'iso-8859-2'). See the FAQ\n\
+for more details. Style is preserved. If \"name\" is not given the currently \n\
+selected item is used.\n\
+"));
+/*! Set text */
+PyObject *scribus_setboxtextpreservestyle(PyObject* /* self */, PyObject* args);
+
+/*! docstring */
 PyDoc_STRVAR(scribus_inserttext__doc__,
 QT_TR_NOOP("insertText(\"text\", pos, [\"name\"])\n\
 \n\
diff --git a/scribus/plugins/scriptplugin/scriptplugin.cpp b/scribus/plugins/scriptplugin/scriptplugin.cpp
index c4233f5..98cc3e9 100644
--- a/scribus/plugins/scriptplugin/scriptplugin.cpp
+++ b/scribus/plugins/scriptplugin/scriptplugin.cpp
@@ -465,6 +465,7 @@ PyMethodDef scribus_methods[] = {
 	{const_cast<char*>("setTextAlignment"), scribus_setalign, METH_VARARGS, tr(scribus_setalign__doc__)},
 	{const_cast<char*>("setTextColor"), scribus_settextfill, METH_VARARGS, tr(scribus_settextfill__doc__)},
 	{const_cast<char*>("setText"), scribus_setboxtext, METH_VARARGS, tr(scribus_setboxtext__doc__)},
+	{const_cast<char*>("setTextPreserveStyle"), scribus_setboxtextpreservestyle, METH_VARARGS, tr(scribus_setboxtextpreservestyle__doc__)},
 	{const_cast<char*>("setTextScalingH"), scribus_settextscalingh, METH_VARARGS, tr(scribus_settextscalingh__doc__)},
 	{const_cast<char*>("setTextScalingV"), scribus_settextscalingv, METH_VARARGS, tr(scribus_settextscalingv__doc__)},
 	{const_cast<char*>("setTextShade"), scribus_settextshade, METH_VARARGS, tr(scribus_settextshade__doc__)},
diff --git a/scribus/text/storytext.cpp b/scribus/text/storytext.cpp
index 3097850..d32d7d0 100644
--- a/scribus/text/storytext.cpp
+++ b/scribus/text/storytext.cpp
@@ -201,6 +201,19 @@ void StoryText::clear()
 	invalidateAll();
 }
 
+void StoryText::clearpreservestyle()
+{
+	selFirst = 0;
+	selLast = -1;
+
+	firstFrameItem = 0;
+	lastFrameItem = -1;
+
+	d->clear();
+	d->len = 0;
+	invalidateAll();
+}
+
 void StoryText::insert(const StoryText& other, bool onlySelection)
 {
 	insert(d->cursorPosition, other, onlySelection);
diff --git a/scribus/text/storytext.h b/scribus/text/storytext.h
index f218f44..89247d1 100644
--- a/scribus/text/storytext.h
+++ b/scribus/text/storytext.h
@@ -108,6 +108,8 @@ class SCRIBUS_API StoryText : public QObject, public SaxIO
 	int  normalizedCursorPosition();
 
  	void clear();
+	void clearpreservestyle();
+
 	StoryText copy() const;
 	// Insert chars from another StoryText object at current cursor position
 	void insert(const StoryText& other, bool onlySelection = false);
