Index: doc/en/scripterapi-textframes.html
===================================================================
--- doc/en/scripterapi-textframes.html	(revision 25096)
+++ doc/en/scripterapi-textframes.html	(working copy)
@@ -133,8 +133,8 @@
 <p>Relayout the whole text chain whom the text frame "name" belongs. If "name" is not given the currently selected item is used.</p></dd>
 
 <dt><a name="-linkTextFrames"><strong>linkTextFrames</strong></a>(...)</dt>
-<dd><code>linkTextFrames("fromname", "toname")</code>
-<p>Link two text frames. The frame named "fromname" is linked to the frame named "toname". The target frame must be an empty text frame and must not link to or be linked from any other frames already.</p>
+<dd><code>linkTextFrames("fromname", "toname", [force])</code>
+<p>Link two text frames. The frame named "fromname" is linked to the frame named "toname". If "force" is omitted or set to zero then the target frame must be an empty text frame and must not link to or be linked from any other frames already.</p>
 <p>May throw <a href="#ScribusException">ScribusException</a> if linking rules are violated.</p></dd>
 
 <dt><a name="-selectFrameText"><strong>selectFrameText</strong></a>(...)</dt>
Index: scribus/plugins/scriptplugin/cmdtext.cpp
===================================================================
--- scribus/plugins/scriptplugin/cmdtext.cpp	(revision 25096)
+++ scribus/plugins/scriptplugin/cmdtext.cpp	(working copy)
@@ -1281,8 +1281,9 @@
 {
 	char *name1;
 	char *name2;
+        bool force
 
-	if (!PyArg_ParseTuple(args, "eses", "utf-8", &name1, "utf-8", &name2))
+	if (!PyArg_ParseTuple(args, "eses|b", "utf-8", &name1, "utf-8", &name2, &force))
 		return nullptr;
 	if (!checkHaveDocument())
 		return nullptr;
@@ -1297,15 +1298,18 @@
 		PyErr_SetString(WrongFrameTypeError, QObject::tr("Can only link text frames.","python error").toLocal8Bit().constData());
 		return nullptr;
 	}
-/*	if (toitem->itemText.length() > 0)
-	{
-		PyErr_SetString(ScribusException, QObject::tr("Target frame must be empty.","python error").toLocal8Bit().constData());
-		return nullptr;
-	}*/
-	if (toitem->nextInChain() != nullptr)
-	{
-		PyErr_SetString(ScribusException, QObject::tr("Target frame links to another frame.","python error").toLocal8Bit().constData());
-		return nullptr;
+        if (!force)
+        {
+		if (toitem->itemText.length() > 0)
+		{
+			PyErr_SetString(ScribusException, QObject::tr("Target frame must be empty.","python error").toLocal8Bit().constData());
+			return nullptr;
+		}
+		if (toitem->nextInChain() != nullptr)
+		{
+			PyErr_SetString(ScribusException, QObject::tr("Target frame links to another frame.","python error").toLocal8Bit().constData());
+			return nullptr;
+		}
 	}
 	if (toitem->prevInChain() != nullptr)
 	{
