Index: scribus/actionmanager.cpp
===================================================================
--- scribus/actionmanager.cpp	(Revision 26313)
+++ scribus/actionmanager.cpp	(Arbeitskopie)
@@ -679,6 +679,8 @@
 	scrActions->insert(name, new ScrAction("16/editdoc.png", "16/editdoc.png", "", defaultKey(name), mainWindow));
 	name = "viewToggleCMS";
 	scrActions->insert(name, new ScrAction("cmsOn.png", "cmsOn.png", "", defaultKey(name), mainWindow));
+	name = "viewToggleWhiteSpaceMode";
+	scrActions->insert(name, new ScrAction("16/format-justify-left.png", "16/format-justify-left.png", "", defaultKey(name), mainWindow));
 	name = "viewShowMargins";
 	scrActions->insert(name, new ScrAction("", defaultKey(name), mainWindow));
 	name = "viewShowBleeds";
@@ -729,6 +731,7 @@
 	(*scrActions)["viewPreviewMode"]->setToggleAction(true);
 	(*scrActions)["viewEditInPreview"]->setToggleAction(true);
 	(*scrActions)["viewToggleCMS"]->setToggleAction(true);
+	(*scrActions)["viewToggleWhiteSpaceMode"]->setToggleAction(true);
 	(*scrActions)["viewShowMargins"]->setToggleAction(true);
 	(*scrActions)["viewShowBleeds"]->setToggleAction(true);
 	(*scrActions)["viewShowFrames"]->setToggleAction(true);
@@ -749,6 +752,7 @@
 
 	(*scrActions)["viewPreviewMode"]->setChecked(false);
 	(*scrActions)["viewEditInPreview"]->setChecked(false);
+	(*scrActions)["viewToggleWhiteSpaceMode"]->setChecked(false);
 	(*scrActions)["viewToggleCMS"]->setChecked(false);
 	(*scrActions)["viewShowMargins"]->setChecked(true);
 	(*scrActions)["viewShowBleeds"]->setChecked(true);
@@ -1305,6 +1309,7 @@
 	//qDebug()<<"disconnectNewViewActions"<<mainWindow->doc->DocName;
 	(*scrActions)["viewPreviewMode"]->disconnect();
 	(*scrActions)["viewEditInPreview"]->disconnect();
+	(*scrActions)["viewToggleWhiteSpaceMode"]->disconnect();
 	(*scrActions)["viewToggleCMS"]->disconnect();
 	(*scrActions)["toolsZoomIn"]->disconnect();
 	(*scrActions)["toolsZoomOut"]->disconnect();
@@ -1329,6 +1334,7 @@
 	//qDebug()<<"connectNewViewActions"<<currView->Doc->DocName;
 	connect( (*scrActions)["viewPreviewMode"], SIGNAL(toggled(bool)), currView, SLOT(togglePreview(bool)) );
 	connect( (*scrActions)["viewEditInPreview"], SIGNAL(toggled(bool)), currView, SLOT(togglePreviewEdit(bool)) );
+	connect( (*scrActions)["viewToggleWhiteSpaceMode"], SIGNAL(toggled(bool)), currView, SLOT(toggleWhiteSpaceMode(bool)) );
 	connect( (*scrActions)["viewToggleCMS"], SIGNAL(toggled(bool)), currView, SLOT(toggleCMS(bool)));
 	connect( (*scrActions)["toolsZoomIn"], SIGNAL(triggered()) , currView, SLOT(slotZoomIn()) );
 	connect( (*scrActions)["toolsZoomOut"], SIGNAL(triggered()) , currView, SLOT(slotZoomOut()) );
@@ -1666,6 +1672,7 @@
 	(*scrActions)["viewFit400"]->setTexts( tr("&400%"));
 	(*scrActions)["viewPreviewMode"]->setTexts( tr("Preview Mode"));
 	(*scrActions)["viewEditInPreview"]->setTexts( tr("Edit in Preview Mode") );
+	(*scrActions)["viewToggleWhiteSpaceMode"]->setTexts( tr("Toggle White Space Review Mode") );
 	(*scrActions)["viewToggleCMS"]->setTexts( tr("Toggle Color Management System"));
 	(*scrActions)["viewShowMargins"]->setTexts( tr("Show &Margins"));
 	(*scrActions)["viewShowBleeds"]->setTexts( tr("Show Bleeds"));
@@ -1822,6 +1829,7 @@
 	(*scrActions)["toolsZoom"]->setStatusTextAndShortcut( tr("Zoom in or out"));
 	(*scrActions)["viewPreviewMode"]->setStatusTextAndShortcut( tr("Enable preview mode"));
 	(*scrActions)["viewEditInPreview"]->setStatusTextAndShortcut( tr("Enable editing in preview mode"));
+	(*scrActions)["viewToggleWhiteSpaceMode"]->setStatusTextAndShortcut( tr("Toggle white space review mode"));
 	(*scrActions)["viewToggleCMS"]->setStatusTextAndShortcut( tr("Toggle color management system"));
 #ifdef HAVE_OSG
 	(*scrActions)["toolsPDFAnnot3D"]->setStatusTextAndShortcut( tr("Insert 3D annotation"));
@@ -2327,6 +2335,7 @@
 		<< "viewPreviewMode"
 		<< "viewEditInPreview"
 		<< "viewToggleCMS"
+		<< "viewToggleWhiteSpaceMode"
 		<< "viewShowMargins"
 		<< "viewShowBleeds"
 		<< "viewShowFrames"
Index: scribus/scribus.cpp
===================================================================
--- scribus/scribus.cpp	(Revision 26313)
+++ scribus/scribus.cpp	(Arbeitskopie)
@@ -1241,6 +1241,7 @@
 	scrMenuMgr->createMenu("ViewPreview", tr("Preview"), "View");
 	scrMenuMgr->addMenuItemString("ViewPreview", "View");
 	scrMenuMgr->addMenuItemString("viewPreviewMode", "ViewPreview");
+	scrMenuMgr->addMenuItemString("viewToggleWhiteSpaceMode", "ViewPreview");
 	scrMenuMgr->createMenu("ViewMeasuring", tr("Measurement"), "View");
 	scrMenuMgr->addMenuItemString("ViewMeasuring", "View");
 	scrMenuMgr->addMenuItemString("viewShowRulers", "ViewMeasuring");
@@ -2458,6 +2459,9 @@
 		scrActions["viewToggleCMS"]->blockSignals(true);
 		scrActions["viewToggleCMS"]->setChecked(doc->HasCMS);
 		scrActions["viewToggleCMS"]->blockSignals(false);
+		scrActions["viewToggleWhiteSpaceMode"]->blockSignals(true);
+		scrActions["viewToggleWhiteSpaceMode"]->setChecked(doc->toggleWhiteSpaceMode);
+		scrActions["viewToggleWhiteSpaceMode"]->blockSignals(false);
 		viewToolBar->previewQualitySwitcher->setCurrentIndex(doc->previewQuality());
 		connect(viewToolBar->previewQualitySwitcher, SIGNAL(activated(int)), this, SLOT(changePreviewQuality(int)));
 		viewToolBar->visualMenu->setCurrentIndex(doc->previewVisual);
@@ -3704,6 +3708,7 @@
 		emit UpdateRequest(reqNumUpdate);
 		doc->setCurrentPage(doc->DocPages.at(0));
 		scrActions["viewToggleCMS"]->setChecked(doc->HasCMS);
+		scrActions["viewToggleWhiteSpaceMode"]->setChecked(doc->toggleWhiteSpaceMode);
 		view->zoom();
 		view->GotoPage(0);
 		connect(mdiArea, SIGNAL(subWindowActivated(QMdiSubWindow*)), this, SLOT(newActWin(QMdiSubWindow*)));
@@ -4251,6 +4256,7 @@
 	mainWindowYPosDataLabel->clear();
 	//not running view's togglePreview as we don't want to affect the doc settings.
 	scrActions["viewPreviewMode"]->setChecked(false);
+	scrActions["viewToggleWhiteSpaceMode"]->setChecked(false);
 	appModeHelper->setPreviewMode(false);
 	return true;
 }
@@ -6646,6 +6652,7 @@
 	scrActions["extrasGenerateTableOfContents"]->setEnabled(doc->hasTOCSetup());
 	scrActions["extrasUpdateDocument"]->setEnabled(true);
 	scrActions["viewToggleCMS"]->setChecked(doc->HasCMS);
+	scrActions["viewToggleWhiteSpaceMode"]->setChecked(doc->toggleWhiteSpaceMode);
 	view->setRulersShown(doc->guidesPrefs().rulersShown);
 	//doc emits changed() via this
 	doc->setMasterPageMode(true);
@@ -7589,6 +7596,11 @@
 		view->togglePreview(false);
 		scrActions["viewPreviewMode"]->setChecked(false);
 	}
+	if (doc->toggleWhiteSpaceMode)
+	{
+		view->toggleWhiteSpaceMode(false);
+		scrActions["viewToggleWhiteSpaceMode"]->setChecked(false);
+	}
 	m_WasAutoSave = doc->autoSave();
 	if (m_WasAutoSave)
 	{
Index: scribus/scribusdoc.h
===================================================================
--- scribus/scribusdoc.h	(Revision 26313)
+++ scribus/scribusdoc.h	(Arbeitskopie)
@@ -1461,7 +1461,8 @@
 	QWidget* WinHan {nullptr};
 	bool DoDrawing {true};
 	bool drawAsPreview {false};
-	bool viewAsPreview {false};
+	bool viewAsPreview {false};	
+	bool toggleWhiteSpaceMode {false};
 	bool editOnPreview {false};
 	int previewVisual {0};
 	struct OpenNodesList
Index: scribus/scribusview.cpp
===================================================================
--- scribus/scribusview.cpp	(Revision 26313)
+++ scribus/scribusview.cpp	(Arbeitskopie)
@@ -272,6 +272,12 @@
 	DrawNew();
 }
 
+void ScribusView::toggleWhiteSpaceMode(bool inReview)
+{
+	m_doc->toggleWhiteSpaceMode = inReview;
+	DrawNew();
+}
+
 void ScribusView::togglePreview(bool inPreview)
 {
 	this->requestMode(modeNormal);
Index: scribus/scribusview.h
===================================================================
--- scribus/scribusview.h	(Revision 26313)
+++ scribus/scribusview.h	(Arbeitskopie)
@@ -252,6 +252,7 @@
 	void toggleCMS(bool cmsOn);
 	void switchPreviewVisual(int vis);
 	void togglePreviewEdit(bool edit);
+	void toggleWhiteSpaceMode(bool inReview);
 	void togglePreview(bool inPreview);
 	void unitChange();
 	void setRulersShown(bool isShown);
Index: scribus/text/boxes.cpp
===================================================================
--- scribus/text/boxes.cpp	(Revision 26313)
+++ scribus/text/boxes.cpp	(Arbeitskopie)
@@ -598,6 +598,19 @@
 	p->setFont(font);
 	p->setFontSize(fontSize);
 
+	if (p->glyphBoxRendering())
+	{
+		if (!this->m_glyphRun.isSpace())
+		{
+			p->setFillColor(TextLayoutColor("Black", 100.0));
+			p->setStrokeColor(TextLayoutColor(CommonStrings::None, 0));
+			QRectF rect(x(), -ascent(), width(), height());
+			p->drawRect(rect);
+		}
+		p->restore();
+		return;
+	}
+
 	p->translate(x() + m_glyphRun.xoffset, y() + m_glyphRun.yoffset);
 
 	p->setMatrix(m_matrix);
Index: scribus/text/textlayoutpainter.cpp
===================================================================
--- scribus/text/textlayoutpainter.cpp	(Revision 26313)
+++ scribus/text/textlayoutpainter.cpp	(Arbeitskopie)
@@ -66,6 +66,16 @@
 	return m_stack.top().strokeWidth;
 }
 
+void TextLayoutPainter::setGlyphBoxRendering(bool r)
+{
+	m_glyphBoxRendering = r;
+}
+
+bool TextLayoutPainter::glyphBoxRendering()
+{
+	return m_glyphBoxRendering;
+}
+
 void TextLayoutPainter::translate(double x, double y)
 {
 	m_stack.top().x += x;
Index: scribus/text/textlayoutpainter.h
===================================================================
--- scribus/text/textlayoutpainter.h	(Revision 26313)
+++ scribus/text/textlayoutpainter.h	(Arbeitskopie)
@@ -81,6 +81,11 @@
 	/// The current width for line strokes.
 	virtual double strokeWidth() const;
 
+	/// Sets the current render mode for glyph boxes only.
+	virtual void setGlyphBoxRendering(bool r);
+	/// The current render mode for glyph boxes only.
+	virtual bool glyphBoxRendering();
+
 	/// Moves the current x and y positions by the specified amount.
 	virtual void translate(double x, double y);
 	/// The current x positions.
@@ -159,6 +164,7 @@
 	};
 
 	std::stack<State> m_stack;
+	bool m_glyphBoxRendering {false};
 };
 
 #endif // TEXTLAYOUTPAINTER_H


