diff --git a/scribus/CMakeLists_Sources.txt b/scribus/CMakeLists_Sources.txt
index fc6a01fd6..8a71d0a99 100644
--- a/scribus/CMakeLists_Sources.txt
+++ b/scribus/CMakeLists_Sources.txt
@@ -565,6 +565,7 @@ set(SCRIBUS_SOURCES
 	ui/delegates/sclistitemdelegate.cpp
 	ui/docks/dock_centralwidget.cpp
 	ui/docks/dock_panelbase.cpp
+	ui/factories/scribusproxystyle.cpp
 	ui/widgets/color_button.cpp
 	ui/widgets/combo_blendmode.cpp
 	ui/widgets/combo_linestyle.cpp
diff --git a/scribus/scribus.cpp b/scribus/scribus.cpp
index 668cba769..b035421ba 100644
--- a/scribus/scribus.cpp
+++ b/scribus/scribus.cpp
@@ -239,6 +239,7 @@ for which a new license (GPL+exception) is in place.
 #include "ui/tabmanager.h"
 #include "ui/transformdialog.h"
 #include "ui/viewtoolbar.h"
+#include "ui/factories/scribusproxystyle.h"
 #include "undogui.h"
 #include "undomanager.h"
 #include "undostate.h"
@@ -6476,7 +6477,6 @@ void ScribusMainWindow::slotPrefsOrg()
 	LocaleManager::instance().setUserPreferredLocale(m_prefsManager.appPrefs.uiPrefs.userPreferredLocale);
 	ScQApp->setLocale();
 
-	bool forceStyleUpdate = false;
 	bool useDefaultScratchColor = false;
 	if (m_prefsManager.appPrefs.displayPrefs.scratchColor == QApplication::palette().color(QPalette::Active, QPalette::Window))
 		useDefaultScratchColor = true;
@@ -6485,37 +6485,18 @@ void ScribusMainWindow::slotPrefsOrg()
 	QString newUIStylePalette = m_prefsManager.appPrefs.uiPrefs.stylePalette;
 	if (oldPrefs.uiPrefs.stylePalette != newUIStylePalette)
 	{
-		forceStyleUpdate = true;
-
 		if (newUIStylePalette == "dark")
-		{
-			QApplication::styleHints()->setColorScheme(Qt::ColorScheme::Dark);
-#if (defined Q_OS_LINUX)
-			QPalette pal(QColor(49, 49, 49));
-			QApplication::setPalette(pal);
-#endif
-		}
+			ScribusProxyStyle::instance()->setApplicationTheme(ScribusProxyStyle::ApplicationTheme::Dark);
 		else if (newUIStylePalette == "light")
-		{
-			QApplication::styleHints()->setColorScheme(Qt::ColorScheme::Light);
-#if (defined Q_OS_LINUX)
-			QPalette pal(QColor(239, 239, 239));
-			QApplication::setPalette(pal);
-#endif
-		}
+			ScribusProxyStyle::instance()->setApplicationTheme(ScribusProxyStyle::ApplicationTheme::Light);
 		else
-		{
-			QApplication::styleHints()->unsetColorScheme();
-#if (defined Q_OS_LINUX)
-			QApplication::setPalette(this->style()->standardPalette());
-#endif
-	}
+			ScribusProxyStyle::instance()->setApplicationTheme(ScribusProxyStyle::ApplicationTheme::System);
 	}
 #endif
 
 	bool forceIconUpdate = false;
 	QString newUIStyle = m_prefsManager.guiStyle();
-	if (oldPrefs.uiPrefs.style != newUIStyle || forceStyleUpdate == true)
+	if (oldPrefs.uiPrefs.style != newUIStyle)
 	{
 		forceIconUpdate = true;
 
@@ -6523,11 +6504,12 @@ void ScribusMainWindow::slotPrefsOrg()
 		if (!newUIStyle.isEmpty())
 			styleName = newUIStyle;
 
-		QStyle * newStyle = QStyleFactory::create(styleName);
-		if (newStyle)
-			QApplication::setStyle(newStyle);
-		else
-			m_prefsManager.appPrefs.uiPrefs.style = oldPrefs.uiPrefs.style;
+		ScribusProxyStyle::instance()->setBaseStyleName(styleName);
+		// QStyle * newStyle = QStyleFactory::create(styleName);
+		// if (newStyle)
+		// 	QApplication::setStyle(newStyle);
+		// else
+		// 	m_prefsManager.appPrefs.uiPrefs.style = oldPrefs.uiPrefs.style;
 	}
 
 	if (useDefaultScratchColor)
diff --git a/scribus/scribusapp.cpp b/scribus/scribusapp.cpp
index c3ad69308..3572ca13c 100644
--- a/scribus/scribusapp.cpp
+++ b/scribus/scribusapp.cpp
@@ -693,23 +693,32 @@ void ScribusQApp::downloadComplete(const QString &t)
 
 bool ScribusQApp::event(QEvent *event)
 {
-	switch (event->type()) 
+	switch (event->type())
 	{
 	case QEvent::FileOpen:
+	{
+		QString filename = static_cast<QFileOpenEvent*>(event)->file();
+		if (m_ScCore && m_ScCore->initialized())
 		{
-			QString filename = static_cast<QFileOpenEvent*>(event)->file();
-			if(m_ScCore && m_ScCore->initialized())
-			{
-				ScribusMainWindow* mw = m_ScCore->primaryMainWindow();
-				mw->loadDoc(filename);
-			}
-			else
-			{
-				m_filesToLoad.append(filename);
-			}
-			return true;
+			ScribusMainWindow* mw = m_ScCore->primaryMainWindow();
+			mw->loadDoc(filename);
 		}
+		else
+		{
+			m_filesToLoad.append(filename);
+		}
+		return true;
+	}
+	case QEvent::ApplicationPaletteChange:
+	{
+		IconManager& im = IconManager::instance();
+		im.rebuildCache();
+		emit iconSetChanged();
+	}
+		break;
 	default:
-		return QApplication::event(event);
+		break;
 	}
+
+	return QApplication::event(event);
 }
diff --git a/scribus/scribuscore.cpp b/scribus/scribuscore.cpp
index 64e06f95e..7c275438a 100644
--- a/scribus/scribuscore.cpp
+++ b/scribus/scribuscore.cpp
@@ -45,6 +45,7 @@ for which a new license (GPL+exception) is in place.
 #include "scribus.h"
 #include "scribusapp.h"
 #include "ui/splash.h"
+#include "ui/factories/scribusproxystyle.h"
 #include "undomanager.h"
 #include "util_debug.h"
 #include "util_ghostscript.h"
@@ -179,45 +180,40 @@ int ScribusCore::initScribusCore(bool showSplash, bool showFontInfo, bool showPr
 	// This is a very basic implemenation of the UI theme palette.
 	// If necessary implement platform specific theme configurations here.
 
+	// Configure GUI
+	const QString& prefsUiStyle = m_prefsManager.appPrefs.uiPrefs.style;
+	QString qtStyle = nullptr;
+	if (prefsUiStyle.length() > 0)
+	{
+		QStringList availableStyles = QStyleFactory::keys();
+		if (availableStyles.contains(prefsUiStyle))
+			qtStyle = prefsUiStyle;
+		else
+			m_prefsManager.appPrefs.uiPrefs.style.clear();
+	}
+
+	ScribusProxyStyle* scStyle = new ScribusProxyStyle(qtStyle);
+	scStyle->setParent(qApp);
+
 	// Apply different palette only if the system UI palette is different.
 #if (QT_VERSION >= QT_VERSION_CHECK(6, 8, 0))
 	if (m_prefsManager.appPrefs.uiPrefs.stylePalette == "dark" && QApplication::styleHints()->colorScheme() == Qt::ColorScheme::Light)
 	{
-		QApplication::styleHints()->setColorScheme(Qt::ColorScheme::Dark);
-
-	// https://bugreports.qt.io/browse/QTBUG-132929
-#if (defined Q_OS_LINUX)
-		QPalette pal(QColor(49, 49, 49));
-		QApplication::setPalette(pal);
-#endif
+		scStyle->setApplicationTheme(ScribusProxyStyle::ApplicationTheme::Dark);
 		m_SplashScreen->setPixmap(m_iconManager.splashScreen());
 	}
 	else if (m_prefsManager.appPrefs.uiPrefs.stylePalette == "light" && QApplication::styleHints()->colorScheme() == Qt::ColorScheme::Dark)
 	{
-		QApplication::styleHints()->setColorScheme(Qt::ColorScheme::Light);
-
-	// https://bugreports.qt.io/browse/QTBUG-132929
-#if (defined Q_OS_LINUX)
-		QPalette pal(QColor(239, 239, 239));
-		QApplication::setPalette(pal);
-#endif
+		scStyle->setApplicationTheme(ScribusProxyStyle::ApplicationTheme::Light);
 		m_SplashScreen->setPixmap(m_iconManager.splashScreen());
 	}
+	else
+		scStyle->setApplicationTheme(ScribusProxyStyle::ApplicationTheme::System);
 #endif
 
-	// Configure GUI
-	const QString& prefsUiStyle = m_prefsManager.appPrefs.uiPrefs.style;
-	if (prefsUiStyle.length() > 0)
-	{
-		QStyle* qtStyle = nullptr;
-		QStringList availableStyles = QStyleFactory::keys();
-		if (availableStyles.contains(prefsUiStyle))
-			qtStyle = QStyleFactory::create(prefsUiStyle);
-		if (qtStyle)
-			QApplication::setStyle(qtStyle);
-		else
-			m_prefsManager.appPrefs.uiPrefs.style.clear();
-	}
+	qApp->setStyle(scStyle);
+	qApp->installEventFilter(scStyle);
+
 	QFont apf = QApplication::font();
 	apf.setPointSize(m_prefsManager.appPrefs.uiPrefs.applicationFontSize);
 	QApplication::setFont(apf);
diff --git a/scribus/ui/autoformbuttongroup.cpp b/scribus/ui/autoformbuttongroup.cpp
index 9cf90054d..03eaba138 100644
--- a/scribus/ui/autoformbuttongroup.cpp
+++ b/scribus/ui/autoformbuttongroup.cpp
@@ -759,9 +759,10 @@ QPixmap AutoformButtonGroup::getIconPixmap(int nr, int pixmapSize)
 //	painter->end();
 //	delete painter;
 
+
 	QPainter *painter = new QPainter(&Ico);
-	painter->setBrush( palette().color(QPalette::WindowText) );
-	painter->setPen( QPen(palette().color(QPalette::Midlight), 1.0, Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin) );
+	painter->setBrush( ScQApp->palette().color(QPalette::WindowText) );
+	painter->setPen( QPen(ScQApp->palette().color(QPalette::Midlight), 1.0, Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin) );
 	painter->translate(2.0, 2.0);
 	painter->drawPath( Path.toQPainterPath(true) );
 	painter->end();
diff --git a/scribus/ui/factories/scribusproxystyle.cpp b/scribus/ui/factories/scribusproxystyle.cpp
new file mode 100644
index 000000000..b1631733c
--- /dev/null
+++ b/scribus/ui/factories/scribusproxystyle.cpp
@@ -0,0 +1,130 @@
+#include "scribusproxystyle.h"
+
+#include <QAction>
+#include <QApplication>
+#include <QDockWidget>
+#include <QEvent>
+#include <QMenu>
+#include <QMenuBar>
+#include <QPainter>
+#include <QStatusBar>
+#include <QStyleFactory>
+#include <QStyleHints>
+#include <QStyleOption>
+#include <QStyleOptionDockWidget>
+#include <QStyleOptionTab>
+#include <QStylePainter>
+#include <QToolBar>
+
+#include "prefsmanager.h"
+#include "scribus.h"
+
+// https://doc.qt.io/qt-6/qstyle.html#standardPalette
+QPalette createLightPalette()
+{
+	QPalette lightPalette;
+	QStyle *fusion = QStyleFactory::create("Fusion");
+	if (fusion)
+	{
+		lightPalette = fusion->standardPalette();
+		delete fusion;
+	}
+	return lightPalette;
+}
+
+QPalette createDarkPalette()
+{
+	QPalette darkPalette;
+	darkPalette.setColor(QPalette::Window, QColor(53, 53, 53));
+	darkPalette.setColor(QPalette::WindowText, Qt::white);
+	darkPalette.setColor(QPalette::Base, QColor(42, 42, 42));
+	darkPalette.setColor(QPalette::AlternateBase, QColor(53, 53, 53));
+	darkPalette.setColor(QPalette::ToolTipBase, Qt::white);
+	darkPalette.setColor(QPalette::ToolTipText, Qt::black);
+	darkPalette.setColor(QPalette::Text, Qt::white);
+	darkPalette.setColor(QPalette::Button, QColor(53, 53, 53));
+	darkPalette.setColor(QPalette::ButtonText, Qt::white);
+	darkPalette.setColor(QPalette::BrightText, Qt::red);
+	darkPalette.setColor(QPalette::Link, QColor(42, 130, 218));
+	darkPalette.setColor(QPalette::Highlight, QColor(42, 130, 218));
+	darkPalette.setColor(QPalette::HighlightedText, Qt::black);
+	darkPalette.setColor(QPalette::Shadow, Qt::black);
+
+	darkPalette.setColor(QPalette::Disabled, QPalette::Text, Qt::darkGray);
+	darkPalette.setColor(QPalette::Disabled, QPalette::ButtonText, Qt::darkGray);
+
+	return darkPalette;
+}
+
+ScribusProxyStyle::ScribusProxyStyle(QStyle *style) : QProxyStyle(style) {}
+ScribusProxyStyle::ScribusProxyStyle(const QString &key) : QProxyStyle(key) {}
+
+ScribusProxyStyle* ScribusProxyStyle::instance()
+{
+	return static_cast<ScribusProxyStyle*>(qApp->style());
+}
+
+bool ScribusProxyStyle::eventFilter(QObject *object, QEvent *event)
+{
+	if(object == qApp && event->type() == QEvent::ThemeChange)
+	{
+		if (PrefsManager::instance().appPrefs.uiPrefs.stylePalette == "auto" && !blockRefresh)
+			setApplicationTheme(ScribusProxyStyle::ApplicationTheme::System);
+
+		return true;
+	}
+
+	return QObject::eventFilter(object, event);
+}
+
+void ScribusProxyStyle::setBaseStyleName(const QString &styleName)
+{
+	blockRefresh = true;
+
+	QStyle *oldStyle = baseStyle();
+	QStyle *newStyle = QStyleFactory::create(styleName);
+
+	// QProxyStyle takes ownership
+	setBaseStyle(newStyle);
+
+	if (oldStyle) {
+		oldStyle->deleteLater();
+	}
+
+	blockRefresh = false;
+}
+
+
+void ScribusProxyStyle::setApplicationTheme(ApplicationTheme theme)
+{
+	blockRefresh = true;
+
+	// For Linux exception see bugreport: https://bugreports.qt.io/browse/QTBUG-132929
+
+	switch (theme)
+	{
+	case ApplicationTheme::System:
+	{
+		qApp->styleHints()->unsetColorScheme();
+#if (defined Q_OS_LINUX)
+		qApp->setPalette(baseStyle()->standardPalette());
+#endif
+		break;
+	}
+	case ApplicationTheme::Light:
+		qApp->styleHints()->setColorScheme(Qt::ColorScheme::Light);
+#if (defined Q_OS_LINUX)
+		qApp->setPalette(createLightPalette());
+#endif
+		break;
+
+	case ApplicationTheme::Dark:
+		qApp->styleHints()->setColorScheme(Qt::ColorScheme::Dark);
+#if (defined Q_OS_LINUX)
+		qApp->setPalette(createDarkPalette());
+#endif
+		break;
+	}
+
+	blockRefresh = false;
+}
diff --git a/scribus/ui/factories/scribusproxystyle.h b/scribus/ui/factories/scribusproxystyle.h
new file mode 100644
index 000000000..6924af8d2
--- /dev/null
+++ b/scribus/ui/factories/scribusproxystyle.h
@@ -0,0 +1,36 @@
+#ifndef SCRIBUSPROXYSTYLE_H
+#define SCRIBUSPROXYSTYLE_H
+
+#include <QProxyStyle>
+
+class ScribusProxyStyle : public QProxyStyle
+{
+	Q_OBJECT
+
+public:
+
+	enum class ApplicationTheme {
+		System,
+		Light,
+		Dark
+	};
+
+	ScribusProxyStyle(QStyle *style = nullptr);
+	ScribusProxyStyle(const QString &key);
+
+	static ScribusProxyStyle* instance();
+
+protected:
+	bool eventFilter(QObject *object, QEvent *event) override;
+
+public slots:
+	void setBaseStyleName(const QString &styleName);
+	void setApplicationTheme(ApplicationTheme theme);
+
+private:
+
+	bool blockRefresh {false};
+
+};
+
+#endif // SCRIBUSPROXYSTYLE_H
diff --git a/scribus/ui/linemarkerselector.cpp b/scribus/ui/linemarkerselector.cpp
index f0791531a..ea400de06 100644
--- a/scribus/ui/linemarkerselector.cpp
+++ b/scribus/ui/linemarkerselector.cpp
@@ -1,5 +1,6 @@
 #include "linemarkerselector.h"
 #include "ui/delegates/sclistitemdelegate.h"
+#include "scribusapp.h"
 
 /* ********************************************************************************* *
  *
@@ -24,6 +25,8 @@ LineMarkerSelector::LineMarkerSelector(QWidget *parent) :
 		emit scaleChanged(scale());
 	});
 
+	connect(ScQApp, SIGNAL(iconSetChanged()), this, SLOT(redrawIcons()));
+
 }
 
 /* ********************************************************************************* *
@@ -37,6 +40,7 @@ void LineMarkerSelector::rebuildList(const QList<ArrowDesc> *arrowStyles)
 	// ArrowStyles defined in: void PrefsManager::initArrowStyles()
 	int index = marker() == -1 ? 0 : marker();
 
+	m_arrowStyles = arrowStyles;
 	listMarker->clear();
 
 	qreal m_devicePixelRatio = qApp->devicePixelRatio();
@@ -68,6 +72,14 @@ void LineMarkerSelector::addItem(QPixmap pixmap, const QString &label, int id)
 	listMarker->addItem(item);
 }
 
+void LineMarkerSelector::redrawIcons()
+{
+	if (m_arrowStyles->empty())
+		return;
+
+	rebuildList(m_arrowStyles);
+}
+
 /* ********************************************************************************* *
  *
  * Properties
@@ -131,7 +143,7 @@ void LineMarkerSelector::setScaleSuffix(const QString suffix)
 
 QPixmap LineMarkerSelector::renderPixmap(FPointArray path, int width, int height, int scale)
 {
-	const QPalette& pal = this->palette();
+	const QPalette& pal = ScQApp->palette();
 	QColor textColor = pal.color(QPalette::Active, QPalette::Text);
 
 	int offsetX = 0, offsetY = 0, lineStart = 0, lineEnd = 0;
diff --git a/scribus/ui/linemarkerselector.h b/scribus/ui/linemarkerselector.h
index 3bceae21c..415f55a67 100644
--- a/scribus/ui/linemarkerselector.h
+++ b/scribus/ui/linemarkerselector.h
@@ -29,11 +29,15 @@ public:
 private:
 	ArrowDirection m_arrowDirection { ArrowDirection::StartArrow };
 	int arrow = 23;
+	const QList<ArrowDesc> *m_arrowStyles;
 
 	QPixmap renderPixmap(FPointArray path, int width, int height, int scale);
 
 	void addItem(QPixmap pixmap, const QString &label, int id);
 
+private slots:
+	void redrawIcons();
+
 signals:
 	void scaleChanged(double);
 	void markerChanged(int);
diff --git a/scribus/ui/viewtoolbar.cpp b/scribus/ui/viewtoolbar.cpp
index 5434e2fcd..3bd63bc3e 100644
--- a/scribus/ui/viewtoolbar.cpp
+++ b/scribus/ui/viewtoolbar.cpp
@@ -110,6 +110,7 @@ void ViewToolBar::languageChange()
 	visualMenu->addAction(im.loadIcon("color-vision-colorblind", iconSize()), CommonStrings::trVisionFullColorBlind);
 	visualMenu->setToolTip( tr("Select the visual appearance of the display. You can choose between normal and several color blindness forms."));
 	visualMenu->setStatusTip( tr("Select display visual appearance"));
+	visualMenu->setCurrentIndex(visualMenu->currentIndex());
 
 	QSignalBlocker sigImageRes(previewQualitySwitcher);
 	previewQualitySwitcher->clear();
@@ -118,5 +119,6 @@ void ViewToolBar::languageChange()
 	previewQualitySwitcher->addAction(im.loadIcon("image-resolution-low", iconSize()), tr("Low"));
 	previewQualitySwitcher->setToolTip( tr("Select the image preview quality"));
 	previewQualitySwitcher->setStatusTip( tr("Select image preview quality"));
+	previewQualitySwitcher->setCurrentIndex(previewQualitySwitcher->currentIndex());
 
 }
diff --git a/scribus/ui/widgets/dropdown_button.cpp b/scribus/ui/widgets/dropdown_button.cpp
index 4d1a8e5fe..de4fecdb8 100644
--- a/scribus/ui/widgets/dropdown_button.cpp
+++ b/scribus/ui/widgets/dropdown_button.cpp
@@ -1,17 +1,24 @@
 #include <QMenu>
 #include "dropdown_button.h"
+#include "scribusapp.h"
 
 DropdownButton::DropdownButton(QWidget *parent) : QToolButton(parent)
 {
 	setPopupMode(QToolButton::InstantPopup);
+	connect(ScQApp, SIGNAL(iconSetChanged()), this, SLOT(iconSetChange()));
 }
 
 void DropdownButton::setCurrentIndex(int index)
 {
 	m_index = index;
 
-	if (menu())
-		indexChanged(menu()->actions().at(qBound(0, index, menu()->actions().size())));
+	if (!menu())
+		return;
+
+	if (menu()->actions().empty())
+		return;
+
+	indexChanged(menu()->actions().at(qBound(0, index, menu()->actions().size())));
 }
 
 void DropdownButton::setMenu(QMenu *menu)
@@ -49,3 +56,10 @@ void DropdownButton::indexChanged(QAction *action)
 		emit activated(m_index);
 	}
 }
+
+void DropdownButton::iconSetChange()
+{
+	this->blockSignals(true);
+	setCurrentIndex(m_index);
+	this->blockSignals(false);
+}
diff --git a/scribus/ui/widgets/dropdown_button.h b/scribus/ui/widgets/dropdown_button.h
index f4cad2b11..6e60efdc4 100644
--- a/scribus/ui/widgets/dropdown_button.h
+++ b/scribus/ui/widgets/dropdown_button.h
@@ -21,6 +21,7 @@ private:
 
 private slots:
 	void indexChanged(QAction *action);
+	void iconSetChange();
 
 signals:
 	void currentIndexChanged(int index);
diff --git a/scribus/ui/widgets/pagelayout.cpp b/scribus/ui/widgets/pagelayout.cpp
index 24aafeab6..a653d11b4 100644
--- a/scribus/ui/widgets/pagelayout.cpp
+++ b/scribus/ui/widgets/pagelayout.cpp
@@ -18,6 +18,7 @@ for which a new license (GPL+exception) is in place.
 #include "iconmanager.h"
 #include "scribusapp.h"
 #include "ui/widgets/form_widget.h"
+#include "ui/widgets/dropdown_button.h"
 
 PageLayouts::PageLayouts(QWidget* parent)  : QWidget( parent )
 {
@@ -37,11 +38,8 @@ PageLayouts::PageLayouts(QWidget* parent)  : QWidget( parent )
 	QFont layFont(this->font());
 	layFont.setPointSize(8);
 
-	menuScheme = new QMenu();
-
-	buttonScheme = new QToolButton(this);
+	buttonScheme = new DropdownButton(this);
 	buttonScheme->setPopupMode(QToolButton::InstantPopup);
-	buttonScheme->setMenu(menuScheme);
 
 	labelScheme = new FormWidget();
 	labelScheme->setFont(layFont);
@@ -49,11 +47,8 @@ PageLayouts::PageLayouts(QWidget* parent)  : QWidget( parent )
 	labelScheme->setLabelVisibility(!m_hideLabels);
 	layoutGroupLayout->addWidget( labelScheme );
 
-	menuFirstPage = new QMenu();
-
-	buttonFirstPage = new QToolButton(this);
+	buttonFirstPage = new DropdownButton(this);
 	buttonFirstPage->setPopupMode(QToolButton::InstantPopup);
-	buttonFirstPage->setMenu(menuFirstPage);
 
 	labelPages = new FormWidget();
 	labelPages->setFont(layFont);
@@ -64,8 +59,9 @@ PageLayouts::PageLayouts(QWidget* parent)  : QWidget( parent )
 	languageChange();
 
 	connect(ScQApp, SIGNAL(labelVisibilityChanged(bool)), this, SLOT(toggleLabelVisibility(bool)));
-	connect(menuScheme, &QMenu::triggered, this, &PageLayouts::changeScheme);
-	connect(menuFirstPage, &QMenu::triggered, this, &PageLayouts::changeFirstPage);
+	connect(ScQApp, SIGNAL(iconSetChanged()), this, SLOT(languageChange()));
+	connect(buttonScheme, &DropdownButton::activated, this, &PageLayouts::changeScheme, Qt::UniqueConnection);
+	connect(buttonFirstPage, &DropdownButton::activated, this, &PageLayouts::changeFirstPage, Qt::UniqueConnection);
 }
 
 void PageLayouts::updateSchemeSelector(QList<PageSet> pageSets, int pagePositioning)
@@ -79,22 +75,22 @@ void PageLayouts::updateSchemeSelector(QList<PageSet> pageSets, int pagePosition
 
 void PageLayouts::setFirstPage(int nr)
 {
-	if (menuFirstPage->actions().isEmpty())
+	if (buttonFirstPage->actions().isEmpty())
 		return;
 
-	m_firstPage = qBound(0, nr, static_cast<int>(menuFirstPage->actions().count()));
-	buttonFirstPage->setIcon(menuFirstPage->actions().at(m_firstPage)->icon());
+	m_firstPage = qBound(0, nr, static_cast<int>(buttonFirstPage->actions().count()));
+	buttonFirstPage->setCurrentIndex(m_firstPage);
 }
 
 void PageLayouts::setScheme(int nr)
 {
-	if (menuScheme->actions().isEmpty())
+	if (buttonScheme->actions().isEmpty())
 		return;
 
-	m_scheme = qBound(0, nr, static_cast<int>(menuScheme->actions().count()));
-	buttonScheme->setIcon(menuScheme->actions().at(m_scheme)->icon());
+	m_scheme = qBound(0, nr, static_cast<int>(buttonScheme->actions().count()));
 
 	reloadFirstPage(m_scheme);
+	buttonScheme->setCurrentIndex(m_scheme);
 
 }
 
@@ -106,9 +102,7 @@ void PageLayouts::setHideLabelsPermanently(bool hide)
 
 void PageLayouts::reloadScheme()
 {
-	disconnect(menuScheme, &QMenu::triggered, this, &PageLayouts::changeScheme);
-
-	menuScheme->clear();
+	buttonScheme->clear();
 
 	for (int pg = 0; pg < m_pageSets.count(); ++pg)
 	{
@@ -118,25 +112,21 @@ void PageLayouts::reloadScheme()
 
 		QString psname = CommonStrings::translatePageSetString(m_pageSets[pg].Name);
 		if (pg == 0)
-			menuScheme->addAction(IconManager::instance().loadIcon("page-simple"), psname)->setData(QVariant(pg));
+			buttonScheme->addAction(IconManager::instance().loadIcon("page-simple"), psname)->setData(QVariant(pg));
 		else if (pg == 1)
-			menuScheme->addAction(IconManager::instance().loadIcon("page-doublesided"), psname)->setData(QVariant(pg));
+			buttonScheme->addAction(IconManager::instance().loadIcon("page-doublesided"), psname)->setData(QVariant(pg));
 		else if (pg == 2)
-			menuScheme->addAction(IconManager::instance().loadIcon("page-3fold"), psname)->setData(QVariant(pg));
+			buttonScheme->addAction(IconManager::instance().loadIcon("page-3fold"), psname)->setData(QVariant(pg));
 		else if (pg == 3)
-			menuScheme->addAction(IconManager::instance().loadIcon("page-4fold"), psname)->setData(QVariant(pg));
+			buttonScheme->addAction(IconManager::instance().loadIcon("page-4fold"), psname)->setData(QVariant(pg));
 		else
-			menuScheme->addAction(IconManager::instance().loadIcon("page-simple"), psname)->setData(QVariant(pg));
+			buttonScheme->addAction(IconManager::instance().loadIcon("page-simple"), psname)->setData(QVariant(pg));
 	}
-
-	connect(menuScheme, &QMenu::triggered, this, &PageLayouts::changeScheme);
 }
 
 void PageLayouts::reloadFirstPage(int scheme)
 {
-	disconnect(menuFirstPage, &QMenu::triggered, this, &PageLayouts::changeFirstPage);
-
-	menuFirstPage->clear();
+	buttonFirstPage->clear();
 
 	// We have to add the other cases if want to support them again
 	// CommonStrings::pageLocLeft
@@ -150,14 +140,13 @@ void PageLayouts::reloadFirstPage(int scheme)
 		QString psname = m_pageSets[scheme].pageNames[pg];
 
 		if (psname == CommonStrings::pageLocLeft)
-			menuFirstPage->addAction(IconManager::instance().loadIcon("page-first-left"), psname)->setData(QVariant(pg));
+			buttonFirstPage->addAction(IconManager::instance().loadIcon("page-first-left"), psname)->setData(QVariant(pg));
 		else if (psname == CommonStrings::pageLocRight)
-			menuFirstPage->addAction(IconManager::instance().loadIcon("page-first-right"), psname)->setData(QVariant(pg));
+			buttonFirstPage->addAction(IconManager::instance().loadIcon("page-first-right"), psname)->setData(QVariant(pg));
 		else
-			menuFirstPage->addAction(IconManager::instance().loadIcon("page-first-left"), psname)->setData(QVariant(pg));
+			buttonFirstPage->addAction(IconManager::instance().loadIcon("page-first-left"), psname)->setData(QVariant(pg));
 	}
 
-	connect(menuFirstPage, &QMenu::triggered, this, &PageLayouts::changeFirstPage);
 }
 
 void PageLayouts::toggleLabelVisibility(bool visibility)
@@ -179,22 +168,35 @@ void PageLayouts::languageChange()
 	labelScheme->setText( tr( "Scheme" ) );
 	labelPages->setText( tr( "First Page" ) );
 
+	QSignalBlocker sigButtonScheme(buttonScheme);
+	buttonScheme->setCurrentIndex(buttonScheme->currentIndex());
 	buttonScheme->setToolTip( tr( "Number of pages to show side-by-side on the canvas. Often used for allowing items to be placed across page spreads." ) );
+
+	QSignalBlocker sigFirstPage(buttonFirstPage);
+	buttonFirstPage->setCurrentIndex(buttonFirstPage->currentIndex());
 	buttonFirstPage->setToolTip( tr( "Location on the canvas where the first page of the document is placed" ) );
 }
 
-void PageLayouts::changeScheme(QAction *action)
+void PageLayouts::changeScheme(int index)
 {
-	buttonScheme->setIcon(action->icon());
+	QAction * action = buttonScheme->menu()->actions().at(qBound(0, index, buttonScheme->menu()->actions().size()));
+
+	if (!action)
+		return;
+
 	int ic = action->data().toInt();
 	reloadFirstPage(ic);
 	labelPages->setVisible( ic > 0 );
 	emit schemeChanged(ic);
 }
 
-void PageLayouts::changeFirstPage(QAction *action)
+void PageLayouts::changeFirstPage(int index)
 {
-	buttonFirstPage->setIcon(action->icon());
+	QAction * action = buttonFirstPage->menu()->actions().at(qBound(0, index, buttonFirstPage->menu()->actions().size()));
+
+	if (!action)
+		return;
+
 	m_firstPage = action->data().toInt();
 	emit firstPageChanged(m_firstPage);
 }
diff --git a/scribus/ui/widgets/pagelayout.h b/scribus/ui/widgets/pagelayout.h
index d404ba4d8..473789ba9 100644
--- a/scribus/ui/widgets/pagelayout.h
+++ b/scribus/ui/widgets/pagelayout.h
@@ -16,6 +16,7 @@ class QHBoxLayout;
 class QLabel;
 class QMenu;
 class QToolButton;
+class DropdownButton;
 
 #include "scribusapi.h"
 #include "scribusstructs.h"
@@ -57,10 +58,8 @@ private:
 
 	FormWidget* labelScheme { nullptr };
 	FormWidget* labelPages { nullptr };
-	QToolButton* buttonScheme { nullptr };
-	QToolButton* buttonFirstPage { nullptr };
-	QMenu* menuScheme { nullptr };
-	QMenu* menuFirstPage { nullptr };
+	DropdownButton* buttonScheme { nullptr };
+	DropdownButton* buttonFirstPage { nullptr };
 	QHBoxLayout* layoutGroupLayout { nullptr };
 
 	void reloadScheme();
@@ -68,8 +67,8 @@ private:
 
 protected slots:
 	void languageChange();
-	void changeScheme(QAction* action);
-	void changeFirstPage(QAction* action);
+	void changeScheme(int index);
+	void changeFirstPage(int index);
 
 };
 
