From 3cedbda41e5dc253db4377799cbc01a573440e1e Mon Sep 17 00:00:00 2001
From: Markus Mittendrein <git@maxmitti.at>
Date: Sun, 7 Dec 2025 22:55:39 +0100
Subject: [PATCH 1/3] Migrate uses of QObject::connect from SIGNAL/SLOT macros
 to function pointers

---
 context/albumview.cpp                    |  16 +-
 context/artistview.cpp                   |  16 +-
 context/contextwidget.cpp                |  18 +-
 context/lastfmengine.cpp                 |   2 +-
 context/lyricsdialog.cpp                 |   4 +-
 context/metaengine.cpp                   |   4 +-
 context/othersettings.cpp                |  12 +-
 context/songview.cpp                     |  35 ++-
 context/togglelist.cpp                   |  12 +-
 context/ultimatelyrics.cpp               |   2 +-
 context/ultimatelyricsprovider.cpp       |   6 +-
 context/view.cpp                         |   6 +-
 context/wikipediaengine.cpp              |   4 +-
 context/wikipediasettings.cpp            |  12 +-
 db/mpdlibrarydb.cpp                      |  12 +-
 dbus/gnomemediakeys.cpp                  |  12 +-
 dbus/mpris.cpp                           |  20 +-
 dbus/powermanagement.cpp                 |   8 +-
 devices/actiondialog.cpp                 |  38 +--
 devices/albumdetailsdialog.cpp           |  12 +-
 devices/audiocddevice.cpp                |  24 +-
 devices/cddbselectiondialog.cpp          |   2 +-
 devices/device.cpp                       |   2 +-
 devices/devicepropertiesdialog.cpp       |   2 +-
 devices/devicepropertieswidget.cpp       |  38 +--
 devices/devicespage.cpp                  |  34 +--
 devices/filejob.cpp                      |   4 +-
 devices/filenameschemedialog.cpp         |  26 +-
 devices/fsdevice.cpp                     |  42 +--
 devices/mountpoints.cpp                  |   2 +-
 devices/mtpdevice.cpp                    |  62 ++--
 devices/remotedevicepropertiesdialog.cpp |   4 +-
 devices/remotedevicepropertieswidget.cpp |  16 +-
 devices/remotefsdevice.cpp               |  10 +-
 devices/synccollectionwidget.cpp         |  26 +-
 devices/syncdialog.cpp                   |  16 +-
 devices/transcodingjob.cpp               |   4 +-
 devices/umsdevice.cpp                    |   4 +-
 devices/valueslider.cpp                  |   2 +-
 gui/apikeyssettings.cpp                  |   2 +-
 gui/cachesettings.cpp                    |  14 +-
 gui/coverdialog.cpp                      |  26 +-
 gui/coverdialog.h                        |   2 +-
 gui/covers.cpp                           |  44 +--
 gui/currentcover.cpp                     |  10 +-
 gui/customactions.cpp                    |   6 +-
 gui/customactionssettings.cpp            |   8 +-
 gui/initialsettingswizard.cpp            |  16 +-
 gui/interfacesettings.cpp                |  34 +--
 gui/librarypage.cpp                      |  28 +-
 gui/localfolderpage.cpp                  |   8 +-
 gui/mainwindow.cpp                       | 360 +++++++++++------------
 gui/mainwindow.h                         |   4 +-
 gui/mediakeys.cpp                        |  16 +-
 gui/mpdbrowsepage.cpp                    |  18 +-
 gui/playbacksettings.cpp                 |  18 +-
 gui/searchpage.cpp                       |  14 +-
 gui/serversettings.cpp                   |  10 +-
 gui/singleapplication.cpp                |   4 +-
 gui/trayitem.cpp                         |   6 +-
 http/httpserver.cpp                      |  12 +-
 http/httpsocket.cpp                      |  14 +-
 mac/dockmenu.cpp                         |   2 +-
 mac/macnowplaying.mm                     |   4 +-
 models/browsemodel.cpp                   |  14 +-
 models/devicesmodel.cpp                  |  64 ++--
 models/mpdlibrarymodel.cpp               |  12 +-
 models/mpdsearchmodel.cpp                |  10 +-
 models/playlistsmodel.cpp                |  32 +-
 models/playqueuemodel.cpp                |  58 ++--
 models/sqllibrarymodel.cpp               |   4 +-
 models/streamsearchmodel.cpp             |   4 +-
 models/streamsmodel.cpp                  |  20 +-
 mpd-interface/httpstream.cpp             |  10 +-
 mpd-interface/mpdconnection.cpp          |  44 +--
 mpd-interface/mpdstats.cpp               |   2 +-
 mpd-interface/mpdstatus.cpp              |   2 +-
 network/networkaccessmanager.cpp         |   4 +-
 network/proxysettings.cpp                |   2 +-
 online/magnatunesettingsdialog.cpp       |   2 +-
 online/onlinedbservice.cpp               |  28 +-
 online/onlinedbwidget.cpp                |  14 +-
 online/onlinesearchwidget.cpp            |   4 +-
 online/onlineservicespage.cpp            |   6 +-
 online/onlinesettings.cpp                |   4 +-
 online/podcastsearchdialog.cpp           |  30 +-
 online/podcastservice.cpp                |  20 +-
 online/podcastsettingsdialog.cpp         |   6 +-
 online/podcastwidget.cpp                 |  26 +-
 online/soundcloudservice.cpp             |   2 +-
 playlists/dynamicplaylists.cpp           |  16 +-
 playlists/dynamicplaylistspage.cpp       |  26 +-
 playlists/playlistruledialog.cpp         |  24 +-
 playlists/playlistrulesdialog.cpp        |  27 +-
 playlists/playlistspage.cpp              |   4 +-
 playlists/smartplaylistspage.cpp         |  21 +-
 playlists/storedplaylistspage.cpp        |  32 +-
 replaygain/albumscanner.cpp              |   8 +-
 replaygain/jobcontroller.cpp             |   6 +-
 replaygain/main.cpp                      |   2 +-
 replaygain/replaygain.cpp                |   4 +-
 replaygain/rgdialog.cpp                  |  18 +-
 scrobbling/scrobbler.cpp                 |  38 ++-
 scrobbling/scrobbler.h                   |   1 +
 scrobbling/scrobblinglove.cpp            |   8 +-
 scrobbling/scrobblingsettings.cpp        |  18 +-
 streams/streamdialog.cpp                 |   6 +-
 streams/streamfetcher.cpp                |  20 +-
 streams/streamspage.cpp                  |  56 ++--
 support/QtAwesomeAnim.cpp                |   2 +-
 support/acceleratormanager.cpp           |   4 +-
 support/action.cpp                       |  28 +-
 support/action.h                         |  28 +-
 support/actioncollection.cpp             |  28 +-
 support/actioncollection.h               |  23 +-
 support/combobox.cpp                     |   2 +-
 support/configdialog.cpp                 |   6 +-
 support/dialog.cpp                       |   2 +-
 support/fancytabwidget.cpp               |   6 +-
 support/inputdialog.cpp                  |   4 +-
 support/keysequencewidget.cpp            |   8 +-
 support/kmessagewidget.cpp               |   3 +-
 support/osxstyle.cpp                     |  16 +-
 support/pagewidget.cpp                   |   4 +-
 support/pathrequester.cpp                |   4 +-
 support/shortcutssettingswidget.cpp      |  12 +-
 support/spinner.cpp                      |   2 +-
 support/thread.cpp                       |   8 +-
 support/urllabel.cpp                     |   2 +-
 tags/tageditor.cpp                       |  60 ++--
 tags/taghelper.cpp                       |   6 +-
 tags/taghelperiface.cpp                  |  12 +-
 tags/trackorganiser.cpp                  |  28 +-
 widgets/actionlabel.cpp                  |   2 +-
 widgets/autohidingsplitter.cpp           |  18 +-
 widgets/categorizedview.cpp              |  12 +-
 widgets/coverwidget.cpp                  |   4 +-
 widgets/genrecombo.cpp                   |   2 +-
 widgets/groupedview.cpp                  |   6 +-
 widgets/itemview.cpp                     |  89 +++---
 widgets/itemview.h                       |   2 +-
 widgets/listview.cpp                     |   8 +-
 widgets/messageoverlay.cpp               |   4 +-
 widgets/mirrormenu.cpp                   |  16 +-
 widgets/mirrormenu.h                     |  20 +-
 widgets/multipagewidget.cpp              |   6 +-
 widgets/notelabel.cpp                    |   2 +-
 widgets/nowplayingwidget.cpp             |  22 +-
 widgets/playqueueview.cpp                |  14 +-
 widgets/searchwidget.cpp                 |  10 +-
 widgets/selectorlabel.cpp                |   2 +-
 widgets/singlepagewidget.cpp             |  35 +--
 widgets/singlepagewidget.h               |  26 +-
 widgets/stretchheaderview.cpp            |   2 +-
 widgets/tableview.cpp                    |  10 +-
 widgets/textbrowser.cpp                  |   2 +-
 widgets/titlewidget.cpp                  |  10 +-
 widgets/treeview.cpp                     |   8 +-
 widgets/volumecontrol.cpp                |   6 +-
 widgets/volumeslider.cpp                 |  22 +-
 windows/thumbnailtoolbar.cpp             |   2 +-
 161 files changed, 1338 insertions(+), 1332 deletions(-)

diff --git a/context/albumview.cpp b/context/albumview.cpp
index d953abce9..eed1bfd09 100644
--- a/context/albumview.cpp
+++ b/context/albumview.cpp
@@ -73,17 +73,17 @@ AlbumView::AlbumView(QWidget* p)
 	// Full width covers not working under windows. Issue #1252
 	fullWidthCoverAction = new Action(tr("Full Width Cover"), this);
 	fullWidthCoverAction->setCheckable(true);
-	connect(fullWidthCoverAction, SIGNAL(toggled(bool)), this, SLOT(setScaleImage(bool)));
+	connect(fullWidthCoverAction, &Action::toggled, this, &AlbumView::setScaleImage);
 	fullWidthCoverAction->setChecked(Configuration(metaObject()->className()).get("fullWidthCover", false));
 #endif
 	refreshAction = ActionCollection::get()->createAction("refreshalbum", tr("Refresh Album Information"), Icons::self()->refreshIcon);
-	connect(refreshAction, SIGNAL(triggered()), this, SLOT(refresh()));
-	connect(engine, SIGNAL(searchResult(QString, QString)), this, SLOT(searchResponse(QString, QString)));
-	connect(Covers::self(), SIGNAL(cover(Song, QImage, QString)), SLOT(coverRetrieved(Song, QImage, QString)));
-	connect(Covers::self(), SIGNAL(coverUpdated(Song, QImage, QString)), SLOT(coverUpdated(Song, QImage, QString)));
-	connect(text, SIGNAL(anchorClicked(QUrl)), SLOT(playSong(QUrl)));
+	connect(refreshAction, &Action::triggered, this, &AlbumView::refresh);
+	connect(engine, &ContextEngine::searchResult, this, &AlbumView::searchResponse);
+	connect(Covers::self(), &Covers::cover, this, &AlbumView::coverRetrieved);
+	connect(Covers::self(), &Covers::coverUpdated, this, &AlbumView::coverUpdated);
+	connect(text, &TextBrowser::anchorClicked, this, qOverload<const QUrl&>(&AlbumView::playSong));
 	text->setContextMenuPolicy(Qt::CustomContextMenu);
-	connect(text, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(showContextMenu(QPoint)));
+	connect(text, &TextBrowser::customContextMenuRequested, this, &AlbumView::showContextMenu);
 	setStandardHeader(tr("Album"));
 	int imageSize = fontMetrics().height() * 18;
 	setPicSize(QSize(imageSize, imageSize));
@@ -91,7 +91,7 @@ AlbumView::AlbumView(QWidget* p)
 	if (ArtistView::constCacheAge > 0) {
 		clearCache();
 		QTimer* timer = new QTimer(this);
-		connect(timer, SIGNAL(timeout()), this, SLOT(clearCache()));
+		connect(timer, &QTimer::timeout, this, &AlbumView::clearCache);
 		timer->start((int)((ArtistView::constCacheAge / 2.0) * 1000 * 24 * 60 * 60));
 	}
 }
diff --git a/context/artistview.cpp b/context/artistview.cpp
index fb71b704e..a06d53dd1 100644
--- a/context/artistview.cpp
+++ b/context/artistview.cpp
@@ -103,13 +103,13 @@ ArtistView::ArtistView(QWidget* parent)
 {
 	engine = ContextEngine::create(this);
 	refreshAction = ActionCollection::get()->createAction("refreshartist", tr("Refresh Artist Information"), Icons::self()->refreshIcon);
-	connect(refreshAction, SIGNAL(triggered()), this, SLOT(refresh()));
-	connect(engine, SIGNAL(searchResult(QString, QString)), this, SLOT(searchResponse(QString, QString)));
-	connect(Covers::self(), SIGNAL(artistImage(Song, QImage, QString)), SLOT(artistImage(Song, QImage, QString)));
-	connect(Covers::self(), SIGNAL(coverUpdated(Song, QImage, QString)), SLOT(artistImageUpdated(Song, QImage, QString)));
-	connect(text, SIGNAL(anchorClicked(QUrl)), SLOT(show(QUrl)));
+	connect(refreshAction, &Action::triggered, this, &ArtistView::refresh);
+	connect(engine, &ContextEngine::searchResult, this, &ArtistView::searchResponse);
+	connect(Covers::self(), &Covers::artistImage, this, &ArtistView::artistImage);
+	connect(Covers::self(), &Covers::coverUpdated, this, &ArtistView::artistImageUpdated);
+	connect(text, &TextBrowser::anchorClicked, this, &ArtistView::show);
 	text->setContextMenuPolicy(Qt::CustomContextMenu);
-	connect(text, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(showContextMenu(QPoint)));
+	connect(text, &TextBrowser::customContextMenuRequested, this, &ArtistView::showContextMenu);
 	setStandardHeader(tr("Artist"));
 
 	int imageHeight = fontMetrics().height() * 14;
@@ -119,7 +119,7 @@ ArtistView::ArtistView(QWidget* parent)
 	if (constCacheAge > 0) {
 		clearCache();
 		QTimer* timer = new QTimer(this);
-		connect(timer, SIGNAL(timeout()), this, SLOT(clearCache()));
+		connect(timer, &QTimer::timeout, this, &ArtistView::clearCache);
 		timer->start((int)((constCacheAge / 2.0) * 1000 * 24 * 60 * 60));
 	}
 }
@@ -369,7 +369,7 @@ void ArtistView::requestSimilar()
 
 	currentSimilarJob = NetworkAccessManager::self()->get(url);
 	currentSimilarJob->setProperty(constNameKey, currentSong.artist);
-	connect(currentSimilarJob, SIGNAL(finished()), this, SLOT(handleSimilarReply()));
+	connect(currentSimilarJob, &NetworkJob::finished, this, &ArtistView::handleSimilarReply);
 }
 
 void ArtistView::abort()
diff --git a/context/contextwidget.cpp b/context/contextwidget.cpp
index 5cc04fec7..5b036f1c0 100644
--- a/context/contextwidget.cpp
+++ b/context/contextwidget.cpp
@@ -142,7 +142,7 @@ void ViewSelector::addItem(const QString& label, const QVariant& data)
 	button->setText(label);
 	button->setCheckable(true);
 	button->setProperty(constDataProp, data);
-	connect(button, SIGNAL(toggled(bool)), this, SLOT(buttonActivated()));
+	connect(button, &QToolButton::toggled, this, &ViewSelector::buttonActivated);
 	buttons.append(button);
 	group->addButton(button);
 	l->addWidget(button);
@@ -216,7 +216,7 @@ ThinSplitter::ThinSplitter(QWidget* parent)
 	setChildrenCollapsible(true);
 	setOrientation(Qt::Horizontal);
 	resetAct = new QAction(tr("Reset Spacing"), this);
-	connect(resetAct, SIGNAL(triggered()), this, SLOT(reset()));
+	connect(resetAct, &QAction::triggered, this, &ThinSplitter::reset);
 	setHandleWidth(0);
 }
 
@@ -266,9 +266,9 @@ ContextWidget::ContextWidget(QWidget* parent)
 	album->addEventFilter(this);
 	song->addEventFilter(this);
 
-	connect(artist, SIGNAL(findArtist(QString)), this, SIGNAL(findArtist(QString)));
-	connect(artist, SIGNAL(findAlbum(QString, QString)), this, SIGNAL(findAlbum(QString, QString)));
-	connect(album, SIGNAL(playSong(QString)), this, SIGNAL(playSong(QString)));
+	connect(artist, &ArtistView::findArtist, this, &ContextWidget::findArtist);
+	connect(artist, &ArtistView::findAlbum, this, &ContextWidget::findAlbum);
+	connect(album, qOverload<const QString&>(&AlbumView::playSong), this, &ContextWidget::playSong);
 	readConfig();
 	setWide(true);
 }
@@ -341,7 +341,7 @@ void ContextWidget::setWide(bool w)
 			viewSelector->addItem(tr("Al&bum"), "album");
 			viewSelector->addItem(tr("&Track"), "song");
 			viewSelector->setPalette(palette());
-			connect(viewSelector, SIGNAL(activated(int)), stack, SLOT(setCurrentIndex(int)));
+			connect(viewSelector, &ViewSelector::activated, stack, &QStackedWidget::setCurrentIndex);
 		}
 		if (splitter) {
 			splitter->setVisible(false);
@@ -767,7 +767,7 @@ void ContextWidget::getMusicbrainzId(const QString& artist)
 	job = NetworkAccessManager::self()->get(url);
 	DBUG << url.toString();
 	job->setProperty(constArtistProp, artist);
-	connect(job, SIGNAL(finished()), this, SLOT(musicbrainzResponse()));
+	connect(job, &NetworkJob::finished, this, &ContextWidget::musicbrainzResponse);
 }
 
 void ContextWidget::musicbrainzResponse()
@@ -836,7 +836,7 @@ void ContextWidget::musicbrainzResponse()
 
 		job = NetworkAccessManager::self()->get(url);
 		DBUG << url.toString();
-		connect(job, SIGNAL(finished()), this, SLOT(fanArtResponse()));
+		connect(job, &NetworkJob::finished, this, &ContextWidget::fanArtResponse);
 	}
 }
 
@@ -883,7 +883,7 @@ void ContextWidget::fanArtResponse()
 	else {
 		job = NetworkAccessManager::self()->get(QUrl(url));
 		DBUG << url;
-		connect(job, SIGNAL(finished()), this, SLOT(downloadResponse()));
+		connect(job, &NetworkJob::finished, this, &ContextWidget::downloadResponse);
 	}
 }
 
diff --git a/context/lastfmengine.cpp b/context/lastfmengine.cpp
index 6189a58ac..f6bbcb7a4 100644
--- a/context/lastfmengine.cpp
+++ b/context/lastfmengine.cpp
@@ -100,7 +100,7 @@ void LastFmEngine::search(const QStringList& query, Mode mode)
 	}
 	job->setProperty(constQuery, queryString.join("/"));
 	DBUG << url.toString();
-	connect(job, SIGNAL(finished()), this, SLOT(parseResponse()));
+	connect(job, &NetworkJob::finished, this, qOverload<>(&LastFmEngine::parseResponse));
 }
 
 void LastFmEngine::parseResponse()
diff --git a/context/lyricsdialog.cpp b/context/lyricsdialog.cpp
index 6c82d6728..0da86e081 100644
--- a/context/lyricsdialog.cpp
+++ b/context/lyricsdialog.cpp
@@ -65,8 +65,8 @@ LyricsDialog::LyricsDialog(const Song& s, QWidget* parent)
 	setMainWidget(mw);
 	setButtons(Ok | Cancel);
 	enableButton(Ok, false);
-	connect(titleEntry, SIGNAL(textChanged(const QString&)), SLOT(changed()));
-	connect(artistEntry, SIGNAL(textChanged(const QString&)), SLOT(changed()));
+	connect(titleEntry, &LineEdit::textChanged, this, &LyricsDialog::changed);
+	connect(artistEntry, &LineEdit::textChanged, this, &LyricsDialog::changed);
 	titleEntry->setFocus();
 	titleEntry->setText(s.title);
 	artistEntry->setText(s.artist);
diff --git a/context/metaengine.cpp b/context/metaengine.cpp
index adb13495c..0ecb71854 100644
--- a/context/metaengine.cpp
+++ b/context/metaengine.cpp
@@ -41,8 +41,8 @@ MetaEngine::MetaEngine(QObject* p)
 {
 	wiki = new WikipediaEngine(this);
 	lastfm = new LastFmEngine(this);
-	connect(wiki, SIGNAL(searchResult(QString, QString)), SLOT(wikiResponse(QString, QString)));
-	connect(lastfm, SIGNAL(searchResult(QString, QString)), SLOT(lastFmResponse(QString, QString)));
+	connect(wiki, &WikipediaEngine::searchResult, this, &MetaEngine::wikiResponse);
+	connect(lastfm, &LastFmEngine::searchResult, this, &MetaEngine::lastFmResponse);
 }
 
 QStringList MetaEngine::getLangs() const
diff --git a/context/othersettings.cpp b/context/othersettings.cpp
index 3328ccd15..4b43e1198 100644
--- a/context/othersettings.cpp
+++ b/context/othersettings.cpp
@@ -32,7 +32,7 @@ OtherSettings::OtherSettings(QWidget* p)
 	: QWidget(p)
 {
 	setupUi(this);
-	connect(wikipediaIntroOnly, SIGNAL(toggled(bool)), SLOT(toggleWikiNote()));
+	connect(wikipediaIntroOnly, &QCheckBox::toggled, this, &OtherSettings::toggleWikiNote);
 
 	contextBackdrop_none->setProperty(constValueProperty, PlayQueueView::BI_None);
 	contextBackdrop_artist->setProperty(constValueProperty, PlayQueueView::BI_Cover);
@@ -42,11 +42,11 @@ OtherSettings::OtherSettings(QWidget* p)
 	int labelWidth = qMax(fontMetrics().horizontalAdvance(QLatin1String("100%")), fontMetrics().horizontalAdvance(tr("10px", "pixels")));
 	contextBackdropOpacityLabel->setFixedWidth(labelWidth);
 	contextBackdropBlurLabel->setFixedWidth(labelWidth);
-	connect(contextBackdropOpacity, SIGNAL(valueChanged(int)), SLOT(setContextBackdropOpacityLabel()));
-	connect(contextBackdropBlur, SIGNAL(valueChanged(int)), SLOT(setContextBackdropBlurLabel()));
-	connect(contextBackdrop_none, SIGNAL(toggled(bool)), SLOT(enableContextBackdropOptions()));
-	connect(contextBackdrop_artist, SIGNAL(toggled(bool)), SLOT(enableContextBackdropOptions()));
-	connect(contextBackdrop_custom, SIGNAL(toggled(bool)), SLOT(enableContextBackdropOptions()));
+	connect(contextBackdropOpacity, &QSlider::valueChanged, this, &OtherSettings::setContextBackdropOpacityLabel);
+	connect(contextBackdropBlur, &QSlider::valueChanged, this, &OtherSettings::setContextBackdropBlurLabel);
+	connect(contextBackdrop_none, &QRadioButton::toggled, this, &OtherSettings::enableContextBackdropOptions);
+	connect(contextBackdrop_artist, &QRadioButton::toggled, this, &OtherSettings::enableContextBackdropOptions);
+	connect(contextBackdrop_custom, &QRadioButton::toggled, this, &OtherSettings::enableContextBackdropOptions);
 }
 
 void OtherSettings::load()
diff --git a/context/songview.cpp b/context/songview.cpp
index 32dca9ec5..8d95f4e9e 100644
--- a/context/songview.cpp
+++ b/context/songview.cpp
@@ -108,28 +108,27 @@ SongView::SongView(QWidget* p)
 
 	scrollAction->setCheckable(true);
 	scrollAction->setChecked(Settings::self()->contextAutoScroll());
-	connect(scrollAction, SIGNAL(toggled(bool)), SLOT(toggleScroll()));
-	connect(refreshAction, SIGNAL(triggered()), SLOT(update()));
-	connect(editAction, SIGNAL(triggered()), SLOT(edit()));
-	connect(delAction, SIGNAL(triggered()), SLOT(del()));
-	connect(UltimateLyrics::self(), SIGNAL(lyricsReady(int, QString)), SLOT(lyricsReady(int, QString)));
+	connect(scrollAction, &Action::toggled, this, &SongView::toggleScroll);
+	connect(refreshAction, &Action::triggered, this, qOverload<>(&SongView::update));
+	connect(editAction, &Action::triggered, this, &SongView::edit);
+	connect(delAction, &Action::triggered, this, &SongView::del);
+	connect(UltimateLyrics::self(), &UltimateLyrics::lyricsReady, this, &SongView::lyricsReady);
 
 	engine = ContextEngine::create(this);
 	refreshInfoAction = ActionCollection::get()->createAction("refreshtrack", tr("Refresh Track Information"), Icons::self()->refreshIcon);
-	cancelInfoJobAction = new Action(Icons::self()->cancelIcon, tr("Cancel"), this);
+	cancelInfoJobAction = new Action(Icons::self()->cancelIcon, tr("Cancel"), this, this, &SongView::abortInfoSearch);
 	cancelInfoJobAction->setEnabled(false);
-	connect(refreshInfoAction, SIGNAL(triggered()), SLOT(refreshInfo()));
-	connect(cancelInfoJobAction, SIGNAL(triggered()), SLOT(abortInfoSearch()));
-	connect(engine, SIGNAL(searchResult(QString, QString)), this, SLOT(infoSearchResponse(QString, QString)));
+	connect(refreshInfoAction, &Action::triggered, this, &SongView::refreshInfo);
+	connect(engine, &ContextEngine::searchResult, this, &SongView::infoSearchResponse);
 	for (TextBrowser* t : texts) {
-		connect(t, SIGNAL(anchorClicked(QUrl)), SLOT(showMoreInfo(QUrl)));
+		connect(t, &TextBrowser::anchorClicked, this, &SongView::showMoreInfo);
 	}
 
 	text->setContextMenuPolicy(Qt::CustomContextMenu);
-	connect(text, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(showContextMenu(QPoint)));
+	connect(text, &TextBrowser::customContextMenuRequested, this, &SongView::showContextMenu);
 	texts.at(Page_Information)->setContextMenuPolicy(Qt::CustomContextMenu);
-	connect(texts.at(Page_Information), SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(showInfoContextMenu(QPoint)));
-	connect(this, SIGNAL(viewChanged()), this, SLOT(curentViewChanged()));
+	connect(texts.at(Page_Information), &TextBrowser::customContextMenuRequested, this, &SongView::showInfoContextMenu);
+	connect(this, &SongView::viewChanged, this, &SongView::curentViewChanged);
 	setMode(Mode_Blank);
 	setStandardHeader(tr("Track"));
 	clear();
@@ -274,14 +273,14 @@ void SongView::toggleScroll()
 		scrollTimer = new QTimer(this);
 		scrollTimer->setSingleShot(false);
 		scrollTimer->setInterval(1000);
-		connect(MPDStatus::self(), SIGNAL(updated()), this, SLOT(songPosition()));
-		connect(scrollTimer, SIGNAL(timeout()), this, SLOT(scroll()));
+		connect(MPDStatus::self(), &MPDStatus::updated, this, &SongView::songPosition);
+		connect(scrollTimer, &QTimer::timeout, this, &SongView::scroll);
 		scroll();
 	}
 	else {
-		disconnect(MPDStatus::self(), SIGNAL(updated()), this, SLOT(songPosition()));
+		disconnect(MPDStatus::self(), &MPDStatus::updated, this, &SongView::songPosition);
 		if (scrollTimer) {
-			connect(scrollTimer, SIGNAL(timeout()), this, SLOT(scroll()));
+			connect(scrollTimer, &QTimer::timeout, this, &SongView::scroll);
 			scrollTimer->stop();
 		}
 	}
@@ -360,7 +359,7 @@ void SongView::loadLyrics()
 			QUrl url(mpdLyrics);
 			job = NetworkAccessManager::self()->get(url);
 			job->setProperty("file", currentSong.file);
-			connect(job, SIGNAL(finished()), this, SLOT(downloadFinished()));
+			connect(job, &NetworkJob::finished, this, &SongView::downloadFinished);
 			return;
 		}
 	}
diff --git a/context/togglelist.cpp b/context/togglelist.cpp
index 1755ee330..1fa61c5a6 100644
--- a/context/togglelist.cpp
+++ b/context/togglelist.cpp
@@ -31,12 +31,12 @@ ToggleList::ToggleList(QWidget* p)
 	: QWidget(p)
 {
 	setupUi(this);
-	connect(upButton, SIGNAL(clicked()), SLOT(moveUp()));
-	connect(downButton, SIGNAL(clicked()), SLOT(moveDown()));
-	connect(addButton, SIGNAL(clicked()), SLOT(add()));
-	connect(removeButton, SIGNAL(clicked()), SLOT(remove()));
-	connect(available, SIGNAL(currentItemChanged(QListWidgetItem*, QListWidgetItem*)), SLOT(availableChanged(QListWidgetItem*)));
-	connect(selected, SIGNAL(currentItemChanged(QListWidgetItem*, QListWidgetItem*)), SLOT(selectedChanged(QListWidgetItem*)));
+	connect(upButton, &FlatToolButton::clicked, this, &ToggleList::moveUp);
+	connect(downButton, &FlatToolButton::clicked, this, &ToggleList::moveDown);
+	connect(addButton, &FlatToolButton::clicked, this, &ToggleList::add);
+	connect(removeButton, &FlatToolButton::clicked, this, &ToggleList::remove);
+	connect(available, &QListWidget::currentItemChanged, this, &ToggleList::availableChanged);
+	connect(selected, &QListWidget::currentItemChanged, this, &ToggleList::selectedChanged);
 	upButton->setIcon(Icons::self()->upIcon);
 	downButton->setIcon(Icons::self()->downIcon);
 	bool rtl = isRightToLeft();
diff --git a/context/ultimatelyrics.cpp b/context/ultimatelyrics.cpp
index 8c98514de..275991cfe 100644
--- a/context/ultimatelyrics.cpp
+++ b/context/ultimatelyrics.cpp
@@ -184,7 +184,7 @@ void UltimateLyrics::load()
 						UltimateLyricsProvider* provider = parseProvider(&reader);
 						if (provider) {
 							providers << provider;
-							connect(provider, SIGNAL(lyricsReady(int, QString)), this, SIGNAL(lyricsReady(int, QString)));
+							connect(provider, &UltimateLyricsProvider::lyricsReady, this, &UltimateLyrics::lyricsReady);
 							providerNames.insert(name);
 						}
 					}
diff --git a/context/ultimatelyricsprovider.cpp b/context/ultimatelyricsprovider.cpp
index 91b832ea9..7ae9f1f56 100644
--- a/context/ultimatelyricsprovider.cpp
+++ b/context/ultimatelyricsprovider.cpp
@@ -247,7 +247,7 @@ void UltimateLyricsProvider::fetchInfo(int id, Song metadata, bool removeThe)
 
 		NetworkJob* reply = NetworkAccessManager::self()->get(url);
 		requests[reply] = id;
-		connect(reply, SIGNAL(finished()), this, SLOT(wikiMediaSearchResponse()));
+		connect(reply, &NetworkJob::finished, this, &UltimateLyricsProvider::wikiMediaSearchResponse);
 		return;
 	}
 
@@ -287,7 +287,7 @@ void UltimateLyricsProvider::fetchInfo(int id, Song metadata, bool removeThe)
 	req.setRawHeader("User-Agent", "Mozilla/5.0 (X11; Linux i686; rv:6.0) Gecko/20100101 Firefox/6.0");
 	NetworkJob* reply = NetworkAccessManager::self()->get(req);
 	requests[reply] = id;
-	connect(reply, SIGNAL(finished()), this, SLOT(lyricsFetched()));
+	connect(reply, &NetworkJob::finished, this, &UltimateLyricsProvider::lyricsFetched);
 }
 
 void UltimateLyricsProvider::abort()
@@ -342,7 +342,7 @@ void UltimateLyricsProvider::wikiMediaSearchResponse()
 		QByteArray titles = QUrl::toPercentEncoding(path.startsWith(QLatin1Char('/')) ? path.mid(1) : path).replace('+', "%2b");
 		NetworkJob* reply = NetworkAccessManager::self()->get(QUrl::fromEncoded(u + titles));
 		requests[reply] = id;
-		connect(reply, SIGNAL(finished()), this, SLOT(wikiMediaLyricsFetched()));
+		connect(reply, &NetworkJob::finished, this, &UltimateLyricsProvider::wikiMediaLyricsFetched);
 	}
 	else {
 		emit lyricsReady(id, QString());
diff --git a/context/view.cpp b/context/view.cpp
index 251734827..f7165643f 100644
--- a/context/view.cpp
+++ b/context/view.cpp
@@ -105,8 +105,8 @@ View::View(QWidget* parent, const QStringList& views)
 			stack->addWidget(t);
 			texts.append(t);
 		}
-		connect(selector, SIGNAL(activated(int)), stack, SLOT(setCurrentIndex(int)));
-		connect(selector, SIGNAL(activated(int)), this, SIGNAL(viewChanged()));
+		connect(selector, &SelectorLabel::activated, stack, &QStackedWidget::setCurrentIndex);
+		connect(selector, &SelectorLabel::activated, this, &View::viewChanged);
 	}
 
 	header->setWordWrap(true);
@@ -130,7 +130,7 @@ View::View(QWidget* parent, const QStringList& views)
 
 	cancelJobAction = new Action(Icons::self()->cancelIcon, tr("Cancel"), this);
 	cancelJobAction->setEnabled(false);
-	connect(cancelJobAction, SIGNAL(triggered()), SLOT(abort()));
+	connect(cancelJobAction, &Action::triggered, this, &View::abort);
 	text = texts.at(0);
 	setMinimumWidth(Utils::scaleForDpi(300));
 }
diff --git a/context/wikipediaengine.cpp b/context/wikipediaengine.cpp
index 7dc6fdfc8..9ef7cccce 100644
--- a/context/wikipediaengine.cpp
+++ b/context/wikipediaengine.cpp
@@ -382,7 +382,7 @@ void WikipediaEngine::requestTitles(const QStringList& query, Mode mode, const Q
 	job->setProperty(constModeProperty, (int)mode);
 	job->setProperty(constQueryProperty, query);
 	DBUG << url.toString();
-	connect(job, SIGNAL(finished()), this, SLOT(parseTitles()));
+	connect(job, &NetworkJob::finished, this, &WikipediaEngine::parseTitles);
 }
 
 void WikipediaEngine::parseTitles()
@@ -573,7 +573,7 @@ void WikipediaEngine::getPage(const QStringList& query, Mode mode, const QString
 	job->setProperty(constModeProperty, (int)mode);
 	job->setProperty(constQueryProperty, query);
 	DBUG << url.toString();
-	connect(job, SIGNAL(finished()), this, SLOT(parsePage()));
+	connect(job, &NetworkJob::finished, this, &WikipediaEngine::parsePage);
 }
 
 void WikipediaEngine::parsePage()
diff --git a/context/wikipediasettings.cpp b/context/wikipediasettings.cpp
index abc539d15..72f6cf28a 100644
--- a/context/wikipediasettings.cpp
+++ b/context/wikipediasettings.cpp
@@ -89,7 +89,7 @@ WikipediaSettings::WikipediaSettings(QWidget* p)
 {
 	label->setText(tr("Choose the wikipedia languages you want to use when searching for artist and album information."));
 	reload = new Action(tr("Reload"), this);
-	connect(reload, SIGNAL(triggered()), this, SLOT(getLangs()));
+	connect(reload, &Action::triggered, this, &WikipediaSettings::getLangs);
 	available->addAction(reload);
 	available->setContextMenuPolicy(Qt::ActionsContextMenu);
 }
@@ -148,7 +148,7 @@ void WikipediaSettings::save()
 void WikipediaSettings::cancel()
 {
 	if (job) {
-		disconnect(job, SIGNAL(finished()), this, SLOT(parseLangs()));
+		disconnect(job, &NetworkJob::finished, this, qOverload<>(&WikipediaSettings::parseLangs));
 		job->deleteLater();
 		job = nullptr;
 	}
@@ -174,7 +174,7 @@ void WikipediaSettings::getLangs()
 	url.setQuery(q);
 
 	job = NetworkAccessManager::self()->get(url);
-	connect(job, SIGNAL(finished()), this, SLOT(parseLangs()));
+	connect(job, &NetworkJob::finished, this, qOverload<>(&WikipediaSettings::parseLangs));
 }
 
 void WikipediaSettings::parseLangs()
@@ -202,9 +202,9 @@ void WikipediaSettings::parseLangs(const QByteArray& data)
 	prefMap.clear();
 	if (!loader) {
 		loader = new WikipediaLoader();
-		connect(loader, SIGNAL(entry(QString, QString, QString, int)), SLOT(addEntry(QString, QString, QString, int)));
-		connect(loader, SIGNAL(finished()), SLOT(loaderFinished()));
-		connect(this, SIGNAL(load(QByteArray)), loader, SLOT(load(QByteArray)));
+		connect(loader, &WikipediaLoader::entry, this, &WikipediaSettings::addEntry);
+		connect(loader, &WikipediaLoader::finished, this, &WikipediaSettings::loaderFinished);
+		connect(this, qOverload<const QByteArray&>(&WikipediaSettings::load), loader, &WikipediaLoader::load);
 	}
 	emit load(data);
 }
diff --git a/db/mpdlibrarydb.cpp b/db/mpdlibrarydb.cpp
index 5731c3a9a..e95c5f6c2 100644
--- a/db/mpdlibrarydb.cpp
+++ b/db/mpdlibrarydb.cpp
@@ -68,12 +68,12 @@ void MpdLibraryDb::removeUnusedDbs()
 MpdLibraryDb::MpdLibraryDb(QObject* p)
 	: LibraryDb(p, "MPD"), loading(false), coverQuery(nullptr), albumIdOnlyCoverQuery(nullptr), artistImageQuery(nullptr)
 {
-	connect(MPDConnection::self(), SIGNAL(updatingLibrary(time_t)), this, SLOT(updateStarted(time_t)));
-	connect(MPDConnection::self(), SIGNAL(librarySongs(QList<Song>*)), this, SLOT(insertSongs(QList<Song>*)));
-	connect(MPDConnection::self(), SIGNAL(updatedLibrary()), this, SLOT(updateFinished()));
-	connect(MPDConnection::self(), SIGNAL(statsUpdated(MPDStatsValues)), this, SLOT(statsUpdated(MPDStatsValues)));
-	connect(this, SIGNAL(loadLibrary()), MPDConnection::self(), SLOT(loadLibrary()));
-	connect(MPDConnection::self(), SIGNAL(connectionChanged(MPDConnectionDetails)), this, SLOT(connectionChanged(MPDConnectionDetails)));
+	connect(MPDConnection::self(), &MPDConnection::updatingLibrary, this, &MpdLibraryDb::updateStarted);
+	connect(MPDConnection::self(), &MPDConnection::librarySongs, this, &MpdLibraryDb::insertSongs);
+	connect(MPDConnection::self(), &MPDConnection::updatedLibrary, this, &MpdLibraryDb::updateFinished);
+	connect(MPDConnection::self(), &MPDConnection::statsUpdated, this, &MpdLibraryDb::statsUpdated);
+	connect(this, &MpdLibraryDb::loadLibrary, MPDConnection::self(), &MPDConnection::loadLibrary);
+	connect(MPDConnection::self(), &MPDConnection::connectionChanged, this, &MpdLibraryDb::connectionChanged);
 	DBUG;
 }
 
diff --git a/dbus/gnomemediakeys.cpp b/dbus/gnomemediakeys.cpp
index 4124fe229..80529b0b6 100644
--- a/dbus/gnomemediakeys.cpp
+++ b/dbus/gnomemediakeys.cpp
@@ -73,7 +73,7 @@ bool GnomeMediaKeys::daemonIsRunning()
 		QDBusConnection::sessionBus().interface()->startService(constOrigService);// ??
 		if (!daemon) {
 			daemon = new OrgGnomeSettingsDaemonInterface(constOrigService, constDaemonPath, QDBusConnection::sessionBus(), this);
-			connect(daemon, SIGNAL(PluginActivated(QString)), this, SLOT(pluginActivated(QString)));
+			connect(daemon, &OrgGnomeSettingsDaemonInterface::PluginActivated, this, &GnomeMediaKeys::pluginActivated);
 			daemon->Start();
 			return false;
 		}
@@ -85,7 +85,7 @@ void GnomeMediaKeys::releaseKeys()
 {
 	if (mk) {
 		mk->ReleaseMediaPlayerKeys(QCoreApplication::applicationName());
-		disconnect(mk, SIGNAL(MediaPlayerKeyPressed(QString, QString)), this, SLOT(keyPressed(QString, QString)));
+		disconnect(mk, &OrgGnomeSettingsDaemonMediaKeysInterface::MediaPlayerKeyPressed, this, &GnomeMediaKeys::keyPressed);
 		mk->deleteLater();
 		mk = nullptr;
 	}
@@ -102,13 +102,13 @@ void GnomeMediaKeys::grabKeys()
 
 			QDBusPendingReply<> reply = mk->GrabMediaPlayerKeys(QCoreApplication::applicationName(), QDateTime::currentDateTime().toSecsSinceEpoch());
 			QDBusPendingCallWatcher* callWatcher = new QDBusPendingCallWatcher(reply, this);
-			connect(callWatcher, SIGNAL(finished(QDBusPendingCallWatcher*)), this, SLOT(registerFinished(QDBusPendingCallWatcher*)));
+			connect(callWatcher, &QDBusPendingCallWatcher::finished, this, &GnomeMediaKeys::registerFinished);
 
 			if (!watcher) {
 				watcher = new QDBusServiceWatcher(this);
 				watcher->setConnection(QDBusConnection::sessionBus());
 				watcher->setWatchMode(QDBusServiceWatcher::WatchForOwnerChange);
-				connect(watcher, SIGNAL(serviceOwnerChanged(QString, QString, QString)), this, SLOT(serviceOwnerChanged(QString, QString, QString)));
+				connect(watcher, &QDBusServiceWatcher::serviceOwnerChanged, this, &GnomeMediaKeys::serviceOwnerChanged);
 			}
 			serviceName = service;
 			break;
@@ -119,7 +119,7 @@ void GnomeMediaKeys::grabKeys()
 void GnomeMediaKeys::disconnectDaemon()
 {
 	if (daemon) {
-		disconnect(daemon, SIGNAL(PluginActivated(QString)), this, SLOT(pluginActivated(QString)));
+		disconnect(daemon, &OrgGnomeSettingsDaemonInterface::PluginActivated, this, &GnomeMediaKeys::pluginActivated);
 		daemon->deleteLater();
 		daemon = nullptr;
 	}
@@ -142,7 +142,7 @@ void GnomeMediaKeys::registerFinished(QDBusPendingCallWatcher* watcher)
 	watcher->deleteLater();
 
 	if (QDBusMessage::ErrorMessage != reply.type()) {
-		connect(mk, SIGNAL(MediaPlayerKeyPressed(QString, QString)), this, SLOT(keyPressed(QString, QString)));
+		connect(mk, &OrgGnomeSettingsDaemonMediaKeysInterface::MediaPlayerKeyPressed, this, &GnomeMediaKeys::keyPressed);
 		disconnectDaemon();
 	}
 }
diff --git a/dbus/mpris.cpp b/dbus/mpris.cpp
index 7a97ac6b0..07af355e8 100644
--- a/dbus/mpris.cpp
+++ b/dbus/mpris.cpp
@@ -43,16 +43,16 @@ Mpris::Mpris(QObject* p)
 	new MediaPlayer2Adaptor(this);
 
 	QDBusConnection::sessionBus().registerObject("/org/mpris/MediaPlayer2", this, QDBusConnection::ExportAdaptors);
-	connect(this, SIGNAL(setRandom(bool)), MPDConnection::self(), SLOT(setRandom(bool)));
-	connect(this, SIGNAL(setRepeat(bool)), MPDConnection::self(), SLOT(setRepeat(bool)));
-	connect(this, SIGNAL(setSingle(bool)), MPDConnection::self(), SLOT(setSingle(bool)));
-	connect(this, SIGNAL(setSeekId(qint32, quint32)), MPDConnection::self(), SLOT(setSeekId(qint32, quint32)));
-	connect(this, SIGNAL(seek(qint32)), MPDConnection::self(), SLOT(seek(qint32)));
-	connect(this, SIGNAL(setVolume(int)), MPDConnection::self(), SLOT(setVolume(int)));
-
-	//    connect(MPDConnection::self(), SIGNAL(currentSongUpdated(const Song &)), this, SLOT(updateCurrentSong(const Song &)));
-	//    connect(MPDStatus::self(), SIGNAL(updated()), this, SLOT(updateStatus()));
-	connect(CurrentCover::self(), SIGNAL(coverFile(const QString&)), this, SLOT(updateCurrentCover(const QString&)));
+	connect(this, &Mpris::setRandom, MPDConnection::self(), &MPDConnection::setRandom);
+	connect(this, &Mpris::setRepeat, MPDConnection::self(), &MPDConnection::setRepeat);
+	connect(this, &Mpris::setSingle, MPDConnection::self(), &MPDConnection::setSingle);
+	connect(this, &Mpris::setSeekId, MPDConnection::self(), &MPDConnection::setSeekId);
+	connect(this, &Mpris::seek, MPDConnection::self(), &MPDConnection::seek);
+	connect(this, &Mpris::setVolume, MPDConnection::self(), &MPDConnection::setVolume);
+
+	//    connect(MPDConnection::self(), &MPDConnection::currentSongUpdated, this, &Mpris::updateCurrentSong);
+	//    connect(MPDStatus::self(), &MPDStatus::updated, this, &Mpris::updateStatus);
+	connect(CurrentCover::self(), &CurrentCover::coverFile, this, &Mpris::updateCurrentCover);
 }
 
 Mpris::~Mpris()
diff --git a/dbus/powermanagement.cpp b/dbus/powermanagement.cpp
index 85940566a..011765d03 100644
--- a/dbus/powermanagement.cpp
+++ b/dbus/powermanagement.cpp
@@ -46,8 +46,8 @@ PowerManagement::PowerManagement()
 	                                           QLatin1String("/org/freedesktop/UPower"), QDBusConnection::systemBus(), this);
 	login1 = new OrgFreedesktopLogin1ManagerInterface("org.freedesktop.login1",
 	                                                  QLatin1String("/org/freedesktop/login1"), QDBusConnection::systemBus(), this);
-	connect(upower, SIGNAL(Resuming()), this, SIGNAL(resuming()));
-	connect(login1, SIGNAL(PrepareForSleep(bool)), this, SLOT(prepareForSleep(bool)));
+	connect(upower, &OrgFreedesktopUPowerInterface::Resuming, this, &PowerManagement::resuming);
+	connect(login1, &OrgFreedesktopLogin1ManagerInterface::PrepareForSleep, this, &PowerManagement::prepareForSleep);
 }
 
 void PowerManagement::setInhibitSuspend(bool i)
@@ -58,13 +58,13 @@ void PowerManagement::setInhibitSuspend(bool i)
 	inhibitSuspendWhilstPlaying = i;
 
 	if (inhibitSuspendWhilstPlaying) {
-		connect(MPDStatus::self(), SIGNAL(updated()), this, SLOT(mpdStatusUpdated()));
+		connect(MPDStatus::self(), &MPDStatus::updated, this, &PowerManagement::mpdStatusUpdated);
 		if (MPDState_Playing == MPDStatus::self()->state()) {
 			beginSuppressingSleep();
 		}
 	}
 	else {
-		disconnect(MPDStatus::self(), SIGNAL(updated()), this, SLOT(mpdStatusUpdated()));
+		disconnect(MPDStatus::self(), &MPDStatus::updated, this, &PowerManagement::mpdStatusUpdated);
 		stopSuppressingSleep();
 	}
 }
diff --git a/devices/actiondialog.cpp b/devices/actiondialog.cpp
index f340dd902..d8e23ab97 100644
--- a/devices/actiondialog.cpp
+++ b/devices/actiondialog.cpp
@@ -79,10 +79,10 @@ ActionDialog::ActionDialog(QWidget* parent)
 	skipIcon->setPixmap(style()->standardIcon(QStyle::SP_MessageBoxWarning).pixmap(64, 64));
 	configureSourceButton->setIcon(Icons::self()->configureIcon);
 	configureDestButton->setIcon(Icons::self()->configureIcon);
-	connect(configureSourceButton, SIGNAL(clicked()), SLOT(configureSource()));
-	connect(configureDestButton, SIGNAL(clicked()), SLOT(configureDest()));
-	connect(this, SIGNAL(update()), MPDConnection::self(), SLOT(update()));
-	//    connect(songCount, SIGNAL(leftClickedUrl()), SLOT(showSongs()));
+	connect(configureSourceButton, &QToolButton::clicked, this, &ActionDialog::configureSource);
+	connect(configureDestButton, &QToolButton::clicked, this, &ActionDialog::configureDest);
+	connect(this, &ActionDialog::update, MPDConnection::self(), &MPDConnection::update);
+	//    connect(songCount, &QLabel::leftClickedUrl, this, &ActionDialog::showSongs);
 #ifdef QT_QTDBUS_FOUND
 	unityMessage = QDBusMessage::createSignal("/Cantata", "com.canonical.Unity.LauncherEntry", "Update");
 #endif
@@ -207,7 +207,7 @@ void ActionDialog::calcFileSize()
 	}
 	fileSizeProgress->setValue(fileSizeProgress->value() + toCalc);
 	if (!songsToCalcSize.isEmpty()) {
-		QTimer::singleShot(0, this, SLOT(calcFileSize()));
+		QTimer::singleShot(0, this, &ActionDialog::calcFileSize);
 	}
 	else {
 		qint64 spaceAvailable = 0;
@@ -485,7 +485,7 @@ void ActionDialog::slotButtonClicked(int button)
 
 			if (dev) {
 				if (Close == button) {// Close is only enabled when saving cache...
-					disconnect(dev, SIGNAL(cacheSaved()), this, SLOT(cacheSaved()));
+					disconnect(dev, &Device::cacheSaved, this, &ActionDialog::cacheSaved);
 				}
 				else {
 					dev->abortJob();
@@ -566,8 +566,8 @@ void ActionDialog::doNext()
 
 			if (dev) {
 				if (!currentDev) {
-					connect(dev, SIGNAL(actionStatus(int, bool)), this, SLOT(actionStatus(int, bool)));
-					connect(dev, SIGNAL(progress(int)), this, SLOT(jobPercent(int)));
+					connect(dev, &Device::actionStatus, this, &ActionDialog::actionStatus);
+					connect(dev, &Device::progress, this, &ActionDialog::jobPercent);
 					currentDev = dev;
 				}
 				performingAction = true;
@@ -597,7 +597,7 @@ void ActionDialog::doNext()
 				Device* dev = getDevice(sourceUdi);
 				if (dev) {
 					if (dev != currentDev) {
-						connect(dev, SIGNAL(actionStatus(int)), this, SLOT(actionStatus(int)));
+						connect(dev, &Device::actionStatus, this, &ActionDialog::actionStatus);
 						currentDev = dev;
 					}
 					performingAction = true;
@@ -750,20 +750,20 @@ void ActionDialog::configure(const QString& udi)
 {
 	if (udi.isEmpty()) {
 		DevicePropertiesDialog* dlg = new DevicePropertiesDialog(this);
-		connect(dlg, SIGNAL(updatedSettings(const QString&, const DeviceOptions&)), SLOT(saveProperties(const QString&, const DeviceOptions&)));
+		connect(dlg, &DevicePropertiesDialog::updatedSettings, this, qOverload<const QString&, const DeviceOptions&>(&ActionDialog::saveProperties));
 		if (!mpdConfigured) {
-			connect(dlg, SIGNAL(cancelled()), SLOT(saveProperties()));
+			connect(dlg, &DevicePropertiesDialog::cancelled, this, qOverload<>(&ActionDialog::saveProperties));
 		}
 		dlg->setCaption(tr("Local Music Library Properties"));
 		dlg->show(MPDConnection::self()->getDetails().dir, namingOptions, DevicePropertiesWidget::Prop_Basic | DevicePropertiesWidget::Prop_FileName | (sourceIsAudioCd ? DevicePropertiesWidget::Prop_Encoder : 0));
-		connect(dlg, SIGNAL(destroyed()), SLOT(controlInfoLabel()));
+		connect(dlg, &DevicePropertiesDialog::destroyed, this, qOverload<>(&ActionDialog::controlInfoLabel));
 	}
 	else {
 		Device* dev = DevicesModel::self()->device(udi);
 		if (dev) {
 			dev->configure(this);
-			connect(dev, SIGNAL(configurationChanged()), SLOT(controlInfoLabel()));
-			connect(dev, SIGNAL(renamed()), SLOT(deviceRenamed()));
+			connect(dev, &Device::configurationChanged, this, qOverload<>(&ActionDialog::controlInfoLabel));
+			connect(dev, &Device::renamed, this, &ActionDialog::deviceRenamed);
 		}
 	}
 }
@@ -856,7 +856,7 @@ bool ActionDialog::refreshLibrary()
 			Device* dev = DevicesModel::self()->device(sourceUdi.isEmpty() ? destUdi : sourceUdi);
 
 			if (dev && dev->options().useCache) {
-				connect(dev, SIGNAL(cacheSaved()), this, SLOT(cacheSaved()));
+				connect(dev, &Device::cacheSaved, this, &ActionDialog::cacheSaved);
 				dev->saveCache();
 				progressLabel->setText(tr("Saving cache"));
 				setButtons(Close);
@@ -872,7 +872,7 @@ bool ActionDialog::refreshLibrary()
 			Device* dev = DevicesModel::self()->device(sourceUdi.isEmpty() ? destUdi : sourceUdi);
 
 			if (dev && dev->options().useCache) {
-				connect(dev, SIGNAL(cacheSaved()), this, SLOT(cacheSaved()));
+				connect(dev, &Device::cacheSaved, this, &ActionDialog::cacheSaved);
 				dev->saveCache();
 				progressLabel->setText(tr("Saving cache"));
 				setButtons(Close);
@@ -891,7 +891,7 @@ void ActionDialog::removeSong(const Song& s)
 	}
 
 	DeleteJob* job = new DeleteJob(s.file, true);
-	connect(job, SIGNAL(result(int)), SLOT(removeSongResult(int)));
+	connect(job, &DeleteJob::result, this, &ActionDialog::removeSongResult);
 	job->start();
 }
 
@@ -911,8 +911,8 @@ void ActionDialog::removeSongResult(int status)
 void ActionDialog::cleanDirs()
 {
 	CleanJob* job = new CleanJob(dirsToClean, MPDConnection::self()->getDetails().dir, QString());
-	connect(job, SIGNAL(result(int)), SLOT(cleanDirsResult(int)));
-	connect(job, SIGNAL(percent(int)), SLOT(jobPercent(int)));
+	connect(job, &CleanJob::result, this, &ActionDialog::cleanDirsResult);
+	connect(job, &CleanJob::percent, this, &ActionDialog::jobPercent);
 	job->start();
 }
 
diff --git a/devices/albumdetailsdialog.cpp b/devices/albumdetailsdialog.cpp
index b7f3bb87f..0592baf6c 100644
--- a/devices/albumdetailsdialog.cpp
+++ b/devices/albumdetailsdialog.cpp
@@ -142,13 +142,13 @@ AlbumDetailsDialog::AlbumDetailsDialog(QWidget* parent)
 	genre->insertItems(0, strings);
 
 	QMenu* toolsMenu = new QMenu(this);
-	toolsMenu->addAction(tr("Apply \"Various Artists\" Workaround"), this, SLOT(applyVa()));
-	toolsMenu->addAction(tr("Revert \"Various Artists\" Workaround"), this, SLOT(revertVa()));
-	toolsMenu->addAction(tr("Capitalize"), this, SLOT(capitalise()));
-	toolsMenu->addAction(tr("Adjust Track Numbers"), this, SLOT(adjustTrackNumbers()));
+	toolsMenu->addAction(tr("Apply \"Various Artists\" Workaround"), this, &AlbumDetailsDialog::applyVa);
+	toolsMenu->addAction(tr("Revert \"Various Artists\" Workaround"), this, &AlbumDetailsDialog::revertVa);
+	toolsMenu->addAction(tr("Capitalize"), this, &AlbumDetailsDialog::capitalise);
+	toolsMenu->addAction(tr("Adjust Track Numbers"), this, &AlbumDetailsDialog::adjustTrackNumbers);
 	setButtonMenu(User1, toolsMenu, InstantPopup);
 	setButtonGuiItem(User1, GuiItem(tr("Tools"), "tools-wizard"));
-	connect(singleArtist, SIGNAL(toggled(bool)), SLOT(hideArtistColumn(bool)));
+	connect(singleArtist, &QCheckBox::toggled, this, &AlbumDetailsDialog::hideArtistColumn);
 	resize(600, 600);
 
 	int size = fontMetrics().height() * 5;
@@ -381,7 +381,7 @@ bool AlbumDetailsDialog::eventFilter(QObject* object, QEvent* event)
 		if (pressed && Qt::LeftButton == static_cast<QMouseEvent*>(event)->button()) {
 			if (0 == CoverDialog::instanceCount()) {
 				CoverDialog* dlg = new CoverDialog(this);
-				connect(dlg, SIGNAL(selectedCover(QImage, QString)), this, SLOT(coverSelected(QImage, QString)));
+				connect(dlg, &CoverDialog::selectedCover, this, &AlbumDetailsDialog::coverSelected);
 				Song s;
 				s.file = AudioCdDevice::coverUrl(udi);
 				s.artist = artist->text().trimmed();
diff --git a/devices/audiocddevice.cpp b/devices/audiocddevice.cpp
index 677257263..e03e7bf74 100644
--- a/devices/audiocddevice.cpp
+++ b/devices/audiocddevice.cpp
@@ -119,8 +119,8 @@ AudioCdDevice::AudioCdDevice(MusicLibraryModel* m, Solid::Device& dev)
 		detailsString = tr("Reading disc");
 		setStatusMessage(detailsString);
 		lookupInProcess = true;
-		connect(Covers::self(), SIGNAL(cover(const Song&, const QImage&, const QString&)),
-		        this, SLOT(setCover(const Song&, const QImage&, const QString&)));
+		connect(Covers::self(), &Covers::cover,
+		        this, qOverload<const Song&, const QImage&, const QString&>(&AudioCdDevice::setCover));
 		emit lookup(Settings::self()->cdAuto());
 	}
 }
@@ -188,10 +188,10 @@ void AudioCdDevice::connectService(bool useCddb)
 #endif
 	) {
 		cddb = new CddbInterface(device);
-		connect(cddb, SIGNAL(error(QString)), this, SIGNAL(error(QString)));
-		connect(cddb, SIGNAL(initialDetails(CdAlbum)), this, SLOT(setDetails(CdAlbum)));
-		connect(cddb, SIGNAL(matches(const QList<CdAlbum>&)), SLOT(cdMatches(const QList<CdAlbum>&)));
-		connect(this, SIGNAL(lookup(bool)), cddb, SLOT(lookup(bool)));
+		connect(cddb, &CddbInterface::error, this, &AudioCdDevice::error);
+		connect(cddb, &CddbInterface::initialDetails, this, &AudioCdDevice::setDetails);
+		connect(cddb, &CddbInterface::matches, this, &AudioCdDevice::cdMatches);
+		connect(this, &AudioCdDevice::lookup, cddb, &CddbInterface::lookup);
 	}
 #endif
 
@@ -202,10 +202,10 @@ void AudioCdDevice::connectService(bool useCddb)
 #endif
 	) {
 		mb = new MusicBrainz(device);
-		connect(mb, SIGNAL(error(QString)), this, SIGNAL(error(QString)));
-		connect(mb, SIGNAL(initialDetails(CdAlbum)), this, SLOT(setDetails(CdAlbum)));
-		connect(mb, SIGNAL(matches(const QList<CdAlbum>&)), SLOT(cdMatches(const QList<CdAlbum>&)));
-		connect(this, SIGNAL(lookup(bool)), mb, SLOT(lookup(bool)));
+		connect(mb, &MusicBrainz::error, this, &AudioCdDevice::error);
+		connect(mb, &MusicBrainz::initialDetails, this, &AudioCdDevice::setDetails);
+		connect(mb, &MusicBrainz::matches, this, &AudioCdDevice::cdMatches);
+		connect(this, &AudioCdDevice::lookup, mb, &MusicBrainz::lookup);
 	}
 #endif
 }
@@ -274,8 +274,8 @@ void AudioCdDevice::copySongTo(const Song& s, const QString& musicPath, bool ove
 
 	currentSong = s;
 	ExtractJob* job = new ExtractJob(encoder, mpdOpts.transcoderValue, source, currentDestFile, currentSong, copyCover ? coverImage.fileName : QString());
-	connect(job, SIGNAL(result(int)), SLOT(copySongToResult(int)));
-	connect(job, SIGNAL(percent(int)), SLOT(percent(int)));
+	connect(job, &ExtractJob::result, this, &AudioCdDevice::copySongToResult);
+	connect(job, &ExtractJob::percent, this, &AudioCdDevice::percent);
 	job->start();
 }
 
diff --git a/devices/cddbselectiondialog.cpp b/devices/cddbselectiondialog.cpp
index cdf375cba..399fdc188 100644
--- a/devices/cddbselectiondialog.cpp
+++ b/devices/cddbselectiondialog.cpp
@@ -55,7 +55,7 @@ CddbSelectionDialog::CddbSelectionDialog(QWidget* parent)
 	setCaption(tr("Disc Selection"));
 	setMainWidget(wid);
 	setButtons(Ok);
-	connect(combo, SIGNAL(currentIndexChanged(int)), SLOT(updateTracks()));
+	connect(combo, &QComboBox::currentIndexChanged, this, &CddbSelectionDialog::updateTracks);
 }
 
 int CddbSelectionDialog::select(const QList<CdAlbum>& albums)
diff --git a/devices/device.cpp b/devices/device.cpp
index c921a3d01..4a236f730 100644
--- a/devices/device.cpp
+++ b/devices/device.cpp
@@ -312,7 +312,7 @@ Device::Device(MusicLibraryModel* m, const QString& name, const QString& id)
 
 void Device::saveCache()
 {
-	QTimer::singleShot(0, this, SIGNAL(cacheSaved()));
+	QTimer::singleShot(0, this, &Device::cacheSaved);
 }
 
 void Device::applyUpdate()
diff --git a/devices/devicepropertiesdialog.cpp b/devices/devicepropertiesdialog.cpp
index dbae9536f..0b7ef9b9a 100644
--- a/devices/devicepropertiesdialog.cpp
+++ b/devices/devicepropertiesdialog.cpp
@@ -40,7 +40,7 @@ DevicePropertiesDialog::DevicePropertiesDialog(QWidget* parent)
 void DevicePropertiesDialog::show(const QString& path, const DeviceOptions& opts, const QList<DeviceStorage>& storage, int props, int disabledProps)
 {
 	devProp->update(path, opts, storage, props, disabledProps);
-	connect(devProp, SIGNAL(updated()), SLOT(enableOkButton()));
+	connect(devProp, &DevicePropertiesWidget::updated, this, &DevicePropertiesDialog::enableOkButton);
 	Dialog::show();
 	enableButtonOk(false);
 }
diff --git a/devices/devicepropertieswidget.cpp b/devices/devicepropertieswidget.cpp
index 599a23e4c..b18314508 100644
--- a/devices/devicepropertieswidget.cpp
+++ b/devices/devicepropertieswidget.cpp
@@ -119,7 +119,7 @@ void DevicePropertiesWidget::update(const QString& path, const DeviceOptions& op
 	}
 	if (props & Prop_Name) {
 		name->setText(opts.name);
-		connect(name, SIGNAL(textChanged(const QString&)), SLOT(checkSaveable()));
+		connect(name, &LineEdit::textChanged, this, &DevicePropertiesWidget::checkSaveable);
 	}
 	else {
 		REMOVE(name)
@@ -145,7 +145,7 @@ void DevicePropertiesWidget::update(const QString& path, const DeviceOptions& op
 
 	if (props & Prop_Folder) {
 		musicFolder->setText(Utils::convertPathForDisplay(path));
-		connect(musicFolder, SIGNAL(textChanged(const QString&)), this, SLOT(checkSaveable()));
+		connect(musicFolder, &PathRequester::textChanged, this, &DevicePropertiesWidget::checkSaveable);
 		if (disabledProps & Prop_Folder) {
 			musicFolder->setDisabled(true);
 		}
@@ -184,8 +184,8 @@ void DevicePropertiesWidget::update(const QString& path, const DeviceOptions& op
 			coverMaxSize->setCurrentIndex(0);
 		}
 		albumCovers->setValidator(new CoverNameValidator(this));
-		connect(albumCovers, SIGNAL(editTextChanged(const QString&)), this, SLOT(albumCoversChanged()));
-		connect(coverMaxSize, SIGNAL(currentIndexChanged(int)), this, SLOT(checkSaveable()));
+		connect(albumCovers, &QComboBox::editTextChanged, this, &DevicePropertiesWidget::albumCoversChanged);
+		connect(coverMaxSize, &QComboBox::currentIndexChanged, this, &DevicePropertiesWidget::checkSaveable);
 	}
 	else {
 		REMOVE(albumCovers);
@@ -195,21 +195,21 @@ void DevicePropertiesWidget::update(const QString& path, const DeviceOptions& op
 	}
 	if (props & Prop_Va) {
 		fixVariousArtists->setChecked(opts.fixVariousArtists);
-		connect(fixVariousArtists, SIGNAL(stateChanged(int)), this, SLOT(checkSaveable()));
+		connect(fixVariousArtists, &QCheckBox::checkStateChanged, this, &DevicePropertiesWidget::checkSaveable);
 	}
 	else {
 		REMOVE(fixVariousArtists);
 	}
 	if (props & Prop_Cache) {
 		useCache->setChecked(opts.useCache);
-		connect(useCache, SIGNAL(stateChanged(int)), this, SLOT(checkSaveable()));
+		connect(useCache, &QCheckBox::checkStateChanged, this, &DevicePropertiesWidget::checkSaveable);
 	}
 	else {
 		REMOVE(useCache);
 	}
 	if (props & Prop_AutoScan) {
 		autoScan->setChecked(opts.autoScan);
-		connect(autoScan, SIGNAL(stateChanged(int)), this, SLOT(checkSaveable()));
+		connect(autoScan, &QCheckBox::checkStateChanged, this, &DevicePropertiesWidget::checkSaveable);
 	}
 	else {
 		REMOVE(autoScan);
@@ -233,7 +233,7 @@ void DevicePropertiesWidget::update(const QString& path, const DeviceOptions& op
 					break;
 				}
 			}
-			connect(transcoderWhen, SIGNAL(currentIndexChanged(int)), this, SLOT(checkSaveable()));
+			connect(transcoderWhen, &QComboBox::currentIndexChanged, this, &DevicePropertiesWidget::checkSaveable);
 		}
 		else {
 			transcoderFrame->setTitle(tr("Encoder"));
@@ -273,8 +273,8 @@ void DevicePropertiesWidget::update(const QString& path, const DeviceOptions& op
 				}
 			}
 		}
-		connect(transcoderName, SIGNAL(currentIndexChanged(int)), this, SLOT(transcoderChanged()));
-		connect(transcoderValue, SIGNAL(valueChanged(int)), this, SLOT(checkSaveable()));
+		connect(transcoderName, &QComboBox::currentIndexChanged, this, &DevicePropertiesWidget::transcoderChanged);
+		connect(transcoderValue, &ValueSlider::valueChanged, this, &DevicePropertiesWidget::checkSaveable);
 	}
 	else {
 		REMOVE(transcoderFrame);
@@ -298,23 +298,23 @@ void DevicePropertiesWidget::update(const QString& path, const DeviceOptions& op
 				break;
 			}
 		}
-		connect(defaultVolume, SIGNAL(currentIndexChanged(int)), this, SLOT(checkSaveable()));
+		connect(defaultVolume, &QComboBox::currentIndexChanged, this, &DevicePropertiesWidget::checkSaveable);
 	}
 
 	origMusicFolder = Utils::fixPath(path);
 	if (props & Prop_FileName) {
-		connect(configFilename, SIGNAL(clicked()), SLOT(configureFilenameScheme()));
-		connect(filenameScheme, SIGNAL(textChanged(const QString&)), this, SLOT(checkSaveable()));
-		connect(vfatSafe, SIGNAL(stateChanged(int)), this, SLOT(checkSaveable()));
-		connect(asciiOnly, SIGNAL(stateChanged(int)), this, SLOT(checkSaveable()));
-		connect(ignoreThe, SIGNAL(stateChanged(int)), this, SLOT(checkSaveable()));
-		connect(replaceSpaces, SIGNAL(stateChanged(int)), this, SLOT(checkSaveable()));
+		connect(configFilename, &QToolButton::clicked, this, &DevicePropertiesWidget::configureFilenameScheme);
+		connect(filenameScheme, &LineEdit::textChanged, this, &DevicePropertiesWidget::checkSaveable);
+		connect(vfatSafe, &QCheckBox::checkStateChanged, this, &DevicePropertiesWidget::checkSaveable);
+		connect(asciiOnly, &QCheckBox::checkStateChanged, this, &DevicePropertiesWidget::checkSaveable);
+		connect(ignoreThe, &QCheckBox::checkStateChanged, this, &DevicePropertiesWidget::checkSaveable);
+		connect(replaceSpaces, &QCheckBox::checkStateChanged, this, &DevicePropertiesWidget::checkSaveable);
 	}
 
 	if (albumCovers) {
 		albumCoversChanged();
 	}
-	QTimer::singleShot(0, this, SLOT(setSize()));
+	QTimer::singleShot(0, this, &DevicePropertiesWidget::setSize);
 }
 
 void DevicePropertiesWidget::transcoderChanged()
@@ -376,7 +376,7 @@ void DevicePropertiesWidget::configureFilenameScheme()
 {
 	if (!schemeDlg) {
 		schemeDlg = new FilenameSchemeDialog(this);
-		connect(schemeDlg, SIGNAL(scheme(const QString&)), filenameScheme, SLOT(setText(const QString&)));
+		connect(schemeDlg, &FilenameSchemeDialog::scheme, filenameScheme, &LineEdit::setText);
 	}
 	schemeDlg->show(settings());
 }
diff --git a/devices/devicespage.cpp b/devices/devicespage.cpp
index 136b91a59..82b8a5813 100644
--- a/devices/devicespage.cpp
+++ b/devices/devicespage.cpp
@@ -63,24 +63,24 @@ DevicesPage::DevicesPage(QWidget* p)
 	copyToLibraryButton->setDefaultAction(copyAction);
 	syncAction = new Action(Icon::fa(fa::fa_solid, fa::fa_right_left), tr("Synchronise"), this);
 	syncAction->setEnabled(false);
-	connect(syncAction, SIGNAL(triggered()), this, SLOT(sync()));
+	connect(syncAction, &Action::triggered, this, &DevicesPage::sync);
 #ifdef ENABLE_REMOTE_DEVICES
 	forgetDeviceAction = new Action(tr("Forget Device"), this);
-	connect(forgetDeviceAction, SIGNAL(triggered()), this, SLOT(forgetRemoteDevice()));
+	connect(forgetDeviceAction, &Action::triggered, this, &DevicesPage::forgetRemoteDevice);
 #endif
-	connect(DevicesModel::self()->connectAct(), SIGNAL(triggered()), this, SLOT(toggleDevice()));
-	connect(DevicesModel::self()->disconnectAct(), SIGNAL(triggered()), this, SLOT(toggleDevice()));
-	connect(DevicesModel::self(), SIGNAL(updated(QModelIndex)), this, SLOT(updated(QModelIndex)));
-	connect(view, SIGNAL(doubleClicked(const QModelIndex&)), this, SLOT(itemDoubleClicked(const QModelIndex&)));
-	connect(view, SIGNAL(searchItems()), this, SLOT(searchItems()));
-	connect(view, SIGNAL(itemsSelected(bool)), SLOT(controlActions()));
-	connect(copyAction, SIGNAL(triggered()), this, SLOT(copyToLibrary()));
-	connect(DevicesModel::self()->configureAct(), SIGNAL(triggered()), this, SLOT(configureDevice()));
-	connect(DevicesModel::self()->refreshAct(), SIGNAL(triggered()), this, SLOT(refreshDevice()));
+	connect(DevicesModel::self()->connectAct(), &Action::triggered, this, &DevicesPage::toggleDevice);
+	connect(DevicesModel::self()->disconnectAct(), &Action::triggered, this, &DevicesPage::toggleDevice);
+	connect(DevicesModel::self(), &DevicesModel::updated, this, &DevicesPage::updated);
+	connect(view, &ItemView::doubleClicked, this, &DevicesPage::itemDoubleClicked);
+	connect(view, &ItemView::searchItems, this, &DevicesPage::searchItems);
+	connect(view, &ItemView::itemsSelected, this, &DevicesPage::controlActions);
+	connect(copyAction, &Action::triggered, this, &DevicesPage::copyToLibrary);
+	connect(DevicesModel::self()->configureAct(), &Action::triggered, this, &DevicesPage::configureDevice);
+	connect(DevicesModel::self()->refreshAct(), &Action::triggered, this, &DevicesPage::refreshDevice);
 #if defined CDDB_FOUND || defined MusicBrainz5_FOUND
-	connect(DevicesModel::self()->editAct(), SIGNAL(triggered()), this, SLOT(editDetails()));
-	connect(DevicesModel::self(), SIGNAL(matches(const QString&, const QList<CdAlbum>&)),
-	        SLOT(cdMatches(const QString&, const QList<CdAlbum>&)));
+	connect(DevicesModel::self()->editAct(), &Action::triggered, this, &DevicesPage::editDetails);
+	connect(DevicesModel::self(), &DevicesModel::matches,
+	        this, &DevicesPage::cdMatches);
 #endif
 	proxy.setSourceModel(DevicesModel::self());
 	view->setModel(&proxy);
@@ -97,7 +97,7 @@ DevicesPage::DevicesPage(QWidget* p)
 #ifdef ENABLE_REMOTE_DEVICES
 	menu->addSeparator();
 	Action* addRemote = new Action(tr("Add Device"), this);
-	connect(addRemote, SIGNAL(triggered()), this, SLOT(addRemoteDevice()));
+	connect(addRemote, &Action::triggered, this, &DevicesPage::addRemoteDevice);
 	menu->addAction(addRemote);
 	menu->addAction(forgetDeviceAction);
 #endif
@@ -488,8 +488,8 @@ void DevicesPage::addRemoteDevice()
 #ifdef ENABLE_REMOTE_DEVICES
 	RemoteDevicePropertiesDialog* dlg = new RemoteDevicePropertiesDialog(this);
 	dlg->show(DeviceOptions(QLatin1String("cover.jpg")), RemoteFsDevice::Details(), DevicePropertiesWidget::Prop_All - DevicePropertiesWidget::Prop_Folder, true);
-	connect(dlg, SIGNAL(updatedSettings(const DeviceOptions&, RemoteFsDevice::Details)),
-	        DevicesModel::self(), SLOT(addRemoteDevice(const DeviceOptions&, RemoteFsDevice::Details)));
+	connect(dlg, &RemoteDevicePropertiesDialog::updatedSettings,
+	        DevicesModel::self(), &DevicesModel::addRemoteDevice);
 #endif
 }
 
diff --git a/devices/filejob.cpp b/devices/filejob.cpp
index a31e9215a..9dfadf955 100644
--- a/devices/filejob.cpp
+++ b/devices/filejob.cpp
@@ -68,12 +68,12 @@ FileJob::FileJob()
 	FileThread::self()->addJob(this);
 	// Cant call deleteLater here, as in the device's xxResult() slots "sender()" returns
 	// null. Therefore, xxResult() slots need to call finished()
-	//connect(this, SIGNAL(result(int)), SLOT(deleteLater()));
+	//connect(this, &FileJob::result, this, &FileJob::deleteLater);
 }
 
 void FileJob::start()
 {
-	QTimer::singleShot(0, this, SLOT(run()));
+	QTimer::singleShot(0, this, &FileJob::run);
 }
 
 void FileJob::setPercent(int pc)
diff --git a/devices/filenameschemedialog.cpp b/devices/filenameschemedialog.cpp
index 89f70192f..dfa6e4235 100644
--- a/devices/filenameschemedialog.cpp
+++ b/devices/filenameschemedialog.cpp
@@ -35,19 +35,19 @@ FilenameSchemeDialog::FilenameSchemeDialog(QWidget* parent)
 	QWidget* mainWidet = new QWidget(this);
 	setupUi(mainWidet);
 	setMainWidget(mainWidet);
-	connect(pattern, SIGNAL(textChanged(const QString&)), this, SLOT(enableOkButton()));
-	connect(pattern, SIGNAL(textChanged(const QString&)), this, SLOT(updateExample()));
-	connect(help, SIGNAL(leftClickedUrl()), this, SLOT(showHelp()));
-	connect(albumArtist, SIGNAL(clicked()), this, SLOT(insertVariable()));
-	connect(composer, SIGNAL(clicked()), this, SLOT(insertVariable()));
-	connect(albumTitle, SIGNAL(clicked()), this, SLOT(insertVariable()));
-	connect(trackArtist, SIGNAL(clicked()), this, SLOT(insertVariable()));
-	connect(trackTitle, SIGNAL(clicked()), this, SLOT(insertVariable()));
-	connect(trackArtistAndTitle, SIGNAL(clicked()), this, SLOT(insertVariable()));
-	connect(trackNo, SIGNAL(clicked()), this, SLOT(insertVariable()));
-	connect(cdNo, SIGNAL(clicked()), this, SLOT(insertVariable()));
-	connect(genre, SIGNAL(clicked()), this, SLOT(insertVariable()));
-	connect(year, SIGNAL(clicked()), this, SLOT(insertVariable()));
+	connect(pattern, &LineEdit::textChanged, this, &FilenameSchemeDialog::enableOkButton);
+	connect(pattern, &LineEdit::textChanged, this, &FilenameSchemeDialog::updateExample);
+	connect(help, &UrlLabel::leftClickedUrl, this, &FilenameSchemeDialog::showHelp);
+	connect(albumArtist, &QPushButton::clicked, this, &FilenameSchemeDialog::insertVariable);
+	connect(composer, &QPushButton::clicked, this, &FilenameSchemeDialog::insertVariable);
+	connect(albumTitle, &QPushButton::clicked, this, &FilenameSchemeDialog::insertVariable);
+	connect(trackArtist, &QPushButton::clicked, this, &FilenameSchemeDialog::insertVariable);
+	connect(trackTitle, &QPushButton::clicked, this, &FilenameSchemeDialog::insertVariable);
+	connect(trackArtistAndTitle, &QPushButton::clicked, this, &FilenameSchemeDialog::insertVariable);
+	connect(trackNo, &QPushButton::clicked, this, &FilenameSchemeDialog::insertVariable);
+	connect(cdNo, &QPushButton::clicked, this, &FilenameSchemeDialog::insertVariable);
+	connect(genre, &QPushButton::clicked, this, &FilenameSchemeDialog::insertVariable);
+	connect(year, &QPushButton::clicked, this, &FilenameSchemeDialog::insertVariable);
 	albumArtist->setProperty(constVariableProperty, DeviceOptions::constAlbumArtist);
 	albumTitle->setProperty(constVariableProperty, DeviceOptions::constAlbumTitle);
 	composer->setProperty(constVariableProperty, DeviceOptions::constComposer);
diff --git a/devices/fsdevice.cpp b/devices/fsdevice.cpp
index cdd985373..58126c7ed 100644
--- a/devices/fsdevice.cpp
+++ b/devices/fsdevice.cpp
@@ -438,16 +438,16 @@ void FsDevice::addSong(const Song& s, bool overwrite, bool copyCover)
 		TranscodingJob* job = new TranscodingJob(encoder, opts.transcoderValue, s.file, currentDestFile, copyCover ? opts : DeviceOptions(Device::constNoCover),
 		                                         (needToFixVa ? CopyJob::OptsApplyVaFix : CopyJob::OptsNone) | (Device::RemoteFs == devType() ? CopyJob::OptsFixLocal : CopyJob::OptsNone),
 		                                         currentSong);
-		connect(job, SIGNAL(result(int)), SLOT(addSongResult(int)));
-		connect(job, SIGNAL(percent(int)), SLOT(percent(int)));
+		connect(job, &TranscodingJob::result, this, &FsDevice::addSongResult);
+		connect(job, &TranscodingJob::percent, this, &FsDevice::percent);
 		job->start();
 	}
 	else {
 		CopyJob* job = new CopyJob(s.file, currentDestFile, copyCover ? opts : DeviceOptions(Device::constNoCover),
 		                           (needToFixVa ? CopyJob::OptsApplyVaFix : CopyJob::OptsNone) | (Device::RemoteFs == devType() ? CopyJob::OptsFixLocal : CopyJob::OptsNone),
 		                           currentSong);
-		connect(job, SIGNAL(result(int)), SLOT(addSongResult(int)));
-		connect(job, SIGNAL(percent(int)), SLOT(percent(int)));
+		connect(job, &CopyJob::result, this, &FsDevice::addSongResult);
+		connect(job, &CopyJob::percent, this, &FsDevice::percent);
 		job->start();
 	}
 }
@@ -498,8 +498,8 @@ void FsDevice::copySongTo(const Song& s, const QString& musicPath, bool overwrit
 	// Pass an empty filename as covername, so that Covers::copyCover knows this is TO MPD...
 	CopyJob* job = new CopyJob(source, currentDestFile, copyCover ? DeviceOptions(QString()) : DeviceOptions(Device::constNoCover),
 	                           needToFixVa ? CopyJob::OptsUnApplyVaFix : CopyJob::OptsNone, currentSong);
-	connect(job, SIGNAL(result(int)), SLOT(copySongToResult(int)));
-	connect(job, SIGNAL(percent(int)), SLOT(percent(int)));
+	connect(job, &CopyJob::result, this, &FsDevice::copySongToResult);
+	connect(job, &CopyJob::percent, this, &FsDevice::percent);
 	job->start();
 }
 
@@ -518,15 +518,15 @@ void FsDevice::removeSong(const Song& s)
 
 	currentSong = s;
 	DeleteJob* job = new DeleteJob(audioFolder + s.file);
-	connect(job, SIGNAL(result(int)), SLOT(removeSongResult(int)));
+	connect(job, &DeleteJob::result, this, &FsDevice::removeSongResult);
 	job->start();
 }
 
 void FsDevice::cleanDirs(const QSet<QString>& dirs)
 {
 	CleanJob* job = new CleanJob(dirs, audioFolder, opts.coverName);
-	connect(job, SIGNAL(result(int)), SLOT(cleanDirsResult(int)));
-	connect(job, SIGNAL(percent(int)), SLOT(percent(int)));
+	connect(job, &CleanJob::result, this, &FsDevice::cleanDirsResult);
+	connect(job, &CleanJob::percent, this, &FsDevice::percent);
 	job->start();
 }
 
@@ -661,13 +661,13 @@ void FsDevice::initScaner()
 			registeredTypes = true;
 		}
 		scanner = new MusicScanner(data());
-		connect(scanner, SIGNAL(libraryUpdated(MusicLibraryItemRoot*)), this, SLOT(libraryUpdated(MusicLibraryItemRoot*)));
-		connect(scanner, SIGNAL(songCount(int)), this, SLOT(songCount(int)));
-		connect(scanner, SIGNAL(cacheSaved()), this, SLOT(savedCache()));
-		connect(scanner, SIGNAL(savingCache(int)), this, SLOT(savingCache(int)));
-		connect(scanner, SIGNAL(readingCache(int)), this, SLOT(readingCache(int)));
-		connect(this, SIGNAL(scan(const QString&, const QString&, bool, const QSet<FileOnlySong>&)), scanner, SLOT(scan(const QString&, const QString&, bool, const QSet<FileOnlySong>&)));
-		connect(this, SIGNAL(saveCache(const QString&, MusicLibraryItemRoot*)), scanner, SLOT(saveCache(const QString&, MusicLibraryItemRoot*)));
+		connect(scanner, &MusicScanner::libraryUpdated, this, &FsDevice::libraryUpdated);
+		connect(scanner, &MusicScanner::songCount, this, &FsDevice::songCount);
+		connect(scanner, &MusicScanner::cacheSaved, this, &FsDevice::savedCache);
+		connect(scanner, &MusicScanner::savingCache, this, &FsDevice::savingCache);
+		connect(scanner, &MusicScanner::readingCache, this, &FsDevice::readingCache);
+		connect(this, &FsDevice::scan, scanner, &MusicScanner::scan);
+		connect(this, qOverload<const QString&, MusicLibraryItemRoot*>(&FsDevice::saveCache), scanner, &MusicScanner::saveCache);
 	}
 }
 
@@ -695,11 +695,11 @@ void FsDevice::stopScanner()
 	if (!scanner) {
 		return;
 	}
-	disconnect(scanner, SIGNAL(libraryUpdated(MusicLibraryItemRoot*)), this, SLOT(libraryUpdated(MusicLibraryItemRoot*)));
-	disconnect(scanner, SIGNAL(songCount(int)), this, SLOT(songCount(int)));
-	disconnect(scanner, SIGNAL(cacheSaved()), this, SLOT(savedCache()));
-	disconnect(scanner, SIGNAL(savingCache(int)), this, SLOT(savingCache(int)));
-	disconnect(scanner, SIGNAL(readingCache(int)), this, SLOT(readingCache(int)));
+	disconnect(scanner, &MusicScanner::libraryUpdated, this, &FsDevice::libraryUpdated);
+	disconnect(scanner, &MusicScanner::songCount, this, &FsDevice::songCount);
+	disconnect(scanner, &MusicScanner::cacheSaved, this, &FsDevice::savedCache);
+	disconnect(scanner, &MusicScanner::savingCache, this, &FsDevice::savingCache);
+	disconnect(scanner, &MusicScanner::readingCache, this, &FsDevice::readingCache);
 	scanner->deleteLater();
 	scanner = nullptr;
 }
diff --git a/devices/mountpoints.cpp b/devices/mountpoints.cpp
index 3671511ba..94d747835 100644
--- a/devices/mountpoints.cpp
+++ b/devices/mountpoints.cpp
@@ -35,7 +35,7 @@ MountPoints::MountPoints()
 	mounts = new QFile("/proc/mounts", this);
 	if (mounts && mounts->open(QIODevice::ReadOnly)) {
 		QSocketNotifier* notifier = new QSocketNotifier(mounts->handle(), QSocketNotifier::Exception, mounts);
-		connect(notifier, SIGNAL(activated(int)), this, SLOT(updateMountPoints()));
+		connect(notifier, &QSocketNotifier::activated, this, &MountPoints::updateMountPoints);
 		updateMountPoints();
 	}
 	else if (mounts) {
diff --git a/devices/mtpdevice.cpp b/devices/mtpdevice.cpp
index dde325383..b58c6d035 100644
--- a/devices/mtpdevice.cpp
+++ b/devices/mtpdevice.cpp
@@ -1213,25 +1213,25 @@ MtpDevice::MtpDevice(MusicLibraryModel* m, Solid::Device& dev, unsigned int busN
 	}
 
 	connection = new MtpConnection(data(), busNum, devNum, supportsAlbumArtistTag());
-	connect(this, SIGNAL(updateLibrary(const DeviceOptions&)), connection, SLOT(updateLibrary(const DeviceOptions&)));
-	connect(connection, SIGNAL(libraryUpdated()), this, SLOT(libraryUpdated()));
-	connect(connection, SIGNAL(progress(int)), this, SLOT(emitProgress(int)));
-	connect(this, SIGNAL(putSong(const Song&, bool, const DeviceOptions&, bool, bool)), connection, SLOT(putSong(const Song&, bool, const DeviceOptions&, bool, bool)));
-	connect(connection, SIGNAL(putSongStatus(int, const QString&, bool, bool)), this, SLOT(putSongStatus(int, const QString&, bool, bool)));
-	connect(this, SIGNAL(getSong(const Song&, const QString&, bool, bool)), connection, SLOT(getSong(const Song&, const QString&, bool, bool)));
-	connect(connection, SIGNAL(getSongStatus(bool, bool)), this, SLOT(getSongStatus(bool, bool)));
-	connect(this, SIGNAL(delSong(const Song&)), connection, SLOT(delSong(const Song&)));
-	connect(connection, SIGNAL(delSongStatus(bool)), this, SLOT(delSongStatus(bool)));
-	connect(this, SIGNAL(cleanMusicDirs(const QSet<QString>&)), connection, SLOT(cleanDirs(const QSet<QString>&)));
-	connect(this, SIGNAL(getCover(const Song&)), connection, SLOT(getCover(const Song&)));
-	connect(connection, SIGNAL(cleanDirsStatus(bool)), this, SLOT(cleanDirsStatus(bool)));
-	connect(connection, SIGNAL(statusMessage(const QString&)), this, SLOT(setStatusMessage(const QString&)));
-	connect(connection, SIGNAL(deviceDetails(const QString&)), this, SLOT(deviceDetails(const QString&)));
-	connect(connection, SIGNAL(updatePercentage(int)), this, SLOT(updatePercentage(int)));
-	connect(connection, SIGNAL(cover(const Song&, const QImage&)), this, SIGNAL(cover(const Song&, const QImage&)));
+	connect(this, &MtpDevice::updateLibrary, connection, &MtpConnection::updateLibrary);
+	connect(connection, &MtpConnection::libraryUpdated, this, &MtpDevice::libraryUpdated);
+	connect(connection, &MtpConnection::progress, this, &MtpDevice::emitProgress);
+	connect(this, &MtpDevice::putSong, connection, &MtpConnection::putSong);
+	connect(connection, &MtpConnection::putSongStatus, this, &MtpDevice::putSongStatus);
+	connect(this, &MtpDevice::getSong, connection, &MtpConnection::getSong);
+	connect(connection, &MtpConnection::getSongStatus, this, &MtpDevice::getSongStatus);
+	connect(this, &MtpDevice::delSong, connection, &MtpConnection::delSong);
+	connect(connection, &MtpConnection::delSongStatus, this, &MtpDevice::delSongStatus);
+	connect(this, &MtpDevice::cleanMusicDirs, connection, &MtpConnection::cleanDirs);
+	connect(this, &MtpDevice::getCover, connection, &MtpConnection::getCover);
+	connect(connection, &MtpConnection::cleanDirsStatus, this, &MtpDevice::cleanDirsStatus);
+	connect(connection, &MtpConnection::statusMessage, this, &MtpDevice::setStatusMessage);
+	connect(connection, &MtpConnection::deviceDetails, this, &MtpDevice::deviceDetails);
+	connect(connection, &MtpConnection::updatePercentage, this, &MtpDevice::updatePercentage);
+	connect(connection, &MtpConnection::cover, this, &MtpDevice::cover);
 	opts.fixVariousArtists = false;
 	opts.coverName = constMtpDefaultCover;
-	QTimer::singleShot(0, this, SLOT(rescan(bool)));
+	QTimer::singleShot(0, this, [this] { rescan(); });
 	defaultName = data();
 	if (!opts.name.isEmpty()) {
 		DBUG << "setName" << opts.name;
@@ -1271,16 +1271,16 @@ void MtpDevice::stop()
 	abortJob();
 	deleteTemp();
 	if (connection) {
-		disconnect(connection, SIGNAL(libraryUpdated()), this, SLOT(libraryUpdated()));
-		disconnect(connection, SIGNAL(progress(int)), this, SLOT(emitProgress(int)));
-		disconnect(connection, SIGNAL(putSongStatus(int, const QString&, bool, bool)), this, SLOT(putSongStatus(int, const QString&, bool, bool)));
-		disconnect(connection, SIGNAL(getSongStatus(bool, bool)), this, SLOT(getSongStatus(bool, bool)));
-		disconnect(connection, SIGNAL(delSongStatus(bool)), this, SLOT(delSongStatus(bool)));
-		disconnect(connection, SIGNAL(cleanDirsStatus(bool)), this, SLOT(cleanDirsStatus(bool)));
-		disconnect(connection, SIGNAL(statusMessage(const QString&)), this, SLOT(setStatusMessage(const QString&)));
-		disconnect(connection, SIGNAL(deviceDetails(const QString&)), this, SLOT(deviceDetails(const QString&)));
-		disconnect(connection, SIGNAL(updatePercentage(int)), this, SLOT(updatePercentage(int)));
-		disconnect(connection, SIGNAL(cover(const Song&, const QImage&)), this, SIGNAL(cover(const Song&, const QImage&)));
+		disconnect(connection, &MtpConnection::libraryUpdated, this, &MtpDevice::libraryUpdated);
+		disconnect(connection, &MtpConnection::progress, this, &MtpDevice::emitProgress);
+		disconnect(connection, &MtpConnection::putSongStatus, this, &MtpDevice::putSongStatus);
+		disconnect(connection, &MtpConnection::getSongStatus, this, &MtpDevice::getSongStatus);
+		disconnect(connection, &MtpConnection::delSongStatus, this, &MtpDevice::delSongStatus);
+		disconnect(connection, &MtpConnection::cleanDirsStatus, this, &MtpDevice::cleanDirsStatus);
+		disconnect(connection, &MtpConnection::statusMessage, this, &MtpDevice::setStatusMessage);
+		disconnect(connection, &MtpConnection::deviceDetails, this, &MtpDevice::deviceDetails);
+		disconnect(connection, &MtpConnection::updatePercentage, this, &MtpDevice::updatePercentage);
+		disconnect(connection, &MtpConnection::cover, this, &MtpDevice::cover);
 		metaObject()->invokeMethod(connection, "stop", Qt::QueuedConnection);
 		connection->deleteLater();
 		connection = 0;
@@ -1294,9 +1294,9 @@ void MtpDevice::configure(QWidget* parent)
 	}
 
 	DevicePropertiesDialog* dlg = new DevicePropertiesDialog(parent);
-	connect(dlg, SIGNAL(updatedSettings(const QString&, const DeviceOptions&)), SLOT(saveProperties(const QString&, const DeviceOptions&)));
+	connect(dlg, &DevicePropertiesDialog::updatedSettings, this, qOverload<const QString&, const DeviceOptions&>(&MtpDevice::saveProperties));
 	if (!configured) {
-		connect(dlg, SIGNAL(cancelled()), SLOT(saveProperties()));
+		connect(dlg, &DevicePropertiesDialog::cancelled, this, qOverload<>(&MtpDevice::saveProperties));
 	}
 	DeviceOptions o = opts;
 	if (o.name.isEmpty()) {
@@ -1379,8 +1379,8 @@ void MtpDevice::addSong(const Song& s, bool overwrite, bool copyCover)
 		TranscodingJob* job = new TranscodingJob(encoder, opts.transcoderValue, s.file, destFile);
 		job->setProperty("overwrite", overwrite);
 		job->setProperty("copyCover", copyCover);
-		connect(job, SIGNAL(result(int)), SLOT(transcodeSongResult(int)));
-		connect(job, SIGNAL(percent(int)), SLOT(transcodePercent(int)));
+		connect(job, &TranscodingJob::result, this, &MtpDevice::transcodeSongResult);
+		connect(job, &TranscodingJob::percent, this, &MtpDevice::transcodePercent);
 		job->start();
 		currentSong.setExtraField(constOrigFileName, currentSong.file);
 		currentSong.file = destFile;
diff --git a/devices/remotedevicepropertiesdialog.cpp b/devices/remotedevicepropertiesdialog.cpp
index 179d773d0..c3f01909f 100644
--- a/devices/remotedevicepropertiesdialog.cpp
+++ b/devices/remotedevicepropertiesdialog.cpp
@@ -68,8 +68,8 @@ void RemoteDevicePropertiesDialog::show(const DeviceOptions& opts, const RemoteF
 	devProp->showRemoteConnectionNote(!isConnected);
 	devProp->update(QString(), opts, QList<DeviceStorage>(), props, disabledProps);
 	remoteProp->update(det, create, isConnected);
-	connect(devProp, SIGNAL(updated()), SLOT(enableOkButton()));
-	connect(remoteProp, SIGNAL(updated()), SLOT(enableOkButton()));
+	connect(devProp, &DevicePropertiesWidget::updated, this, &RemoteDevicePropertiesDialog::enableOkButton);
+	connect(remoteProp, &RemoteDevicePropertiesWidget::updated, this, &RemoteDevicePropertiesDialog::enableOkButton);
 	Dialog::show();
 	enableButtonOk(false);
 }
diff --git a/devices/remotedevicepropertieswidget.cpp b/devices/remotedevicepropertieswidget.cpp
index 027cc5b39..d03ce397c 100644
--- a/devices/remotedevicepropertieswidget.cpp
+++ b/devices/remotedevicepropertieswidget.cpp
@@ -74,7 +74,7 @@ void RemoteDevicePropertiesWidget::update(const RemoteFsDevice::Details& d, bool
 
 	name->setEnabled(d.isLocalFile() || !isConnected);
 
-	connect(type, SIGNAL(currentIndexChanged(int)), this, SLOT(setType()));
+	connect(type, &QComboBox::currentIndexChanged, this, &RemoteDevicePropertiesWidget::setType);
 	for (int i = 1; i < type->count(); ++i) {
 		if (type->itemData(i).toInt() == t) {
 			type->setCurrentIndex(i);
@@ -82,13 +82,13 @@ void RemoteDevicePropertiesWidget::update(const RemoteFsDevice::Details& d, bool
 			break;
 		}
 	}
-	connect(name, SIGNAL(textChanged(const QString&)), this, SLOT(checkSaveable()));
-	connect(sshHost, SIGNAL(textChanged(const QString&)), this, SLOT(checkSaveable()));
-	connect(sshUser, SIGNAL(textChanged(const QString&)), this, SLOT(checkSaveable()));
-	connect(sshFolder, SIGNAL(textChanged(const QString&)), this, SLOT(checkSaveable()));
-	connect(sshPort, SIGNAL(valueChanged(int)), this, SLOT(checkSaveable()));
-	connect(sshExtra, SIGNAL(textChanged(const QString&)), this, SLOT(checkSaveable()));
-	connect(fileFolder, SIGNAL(textChanged(const QString&)), this, SLOT(checkSaveable()));
+	connect(name, &LineEdit::textChanged, this, &RemoteDevicePropertiesWidget::checkSaveable);
+	connect(sshHost, &LineEdit::textChanged, this, &RemoteDevicePropertiesWidget::checkSaveable);
+	connect(sshUser, &LineEdit::textChanged, this, &RemoteDevicePropertiesWidget::checkSaveable);
+	connect(sshFolder, &LineEdit::textChanged, this, &RemoteDevicePropertiesWidget::checkSaveable);
+	connect(sshPort, &QSpinBox::valueChanged, this, &RemoteDevicePropertiesWidget::checkSaveable);
+	connect(sshExtra, &LineEdit::textChanged, this, &RemoteDevicePropertiesWidget::checkSaveable);
+	connect(fileFolder, &PathRequester::textChanged, this, &RemoteDevicePropertiesWidget::checkSaveable);
 	modified = false;
 	setType();
 	checkSaveable();
diff --git a/devices/remotefsdevice.cpp b/devices/remotefsdevice.cpp
index 037b96c5f..1ac6b71ab 100644
--- a/devices/remotefsdevice.cpp
+++ b/devices/remotefsdevice.cpp
@@ -294,7 +294,7 @@ void RemoteFsDevice::mount()
 			env.insert("SSH_ASKPASS", askPass);
 			proc->setProcessEnvironment(env);
 		}
-		connect(proc, SIGNAL(finished(int)), SLOT(procFinished(int)));
+		connect(proc, &QProcess::finished, this, &RemoteFsDevice::procFinished);
 		proc->start(cmd, args, QIODevice::ReadOnly);
 	}
 }
@@ -332,7 +332,7 @@ void RemoteFsDevice::unmount()
 		setStatusMessage(tr("Disconnecting..."));
 		proc = new QProcess(this);
 		proc->setProperty("unmount", true);
-		connect(proc, SIGNAL(finished(int)), SLOT(procFinished(int)));
+		connect(proc, &QProcess::finished, this, &RemoteFsDevice::procFinished);
 		proc->start(cmd, args, QIODevice::ReadOnly);
 	}
 }
@@ -509,10 +509,10 @@ void RemoteFsDevice::configure(QWidget* parent)
 	}
 
 	RemoteDevicePropertiesDialog* dlg = new RemoteDevicePropertiesDialog(parent);
-	connect(dlg, SIGNAL(updatedSettings(const DeviceOptions&, const RemoteFsDevice::Details&)),
-	        SLOT(saveProperties(const DeviceOptions&, const RemoteFsDevice::Details&)));
+	connect(dlg, &RemoteDevicePropertiesDialog::updatedSettings,
+	        this, qOverload<const DeviceOptions&, const RemoteFsDevice::Details&>(&RemoteFsDevice::saveProperties));
 	if (!configured) {
-		connect(dlg, SIGNAL(cancelled()), SLOT(saveProperties()));
+		connect(dlg, &RemoteDevicePropertiesDialog::cancelled, this, qOverload<>(&RemoteFsDevice::saveProperties));
 	}
 	dlg->show(opts, details,
 	          DevicePropertiesWidget::Prop_All - (DevicePropertiesWidget::Prop_Name + DevicePropertiesWidget::Prop_Folder + DevicePropertiesWidget::Prop_AutoScan),
diff --git a/devices/synccollectionwidget.cpp b/devices/synccollectionwidget.cpp
index 664e5a8b5..dbc033d3c 100644
--- a/devices/synccollectionwidget.cpp
+++ b/devices/synccollectionwidget.cpp
@@ -40,7 +40,7 @@ SyncCollectionWidget::SyncCollectionWidget(QWidget* parent, const QString& title
 	setupUi(this);
 	titleLabel->setText(title);
 	cfgButton->setIcon(Icons::self()->configureIcon);
-	connect(cfgButton, SIGNAL(clicked(bool)), SIGNAL(configure()));
+	connect(cfgButton, &ToolButton::clicked, this, &SyncCollectionWidget::configure);
 
 	proxy.setSourceModel(&model);
 	tree->setModel(&proxy);
@@ -48,14 +48,14 @@ SyncCollectionWidget::SyncCollectionWidget(QWidget* parent, const QString& title
 	tree->setUseSimpleDelegate();
 	search->setText(QString());
 	search->setPlaceholderText(tr("Search"));
-	connect(&proxy, SIGNAL(dataChanged(QModelIndex, QModelIndex)), this, SLOT(dataChanged(QModelIndex, QModelIndex)));
-	connect(search, SIGNAL(returnPressed()), this, SLOT(delaySearchItems()));
-	connect(search, SIGNAL(textChanged(const QString)), this, SLOT(delaySearchItems()));
+	connect(&proxy, &MusicLibraryProxyModel::dataChanged, this, &SyncCollectionWidget::dataChanged);
+	connect(search, &LineEdit::returnPressed, this, &SyncCollectionWidget::delaySearchItems);
+	connect(search, &LineEdit::textChanged, this, &SyncCollectionWidget::delaySearchItems);
 
 	checkAction = new Action(tr("Check Items"), this);
-	connect(checkAction, SIGNAL(triggered()), SLOT(checkItems()));
+	connect(checkAction, &Action::triggered, this, qOverload<>(&SyncCollectionWidget::checkItems));
 	unCheckAction = new Action(tr("Uncheck Items"), this);
-	connect(unCheckAction, SIGNAL(triggered()), SLOT(unCheckItems()));
+	connect(unCheckAction, &Action::triggered, this, &SyncCollectionWidget::unCheckItems);
 	tree->addAction(checkAction);
 	tree->addAction(unCheckAction);
 	tree->setContextMenuPolicy(Qt::ActionsContextMenu);
@@ -67,14 +67,14 @@ SyncCollectionWidget::SyncCollectionWidget(QWidget* parent, const QString& title
 		tree->addAction(collapse);
 		addAction(expand);
 		addAction(collapse);
-		connect(expand, SIGNAL(triggered()), this, SLOT(expandAll()));
-		connect(collapse, SIGNAL(triggered()), this, SLOT(collapseAll()));
+		connect(expand, &QAction::triggered, this, &SyncCollectionWidget::expandAll);
+		connect(collapse, &QAction::triggered, this, &SyncCollectionWidget::collapseAll);
 	}
 
-	connect(tree, SIGNAL(itemsSelected(bool)), checkAction, SLOT(setEnabled(bool)));
-	connect(tree, SIGNAL(itemsSelected(bool)), unCheckAction, SLOT(setEnabled(bool)));
-	connect(tree, SIGNAL(itemActivated(const QModelIndex&)), this, SLOT(itemActivated(const QModelIndex&)));
-	connect(tree, SIGNAL(clicked(const QModelIndex&)), this, SLOT(itemClicked(const QModelIndex&)));
+	connect(tree, &TreeView::itemsSelected, checkAction, &Action::setEnabled);
+	connect(tree, &TreeView::itemsSelected, unCheckAction, &Action::setEnabled);
+	connect(tree, &TreeView::itemActivated, this, &SyncCollectionWidget::itemActivated);
+	connect(tree, &TreeView::clicked, this, &SyncCollectionWidget::itemClicked);
 }
 
 SyncCollectionWidget::~SyncCollectionWidget()
@@ -189,7 +189,7 @@ void SyncCollectionWidget::delaySearchItems()
 		if (!searchTimer) {
 			searchTimer = new QTimer(this);
 			searchTimer->setSingleShot(true);
-			connect(searchTimer, SIGNAL(timeout()), SLOT(searchItems()));
+			connect(searchTimer, &QTimer::timeout, this, &SyncCollectionWidget::searchItems);
 		}
 		searchTimer->start(500);
 	}
diff --git a/devices/syncdialog.cpp b/devices/syncdialog.cpp
index 40d398419..18aadb1ae 100644
--- a/devices/syncdialog.cpp
+++ b/devices/syncdialog.cpp
@@ -128,10 +128,10 @@ SyncDialog::SyncDialog(QWidget* parent)
 	enableButtonOk(false);
 	setAttribute(Qt::WA_DeleteOnClose);
 	setCaption(tr("Synchronize"));
-	connect(libWidget, SIGNAL(selectionChanged()), SLOT(selectionChanged()));
-	connect(devWidget, SIGNAL(selectionChanged()), SLOT(selectionChanged()));
-	connect(libWidget, SIGNAL(configure()), SLOT(configure()));
-	connect(devWidget, SIGNAL(configure()), SLOT(configure()));
+	connect(libWidget, &SyncCollectionWidget::selectionChanged, this, &SyncDialog::selectionChanged);
+	connect(devWidget, &SyncCollectionWidget::selectionChanged, this, &SyncDialog::selectionChanged);
+	connect(libWidget, &SyncCollectionWidget::configure, this, &SyncDialog::configure);
+	connect(devWidget, &SyncCollectionWidget::configure, this, &SyncDialog::configure);
 	libOptions.save(MPDConnectionDetails::configGroupName(MPDConnection::self()->getDetails().name), true);
 }
 
@@ -143,7 +143,7 @@ SyncDialog::~SyncDialog()
 void SyncDialog::sync(const QString& udi)
 {
 	devUdi = udi;
-	connect(MpdLibraryModel::self(), SIGNAL(songListing(QList<Song>, double)), this, SLOT(librarySongs(QList<Song>, double)));
+	connect(MpdLibraryModel::self(), &MpdLibraryModel::songListing, this, &SyncDialog::librarySongs);
 	MpdLibraryModel::self()->listSongs();
 	show();
 }
@@ -158,7 +158,7 @@ void SyncDialog::copy(const QList<Song>& songs)
 
 	bool fromDev = sender() == devWidget;
 	ActionDialog* dlg = new ActionDialog(this);
-	connect(dlg, SIGNAL(completed()), SLOT(updateSongs()));
+	connect(dlg, &ActionDialog::completed, this, &SyncDialog::updateSongs);
 	dlg->copy(fromDev ? dev->id() : QString(), fromDev ? QString() : dev->id(), songs);
 }
 
@@ -195,7 +195,7 @@ void SyncDialog::librarySongs(const QList<Song>& songs, double pc)
 {
 	if (songs.isEmpty()) {
 		statusLabel->hide();
-		disconnect(MpdLibraryModel::self(), SIGNAL(songListing(QList<Song>, double)), this, SLOT(librarySongs(QList<Song>, double)));
+		disconnect(MpdLibraryModel::self(), &MpdLibraryModel::songListing, this, &SyncDialog::librarySongs);
 		updateSongs();
 	}
 	else {
@@ -213,7 +213,7 @@ void SyncDialog::configure()
 {
 	if (libWidget == sender()) {
 		DevicePropertiesDialog* dlg = new DevicePropertiesDialog(this);
-		connect(dlg, SIGNAL(updatedSettings(const QString&, const DeviceOptions&)), SLOT(saveProperties(const QString&, const DeviceOptions&)));
+		connect(dlg, &DevicePropertiesDialog::updatedSettings, this, &SyncDialog::saveProperties);
 		dlg->setCaption(tr("Local Music Library Properties"));
 		dlg->show(MPDConnection::self()->getDetails().dir, libOptions, DevicePropertiesWidget::Prop_Basic | DevicePropertiesWidget::Prop_FileName);
 	}
diff --git a/devices/transcodingjob.cpp b/devices/transcodingjob.cpp
index 1de80480c..3cbc5c0fd 100644
--- a/devices/transcodingjob.cpp
+++ b/devices/transcodingjob.cpp
@@ -50,8 +50,8 @@ void TranscodingJob::run()
 		process = new QProcess;
 		process->setProcessChannelMode(QProcess::MergedChannels);
 		process->setReadChannel(QProcess::StandardOutput);
-		connect(process, SIGNAL(readyReadStandardOutput()), this, SLOT(processOutput()));
-		connect(process, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(finished(int, QProcess::ExitStatus)));
+		connect(process, &QProcess::readyReadStandardOutput, this, &TranscodingJob::processOutput);
+		connect(process, &QProcess::finished, this, &TranscodingJob::finished);
 		QString cmd = parameters.takeFirst();
 		process->start(cmd, parameters);
 	}
diff --git a/devices/umsdevice.cpp b/devices/umsdevice.cpp
index e308c0ea7..3947be2fc 100644
--- a/devices/umsdevice.cpp
+++ b/devices/umsdevice.cpp
@@ -229,9 +229,9 @@ void UmsDevice::configure(QWidget* parent)
 	}
 
 	DevicePropertiesDialog* dlg = new DevicePropertiesDialog(parent);
-	connect(dlg, SIGNAL(updatedSettings(const QString&, const DeviceOptions&)), SLOT(saveProperties(const QString&, const DeviceOptions&)));
+	connect(dlg, &DevicePropertiesDialog::updatedSettings, this, qOverload<const QString&, const DeviceOptions&>(&UmsDevice::saveProperties));
 	if (!configured) {
-		connect(dlg, SIGNAL(cancelled()), SLOT(saveProperties()));
+		connect(dlg, &DevicePropertiesDialog::cancelled, this, qOverload<>(&UmsDevice::saveProperties));
 	}
 	DeviceOptions o = opts;
 	if (o.name.isEmpty()) {
diff --git a/devices/valueslider.cpp b/devices/valueslider.cpp
index b371b6820..00dd40134 100644
--- a/devices/valueslider.cpp
+++ b/devices/valueslider.cpp
@@ -41,7 +41,7 @@ ValueSlider::ValueSlider(QWidget* parent)
 	leftLabel = new QLabel(this);
 	layout->addWidget(leftLabel, 2, 0, 1, 1);
 	midLabel = new QLabel(this);
-	connect(slider, SIGNAL(valueChanged(int)), this, SLOT(onSliderChanged(int)));
+	connect(slider, &QSlider::valueChanged, this, &ValueSlider::onSliderChanged);
 	rightLabel = new QLabel(this);
 	rightLabel->setAlignment(Qt::AlignRight | Qt::AlignVCenter);
 	layout->addWidget(rightLabel, 2, 2, 1, 1);
diff --git a/gui/apikeyssettings.cpp b/gui/apikeyssettings.cpp
index 205424c4e..165c897cc 100644
--- a/gui/apikeyssettings.cpp
+++ b/gui/apikeyssettings.cpp
@@ -106,7 +106,7 @@ ApiKeysSettings::ApiKeysSettings(QWidget* p)
 	}
 	tree->setColumnWidth(0, nameWidth);
 	tree->setColumnWidth(1, urlWidth);
-	connect(tree, SIGNAL(itemClicked(QTreeWidgetItem*, int)), SLOT(itemClicked(QTreeWidgetItem*, int)));
+	connect(tree, &QTreeWidget::itemClicked, this, &ApiKeysSettings::itemClicked);
 }
 
 void ApiKeysSettings::save()
diff --git a/gui/cachesettings.cpp b/gui/cachesettings.cpp
index 82238683c..8ec1ae0d5 100644
--- a/gui/cachesettings.cpp
+++ b/gui/cachesettings.cpp
@@ -127,10 +127,10 @@ void CacheItemCounter::deleteAll()
 CacheItem::CacheItem(const QString& title, const QString& d, const QStringList& t, QTreeWidget* p, Type ty)
 	: QTreeWidgetItem(p, QStringList() << title), counter(new CacheItemCounter(title, d, t)), empty(true), usedSpace(0), type(ty)
 {
-	connect(this, SIGNAL(getCount()), counter, SLOT(getCount()), Qt::QueuedConnection);
-	connect(this, SIGNAL(deleteAll()), counter, SLOT(deleteAll()), Qt::QueuedConnection);
-	connect(counter, SIGNAL(count(int, quint64)), this, SLOT(update(int, quint64)), Qt::QueuedConnection);
-	connect(this, SIGNAL(updated()), p, SIGNAL(itemSelectionChanged()));
+	connect(this, &CacheItem::getCount, counter, &CacheItemCounter::getCount, Qt::QueuedConnection);
+	connect(this, &CacheItem::deleteAll, counter, &CacheItemCounter::deleteAll, Qt::QueuedConnection);
+	connect(counter, &CacheItemCounter::count, this, qOverload<int, quint64>(&CacheItem::update), Qt::QueuedConnection);
+	connect(this, &CacheItem::updated, p, &QTreeWidget::itemSelectionChanged);
 }
 
 CacheItem::~CacheItem()
@@ -281,7 +281,7 @@ CacheSettings::CacheSettings(QWidget* parent)
 #endif
 
 	for (int i = 0; i < tree->topLevelItemCount(); ++i) {
-		connect(static_cast<CacheItem*>(tree->topLevelItem(i)), SIGNAL(updated()), this, SLOT(updateSpace()));
+		connect(static_cast<CacheItem*>(tree->topLevelItem(i)), &CacheItem::updated, this, &CacheSettings::updateSpace);
 	}
 
 	spaceLabel = new SpaceLabel(this);
@@ -290,8 +290,8 @@ CacheSettings::CacheSettings(QWidget* parent)
 	layout->addWidget(button, row++, 1, 1, 1);
 	button->setEnabled(false);
 
-	connect(tree, SIGNAL(itemSelectionChanged()), this, SLOT(controlButton()));
-	connect(button, SIGNAL(clicked()), this, SLOT(deleteAll()));
+	connect(tree, &QTreeWidget::itemSelectionChanged, this, &CacheSettings::controlButton);
+	connect(button, &QPushButton::clicked, this, &CacheSettings::deleteAll);
 }
 
 CacheSettings::~CacheSettings()
diff --git a/gui/coverdialog.cpp b/gui/coverdialog.cpp
index 08003afae..40fa9ced0 100644
--- a/gui/coverdialog.cpp
+++ b/gui/coverdialog.cpp
@@ -322,12 +322,12 @@ CoverDialog::CoverDialog(QWidget* parent)
 	setAttribute(Qt::WA_DeleteOnClose);
 	setButtons(Cancel | Ok);
 	enableButton(Ok, false);
-	connect(list, SIGNAL(itemDoubleClicked(QListWidgetItem*)), SLOT(showImage(QListWidgetItem*)));
-	connect(list, SIGNAL(itemSelectionChanged()), SLOT(checkStatus()));
-	connect(search, SIGNAL(clicked()), SLOT(sendQuery()));
-	connect(query, SIGNAL(returnPressed()), SLOT(sendQuery()));
-	connect(addFileButton, SIGNAL(clicked()), SLOT(addLocalFile()));
-	connect(list, SIGNAL(customContextMenuRequested(const QPoint&)), SLOT(menuRequested(const QPoint&)));
+	connect(list, &QListWidget::itemDoubleClicked, this, qOverload<QListWidgetItem*>(&CoverDialog::showImage));
+	connect(list, &QListWidget::itemSelectionChanged, this, &CoverDialog::checkStatus);
+	connect(search, &QPushButton::clicked, this, &CoverDialog::sendQuery);
+	connect(query, &LineEdit::returnPressed, this, &CoverDialog::sendQuery);
+	connect(addFileButton, &FlatToolButton::clicked, this, &CoverDialog::addLocalFile);
+	connect(list, &QListWidget::customContextMenuRequested, this, &CoverDialog::menuRequested);
 
 	QFont f(list->font());
 	QFontMetrics origFm(f);
@@ -608,7 +608,7 @@ void CoverDialog::showImage(QListWidgetItem* item)
 		NetworkJob* j = downloadImage(cover->url(), DL_LargePreview);
 		if (j) {
 			j->setProperty(constLargeProperty, cover->url());
-			connect(j, SIGNAL(downloadProgress(qint64, qint64)), preview, SLOT(progress(qint64, qint64)));
+			connect(j, &NetworkJob::downloadProgress, preview, &CoverPreview::progress);
 		}
 	}
 }
@@ -803,8 +803,8 @@ void CoverDialog::menuRequested(const QPoint& pos)
 		menu = new QMenu(list);
 		showAction = menu->addAction(tr("Display"));
 		removeAction = menu->addAction(tr("Remove"));
-		connect(showAction, SIGNAL(triggered()), SLOT(showImage()));
-		connect(removeAction, SIGNAL(triggered()), SLOT(removeImages()));
+		connect(showAction, &QAction::triggered, this, qOverload<>(&CoverDialog::showImage));
+		connect(removeAction, &QAction::triggered, this, &CoverDialog::removeImages);
 	}
 
 	QList<QListWidgetItem*> items = list->selectedItems();
@@ -850,7 +850,7 @@ void CoverDialog::sendQueryRequest(const QUrl& url, const QString& host)
 	NetworkJob* j = NetworkAccessManager::self()->get(QNetworkRequest(url));
 	j->setProperty(constHostProperty, host.isEmpty() ? url.host() : host);
 	j->setProperty(constTypeProperty, (int)DL_Query);
-	connect(j, SIGNAL(finished()), this, SLOT(queryJobFinished()));
+	connect(j, &NetworkJob::finished, this, &CoverDialog::queryJobFinished);
 	currentQuery.insert(j);
 }
 
@@ -892,12 +892,12 @@ NetworkJob* CoverDialog::downloadImage(const QString& url, DownloadType dlType)
 	}
 
 	NetworkJob* j = NetworkAccessManager::self()->get(QNetworkRequest(QUrl(url)));
-	connect(j, SIGNAL(finished()), this, SLOT(downloadJobFinished()));
+	connect(j, &NetworkJob::finished, this, &CoverDialog::downloadJobFinished);
 	currentQuery.insert(j);
 	j->setProperty(constTypeProperty, (int)dlType);
 	if (saving) {
 		previewDialog()->downloading(url);
-		connect(j, SIGNAL(downloadProgress(qint64, qint64)), preview, SLOT(progress(qint64, qint64)));
+		connect(j, &NetworkJob::downloadProgress, preview, &CoverPreview::progress);
 	}
 	return j;
 }
@@ -1295,7 +1295,7 @@ void CoverDialog::setSearching(bool s)
 	if (!msgOverlay) {
 		msgOverlay = new MessageOverlay(this);
 		msgOverlay->setWidget(list);
-		connect(msgOverlay, SIGNAL(cancel()), SLOT(cancelQuery()));
+		connect(msgOverlay, &MessageOverlay::cancel, this, &CoverDialog::cancelQuery);
 	}
 	if (s) {
 		spinner->start();
diff --git a/gui/coverdialog.h b/gui/coverdialog.h
index 1d77b6679..bfb3d71d6 100644
--- a/gui/coverdialog.h
+++ b/gui/coverdialog.h
@@ -58,7 +58,7 @@ class CoverPreview : public Dialog {
 	void downloading(const QString& u);
 	bool aboutToShow(const QString& u) const { return u == url; }
 
-private Q_SLOTS:
+public Q_SLOTS:
 	void progress(qint64 rx, qint64 total);
 
 private:
diff --git a/gui/covers.cpp b/gui/covers.cpp
index ade84c49e..ec460358b 100644
--- a/gui/covers.cpp
+++ b/gui/covers.cpp
@@ -607,8 +607,8 @@ CoverDownloader::CoverDownloader()
 	thread = new Thread(metaObject()->className());
 	moveToThread(thread);
 	thread->start();
-	connect(this, SIGNAL(mpdCover(Song)), MPDConnection::self(), SLOT(getCover(Song)));
-	connect(MPDConnection::self(), SIGNAL(albumArt(Song, QByteArray)), this, SLOT(mpdAlbumArt(Song, QByteArray)));
+	connect(this, &CoverDownloader::mpdCover, MPDConnection::self(), &MPDConnection::getCover);
+	connect(MPDConnection::self(), &MPDConnection::albumArt, this, &CoverDownloader::mpdAlbumArt);
 }
 
 void CoverDownloader::stop()
@@ -629,7 +629,7 @@ void CoverDownloader::download(const Song& song)
 		if (!imageUrl.isEmpty()) {
 			NetworkJob* j = network()->get(imageUrl);
 			jobs.insert(j, job);
-			connect(j, SIGNAL(finished()), this, SLOT(onlineJobFinished()));
+			connect(j, &NetworkJob::finished, this, &CoverDownloader::onlineJobFinished);
 		}
 		else {
 			failed(job);
@@ -700,7 +700,7 @@ bool CoverDownloader::downloadViaHttp(Job& job, JobType type)
 
 	job.type = type;
 	NetworkJob* j = network()->get(u);
-	connect(j, SIGNAL(finished()), this, SLOT(jobFinished()));
+	connect(j, &NetworkJob::finished, this, &CoverDownloader::jobFinished);
 	jobs.insert(j, job);
 	DBUG << u.toString();
 	return true;
@@ -720,7 +720,7 @@ void CoverDownloader::downloadViaRemote(Job& job)
 		url.setQuery(query);
 
 		NetworkJob* j = network()->get(url);
-		connect(j, SIGNAL(finished()), this, SLOT(lastFmArtistCallFinished()));
+		connect(j, &NetworkJob::finished, this, &CoverDownloader::lastFmArtistCallFinished);
 		job.type = JobRemote;
 		jobs.insert(j, job);
 		DBUG << url.toString();
@@ -734,7 +734,7 @@ void CoverDownloader::downloadViaRemote(Job& job)
 		query.addQueryItem("entity", "album");
 		url.setQuery(query);
 		NetworkJob* j = network()->get(url);
-		connect(j, SIGNAL(finished()), this, SLOT(remoteCallFinished()));
+		connect(j, &NetworkJob::finished, this, &CoverDownloader::remoteCallFinished);
 		job.type = JobRemote;
 		jobs.insert(j, job);
 		DBUG << url.toString();
@@ -843,7 +843,7 @@ void CoverDownloader::remoteCallFinished()
 
 		if (!url.isEmpty()) {
 			NetworkJob* j = network()->get(QNetworkRequest(QUrl(url)));
-			connect(j, SIGNAL(finished()), this, SLOT(jobFinished()));
+			connect(j, &NetworkJob::finished, this, &CoverDownloader::jobFinished);
 			DBUG << "download" << url;
 			jobs.insert(j, job);
 		}
@@ -906,7 +906,7 @@ void CoverDownloader::lastFmArtistCallFinished()
 
 		if (url.isValid()) {
 			NetworkJob* j = network()->get(QNetworkRequest(url));
-			connect(j, SIGNAL(finished()), this, SLOT(remoteCallFinished()));
+			connect(j, &NetworkJob::finished, this, &CoverDownloader::remoteCallFinished);
 			DBUG << "download" << url;
 			jobs.insert(j, job);
 		}
@@ -1178,7 +1178,7 @@ void CoverLocator::startTimer(int interval)
 	if (!timer) {
 		timer = thread->createTimer(this);
 		timer->setSingleShot(true);
-		connect(timer, SIGNAL(timeout()), this, SLOT(locate()), Qt::QueuedConnection);
+		connect(timer, &QTimer::timeout, this, qOverload<>(&CoverLocator::locate), Qt::QueuedConnection);
 	}
 	timer->start(interval);
 }
@@ -1237,7 +1237,7 @@ void CoverLoader::startTimer(int interval)
 	if (!timer) {
 		timer = thread->createTimer(this);
 		timer->setSingleShot(true);
-		connect(timer, SIGNAL(timeout()), this, SLOT(load()), Qt::QueuedConnection);
+		connect(timer, &QTimer::timeout, this, qOverload<>(&CoverLoader::load), Qt::QueuedConnection);
 	}
 	timer->start(interval);
 }
@@ -1304,19 +1304,19 @@ void Covers::readConfig()
 void Covers::stop()
 {
 	if (downloader) {
-		disconnect(downloader, SIGNAL(artistImage(Song, QImage, QString)), this, SLOT(artistImageDownloaded(Song, QImage, QString)));
-		disconnect(downloader, SIGNAL(composerImage(Song, QImage, QString)), this, SLOT(composerImageDownloaded(Song, QImage, QString)));
-		disconnect(downloader, SIGNAL(cover(Song, QImage, QString)), this, SLOT(coverDownloaded(Song, QImage, QString)));
+		disconnect(downloader, &CoverDownloader::artistImage, this, &Covers::artistImageDownloaded);
+		disconnect(downloader, &CoverDownloader::composerImage, this, &Covers::composerImageDownloaded);
+		disconnect(downloader, &CoverDownloader::cover, this, &Covers::coverDownloaded);
 		downloader->stop();
 		downloader = nullptr;
 	}
 	if (locator) {
-		disconnect(locator, SIGNAL(located(QList<LocatedCover>)), this, SLOT(located(QList<LocatedCover>)));
+		disconnect(locator, &CoverLocator::located, this, &Covers::located);
 		locator->stop();
 		locator = nullptr;
 	}
 	if (loader) {
-		disconnect(loader, SIGNAL(loaded(QList<LoadedCover>)), this, SLOT(loaded(QList<LoadedCover>)));
+		disconnect(loader, &CoverLoader::loaded, this, qOverload<const QList<LoadedCover>&>(&Covers::loaded));
 		loader->stop();
 		loader = nullptr;
 	}
@@ -1579,8 +1579,8 @@ void Covers::tryToLocate(const Song& song)
 		qRegisterMetaType<LocatedCover>("LocatedCover");
 		qRegisterMetaType<QList<LocatedCover>>("QList<LocatedCover>");
 		locator = new CoverLocator();
-		connect(locator, SIGNAL(located(QList<LocatedCover>)), this, SLOT(located(QList<LocatedCover>)), Qt::QueuedConnection);
-		connect(this, SIGNAL(locate(Song)), locator, SLOT(locate(Song)), Qt::QueuedConnection);
+		connect(locator, &CoverLocator::located, this, &Covers::located, Qt::QueuedConnection);
+		connect(this, &Covers::locate, locator, qOverload<const Song&>(&CoverLocator::locate), Qt::QueuedConnection);
 	}
 	emit locate(song);
 }
@@ -1594,9 +1594,9 @@ void Covers::tryToDownload(const Song& song)
 #endif
 	if (!downloader) {
 		downloader = new CoverDownloader();
-		connect(this, SIGNAL(download(Song)), downloader, SLOT(download(Song)), Qt::QueuedConnection);
-		connect(downloader, SIGNAL(artistImage(Song, QImage, QString)), this, SLOT(artistImageDownloaded(Song, QImage, QString)), Qt::QueuedConnection);
-		connect(downloader, SIGNAL(cover(Song, QImage, QString)), this, SLOT(coverDownloaded(Song, QImage, QString)), Qt::QueuedConnection);
+		connect(this, &Covers::download, downloader, &CoverDownloader::download, Qt::QueuedConnection);
+		connect(downloader, &CoverDownloader::artistImage, this, &Covers::artistImageDownloaded, Qt::QueuedConnection);
+		connect(downloader, &CoverDownloader::cover, this, &Covers::coverDownloaded, Qt::QueuedConnection);
 	}
 	emit download(song);
 }
@@ -1607,8 +1607,8 @@ void Covers::tryToLoad(const Song& song)
 		qRegisterMetaType<LoadedCover>("LoadedCover");
 		qRegisterMetaType<QList<LoadedCover>>("QList<LoadedCover>");
 		loader = new CoverLoader();
-		connect(loader, SIGNAL(loaded(QList<LoadedCover>)), this, SLOT(loaded(QList<LoadedCover>)), Qt::QueuedConnection);
-		connect(this, SIGNAL(load(Song)), loader, SLOT(load(Song)), Qt::QueuedConnection);
+		connect(loader, &CoverLoader::loaded, this, qOverload<const QList<LoadedCover>&>(&Covers::loaded), Qt::QueuedConnection);
+		connect(this, &Covers::load, loader, qOverload<const Song&>(&CoverLoader::load), Qt::QueuedConnection);
 	}
 	emit load(song);
 }
diff --git a/gui/currentcover.cpp b/gui/currentcover.cpp
index 9c2c7fe49..c824d16e9 100644
--- a/gui/currentcover.cpp
+++ b/gui/currentcover.cpp
@@ -193,12 +193,12 @@ void CurrentCover::setEnabled(bool e)
 	enabled = e;
 	if (enabled) {
 		img = stdImage(Song());
-		connect(Covers::self(), SIGNAL(cover(const Song&, const QImage&, const QString&)), this, SLOT(coverRetrieved(const Song&, const QImage&, const QString&)));
-		connect(Covers::self(), SIGNAL(coverUpdated(const Song&, const QImage&, const QString&)), this, SLOT(coverRetrieved(const Song&, const QImage&, const QString&)));
+		connect(Covers::self(), &Covers::cover, this, &CurrentCover::coverRetrieved);
+		connect(Covers::self(), &Covers::coverUpdated, this, &CurrentCover::coverRetrieved);
 	}
 	else {
-		disconnect(Covers::self(), SIGNAL(cover(const Song&, const QImage&, const QString&)), this, SLOT(coverRetrieved(const Song&, const QImage&, const QString&)));
-		disconnect(Covers::self(), SIGNAL(coverUpdated(const Song&, const QImage&, const QString&)), this, SLOT(coverRetrieved(const Song&, const QImage&, const QString&)));
+		disconnect(Covers::self(), &Covers::cover, this, &CurrentCover::coverRetrieved);
+		disconnect(Covers::self(), &Covers::coverUpdated, this, &CurrentCover::coverRetrieved);
 		current = Song();
 	}
 }
@@ -241,7 +241,7 @@ void CurrentCover::update(const Song& s)
 				if (!timer) {
 					timer = new QTimer(this);
 					timer->setSingleShot(true);
-					connect(timer, SIGNAL(timeout()), this, SLOT(setDefault()));
+					connect(timer, &QTimer::timeout, this, &CurrentCover::setDefault);
 				}
 				timer->start(750);
 			}
diff --git a/gui/customactions.cpp b/gui/customactions.cpp
index e92bd9422..b13e312ea 100644
--- a/gui/customactions.cpp
+++ b/gui/customactions.cpp
@@ -68,7 +68,7 @@ CustomActions::CustomActions()
 			cmd.act = new Action(cmd.name, this);
 			m->addAction(cmd.act);
 			commands.append(cmd);
-			connect(cmd.act, SIGNAL(triggered()), this, SLOT(doAction()));
+			connect(cmd.act, &Action::triggered, this, &CustomActions::doAction);
 		}
 	}
 	setVisible(!commands.isEmpty());
@@ -90,7 +90,7 @@ void CustomActions::set(QList<Command> cmds)
 	if (diff) {
 		for (const Command& cmd : commands) {
 			m->removeAction(cmd.act);
-			disconnect(cmd.act, SIGNAL(triggered()), this, SLOT(doAction()));
+			disconnect(cmd.act, &Action::triggered, this, &CustomActions::doAction);
 			cmd.act->deleteLater();
 		}
 		commands.clear();
@@ -100,7 +100,7 @@ void CustomActions::set(QList<Command> cmds)
 			c.act = new Action(c.name, this);
 			m->addAction(c.act);
 			commands.append(c);
-			connect(c.act, SIGNAL(triggered()), this, SLOT(doAction()));
+			connect(c.act, &Action::triggered, this, &CustomActions::doAction);
 		}
 
 		Configuration cfg;
diff --git a/gui/customactionssettings.cpp b/gui/customactionssettings.cpp
index 9f918f109..84d009baf 100644
--- a/gui/customactionssettings.cpp
+++ b/gui/customactionssettings.cpp
@@ -116,10 +116,10 @@ CustomActionsSettings::CustomActionsSettings(QWidget* parent)
 	tree->header()->setStretchLastSection(true);
 	tree->setAlternatingRowColors(false);
 	tree->setItemDelegate(new BasicItemDelegate(this));
-	connect(tree, SIGNAL(itemSelectionChanged()), this, SLOT(controlButtons()));
-	connect(add, SIGNAL(clicked()), SLOT(addCommand()));
-	connect(edit, SIGNAL(clicked()), SLOT(editCommand()));
-	connect(del, SIGNAL(clicked()), SLOT(delCommand()));
+	connect(tree, &QTreeWidget::itemSelectionChanged, this, &CustomActionsSettings::controlButtons);
+	connect(add, &QPushButton::clicked, this, &CustomActionsSettings::addCommand);
+	connect(edit, &QPushButton::clicked, this, &CustomActionsSettings::editCommand);
+	connect(del, &QPushButton::clicked, this, &CustomActionsSettings::delCommand);
 }
 
 CustomActionsSettings::~CustomActionsSettings()
diff --git a/gui/initialsettingswizard.cpp b/gui/initialsettingswizard.cpp
index b74877027..723dbe2ff 100644
--- a/gui/initialsettingswizard.cpp
+++ b/gui/initialsettingswizard.cpp
@@ -45,13 +45,13 @@ InitialSettingsWizard::InitialSettingsWizard(QWidget* p)
 	: QWizard(p)
 {
 	setupUi(this);
-	connect(this, SIGNAL(currentIdChanged(int)), SLOT(pageChanged(int)));
-	connect(this, SIGNAL(setDetails(MPDConnectionDetails)), MPDConnection::self(), SLOT(setDetails(MPDConnectionDetails)));
-	connect(MPDConnection::self(), SIGNAL(stateChanged(bool)), SLOT(mpdConnectionStateChanged(bool)));
-	connect(MPDConnection::self(), SIGNAL(error(QString, bool)), SLOT(showError(QString)));
-	connect(MpdLibraryModel::self(), SIGNAL(error(QString)), SLOT(dbError(QString)));
-	connect(connectButton, SIGNAL(clicked(bool)), SLOT(connectToMpd()));
-	connect(basicDir, SIGNAL(textChanged(QString)), SLOT(controlNextButton()));
+	connect(this, &InitialSettingsWizard::currentIdChanged, this, &InitialSettingsWizard::pageChanged);
+	connect(this, &InitialSettingsWizard::setDetails, MPDConnection::self(), &MPDConnection::setDetails);
+	connect(MPDConnection::self(), &MPDConnection::stateChanged, this, &InitialSettingsWizard::mpdConnectionStateChanged);
+	connect(MPDConnection::self(), &MPDConnection::error, this, &InitialSettingsWizard::showError);
+	connect(MpdLibraryModel::self(), &MpdLibraryModel::error, this, &InitialSettingsWizard::dbError);
+	connect(connectButton, &QPushButton::clicked, this, &InitialSettingsWizard::connectToMpd);
+	connect(basicDir, &PathRequester::textChanged, this, &InitialSettingsWizard::controlNextButton);
 	MPDConnection::self()->start();
 	statusLabel->setText(tr("Not Connected"));
 
@@ -318,7 +318,7 @@ void InitialSettingsWizard::reject()
 	// Clear version number - so that wizard is shown next time Cantata is started.
 	Settings::self()->clearVersion();
 	ThreadCleaner::self()->stopAll();
-	QTimer::singleShot(0, qApp, SLOT(quit()));
+	QTimer::singleShot(0, qApp, &QGuiApplication::quit);
 	QDialog::reject();
 }
 
diff --git a/gui/interfacesettings.cpp b/gui/interfacesettings.cpp
index 3dd81f604..55afdf965 100644
--- a/gui/interfacesettings.cpp
+++ b/gui/interfacesettings.cpp
@@ -144,9 +144,9 @@ InterfaceSettings::InterfaceSettings(QWidget* p)
 #endif
 	addView(tr("Search (via MPD)"), QLatin1String("SearchPage"));
 	addView(tr("Info - Current song information (artist, album, and lyrics)"), QLatin1String("ContextPage"));
-	connect(playQueueView, SIGNAL(currentIndexChanged(int)), SLOT(playQueueViewChanged()));
-	connect(forceSingleClick, SIGNAL(toggled(bool)), SLOT(forceSingleClickChanged()));
-	connect(views, SIGNAL(itemChanged(QListWidgetItem*)), SLOT(viewItemChanged(QListWidgetItem*)));
+	connect(playQueueView, &QComboBox::currentIndexChanged, this, &InterfaceSettings::playQueueViewChanged);
+	connect(forceSingleClick, &QCheckBox::toggled, this, &InterfaceSettings::forceSingleClickChanged);
+	connect(views, &QListWidget::itemChanged, this, &InterfaceSettings::viewItemChanged);
 
 	sbStyle->addItem(tr("Large"), FancyTabWidget::Large);
 	sbStyle->addItem(tr("Small"), FancyTabWidget::Small);
@@ -154,7 +154,7 @@ InterfaceSettings::InterfaceSettings(QWidget* p)
 	sbPosition->addItem(Qt::LeftToRight == layoutDirection() ? tr("Left") : tr("Right"), FancyTabWidget::Side);
 	sbPosition->addItem(tr("Top"), FancyTabWidget::Top);
 	sbPosition->addItem(tr("Bottom"), FancyTabWidget::Bot);
-	connect(sbAutoHide, SIGNAL(toggled(bool)), SLOT(sbAutoHideChanged()));
+	connect(sbAutoHide, &QCheckBox::toggled, this, &InterfaceSettings::sbAutoHideChanged);
 	views->setItemDelegate(new BasicItemDelegate(views));
 	playQueueBackground_none->setProperty(constValueProperty, PlayQueueView::BI_None);
 	playQueueBackground_cover->setProperty(constValueProperty, PlayQueueView::BI_Cover);
@@ -164,16 +164,16 @@ InterfaceSettings::InterfaceSettings(QWidget* p)
 	int labelWidth = qMax(fontMetrics().horizontalAdvance(QLatin1String("100%")), fontMetrics().horizontalAdvance(tr("10px", "pixels")));
 	playQueueBackgroundOpacityLabel->setFixedWidth(labelWidth);
 	playQueueBackgroundBlurLabel->setFixedWidth(labelWidth);
-	connect(playQueueBackgroundOpacity, SIGNAL(valueChanged(int)), SLOT(setPlayQueueBackgroundOpacityLabel()));
-	connect(playQueueBackgroundBlur, SIGNAL(valueChanged(int)), SLOT(setPlayQueueBackgroundBlurLabel()));
-	connect(playQueueBackground_none, SIGNAL(toggled(bool)), SLOT(enablePlayQueueBackgroundOptions()));
-	connect(playQueueBackground_cover, SIGNAL(toggled(bool)), SLOT(enablePlayQueueBackgroundOptions()));
-	connect(playQueueBackground_custom, SIGNAL(toggled(bool)), SLOT(enablePlayQueueBackgroundOptions()));
-	connect(storeCoversInMpdDir, SIGNAL(toggled(bool)), this, SLOT(storeCoversInMpdDirToggled()));
+	connect(playQueueBackgroundOpacity, &QSlider::valueChanged, this, &InterfaceSettings::setPlayQueueBackgroundOpacityLabel);
+	connect(playQueueBackgroundBlur, &QSlider::valueChanged, this, &InterfaceSettings::setPlayQueueBackgroundBlurLabel);
+	connect(playQueueBackground_none, &QRadioButton::toggled, this, &InterfaceSettings::enablePlayQueueBackgroundOptions);
+	connect(playQueueBackground_cover, &QRadioButton::toggled, this, &InterfaceSettings::enablePlayQueueBackgroundOptions);
+	connect(playQueueBackground_custom, &QRadioButton::toggled, this, &InterfaceSettings::enablePlayQueueBackgroundOptions);
+	connect(storeCoversInMpdDir, &QCheckBox::toggled, this, &InterfaceSettings::storeCoversInMpdDirToggled);
 	if (enableTrayItem) {
-		connect(systemTrayCheckBox, SIGNAL(toggled(bool)), minimiseOnClose, SLOT(setEnabled(bool)));
-		connect(systemTrayCheckBox, SIGNAL(toggled(bool)), SLOT(enableStartupState()));
-		connect(minimiseOnClose, SIGNAL(toggled(bool)), SLOT(enableStartupState()));
+		connect(systemTrayCheckBox, &QCheckBox::toggled, minimiseOnClose, &QCheckBox::setEnabled);
+		connect(systemTrayCheckBox, &QCheckBox::toggled, this, &InterfaceSettings::enableStartupState);
+		connect(minimiseOnClose, &QCheckBox::toggled, this, &InterfaceSettings::enableStartupState);
 	}
 	else {
 		REMOVE(systemTrayCheckBox)
@@ -189,8 +189,8 @@ InterfaceSettings::InterfaceSettings(QWidget* p)
 	}
 #if defined Q_OS_WIN || defined Q_OS_MAC || !defined QT_QTDBUS_FOUND
 	if (systemTrayPopup && systemTrayCheckBox) {
-		connect(systemTrayCheckBox, SIGNAL(toggled(bool)), SLOT(systemTrayCheckBoxToggled()));
-		connect(systemTrayPopup, SIGNAL(toggled(bool)), SLOT(systemTrayPopupToggled()));
+		connect(systemTrayCheckBox, &QCheckBox::toggled, this, &InterfaceSettings::systemTrayCheckBoxToggled);
+		connect(systemTrayPopup, &QCheckBox::toggled, this, &InterfaceSettings::systemTrayPopupToggled);
 	}
 #endif
 	coverFilenameLabel->setToolTip(coverFilename->toolTip());
@@ -441,7 +441,7 @@ void InterfaceSettings::showEvent(QShowEvent* e)
 			REMOVE(langNoteLabel)
 		}
 		else {
-			connect(lang, SIGNAL(currentIndexChanged(int)), SLOT(langChanged()));
+			connect(lang, &QComboBox::currentIndexChanged, this, &InterfaceSettings::langChanged);
 		}
 
 		styleOption->addItem(tr("System default"));
@@ -467,7 +467,7 @@ void InterfaceSettings::showEvent(QShowEvent* e)
 					}
 				}
 			}
-			connect(styleOption, SIGNAL(currentIndexChanged(int)), SLOT(styleChanged()));
+			connect(styleOption, &QComboBox::currentIndexChanged, this, &InterfaceSettings::styleChanged);
 		}
 	}
 	QWidget::showEvent(e);
diff --git a/gui/librarypage.cpp b/gui/librarypage.cpp
index 36bd6422f..3a94ecade 100644
--- a/gui/librarypage.cpp
+++ b/gui/librarypage.cpp
@@ -39,15 +39,15 @@ LibraryPage::LibraryPage(QWidget* p)
 	: SinglePageWidget(p)
 {
 	genreCombo = new GenreCombo(this);
-	connect(StdActions::self()->addRandomAlbumToPlayQueueAction, SIGNAL(triggered()), SLOT(addRandomAlbum()));
-	connect(MPDConnection::self(), SIGNAL(updatingLibrary(time_t)), view, SLOT(updating()));
-	connect(MPDConnection::self(), SIGNAL(updatedLibrary()), view, SLOT(updated()));
-	connect(MPDConnection::self(), SIGNAL(updatingDatabase()), view, SLOT(updating()));
-	connect(MPDConnection::self(), SIGNAL(updatedDatabase()), view, SLOT(updated()));
-	connect(view, SIGNAL(itemsSelected(bool)), this, SLOT(controlActions()));
-	connect(view, SIGNAL(doubleClicked(const QModelIndex&)), this, SLOT(itemDoubleClicked(const QModelIndex&)));
+	connect(StdActions::self()->addRandomAlbumToPlayQueueAction, &Action::triggered, this, &LibraryPage::addRandomAlbum);
+	connect(MPDConnection::self(), &MPDConnection::updatingLibrary, view, &ItemView::updating);
+	connect(MPDConnection::self(), &MPDConnection::updatedLibrary, view, &ItemView::updated);
+	connect(MPDConnection::self(), &MPDConnection::updatingDatabase, view, &ItemView::updating);
+	connect(MPDConnection::self(), &MPDConnection::updatedDatabase, view, &ItemView::updated);
+	connect(view, &ItemView::itemsSelected, this, &LibraryPage::controlActions);
+	connect(view, &ItemView::doubleClicked, this, &LibraryPage::itemDoubleClicked);
 	view->setModel(MpdLibraryModel::self());
-	connect(MpdLibraryModel::self(), SIGNAL(modelReset()), this, SLOT(modelReset()));
+	connect(MpdLibraryModel::self(), &MpdLibraryModel::modelReset, this, &LibraryPage::modelReset);
 
 	view->allowCategorized();
 	// Settings...
@@ -66,9 +66,9 @@ LibraryPage::LibraryPage(QWidget* p)
 	showArtistImagesAction = new QAction(tr("Show Artist Images"), this);
 	showArtistImagesAction->setCheckable(true);
 	libraryAlbumSortAction = createMenuGroup(tr("Sort Albums"), QList<MenuItem>() << MenuItem(tr("Name"), LibraryDb::AS_AlArYr) << MenuItem(tr("Year"), LibraryDb::AS_YrAlAr),
-	                                         MpdLibraryModel::self()->libraryAlbumSort(), this, SLOT(libraryAlbumSortChanged()));
+	                                         MpdLibraryModel::self()->libraryAlbumSort(), this, &LibraryPage::libraryAlbumSortChanged);
 	albumAlbumSortAction = createMenuGroup(tr("Sort Albums"), QList<MenuItem>() << MenuItem(tr("Album, Artist, Year"), LibraryDb::AS_AlArYr) << MenuItem(tr("Album, Year, Artist"), LibraryDb::AS_AlYrAr) << MenuItem(tr("Artist, Album, Year"), LibraryDb::AS_ArAlYr) << MenuItem(tr("Artist, Year, Album"), LibraryDb::AS_ArYrAl) << MenuItem(tr("Year, Album, Artist"), LibraryDb::AS_YrAlAr) << MenuItem(tr("Year, Artist, Album"), LibraryDb::AS_YrArAl) << MenuItem(tr("Modified Date"), LibraryDb::AS_Modified),
-	                                       MpdLibraryModel::self()->albumAlbumSort(), this, SLOT(albumAlbumSortChanged()));
+	                                       MpdLibraryModel::self()->albumAlbumSort(), this, &LibraryPage::albumAlbumSortChanged);
 
 	MenuButton* menu = new MenuButton(this);
 	viewAction = createViewMenu(QList<ItemView::Mode>() << ItemView::Mode_BasicTree << ItemView::Mode_SimpleTree
@@ -77,20 +77,20 @@ LibraryPage::LibraryPage(QWidget* p)
 	menu->addAction(viewAction);
 
 	menu->addAction(createMenuGroup(tr("Group By"), QList<MenuItem>() << MenuItem(tr("Genre"), SqlLibraryModel::T_Genre) << MenuItem(tr("Artist"), SqlLibraryModel::T_Artist) << MenuItem(tr("Album"), SqlLibraryModel::T_Album),
-	                                MpdLibraryModel::self()->topLevel(), this, SLOT(groupByChanged())));
+	                                MpdLibraryModel::self()->topLevel(), this, &LibraryPage::groupByChanged));
 	genreCombo->setVisible(SqlLibraryModel::T_Genre != MpdLibraryModel::self()->topLevel());
 
 	menu->addAction(libraryAlbumSortAction);
 	menu->addAction(albumAlbumSortAction);
 	showArtistImagesAction->setChecked(MpdLibraryModel::self()->useArtistImages());
 	menu->addAction(showArtistImagesAction);
-	connect(showArtistImagesAction, SIGNAL(toggled(bool)), this, SLOT(showArtistImagesChanged(bool)));
+	connect(showArtistImagesAction, &QAction::toggled, this, &LibraryPage::showArtistImagesChanged);
 	showArtistImagesAction->setVisible(SqlLibraryModel::T_Album != MpdLibraryModel::self()->topLevel() && ItemView::Mode_IconTop != view->viewMode());
 	albumAlbumSortAction->setVisible(SqlLibraryModel::T_Album == MpdLibraryModel::self()->topLevel());
 	libraryAlbumSortAction->setVisible(SqlLibraryModel::T_Album != MpdLibraryModel::self()->topLevel());
 	genreCombo->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Preferred);
 	init(ReplacePlayQueue | AppendToPlayQueue, QList<QWidget*>() << menu << genreCombo);
-	connect(genreCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(doSearch()));
+	connect(genreCombo, &GenreCombo::currentIndexChanged, this, &LibraryPage::doSearch);
 	view->addAction(StdActions::self()->addToStoredPlaylistAction);
 	view->addAction(CustomActions::self());
 #ifdef TagLib_FOUND
@@ -108,7 +108,7 @@ LibraryPage::LibraryPage(QWidget* p)
 	view->addAction(StdActions::self()->deleteSongsAction);
 #endif
 #endif// TagLib_FOUND
-	connect(view, SIGNAL(updateToPlayQueue(QModelIndex, bool)), this, SLOT(updateToPlayQueue(QModelIndex, bool)));
+	connect(view, &ItemView::updateToPlayQueue, this, &LibraryPage::updateToPlayQueue);
 	view->setOpenAfterSearch(SqlLibraryModel::T_Album != MpdLibraryModel::self()->topLevel());
 	view->setInfoText(tr("No music? Looks like your MPD is not configured correctly."));
 
diff --git a/gui/localfolderpage.cpp b/gui/localfolderpage.cpp
index da5afc8b7..005623ff0 100644
--- a/gui/localfolderpage.cpp
+++ b/gui/localfolderpage.cpp
@@ -42,10 +42,10 @@ LocalFolderBrowsePage::LocalFolderBrowsePage(bool isHome, QWidget* p)
 			: new LocalBrowseModel(QLatin1String("localbrowseroot"), tr("Root"), tr("Browse files on your computer"), Icon::fa()->icon(fa::fa_regular, fa::fa_hdd), this);
 	proxy = new FileSystemProxyModel(model);
 	browseAction = new Action(Icon::fa()->icon(fa::fa_solid, fa::fa_folder_open), tr("Open In File Manager"), this);
-	connect(view, SIGNAL(itemsSelected(bool)), this, SLOT(controlActions()));
-	connect(view, SIGNAL(doubleClicked(const QModelIndex&)), this, SLOT(itemDoubleClicked(const QModelIndex&)));
-	connect(view, SIGNAL(headerClicked(int)), SLOT(headerClicked(int)));
-	connect(browseAction, SIGNAL(triggered()), this, SLOT(openFileManager()));
+	connect(view, &ItemView::itemsSelected, this, &LocalFolderBrowsePage::controlActions);
+	connect(view, &ItemView::doubleClicked, this, &LocalFolderBrowsePage::itemDoubleClicked);
+	connect(view, &ItemView::headerClicked, this, &LocalFolderBrowsePage::headerClicked);
+	connect(browseAction, &Action::triggered, this, &LocalFolderBrowsePage::openFileManager);
 	view->setModel(proxy);
 	Configuration config(configGroup());
 	view->load(config);
diff --git a/gui/mainwindow.cpp b/gui/mainwindow.cpp
index 869f53538..504cbb94b 100644
--- a/gui/mainwindow.cpp
+++ b/gui/mainwindow.cpp
@@ -256,22 +256,22 @@ MainWindow::MainWindow(QWidget* parent)
 
 	prefAction = ActionCollection::get()->createAction("configure", Utils::KDE == Utils::currentDe() ? tr("Configure Cantata...") : tr("Preferences..."),
 	                                                   Icons::self()->configureIcon);
-	connect(prefAction, SIGNAL(triggered()), this, SLOT(showPreferencesDialog()));
+	connect(prefAction, &Action::triggered, this, qOverload<>(&MainWindow::showPreferencesDialog));
 	quitAction = ActionCollection::get()->createAction("quit", tr("Quit"), Icons::self()->quitIcon);
-	connect(quitAction, SIGNAL(triggered()), this, SLOT(quit()));
+	connect(quitAction, &Action::triggered, this, &MainWindow::quit);
 	quitAction->setShortcut(QKeySequence::Quit);
 	Action* aboutAction = ActionCollection::get()->createAction("about", tr("About Cantata..."), Icons::self()->appIcon);
-	connect(aboutAction, SIGNAL(triggered()), this, SLOT(showAboutDialog()));
+	connect(aboutAction, &Action::triggered, this, &MainWindow::showAboutDialog);
 #ifdef Q_OS_MAC
 	prefAction->setMenuRole(QAction::PreferencesRole);
 	quitAction->setMenuRole(QAction::QuitRole);
 	aboutAction->setMenuRole(QAction::AboutRole);
 #endif
 	restoreAction = new Action(tr("Show Window"), this);
-	connect(restoreAction, SIGNAL(triggered()), this, SLOT(restoreWindow()));
+	connect(restoreAction, &Action::triggered, this, &MainWindow::restoreWindow);
 
 	serverInfoAction = ActionCollection::get()->createAction("mpdinfo", tr("Server information..."), Icon::fa()->icon(fa::fa_solid, fa::fa_server));
-	connect(serverInfoAction, SIGNAL(triggered()), this, SLOT(showServerInfo()));
+	connect(serverInfoAction, &Action::triggered, this, &MainWindow::showServerInfo);
 	serverInfoAction->setEnabled(Settings::self()->firstRun());
 	refreshDbAction = ActionCollection::get()->createAction("refresh", tr("Refresh Database"), Icons::self()->refreshIcon);
 	doDbRefreshAction = new Action(refreshDbAction->icon(), tr("Refresh"), this);
@@ -290,8 +290,8 @@ MainWindow::MainWindow(QWidget* parent)
 		Action* revAction = ActionCollection::get()->createAction("seekrev" + QString::number(seek), tr("Seek backward (%1 seconds)").arg(seek));
 		fwdAction->setProperty("offset", seek);
 		revAction->setProperty("offset", -1 * seek);
-		connect(fwdAction, SIGNAL(triggered()), MPDConnection::self(), SLOT(seek()));
-		connect(revAction, SIGNAL(triggered()), MPDConnection::self(), SLOT(seek()));
+		connect(fwdAction, &Action::triggered, MPDConnection::self(), &MPDConnection::seek);
+		connect(revAction, &Action::triggered, MPDConnection::self(), &MPDConnection::seek);
 		addAction(fwdAction);
 		addAction(revAction);
 		if (i < seekShortcuts.length()) {
@@ -363,7 +363,7 @@ MainWindow::MainWindow(QWidget* parent)
 	collapseAllAction->setShortcut(QKeyCombination(Qt::ControlModifier, Qt::Key_Up));
 	cancelAction = ActionCollection::get()->createAction("cancel", tr("Cancel"), Icons::self()->cancelIcon);
 	cancelAction->setShortcut(QKeyCombination(Qt::AltModifier, Qt::Key_Escape));
-	connect(cancelAction, SIGNAL(triggered()), messageWidget, SLOT(animatedHide()));
+	connect(cancelAction, &Action::triggered, messageWidget, &MessageWidget::animatedHide);
 
 	StdActions::self()->playPauseTrackAction->setEnabled(false);
 	StdActions::self()->nextTrackAction->setEnabled(false);
@@ -420,28 +420,28 @@ MainWindow::MainWindow(QWidget* parent)
 	addAction(showPlayQueueAction = ActionCollection::get()->createAction("showplayqueue", tr("Play Queue"), Icons::self()->playqueueIcon));
 	showPlayQueueAction->setShortcut(QKeyCombination(Qt::ControlModifier | Qt::ShiftModifier, Qt::Key_Q));
 	tabWidget->addTab(playQueuePage, TAB_ACTION(showPlayQueueAction), playQueueInSidebar);
-	connect(showPlayQueueAction, SIGNAL(triggered()), this, SLOT(showPlayQueue()));
+	connect(showPlayQueueAction, &Action::triggered, this, &MainWindow::showPlayQueue);
 	libraryPage = new LibraryPage(this);
 	addAction(libraryTabAction = ActionCollection::get()->createAction("showlibrarytab", tr("Library"), Icons::self()->libraryIcon));
 
 	libraryTabAction->setShortcut(QKeyCombination(Qt::ControlModifier | Qt::ShiftModifier, nextKey(sidebarPageShortcutKey)));
 	tabWidget->addTab(libraryPage, TAB_ACTION(libraryTabAction), !hiddenPages.contains(libraryPage->metaObject()->className()));
-	connect(libraryTabAction, SIGNAL(triggered()), this, SLOT(showLibraryTab()));
+	connect(libraryTabAction, &Action::triggered, this, &MainWindow::showLibraryTab);
 	folderPage = new FolderPage(this);
 	addAction(foldersTabAction = ActionCollection::get()->createAction("showfolderstab", tr("Folders"), Icons::self()->foldersIcon));
 	foldersTabAction->setShortcut(QKeyCombination(Qt::ControlModifier | Qt::ShiftModifier, nextKey(sidebarPageShortcutKey)));
 	tabWidget->addTab(folderPage, TAB_ACTION(foldersTabAction), !hiddenPages.contains(folderPage->metaObject()->className()));
-	connect(foldersTabAction, SIGNAL(triggered()), this, SLOT(showFoldersTab()));
+	connect(foldersTabAction, &Action::triggered, this, &MainWindow::showFoldersTab);
 	folderPage->setEnabled(!hiddenPages.contains(folderPage->metaObject()->className()));
 	playlistsPage = new PlaylistsPage(this);
 	addAction(playlistsTabAction = ActionCollection::get()->createAction("showplayliststab", tr("Playlists"), Icons::self()->playlistsIcon));
 	playlistsTabAction->setShortcut(QKeyCombination(Qt::ControlModifier | Qt::ShiftModifier, nextKey(sidebarPageShortcutKey)));
 	tabWidget->addTab(playlistsPage, TAB_ACTION(playlistsTabAction), !hiddenPages.contains(playlistsPage->metaObject()->className()));
-	connect(playlistsTabAction, SIGNAL(triggered()), this, SLOT(showPlaylistsTab()));
-	connect(playlistsPage, SIGNAL(error(const QString&)), SLOT(showError(const QString&)));
-	connect(DynamicPlaylists::self(), SIGNAL(error(const QString&)), SLOT(showError(const QString&)));
-	connect(DynamicPlaylists::self(), SIGNAL(running(bool)), dynamicLabel, SLOT(setVisible(bool)));
-	connect(DynamicPlaylists::self(), SIGNAL(running(bool)), this, SLOT(controlDynamicButton()));
+	connect(playlistsTabAction, &Action::triggered, this, &MainWindow::showPlaylistsTab);
+	connect(playlistsPage, &PlaylistsPage::error, this, &MainWindow::showError);
+	connect(DynamicPlaylists::self(), &DynamicPlaylists::error, this, &MainWindow::showError);
+	connect(DynamicPlaylists::self(), &DynamicPlaylists::running, dynamicLabel, &QLabel::setVisible);
+	connect(DynamicPlaylists::self(), &DynamicPlaylists::running, this, &MainWindow::controlDynamicButton);
 	stopDynamicButton->setDefaultAction(DynamicPlaylists::self()->stopAct());
 	onlinePage = new OnlineServicesPage(this);
 	addAction(onlineTabAction = ActionCollection::get()->createAction("showonlinetab", tr("Internet"), Icons::self()->onlineIcon));
@@ -449,22 +449,22 @@ MainWindow::MainWindow(QWidget* parent)
 	onlineTabAction->setShortcut(QKeyCombination(Qt::ControlModifier | Qt::ShiftModifier, nextKey(sidebarPageShortcutKey)));
 	tabWidget->addTab(onlinePage, TAB_ACTION(onlineTabAction), !hiddenPages.contains(onlinePage->metaObject()->className()));
 	onlinePage->setEnabled(!hiddenPages.contains(onlinePage->metaObject()->className()));
-	connect(onlineTabAction, SIGNAL(triggered()), this, SLOT(showOnlineTab()));
-	//    connect(onlinePage, SIGNAL(addToDevice(const QString &, const QString &, const QList<Song> &)), SLOT(copyToDevice(const QString &, const QString &, const QList<Song> &)));
-	connect(onlinePage, SIGNAL(error(const QString&)), this, SLOT(showError(const QString&)));
+	connect(onlineTabAction, &Action::triggered, this, &MainWindow::showOnlineTab);
+	//    connect(onlinePage, &OnlineServicesPage::addToDevice, this, &MainWindow::copyToDevice);
+	connect(onlinePage, &OnlineServicesPage::error, this, &MainWindow::showError);
 #ifdef ENABLE_DEVICES_SUPPORT
 	devicesPage = new DevicesPage(this);
 	addAction(devicesTabAction = ActionCollection::get()->createAction("showdevicestab", tr("Devices"), Icons::self()->devicesIcon));
 	devicesTabAction->setShortcut(QKeyCombination(Qt::ControlModifier | Qt::ShiftModifier, nextKey(sidebarPageShortcutKey)));
 	tabWidget->addTab(devicesPage, TAB_ACTION(devicesTabAction), !hiddenPages.contains(devicesPage->metaObject()->className()));
 	DevicesModel::self()->setEnabled(!hiddenPages.contains(devicesPage->metaObject()->className()));
-	connect(devicesTabAction, SIGNAL(triggered()), this, SLOT(showDevicesTab()));
+	connect(devicesTabAction, &Action::triggered, this, &MainWindow::showDevicesTab);
 #endif
 	searchPage = new SearchPage(this);
 	addAction(searchTabAction = ActionCollection::get()->createAction("showsearchtab", tr("Search"), Icons::self()->searchTabIcon));
 	searchTabAction->setShortcut(QKeyCombination(Qt::ControlModifier | Qt::ShiftModifier, nextKey(sidebarPageShortcutKey)));
-	connect(searchTabAction, SIGNAL(triggered()), this, SLOT(showSearchTab()));
-	connect(searchPage, SIGNAL(locate(QList<Song>)), this, SLOT(locateTracks(QList<Song>)));
+	connect(searchTabAction, &Action::triggered, this, &MainWindow::showSearchTab);
+	connect(searchPage, &SearchPage::locate, this, &MainWindow::locateTracks);
 	tabWidget->addTab(searchPage, TAB_ACTION(searchTabAction), !hiddenPages.contains(searchPage->metaObject()->className()));
 	tabWidget->addTab(contextPage, Icons::self()->infoSidebarIcon, tr("Info"), songInfoAction->text(),
 	                  !hiddenPages.contains(contextPage->metaObject()->className()));
@@ -496,8 +496,8 @@ MainWindow::MainWindow(QWidget* parent)
 
 	songInfoButton->setDefaultAction(songInfoAction);
 	fullScreenLabel->setVisible(false);
-	connect(fullScreenLabel, SIGNAL(leftClickedUrl()), fullScreenAction, SIGNAL(triggered()));
-	connect(playQueueSearchWidget, SIGNAL(active(bool)), playQueue, SLOT(searchActive(bool)));
+	connect(fullScreenLabel, &UrlLabel::leftClickedUrl, fullScreenAction, [this]{ fullScreenAction->QAction::triggered(); });
+	connect(playQueueSearchWidget, &PlayQueueSearchWidget::active, playQueue, &PlayQueueView::searchActive);
 	if (Configuration(playQueuePage->metaObject()->className()).get(ItemView::constSearchActiveKey, false)) {
 		playQueueSearchWidget->activate();
 	}
@@ -571,7 +571,7 @@ MainWindow::MainWindow(QWidget* parent)
 					resize(expandedSize.width() > 1 ? expandedSize : defaultSize);
 					// Issue #1137 Under Windows, Cantata does not restore maximized correctly if context is in sidebar
 					// ...so, set maximized after shown
-					QTimer::singleShot(0, this, SLOT(showMaximized()));
+					QTimer::singleShot(0, this, &MainWindow::showMaximized);
 					if (expandedSize.width() <= 1) {
 						expandedSize = defaultSize;
 					}
@@ -619,7 +619,7 @@ MainWindow::MainWindow(QWidget* parent)
 		showMenubarAction = ActionCollection::get()->createAction("showmenubar", tr("Show Menubar"));
 		showMenubarAction->setShortcut(QKeyCombination(Qt::ControlModifier, Qt::Key_M));
 		showMenubarAction->setCheckable(true);
-		connect(showMenubarAction, SIGNAL(toggled(bool)), this, SLOT(toggleMenubar()));
+		connect(showMenubarAction, &Action::toggled, this, &MainWindow::toggleMenubar);
 #endif
 
 		QMenu* menu = new QMenu(tr("&Music"), this);
@@ -747,7 +747,7 @@ MainWindow::MainWindow(QWidget* parent)
 		action->setShortcut(QKeyCombination(Qt::AltModifier, static_cast<Qt::Key>(Qt::Key_0 + i)));
 		action->setSettingsText(ratingAction);
 		ratingAction->menu()->addAction(action);
-		connect(action, SIGNAL(triggered()), SLOT(setRating()));
+		connect(action, &Action::triggered, this, &MainWindow::setRating);
 	}
 	playQueue->addAction(ratingAction);
 	playQueue->addAction(StdActions::self()->setPriorityAction);
@@ -779,140 +779,140 @@ MainWindow::MainWindow(QWidget* parent)
 	playQueue->readConfig();
 
 #ifdef ENABLE_DEVICES_SUPPORT
-	connect(DevicesModel::self(), SIGNAL(addToDevice(const QString&)), this, SLOT(addToDevice(const QString&)));
-	connect(DevicesModel::self(), SIGNAL(error(const QString&)), this, SLOT(showError(const QString&)));
-	connect(libraryPage, SIGNAL(addToDevice(const QString&, const QString&, const QList<Song>&)), SLOT(copyToDevice(const QString&, const QString&, const QList<Song>&)));
-	connect(folderPage->mpd(), SIGNAL(addToDevice(const QString&, const QString&, const QList<Song>&)), SLOT(copyToDevice(const QString&, const QString&, const QList<Song>&)));
-	connect(playlistsPage, SIGNAL(addToDevice(const QString&, const QString&, const QList<Song>&)), SLOT(copyToDevice(const QString&, const QString&, const QList<Song>&)));
-	connect(devicesPage, SIGNAL(addToDevice(const QString&, const QString&, const QList<Song>&)), SLOT(copyToDevice(const QString&, const QString&, const QList<Song>&)));
-	connect(searchPage, SIGNAL(addToDevice(const QString&, const QString&, const QList<Song>&)), SLOT(copyToDevice(const QString&, const QString&, const QList<Song>&)));
-	connect(StdActions::self()->deleteSongsAction, SIGNAL(triggered()), SLOT(deleteSongs()));
-	connect(devicesPage, SIGNAL(deleteSongs(const QString&, const QList<Song>&)), SLOT(deleteSongs(const QString&, const QList<Song>&)));
-	connect(libraryPage, SIGNAL(deleteSongs(const QString&, const QList<Song>&)), SLOT(deleteSongs(const QString&, const QList<Song>&)));
-	connect(folderPage->mpd(), SIGNAL(deleteSongs(const QString&, const QList<Song>&)), SLOT(deleteSongs(const QString&, const QList<Song>&)));
-	connect(searchPage, SIGNAL(deleteSongs(const QString&, const QList<Song>&)), SLOT(deleteSongs(const QString&, const QList<Song>&)));
+	connect(DevicesModel::self(), &DevicesModel::addToDevice, this, &MainWindow::addToDevice);
+	connect(DevicesModel::self(), &DevicesModel::error, this, &MainWindow::showError);
+	connect(libraryPage, &LibraryPage::addToDevice, this, &MainWindow::copyToDevice);
+	connect(folderPage->mpd(), &MpdBrowsePage::addToDevice, this, &MainWindow::copyToDevice);
+	connect(playlistsPage, &PlaylistsPage::addToDevice, this, &MainWindow::copyToDevice);
+	connect(devicesPage, &DevicesPage::addToDevice, this, &MainWindow::copyToDevice);
+	connect(searchPage, &SearchPage::addToDevice, this, &MainWindow::copyToDevice);
+	connect(StdActions::self()->deleteSongsAction, &Action::triggered, this, qOverload<>(&MainWindow::deleteSongs));
+	connect(devicesPage, qOverload<const QString&, const QList<Song>&>(&DevicesPage::deleteSongs), this, qOverload<const QString&, const QList<Song>&>(&MainWindow::deleteSongs));
+	connect(libraryPage, qOverload<const QString&, const QList<Song>&>(&LibraryPage::deleteSongs), this, qOverload<const QString&, const QList<Song>&>(&MainWindow::deleteSongs));
+	connect(folderPage->mpd(), qOverload<const QString&, const QList<Song>&>(&MpdBrowsePage::deleteSongs), this, qOverload<const QString&, const QList<Song>&>(&MainWindow::deleteSongs));
+	connect(searchPage, qOverload<const QString&, const QList<Song>&>(&SearchPage::deleteSongs), this, qOverload<const QString&, const QList<Song>&>(&MainWindow::deleteSongs));
 #endif
 	for (QAction* act : StdActions::self()->setPriorityAction->menu()->actions()) {
-		connect(act, SIGNAL(triggered()), this, SLOT(addWithPriority()));
+		connect(act, &QAction::triggered, this, &MainWindow::addWithPriority);
 	}
 	for (QAction* act : StdActions::self()->addWithPriorityAction->menu()->actions()) {
-		connect(act, SIGNAL(triggered()), this, SLOT(addWithPriority()));
-	}
-	connect(StdActions::self()->appendToPlayQueueAndPlayAction, SIGNAL(triggered()), this, SLOT(appendToPlayQueueAndPlay()));
-	connect(StdActions::self()->addToPlayQueueAndPlayAction, SIGNAL(triggered()), this, SLOT(addToPlayQueueAndPlay()));
-	connect(StdActions::self()->insertAfterCurrentAction, SIGNAL(triggered()), this, SLOT(insertIntoPlayQueue()));
-	connect(MPDConnection::self(), SIGNAL(partitionsUpdated(const QList<Partition>&)), this, SLOT(partitionsUpdated(const QList<Partition>&)));
-	connect(MPDConnection::self(), SIGNAL(outputsUpdated(const QList<Output>&)), this, SLOT(outputsUpdated(const QList<Output>&)));
-	connect(this, SIGNAL(changePartition(QString)), MPDConnection::self(), SLOT(changePartition(QString)));
-	connect(this, SIGNAL(newPartition(QString)), MPDConnection::self(), SLOT(newPartition(QString)));
-	connect(this, SIGNAL(delPartition(QString)), MPDConnection::self(), SLOT(delPartition(QString)));
-	connect(this, SIGNAL(enableOutput(quint32, bool)), MPDConnection::self(), SLOT(enableOutput(quint32, bool)));
-	connect(this, SIGNAL(moveOutput(QString)), MPDConnection::self(), SLOT(moveOutput(QString)));
-	connect(this, SIGNAL(outputs()), MPDConnection::self(), SLOT(outputs()));
-	connect(this, SIGNAL(pause(bool)), MPDConnection::self(), SLOT(setPause(bool)));
-	connect(this, SIGNAL(play()), MPDConnection::self(), SLOT(play()));
-	connect(this, SIGNAL(stop(bool)), MPDConnection::self(), SLOT(stopPlaying(bool)));
-	connect(this, SIGNAL(terminating()), MPDConnection::self(), SLOT(stop()));
-	connect(this, SIGNAL(getStatus()), MPDConnection::self(), SLOT(getStatus()));
-	connect(this, SIGNAL(playListInfo()), MPDConnection::self(), SLOT(playListInfo()));
-	connect(this, SIGNAL(currentSong()), MPDConnection::self(), SLOT(currentSong()));
-	connect(this, SIGNAL(setSeekId(qint32, quint32)), MPDConnection::self(), SLOT(setSeekId(qint32, quint32)));
-	connect(this, SIGNAL(startPlayingSongId(qint32)), MPDConnection::self(), SLOT(startPlayingSongId(qint32)));
-	connect(this, SIGNAL(setDetails(const MPDConnectionDetails&)), MPDConnection::self(), SLOT(setDetails(const MPDConnectionDetails&)));
-	connect(this, SIGNAL(setPriority(const QList<qint32>&, quint8, bool)), MPDConnection::self(), SLOT(setPriority(const QList<qint32>&, quint8, bool)));
-	connect(this, SIGNAL(addSongsToPlaylist(const QString&, const QStringList&)), MPDConnection::self(), SLOT(addToPlaylist(const QString&, const QStringList&)));
-	connect(PlayQueueModel::self(), SIGNAL(statsUpdated(int, quint32)), this, SLOT(updatePlayQueueStats(int, quint32)));
-	connect(PlayQueueModel::self(), SIGNAL(fetchingStreams()), playQueue, SLOT(showSpinner()));
-	connect(PlayQueueModel::self(), SIGNAL(streamsFetched()), playQueue, SLOT(hideSpinner()));
-	connect(PlayQueueModel::self(), SIGNAL(updateCurrent(Song)), SLOT(updateCurrentSong(Song)));
-	connect(PlayQueueModel::self(), SIGNAL(streamFetchStatus(QString)), playQueue, SLOT(streamFetchStatus(QString)));
-	connect(PlayQueueModel::self(), SIGNAL(error(QString)), SLOT(showError(QString)));
-	connect(playQueue, SIGNAL(cancelStreamFetch()), PlayQueueModel::self(), SLOT(cancelStreamFetch()));
-	connect(playQueue, SIGNAL(itemsSelected(bool)), SLOT(playQueueItemsSelected(bool)));
-	connect(MPDStatus::self(), SIGNAL(updated()), this, SLOT(updateStatus()));
-	connect(MPDConnection::self(), SIGNAL(playlistUpdated(const QList<Song>&, bool)), this, SLOT(updatePlayQueue(const QList<Song>&, bool)));
-	connect(MPDConnection::self(), SIGNAL(currentSongUpdated(Song)), this, SLOT(updateCurrentSong(Song)));
-	connect(MPDConnection::self(), SIGNAL(stateChanged(bool)), SLOT(mpdConnectionStateChanged(bool)));
-	connect(MPDConnection::self(), SIGNAL(error(const QString&, bool)), SLOT(showError(const QString&, bool)));
-	connect(MPDConnection::self(), SIGNAL(info(const QString&)), SLOT(showInformation(const QString&)));
-	connect(MPDConnection::self(), SIGNAL(dirChanged()), SLOT(checkMpdDir()));
-	connect(MPDConnection::self(), SIGNAL(connectionNotChanged(QString)), SLOT(mpdConnectionName(QString)));
-	connect(MpdLibraryModel::self(), SIGNAL(error(QString)), SLOT(showError(QString)));
-	connect(ApiKeys::self(), SIGNAL(error(const QString&)), SLOT(showError(const QString&)));
-	connect(refreshDbAction, SIGNAL(triggered()), this, SLOT(refreshDbPromp()));
-	connect(doDbRefreshAction, SIGNAL(triggered()), MpdLibraryModel::self(), SLOT(clearDb()));
-	connect(doDbRefreshAction, SIGNAL(triggered()), MPDConnection::self(), SLOT(update()));
-	connect(doDbRefreshAction, SIGNAL(triggered()), messageWidget, SLOT(animatedHide()));
-	connect(connectAction, SIGNAL(triggered()), this, SLOT(connectToMpd()));
-	connect(StdActions::self()->prevTrackAction, SIGNAL(triggered()), MPDConnection::self(), SLOT(goToPrevious()));
-	connect(StdActions::self()->nextTrackAction, SIGNAL(triggered()), MPDConnection::self(), SLOT(goToNext()));
-	connect(StdActions::self()->playPauseTrackAction, SIGNAL(triggered()), this, SLOT(playPauseTrack()));
-	connect(StdActions::self()->stopPlaybackAction, SIGNAL(triggered()), this, SLOT(stopPlayback()));
-	connect(StdActions::self()->stopAfterCurrentTrackAction, SIGNAL(triggered()), this, SLOT(stopAfterCurrentTrack()));
-	connect(stopAfterTrackAction, SIGNAL(triggered()), this, SLOT(stopAfterTrack()));
-	connect(this, SIGNAL(setVolume(int)), MPDConnection::self(), SLOT(setVolume(int)));
-	connect(nowPlaying, SIGNAL(sliderReleased()), this, SLOT(setPosition()));
-	connect(PlayQueueModel::self(), SIGNAL(currentSongRating(QString, quint8)), nowPlaying, SLOT(rating(QString, quint8)));
-	connect(randomPlayQueueAction, SIGNAL(triggered(bool)), MPDConnection::self(), SLOT(setRandom(bool)));
-	connect(repeatPlayQueueAction, SIGNAL(triggered(bool)), MPDConnection::self(), SLOT(setRepeat(bool)));
-	connect(singlePlayQueueAction, SIGNAL(triggered(bool)), MPDConnection::self(), SLOT(setSingle(bool)));
-	connect(consumePlayQueueAction, SIGNAL(triggered(bool)), MPDConnection::self(), SLOT(setConsume(bool)));
+		connect(act, &QAction::triggered, this, &MainWindow::addWithPriority);
+	}
+	connect(StdActions::self()->appendToPlayQueueAndPlayAction, &Action::triggered, this, &MainWindow::appendToPlayQueueAndPlay);
+	connect(StdActions::self()->addToPlayQueueAndPlayAction, &Action::triggered, this, &MainWindow::addToPlayQueueAndPlay);
+	connect(StdActions::self()->insertAfterCurrentAction, &Action::triggered, this, &MainWindow::insertIntoPlayQueue);
+	connect(MPDConnection::self(), &MPDConnection::partitionsUpdated, this, &MainWindow::partitionsUpdated);
+	connect(MPDConnection::self(), &MPDConnection::outputsUpdated, this, &MainWindow::outputsUpdated);
+	connect(this, &MainWindow::changePartition, MPDConnection::self(), &MPDConnection::changePartition);
+	connect(this, &MainWindow::newPartition, MPDConnection::self(), &MPDConnection::newPartition);
+	connect(this, &MainWindow::delPartition, MPDConnection::self(), &MPDConnection::delPartition);
+	connect(this, &MainWindow::enableOutput, MPDConnection::self(), &MPDConnection::enableOutput);
+	connect(this, &MainWindow::moveOutput, MPDConnection::self(), &MPDConnection::moveOutput);
+	connect(this, &MainWindow::outputs, MPDConnection::self(), &MPDConnection::outputs);
+	connect(this, &MainWindow::pause, MPDConnection::self(), &MPDConnection::setPause);
+	connect(this, &MainWindow::play, MPDConnection::self(), &MPDConnection::play);
+	connect(this, &MainWindow::stop, MPDConnection::self(), &MPDConnection::stopPlaying);
+	connect(this, &MainWindow::terminating, MPDConnection::self(), &MPDConnection::stop);
+	connect(this, &MainWindow::getStatus, MPDConnection::self(), &MPDConnection::getStatus);
+	connect(this, &MainWindow::playListInfo, MPDConnection::self(), &MPDConnection::playListInfo);
+	connect(this, &MainWindow::currentSong, MPDConnection::self(), &MPDConnection::currentSong);
+	connect(this, &MainWindow::setSeekId, MPDConnection::self(), &MPDConnection::setSeekId);
+	connect(this, &MainWindow::startPlayingSongId, MPDConnection::self(), &MPDConnection::startPlayingSongId);
+	connect(this, &MainWindow::setDetails, MPDConnection::self(), &MPDConnection::setDetails);
+	connect(this, &MainWindow::setPriority, MPDConnection::self(), &MPDConnection::setPriority);
+	connect(this, &MainWindow::addSongsToPlaylist, MPDConnection::self(), qOverload<const QString&, const QStringList&>(&MPDConnection::addToPlaylist));
+	connect(PlayQueueModel::self(), &PlayQueueModel::statsUpdated, this, &MainWindow::updatePlayQueueStats);
+	connect(PlayQueueModel::self(), &PlayQueueModel::fetchingStreams, playQueue, &PlayQueueView::showSpinner);
+	connect(PlayQueueModel::self(), &PlayQueueModel::streamsFetched, playQueue, &PlayQueueView::hideSpinner);
+	connect(PlayQueueModel::self(), &PlayQueueModel::updateCurrent, this, [this](const Song& song) { updateCurrentSong(song); });
+	connect(PlayQueueModel::self(), &PlayQueueModel::streamFetchStatus, playQueue, &PlayQueueView::streamFetchStatus);
+	connect(PlayQueueModel::self(), &PlayQueueModel::error, this, &MainWindow::showError);
+	connect(playQueue, &PlayQueueView::cancelStreamFetch, PlayQueueModel::self(), &PlayQueueModel::cancelStreamFetch);
+	connect(playQueue, &PlayQueueView::itemsSelected, this, &MainWindow::playQueueItemsSelected);
+	connect(MPDStatus::self(), &MPDStatus::updated, this, qOverload<>(&MainWindow::updateStatus));
+	connect(MPDConnection::self(), &MPDConnection::playlistUpdated, this, &MainWindow::updatePlayQueue);
+	connect(MPDConnection::self(), &MPDConnection::currentSongUpdated, this, [this](const Song& song) { updateCurrentSong(song); });
+	connect(MPDConnection::self(), &MPDConnection::stateChanged, this, &MainWindow::mpdConnectionStateChanged);
+	connect(MPDConnection::self(), &MPDConnection::error, this, &MainWindow::showError);
+	connect(MPDConnection::self(), &MPDConnection::info, this, &MainWindow::showInformation);
+	connect(MPDConnection::self(), &MPDConnection::dirChanged, this, &MainWindow::checkMpdDir);
+	connect(MPDConnection::self(), &MPDConnection::connectionNotChanged, this, &MainWindow::mpdConnectionName);
+	connect(MpdLibraryModel::self(), &MpdLibraryModel::error, this, &MainWindow::showError);
+	connect(ApiKeys::self(), &ApiKeys::error, this, &MainWindow::showError);
+	connect(refreshDbAction, &Action::triggered, this, &MainWindow::refreshDbPromp);
+	connect(doDbRefreshAction, &Action::triggered, MpdLibraryModel::self(), &MpdLibraryModel::clearDb);
+	connect(doDbRefreshAction, &Action::triggered, MPDConnection::self(), &MPDConnection::update);
+	connect(doDbRefreshAction, &Action::triggered, messageWidget, &MessageWidget::animatedHide);
+	connect(connectAction, &Action::triggered, this, qOverload<>(&MainWindow::connectToMpd));
+	connect(StdActions::self()->prevTrackAction, &Action::triggered, MPDConnection::self(), &MPDConnection::goToPrevious);
+	connect(StdActions::self()->nextTrackAction, &Action::triggered, MPDConnection::self(), &MPDConnection::goToNext);
+	connect(StdActions::self()->playPauseTrackAction, &Action::triggered, this, &MainWindow::playPauseTrack);
+	connect(StdActions::self()->stopPlaybackAction, &Action::triggered, this, &MainWindow::stopPlayback);
+	connect(StdActions::self()->stopAfterCurrentTrackAction, &Action::triggered, this, &MainWindow::stopAfterCurrentTrack);
+	connect(stopAfterTrackAction, &Action::triggered, this, &MainWindow::stopAfterTrack);
+	connect(this, &MainWindow::setVolume, MPDConnection::self(), &MPDConnection::setVolume);
+	connect(nowPlaying, &NowPlayingWidget::sliderReleased, this, &MainWindow::setPosition);
+	connect(PlayQueueModel::self(), &PlayQueueModel::currentSongRating, nowPlaying, &NowPlayingWidget::rating);
+	connect(randomPlayQueueAction, &Action::triggered, MPDConnection::self(), &MPDConnection::setRandom);
+	connect(repeatPlayQueueAction, &Action::triggered, MPDConnection::self(), &MPDConnection::setRepeat);
+	connect(singlePlayQueueAction, &Action::triggered, MPDConnection::self(), &MPDConnection::setSingle);
+	connect(consumePlayQueueAction, &Action::triggered, MPDConnection::self(), &MPDConnection::setConsume);
 #ifdef ENABLE_HTTP_STREAM_PLAYBACK
-	connect(streamPlayAction, SIGNAL(triggered(bool)), HttpStream::self(), SLOT(setEnabled(bool)));
-	connect(MPDConnection::self(), SIGNAL(streamUrl(QString)), SLOT(streamUrl(QString)));
-#endif
-	connect(playQueueSearchWidget, SIGNAL(returnPressed()), this, SLOT(searchPlayQueue()));
-	connect(playQueueSearchWidget, SIGNAL(textChanged(const QString)), this, SLOT(searchPlayQueue()));
-	connect(playQueueSearchWidget, SIGNAL(active(bool)), this, SLOT(playQueueSearchActivated(bool)));
-	connect(playQueue, SIGNAL(doubleClicked(const QModelIndex&)), this, SLOT(playQueueItemActivated(const QModelIndex&)));
-	connect(StdActions::self()->removeAction, SIGNAL(triggered()), this, SLOT(removeItems()));
-	connect(StdActions::self()->appendToPlayQueueAction, SIGNAL(triggered()), this, SLOT(appendToPlayQueue()));
-	connect(StdActions::self()->replacePlayQueueAction, SIGNAL(triggered()), this, SLOT(replacePlayQueue()));
-	connect(playQueue->removeFromAct(), SIGNAL(triggered()), this, SLOT(removeFromPlayQueue()));
-	connect(clearPlayQueueAction, SIGNAL(triggered()), playQueueSearchWidget, SLOT(clear()));
-	connect(clearPlayQueueAction, SIGNAL(triggered()), this, SLOT(clearPlayQueue()));
-	connect(centerPlayQueueAction, SIGNAL(triggered()), this, SLOT(centerPlayQueue()));
-	connect(cropPlayQueueAction, SIGNAL(triggered()), this, SLOT(cropPlayQueue()));
-	connect(songInfoAction, SIGNAL(triggered()), this, SLOT(showSongInfo()));
-	connect(expandInterfaceAction, SIGNAL(triggered()), this, SLOT(expandOrCollapse()));
-	connect(fullScreenAction, SIGNAL(triggered()), this, SLOT(fullScreen()));
+	connect(streamPlayAction, &Action::triggered, HttpStream::self(), &HttpStream::setEnabled);
+	connect(MPDConnection::self(), &MPDConnection::streamUrl, this, &MainWindow::streamUrl);
+#endif
+	connect(playQueueSearchWidget, &PlayQueueSearchWidget::returnPressed, this, &MainWindow::searchPlayQueue);
+	connect(playQueueSearchWidget, &PlayQueueSearchWidget::textChanged, this, &MainWindow::searchPlayQueue);
+	connect(playQueueSearchWidget, &PlayQueueSearchWidget::active, this, &MainWindow::playQueueSearchActivated);
+	connect(playQueue, &PlayQueueView::doubleClicked, this, &MainWindow::playQueueItemActivated);
+	connect(StdActions::self()->removeAction, &Action::triggered, this, &MainWindow::removeItems);
+	connect(StdActions::self()->appendToPlayQueueAction, &Action::triggered, this, qOverload<>(&MainWindow::appendToPlayQueue));
+	connect(StdActions::self()->replacePlayQueueAction, &Action::triggered, this, &MainWindow::replacePlayQueue);
+	connect(playQueue->removeFromAct(), &Action::triggered, this, &MainWindow::removeFromPlayQueue);
+	connect(clearPlayQueueAction, &Action::triggered, playQueueSearchWidget, &PlayQueueSearchWidget::clear);
+	connect(clearPlayQueueAction, &Action::triggered, this, &MainWindow::clearPlayQueue);
+	connect(centerPlayQueueAction, &Action::triggered, this, &MainWindow::centerPlayQueue);
+	connect(cropPlayQueueAction, &Action::triggered, this, &MainWindow::cropPlayQueue);
+	connect(songInfoAction, &Action::triggered, this, &MainWindow::showSongInfo);
+	connect(expandInterfaceAction, &Action::triggered, this, &MainWindow::expandOrCollapse);
+	connect(fullScreenAction, &Action::triggered, this, &MainWindow::fullScreen);
 #ifdef TagLib_FOUND
-	connect(StdActions::self()->editTagsAction, SIGNAL(triggered()), this, SLOT(editTags()));
-	connect(editPlayQueueTagsAction, SIGNAL(triggered()), this, SLOT(editTags()));
-	connect(StdActions::self()->organiseFilesAction, SIGNAL(triggered()), SLOT(organiseFiles()));
-#endif
-	connect(context, SIGNAL(findArtist(QString)), this, SLOT(locateArtist(QString)));
-	connect(context, SIGNAL(findAlbum(QString, QString)), this, SLOT(locateAlbum(QString, QString)));
-	connect(context, SIGNAL(playSong(QString)), PlayQueueModel::self(), SLOT(playSong(QString)));
-	connect(locateTrackAction, SIGNAL(triggered()), this, SLOT(locateTrack()));
-	connect(locateAlbumAction, SIGNAL(triggered()), this, SLOT(locateTrack()));
-	connect(locateArtistAction, SIGNAL(triggered()), this, SLOT(locateTrack()));
-	connect(this, SIGNAL(playNext(QList<quint32>, quint32, quint32)), MPDConnection::self(), SLOT(move(QList<quint32>, quint32, quint32)));
-	connect(playNextAction, SIGNAL(triggered()), this, SLOT(moveSelectionAfterCurrentSong()));
-	connect(moveToBeginning, SIGNAL(triggered()), this, SLOT(moveSelectionAtQueueStart()));
-	connect(moveToEnd, SIGNAL(triggered()), this, SLOT(moveSelectionAtQueueEnd()));
-	connect(qApp, SIGNAL(paletteChanged(const QPalette&)), this, SLOT(paletteChanged()));
-
-	connect(StdActions::self()->searchAction, SIGNAL(triggered()), SLOT(showSearch()));
-	connect(searchPlayQueueAction, SIGNAL(triggered()), this, SLOT(showPlayQueueSearch()));
-	connect(playQueue, SIGNAL(focusSearch(QString)), playQueueSearchWidget, SLOT(activate(QString)));
-	connect(expandAllAction, SIGNAL(triggered()), this, SLOT(expandAll()));
-	connect(collapseAllAction, SIGNAL(triggered()), this, SLOT(collapseAll()));
-	connect(addStreamToPlayQueueAction, SIGNAL(triggered()), this, SLOT(addStreamToPlayQueue()));
-	connect(addLocalFilesToPlayQueueAction, SIGNAL(triggered()), this, SLOT(addLocalFilesToPlayQueue()));
-	connect(splitter, SIGNAL(splitterMoved(int, int)), this, SLOT(controlPlayQueueButtons()));
-	connect(StdActions::self()->setCoverAction, SIGNAL(triggered()), SLOT(setCover()));
+	connect(StdActions::self()->editTagsAction, &Action::triggered, this, &MainWindow::editTags);
+	connect(editPlayQueueTagsAction, &Action::triggered, this, &MainWindow::editTags);
+	connect(StdActions::self()->organiseFilesAction, &Action::triggered, this, &MainWindow::organiseFiles);
+#endif
+	connect(context, &ContextWidget::findArtist, this, &MainWindow::locateArtist);
+	connect(context, &ContextWidget::findAlbum, this, &MainWindow::locateAlbum);
+	connect(context, &ContextWidget::playSong, PlayQueueModel::self(), &PlayQueueModel::playSong);
+	connect(locateTrackAction, &Action::triggered, this, &MainWindow::locateTrack);
+	connect(locateAlbumAction, &Action::triggered, this, &MainWindow::locateTrack);
+	connect(locateArtistAction, &Action::triggered, this, &MainWindow::locateTrack);
+	connect(this, &MainWindow::playNext, MPDConnection::self(), qOverload<const QList<quint32>&, quint32, quint32>(&MPDConnection::move));
+	connect(playNextAction, &Action::triggered, this, &MainWindow::moveSelectionAfterCurrentSong);
+	connect(moveToBeginning, &Action::triggered, this, &MainWindow::moveSelectionAtQueueStart);
+	connect(moveToEnd, &Action::triggered, this, &MainWindow::moveSelectionAtQueueEnd);
+	connect(qApp, &QGuiApplication::paletteChanged, this, &MainWindow::paletteChanged);
+
+	connect(StdActions::self()->searchAction, &Action::triggered, this, &MainWindow::showSearch);
+	connect(searchPlayQueueAction, &Action::triggered, this, &MainWindow::showPlayQueueSearch);
+	connect(playQueue, &PlayQueueView::focusSearch, playQueueSearchWidget, &PlayQueueSearchWidget::activate);
+	connect(expandAllAction, &Action::triggered, this, &MainWindow::expandAll);
+	connect(collapseAllAction, &Action::triggered, this, &MainWindow::collapseAll);
+	connect(addStreamToPlayQueueAction, &Action::triggered, this, &MainWindow::addStreamToPlayQueue);
+	connect(addLocalFilesToPlayQueueAction, &Action::triggered, this, &MainWindow::addLocalFilesToPlayQueue);
+	connect(splitter, &AutohidingSplitter::splitterMoved, this, &MainWindow::controlPlayQueueButtons);
+	connect(StdActions::self()->setCoverAction, &Action::triggered, this, &MainWindow::setCover);
 #ifdef ENABLE_REPLAYGAIN_SUPPORT
-	connect(StdActions::self()->replaygainAction, SIGNAL(triggered()), SLOT(replayGain()));
+	connect(StdActions::self()->replaygainAction, &Action::triggered, this, &MainWindow::replayGain);
 #endif
-	connect(PlaylistsModel::self(), SIGNAL(addToNew()), this, SLOT(addToNewStoredPlaylist()));
-	connect(PlaylistsModel::self(), SIGNAL(addToExisting(const QString&)), this, SLOT(addToExistingStoredPlaylist(const QString&)));
+	connect(PlaylistsModel::self(), &PlaylistsModel::addToNew, this, &MainWindow::addToNewStoredPlaylist);
+	connect(PlaylistsModel::self(), &PlaylistsModel::addToExisting, this, qOverload<const QString&>(&MainWindow::addToExistingStoredPlaylist));
 	// TODO: Why is this here???
-	//    connect(playlistsPage, SIGNAL(add(const QStringList &, bool, quint8)), PlayQueueModel::self(), SLOT(addItems(const QStringList &, bool, quint8)));
-	connect(coverWidget, SIGNAL(clicked()), expandInterfaceAction, SLOT(trigger()));
+	//    connect(playlistsPage, &PlayListsPage::add, PlayQueueModel::self(), &MainWindow::addItems);
+	connect(coverWidget, &CoverWidget::clicked, expandInterfaceAction, &Action::trigger);
 #if !defined Q_OS_WIN && !defined Q_OS_MAC
-	connect(MountPoints::self(), SIGNAL(updated()), SLOT(checkMpdAccessibility()));
-	connect(qApp, SIGNAL(commitDataRequest(QSessionManager&)), SLOT(commitDataRequest(QSessionManager&)));
+	connect(MountPoints::self(), &MountPoints::updated, this, &MainWindow::checkMpdAccessibility);
+	connect(qApp, &QGuiApplication::commitDataRequest, this, &MainWindow::commitDataRequest);
 #endif
 	playQueueItemsSelected(false);
 	playQueue->setFocus();
@@ -928,9 +928,9 @@ MainWindow::MainWindow(QWidget* parent)
 		}
 	}
 
-	connect(tabWidget, SIGNAL(currentChanged(int)), this, SLOT(currentTabChanged(int)));
-	connect(tabWidget, SIGNAL(tabToggled(int)), this, SLOT(tabToggled(int)));
-	connect(tabWidget, SIGNAL(styleChanged(int)), this, SLOT(sidebarModeChanged()));
+	connect(tabWidget, &FancyTabWidget::currentChanged, this, &MainWindow::currentTabChanged);
+	connect(tabWidget, &FancyTabWidget::tabToggled, this, &MainWindow::tabToggled);
+	connect(tabWidget, &FancyTabWidget::styleChanged, this, &MainWindow::sidebarModeChanged);
 
 	readSettings();
 	updateConnectionsMenu();
@@ -962,7 +962,7 @@ MainWindow::MainWindow(QWidget* parent)
 	else {
 		show();
 	}
-	QTimer::singleShot(0, this, SLOT(controlPlayQueueButtons()));
+	QTimer::singleShot(0, this, &MainWindow::controlPlayQueueButtons);
 }
 
 MainWindow::~MainWindow()
@@ -1073,7 +1073,7 @@ void MainWindow::addMenuAction(QMenu* menu, QAction* action)
 }
 #endif
 
-void MainWindow::showError(const QString& message, bool showActions)
+void MainWindow::showError(const QString& message)
 {
 	if (!message.isEmpty()) {
 		if (!isVisible()) {
@@ -1088,12 +1088,7 @@ void MainWindow::showError(const QString& message, bool showActions)
 	else {
 		messageWidget->setError(message);
 	}
-	if (showActions) {
-		messageWidget->setActions(QList<QAction*>() << prefAction << connectAction);
-	}
-	else {
-		messageWidget->removeAllActions();
-	}
+	messageWidget->removeAllActions();
 	QApplication::alert(this);
 }
 
@@ -1166,7 +1161,7 @@ void MainWindow::showEvent(QShowEvent* event)
 	if (!shown) {
 		shown = true;
 		// Work-around for qt5ct palette issues...
-		QTimer::singleShot(0, this, SLOT(paletteChanged()));
+		QTimer::singleShot(0, this, &MainWindow::paletteChanged);
 	}
 }
 
@@ -1304,22 +1299,19 @@ bool MainWindow::canShowDialog()
 	return true;
 }
 
-void MainWindow::showPreferencesDialog(const QString& page)
+void MainWindow::showPreferencesDialog()
 {
 	if (PreferencesDialog::instanceCount()) {
-		emit showPreferencesPage(page.isEmpty() ? "collection" : page);
+		emit showPreferencesPage("collection");
 	}
 	if (PreferencesDialog::instanceCount() || !canShowDialog()) {
 		return;
 	}
 	PreferencesDialog* pref = new PreferencesDialog(this);
 	controlConnectionsMenu(false);
-	connect(pref, SIGNAL(settingsSaved()), this, SLOT(updateSettings()));
-	connect(pref, SIGNAL(destroyed()), SLOT(controlConnectionsMenu()));
-	connect(this, SIGNAL(showPreferencesPage(QString)), pref, SLOT(showPage(QString)));
-	if (!page.isEmpty()) {
-		pref->showPage(page);
-	}
+	connect(pref, &PreferencesDialog::settingsSaved, this, &MainWindow::updateSettings);
+	connect(pref, &PreferencesDialog::destroyed, this, &MainWindow::controlConnectionsMenu);
+	connect(this, &MainWindow::showPreferencesPage, pref, &PreferencesDialog::showPage);
 	pref->show();
 }
 
@@ -1387,18 +1379,18 @@ void MainWindow::partitionsUpdated(const QList<Partition>& partitions)
 	QList<Partition> sortedPartitions = partitions;
 	std::sort(sortedPartitions.begin(), sortedPartitions.end());
 	for (const Partition& p : sortedPartitions) {
-		QAction* act = menu->addAction(Utils::escapeActionText(p.name), this, SLOT(selectPartition()));
+		QAction* act = menu->addAction(Utils::escapeActionText(p.name), this, &MainWindow::selectPartition);
 		act->setData(p.name);
 		act->setCheckable(true);
 		act->setChecked(p.name == current);
 		act->setActionGroup(partitionsGroup);
 	}
 	menu->addSeparator();
-	menu->addAction(tr("Create new partition"), this, SLOT(createNewPartition()));
+	menu->addAction(tr("Create new partition"), this, &MainWindow::createNewPartition);
 	QMenu* deleteMenu = menu->addMenu(tr("Remove partition"));
 	deleteMenu->menuAction()->setData("deletepartition");
 	for (const Partition& p : sortedPartitions) {
-		QAction* act = deleteMenu->addAction(Utils::escapeActionText(p.name), this, SLOT(deleteAPartition()));
+		QAction* act = deleteMenu->addAction(Utils::escapeActionText(p.name), this, &MainWindow::deleteAPartition);
 		act->setData(p.name);
 		act->setVisible(p.name != current);
 	}
@@ -1459,7 +1451,7 @@ void MainWindow::outputsUpdated(const QList<Output>& outputs)
 			if (!o.inCurrentPartition) {
 				continue;
 			}
-			QAction* act = menu->addAction(Utils::escapeActionText(o.name), this, SLOT(toggleOutput()));
+			QAction* act = menu->addAction(Utils::escapeActionText(o.name), this, &MainWindow::toggleOutput);
 			act->setData(o.id);
 			act->setCheckable(true);
 			act->setChecked(o.enabled);
@@ -1473,7 +1465,7 @@ void MainWindow::outputsUpdated(const QList<Output>& outputs)
 			if (o.inCurrentPartition) {
 				continue;
 			}
-			QAction* act = moveMenu->addAction(Utils::escapeActionText(o.name), this, SLOT(moveOutputToThisPartition()));
+			QAction* act = moveMenu->addAction(Utils::escapeActionText(o.name), this, &MainWindow::moveOutputToThisPartition);
 			act->setData(o.name);
 		}
 	}
@@ -1548,7 +1540,7 @@ void MainWindow::updateConnectionsMenu()
 			std::sort(connections.begin(), connections.end());
 			Qt::Key i = Qt::Key_1;
 			for (const MPDConnectionDetails& d : connections) {
-				QAction* act = menu->addAction(Utils::escapeActionText(d.getName()), this, SLOT(changeConnection()));
+				QAction* act = menu->addAction(Utils::escapeActionText(d.getName()), this, &MainWindow::changeConnection);
 				act->setData(d.name);
 				act->setCheckable(true);
 				act->setChecked(d.name == currentConn);
@@ -1590,11 +1582,11 @@ void MainWindow::initMpris()
 	if (Settings::self()->mpris()) {
 		if (!mpris) {
 			mpris = new Mpris(this);
-			connect(mpris, SIGNAL(showMainWindow()), this, SLOT(restoreWindow()));
+			connect(mpris, &Mpris::showMainWindow, this, &MainWindow::restoreWindow);
 		}
 	}
 	else if (mpris) {
-		disconnect(mpris, SIGNAL(showMainWindow()), this, SLOT(restoreWindow()));
+		disconnect(mpris, &Mpris::showMainWindow, this, &MainWindow::restoreWindow);
 		mpris->deleteLater();
 		mpris = nullptr;
 	}
@@ -1638,7 +1630,7 @@ void MainWindow::readSettings()
 	// It appears as if the KDE MPRIS code does not like the MPRIS interface to be setup before the window is visible.
 	// to work-around this, initMpris in the next event loop iteration.
 	// See #863
-	QTimer::singleShot(0, this, SLOT(initMpris()));
+	QTimer::singleShot(0, this, &MainWindow::initMpris);
 #else
 	CurrentCover::self()->setEnabled(Settings::self()->showPopups() || 0 != Settings::self()->playQueueBackground() || Settings::self()->showCoverWidget());
 #endif
@@ -1867,7 +1859,7 @@ void MainWindow::searchPlayQueue()
 		if (!playQueueSearchTimer) {
 			playQueueSearchTimer = new QTimer(this);
 			playQueueSearchTimer->setSingleShot(true);
-			connect(playQueueSearchTimer, SIGNAL(timeout()), SLOT(realSearchPlayQueue()));
+			connect(playQueueSearchTimer, &QTimer::timeout, this, &MainWindow::realSearchPlayQueue);
 		}
 		playQueueSearchTimer->start(250);
 	}
@@ -2071,7 +2063,7 @@ void MainWindow::updateStatus(MPDStatus* const status)
 			if (!statusTimer) {
 				statusTimer = new QTimer(this);
 				statusTimer->setSingleShot(true);
-				connect(statusTimer, SIGNAL(timeout()), SIGNAL(getStatus()));
+				connect(statusTimer, &QTimer::timeout, this, &MainWindow::getStatus);
 			}
 			QVariant id = statusTimer->property("id");
 			if (!id.isValid() || id.toInt() != current.id) {
@@ -2353,7 +2345,7 @@ void MainWindow::checkMpdAccessibility()
 #ifdef Q_OS_LINUX
 	if (!mpdAccessibilityTimer) {
 		mpdAccessibilityTimer = new QTimer(this);
-		connect(mpdAccessibilityTimer, SIGNAL(timeout()), SLOT(checkMpdDir()));
+		connect(mpdAccessibilityTimer, &QTimer::timeout, this, &MainWindow::checkMpdDir);
 	}
 	mpdAccessibilityTimer->start(500);
 #endif
@@ -2881,7 +2873,7 @@ void MainWindow::startContextTimer()
 	if (!contextTimer) {
 		contextTimer = new QTimer(this);
 		contextTimer->setSingleShot(true);
-		connect(contextTimer, SIGNAL(timeout()), this, SLOT(toggleContext()));
+		connect(contextTimer, &QTimer::timeout, this, &MainWindow::toggleContext);
 	}
 	contextTimer->start(contextSwitchTime);
 }
diff --git a/gui/mainwindow.h b/gui/mainwindow.h
index fb212e763..f8dc9b6f0 100644
--- a/gui/mainwindow.h
+++ b/gui/mainwindow.h
@@ -150,7 +150,7 @@ class MainWindow : public QMainWindow, private Ui::MainWindow {
 	void playNext(const QList<quint32>& items, quint32 pos, quint32 size);
 
 public Q_SLOTS:
-	void showError(const QString& message, bool showActions = false);
+	void showError(const QString& message);
 	void showInformation(const QString& message);
 	void dynamicStatus(const QString& message);
 	void setCollection(const QString& collection);
@@ -161,7 +161,7 @@ public Q_SLOTS:
 	void showAboutDialog();
 	void mpdConnectionStateChanged(bool connected);
 	void playQueueItemsSelected(bool s);
-	void showPreferencesDialog(const QString& page = QString());
+	void showPreferencesDialog();
 	void quit();
 	void commitDataRequest(QSessionManager& mgr);
 	void updateSettings();
diff --git a/gui/mediakeys.cpp b/gui/mediakeys.cpp
index 020754a91..4a6d15587 100644
--- a/gui/mediakeys.cpp
+++ b/gui/mediakeys.cpp
@@ -87,10 +87,10 @@ bool MediaKeys::activate(MultiMediaKeysInterface* iface)
 		return false;
 	}
 	if (iface->activate()) {
-		QObject::connect(iface, SIGNAL(playPause()), StdActions::self()->playPauseTrackAction, SIGNAL(triggered()));
-		QObject::connect(iface, SIGNAL(stop()), StdActions::self()->stopPlaybackAction, SIGNAL(triggered()));
-		QObject::connect(iface, SIGNAL(next()), StdActions::self()->nextTrackAction, SIGNAL(triggered()));
-		QObject::connect(iface, SIGNAL(previous()), StdActions::self()->prevTrackAction, SIGNAL(triggered()));
+		QObject::connect(iface, &MultiMediaKeysInterface::playPause, StdActions::self()->playPauseTrackAction, &Action::emitTriggered);
+		QObject::connect(iface, &MultiMediaKeysInterface::stop, StdActions::self()->stopPlaybackAction, &Action::emitTriggered);
+		QObject::connect(iface, &MultiMediaKeysInterface::next, StdActions::self()->nextTrackAction, &Action::emitTriggered);
+		QObject::connect(iface, &MultiMediaKeysInterface::previous, StdActions::self()->prevTrackAction, &Action::emitTriggered);
 		return true;
 	}
 	return false;
@@ -101,9 +101,9 @@ void MediaKeys::deactivate(MultiMediaKeysInterface* iface)
 	if (!iface) {
 		return;
 	}
-	QObject::disconnect(iface, SIGNAL(playPause()), StdActions::self()->playPauseTrackAction, SIGNAL(triggered()));
-	QObject::disconnect(iface, SIGNAL(stop()), StdActions::self()->stopPlaybackAction, SIGNAL(triggered()));
-	QObject::disconnect(iface, SIGNAL(next()), StdActions::self()->nextTrackAction, SIGNAL(triggered()));
-	QObject::disconnect(iface, SIGNAL(previous()), StdActions::self()->prevTrackAction, SIGNAL(triggered()));
+	QObject::disconnect(iface, &MultiMediaKeysInterface::playPause, StdActions::self()->playPauseTrackAction, &Action::emitTriggered);
+	QObject::disconnect(iface, &MultiMediaKeysInterface::stop, StdActions::self()->stopPlaybackAction, &Action::emitTriggered);
+	QObject::disconnect(iface, &MultiMediaKeysInterface::next, StdActions::self()->nextTrackAction, &Action::emitTriggered);
+	QObject::disconnect(iface, &MultiMediaKeysInterface::previous, StdActions::self()->prevTrackAction, &Action::emitTriggered);
 	iface->deactivate();
 }
diff --git a/gui/mpdbrowsepage.cpp b/gui/mpdbrowsepage.cpp
index 5e822e999..ed527b03f 100644
--- a/gui/mpdbrowsepage.cpp
+++ b/gui/mpdbrowsepage.cpp
@@ -39,14 +39,14 @@ MpdBrowsePage::MpdBrowsePage(QWidget* p)
 	: SinglePageWidget(p), model(this)
 {
 	browseAction = new Action(Icon::fa(fa::fa_solid, fa::fa_folder_open), tr("Open In File Manager"), this);
-	connect(view, SIGNAL(itemsSelected(bool)), this, SLOT(controlActions()));
-	connect(view, SIGNAL(doubleClicked(const QModelIndex&)), this, SLOT(itemDoubleClicked(const QModelIndex&)));
-	connect(view, SIGNAL(headerClicked(int)), SLOT(headerClicked(int)));
-	connect(browseAction, SIGNAL(triggered()), this, SLOT(openFileManager()));
-	connect(MPDConnection::self(), SIGNAL(updatingFileList()), view, SLOT(updating()));
-	connect(MPDConnection::self(), SIGNAL(updatedFileList()), view, SLOT(updated()));
-	connect(MPDConnection::self(), SIGNAL(updatingDatabase()), view, SLOT(updating()));
-	connect(MPDConnection::self(), SIGNAL(updatedDatabase()), view, SLOT(updated()));
+	connect(view, &ItemView::itemsSelected, this, &MpdBrowsePage::controlActions);
+	connect(view, &ItemView::doubleClicked, this, &MpdBrowsePage::itemDoubleClicked);
+	connect(view, &ItemView::headerClicked, this, &MpdBrowsePage::headerClicked);
+	connect(browseAction, &Action::triggered, this, &MpdBrowsePage::openFileManager);
+	connect(MPDConnection::self(), &MPDConnection::updatingFileList, view, &ItemView::updating);
+	connect(MPDConnection::self(), &MPDConnection::updatedFileList, view, &ItemView::updated);
+	connect(MPDConnection::self(), &MPDConnection::updatingDatabase, view, &ItemView::updating);
+	connect(MPDConnection::self(), &MPDConnection::updatedDatabase, view, &ItemView::updated);
 	Configuration config(metaObject()->className());
 	view->setMode(ItemView::Mode_DetailedTree);
 	view->load(config);
@@ -75,7 +75,7 @@ MpdBrowsePage::MpdBrowsePage(QWidget* p)
 	view->setModel(&model);
 	view->closeSearch();
 	view->alwaysShowHeader();
-	connect(view, SIGNAL(updateToPlayQueue(QModelIndex, bool)), this, SLOT(updateToPlayQueue(QModelIndex, bool)));
+	connect(view, &ItemView::updateToPlayQueue, this, &MpdBrowsePage::updateToPlayQueue);
 	view->setInfoText(tr("No folders? Looks like your MPD is not configured correctly."));
 }
 
diff --git a/gui/playbacksettings.cpp b/gui/playbacksettings.cpp
index acf3eb90d..ff4ab02c1 100644
--- a/gui/playbacksettings.cpp
+++ b/gui/playbacksettings.cpp
@@ -47,15 +47,15 @@ PlaybackSettings::PlaybackSettings(QWidget* p)
 	replayGain->addItem(tr("Track"), QVariant("track"));
 	replayGain->addItem(tr("Album"), QVariant("album"));
 	replayGain->addItem(tr("Auto"), QVariant("auto"));
-	connect(MPDConnection::self(), SIGNAL(replayGain(const QString&)), this, SLOT(replayGainSetting(const QString&)));
-	connect(MPDConnection::self(), SIGNAL(outputsUpdated(const QList<Output>&)), this, SLOT(updateOutputs(const QList<Output>&)));
-	connect(MPDConnection::self(), SIGNAL(stateChanged(bool)), this, SLOT(mpdConnectionStateChanged(bool)));
-	connect(this, SIGNAL(enableOutput(quint32, bool)), MPDConnection::self(), SLOT(enableOutput(quint32, bool)));
-	connect(this, SIGNAL(outputs()), MPDConnection::self(), SLOT(outputs()));
-	connect(this, SIGNAL(setReplayGain(const QString&)), MPDConnection::self(), SLOT(setReplayGain(const QString&)));
-	connect(this, SIGNAL(setCrossFade(int)), MPDConnection::self(), SLOT(setCrossFade(int)));
-	connect(this, SIGNAL(getReplayGain()), MPDConnection::self(), SLOT(getReplayGain()));
-	connect(aboutReplayGain, SIGNAL(leftClickedUrl()), SLOT(showAboutReplayGain()));
+	connect(MPDConnection::self(), &MPDConnection::replayGain, this, &PlaybackSettings::replayGainSetting);
+	connect(MPDConnection::self(), &MPDConnection::outputsUpdated, this, &PlaybackSettings::updateOutputs);
+	connect(MPDConnection::self(), &MPDConnection::stateChanged, this, &PlaybackSettings::mpdConnectionStateChanged);
+	connect(this, &PlaybackSettings::enableOutput, MPDConnection::self(), &MPDConnection::enableOutput);
+	connect(this, &PlaybackSettings::outputs, MPDConnection::self(), &MPDConnection::outputs);
+	connect(this, &PlaybackSettings::setReplayGain, MPDConnection::self(), &MPDConnection::setReplayGain);
+	connect(this, &PlaybackSettings::setCrossFade, MPDConnection::self(), &MPDConnection::setCrossFade);
+	connect(this, &PlaybackSettings::getReplayGain, MPDConnection::self(), &MPDConnection::getReplayGain);
+	connect(aboutReplayGain, &UrlLabel::leftClickedUrl, this, &PlaybackSettings::showAboutReplayGain);
 	int iconSize = Icon::dlgIconSize();
 	messageIcon->setFixedSize(iconSize, iconSize);
 	mpdConnectionStateChanged(MPDConnection::self()->isConnected());
diff --git a/gui/searchpage.cpp b/gui/searchpage.cpp
index 9c315b5f7..2b759cd36 100644
--- a/gui/searchpage.cpp
+++ b/gui/searchpage.cpp
@@ -52,13 +52,13 @@ SearchPage::SearchPage(QWidget* p)
 	locateAction = new Action(Icons::self()->searchIcon, tr("Locate In Library"), this);
 	view->allowTableView(new SearchTableView(view));
 
-	connect(&model, SIGNAL(searching()), view, SLOT(showSpinner()));
-	connect(&model, SIGNAL(searched()), view, SLOT(hideSpinner()));
-	connect(&model, SIGNAL(statsUpdated(int, quint32)), this, SLOT(statsUpdated(int, quint32)));
-	connect(view, SIGNAL(itemsSelected(bool)), this, SLOT(controlActions()));
-	connect(view, SIGNAL(doubleClicked(const QModelIndex&)), this, SLOT(itemDoubleClicked(const QModelIndex&)));
-	connect(MPDConnection::self(), SIGNAL(stateChanged(bool)), this, SLOT(setSearchCategories()));
-	connect(locateAction, SIGNAL(triggered()), SLOT(locateSongs()));
+	connect(&model, &MpdSearchModel::searching, view, &ItemView::showSpinner);
+	connect(&model, &MpdSearchModel::searched, view, &ItemView::hideSpinner);
+	connect(&model, &MpdSearchModel::statsUpdated, this, &SearchPage::statsUpdated);
+	connect(view, &ItemView::itemsSelected, this, &SearchPage::controlActions);
+	connect(view, &ItemView::doubleClicked, this, &SearchPage::itemDoubleClicked);
+	connect(MPDConnection::self(), &MPDConnection::stateChanged, this, &SearchPage::setSearchCategories);
+	connect(locateAction, &Action::triggered, this, &SearchPage::locateSongs);
 	proxy.setSourceModel(&model);
 	view->setModel(&proxy);
 	view->setPermanentSearch();
diff --git a/gui/serversettings.cpp b/gui/serversettings.cpp
index 019949935..3b0b273ef 100644
--- a/gui/serversettings.cpp
+++ b/gui/serversettings.cpp
@@ -80,11 +80,11 @@ ServerSettings::ServerSettings(QWidget* p)
 #endif
 	musicFolderNoteLabel->appendText(QLatin1String("<br/><i><a href=\"https://github.com/nullobsi/cantata/wiki/Accessing-music-files,-and-covers\">") + tr("More information") + QLatin1String("</a></i>"));
 
-	connect(combo, SIGNAL(activated(int)), SLOT(showDetails(int)));
-	connect(removeButton, SIGNAL(clicked(bool)), SLOT(remove()));
-	connect(addButton, SIGNAL(clicked(bool)), SLOT(add()));
-	connect(name, SIGNAL(textChanged(QString)), SLOT(nameChanged()));
-	connect(basicDir, SIGNAL(textChanged(QString)), SLOT(basicDirChanged()));
+	connect(combo, &QComboBox::activated, this, &ServerSettings::showDetails);
+	connect(removeButton, &FlatToolButton::clicked, this, &ServerSettings::remove);
+	connect(addButton, &FlatToolButton::clicked, this, &ServerSettings::add);
+	connect(name, &LineEdit::textChanged, this, &ServerSettings::nameChanged);
+	connect(basicDir, &PathRequester::textChanged, this, &ServerSettings::basicDirChanged);
 	addButton->setIcon(Icons::self()->addIcon);
 	removeButton->setIcon(Icons::self()->minusIcon);
 	addButton->setAutoRaise(true);
diff --git a/gui/singleapplication.cpp b/gui/singleapplication.cpp
index 5271d4e2c..9ef191624 100644
--- a/gui/singleapplication.cpp
+++ b/gui/singleapplication.cpp
@@ -28,8 +28,8 @@
 SingleApplication::SingleApplication(int& argc, char** argv)
 	: QtSingleApplication(argc, argv)
 {
-	connect(this, SIGNAL(messageReceived(const QString&)), SLOT(message(const QString&)));
-	connect(this, SIGNAL(reconnect()), MPDConnection::self(), SLOT(reconnect()));
+	connect(this, qOverload<const QString&>(&SingleApplication::messageReceived), this, &SingleApplication::message);
+	connect(this, &SingleApplication::reconnect, MPDConnection::self(), &MPDConnection::reconnect);
 }
 
 bool SingleApplication::start(const QStringList& files)
diff --git a/gui/trayitem.cpp b/gui/trayitem.cpp
index 8514ba008..fa5d1bfd4 100644
--- a/gui/trayitem.cpp
+++ b/gui/trayitem.cpp
@@ -80,8 +80,8 @@ Q_DECL_UNUSED static Action* copyAction(Action* orig)
 	Action* newAction = new Action(orig->parent());
 	newAction->setText(Utils::strippedText(orig->text()));
 	newAction->setIcon(orig->icon());
-	QObject::connect(newAction, SIGNAL(triggered()), orig, SIGNAL(triggered()));
-	QObject::connect(newAction, SIGNAL(triggered(bool)), orig, SIGNAL(triggered(bool)));
+	QObject::connect(newAction, &Action::triggered, orig, &Action::triggered);
+	QObject::connect(newAction, &Action::triggered, orig, &Action::triggered);
 	return newAction;
 }
 
@@ -165,7 +165,7 @@ void TrayItem::setup()
 	trayItem->setIcon(icon);
 	trayItem->setToolTip(tr("Cantata"));
 	trayItem->show();
-	connect(trayItem, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(trayItemClicked(QSystemTrayIcon::ActivationReason)));
+	connect(trayItem, &QSystemTrayIcon::activated, this, &TrayItem::trayItemClicked);
 #endif
 }
 
diff --git a/http/httpserver.cpp b/http/httpserver.cpp
index 375b6e8ac..c7112f9d9 100644
--- a/http/httpserver.cpp
+++ b/http/httpserver.cpp
@@ -63,10 +63,10 @@ GLOBAL_STATIC(HttpServer, instance)
 HttpServer::HttpServer()
 	: QObject(nullptr), thread(nullptr), socket(nullptr), closeTimer(nullptr)
 {
-	connect(MPDConnection::self(), SIGNAL(cantataStreams(QList<Song>, bool)), this, SLOT(cantataStreams(QList<Song>, bool)));
-	connect(MPDConnection::self(), SIGNAL(cantataStreams(QStringList)), this, SLOT(cantataStreams(QStringList)));
-	connect(MPDConnection::self(), SIGNAL(removedIds(QSet<qint32>)), this, SLOT(removedIds(QSet<qint32>)));
-	connect(MPDConnection::self(), SIGNAL(ifaceIp(QString)), this, SLOT(ifaceIp(QString)));
+	connect(MPDConnection::self(), qOverload<const QStringList&>(&MPDConnection::cantataStreams), this, qOverload<const QStringList&>(&HttpServer::cantataStreams));
+	connect(MPDConnection::self(), qOverload<const QList<Song>&, bool>(&MPDConnection::cantataStreams), this, qOverload<const QList<Song>&, bool>(&HttpServer::cantataStreams));
+	connect(MPDConnection::self(), &MPDConnection::removedIds, this, &HttpServer::removedIds);
+	connect(MPDConnection::self(), &MPDConnection::ifaceIp, this, &HttpServer::ifaceIp);
 }
 
 bool HttpServer::isAlive() const
@@ -95,7 +95,7 @@ bool HttpServer::start()
 	}
 	socket = new HttpSocket(Settings::self()->httpInterface(), prevPort);
 	socket->mpdAddress(MPDConnection::self()->ipAddress());
-	connect(this, SIGNAL(terminateSocket()), socket, SLOT(terminate()), Qt::QueuedConnection);
+	connect(this, &HttpServer::terminateSocket, socket, &HttpSocket::terminate, Qt::QueuedConnection);
 	if (socket->serverPort() != prevPort) {
 		Settings::self()->saveHttpAllocatedPort(socket->serverPort());
 	}
@@ -311,7 +311,7 @@ void HttpServer::startCloseTimer()
 	if (!closeTimer) {
 		closeTimer = new QTimer(this);
 		closeTimer->setSingleShot(true);
-		connect(closeTimer, SIGNAL(timeout()), this, SLOT(stop()));
+		connect(closeTimer, &QTimer::timeout, this, &HttpServer::stop);
 	}
 	DBUG;
 	closeTimer->start(1000);
diff --git a/http/httpsocket.cpp b/http/httpsocket.cpp
index 25ec78c7f..7cbef71d4 100644
--- a/http/httpsocket.cpp
+++ b/http/httpsocket.cpp
@@ -189,11 +189,11 @@ HttpSocket::HttpSocket(const QString& iface, quint16 port)
 
 	DBUG << isListening() << serverPort();
 
-	connect(MPDConnection::self(), SIGNAL(socketAddress(QString)), this, SLOT(mpdAddress(QString)));
-	connect(MPDConnection::self(), SIGNAL(cantataStreams(QList<Song>, bool)), this, SLOT(cantataStreams(QList<Song>, bool)));
-	connect(MPDConnection::self(), SIGNAL(cantataStreams(QStringList)), this, SLOT(cantataStreams(QStringList)));
-	connect(MPDConnection::self(), SIGNAL(removedIds(QSet<qint32>)), this, SLOT(removedIds(QSet<qint32>)));
-	connect(this, SIGNAL(newConnection()), SLOT(handleNewConnection()));
+	connect(MPDConnection::self(), &MPDConnection::socketAddress, this, &HttpSocket::mpdAddress);
+	connect(MPDConnection::self(), qOverload<const QStringList&>(&MPDConnection::cantataStreams), this, qOverload<const QStringList&>(&HttpSocket::cantataStreams));
+	connect(MPDConnection::self(), qOverload<const QList<QString>&>(&MPDConnection::cantataStreams), this, qOverload<const QList<QString>&>(&HttpSocket::cantataStreams));
+	connect(MPDConnection::self(), &MPDConnection::removedIds, this, &HttpSocket::removedIds);
+	connect(this, &HttpSocket::newConnection, this, &HttpSocket::handleNewConnection);
 }
 
 bool HttpSocket::openPort(quint16 p)
@@ -243,8 +243,8 @@ void HttpSocket::handleNewConnection()
 			return;
 		}
 
-		connect(socket, SIGNAL(readyRead()), this, SLOT(readClient()));
-		connect(socket, SIGNAL(disconnected()), this, SLOT(discardClient()));
+		connect(socket, &QTcpSocket::readyRead, this, &HttpSocket::readClient);
+		connect(socket, &QTcpSocket::disconnected, this, &HttpSocket::discardClient);
 	}
 }
 
diff --git a/mac/dockmenu.cpp b/mac/dockmenu.cpp
index 54fa111d9..a86edd9f3 100644
--- a/mac/dockmenu.cpp
+++ b/mac/dockmenu.cpp
@@ -34,7 +34,7 @@ DockMenu::DockMenu(QWidget* p)
 	addAction(StdActions::self()->stopPlaybackAction);
 	addAction(StdActions::self()->stopAfterCurrentTrackAction);
 	addAction(StdActions::self()->nextTrackAction);
-	connect(playPauseAction, SIGNAL(triggered()), StdActions::self()->playPauseTrackAction, SIGNAL(triggered()));
+	connect(playPauseAction, &QAction::triggered, StdActions::self()->playPauseTrackAction, &QAction::triggered);
 }
 
 void DockMenu::update(MPDStatus* const status)
diff --git a/mac/macnowplaying.mm b/mac/macnowplaying.mm
index 8fc1b86c6..77b4a8490 100644
--- a/mac/macnowplaying.mm
+++ b/mac/macnowplaying.mm
@@ -47,8 +47,8 @@
     : QObject(p)
     , pimpl(new impl())
 {
-    connect(this, SIGNAL(setSeekId(qint32, quint32)), MPDConnection::self(), SLOT(setSeekId(qint32, quint32)));
-    connect(CurrentCover::self(), SIGNAL(coverFile(const QString &)), this, SLOT(updateCurrentCover(const QString &)));
+    connect(this, &MacNowPlaying::setSeekId, MPDConnection::self(), &MPDConnection::setSeekId);
+    connect(CurrentCover::self(), &CurrentCover::coverFile, this, &MacNowPlaying::updateCurrentCover);
 
     MPRemoteCommandCenter *commandCenter = [MPRemoteCommandCenter sharedCommandCenter];
 
diff --git a/models/browsemodel.cpp b/models/browsemodel.cpp
index e13f247d0..202592656 100644
--- a/models/browsemodel.cpp
+++ b/models/browsemodel.cpp
@@ -60,7 +60,7 @@ BrowseModel::BrowseModel(QObject* p)
 	: ActionModel(p), root(new FolderItem("/", nullptr)), enabled(false), dbVersion(0)
 {
 	icn = Icon::fa(fa::fa_solid, fa::fa_server);
-	connect(this, SIGNAL(listFolder(QString)), MPDConnection::self(), SLOT(listFolder(QString)));
+	connect(this, &BrowseModel::listFolder, MPDConnection::self(), &MPDConnection::listFolder);
 	folderIndex.insert(root->getPath(), root);
 }
 
@@ -105,14 +105,14 @@ void BrowseModel::setEnabled(bool e)
 	enabled = e;
 
 	if (enabled) {
-		connect(MPDConnection::self(), SIGNAL(folderContents(QString, QStringList, QList<Song>)), this, SLOT(folderContents(QString, QStringList, QList<Song>)));
-		connect(MPDConnection::self(), SIGNAL(connectionChanged(MPDConnectionDetails)), this, SLOT(connectionChanged()));
-		connect(MPDConnection::self(), SIGNAL(statsUpdated(MPDStatsValues)), this, SLOT(statsUpdated(MPDStatsValues)));
+		connect(MPDConnection::self(), &MPDConnection::folderContents, this, &BrowseModel::folderContents);
+		connect(MPDConnection::self(), &MPDConnection::connectionChanged, this, &BrowseModel::connectionChanged);
+		connect(MPDConnection::self(), &MPDConnection::statsUpdated, this, &BrowseModel::statsUpdated);
 	}
 	else {
-		disconnect(MPDConnection::self(), SIGNAL(folderContents(QString, QStringList, QList<Song>)), this, SLOT(folderContents(QString, QStringList, QList<Song>)));
-		disconnect(MPDConnection::self(), SIGNAL(connectionChanged(MPDConnectionDetails)), this, SLOT(connectionChanged()));
-		disconnect(MPDConnection::self(), SIGNAL(statsUpdated(MPDStatsValues)), this, SLOT(statsUpdated(MPDStatsValues)));
+		disconnect(MPDConnection::self(), &MPDConnection::folderContents, this, &BrowseModel::folderContents);
+		disconnect(MPDConnection::self(), &MPDConnection::connectionChanged, this, &BrowseModel::connectionChanged);
+		disconnect(MPDConnection::self(), &MPDConnection::statsUpdated, this, &BrowseModel::statsUpdated);
 		clear();
 	}
 }
diff --git a/models/devicesmodel.cpp b/models/devicesmodel.cpp
index 62a0a2ab1..8d87448b8 100644
--- a/models/devicesmodel.cpp
+++ b/models/devicesmodel.cpp
@@ -98,7 +98,7 @@ DevicesModel::DevicesModel(QObject* parent)
 	editAction = new Action(Icons::self()->editIcon, tr("Edit CD Details"), this);
 #endif
 	updateItemMenu();
-	connect(this, SIGNAL(add(const QStringList&, int, quint8, bool)), MPDConnection::self(), SLOT(add(const QStringList&, int, quint8, bool)));
+	connect(this, &DevicesModel::add, MPDConnection::self(), qOverload<const QStringList&, int, quint8, bool>(&MPDConnection::add));
 }
 
 DevicesModel::~DevicesModel()
@@ -435,15 +435,15 @@ void DevicesModel::setEnabled(bool e)
 
 	inhibitMenuUpdate = true;
 	if (enabled) {
-		connect(Solid::DeviceNotifier::instance(), SIGNAL(deviceAdded(const QString&)), this, SLOT(deviceAdded(const QString&)));
-		connect(Solid::DeviceNotifier::instance(), SIGNAL(deviceRemoved(const QString&)), this, SLOT(deviceRemoved(const QString&)));
+		connect(Solid::DeviceNotifier::instance(), &Solid::DeviceNotifier::deviceAdded, this, &DevicesModel::deviceAdded);
+		connect(Solid::DeviceNotifier::instance(), &Solid::DeviceNotifier::deviceRemoved, this, &DevicesModel::deviceRemoved);
 #if defined CDDB_FOUND || defined MusicBrainz5_FOUND
-		connect(Covers::self(), SIGNAL(cover(const Song&, const QImage&, const QString&)),
-		        this, SLOT(setCover(const Song&, const QImage&, const QString&)));
+		connect(Covers::self(), &Covers::cover,
+		        this, qOverload<const Song&, const QImage&, const QString&>(&DevicesModel::setCover));
 #endif
 		// Call loadLocal via a timer, so that upon Cantata start-up model is loaded into view before we try and expand items!
-		QTimer::singleShot(0, this, SIGNAL(loadLocal()));
-		connect(MountPoints::self(), SIGNAL(updated()), this, SLOT(mountsChanged()));
+		QTimer::singleShot(0, this, &DevicesModel::loadLocal);
+		connect(MountPoints::self(), &MountPoints::updated, this, &DevicesModel::mountsChanged);
 #ifdef ENABLE_REMOTE_DEVICES
 		loadRemote();
 #endif
@@ -462,13 +462,13 @@ void DevicesModel::stop()
 		static_cast<Device*>(col)->stop();
 	}
 
-	disconnect(Solid::DeviceNotifier::instance(), SIGNAL(deviceAdded(const QString&)), this, SLOT(deviceAdded(const QString&)));
-	disconnect(Solid::DeviceNotifier::instance(), SIGNAL(deviceRemoved(const QString&)), this, SLOT(deviceRemoved(const QString&)));
+	disconnect(Solid::DeviceNotifier::instance(), &Solid::DeviceNotifier::deviceAdded, this, &DevicesModel::deviceAdded);
+	disconnect(Solid::DeviceNotifier::instance(), &Solid::DeviceNotifier::deviceRemoved, this, &DevicesModel::deviceRemoved);
 #if defined CDDB_FOUND || defined MusicBrainz5_FOUND
-	disconnect(Covers::self(), SIGNAL(cover(const Song&, const QImage&, const QString&)),
-	           this, SLOT(setCover(const Song&, const QImage&, const QString&)));
+	disconnect(Covers::self(), &Covers::cover,
+	           this, qOverload<const Song&, const QImage&, const QString&>(&DevicesModel::setCover));
 #endif
-	disconnect(MountPoints::self(), SIGNAL(updated()), this, SLOT(mountsChanged()));
+	disconnect(MountPoints::self(), &MountPoints::updated, this, &DevicesModel::mountsChanged);
 #if defined ENABLE_REMOTE_DEVICES
 	unmountRemote();
 #endif
@@ -604,7 +604,7 @@ void DevicesModel::deviceAdded(const QString& udi)
 		}
 		DBUG << "volume is generic storage";
 		if (!volumes.contains(device.udi())) {
-			connect(ssa, SIGNAL(accessibilityChanged(bool, const QString&)), this, SLOT(accessibilityChanged(bool, const QString&)));
+			connect(ssa, &Solid::StorageAccess::accessibilityChanged, this, &DevicesModel::accessibilityChanged);
 			volumes.insert(device.udi());
 		}
 	}
@@ -631,16 +631,16 @@ void DevicesModel::addLocalDevice(const QString& udi)
 		beginInsertRows(QModelIndex(), collections.count(), collections.count());
 		collections.append(dev);
 		endInsertRows();
-		connect(dev, SIGNAL(updating(const QString&, bool)), SLOT(deviceUpdating(const QString&, bool)));
-		connect(dev, SIGNAL(error(const QString&)), SIGNAL(error(const QString&)));
-		connect(dev, SIGNAL(cover(const Song&, const QImage&)), SLOT(setCover(const Song&, const QImage&)));
-		connect(dev, SIGNAL(updatedDetails(QList<Song>)), SIGNAL(updatedDetails(QList<Song>)));
-		connect(dev, SIGNAL(play(QList<Song>)), SLOT(play(QList<Song>)));
-		connect(dev, SIGNAL(renamed()), this, SLOT(updateItemMenu()));
+		connect(dev, &Device::updating, this, &DevicesModel::deviceUpdating);
+		connect(dev, &Device::error, &Device::error);
+		connect(dev, &Device::cover, this, qOverload<const Song&, const QImage&>(&DevicesModel::setCover));
+		connect(dev, &Device::updatedDetails, &Device::updatedDetails);
+		connect(dev, &Device::play, this, &DevicesModel::play);
+		connect(dev, &Device::renamed, this, &DevicesModel::updateItemMenu);
 #if defined CDDB_FOUND || defined MusicBrainz5_FOUND
 		if (Device::AudioCd == dev->devType()) {
-			connect(static_cast<AudioCdDevice*>(dev), SIGNAL(matches(const QString&, const QList<CdAlbum>&)),
-			        SIGNAL(matches(const QString&, const QList<CdAlbum>&)));
+			connect(static_cast<AudioCdDevice*>(dev), &AudioCdDevice::matches,
+			        &AudioCdDevice::matches);
 			if (!autoplayCd.isEmpty() && static_cast<AudioCdDevice*>(dev)->isAudioDevice(autoplayCd)) {
 				autoplayCd = QString();
 				static_cast<AudioCdDevice*>(dev)->autoplay();
@@ -660,7 +660,7 @@ void DevicesModel::deviceRemoved(const QString& udi)
 			Solid::Device device(udi);
 			Solid::StorageAccess* ssa = device.as<Solid::StorageAccess>();
 			if (ssa) {
-				disconnect(ssa, SIGNAL(accessibilityChanged(bool, const QString&)), this, SLOT(accessibilityChanged(bool, const QString&)));
+				disconnect(ssa, &Solid::StorageAccess::accessibilityChanged, this, &DevicesModel::accessibilityChanged);
 			}
 			volumes.remove(udi);
 		}
@@ -701,11 +701,11 @@ void DevicesModel::addRemoteDevice(const DeviceOptions& opts, RemoteFsDevice::De
 		beginInsertRows(QModelIndex(), collections.count(), collections.count());
 		collections.append(dev);
 		endInsertRows();
-		connect(dev, SIGNAL(updating(const QString&, bool)), SLOT(deviceUpdating(const QString&, bool)));
-		connect(dev, SIGNAL(error(const QString&)), SIGNAL(error(const QString&)));
-		connect(dev, SIGNAL(cover(const Song&, const QImage&)), SLOT(setCover(const Song&, const QImage&)));
+		connect(dev, &Device::updating, this, &DevicesModel::deviceUpdating);
+		connect(dev, &Device::error, &Device::error);
+		connect(dev, &Device::cover, this, qOverload<const Song&, const QImage&>(&DevicesModel::setCover));
 		if (Device::RemoteFs == dev->devType()) {
-			connect(static_cast<RemoteFsDevice*>(dev), SIGNAL(udiChanged()), SLOT(remoteDeviceUdiChanged()));
+			connect(static_cast<RemoteFsDevice*>(dev), &RemoteFsDevice::udiChanged, this, &DevicesModel::remoteDeviceUdiChanged);
 		}
 		updateItemMenu();
 	}
@@ -811,7 +811,7 @@ void DevicesModel::loadLocal()
 				continue;
 			}
 			if (!volumes.contains(device.udi())) {
-				connect(ssa, SIGNAL(accessibilityChanged(bool, const QString&)), this, SLOT(accessibilityChanged(bool, const QString&)));
+				connect(ssa, &Solid::StorageAccess::accessibilityChanged, this, &DevicesModel::accessibilityChanged);
 				volumes.insert(device.udi());
 			}
 			addLocalDevice(device.udi());
@@ -851,11 +851,11 @@ void DevicesModel::loadRemote()
 		beginInsertRows(QModelIndex(), collections.count(), collections.count() + (rem.count() - 1));
 		for (Device* dev : rem) {
 			collections.append(dev);
-			connect(dev, SIGNAL(updating(const QString&, bool)), SLOT(deviceUpdating(const QString&, bool)));
-			connect(dev, SIGNAL(error(const QString&)), SIGNAL(error(const QString&)));
-			connect(dev, SIGNAL(cover(const Song&, const QImage&)), SLOT(setCover(const Song&, const QImage&)));
+			connect(dev, &Device::updating, this, &DevicesModel::deviceUpdating);
+			connect(dev, &Device::error, &Device::error);
+			connect(dev, &Device::cover, this, qOverload<const Song&, const QImage&>(&DevicesModel::setCover));
 			if (Device::RemoteFs == dev->devType()) {
-				connect(static_cast<RemoteFsDevice*>(dev), SIGNAL(udiChanged()), SLOT(remoteDeviceUdiChanged()));
+				connect(static_cast<RemoteFsDevice*>(dev), &RemoteFsDevice::udiChanged, this, &DevicesModel::remoteDeviceUdiChanged);
 			}
 		}
 		endInsertRows();
@@ -920,7 +920,7 @@ void DevicesModel::updateItemMenu()
 
 		for (const QString& k : keys) {
 			const MusicLibraryItemRoot* d = items[k];
-			QAction* act = itemMenu->addAction(d->icon(), k, this, SLOT(emitAddToDevice()));
+			QAction* act = itemMenu->addAction(d->icon(), k, this, &DevicesModel::emitAddToDevice);
 			act->setData(d->id());
 			Action::initIcon(act);
 		}
diff --git a/models/mpdlibrarymodel.cpp b/models/mpdlibrarymodel.cpp
index c55421b56..91db662f3 100644
--- a/models/mpdlibrarymodel.cpp
+++ b/models/mpdlibrarymodel.cpp
@@ -44,10 +44,10 @@ GLOBAL_STATIC(MpdLibraryModel, instance)
 MpdLibraryModel::MpdLibraryModel()
 	: SqlLibraryModel(new MpdLibraryDb(nullptr), nullptr), showArtistImages(false)
 {
-	connect(Covers::self(), SIGNAL(cover(Song, QImage, QString)), this, SLOT(cover(Song, QImage, QString)));
-	connect(Covers::self(), SIGNAL(coverUpdated(Song, QImage, QString)), this, SLOT(coverUpdated(Song, QImage, QString)));
-	connect(Covers::self(), SIGNAL(artistImage(Song, QImage, QString)), this, SLOT(artistImage(Song, QImage, QString)));
-	connect(Covers::self(), SIGNAL(composerImage(Song, QImage, QString)), this, SLOT(artistImage(Song, QImage, QString)));
+	connect(Covers::self(), &Covers::cover, this, &MpdLibraryModel::cover);
+	connect(Covers::self(), &Covers::coverUpdated, this, &MpdLibraryModel::coverUpdated);
+	connect(Covers::self(), &Covers::artistImage, this, &MpdLibraryModel::artistImage);
+	connect(Covers::self(), &Covers::composerImage, this, &MpdLibraryModel::artistImage);
 	if (MPDConnection::self()->isConnected()) {
 		static_cast<MpdLibraryDb*>(db)->connectionChanged(MPDConnection::self()->getDetails());
 	}
@@ -179,7 +179,7 @@ void MpdLibraryModel::listSongs()
 	listingTotal = db->trackCount();
 	listingCurrent = 0;
 	if (listingTotal > 0) {
-		QTimer::singleShot(0, this, SLOT(listNextChunk()));
+		QTimer::singleShot(0, this, &MpdLibraryModel::listNextChunk);
 	}
 	else {
 		emit songListing(QList<Song>(), 100.0);
@@ -207,7 +207,7 @@ void MpdLibraryModel::listNextChunk()
 			emit songListing(QList<Song>(), 100.0);
 		}
 		else {
-			QTimer::singleShot(0, this, SLOT(listNextChunk()));
+			QTimer::singleShot(0, this, &MpdLibraryModel::listNextChunk);
 		}
 	}
 }
diff --git a/models/mpdsearchmodel.cpp b/models/mpdsearchmodel.cpp
index 54d7ed8b2..eec7f4b11 100644
--- a/models/mpdsearchmodel.cpp
+++ b/models/mpdsearchmodel.cpp
@@ -29,11 +29,11 @@
 MpdSearchModel::MpdSearchModel(QObject* parent)
 	: SearchModel(parent), currentId(0)
 {
-	connect(this, SIGNAL(getRating(QString)), MPDConnection::self(), SLOT(getRating(QString)));
-	connect(this, SIGNAL(search(QString, QString, int)), MPDConnection::self(), SLOT(search(QString, QString, int)));
-	connect(MPDConnection::self(), SIGNAL(searchResponse(int, QList<Song>)), this, SLOT(searchFinished(int, QList<Song>)));
-	connect(MPDConnection::self(), SIGNAL(rating(QString, quint8)), SLOT(ratingResult(QString, quint8)));
-	connect(Covers::self(), SIGNAL(loaded(Song, int)), this, SLOT(coverLoaded(Song, int)));
+	connect(this, &MpdSearchModel::getRating, MPDConnection::self(), &MPDConnection::getRating);
+	connect(this, qOverload<const QString&, const QString&, int>(&MpdSearchModel::search), MPDConnection::self(), qOverload<const QString&, const QString&, int>(&MPDConnection::search));
+	connect(MPDConnection::self(), qOverload<int, const QList<Song>&>(&MPDConnection::searchResponse), this, &MpdSearchModel::searchFinished);
+	connect(MPDConnection::self(), &MPDConnection::rating, this, &MpdSearchModel::ratingResult);
+	connect(Covers::self(), qOverload<const Song&, int>(&Covers::loaded), this, qOverload<const Song&, int>(&MpdSearchModel::coverLoaded));
 }
 
 MpdSearchModel::~MpdSearchModel()
diff --git a/models/playlistsmodel.cpp b/models/playlistsmodel.cpp
index c7d96a672..1e91ca111 100644
--- a/models/playlistsmodel.cpp
+++ b/models/playlistsmodel.cpp
@@ -72,22 +72,22 @@ PlaylistsModel::PlaylistsModel(QObject* parent)
 	: ActionModel(parent), multiCol(false), itemMenu(nullptr), dropAdjust(0)
 {
 	icn = Icons::self()->playlistListIcon;
-	connect(MPDConnection::self(), SIGNAL(stateChanged(bool)), SLOT(mpdConnectionStateChanged(bool)));
-	connect(MPDConnection::self(), SIGNAL(playlistsRetrieved(const QList<Playlist>&)), this, SLOT(setPlaylists(const QList<Playlist>&)));
-	connect(MPDConnection::self(), SIGNAL(playlistInfoRetrieved(const QString&, const QList<Song>&)), this, SLOT(playlistInfoRetrieved(const QString&, const QList<Song>&)));
-	connect(MPDConnection::self(), SIGNAL(removedFromPlaylist(const QString&, const QList<quint32>&)),
-	        this, SLOT(removedFromPlaylist(const QString&, const QList<quint32>&)));
-	connect(MPDConnection::self(), SIGNAL(playlistRenamed(const QString&, const QString&)),
-	        this, SLOT(playlistRenamed(const QString&, const QString&)));
-	connect(MPDConnection::self(), SIGNAL(movedInPlaylist(const QString&, const QList<quint32>&, quint32)),
-	        this, SLOT(movedInPlaylist(const QString&, const QList<quint32>&, quint32)));
-	connect(this, SIGNAL(listPlaylists()), MPDConnection::self(), SLOT(listPlaylists()));
-	connect(this, SIGNAL(playlistInfo(const QString&)), MPDConnection::self(), SLOT(playlistInfo(const QString&)));
-	connect(this, SIGNAL(addToPlaylist(const QString&, const QStringList, quint32, quint32)), MPDConnection::self(), SLOT(addToPlaylist(const QString&, const QStringList, quint32, quint32)));
-	connect(this, SIGNAL(moveInPlaylist(const QString&, const QList<quint32>&, quint32, quint32)), MPDConnection::self(), SLOT(moveInPlaylist(const QString&, const QList<quint32>&, quint32, quint32)));
-	connect(Covers::self(), SIGNAL(loaded(Song, int)), this, SLOT(coverLoaded(Song, int)));
+	connect(MPDConnection::self(), &MPDConnection::stateChanged, this, &PlaylistsModel::mpdConnectionStateChanged);
+	connect(MPDConnection::self(), &MPDConnection::playlistsRetrieved, this, &PlaylistsModel::setPlaylists);
+	connect(MPDConnection::self(), &MPDConnection::playlistInfoRetrieved, this, &PlaylistsModel::playlistInfoRetrieved);
+	connect(MPDConnection::self(), &MPDConnection::removedFromPlaylist,
+	        this, &PlaylistsModel::removedFromPlaylist);
+	connect(MPDConnection::self(), &MPDConnection::playlistRenamed,
+	        this, &PlaylistsModel::playlistRenamed);
+	connect(MPDConnection::self(), &MPDConnection::movedInPlaylist,
+	        this, &PlaylistsModel::movedInPlaylist);
+	connect(this, &PlaylistsModel::listPlaylists, MPDConnection::self(), &MPDConnection::listPlaylists);
+	connect(this, &PlaylistsModel::playlistInfo, MPDConnection::self(), &MPDConnection::playlistInfo);
+	connect(this, &PlaylistsModel::addToPlaylist, MPDConnection::self(), qOverload<const QString&, const QStringList&, quint32, quint32>(&MPDConnection::addToPlaylist));
+	connect(this, &PlaylistsModel::moveInPlaylist, MPDConnection::self(), &MPDConnection::moveInPlaylist);
+	connect(Covers::self(), qOverload<const Song&, int>(&Covers::loaded), this, &PlaylistsModel::coverLoaded);
 	newAction = new QAction(Icon::fa(fa::fa_solid, fa::fa_asterisk), tr("New Playlist..."), this);
-	connect(newAction, SIGNAL(triggered()), this, SIGNAL(addToNew()));
+	connect(newAction, &QAction::triggered, this, &PlaylistsModel::addToNew);
 	Action::initIcon(newAction);
 	alignments[COL_TITLE] = alignments[COL_ARTIST] = alignments[COL_ALBUM] = alignments[COL_GENRE] = alignments[COL_COMPOSER] =
 			alignments[COL_PERFORMER] = alignments[COL_FILENAME] = alignments[COL_PATH] = alignments[COL_GROUPING] = int(Qt::AlignVCenter | Qt::AlignLeft);
@@ -972,7 +972,7 @@ void PlaylistsModel::updateItemMenu(bool create)
 	}
 	std::sort(names.begin(), names.end(), PlaylistsProxyModel::compareNames);
 	for (const QString& n : names) {
-		itemMenu->addAction(n, this, SLOT(emitAddToExisting()));
+		itemMenu->addAction(n, this, &PlaylistsModel::emitAddToExisting);
 	}
 }
 
diff --git a/models/playqueuemodel.cpp b/models/playqueuemodel.cpp
index 68a76c0ca..ec463fa53 100644
--- a/models/playqueuemodel.cpp
+++ b/models/playqueuemodel.cpp
@@ -415,30 +415,30 @@ PlayQueueModel::PlayQueueModel(QObject* parent)
 	collator.setNumericMode(true);
 	collator.setIgnorePunctuation(true);
 	fetcher = new StreamFetcher(this);
-	connect(this, SIGNAL(modelReset()), this, SLOT(stats()));
-	connect(fetcher, SIGNAL(result(const QStringList&, int, int, quint8, bool)), SLOT(addFiles(const QStringList&, int, int, quint8, bool)));
-	connect(fetcher, SIGNAL(result(const QStringList&, int, int, quint8, bool)), SIGNAL(streamsFetched()));
-	connect(fetcher, SIGNAL(status(QString)), SIGNAL(streamFetchStatus(QString)));
-	connect(this, SIGNAL(filesAdded(const QStringList, quint32, quint32, int, quint8, bool)),
-	        MPDConnection::self(), SLOT(add(const QStringList, quint32, quint32, int, quint8, bool)));
-	connect(this, SIGNAL(populate(QStringList, QList<quint8>)), MPDConnection::self(), SLOT(populate(QStringList, QList<quint8>)));
-	connect(this, SIGNAL(move(const QList<quint32>&, quint32, quint32)),
-	        MPDConnection::self(), SLOT(move(const QList<quint32>&, quint32, quint32)));
-	connect(this, SIGNAL(setOrder(const QList<quint32>&)), MPDConnection::self(), SLOT(setOrder(const QList<quint32>&)));
-	connect(MPDConnection::self(), SIGNAL(prioritySet(const QMap<qint32, quint8>&)), SLOT(prioritySet(const QMap<qint32, quint8>&)));
-	connect(MPDConnection::self(), SIGNAL(stopAfterCurrentChanged(bool)), SLOT(stopAfterCurrentChanged(bool)));
-	connect(this, SIGNAL(stop(bool)), MPDConnection::self(), SLOT(stopPlaying(bool)));
-	connect(this, SIGNAL(clearStopAfter()), MPDConnection::self(), SLOT(clearStopAfter()));
-	connect(this, SIGNAL(removeSongs(QList<qint32>)), MPDConnection::self(), SLOT(removeSongs(QList<qint32>)));
-	connect(this, SIGNAL(clearEntries()), MPDConnection::self(), SLOT(clear()));
-	connect(this, SIGNAL(addAndPlay(QString)), MPDConnection::self(), SLOT(addAndPlay(QString)));
-	connect(this, SIGNAL(startPlayingSongId(qint32)), MPDConnection::self(), SLOT(startPlayingSongId(qint32)));
-	connect(this, SIGNAL(getRating(QString)), MPDConnection::self(), SLOT(getRating(QString)));
-	connect(this, SIGNAL(setRating(QStringList, quint8)), MPDConnection::self(), SLOT(setRating(QStringList, quint8)));
-	connect(MPDConnection::self(), SIGNAL(rating(QString, quint8)), SLOT(ratingResult(QString, quint8)));
-	connect(MPDConnection::self(), SIGNAL(stickerDbChanged()), SLOT(stickerDbChanged()));
+	connect(this, &PlayQueueModel::modelReset, this, &PlayQueueModel::stats);
+	connect(fetcher, &StreamFetcher::result, this, &PlayQueueModel::addFiles);
+	connect(fetcher, &StreamFetcher::result, this, &PlayQueueModel::streamsFetched);
+	connect(fetcher, &StreamFetcher::status, this, &PlayQueueModel::streamFetchStatus);
+	connect(this, &PlayQueueModel::filesAdded,
+	        MPDConnection::self(), qOverload<const QStringList&, quint32, quint32, int, quint8, bool>(&MPDConnection::add));
+	connect(this, &PlayQueueModel::populate, MPDConnection::self(), &MPDConnection::populate);
+	connect(this, &PlayQueueModel::move,
+	        MPDConnection::self(), qOverload<const QList<quint32>&, quint32, quint32>(&MPDConnection::move));
+	connect(this, &PlayQueueModel::setOrder, MPDConnection::self(), &MPDConnection::setOrder);
+	connect(MPDConnection::self(), &MPDConnection::prioritySet, this, &PlayQueueModel::prioritySet);
+	connect(MPDConnection::self(), &MPDConnection::stopAfterCurrentChanged, this, &PlayQueueModel::stopAfterCurrentChanged);
+	connect(this, &PlayQueueModel::stop, MPDConnection::self(), &MPDConnection::stopPlaying);
+	connect(this, &PlayQueueModel::clearStopAfter, MPDConnection::self(), &MPDConnection::clearStopAfter);
+	connect(this, &PlayQueueModel::removeSongs, MPDConnection::self(), &MPDConnection::removeSongs);
+	connect(this, &PlayQueueModel::clearEntries, MPDConnection::self(), &MPDConnection::clear);
+	connect(this, &PlayQueueModel::addAndPlay, MPDConnection::self(), &MPDConnection::addAndPlay);
+	connect(this, &PlayQueueModel::startPlayingSongId, MPDConnection::self(), &MPDConnection::startPlayingSongId);
+	connect(this, &PlayQueueModel::getRating, MPDConnection::self(), &MPDConnection::getRating);
+	connect(this, qOverload<const QStringList&, quint8>(&PlayQueueModel::setRating), MPDConnection::self(), qOverload<const QStringList&, quint8>(&MPDConnection::setRating));
+	connect(MPDConnection::self(), &MPDConnection::rating, this, qOverload<const QString&, quint8>(&PlayQueueModel::ratingResult));
+	connect(MPDConnection::self(), &MPDConnection::stickerDbChanged, this, &PlayQueueModel::stickerDbChanged);
 #ifdef ENABLE_DEVICES_SUPPORT//TODO: Problems here with devices support!!!
-	connect(DevicesModel::self(), SIGNAL(updatedDetails(QList<Song>)), SLOT(updateDetails(QList<Song>)));
+	connect(DevicesModel::self(), &DevicesModel::updatedDetails, this, &PlayQueueModel::updateDetails);
 #endif
 
 	removeDuplicatesAction = new Action(tr("Remove Duplicates"), this);
@@ -447,16 +447,16 @@ PlayQueueModel::PlayQueueModel(QObject* parent)
 	undoAction->setShortcut(QKeyCombination(Qt::ControlModifier, Qt::Key_Z));
 	redoAction = ActionCollection::get()->createAction("playqueue-redo", tr("Redo"), Icon::fa(fa::fa_solid, fa::fa_redo));
 	redoAction->setShortcut(QKeyCombination(Qt::ShiftModifier | Qt::ControlModifier, Qt::Key_Z));
-	connect(undoAction, SIGNAL(triggered()), this, SLOT(undo()));
-	connect(redoAction, SIGNAL(triggered()), this, SLOT(redo()));
-	connect(removeDuplicatesAction, SIGNAL(triggered()), this, SLOT(removeDuplicates()));
+	connect(undoAction, &Action::triggered, this, &PlayQueueModel::undo);
+	connect(redoAction, &Action::triggered, this, &PlayQueueModel::redo);
+	connect(removeDuplicatesAction, &Action::triggered, this, &PlayQueueModel::removeDuplicates);
 
 	shuffleAction = new Action(tr("Shuffle"), this);
 	shuffleAction->setMenu(new QMenu(nullptr));
 	Action* shuffleTracksAction = new Action(tr("Tracks"), shuffleAction);
 	Action* shuffleAlbumsAction = new Action(tr("Albums"), shuffleAction);
-	connect(shuffleTracksAction, SIGNAL(triggered()), MPDConnection::self(), SLOT(shuffle()));
-	connect(shuffleAlbumsAction, SIGNAL(triggered()), this, SLOT(shuffleAlbums()));
+	connect(shuffleTracksAction, &Action::triggered, MPDConnection::self(), qOverload<>(&MPDConnection::shuffle));
+	connect(shuffleAlbumsAction, &Action::triggered, this, &PlayQueueModel::shuffleAlbums);
 	shuffleAction->menu()->addAction(shuffleTracksAction);
 	shuffleAction->menu()->addAction(shuffleAlbumsAction);
 
@@ -1433,7 +1433,7 @@ void PlayQueueModel::addSortAction(const QString& name, const QString& key)
 	Action* action = new Action(name, sortAction);
 	action->setProperty(constSortByKey, key);
 	sortAction->menu()->addAction(action);
-	connect(action, SIGNAL(triggered()), SLOT(sortBy()));
+	connect(action, &Action::triggered, this, &PlayQueueModel::sortBy);
 }
 
 static bool otherSort(const Song* s1, const Song* s2, quint32 other)
diff --git a/models/sqllibrarymodel.cpp b/models/sqllibrarymodel.cpp
index 3edec197f..d8495fad9 100644
--- a/models/sqllibrarymodel.cpp
+++ b/models/sqllibrarymodel.cpp
@@ -73,8 +73,8 @@ QString SqlLibraryModel::groupingStr(Type m)
 SqlLibraryModel::SqlLibraryModel(LibraryDb* d, QObject* p, Type top)
 	: ActionModel(p), tl(top), root(nullptr), db(d), librarySort(LibraryDb::AS_YrAlAr), albumSort(LibraryDb::AS_AlArYr)
 {
-	connect(db, SIGNAL(libraryUpdated()), SLOT(libraryUpdated()));
-	connect(db, SIGNAL(error(QString)), this, SIGNAL(error(QString)));
+	connect(db, &LibraryDb::libraryUpdated, this, &SqlLibraryModel::libraryUpdated);
+	connect(db, &LibraryDb::error, this, &SqlLibraryModel::error);
 }
 
 void SqlLibraryModel::clear()
diff --git a/models/streamsearchmodel.cpp b/models/streamsearchmodel.cpp
index 9f12b0d6f..58aeca312 100644
--- a/models/streamsearchmodel.cpp
+++ b/models/streamsearchmodel.cpp
@@ -207,7 +207,7 @@ void StreamSearchModel::fetchMore(const QModelIndex& index)
 			emit loading();
 		}
 		jobs.insert(job, cat);
-		connect(job, SIGNAL(finished()), this, SLOT(jobFinished()));
+		connect(job, &NetworkJob::finished, this, &StreamSearchModel::jobFinished);
 		cat->state = StreamsModel::CategoryItem::Fetching;
 		emit dataChanged(index, index);
 	}
@@ -298,7 +298,7 @@ void StreamSearchModel::search(const QString& searchTerm, bool stationsOnly)
 			emit loading();
 		}
 		jobs.insert(job, static_cast<StreamsModel::CategoryItem*>(item));
-		connect(job, SIGNAL(finished()), this, SLOT(jobFinished()));
+		connect(job, &NetworkJob::finished, this, &StreamSearchModel::jobFinished);
 	}
 }
 
diff --git a/models/streamsmodel.cpp b/models/streamsmodel.cpp
index 90e861261..1a0005c13 100644
--- a/models/streamsmodel.cpp
+++ b/models/streamsmodel.cpp
@@ -512,14 +512,14 @@ StreamsModel::StreamsModel(QObject* parent)
 		}
 	}
 
-	connect(MPDConnection::self(), SIGNAL(savedStream(QString, QString)), SLOT(savedFavouriteStream(QString, QString)));
-	connect(MPDConnection::self(), SIGNAL(removedStreams(QList<quint32>)), SLOT(removedFavouriteStreams(QList<quint32>)));
-	connect(MPDConnection::self(), SIGNAL(streamList(QList<Stream>)), SLOT(favouriteStreams(QList<Stream>)));
-	connect(MPDConnection::self(), SIGNAL(stateChanged(bool)), SLOT(mpdConnectionState(bool)));
-	connect(this, SIGNAL(listFavouriteStreams()), MPDConnection::self(), SLOT(listStreams()));
-	connect(this, SIGNAL(saveFavouriteStream(QString, QString)), MPDConnection::self(), SLOT(saveStream(QString, QString)));
-	connect(this, SIGNAL(removeFavouriteStreams(QList<quint32>)), MPDConnection::self(), SLOT(removeStreams(QList<quint32>)));
-	connect(this, SIGNAL(editFavouriteStream(QString, QString, quint32)), MPDConnection::self(), SLOT(editStream(QString, QString, quint32)));
+	connect(MPDConnection::self(), &MPDConnection::savedStream, this, &StreamsModel::savedFavouriteStream);
+	connect(MPDConnection::self(), &MPDConnection::removedStreams, this, &StreamsModel::removedFavouriteStreams);
+	connect(MPDConnection::self(), &MPDConnection::streamList, this, &StreamsModel::favouriteStreams);
+	connect(MPDConnection::self(), &MPDConnection::stateChanged, this, &StreamsModel::mpdConnectionState);
+	connect(this, &StreamsModel::listFavouriteStreams, MPDConnection::self(), &MPDConnection::listStreams);
+	connect(this, &StreamsModel::saveFavouriteStream, MPDConnection::self(), &MPDConnection::saveStream);
+	connect(this, &StreamsModel::removeFavouriteStreams, MPDConnection::self(), &MPDConnection::removeStreams);
+	connect(this, &StreamsModel::editFavouriteStream, MPDConnection::self(), &MPDConnection::editStream);
 }
 
 StreamsModel::~StreamsModel()
@@ -710,13 +710,13 @@ void StreamsModel::fetchMore(const QModelIndex& index)
 				emit loading();
 			}
 			jobs.insert(job, cat);
-			connect(job, SIGNAL(finished()), SLOT(jobFinished()));
+			connect(job, &NetworkJob::finished, this, &StreamsModel::jobFinished);
 			cat->state = CategoryItem::Fetching;
 
 			job = cat->fetchSecondardyUrl();
 			if (job) {
 				jobs.insert(job, cat);
-				connect(job, SIGNAL(finished()), SLOT(jobFinished()));
+				connect(job, &NetworkJob::finished, this, &StreamsModel::jobFinished);
 			}
 		}
 		emit dataChanged(index, index);
diff --git a/mpd-interface/httpstream.cpp b/mpd-interface/httpstream.cpp
index c9bea3091..68c0ee182 100644
--- a/mpd-interface/httpstream.cpp
+++ b/mpd-interface/httpstream.cpp
@@ -66,13 +66,13 @@ void HttpStream::setEnabled(bool e)
 
 	enabled = e;
 	if (enabled) {
-		connect(MPDConnection::self(), SIGNAL(streamUrl(QString)), this, SLOT(streamUrl(QString)));
-		connect(MPDStatus::self(), SIGNAL(updated()), this, SLOT(updateStatus()));
+		connect(MPDConnection::self(), &MPDConnection::streamUrl, this, &HttpStream::streamUrl);
+		connect(MPDStatus::self(), &MPDStatus::updated, this, &HttpStream::updateStatus);
 		streamUrl(MPDConnection::self()->getDetails().streamUrl);
 	}
 	else {
-		disconnect(MPDConnection::self(), SIGNAL(streamUrl(QString)), this, SLOT(streamUrl(QString)));
-		disconnect(MPDStatus::self(), SIGNAL(updated()), this, SLOT(updateStatus()));
+		disconnect(MPDConnection::self(), &MPDConnection::streamUrl, this, &HttpStream::streamUrl);
+		disconnect(MPDStatus::self(), &MPDStatus::updated, this, &HttpStream::updateStatus);
 		if (player) {
 			save();
 #ifdef LIBVLC_FOUND
@@ -281,7 +281,7 @@ void HttpStream::startTimer()
 		playStateCheckTimer = new QTimer(this);
 		playStateCheckTimer->setSingleShot(false);
 		playStateCheckTimer->setInterval(constPlayerCheckPeriod);
-		connect(playStateCheckTimer, SIGNAL(timeout()), SLOT(checkPlayer()));
+		connect(playStateCheckTimer, &QTimer::timeout, this, &HttpStream::checkPlayer);
 	}
 	playStateChecks = constMaxPlayStateChecks;
 	DBUG << playStateChecks;
diff --git a/mpd-interface/mpdconnection.cpp b/mpd-interface/mpdconnection.cpp
index dc80fbd2f..ccc80cac7 100644
--- a/mpd-interface/mpdconnection.cpp
+++ b/mpd-interface/mpdconnection.cpp
@@ -276,7 +276,7 @@ MPDConnection::MPDConnection()
 	qRegisterMetaType<Stream>("Stream");
 	qRegisterMetaType<QList<Stream>>("QList<Stream>");
 #if (defined Q_OS_LINUX && defined QT_QTDBUS_FOUND) || (defined Q_OS_MAC && defined IOKIT_FOUND)
-	connect(PowerManagement::self(), SIGNAL(resuming()), this, SLOT(reconnect()));
+	connect(PowerManagement::self(), &PowerManagement::resuming, this, &MPDConnection::reconnect);
 #endif
 	MPDParseUtils::setSingleTracksFolders(Utils::listToSet(Configuration().get("singleTracksFolders", QStringList())));
 }
@@ -287,9 +287,9 @@ MPDConnection::~MPDConnection()
 		sendCommand("stop");
 		stopVolumeFade();
 	}
-	//     disconnect(&sock, SIGNAL(stateChanged(QAbstractSocket::SocketState)), this, SLOT(onSocketStateChanged(QAbstractSocket::SocketState)));
-	disconnect(&idleSocket, SIGNAL(stateChanged(QAbstractSocket::SocketState)), this, SLOT(onSocketStateChanged(QAbstractSocket::SocketState)));
-	disconnect(&idleSocket, SIGNAL(readyRead()), this, SLOT(idleDataReady()));
+	//     disconnect(&sock, &MpdSocket::stateChanged, this, &MPDConnection::onSocketStateChanged);
+	disconnect(&idleSocket, &MpdSocket::stateChanged, this, &MPDConnection::onSocketStateChanged);
+	disconnect(&idleSocket, &MpdSocket::readyRead, this, &MPDConnection::idleDataReady);
 	sock.disconnectFromHost();
 	idleSocket.disconnectFromHost();
 }
@@ -301,8 +301,8 @@ void MPDConnection::start()
 		connTimer = thread->createTimer(this);
 		connTimer->setSingleShot(false);
 		moveToThread(thread);
-		connect(thread, SIGNAL(finished()), connTimer, SLOT(stop()));
-		connect(connTimer, SIGNAL(timeout()), SLOT(getStatus()));
+		connect(thread, &Thread::finished, connTimer, &QTimer::stop);
+		connect(connTimer, &QTimer::timeout, this, &MPDConnection::getStatus);
 		thread->start();
 	}
 }
@@ -389,8 +389,8 @@ MPDConnection::ConnectionReturn MPDConnection::connectToMPD(MpdSocket& socket, b
 			if (enableIdle) {
 				dynamicId.clear();
 				setupRemoteDynamic();
-				connect(&socket, SIGNAL(readyRead()), this, SLOT(idleDataReady()), Qt::QueuedConnection);
-				connect(&socket, SIGNAL(stateChanged(QAbstractSocket::SocketState)), this, SLOT(onSocketStateChanged(QAbstractSocket::SocketState)), Qt::QueuedConnection);
+				connect(&socket, &MpdSocket::readyRead, this, &MPDConnection::idleDataReady, Qt::QueuedConnection);
+				connect(&socket, &MpdSocket::stateChanged, this, &MPDConnection::onSocketStateChanged, Qt::QueuedConnection);
 				DBUG << (void*)(&socket) << "Enabling idle";
 				socket.write("idle\n");
 				socket.waitForBytesWritten();
@@ -477,8 +477,8 @@ void MPDConnection::disconnectFromMPD()
 {
 	DBUG << "disconnectFromMPD";
 	connTimer->stop();
-	disconnect(&idleSocket, SIGNAL(stateChanged(QAbstractSocket::SocketState)), this, SLOT(onSocketStateChanged(QAbstractSocket::SocketState)));
-	disconnect(&idleSocket, SIGNAL(readyRead()), this, SLOT(idleDataReady()));
+	disconnect(&idleSocket, &MpdSocket::stateChanged, this, &MPDConnection::onSocketStateChanged);
+	disconnect(&idleSocket, &MpdSocket::readyRead, this, &MPDConnection::idleDataReady);
 	if (QAbstractSocket::ConnectedState == sock.state()) {
 		sock.disconnectFromHost();
 	}
@@ -543,7 +543,7 @@ void MPDConnection::reconnect()
 			if (!reconnectTimer) {
 				reconnectTimer = new QTimer(this);
 				reconnectTimer->setSingleShot(true);
-				connect(reconnectTimer, SIGNAL(timeout()), this, SLOT(reconnect()), Qt::QueuedConnection);
+				connect(reconnectTimer, &QTimer::timeout, this, &MPDConnection::reconnect, Qt::QueuedConnection);
 			}
 			if (std::abs(now - reconnectStart) > 1) {
 				emit info(tr("Connecting to %1").arg(details.description()));
@@ -1659,7 +1659,7 @@ void MPDConnection::onSocketStateChanged(QAbstractSocket::SocketState socketStat
 {
 	if (socketState == QAbstractSocket::ClosingState) {
 		bool wasConnected = State_Connected == state;
-		disconnect(&idleSocket, SIGNAL(stateChanged(QAbstractSocket::SocketState)), this, SLOT(onSocketStateChanged(QAbstractSocket::SocketState)));
+		disconnect(&idleSocket, &MpdSocket::stateChanged, this, &MPDConnection::onSocketStateChanged);
 		DBUG << "onSocketStateChanged";
 		if (QAbstractSocket::ConnectedState == idleSocket.state()) {
 			idleSocket.disconnectFromHost();
@@ -1673,7 +1673,7 @@ void MPDConnection::onSocketStateChanged(QAbstractSocket::SocketState socketStat
 			emit error(errorString(status), true);
 		}
 		if (QAbstractSocket::ConnectedState == idleSocket.state()) {
-			connect(&idleSocket, SIGNAL(stateChanged(QAbstractSocket::SocketState)), this, SLOT(onSocketStateChanged(QAbstractSocket::SocketState)), Qt::QueuedConnection);
+			connect(&idleSocket, &MpdSocket::stateChanged, this, &MPDConnection::onSocketStateChanged, Qt::QueuedConnection);
 		}
 	}
 }
@@ -1688,7 +1688,7 @@ void MPDConnection::parseIdleReturn(const QByteArray& data)
 	Response response(data.endsWith(constOkNlValue), data);
 	if (!response.ok) {
 		DBUG << "idle failed? reconnect";
-		disconnect(&idleSocket, SIGNAL(stateChanged(QAbstractSocket::SocketState)), this, SLOT(onSocketStateChanged(QAbstractSocket::SocketState)));
+		disconnect(&idleSocket, &MpdSocket::stateChanged, this, &MPDConnection::onSocketStateChanged);
 		if (QAbstractSocket::ConnectedState == idleSocket.state()) {
 			idleSocket.disconnectFromHost();
 		}
@@ -2741,8 +2741,8 @@ void MpdSocket::connectToHost(const QString& hostName, quint16 port, QIODevice::
 		deleteTcp();
 		if (!local) {
 			local = new QLocalSocket(this);
-			connect(local, SIGNAL(stateChanged(QLocalSocket::LocalSocketState)), this, SLOT(localStateChanged(QLocalSocket::LocalSocketState)));
-			connect(local, SIGNAL(readyRead()), this, SIGNAL(readyRead()));
+			connect(local, &QLocalSocket::stateChanged, this, &MpdSocket::localStateChanged);
+			connect(local, &QLocalSocket::readyRead, this, &MpdSocket::readyRead);
 		}
 		DBUG << "Connecting to LOCAL socket";
 		QString host = Utils::tildaToHome(hostName);
@@ -2755,8 +2755,8 @@ void MpdSocket::connectToHost(const QString& hostName, quint16 port, QIODevice::
 		deleteLocal();
 		if (!tcp) {
 			tcp = new QTcpSocket(this);
-			connect(tcp, SIGNAL(stateChanged(QAbstractSocket::SocketState)), this, SIGNAL(stateChanged(QAbstractSocket::SocketState)));
-			connect(tcp, SIGNAL(readyRead()), this, SIGNAL(readyRead()));
+			connect(tcp, &QTcpSocket::stateChanged, this, &MpdSocket::stateChanged);
+			connect(tcp, &QTcpSocket::readyRead, this, &MpdSocket::readyRead);
 		}
 		DBUG << "Connecting to TCP socket";
 		tcp->connectToHost(hostName, port, mode);
@@ -2771,8 +2771,8 @@ void MpdSocket::localStateChanged(QLocalSocket::LocalSocketState state)
 void MpdSocket::deleteTcp()
 {
 	if (tcp) {
-		disconnect(tcp, SIGNAL(stateChanged(QAbstractSocket::SocketState)), this, SIGNAL(stateChanged(QAbstractSocket::SocketState)));
-		disconnect(tcp, SIGNAL(readyRead()), this, SIGNAL(readyRead()));
+		disconnect(tcp, &QTcpSocket::stateChanged, this, &MpdSocket::stateChanged);
+		disconnect(tcp, &QTcpSocket::readyRead, this, &MpdSocket::readyRead);
 		tcp->deleteLater();
 		tcp = nullptr;
 	}
@@ -2781,8 +2781,8 @@ void MpdSocket::deleteTcp()
 void MpdSocket::deleteLocal()
 {
 	if (local) {
-		disconnect(local, SIGNAL(stateChanged(QLocalSocket::LocalSocketState)), this, SLOT(localStateChanged(QLocalSocket::LocalSocketState)));
-		disconnect(local, SIGNAL(readyRead()), this, SIGNAL(readyRead()));
+		disconnect(local, &QLocalSocket::stateChanged, this, &MpdSocket::localStateChanged);
+		disconnect(local, &QLocalSocket::readyRead, this, &MpdSocket::readyRead);
 		local->deleteLater();
 		local = nullptr;
 	}
diff --git a/mpd-interface/mpdstats.cpp b/mpd-interface/mpdstats.cpp
index c64e06511..428852b34 100644
--- a/mpd-interface/mpdstats.cpp
+++ b/mpd-interface/mpdstats.cpp
@@ -35,7 +35,7 @@ MPDStats* MPDStats::self()
 
 MPDStats::MPDStats()
 {
-	connect(MPDConnection::self(), SIGNAL(statsUpdated(const MPDStatsValues&)), this, SLOT(update(const MPDStatsValues&)), Qt::QueuedConnection);
+	connect(MPDConnection::self(), &MPDConnection::statsUpdated, this, &MPDStats::update, Qt::QueuedConnection);
 }
 
 void MPDStats::update(const MPDStatsValues& v)
diff --git a/mpd-interface/mpdstatus.cpp b/mpd-interface/mpdstatus.cpp
index c6e1ac62c..9b5a68525 100644
--- a/mpd-interface/mpdstatus.cpp
+++ b/mpd-interface/mpdstatus.cpp
@@ -35,7 +35,7 @@ MPDStatus* MPDStatus::self()
 
 MPDStatus::MPDStatus()
 {
-	connect(MPDConnection::self(), SIGNAL(statusUpdated(const MPDStatusValues&)), this, SLOT(update(const MPDStatusValues&)), Qt::QueuedConnection);
+	connect(MPDConnection::self(), &MPDConnection::statusUpdated, this, &MPDStatus::update, Qt::QueuedConnection);
 }
 
 void MPDStatus::update(const MPDStatusValues& v)
diff --git a/network/networkaccessmanager.cpp b/network/networkaccessmanager.cpp
index abc8fce0c..89384fdc8 100644
--- a/network/networkaccessmanager.cpp
+++ b/network/networkaccessmanager.cpp
@@ -51,7 +51,7 @@ static const int constMaxRedirects = 5;
 NetworkJob::NetworkJob(NetworkAccessManager* p, const QUrl& u)
 	: QObject(p), numRedirects(0), lastDownloadPc(0), job(nullptr), origU(u)
 {
-	QTimer::singleShot(0, this, SLOT(jobFinished()));
+	QTimer::singleShot(0, this, &NetworkJob::jobFinished);
 }
 
 NetworkJob::NetworkJob(QNetworkReply* j)
@@ -235,7 +235,7 @@ struct FakeNetworkReply : public QNetworkReply {
 	FakeNetworkReply() : QNetworkReply(nullptr)
 	{
 		setError(QNetworkReply::ConnectionRefusedError, QString());
-		QTimer::singleShot(0, this, SIGNAL(finished()));
+		QTimer::singleShot(0, this, &FakeNetworkReply::finished);
 	}
 	void abort() override {}
 	qint64 readData(char*, qint64) override { return 0; }
diff --git a/network/proxysettings.cpp b/network/proxysettings.cpp
index 1e3861fd1..b190bf0b3 100644
--- a/network/proxysettings.cpp
+++ b/network/proxysettings.cpp
@@ -32,7 +32,7 @@ ProxySettings::ProxySettings(QWidget* parent)
 	proxyMode->addItem(tr("No proxy"), (int)NetworkProxyFactory::Mode_Direct);
 	proxyMode->addItem(tr("Use the system proxy settings"), (int)NetworkProxyFactory::Mode_System);
 	proxyMode->addItem(tr("Manual proxy configuration"), (int)NetworkProxyFactory::Mode_Manual);
-	connect(proxyMode, SIGNAL(currentIndexChanged(int)), SLOT(toggleMode()));
+	connect(proxyMode, &QComboBox::currentIndexChanged, this, &ProxySettings::toggleMode);
 }
 
 ProxySettings::~ProxySettings()
diff --git a/online/magnatunesettingsdialog.cpp b/online/magnatunesettingsdialog.cpp
index d4dd1a6c5..49419b1a2 100644
--- a/online/magnatunesettingsdialog.cpp
+++ b/online/magnatunesettingsdialog.cpp
@@ -62,7 +62,7 @@ MagnatuneSettingsDialog::MagnatuneSettingsDialog(QWidget* parent)
 	dl->setVisible(false);     // TODO: Magnatune downloads!
 
 	setMainWidget(mw);
-	connect(member, SIGNAL(currentIndexChanged(int)), SLOT(membershipChanged(int)));
+	connect(member, &QComboBox::currentIndexChanged, this, &MagnatuneSettingsDialog::membershipChanged);
 }
 
 bool MagnatuneSettingsDialog::run(int m, int d, const QString& u, const QString& p)
diff --git a/online/onlinedbservice.cpp b/online/onlinedbservice.cpp
index 121414012..8fd6943c0 100644
--- a/online/onlinedbservice.cpp
+++ b/online/onlinedbservice.cpp
@@ -39,7 +39,7 @@ OnlineXmlParser::OnlineXmlParser()
 	thread = new Thread(metaObject()->className());
 	moveToThread(thread);
 	thread->start();
-	connect(this, SIGNAL(startParsing(NetworkJob*)), this, SLOT(doParsing(NetworkJob*)));
+	connect(this, &OnlineXmlParser::startParsing, this, &OnlineXmlParser::doParsing);
 }
 
 OnlineXmlParser::~OnlineXmlParser()
@@ -87,7 +87,7 @@ void OnlineXmlParser::doParsing(NetworkJob* job)
 OnlineDbService::OnlineDbService(LibraryDb* d, QObject* p)
 	: SqlLibraryModel(d, p, T_Genre), lastPc(-1), job(nullptr)
 {
-	connect(Covers::self(), SIGNAL(cover(Song, QImage, QString)), this, SLOT(cover(Song, QImage, QString)));
+	connect(Covers::self(), &Covers::cover, this, &OnlineDbService::cover);
 }
 
 QVariant OnlineDbService::data(const QModelIndex& index, int role) const
@@ -135,8 +135,8 @@ void OnlineDbService::download(bool redownload)
 	}
 	if (redownload || !previouslyDownloaded()) {
 		job = NetworkAccessManager::self()->get(QUrl(listingUrl()));
-		connect(job, SIGNAL(downloadPercent(int)), this, SLOT(downloadPercent(int)));
-		connect(job, SIGNAL(finished()), this, SLOT(downloadFinished()));
+		connect(job, &NetworkJob::downloadPercent, this, &OnlineDbService::downloadPercent);
+		connect(job, &NetworkJob::finished, this, &OnlineDbService::downloadFinished);
 		lastPc = -1;
 		downloadPercent(0);
 	}
@@ -202,16 +202,16 @@ void OnlineDbService::downloadFinished()
 		updateStatus(tr("Parsing music list...."));
 		OnlineXmlParser* parser = createParser();
 		db->clear();
-		connect(parser, SIGNAL(startUpdate()), static_cast<OnlineDb*>(db), SLOT(startUpdate()));
-		connect(parser, SIGNAL(endUpdate()), static_cast<OnlineDb*>(db), SLOT(endUpdate()));
-		connect(parser, SIGNAL(abortUpdate()), static_cast<OnlineDb*>(db), SLOT(abortUpdate()));
-		connect(parser, SIGNAL(stats(int)), static_cast<OnlineDb*>(db), SLOT(insertStats(int)));
-		connect(parser, SIGNAL(coverUrl(QString, QString, QString)), static_cast<OnlineDb*>(db), SLOT(storeCoverUrl(QString, QString, QString)));
-		connect(parser, SIGNAL(songs(QList<Song>*)), static_cast<OnlineDb*>(db), SLOT(insertSongs(QList<Song>*)));
-		connect(parser, SIGNAL(complete()), job, SLOT(deleteLater()));
-		connect(parser, SIGNAL(complete()), this, SLOT(updateStats()));
-		connect(parser, SIGNAL(error(QString)), this, SIGNAL(error(QString)));
-		connect(parser, SIGNAL(complete()), parser, SLOT(deleteLater()));
+		connect(parser, &OnlineXmlParser::startUpdate, static_cast<OnlineDb*>(db), &OnlineDb::startUpdate);
+		connect(parser, &OnlineXmlParser::endUpdate, static_cast<OnlineDb*>(db), &OnlineDb::endUpdate);
+		connect(parser, &OnlineXmlParser::abortUpdate, static_cast<OnlineDb*>(db), &OnlineDb::abortUpdate);
+		connect(parser, &OnlineXmlParser::stats, static_cast<OnlineDb*>(db), &OnlineDb::insertStats);
+		connect(parser, &OnlineXmlParser::coverUrl, static_cast<OnlineDb*>(db), &OnlineDb::storeCoverUrl);
+		connect(parser, &OnlineXmlParser::songs, static_cast<OnlineDb*>(db), &OnlineDb::insertSongs);
+		connect(parser, &OnlineXmlParser::complete, job, &NetworkJob::deleteLater);
+		connect(parser, &OnlineXmlParser::complete, this, &OnlineDbService::updateStats);
+		connect(parser, &OnlineXmlParser::error, this, &OnlineDbService::error);
+		connect(parser, &OnlineXmlParser::complete, parser, &OnlineXmlParser::deleteLater);
 		parser->start(reply);
 	}
 	else {
diff --git a/online/onlinedbwidget.cpp b/online/onlinedbwidget.cpp
index 2b710262a..4449a4cb4 100644
--- a/online/onlinedbwidget.cpp
+++ b/online/onlinedbwidget.cpp
@@ -45,17 +45,17 @@ OnlineDbWidget::OnlineDbWidget(OnlineDbService* s, QWidget* p)
 	menu->addAction(createViewMenu(QList<ItemView::Mode>() << ItemView::Mode_BasicTree << ItemView::Mode_SimpleTree
 	                                                       << ItemView::Mode_DetailedTree << ItemView::Mode_List));
 	menu->addAction(createMenuGroup(tr("Group By"), QList<MenuItem>() << MenuItem(tr("Genre"), SqlLibraryModel::T_Genre) << MenuItem(tr("Artist"), SqlLibraryModel::T_Artist),
-	                                srv->topLevel(), this, SLOT(groupByChanged())));
+	                                srv->topLevel(), this, &OnlineDbWidget::groupByChanged));
 	Action* configureAction = new Action(Icons::self()->configureIcon, tr("Configure"), this);
-	connect(configureAction, SIGNAL(triggered()), SLOT(configure()));
+	connect(configureAction, &Action::triggered, this, &OnlineDbWidget::configure);
 	menu->addAction(configureAction);
 	init(ReplacePlayQueue | AppendToPlayQueue | Refresh, QList<QWidget*>() << menu);
-	connect(view, SIGNAL(headerClicked(int)), SLOT(headerClicked(int)));
-	connect(view, SIGNAL(updateToPlayQueue(QModelIndex, bool)), this, SLOT(updateToPlayQueue(QModelIndex, bool)));
+	connect(view, &ItemView::headerClicked, this, &OnlineDbWidget::headerClicked);
+	connect(view, &ItemView::updateToPlayQueue, this, &OnlineDbWidget::updateToPlayQueue);
 	view->setOpenAfterSearch(SqlLibraryModel::T_Album != srv->topLevel());
 	view->addAction(StdActions::self()->addToStoredPlaylistAction);
-	connect(StdActions::self()->addRandomAlbumToPlayQueueAction, SIGNAL(triggered()), SLOT(addRandomAlbum()));
-	connect(srv, SIGNAL(modelReset()), this, SLOT(modelReset()));
+	connect(StdActions::self()->addRandomAlbumToPlayQueueAction, &Action::triggered, this, &OnlineDbWidget::addRandomAlbum);
+	connect(srv, &OnlineDbService::modelReset, this, &OnlineDbWidget::modelReset);
 }
 
 OnlineDbWidget::~OnlineDbWidget()
@@ -104,7 +104,7 @@ void OnlineDbWidget::showEvent(QShowEvent* e)
 		srv->open();
 	}
 	else {
-		QTimer::singleShot(0, this, SLOT(firstTimePrompt()));
+		QTimer::singleShot(0, this, &OnlineDbWidget::firstTimePrompt);
 	}
 }
 
diff --git a/online/onlinesearchwidget.cpp b/online/onlinesearchwidget.cpp
index fef014187..c6f45a0d9 100644
--- a/online/onlinesearchwidget.cpp
+++ b/online/onlinesearchwidget.cpp
@@ -37,8 +37,8 @@ OnlineSearchWidget::OnlineSearchWidget(OnlineSearchService* s, QWidget* p)
 	view->alwaysShowHeader();
 	view->setPermanentSearch();
 	view->setMode(ItemView::Mode_List);
-	connect(view, SIGNAL(headerClicked(int)), SLOT(headerClicked(int)));
-	connect(srv, SIGNAL(statsUpdated(int, quint32)), this, SLOT(statsUpdated(int, quint32)));
+	connect(view, &ItemView::headerClicked, this, &OnlineSearchWidget::headerClicked);
+	connect(srv, &OnlineSearchService::statsUpdated, this, &OnlineSearchWidget::statsUpdated);
 	statsUpdated(0, 0);
 }
 
diff --git a/online/onlineservicespage.cpp b/online/onlineservicespage.cpp
index 099ed019e..506f11429 100644
--- a/online/onlineservicespage.cpp
+++ b/online/onlineservicespage.cpp
@@ -41,18 +41,18 @@ OnlineServicesPage::OnlineServicesPage(QWidget* p)
 	// Start hide service
 	//	JamendoService* jamendo = new JamendoService(this);
 	//	addPage(jamendo->name(), jamendo->icon(), jamendo->title(), jamendo->descr(), new OnlineDbWidget(jamendo, this));
-	//	connect(jamendo, SIGNAL(error(QString)), this, SIGNAL(error(QString)));
+	//	connect(jamendo, &MpdSocket::error, this, &OnlineServicesPage::error);
 	// End hide service
 
 	MagnatuneService* magnatune = new MagnatuneService(this);
 	addPage(magnatune->name(), magnatune->icon(), magnatune->title(), magnatune->descr(), new OnlineDbWidget(magnatune, this));
-	connect(magnatune, SIGNAL(error(QString)), this, SIGNAL(error(QString)));
+	connect(magnatune, &MagnatuneService::error, this, &OnlineServicesPage::error);
 
 	//SoundCloudService *soundcloud=new SoundCloudService(this);
 	//addPage(soundcloud->name(), soundcloud->icon(), soundcloud->title(), soundcloud->descr(), new OnlineSearchWidget(soundcloud, this));
 
 	addPage(PodcastService::self()->name(), PodcastService::self()->icon(), PodcastService::self()->title(), PodcastService::self()->descr(), new PodcastWidget(PodcastService::self(), this));
-	connect(PodcastService::self(), SIGNAL(error(QString)), this, SIGNAL(error(QString)));
+	connect(PodcastService::self(), &PodcastService::error, this, &OnlineServicesPage::error);
 
 	Configuration config(metaObject()->className());
 	load(config);
diff --git a/online/onlinesettings.cpp b/online/onlinesettings.cpp
index d830ffef9..7d67a6935 100644
--- a/online/onlinesettings.cpp
+++ b/online/onlinesettings.cpp
@@ -41,8 +41,8 @@ OnlineSettings::OnlineSettings(QWidget* p)
 	providers->setSortingEnabled(true);
 	int iSize = Icon::stdSize(QFontMetricsF(QApplication::font()).height() * 1.25);
 	providers->setIconSize(QSize(iSize, iSize));
-	connect(providers, SIGNAL(currentRowChanged(int)), SLOT(currentProviderChanged(int)));
-	connect(configureButton, SIGNAL(clicked()), this, SLOT(configure()));
+	connect(providers, &QListWidget::currentRowChanged, this, &OnlineSettings::currentProviderChanged);
+	connect(configureButton, &QPushButton::clicked, this, &OnlineSettings::configure);
 	configureButton->setEnabled(false);
 }
 
diff --git a/online/podcastsearchdialog.cpp b/online/podcastsearchdialog.cpp
index 0955c65fb..3ddfda59b 100644
--- a/online/podcastsearchdialog.cpp
+++ b/online/podcastsearchdialog.cpp
@@ -143,10 +143,10 @@ PodcastPage::PodcastPage(QWidget* p, const QString& n)
 	spinner->setWidget(tree);
 	imageSpinner = new Spinner(this);
 	imageSpinner->setWidget(text);
-	connect(tree, SIGNAL(itemSelectionChanged()), SLOT(selectionChanged()));
+	connect(tree, &QTreeWidget::itemSelectionChanged, this, &PodcastPage::selectionChanged);
 	tree->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
 	text->setOpenLinks(false);
-	connect(text, SIGNAL(anchorClicked(QUrl)), SLOT(openLink(QUrl)));
+	connect(text, &TextBrowser::anchorClicked, this, &PodcastPage::openLink);
 	updateText();
 }
 
@@ -162,7 +162,7 @@ void PodcastPage::fetch(const QUrl& url)
 	tree->clear();
 	spinner->start();
 	job = NetworkAccessManager::self()->get(url);
-	connect(job, SIGNAL(finished()), this, SLOT(jobFinished()));
+	connect(job, &NetworkJob::finished, this, &PodcastPage::jobFinished);
 }
 
 void PodcastPage::fetchImage(const QUrl& url)
@@ -171,7 +171,7 @@ void PodcastPage::fetchImage(const QUrl& url)
 	imageSpinner->start();
 	imageJob = NetworkAccessManager::self()->get(url, 5000);
 	imageJob->setProperty(constOrigUrlProperty, url);
-	connect(imageJob, SIGNAL(finished()), this, SLOT(imageJobFinished()));
+	connect(imageJob, &NetworkJob::finished, this, &PodcastPage::imageJobFinished);
 }
 
 void PodcastPage::cancel()
@@ -352,8 +352,8 @@ PodcastSearchPage::PodcastSearchPage(QWidget* p, const QString& n, int s, int i,
 	viewLayout->addWidget(text, 0);
 	mainLayout->addLayout(searchLayout);
 	mainLayout->addLayout(viewLayout);
-	connect(search, SIGNAL(returnPressed()), SLOT(doSearch()));
-	connect(searchButton, SIGNAL(clicked()), SLOT(doSearch()));
+	connect(search, &LineEdit::returnPressed, this, &PodcastSearchPage::doSearch);
+	connect(searchButton, &QPushButton::clicked, this, &PodcastSearchPage::doSearch);
 	icn = Icon::fa(s, i);
 }
 
@@ -406,7 +406,7 @@ OpmlBrowsePage::OpmlBrowsePage(QWidget* p, const QString& n, const QIcon& i, con
 	mainLayout->addWidget(text, 0);
 	Action* act = new Action(tr("Reload"), this);
 	tree->addAction(act);
-	connect(act, SIGNAL(triggered()), this, SLOT(reload()));
+	connect(act, &Action::triggered, this, &OpmlBrowsePage::reload);
 	tree->setContextMenuPolicy(Qt::ActionsContextMenu);
 	icn = i;
 }
@@ -505,9 +505,9 @@ PodcastUrlPage::PodcastUrlPage(QWidget* p)
 	mainLayout->addWidget(new QLabel(tr("Enter podcast URL below, and press 'Load', or press the folder icon to load a local podcast file."), this));
 	mainLayout->addLayout(searchLayout);
 	mainLayout->addLayout(viewLayout);
-	connect(urlEntry, SIGNAL(returnPressed()), SLOT(loadUrl()));
-	connect(loadButton, SIGNAL(clicked()), SLOT(loadUrl()));
-	connect(pathReq, SIGNAL(clicked()), SLOT(openPath()));
+	connect(urlEntry, &LineEdit::returnPressed, this, &PodcastUrlPage::loadUrl);
+	connect(loadButton, &QPushButton::clicked, this, &PodcastUrlPage::loadUrl);
+	connect(pathReq, &FlatToolButton::clicked, this, &PodcastUrlPage::openPath);
 	icn = Icons::self()->rssListIcon;
 }
 
@@ -642,8 +642,8 @@ PodcastSearchDialog::PodcastSearchDialog(PodcastService* s, QWidget* parent)
 	pages << loadDirectories(QString(), true, loaded);
 
 	for (PodcastPage* p : pages) {
-		connect(p, SIGNAL(rssSelected(QUrl)), SLOT(rssSelected(QUrl)));
-		connect(p, SIGNAL(error(QString)), SLOT(showError(QString)));
+		connect(p, &PodcastPage::rssSelected, this, &PodcastSearchDialog::rssSelected);
+		connect(p, &PodcastPage::error, this, &PodcastSearchDialog::showError);
 	}
 
 	setCaption(tr("Add Podcast Subscription"));
@@ -655,9 +655,9 @@ PodcastSearchDialog::PodcastSearchDialog(PodcastService* s, QWidget* parent)
 	if (-1 == maxImageSize) {
 		maxImageSize = fontMetrics().height() * 8;
 	}
-	connect(service, SIGNAL(newError(QString)), this, SLOT(showError(QString)));
-	connect(messageWidget, SIGNAL(visible(bool)), SLOT(msgWidgetVisible(bool)));
-	connect(pageWidget, SIGNAL(currentPageChanged()), this, SLOT(pageChanged()));
+	connect(service, &PodcastService::newError, this, &PodcastSearchDialog::showError);
+	connect(messageWidget, &MessageWidget::visible, this, &PodcastSearchDialog::msgWidgetVisible);
+	connect(pageWidget, &PageWidget::currentPageChanged, this, &PodcastSearchDialog::pageChanged);
 	messageWidget->hide();
 }
 
diff --git a/online/podcastservice.cpp b/online/podcastservice.cpp
index a3f3c1c9e..86b139f55 100644
--- a/online/podcastservice.cpp
+++ b/online/podcastservice.cpp
@@ -425,7 +425,7 @@ PodcastService::PodcastService()
 	icn = Icon::fa(fa::fa_solid, fa::fa_rss_square);
 	useCovers(name(), true);
 	clearPartialDownloads();
-	connect(MPDConnection::self(), SIGNAL(currentSongUpdated(const Song&)), this, SLOT(currentMpdSong(const Song&)));
+	connect(MPDConnection::self(), &MPDConnection::currentSongUpdated, this, &PodcastService::currentMpdSong);
 	refreshAction = new Action(Icons::self()->reloadIcon, tr("Refresh"), this);
 }
 
@@ -772,7 +772,7 @@ void PodcastService::loadAll()
 void PodcastService::cancelAll()
 {
 	for (NetworkJob* j : rssJobs) {
-		disconnect(j, SIGNAL(finished()), this, SLOT(rssJobFinished()));
+		disconnect(j, &NetworkJob::finished, this, &PodcastService::rssJobFinished);
 		j->cancelAndDelete();
 	}
 	rssJobs.clear();
@@ -1015,7 +1015,7 @@ bool PodcastService::processingUrl(const QUrl& url) const
 void PodcastService::addUrl(const QUrl& url, bool isNew)
 {
 	NetworkJob* job = NetworkAccessManager::self()->get(url);
-	connect(job, SIGNAL(finished()), this, SLOT(rssJobFinished()));
+	connect(job, &NetworkJob::finished, this, &PodcastService::rssJobFinished);
 	job->setProperty(constNewFeedProperty, isNew);
 	rssJobs.append(job);
 }
@@ -1144,9 +1144,9 @@ void PodcastService::cancelDownload()
 {
 	if (downloadJob) {
 		downloadJob->cancelAndDelete();
-		disconnect(downloadJob, SIGNAL(finished()), this, SLOT(downloadJobFinished()));
-		disconnect(downloadJob, SIGNAL(readyRead()), this, SLOT(downloadReadyRead()));
-		disconnect(downloadJob, SIGNAL(downloadPercent(int)), this, SLOT(downloadPercent(int)));
+		disconnect(downloadJob, &NetworkJob::finished, this, &PodcastService::downloadJobFinished);
+		disconnect(downloadJob, &NetworkJob::readyRead, this, &PodcastService::downloadReadyRead);
+		disconnect(downloadJob, &NetworkJob::downloadPercent, this, &PodcastService::downloadPercent);
 
 		QString dest = downloadJob->property(constDestProperty).toString();
 		QString partial = dest.isEmpty() ? QString() : QString(dest + constPartialExt);
@@ -1170,9 +1170,9 @@ void PodcastService::doNextDownload()
 
 	DownloadEntry entry = toDownload.takeFirst();
 	downloadJob = NetworkAccessManager::self()->get(entry.url);
-	connect(downloadJob, SIGNAL(finished()), this, SLOT(downloadJobFinished()));
-	connect(downloadJob, SIGNAL(readyRead()), this, SLOT(downloadReadyRead()));
-	connect(downloadJob, SIGNAL(downloadPercent(int)), this, SLOT(downloadPercent(int)));
+	connect(downloadJob, &NetworkJob::finished, this, &PodcastService::downloadJobFinished);
+	connect(downloadJob, &NetworkJob::readyRead, this, &PodcastService::downloadReadyRead);
+	connect(downloadJob, &NetworkJob::downloadPercent, this, &PodcastService::downloadPercent);
 	downloadJob->setProperty(constRssUrlProperty, entry.rssUrl);
 	downloadJob->setProperty(constDestProperty, entry.dest);
 	updateEpisode(entry.rssUrl, entry.url, 0);
@@ -1307,7 +1307,7 @@ void PodcastService::startRssUpdateTimer()
 	if (!rssUpdateTimer) {
 		rssUpdateTimer = new QTimer(this);
 		rssUpdateTimer->setSingleShot(true);
-		connect(rssUpdateTimer, SIGNAL(timeout()), this, SLOT(updateRss()));
+		connect(rssUpdateTimer, &QTimer::timeout, this, &PodcastService::updateRss);
 	}
 	if (!lastRssUpdate.isValid()) {
 		lastRssUpdate = Settings::self()->lastRssUpdate();
diff --git a/online/podcastsettingsdialog.cpp b/online/podcastsettingsdialog.cpp
index 4ea674fda..8482db498 100644
--- a/online/podcastsettingsdialog.cpp
+++ b/online/podcastsettingsdialog.cpp
@@ -105,13 +105,13 @@ PodcastSettingsDialog::PodcastSettingsDialog(QWidget* p)
 
 	origRssUpdate = Settings::self()->rssUpdate();
 	setIndex(updateCombo, origRssUpdate);
-	connect(updateCombo, SIGNAL(currentIndexChanged(int)), SLOT(checkSaveable()));
+	connect(updateCombo, &QComboBox::currentIndexChanged, this, &PodcastSettingsDialog::checkSaveable);
 	origPodcastDownloadPath = Utils::convertPathForDisplay(Settings::self()->podcastDownloadPath());
 	origPodcastAutoDownload = Settings::self()->podcastAutoDownloadLimit();
 	setIndex(autoDownloadCombo, origPodcastAutoDownload);
 	downloadPath->setText(origPodcastDownloadPath);
-	connect(downloadPath, SIGNAL(textChanged(QString)), SLOT(checkSaveable()));
-	connect(autoDownloadCombo, SIGNAL(currentIndexChanged(int)), SLOT(checkSaveable()));
+	connect(downloadPath, &PathRequester::textChanged, this, &PodcastSettingsDialog::checkSaveable);
+	connect(autoDownloadCombo, &QComboBox::currentIndexChanged, this, &PodcastSettingsDialog::checkSaveable);
 	enableButton(Ok, false);
 	changed = 0;
 }
diff --git a/online/podcastwidget.cpp b/online/podcastwidget.cpp
index 589e12012..e84fa0652 100644
--- a/online/podcastwidget.cpp
+++ b/online/podcastwidget.cpp
@@ -56,18 +56,18 @@ PodcastWidget::PodcastWidget(PodcastService* s, QWidget* p)
 	view->setModel(&proxy);
 
 	view->alwaysShowHeader();
-	connect(view, SIGNAL(headerClicked(int)), SLOT(headerClicked(int)));
-
-	connect(subscribeAction, SIGNAL(triggered()), this, SLOT(subscribe()));
-	connect(unSubscribeAction, SIGNAL(triggered()), this, SLOT(unSubscribe()));
-	connect(downloadAction, SIGNAL(triggered()), this, SLOT(download()));
-	connect(deleteAction, SIGNAL(triggered()), this, SLOT(deleteDownload()));
-	connect(cancelDownloadAction, SIGNAL(triggered()), this, SLOT(cancelDownload()));
-	connect(markAsNewAction, SIGNAL(triggered()), this, SLOT(markAsNew()));
-	connect(markAsListenedAction, SIGNAL(triggered()), this, SLOT(markAsListened()));
-	//connect(unplayedOnlyAction, SIGNAL(toggled(bool)), this, SLOT(showUnplayedOnly(bool)));
-	connect(exportAction, SIGNAL(triggered()), SLOT(exportSubscriptions()));
-	connect(srv->refreshAct(), SIGNAL(triggered()), this, SLOT(refreshPodcast()));
+	connect(view, &ItemView::headerClicked, this, &PodcastWidget::headerClicked);
+
+	connect(subscribeAction, &Action::triggered, this, &PodcastWidget::subscribe);
+	connect(unSubscribeAction, &Action::triggered, this, &PodcastWidget::unSubscribe);
+	connect(downloadAction, &Action::triggered, this, &PodcastWidget::download);
+	connect(deleteAction, &Action::triggered, this, &PodcastWidget::deleteDownload);
+	connect(cancelDownloadAction, &Action::triggered, this, &PodcastWidget::cancelDownload);
+	connect(markAsNewAction, &Action::triggered, this, &PodcastWidget::markAsNew);
+	connect(markAsListenedAction, &Action::triggered, this, &PodcastWidget::markAsListened);
+	//connect(unplayedOnlyAction, &Action::toggled, this, &PodcastWidget::showUnplayedOnly);
+	connect(exportAction, &Action::triggered, this, &PodcastWidget::exportSubscriptions);
+	connect(srv->refreshAct(), &Action::triggered, this, &PodcastWidget::refreshPodcast);
 
 	view->setMode(ItemView::Mode_DetailedTree);
 	Configuration config(metaObject()->className());
@@ -81,7 +81,7 @@ PodcastWidget::PodcastWidget(PodcastService* s, QWidget* p)
 	                                                       << ItemView::Mode_DetailedTree << ItemView::Mode_List));
 
 	Action* configureAction = new Action(Icons::self()->configureIcon, tr("Configure"), this);
-	connect(configureAction, SIGNAL(triggered()), SLOT(configure()));
+	connect(configureAction, &Action::triggered, this, &PodcastWidget::configure);
 	menu->addAction(configureAction);
 	menu->addAction(exportAction);
 	init(ReplacePlayQueue | AppendToPlayQueue | Refresh, QList<QWidget*>() << menu /* << unplayedOnlyBtn*/, QList<QWidget*>() << addSub);
diff --git a/online/soundcloudservice.cpp b/online/soundcloudservice.cpp
index c21a0aa06..6e732b51e 100644
--- a/online/soundcloudservice.cpp
+++ b/online/soundcloudservice.cpp
@@ -82,7 +82,7 @@ void SoundCloudService::search(const QString& key, const QString& value)
 	QNetworkRequest req(searchUrl);
 	req.setRawHeader("Accept", "application/json");
 	job = NetworkAccessManager::self()->get(req);
-	connect(job, SIGNAL(finished()), this, SLOT(jobFinished()));
+	connect(job, &NetworkJob::finished, this, &SoundCloudService::jobFinished);
 	emit searching();
 	emit dataChanged(QModelIndex(), QModelIndex());
 }
diff --git a/playlists/dynamicplaylists.cpp b/playlists/dynamicplaylists.cpp
index b85e93b5d..6c6389528 100644
--- a/playlists/dynamicplaylists.cpp
+++ b/playlists/dynamicplaylists.cpp
@@ -128,11 +128,11 @@ const QString constFilename = QLatin1String("FILENAME:");
 DynamicPlaylists::DynamicPlaylists()
 	: RulesPlaylists(fa::fa_solid, fa::fa_random, "dynamic"), localTimer(nullptr), usingRemote(false), remoteTimer(nullptr), remotePollingEnabled(false), statusTime(0), currentCommand(Unknown)
 {
-	connect(this, SIGNAL(clear()), MPDConnection::self(), SLOT(clear()));
-	connect(MPDConnection::self(), SIGNAL(dynamicSupport(bool)), this, SLOT(remoteDynamicSupported(bool)));
-	connect(this, SIGNAL(remoteMessage(QStringList)), MPDConnection::self(), SLOT(sendDynamicMessage(QStringList)));
-	connect(MPDConnection::self(), SIGNAL(dynamicResponse(QStringList)), this, SLOT(remoteResponse(QStringList)));
-	QTimer::singleShot(500, this, SLOT(checkHelper()));
+	connect(this, &DynamicPlaylists::clear, MPDConnection::self(), &MPDConnection::clear);
+	connect(MPDConnection::self(), &MPDConnection::dynamicSupport, this, &DynamicPlaylists::remoteDynamicSupported);
+	connect(this, &DynamicPlaylists::remoteMessage, MPDConnection::self(), &MPDConnection::sendDynamicMessage);
+	connect(MPDConnection::self(), &MPDConnection::dynamicResponse, this, &DynamicPlaylists::remoteResponse);
+	QTimer::singleShot(500, this, &DynamicPlaylists::checkHelper);
 	startAction = ActionCollection::get()->createAction("startdynamic", tr("Start Dynamic Playlist"), Icons::self()->replacePlayQueueIcon);
 	stopAction = ActionCollection::get()->createAction("stopdynamic", tr("Stop Dynamic Mode"), Icons::self()->stopDynamicIcon);
 }
@@ -373,7 +373,7 @@ bool DynamicPlaylists::controlApp(bool isStart)
 
 	if (!localTimer) {
 		localTimer = new QTimer(this);
-		connect(localTimer, SIGNAL(timeout()), SLOT(checkHelper()));
+		connect(localTimer, &QTimer::timeout, this, &DynamicPlaylists::checkHelper);
 	}
 	bool rv = process.waitForFinished(1000);
 	if (isStart && rv) {
@@ -604,7 +604,7 @@ void DynamicPlaylists::pollRemoteHelper()
 {
 	if (!remoteTimer) {
 		remoteTimer = new QTimer(this);
-		connect(remoteTimer, SIGNAL(timeout()), SLOT(checkIfRemoteIsRunning()));
+		connect(remoteTimer, &QTimer::timeout, this, &DynamicPlaylists::checkIfRemoteIsRunning);
 	}
 	beginResetModel();
 	entryList.clear();
@@ -687,7 +687,7 @@ void DynamicPlaylists::remoteResponse(QStringList msg)
 		break;
 	case SetActive:
 		if (!msg.isEmpty() && msg.at(0) == constOk) {
-			QTimer::singleShot(1000, this, SLOT(updateRemoteStatus()));
+			QTimer::singleShot(1000, this, &DynamicPlaylists::updateRemoteStatus);
 		}
 		else {
 			emit error(tr("Failed to set the current dynamic rules. (%1)").arg(remoteError(msg)));
diff --git a/playlists/dynamicplaylistspage.cpp b/playlists/dynamicplaylistspage.cpp
index 57c99ad9d..d7bea24ed 100644
--- a/playlists/dynamicplaylistspage.cpp
+++ b/playlists/dynamicplaylistspage.cpp
@@ -54,19 +54,19 @@ DynamicPlaylistsPage::DynamicPlaylistsPage(QWidget* p)
 	view->addAction(DynamicPlaylists::self()->startAct());
 	view->alwaysShowHeader();
 
-	connect(view, SIGNAL(itemsSelected(bool)), this, SLOT(controlActions()));
-	connect(view, SIGNAL(doubleClicked(const QModelIndex&)), this, SLOT(toggle()));
-	connect(view, SIGNAL(headerClicked(int)), SLOT(headerClicked(int)));
-	connect(MPDConnection::self(), SIGNAL(dynamicSupport(bool)), this, SLOT(remoteDynamicSupport(bool)));
-	connect(addAction, SIGNAL(triggered()), SLOT(add()));
-	connect(editAction, SIGNAL(triggered()), SLOT(edit()));
-	connect(removeAction, SIGNAL(triggered()), SLOT(remove()));
-	connect(DynamicPlaylists::self()->startAct(), SIGNAL(triggered()), SLOT(start()));
-	connect(DynamicPlaylists::self()->stopAct(), SIGNAL(triggered()), SLOT(stop()));
-	connect(toggleAction, SIGNAL(triggered()), SLOT(toggle()));
-	connect(DynamicPlaylists::self(), SIGNAL(running(bool)), SLOT(running(bool)));
-	connect(DynamicPlaylists::self(), SIGNAL(loadingList()), view, SLOT(showSpinner()));
-	connect(DynamicPlaylists::self(), SIGNAL(loadedList()), view, SLOT(hideSpinner()));
+	connect(view, &ItemView::itemsSelected, this, &DynamicPlaylistsPage::controlActions);
+	connect(view, &ItemView::doubleClicked, this, &DynamicPlaylistsPage::toggle);
+	connect(view, &ItemView::headerClicked, this, &DynamicPlaylistsPage::headerClicked);
+	connect(MPDConnection::self(), &MPDConnection::dynamicSupport, this, &DynamicPlaylistsPage::remoteDynamicSupport);
+	connect(addAction, &Action::triggered, this, &DynamicPlaylistsPage::add);
+	connect(editAction, &Action::triggered, this, &DynamicPlaylistsPage::edit);
+	connect(removeAction, &Action::triggered, this, &DynamicPlaylistsPage::remove);
+	connect(DynamicPlaylists::self()->startAct(), &Action::triggered, this, &DynamicPlaylistsPage::start);
+	connect(DynamicPlaylists::self()->stopAct(), &Action::triggered, this, &DynamicPlaylistsPage::stop);
+	connect(toggleAction, &Action::triggered, this, &DynamicPlaylistsPage::toggle);
+	connect(DynamicPlaylists::self(), &DynamicPlaylists::running, this, &DynamicPlaylistsPage::running);
+	connect(DynamicPlaylists::self(), &DynamicPlaylists::loadingList, view, &ItemView::showSpinner);
+	connect(DynamicPlaylists::self(), &DynamicPlaylists::loadedList, view, &ItemView::hideSpinner);
 
 	DynamicPlaylists::self()->stopAct()->setEnabled(false);
 	proxy.setSourceModel(DynamicPlaylists::self());
diff --git a/playlists/playlistruledialog.cpp b/playlists/playlistruledialog.cpp
index 5a366e536..c2f0dcb2c 100644
--- a/playlists/playlistruledialog.cpp
+++ b/playlists/playlistruledialog.cpp
@@ -42,24 +42,24 @@ PlaylistRuleDialog::PlaylistRuleDialog(QWidget* parent, bool isDynamic)
 	enableButton(Ok, false);
 	setCaption(isDynamic ? tr("Dynamic Rule") : tr("Smart Rule"));
 
-	connect(artistText, SIGNAL(textChanged(const QString&)), SLOT(enableOkButton()));
-	connect(composerText, SIGNAL(textChanged(const QString&)), SLOT(enableOkButton()));
-	connect(commentText, SIGNAL(textChanged(const QString&)), SLOT(enableOkButton()));
+	connect(artistText, &CompletionCombo::textChanged, this, &PlaylistRuleDialog::enableOkButton);
+	connect(composerText, &CompletionCombo::textChanged, this, &PlaylistRuleDialog::enableOkButton);
+	connect(commentText, &LineEdit::textChanged, this, &PlaylistRuleDialog::enableOkButton);
 	if (isDynamic) {
-		connect(similarArtistsText, SIGNAL(textChanged(const QString&)), SLOT(enableOkButton()));
+		connect(similarArtistsText, &CompletionCombo::textChanged, this, &PlaylistRuleDialog::enableOkButton);
 	}
 	else {
 		REMOVE(similarArtistsText)
 		REMOVE(similarArtistsTextLabel)
 	}
-	connect(albumArtistText, SIGNAL(textChanged(const QString&)), SLOT(enableOkButton()));
-	connect(albumText, SIGNAL(textChanged(const QString&)), SLOT(enableOkButton()));
-	connect(titleText, SIGNAL(textChanged(const QString&)), SLOT(enableOkButton()));
-	connect(genreText, SIGNAL(textChanged(const QString&)), SLOT(enableOkButton()));
-	connect(filenameText, SIGNAL(textChanged(const QString&)), SLOT(enableOkButton()));
-	connect(dateFromSpin, SIGNAL(valueChanged(int)), SLOT(enableOkButton()));
-	connect(dateToSpin, SIGNAL(valueChanged(int)), SLOT(enableOkButton()));
-	connect(exactCheck, SIGNAL(toggled(bool)), SLOT(enableOkButton()));
+	connect(albumArtistText, &CompletionCombo::textChanged, this, &PlaylistRuleDialog::enableOkButton);
+	connect(albumText, &CompletionCombo::textChanged, this, &PlaylistRuleDialog::enableOkButton);
+	connect(titleText, &LineEdit::textChanged, this, &PlaylistRuleDialog::enableOkButton);
+	connect(genreText, &CompletionCombo::textChanged, this, &PlaylistRuleDialog::enableOkButton);
+	connect(filenameText, &LineEdit::textChanged, this, &PlaylistRuleDialog::enableOkButton);
+	connect(dateFromSpin, &QSpinBox::valueChanged, this, &PlaylistRuleDialog::enableOkButton);
+	connect(dateToSpin, &QSpinBox::valueChanged, this, &PlaylistRuleDialog::enableOkButton);
+	connect(exactCheck, &QCheckBox::toggled, this, &PlaylistRuleDialog::enableOkButton);
 
 	QSet<QString> artists;
 	QSet<QString> albumArtists;
diff --git a/playlists/playlistrulesdialog.cpp b/playlists/playlistrulesdialog.cpp
index 9ccd36b68..2bdc8b1de 100644
--- a/playlists/playlistrulesdialog.cpp
+++ b/playlists/playlistrulesdialog.cpp
@@ -163,16 +163,19 @@ PlaylistRulesDialog::PlaylistRulesDialog(QWidget* parent, RulesPlaylists* m)
 	enableButton(Ok, false);
 	setCaption(rules->isDynamic() ? tr("Dynamic Playlist") : tr("Smart Playlist"));
 	setAttribute(Qt::WA_DeleteOnClose);
-	connect(addBtn, SIGNAL(clicked()), SLOT(add()));
-	connect(editBtn, SIGNAL(clicked()), SLOT(edit()));
-	connect(removeBtn, SIGNAL(clicked()), SLOT(remove()));
-	connect(rulesList, SIGNAL(itemsSelected(bool)), SLOT(controlButtons()));
-	connect(nameText, SIGNAL(textChanged(const QString&)), SLOT(enableOkButton()));
-	connect(aboutLabel, SIGNAL(leftClickedUrl()), this, SLOT(showAbout()));
-	connect(ratingFrom, SIGNAL(valueChanged(int)), SLOT(ratingChanged(int)));
-	connect(ratingTo, SIGNAL(valueChanged(int)), SLOT(ratingChanged(int)));
+	connect(addBtn, &QPushButton::clicked, this, &PlaylistRulesDialog::add);
+	connect(editBtn, &QPushButton::clicked, this, qOverload<>(&PlaylistRulesDialog::edit));
+	connect(removeBtn, &QPushButton::clicked, this, &PlaylistRulesDialog::remove);
+	connect(rulesList, &ListView::itemsSelected, this, &PlaylistRulesDialog::controlButtons);
+	connect(nameText, &LineEdit::textChanged, this, &PlaylistRulesDialog::enableOkButton);
+	connect(aboutLabel, &UrlLabel::leftClickedUrl, this, &PlaylistRulesDialog::showAbout);
+	connect(ratingFrom, &RatingWidget::valueChanged, this, &PlaylistRulesDialog::ratingChanged);
+	connect(ratingTo, &RatingWidget::valueChanged, this, &PlaylistRulesDialog::ratingChanged);
 	if (rules->isDynamic()) {
-		connect(rules, SIGNAL(saved(bool)), SLOT(saved(bool)));
+		DynamicPlaylists* dynamicRules = qobject_cast<DynamicPlaylists*>(rules);
+		if (dynamicRules) {
+			connect(dynamicRules, &DynamicPlaylists::saved, this, &PlaylistRulesDialog::saved);
+		}
 	}
 
 	if (style()->styleHint(QStyle::SH_DialogButtonBox_ButtonsHaveIcons)) {
@@ -217,7 +220,7 @@ PlaylistRulesDialog::PlaylistRulesDialog(QWidget* parent, RulesPlaylists* m)
 		orderAscending->addItem(tr("Ascending"));
 		orderAscending->addItem(tr("Descending"));
 		orderAscending->setEnabled(false);
-		connect(order, SIGNAL(currentIndexChanged(int)), this, SLOT(setOrder()));
+		connect(order, &QComboBox::currentIndexChanged, this, &PlaylistRulesDialog::setOrder);
 	}
 
 	controlButtons();
@@ -304,7 +307,7 @@ void PlaylistRulesDialog::add()
 {
 	if (!dlg) {
 		dlg = new PlaylistRuleDialog(this, rules->isDynamic());
-		connect(dlg, SIGNAL(addRule(const RulesPlaylists::Rule&)), SLOT(addRule(const RulesPlaylists::Rule&)));
+		connect(dlg, &PlaylistRuleDialog::addRule, this, &PlaylistRulesDialog::addRule);
 	}
 	dlg->createNew();
 }
@@ -331,7 +334,7 @@ void PlaylistRulesDialog::edit()
 	}
 	if (!dlg) {
 		dlg = new PlaylistRuleDialog(this, rules->isDynamic());
-		connect(dlg, SIGNAL(addRule(const RulesPlaylists::Rule&)), SLOT(addRule(const RulesPlaylists::Rule&)));
+		connect(dlg, &PlaylistRuleDialog::addRule, this, &PlaylistRulesDialog::addRule);
 	}
 	QModelIndex index = proxy->mapToSource(items.at(0));
 	QStandardItem* item = model->itemFromIndex(index);
diff --git a/playlists/playlistspage.cpp b/playlists/playlistspage.cpp
index a3eeb8ec1..a74ba21c5 100644
--- a/playlists/playlistspage.cpp
+++ b/playlists/playlistspage.cpp
@@ -39,9 +39,9 @@ PlaylistsPage::PlaylistsPage(QWidget* p)
 	dynamic = new DynamicPlaylistsPage(this);
 	addPage(DynamicPlaylists::self()->name(), DynamicPlaylists::self()->icon(), DynamicPlaylists::self()->title(), DynamicPlaylists::self()->descr(), dynamic);
 	smart = new SmartPlaylistsPage(this);
-	connect(smart, SIGNAL(error(QString)), this, SIGNAL(error(QString)));
+	connect(smart, &SmartPlaylistsPage::error, this, &PlaylistsPage::error);
 	addPage(SmartPlaylists::self()->name(), SmartPlaylists::self()->icon(), SmartPlaylists::self()->title(), SmartPlaylists::self()->descr(), smart);
-	connect(stored, SIGNAL(addToDevice(QString, QString, QList<Song>)), SIGNAL(addToDevice(QString, QString, QList<Song>)));
+	connect(stored, &StoredPlaylistsPage::addToDevice, this, &PlaylistsPage::addToDevice);
 	Configuration config(metaObject()->className());
 	load(config);
 }
diff --git a/playlists/smartplaylistspage.cpp b/playlists/smartplaylistspage.cpp
index 5fb75402a..5027ba05a 100644
--- a/playlists/smartplaylistspage.cpp
+++ b/playlists/smartplaylistspage.cpp
@@ -38,9 +38,9 @@
 SmartPlaylistsPage::SmartPlaylistsPage(QWidget* p)
 	: SinglePageWidget(p)
 {
-	addAction = new Action(Icons::self()->addNewItemIcon, tr("Add"), this);
-	editAction = new Action(Icons::self()->editIcon, tr("Edit"), this);
-	removeAction = new Action(Icons::self()->removeIcon, tr("Remove"), this);
+	addAction = new Action(Icons::self()->addNewItemIcon, tr("Add"), this, this, &SmartPlaylistsPage::addNew);
+	editAction = new Action(Icons::self()->editIcon, tr("Edit"), this, this, &SmartPlaylistsPage::edit);
+	removeAction = new Action(Icons::self()->removeIcon, tr("Remove"), this, this, &SmartPlaylistsPage::remove);
 
 	ToolButton* addBtn = new ToolButton(this);
 	ToolButton* editBtn = new ToolButton(this);
@@ -50,15 +50,12 @@ SmartPlaylistsPage::SmartPlaylistsPage(QWidget* p)
 	editBtn->setDefaultAction(editAction);
 	removeBtn->setDefaultAction(removeAction);
 
-	connect(this, SIGNAL(search(QByteArray, QString)), MPDConnection::self(), SLOT(search(QByteArray, QString)));
-	connect(MPDConnection::self(), SIGNAL(searchResponse(QString, QList<Song>)), this, SLOT(searchResponse(QString, QList<Song>)));
-	connect(this, SIGNAL(getRating(QString)), MPDConnection::self(), SLOT(getRating(QString)));
-	connect(MPDConnection::self(), SIGNAL(rating(QString, quint8)), this, SLOT(rating(QString, quint8)));
-	connect(view, SIGNAL(itemsSelected(bool)), this, SLOT(controlActions()));
-	connect(view, SIGNAL(headerClicked(int)), SLOT(headerClicked(int)));
-	connect(addAction, SIGNAL(triggered()), SLOT(addNew()));
-	connect(editAction, SIGNAL(triggered()), SLOT(edit()));
-	connect(removeAction, SIGNAL(triggered()), SLOT(remove()));
+	connect(this, &SmartPlaylistsPage::search, MPDConnection::self(), qOverload<const QByteArray&, const QString&>(&MPDConnection::search));
+	connect(MPDConnection::self(), qOverload<const QString&, const QList<Song>&>(&MPDConnection::searchResponse), this, &SmartPlaylistsPage::searchResponse);
+	connect(this, &SmartPlaylistsPage::getRating, MPDConnection::self(), &MPDConnection::getRating);
+	connect(MPDConnection::self(), &MPDConnection::rating, this, &SmartPlaylistsPage::rating);
+	connect(view, &ItemView::itemsSelected, this, &SmartPlaylistsPage::controlActions);
+	connect(view, &ItemView::headerClicked, this, &SmartPlaylistsPage::headerClicked);
 
 	proxy.setSourceModel(SmartPlaylists::self());
 	view->setModel(&proxy);
diff --git a/playlists/storedplaylistspage.cpp b/playlists/storedplaylistspage.cpp
index c9af0cb8b..3b3ec887a 100644
--- a/playlists/storedplaylistspage.cpp
+++ b/playlists/storedplaylistspage.cpp
@@ -69,27 +69,27 @@ StoredPlaylistsPage::StoredPlaylistsPage(QWidget* p)
 	view->setModel(&proxy);
 	view->setDeleteAction(StdActions::self()->removeAction);
 	view->alwaysShowHeader();
-	connect(view, SIGNAL(doubleClicked(const QModelIndex&)), this, SLOT(itemDoubleClicked(const QModelIndex&)));
-	connect(view, SIGNAL(itemsSelected(bool)), SLOT(controlActions()));
-	connect(view, SIGNAL(headerClicked(int)), SLOT(headerClicked(int)));
-	connect(this, SIGNAL(loadPlaylist(const QString&, bool)), MPDConnection::self(), SLOT(loadPlaylist(const QString&, bool)));
-	connect(this, SIGNAL(removePlaylist(const QString&)), MPDConnection::self(), SLOT(removePlaylist(const QString&)));
-	connect(this, SIGNAL(savePlaylist(const QString&, bool)), MPDConnection::self(), SLOT(savePlaylist(const QString&, bool)));
-	connect(this, SIGNAL(renamePlaylist(const QString&, const QString&)), MPDConnection::self(), SLOT(renamePlaylist(const QString&, const QString&)));
-	connect(this, SIGNAL(removeFromPlaylist(const QString&, const QList<quint32>&)), MPDConnection::self(), SLOT(removeFromPlaylist(const QString&, const QList<quint32>&)));
-	connect(StdActions::self()->savePlayQueueAction, SIGNAL(triggered()), this, SLOT(savePlaylist()));
-	connect(renamePlaylistAction, SIGNAL(triggered()), this, SLOT(renamePlaylist()));
-	connect(removeDuplicatesAction, SIGNAL(triggered()), this, SLOT(removeDuplicates()));
-	connect(removeInvalidAction, SIGNAL(triggered()), this, SLOT(removeInvalid()));
-	connect(PlaylistsModel::self(), SIGNAL(updated(const QModelIndex&)), this, SLOT(updated(const QModelIndex&)));
-	connect(PlaylistsModel::self(), SIGNAL(playlistRemoved(quint32)), view, SLOT(collectionRemoved(quint32)));
+	connect(view, &ItemView::doubleClicked, this, &StoredPlaylistsPage::itemDoubleClicked);
+	connect(view, &ItemView::itemsSelected, this, &StoredPlaylistsPage::controlActions);
+	connect(view, &ItemView::headerClicked, this, &StoredPlaylistsPage::headerClicked);
+	connect(this, &StoredPlaylistsPage::loadPlaylist, MPDConnection::self(), &MPDConnection::loadPlaylist);
+	connect(this, &StoredPlaylistsPage::removePlaylist, MPDConnection::self(), &MPDConnection::removePlaylist);
+	connect(this, qOverload<const QString&, bool>(&StoredPlaylistsPage::savePlaylist), MPDConnection::self(), &MPDConnection::savePlaylist);
+	connect(this, qOverload<const QString&, const QString&>(&StoredPlaylistsPage::renamePlaylist), MPDConnection::self(), &MPDConnection::renamePlaylist);
+	connect(this, &StoredPlaylistsPage::removeFromPlaylist, MPDConnection::self(), &MPDConnection::removeFromPlaylist);
+	connect(StdActions::self()->savePlayQueueAction, &Action::triggered, this, qOverload<>(&StoredPlaylistsPage::savePlaylist));
+	connect(renamePlaylistAction, &Action::triggered, this, qOverload<>(&StoredPlaylistsPage::renamePlaylist));
+	connect(removeDuplicatesAction, &Action::triggered, this, &StoredPlaylistsPage::removeDuplicates);
+	connect(removeInvalidAction, &Action::triggered, this, &StoredPlaylistsPage::removeInvalid);
+	connect(PlaylistsModel::self(), qOverload<const QModelIndex&>(&PlaylistsModel::updated), this, &StoredPlaylistsPage::updated);
+	connect(PlaylistsModel::self(), &PlaylistsModel::playlistRemoved, view, &ItemView::collectionRemoved);
 	intitiallyCollapseAction = new Action(tr("Initially Collapse Albums"), this);
 	intitiallyCollapseAction->setCheckable(true);
 	Configuration config(metaObject()->className());
 	view->setMode(ItemView::Mode_DetailedTree);
 	view->load(config);
 	intitiallyCollapseAction->setChecked(view->isStartClosed());
-	connect(intitiallyCollapseAction, SIGNAL(toggled(bool)), SLOT(setStartClosed(bool)));
+	connect(intitiallyCollapseAction, &Action::toggled, this, &StoredPlaylistsPage::setStartClosed);
 	MenuButton* menu = new MenuButton(this);
 	menu->addAction(createViewMenu(QList<ItemView::Mode>() << ItemView::Mode_BasicTree << ItemView::Mode_SimpleTree
 	                                                       << ItemView::Mode_DetailedTree << ItemView::Mode_List
@@ -106,7 +106,7 @@ StoredPlaylistsPage::StoredPlaylistsPage(QWidget* p)
 	view->addAction(StdActions::self()->removeAction);
 	view->addAction(removeDuplicatesAction);
 	view->addAction(removeInvalidAction);
-	connect(view, SIGNAL(updateToPlayQueue(QModelIndex, bool)), this, SLOT(updateToPlayQueue(QModelIndex, bool)));
+	connect(view, &ItemView::updateToPlayQueue, this, &StoredPlaylistsPage::updateToPlayQueue);
 	view->setInfoText(tr("Either save the play queue, or use the context menu in the library, to create new playlists."));
 }
 
diff --git a/replaygain/albumscanner.cpp b/replaygain/albumscanner.cpp
index 81e0ae3da..dcd3ae103 100644
--- a/replaygain/albumscanner.cpp
+++ b/replaygain/albumscanner.cpp
@@ -49,8 +49,8 @@ void AlbumScanner::start()
 		proc = new QProcess(this);
 		proc->setProcessChannelMode(QProcess::MergedChannels);
 		proc->setReadChannel(QProcess::StandardOutput);
-		connect(proc, SIGNAL(finished(int)), this, SLOT(procFinished()));
-		connect(proc, SIGNAL(readyReadStandardOutput()), this, SLOT(read()));
+		connect(proc, &QProcess::finished, this, &AlbumScanner::procFinished);
+		connect(proc, &QProcess::readyReadStandardOutput, this, &AlbumScanner::read);
 		proc->start(Utils::helper(QLatin1String("cantata-replaygain")), fileNames, QProcess::ReadOnly);
 	}
 }
@@ -58,8 +58,8 @@ void AlbumScanner::start()
 void AlbumScanner::stop()
 {
 	if (proc) {
-		disconnect(proc, SIGNAL(finished(int)), this, SLOT(procFinished()));
-		disconnect(proc, SIGNAL(readyReadStandardOutput()), this, SLOT(read()));
+		disconnect(proc, &QProcess::finished, this, &AlbumScanner::procFinished);
+		disconnect(proc, &QProcess::readyReadStandardOutput, this, &AlbumScanner::read);
 		proc->terminate();
 		proc->deleteLater();
 		proc = 0;
diff --git a/replaygain/jobcontroller.cpp b/replaygain/jobcontroller.cpp
index 93ade4aec..b7e878b4d 100644
--- a/replaygain/jobcontroller.cpp
+++ b/replaygain/jobcontroller.cpp
@@ -47,7 +47,7 @@ void StandardJob::start()
 		thread = new Thread(metaObject()->className());
 		moveToThread(thread);
 		thread->start();
-		connect(this, SIGNAL(exec()), this, SLOT(run()), Qt::QueuedConnection);
+		connect(this, &StandardJob::exec, this, &StandardJob::run, Qt::QueuedConnection);
 		emit exec();
 	}
 }
@@ -92,7 +92,7 @@ void JobController::startJobs()
 	while (active.count() < maxActive && !jobs.isEmpty()) {
 		Job* job = jobs.takeAt(0);
 		active.append(job);
-		connect(job, SIGNAL(done()), this, SLOT(jobDone()), Qt::QueuedConnection);
+		connect(job, &Job::done, this, &JobController::jobDone, Qt::QueuedConnection);
 		job->start();
 	}
 }
@@ -100,7 +100,7 @@ void JobController::startJobs()
 void JobController::cancel()
 {
 	for (Job* j : active) {
-		disconnect(j, SIGNAL(done()), this, SLOT(jobDone()));
+		disconnect(j, &Job::done, this, &JobController::jobDone);
 		j->stop();
 	}
 	active.clear();
diff --git a/replaygain/main.cpp b/replaygain/main.cpp
index 6d25d66b9..6172eddf1 100644
--- a/replaygain/main.cpp
+++ b/replaygain/main.cpp
@@ -41,6 +41,6 @@ int main(int argc, char* argv[])
 
 	QCoreApplication app(argc, argv);
 	ReplayGain* rg = new ReplayGain(fileNames);
-	QTimer::singleShot(0, rg, SLOT(scan()));
+	QTimer::singleShot(0, rg, &ReplayGain::scan);
 	return app.exec();
 }
diff --git a/replaygain/replaygain.cpp b/replaygain/replaygain.cpp
index 7e76e2acf..b7e14057e 100644
--- a/replaygain/replaygain.cpp
+++ b/replaygain/replaygain.cpp
@@ -60,8 +60,8 @@ void ReplayGain::createScanner(int index)
 {
 	TrackScanner* s = new TrackScanner(index);
 	s->setFile(files.at(index));
-	connect(s, SIGNAL(progress(int)), this, SLOT(scannerProgress(int)));
-	connect(s, SIGNAL(done()), this, SLOT(scannerDone()));
+	connect(s, &TrackScanner::progress, this, &ReplayGain::scannerProgress);
+	connect(s, &TrackScanner::done, this, &ReplayGain::scannerDone);
 	scanners.insert(index, s);
 	JobController::self()->add(s);
 }
diff --git a/replaygain/rgdialog.cpp b/replaygain/rgdialog.cpp
index 78a35a04f..792ebf07e 100644
--- a/replaygain/rgdialog.cpp
+++ b/replaygain/rgdialog.cpp
@@ -126,9 +126,9 @@ RgDialog::RgDialog(QWidget* parent)
 	enableButton(Ok, false);
 	enableButton(User1, false);
 	qRegisterMetaType<Tags::ReplayGain>("Tags::ReplayGain");
-	connect(combo, SIGNAL(currentIndexChanged(int)), SLOT(toggleDisplay()));
-	connect(view, SIGNAL(itemSelectionChanged()), SLOT(controlRemoveAct()));
-	connect(removeAct, SIGNAL(triggered()), SLOT(removeItems()));
+	connect(combo, &QComboBox::currentIndexChanged, this, &RgDialog::toggleDisplay);
+	connect(view, &QTreeWidget::itemSelectionChanged, this, &RgDialog::controlRemoveAct);
+	connect(removeAct, &Action::triggered, this, &RgDialog::removeItems);
 
 	italic = font();
 	italic.setItalic(true);
@@ -312,8 +312,8 @@ void RgDialog::createScanner(const QList<int>& indexes)
 	}
 
 	AlbumScanner* s = new AlbumScanner(fileMap);
-	connect(s, SIGNAL(progress(int)), this, SLOT(scannerProgress(int)));
-	connect(s, SIGNAL(done()), this, SLOT(scannerDone()));
+	connect(s, &AlbumScanner::progress, this, &RgDialog::scannerProgress);
+	connect(s, &AlbumScanner::done, this, &RgDialog::scannerDone);
 	scanners[s] = 0;
 	JobController::self()->add(s);
 }
@@ -342,8 +342,8 @@ void RgDialog::startReadingTags()
 	statusLabel->setVisible(true);
 	tagReader = new TagReader();
 	tagReader->setDetails(origSongs, base);
-	connect(tagReader, SIGNAL(progress(int, Tags::ReplayGain)), this, SLOT(songTags(int, Tags::ReplayGain)));
-	connect(tagReader, SIGNAL(done()), this, SLOT(tagReaderDone()));
+	connect(tagReader, &TagReader::progress, this, &RgDialog::songTags);
+	connect(tagReader, &TagReader::done, this, &RgDialog::tagReaderDone);
 	JobController::self()->add(tagReader);
 }
 
@@ -357,8 +357,8 @@ void RgDialog::stopReadingTags()
 	enableButton(User1, true);
 	progress->setVisible(false);
 	statusLabel->setVisible(false);
-	disconnect(tagReader, SIGNAL(progress(int, Tags::ReplayGain)), this, SLOT(songTags(int, Tags::ReplayGain)));
-	disconnect(tagReader, SIGNAL(done()), this, SLOT(tagReaderDone()));
+	disconnect(tagReader, &TagReader::progress, this, &RgDialog::songTags);
+	disconnect(tagReader, &TagReader::done, this, &RgDialog::tagReaderDone);
 	tagReader->requestAbort();
 	tagReader = 0;
 	autoScanTags = false;
diff --git a/scrobbling/scrobbler.cpp b/scrobbling/scrobbler.cpp
index 518e4171f..826e6c853 100644
--- a/scrobbling/scrobbler.cpp
+++ b/scrobbling/scrobbler.cpp
@@ -181,15 +181,15 @@ Scrobbler::Scrobbler()
 	retryTimer = new QTimer(this);
 	retryTimer->setSingleShot(true);
 	retryTimer->setInterval(10000);
-	connect(scrobbleTimer, SIGNAL(timeout()), this, SLOT(scrobbleCurrent()));
-	connect(retryTimer, SIGNAL(timeout()), this, SLOT(scrobbleQueued()));
-	connect(nowPlayingTimer, SIGNAL(timeout()), this, SLOT(scrobbleNowPlaying()));
-	connect(hardFailTimer, SIGNAL(timeout()), this, SLOT(authenticate()));
+	connect(scrobbleTimer, &QTimer::timeout, this, &Scrobbler::scrobbleCurrent);
+	connect(retryTimer, &QTimer::timeout, this, &Scrobbler::scrobbleQueued);
+	connect(nowPlayingTimer, &QTimer::timeout, this, &Scrobbler::scrobbleNowPlaying);
+	connect(hardFailTimer, &QTimer::timeout, this, &Scrobbler::authenticate);
 	loadSettings();
-	connect(this, SIGNAL(clientMessage(QString, QString, QString)), MPDConnection::self(), SLOT(sendClientMessage(QString, QString, QString)));
-	connect(MPDConnection::self(), SIGNAL(clientMessageFailed(QString, QString)), SLOT(clientMessageFailed(QString, QString)));
-	connect(MPDConnection::self(), SIGNAL(statusUpdated(MPDStatusValues)), this, SLOT(mpdStatusUpdated(MPDStatusValues)));
-	connect(MPDConnection::self(), SIGNAL(currentSongUpdated(Song)), this, SLOT(setSong(Song)));
+	connect(this, &Scrobbler::clientMessage, MPDConnection::self(), &MPDConnection::sendClientMessage);
+	connect(MPDConnection::self(), &MPDConnection::clientMessageFailed, this, &Scrobbler::clientMessageFailed);
+	connect(MPDConnection::self(), &MPDConnection::statusUpdated, this, &Scrobbler::mpdStatusUpdated);
+	connect(MPDConnection::self(), &MPDConnection::currentSongUpdated, this, &Scrobbler::setSong);
 }
 
 Scrobbler::~Scrobbler()
@@ -214,10 +214,10 @@ void Scrobbler::setActive()
 	}
 
 	if (isEnabled() || scrobbleViaMpd) {
-		connect(MPDStatus::self(), SIGNAL(updated()), this, SLOT(mpdStateUpdated()));
+		connect(MPDStatus::self(), &MPDStatus::updated, this, &Scrobbler::mpdStateUpdatedSameSong);
 	}
 	else {
-		disconnect(MPDStatus::self(), SIGNAL(updated()), this, SLOT(mpdStateUpdated()));
+		disconnect(MPDStatus::self(), &MPDStatus::updated, this, &Scrobbler::mpdStateUpdatedSameSong);
 	}
 
 	if (isEnabled() && !inactiveSong.isEmpty()) {
@@ -338,7 +338,7 @@ void Scrobbler::love()
 	}
 	else {
 		QNetworkReply* job = NetworkAccessManager::self()->postFormData(QUrl(scrobblerUrl()), format(params));
-		connect(job, SIGNAL(finished()), this, SLOT(handleResp()));
+		connect(job, &QNetworkReply::finished, this, &Scrobbler::handleResp);
 	}
 }
 
@@ -451,7 +451,7 @@ void Scrobbler::scrobbleNowPlaying()
 	}
 	else {
 		QNetworkReply* job = NetworkAccessManager::self()->postFormData(QUrl(scrobblerUrl()), format(params));
-		connect(job, SIGNAL(finished()), this, SLOT(handleResp()));
+		connect(job, &QNetworkReply::finished, this, &Scrobbler::handleResp);
 	}
 }
 
@@ -521,7 +521,7 @@ void Scrobbler::scrobbleQueued()
 		}
 		else {
 			scrobbleJob = NetworkAccessManager::self()->postFormData(scrobblerUrl(), format(params));
-			connect(scrobbleJob, SIGNAL(finished()), this, SLOT(scrobbleFinished()));
+			connect(scrobbleJob, &QNetworkReply::finished, this, &Scrobbler::scrobbleFinished);
 		}
 	}
 }
@@ -636,7 +636,7 @@ void Scrobbler::authenticate()
 	sign(params);
 
 	authJob = NetworkAccessManager::self()->postFormData(url, format(params));
-	connect(authJob, SIGNAL(finished()), this, SLOT(authResp()));
+	connect(authJob, &QNetworkReply::finished, this, &Scrobbler::authResp);
 	DBUG << url.toString();
 }
 
@@ -763,6 +763,12 @@ void Scrobbler::saveCache()
 	}
 }
 
+void Scrobbler::mpdStateUpdatedSameSong()
+{
+	mpdStateUpdated();
+}
+
+
 void Scrobbler::mpdStateUpdated(bool songChanged)
 {
 	if (isEnabled() && !scrobbleViaMpd) {
@@ -839,14 +845,14 @@ void Scrobbler::clientMessageFailed(const QString& client, const QString& msg)
 void Scrobbler::cancelJobs()
 {
 	if (authJob) {
-		disconnect(authJob, SIGNAL(finished()), this, SLOT(authResp()));
+		disconnect(authJob, &QNetworkReply::finished, this, &Scrobbler::authResp);
 		authJob->close();
 		authJob->abort();
 		authJob->deleteLater();
 		authJob = nullptr;
 	}
 	if (scrobbleJob) {
-		disconnect(scrobbleJob, SIGNAL(finished()), this, SLOT(scrobbleFinished()));
+		disconnect(scrobbleJob, &QNetworkReply::finished, this, &Scrobbler::scrobbleFinished);
 		authJob->close();
 		authJob->abort();
 		authJob->deleteLater();
diff --git a/scrobbling/scrobbler.h b/scrobbling/scrobbler.h
index 2b05c0687..f1e42b1a7 100644
--- a/scrobbling/scrobbler.h
+++ b/scrobbling/scrobbler.h
@@ -118,6 +118,7 @@ private Q_SLOTS:
 	void authenticate();
 	void authResp();
 	void scrobbleFinished();
+	void mpdStateUpdatedSameSong();
 	void mpdStateUpdated(bool songChanged = false);
 	void mpdStatusUpdated(const MPDStatusValues& vals);
 	void clientMessageFailed(const QString& client, const QString& msg);
diff --git a/scrobbling/scrobblinglove.cpp b/scrobbling/scrobblinglove.cpp
index 65d7e47a6..3a7f395fd 100644
--- a/scrobbling/scrobblinglove.cpp
+++ b/scrobbling/scrobblinglove.cpp
@@ -31,11 +31,11 @@ ScrobblingLove::ScrobblingLove(QWidget* p)
 	love = Icon::fa(fa::fa_regular, fa::fa_heart);
 	loved = Icon::fa(fa::fa_solid, fa::fa_heart);
 	setIcon(love);
-	connect(Scrobbler::self(), SIGNAL(loveEnabled(bool)), SLOT(setVisible(bool)));
-	connect(Scrobbler::self(), SIGNAL(songChanged(bool)), SLOT(songChanged(bool)));
-	connect(Scrobbler::self(), SIGNAL(scrobblerChanged()), SLOT(scrobblerChanged()));
+	connect(Scrobbler::self(), &Scrobbler::loveEnabled, this, &ScrobblingLove::setVisible);
+	connect(Scrobbler::self(), &Scrobbler::songChanged, this, &ScrobblingLove::songChanged);
+	connect(Scrobbler::self(), &Scrobbler::scrobblerChanged, this, &ScrobblingLove::scrobblerChanged);
 	setVisible(Scrobbler::self()->isLoveEnabled());
-	connect(this, SIGNAL(clicked()), this, SLOT(sendLove()));
+	connect(this, &ScrobblingLove::clicked, this, &ScrobblingLove::sendLove);
 	songChanged(false);
 }
 
diff --git a/scrobbling/scrobblingsettings.cpp b/scrobbling/scrobblingsettings.cpp
index 34948fa70..208590125 100644
--- a/scrobbling/scrobblingsettings.cpp
+++ b/scrobbling/scrobblingsettings.cpp
@@ -37,15 +37,15 @@ ScrobblingSettings::ScrobblingSettings(QWidget* parent)
 {
 	setupUi(this);
 
-	connect(loginButton, SIGNAL(clicked()), this, SLOT(save()));
-	connect(Scrobbler::self(), SIGNAL(authenticated(bool)), SLOT(showStatus(bool)));
-	connect(Scrobbler::self(), SIGNAL(error(QString)), SLOT(showError(QString)));
-	connect(user, SIGNAL(textChanged(QString)), SLOT(controlLoginButton()));
-	connect(pass, SIGNAL(textChanged(QString)), SLOT(controlLoginButton()));
-	//    connect(enableScrobbling, SIGNAL(toggled(bool)), Scrobbler::self(), SLOT(setEnabled(bool)));
-	//    connect(showLove, SIGNAL(toggled(bool)), Scrobbler::self(), SLOT(setLoveEnabled(bool)));
-	connect(Scrobbler::self(), SIGNAL(enabled(bool)), enableScrobbling, SLOT(setChecked(bool)));
-	connect(scrobbler, SIGNAL(currentIndexChanged(int)), this, SLOT(scrobblerChanged()));
+	connect(loginButton, &QPushButton::clicked, this, &ScrobblingSettings::save);
+	connect(Scrobbler::self(), &Scrobbler::authenticated, this, &ScrobblingSettings::showStatus);
+	connect(Scrobbler::self(), &Scrobbler::error, this, &ScrobblingSettings::showError);
+	connect(user, &LineEdit::textChanged, this, &ScrobblingSettings::controlLoginButton);
+	connect(pass, &LineEdit::textChanged, this, &ScrobblingSettings::controlLoginButton);
+	//    connect(enableScrobbling, &MpdSocket::toggled, Scrobbler::self(), &Scrobbler::setEnabled);
+	//    connect(showLove, &MpdSocket::toggled, Scrobbler::self(), &Scrobbler::setLoveEnabled);
+	connect(Scrobbler::self(), &Scrobbler::enabled, enableScrobbling, &QCheckBox::setChecked);
+	connect(scrobbler, &QComboBox::currentIndexChanged, this, &ScrobblingSettings::scrobblerChanged);
 	loginButton->setEnabled(false);
 
 	QMap<QString, QString> scrobblers = Scrobbler::self()->availableScrobblers();
diff --git a/streams/streamdialog.cpp b/streams/streamdialog.cpp
index d180f27b6..d1f262c27 100644
--- a/streams/streamdialog.cpp
+++ b/streams/streamdialog.cpp
@@ -60,7 +60,7 @@ StreamDialog::StreamDialog(QWidget* parent, bool addToPlayQueue)
 	if (addToPlayQueue) {
 		saveCheckbox->setChecked(false);
 		layout->setWidget(row++, QFormLayout::FieldRole, saveCheckbox);
-		connect(saveCheckbox, SIGNAL(toggled(bool)), SLOT(changed()));
+		connect(saveCheckbox, &QCheckBox::toggled, this, &StreamDialog::changed);
 	}
 	layout->setFieldGrowthPolicy(QFormLayout::ExpandingFieldsGrow);
 
@@ -69,8 +69,8 @@ StreamDialog::StreamDialog(QWidget* parent, bool addToPlayQueue)
 	setMainWidget(wid);
 	setButtons(Ok | Cancel);
 	enableButton(Ok, false);
-	connect(nameEntry, SIGNAL(textChanged(const QString&)), SLOT(changed()));
-	connect(urlEntry, SIGNAL(textChanged(const QString&)), SLOT(changed()));
+	connect(nameEntry, &LineEdit::textChanged, this, &StreamDialog::changed);
+	connect(urlEntry, &LineEdit::textChanged, this, &StreamDialog::changed);
 	urlEntry->setFocus();
 	resize(400, 100);
 }
diff --git a/streams/streamfetcher.cpp b/streams/streamfetcher.cpp
index 312991747..bcbcb1780 100644
--- a/streams/streamfetcher.cpp
+++ b/streams/streamfetcher.cpp
@@ -261,8 +261,8 @@ void StreamFetcher::doNext()
 
 			job = NetworkAccessManager::self()->get(u, constTimeout);
 			DBUG << "Check" << u.toString() << static_cast<void*>(job);
-			connect(job, SIGNAL(readyRead()), this, SLOT(dataReady()));
-			connect(job, SIGNAL(finished()), this, SLOT(jobFinished()));
+			connect(job, &NetworkJob::readyRead, this, &StreamFetcher::dataReady);
+			connect(job, &NetworkJob::finished, this, qOverload<>(&StreamFetcher::jobFinished));
 			return;
 		}
 		else {
@@ -321,8 +321,8 @@ void StreamFetcher::jobFinished(NetworkJob* reply)
 	// We only handle 1 job at a time!
 	DBUG << static_cast<void*>(reply);
 	if (reply == job) {
-		disconnect(job, SIGNAL(readyRead()), this, SLOT(dataReady()));
-		disconnect(job, SIGNAL(finished()), this, SLOT(jobFinished()));
+		disconnect(job, &NetworkJob::readyRead, this, &StreamFetcher::dataReady);
+		disconnect(job, &NetworkJob::finished, this, qOverload<>(&StreamFetcher::jobFinished));
 		bool redirected = false;
 		if (!reply->error()) {
 			QString u = parse(data, reply->origUrl().host());
@@ -339,8 +339,8 @@ void StreamFetcher::jobFinished(NetworkJob* reply)
 					orig.setQuery(query);
 					job = NetworkAccessManager::self()->get(orig, constTimeout);
 					DBUG << "Check plain" << orig.toString() << static_cast<void*>(job);
-					connect(job, SIGNAL(readyRead()), this, SLOT(dataReady()));
-					connect(job, SIGNAL(finished()), this, SLOT(jobFinished()));
+					connect(job, &NetworkJob::readyRead, this, &StreamFetcher::dataReady);
+					connect(job, &NetworkJob::finished, this, qOverload<>(&StreamFetcher::jobFinished));
 					redirected = true;
 					data.clear();
 				}
@@ -356,8 +356,8 @@ void StreamFetcher::jobFinished(NetworkJob* reply)
 				data.clear();
 				cancelJob();
 				job = NetworkAccessManager::self()->get(u, constTimeout);
-				connect(job, SIGNAL(readyRead()), this, SLOT(dataReady()));
-				connect(job, SIGNAL(finished()), this, SLOT(jobFinished()));
+				connect(job, &NetworkJob::readyRead, this, &StreamFetcher::dataReady);
+				connect(job, &NetworkJob::finished, this, qOverload<>(&StreamFetcher::jobFinished));
 				redirected = true;
 			}
 			else {
@@ -380,8 +380,8 @@ void StreamFetcher::jobFinished(NetworkJob* reply)
 void StreamFetcher::cancelJob()
 {
 	if (job) {
-		disconnect(job, SIGNAL(readyRead()), this, SLOT(dataReady()));
-		disconnect(job, SIGNAL(finished()), this, SLOT(jobFinished()));
+		disconnect(job, &NetworkJob::readyRead, this, &StreamFetcher::dataReady);
+		disconnect(job, &NetworkJob::finished, this, qOverload<>(&StreamFetcher::jobFinished));
 		job->cancelAndDelete();
 		job = nullptr;
 	}
diff --git a/streams/streamspage.cpp b/streams/streamspage.cpp
index 04010b3ee..26d0ec259 100644
--- a/streams/streamspage.cpp
+++ b/streams/streamspage.cpp
@@ -53,18 +53,18 @@ StreamsPage::StreamsPage(QWidget* p)
 
 	browse = new StreamsBrowsePage(this);
 	addWidget(browse);
-	connect(browse, SIGNAL(close()), this, SIGNAL(close()));
-	connect(browse, SIGNAL(searchForStreams()), this, SLOT(searchForStreams()));
+	connect(browse, &StreamsBrowsePage::close, this, &StreamsPage::close);
+	connect(browse, &StreamsBrowsePage::searchForStreams, this, &StreamsPage::searchForStreams);
 	search = new StreamSearchPage(this);
 	addWidget(search);
-	connect(search, SIGNAL(close()), this, SLOT(closeSearch()));
+	connect(search, &StreamSearchPage::close, this, &StreamsPage::closeSearch);
 
-	disconnect(browse, SIGNAL(add(const QStringList&, int, quint8, bool)), MPDConnection::self(), SLOT(add(const QStringList&, int, quint8, bool)));
-	disconnect(search, SIGNAL(add(const QStringList&, int, quint8, bool)), MPDConnection::self(), SLOT(add(const QStringList&, int, quint8, bool)));
-	connect(browse, SIGNAL(add(const QStringList&, int, quint8, bool)), PlayQueueModel::self(), SLOT(addItems(const QStringList&, int, quint8, bool)));
-	connect(search, SIGNAL(add(const QStringList&, int, quint8, bool)), PlayQueueModel::self(), SLOT(addItems(const QStringList&, int, quint8, bool)));
+	disconnect(browse, &StreamsBrowsePage::add, MPDConnection::self(), qOverload<const QStringList&, int, quint8, bool>(&MPDConnection::add));
+	disconnect(search, &StreamSearchPage::add, MPDConnection::self(), qOverload<const QStringList&, int, quint8, bool>(&MPDConnection::add));
+	connect(browse, &StreamsBrowsePage::add, PlayQueueModel::self(), qOverload<const QStringList&, int, quint8, bool>(&PlayQueueModel::addItems));
+	connect(search, &StreamSearchPage::add, PlayQueueModel::self(), qOverload<const QStringList&, int, quint8, bool>(&PlayQueueModel::addItems));
 	connect(StreamsModel::self()->addToFavouritesAct(), &QAction::triggered, this, &StreamsPage::addToFavourites);
-	connect(search, SIGNAL(addToFavourites(QList<StreamItem>)), browse, SLOT(addToFavourites(QList<StreamItem>)));
+	connect(search, qOverload<const QList<StreamItem>&>(&StreamSearchPage::addToFavourites), browse, qOverload<const QList<StreamItem>&>(&StreamsBrowsePage::addToFavourites));
 }
 
 StreamsPage::~StreamsPage()
@@ -100,23 +100,23 @@ StreamsBrowsePage::StreamsBrowsePage(QWidget* p)
 	addAction = ActionCollection::get()->createAction("addstream", tr("Add New Stream To Favorites"));
 	editAction = new Action(Icons::self()->editIcon, tr("Edit"), this);
 	searchAction = new Action(Icons::self()->searchIcon, tr("Seatch For Streams"), this);
-	connect(searchAction, SIGNAL(triggered()), this, SIGNAL(searchForStreams()));
-	//     connect(view, SIGNAL(itemsSelected(bool)), addToPlaylist, SLOT(setEnabled(bool)));
-	connect(view, SIGNAL(doubleClicked(const QModelIndex&)), this, SLOT(itemDoubleClicked(const QModelIndex&)));
-	connect(view, SIGNAL(itemsSelected(bool)), SLOT(controlActions()));
-	connect(addAction, SIGNAL(triggered()), this, SLOT(addStream()));
-	connect(StreamsModel::self()->addBookmarkAct(), SIGNAL(triggered()), this, SLOT(addBookmark()));
-	connect(StreamsModel::self()->reloadAct(), SIGNAL(triggered()), this, SLOT(reload()));
-	connect(editAction, SIGNAL(triggered()), this, SLOT(edit()));
-	connect(importAction, SIGNAL(triggered()), this, SLOT(importXml()));
-	connect(exportAction, SIGNAL(triggered()), this, SLOT(exportXml()));
-	connect(StreamsModel::self(), SIGNAL(error(const QString&)), this, SIGNAL(error(const QString&)));
-	connect(StreamsModel::self(), SIGNAL(loading()), view, SLOT(showSpinner()));
-	connect(StreamsModel::self(), SIGNAL(loaded()), view, SLOT(hideSpinner()));
-	connect(StreamsModel::self(), SIGNAL(categoriesChanged()), view, SLOT(closeSearch()));
-	connect(StreamsModel::self(), SIGNAL(favouritesLoaded()), SLOT(expandFavourites()));
-	connect(StreamsModel::self(), SIGNAL(addedToFavourites(QString)), SLOT(addedToFavourites(QString)));
-	connect(view, SIGNAL(headerClicked(int)), SLOT(headerClicked(int)));
+	connect(searchAction, &Action::triggered, this, &StreamsBrowsePage::searchForStreams);
+	//     connect(view, &ItemView::itemsSelected, addToPlaylist, &Action::setEnabled);
+	connect(view, &ItemView::doubleClicked, this, &StreamsBrowsePage::itemDoubleClicked);
+	connect(view, &ItemView::itemsSelected, this, &StreamsBrowsePage::controlActions);
+	connect(addAction, &Action::triggered, this, &StreamsBrowsePage::addStream);
+	connect(StreamsModel::self()->addBookmarkAct(), &Action::triggered, this, &StreamsBrowsePage::addBookmark);
+	connect(StreamsModel::self()->reloadAct(), &Action::triggered, this, &StreamsBrowsePage::reload);
+	connect(editAction, &Action::triggered, this, &StreamsBrowsePage::edit);
+	connect(importAction, &Action::triggered, this, &StreamsBrowsePage::importXml);
+	connect(exportAction, &Action::triggered, this, &StreamsBrowsePage::exportXml);
+	connect(StreamsModel::self(), &StreamsModel::error, this, &StreamsBrowsePage::error);
+	connect(StreamsModel::self(), &StreamsModel::loading, view, &ItemView::showSpinner);
+	connect(StreamsModel::self(), &StreamsModel::loaded, view, &ItemView::hideSpinner);
+	connect(StreamsModel::self(), &StreamsModel::categoriesChanged, view, &ItemView::closeSearch);
+	connect(StreamsModel::self(), &StreamsModel::favouritesLoaded, this, &StreamsBrowsePage::expandFavourites);
+	connect(StreamsModel::self(), &StreamsModel::addedToFavourites, this, &StreamsBrowsePage::addedToFavourites);
+	connect(view, &ItemView::headerClicked, this, &StreamsBrowsePage::headerClicked);
 
 	proxy.setSourceModel(StreamsModel::self());
 	view->setModel(&proxy);
@@ -154,7 +154,7 @@ StreamsBrowsePage::StreamsBrowsePage(QWidget* p)
 StreamsBrowsePage::~StreamsBrowsePage()
 {
 	for (NetworkJob* job : resolveJobs) {
-		disconnect(job, SIGNAL(finished()), this, SLOT(tuneInResolved()));
+		disconnect(job, &NetworkJob::finished, this, &StreamsBrowsePage::tuneInResolved);
 		job->deleteLater();
 	}
 	resolveJobs.clear();
@@ -308,7 +308,7 @@ void StreamsBrowsePage::addToFavourites(const QList<StreamItem>& items)
 		if (urlStr.startsWith(QLatin1String("http://opml.radiotime.com/Tune.ashx"))) {
 			NetworkJob* job = NetworkAccessManager::self()->get(urlStr, 5000);
 			job->setProperty(constNameProperty, item.modifiedName);
-			connect(job, SIGNAL(finished()), this, SLOT(tuneInResolved()));
+			connect(job, &NetworkJob::finished, this, &StreamsBrowsePage::tuneInResolved);
 			resolveJobs.insert(job);
 			added++;
 		}
@@ -536,7 +536,7 @@ StreamSearchPage::StreamSearchPage(QWidget* p)
 	view->setModel(&proxy);
 	view->alwaysShowHeader();
 	view->setPermanentSearch();
-	connect(view, SIGNAL(headerClicked(int)), SLOT(headerClicked(int)));
+	connect(view, &ItemView::headerClicked, this, &StreamSearchPage::headerClicked);
 	view->setMode(ItemView::Mode_DetailedTree);
 	init(ReplacePlayQueue);
 	connect(StreamsModel::self(), &StreamsModel::addedToFavourites, this, &StreamSearchPage::addedToFavourites);
diff --git a/support/QtAwesomeAnim.cpp b/support/QtAwesomeAnim.cpp
index 89ed5d8e2..fd6092798 100644
--- a/support/QtAwesomeAnim.cpp
+++ b/support/QtAwesomeAnim.cpp
@@ -18,7 +18,7 @@ void QtAwesomeAnimation::setup(QPainter& painter, const QRect& rect)
 	// first time set the timer
 	if (!timer_) {
 		timer_ = new QTimer();
-		connect(timer_, SIGNAL(timeout()), this, SLOT(update()));
+		connect(timer_, &QTimer::timeout, this, &QtAwesomeAnimation::update);
 		timer_->start(interval_);
 	}
 	else {
diff --git a/support/acceleratormanager.cpp b/support/acceleratormanager.cpp
index 308feb875..2d400143a 100644
--- a/support/acceleratormanager.cpp
+++ b/support/acceleratormanager.cpp
@@ -738,7 +738,7 @@ PopupAccelManager::PopupAccelManager(QMenu* popup)
 	: QObject(popup), m_popup(popup), m_count(-1)
 {
 	aboutToShow();// do one check and then connect to show
-	connect(popup, SIGNAL(aboutToShow()), SLOT(aboutToShow()));
+	connect(popup, &QMenu::aboutToShow, this, &PopupAccelManager::aboutToShow);
 }
 
 void PopupAccelManager::aboutToShow()
@@ -829,7 +829,7 @@ QWidgetStackAccelManager::QWidgetStackAccelManager(QStackedWidget* stack)
 	: QObject(stack), m_stack(stack)
 {
 	currentChanged(stack->currentIndex());// do one check and then connect to show
-	connect(stack, SIGNAL(currentChanged(int)), SLOT(currentChanged(int)));
+	connect(stack, &QStackedWidget::currentChanged, this, &QWidgetStackAccelManager::currentChanged);
 }
 
 bool QWidgetStackAccelManager::eventFilter(QObject* watched, QEvent* e)
diff --git a/support/action.cpp b/support/action.cpp
index ea7d08d0e..a08f959b6 100644
--- a/support/action.cpp
+++ b/support/action.cpp
@@ -33,27 +33,6 @@ Action::Action(QObject* parent)
 	init();
 }
 
-Action::Action(const QString& text, QObject* parent, const QObject* receiver, const char* slot, const QKeySequence& shortcut)
-	: QAction(parent)
-{
-	init();
-	setText(text);
-	setShortcut(shortcut);
-	if (receiver && slot)
-		connect(this, SIGNAL(triggered()), receiver, slot);
-}
-
-Action::Action(const QIcon& icon, const QString& text, QObject* parent, const QObject* receiver, const char* slot, const QKeySequence& shortcut)
-	: QAction(parent)
-{
-	init();
-	setIcon(icon);
-	setText(text);
-	setShortcut(shortcut);
-	if (receiver && slot)
-		connect(this, SIGNAL(triggered()), receiver, slot);
-}
-
 void Action::initIcon(QAction* act)
 {
 	if (GtkStyle::isActive() && act) {
@@ -99,7 +78,7 @@ QString Action::settingsText(QAction* act)
 
 void Action::init()
 {
-	connect(this, SIGNAL(triggered(bool)), this, SLOT(slotTriggered()));
+	connect(this, &QAction::triggered, this, &Action::slotTriggered);
 
 	setProperty("isShortcutConfigurable", true);
 }
@@ -129,6 +108,11 @@ void Action::setSettingsText(Action* parent)
 	setSettingsText(Utils::strippedText(parent->text()) + QLatin1String(" / ") + Utils::strippedText(text()));
 }
 
+void Action::emitTriggered()
+{
+	emit QAction::triggered();
+}
+
 QKeySequence Action::shortcut(ShortcutTypes type) const
 {
 	Q_ASSERT(type);
diff --git a/support/action.h b/support/action.h
index 5f2194c3e..cf7a8f779 100644
--- a/support/action.h
+++ b/support/action.h
@@ -49,8 +49,29 @@ class Action : public QAction {
 	static QString settingsText(QAction* act);
 
 	explicit Action(QObject* parent);
-	Action(const QString& text, QObject* parent, const QObject* receiver = nullptr, const char* slot = nullptr, const QKeySequence& shortcut = 0);
-	Action(const QIcon& icon, const QString& text, QObject* parent, const QObject* receiver = nullptr, const char* slot = nullptr, const QKeySequence& shortcut = 0);
+
+	template <typename Receiver = QObject>
+	Action(const QString& text, QObject* parent, const Receiver* receiver = nullptr, void (Receiver::*slot)() = nullptr, const QKeySequence& shortcut = 0)
+		: QAction(parent)
+	{
+		init();
+		setText(text);
+		setShortcut(shortcut);
+		if (receiver && slot)
+			connect(this, &Action::triggered, receiver, slot);
+	}
+
+	template <typename Receiver = QObject>
+	Action(const QIcon& icon, const QString& text, QObject* parent, const Receiver* receiver = nullptr, void (Receiver::*slot)() = nullptr, const QKeySequence& shortcut = 0)
+		: QAction(parent)
+	{
+		init();
+		setIcon(icon);
+		setText(text);
+		setShortcut(shortcut);
+		if (receiver && slot)
+			connect(this, &Action::triggered, receiver, slot);
+	}
 
 	QKeySequence shortcut(ShortcutTypes types = ActiveShortcut) const;
 	void setShortcut(const QShortcut& shortcut, ShortcutTypes type = ShortcutTypes(ActiveShortcut | DefaultShortcut));
@@ -62,6 +83,9 @@ class Action : public QAction {
 	void setSettingsText(const QString& text);
 	void setSettingsText(Action* parent);
 
+public slots:
+	void emitTriggered();
+
 signals:
 	void triggered(Qt::MouseButtons buttons, Qt::KeyboardModifiers modifiers);
 
diff --git a/support/actioncollection.cpp b/support/actioncollection.cpp
index 100733e07..4c929d3f3 100644
--- a/support/actioncollection.cpp
+++ b/support/actioncollection.cpp
@@ -50,7 +50,7 @@ ActionCollection* ActionCollection::get()
 
 Action* ActionCollection::createAction(const QString& name, const QString& text, const char* icon, const QString& whatsThis)
 {
-	Action* act = static_cast<Action*>(addAction(name));
+	Action* act = addAction(name);
 	act->setText(text);
 	if (nullptr != icon) {
 		act->setIcon(Icon::get(icon));
@@ -121,14 +121,6 @@ Action* ActionCollection::addAction(const QString& name, Action* action)
 	return action;
 }
 
-Action* ActionCollection::addAction(const QString& name, const QObject* receiver, const char* member)
-{
-	Action* a = new Action(this);
-	if (receiver && member)
-		connect(a, SIGNAL(triggered(bool)), receiver, member);
-	return addAction(name, a);
-}
-
 QAction* ActionCollection::addAction(const QString& name, QAction* action)
 {
 	if (!action)
@@ -166,11 +158,11 @@ QAction* ActionCollection::addAction(const QString& name, QAction* action)
 		widget->addAction(action);
 	}
 
-	connect(action, SIGNAL(destroyed(QObject*)), SLOT(actionDestroyed(QObject*)));
+	connect(action, &QAction::destroyed, this, &ActionCollection::actionDestroyed);
 	if (_connectHovered)
-		connect(action, SIGNAL(hovered()), SLOT(slotActionHovered()));
+		connect(action, &QAction::hovered, this, &ActionCollection::slotActionHovered);
 	if (_connectTriggered)
-		connect(action, SIGNAL(triggered(bool)), SLOT(slotActionTriggered()));
+		connect(action, &QAction::triggered, this, &ActionCollection::slotActionTriggered);
 
 	emit inserted(action);
 	return action;
@@ -263,18 +255,18 @@ void ActionCollection::connectNotify(const QMetaMethod& signal)
 	if (_connectHovered && _connectTriggered)
 		return;
 
-	if (QMetaObject::normalizedSignature(SIGNAL(actionHovered(QAction*))) == signal.methodSignature()) {
+	if (QMetaMethod::fromSignal(&ActionCollection::actionHovered) == signal) {
 		if (!_connectHovered) {
 			_connectHovered = true;
 			for (QAction* action : actions())
-				connect(action, SIGNAL(hovered()), SLOT(slotActionHovered()));
+				connect(action, &QAction::hovered, this, &ActionCollection::slotActionHovered);
 		}
 	}
-	else if (QMetaObject::normalizedSignature(SIGNAL(actionTriggered(QAction*))) == signal.methodSignature()) {
+	else if (QMetaMethod::fromSignal(&ActionCollection::actionTriggered) == signal) {
 		if (!_connectTriggered) {
 			_connectTriggered = true;
 			for (QAction* action : actions())
-				connect(action, SIGNAL(triggered(bool)), SLOT(slotActionTriggered()));
+				connect(action, &QAction::triggered, this, &ActionCollection::slotActionTriggered);
 		}
 	}
 
@@ -294,7 +286,7 @@ void ActionCollection::addAssociatedWidget(QWidget* widget)
 	if (!_associatedWidgets.contains(widget)) {
 		widget->addActions(actions());
 		_associatedWidgets.append(widget);
-		connect(widget, SIGNAL(destroyed(QObject*)), SLOT(associatedWidgetDestroyed(QObject*)));
+		connect(widget, &QWidget::destroyed, this, &ActionCollection::associatedWidgetDestroyed);
 	}
 }
 
@@ -303,7 +295,7 @@ void ActionCollection::removeAssociatedWidget(QWidget* widget)
 	for (QAction* action : actions())
 		widget->removeAction(action);
 	_associatedWidgets.removeAll(widget);
-	disconnect(widget, SIGNAL(destroyed(QObject*)), this, SLOT(associatedWidgetDestroyed(QObject*)));
+	disconnect(widget, &QWidget::destroyed, this, &ActionCollection::associatedWidgetDestroyed);
 }
 
 QList<QWidget*> ActionCollection::associatedWidgets() const
diff --git a/support/actioncollection.h b/support/actioncollection.h
index a332d0720..593da81af 100644
--- a/support/actioncollection.h
+++ b/support/actioncollection.h
@@ -28,8 +28,8 @@
 #include <QObject>
 #include <QString>
 
-class Action;
-class QAction;
+#include "action.h"
+
 class QWidget;
 class QIcon;
 
@@ -75,17 +75,26 @@ class ActionCollection : public QObject {
 
 	QAction* addAction(const QString& name, QAction* action);
 	Action* addAction(const QString& name, Action* action);
-	Action* addAction(const QString& name, const QObject* receiver = nullptr, const char* member = nullptr);
+
+	template <typename Receiver = QObject>
+	Action* addAction(const QString& name, const Receiver* receiver = nullptr, void (Receiver::*slot)() = nullptr)
+	{
+		Action* a = new Action(this);
+		if (receiver && slot)
+			connect(a, &Action::triggered, receiver, slot);
+		return addAction(name, a);
+	}
+
 	void removeAction(QAction* action);
 	QAction* takeAction(QAction* action);
 
 	/// Create new action under the given name, add it to the collection and connect its triggered(bool) signal to the specified receiver.
-	template<class ActionType>
-	ActionType* add(const QString& name, const QObject* receiver = nullptr, const char* member = nullptr)
+	template<class ActionType, typename Receiver = QObject>
+	ActionType* add(const QString& name, const Receiver* receiver = nullptr, void (Receiver::*slot)() = nullptr)
 	{
 		ActionType* a = new ActionType(this);
-		if (receiver && member)
-			connect(a, SIGNAL(triggered(bool)), receiver, member);
+		if (receiver && slot)
+			connect(a, &ActionType::triggered, receiver, slot);
 		addAction(name, a);
 		return a;
 	}
diff --git a/support/combobox.cpp b/support/combobox.cpp
index 2778a33de..6abb46fd9 100644
--- a/support/combobox.cpp
+++ b/support/combobox.cpp
@@ -45,7 +45,7 @@ ComboBox::ComboBox(QWidget* p)
 		}
 	}
 #endif
-	connect(this, SIGNAL(editTextChanged(QString)), this, SIGNAL(textChanged(QString)));
+	connect(this, &ComboBox::editTextChanged, this, &ComboBox::textChanged);
 }
 
 void ComboBox::setEditable(bool editable)
diff --git a/support/configdialog.cpp b/support/configdialog.cpp
index 97058f0d8..f59312a6e 100644
--- a/support/configdialog.cpp
+++ b/support/configdialog.cpp
@@ -162,7 +162,7 @@ ConfigDialog::ConfigDialog(QWidget* parent, const QString& name, const QSize& de
 	else {
 		buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel | QDialogButtonBox::Apply, Qt::Horizontal, mw);
 		lay->addWidget(buttonBox);
-		connect(buttonBox, SIGNAL(clicked(QAbstractButton*)), this, SLOT(macButtonPressed(QAbstractButton*)));
+		connect(buttonBox, &MpdSocket::clicked, this, &ConfigDialog::macButtonPressed);
 		buttonBox->setStyle(Dialog::buttonProxyStyle());
 		// Hide window buttons if not instany apply - dont want user just closing dialog
 		setWindowFlags(Qt::Window | Qt::WindowTitleHint | Qt::CustomizeWindowHint | Qt::WindowMaximizeButtonHint);
@@ -214,7 +214,7 @@ void ConfigDialog::addPage(const QString& id, QWidget* widget, const QString& na
 	stack->addWidget(widget);
 	group->addButton(newPage.item);
 	pages.insert(id, newPage);
-	connect(newPage.item, SIGNAL(toggled(bool)), this, SLOT(activatePage()));
+	connect(newPage.item, &MpdSocket::toggled, this, &ConfigDialog::activatePage);
 	int sz = 0;
 	QMap<QString, Page>::const_iterator it = pages.begin();
 	QMap<QString, Page>::const_iterator end = pages.end();
@@ -413,7 +413,7 @@ static QWidget* firstFocusableWidget(QWidget* w)
 void ConfigDialog::showEvent(QShowEvent* e)
 {
 	if (!shown) {
-		QTimer::singleShot(0, this, SLOT(setFocus()));
+		QTimer::singleShot(0, this, &ConfigDialog::setFocus);
 		shown = true;
 		ensurePolished();
 
diff --git a/support/dialog.cpp b/support/dialog.cpp
index 33c2118ea..c81aa4eb2 100644
--- a/support/dialog.cpp
+++ b/support/dialog.cpp
@@ -396,7 +396,7 @@ void Dialog::create()
 	QBoxLayout* layout = new QBoxLayout(QBoxLayout::TopToBottom, this);
 	layout->addWidget(mw);
 	layout->addWidget(buttonBox);
-	connect(buttonBox, SIGNAL(clicked(QAbstractButton*)), this, SLOT(buttonPressed(QAbstractButton*)));
+	connect(buttonBox, &QDialogButtonBox::clicked, this, &Dialog::buttonPressed);
 }
 
 QAbstractButton* Dialog::getButton(ButtonCode button)
diff --git a/support/fancytabwidget.cpp b/support/fancytabwidget.cpp
index bf79d3ae9..b68a53822 100644
--- a/support/fancytabwidget.cpp
+++ b/support/fancytabwidget.cpp
@@ -256,7 +256,7 @@ FancyTabBar::FancyTabBar(QWidget* parent, bool text, int iSize, Pos pos)
 	setLayout(layout);
 
 	// We use a zerotimer to keep the sidebar responsive
-	connect(&triggerTimer, SIGNAL(timeout()), this, SLOT(emitCurrentIndex()));
+	connect(&triggerTimer, &QTimer::timeout, this, &FancyTabBar::emitCurrentIndex);
 }
 
 FancyTabBar::~FancyTabBar()
@@ -636,7 +636,7 @@ void FancyTabWidget::setStyle(int s)
 		}
 
 		bar->setCurrentIndex(IndexToTab(stack_->currentIndex()));
-		connect(bar, SIGNAL(currentChanged(int)), SLOT(showWidget(int)));
+		connect(bar, &FancyTabBar::currentChanged, this, &FancyTabWidget::showWidget);
 	}
 	tabBar->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
 
@@ -714,7 +714,7 @@ void FancyTabWidget::makeTabBar(QTabBar::Shape shape, bool text, bool icons, boo
 	}
 
 	bar->setCurrentIndex(IndexToTab(stack_->currentIndex()));
-	connect(bar, SIGNAL(currentChanged(int)), SLOT(showWidget(int)));
+	connect(bar, &QTabBar::currentChanged, this, &FancyTabWidget::showWidget);
 	tabBar = bar;
 }
 
diff --git a/support/inputdialog.cpp b/support/inputdialog.cpp
index f8d58a9a7..b8da6e942 100644
--- a/support/inputdialog.cpp
+++ b/support/inputdialog.cpp
@@ -44,7 +44,7 @@ InputDialog::InputDialog(const QString& caption, const QString& label, const QSt
 	if (options.isEmpty()) {
 		edit->setText(value);
 		edit->setEchoMode(echo);
-		connect(edit, SIGNAL(textChanged(QString)), this, SLOT(enableOkButton()));
+		connect(edit, &LineEdit::textChanged, this, &InputDialog::enableOkButton);
 	}
 	else {
 		QStringList items = options;
@@ -54,7 +54,7 @@ InputDialog::InputDialog(const QString& caption, const QString& label, const QSt
 		std::sort(items.begin(), items.end());
 		combo->addItems(items);
 		combo->setCurrentText(value.isEmpty() ? QString() : value);
-		connect(combo, SIGNAL(editTextChanged(QString)), this, SLOT(enableOkButton()));
+		connect(combo, &ComboBox::editTextChanged, this, &InputDialog::enableOkButton);
 	}
 	enableOkButton();
 }
diff --git a/support/keysequencewidget.cpp b/support/keysequencewidget.cpp
index 35655b8cb..2010bf15a 100644
--- a/support/keysequencewidget.cpp
+++ b/support/keysequencewidget.cpp
@@ -179,10 +179,10 @@ KeySequenceWidget::KeySequenceWidget(QWidget* parent)
 
 	setLayout(layout);
 
-	connect(_keyButton, SIGNAL(clicked()), SLOT(startRecording()));
-	connect(_keyButton, SIGNAL(clicked()), SIGNAL(clicked()));
-	connect(_clearButton, SIGNAL(clicked()), SLOT(clear()));
-	connect(_clearButton, SIGNAL(clicked()), SIGNAL(clicked()));
+	connect(_keyButton, &KeySequenceButton::clicked, this, &KeySequenceWidget::startRecording);
+	connect(_keyButton, &KeySequenceButton::clicked, this, &KeySequenceWidget::clicked);
+	connect(_clearButton, &QToolButton::clicked, this, &KeySequenceWidget::clear);
+	connect(_clearButton, &QToolButton::clicked, this, &KeySequenceWidget::clicked);
 }
 
 void KeySequenceWidget::setModel(ShortcutsModel* model)
diff --git a/support/kmessagewidget.cpp b/support/kmessagewidget.cpp
index 19b0e6c16..f36a56365 100644
--- a/support/kmessagewidget.cpp
+++ b/support/kmessagewidget.cpp
@@ -40,6 +40,7 @@ void KMsgWidgetPrivate::init(KMsgWidget* q_ptr)
 	q->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed);
 
 	timeLine = new QTimeLine(500, q);
+
 	QObject::connect(timeLine, SIGNAL(valueChanged(qreal)), q, SLOT(slotTimeLineChanged(qreal)));
 	QObject::connect(timeLine, SIGNAL(finished()), q, SLOT(slotTimeLineFinished()));
 
@@ -58,7 +59,7 @@ void KMsgWidgetPrivate::init(KMsgWidget* q_ptr)
 	iconOpt.insert("color", Icon::constRed);
 	closeAction->setIcon(Icon::fa(fa::fa_solid, fa::fa_close, iconOpt));
 	closeAction->setToolTip(QObject::tr("Close"));
-	QObject::connect(closeAction, SIGNAL(triggered()), q, SLOT(animatedHide()));
+	QObject::connect(closeAction, &QAction::triggered, q, &KMsgWidget::animatedHide);
 
 	closeButton = new FlatToolButton(content);
 	closeButton->setDefaultAction(closeAction);
diff --git a/support/osxstyle.cpp b/support/osxstyle.cpp
index 9df1c1148..af927b905 100644
--- a/support/osxstyle.cpp
+++ b/support/osxstyle.cpp
@@ -78,12 +78,12 @@ void OSXStyle::initWindowMenu(QMainWindow* mw)
 		addWindow(mw);
 		mw->menuBar()->addMenu(windowMenu);
 		actions[mw]->setChecked(true);
-		connect(qApp, SIGNAL(focusWindowChanged(QWindow*)), SLOT(focusWindowChanged(QWindow*)));
+		connect(qApp, &QGuiApplication::focusWindowChanged, this, &OSXStyle::focusWindowChanged);
 		closeAct->setShortcut(Qt::ControlModifier | Qt::Key_W);
 		minAct->setShortcut(Qt::ControlModifier | Qt::Key_M);
-		connect(closeAct, SIGNAL(triggered()), SLOT(closeWindow()));
-		connect(minAct, SIGNAL(triggered()), SLOT(minimizeWindow()));
-		connect(zoomAct, SIGNAL(triggered()), SLOT(zoomWindow()));
+		connect(closeAct, &QAction::triggered, this, &OSXStyle::closeWindow);
+		connect(minAct, &QAction::triggered, this, &OSXStyle::minimizeWindow);
+		connect(zoomAct, &QAction::triggered, this, &OSXStyle::zoomWindow);
 		controlActions(mw);
 	}
 }
@@ -93,8 +93,8 @@ void OSXStyle::addWindow(QWidget* w)
 	if (w && windowMenu && !actions.contains(w)) {
 		QAction* action = windowMenu->addAction(w->windowTitle());
 		action->setCheckable(true);
-		connect(action, SIGNAL(triggered()), this, SLOT(showWindow()));
-		connect(w, SIGNAL(windowTitleChanged(QString)), this, SLOT(windowTitleChanged()));
+		connect(action, &QAction::triggered, this, &OSXStyle::showWindow);
+		connect(w, &QWidget::windowTitleChanged, this, &OSXStyle::windowTitleChanged);
 		actions.insert(w, action);
 	}
 }
@@ -104,8 +104,8 @@ void OSXStyle::removeWindow(QWidget* w)
 	if (w && windowMenu && actions.contains(w)) {
 		QAction* act = actions.take(w);
 		windowMenu->removeAction(act);
-		disconnect(act, SIGNAL(triggered()), this, SLOT(showWindow()));
-		disconnect(w, SIGNAL(windowTitleChanged(QString)), this, SLOT(windowTitleChanged()));
+		disconnect(act, &QAction::triggered, this, &OSXStyle::showWindow);
+		disconnect(w, &QWidget::windowTitleChanged, this, &OSXStyle::windowTitleChanged);
 		act->deleteLater();
 	}
 }
diff --git a/support/pagewidget.cpp b/support/pagewidget.cpp
index 7b251477c..77cfcbdd5 100644
--- a/support/pagewidget.cpp
+++ b/support/pagewidget.cpp
@@ -306,8 +306,8 @@ PageWidget::PageWidget(QWidget* p, bool listView, bool headers)
 	QBoxLayout* layout = new QBoxLayout(QBoxLayout::LeftToRight, this);
 	list = new QListWidget(p);
 	stack = new QStackedWidget(p);
-	connect(list, SIGNAL(currentRowChanged(int)), stack, SLOT(setCurrentIndex(int)));
-	connect(stack, SIGNAL(currentChanged(int)), this, SIGNAL(currentPageChanged()));
+	connect(list, &QListWidget::currentRowChanged, stack, &QStackedWidget::setCurrentIndex);
+	connect(stack, &QStackedWidget::currentChanged, this, &PageWidget::currentPageChanged);
 	layout->addWidget(list);
 	layout->addWidget(stack);
 	layout->setContentsMargins(0, 0, 0, 0);
diff --git a/support/pathrequester.cpp b/support/pathrequester.cpp
index 2dd123bf4..a99e9de96 100644
--- a/support/pathrequester.cpp
+++ b/support/pathrequester.cpp
@@ -44,8 +44,8 @@ PathRequester::PathRequester(QWidget* parent)
 	layout->addWidget(btn);
 	btn->setAutoRaise(true);
 	btn->setIcon(icon);
-	connect(btn, SIGNAL(clicked(bool)), SLOT(choose()));
-	connect(edit, SIGNAL(textChanged(const QString&)), SIGNAL(textChanged(const QString&)));
+	connect(btn, &FlatToolButton::clicked, this, &PathRequester::choose);
+	connect(edit, &LineEdit::textChanged, this, &PathRequester::textChanged);
 }
 
 void PathRequester::choose()
diff --git a/support/shortcutssettingswidget.cpp b/support/shortcutssettingswidget.cpp
index 6aed75645..b1da404d4 100644
--- a/support/shortcutssettingswidget.cpp
+++ b/support/shortcutssettingswidget.cpp
@@ -84,19 +84,19 @@ ShortcutsSettingsWidget::ShortcutsSettingsWidget(const QHash<QString, ActionColl
 	}
 
 	keySequenceWidget->setModel(_shortcutsModel);
-	connect(keySequenceWidget, SIGNAL(keySequenceChanged(QKeySequence, QModelIndex)), SLOT(keySequenceChanged(QKeySequence, QModelIndex)));
+	connect(keySequenceWidget, &KeySequenceWidget::keySequenceChanged, this, &ShortcutsSettingsWidget::keySequenceChanged);
 
-	connect(shortcutsView->selectionModel(), SIGNAL(currentChanged(QModelIndex, QModelIndex)), SLOT(setWidgetStates()));
+	connect(shortcutsView->selectionModel(), &QItemSelectionModel::currentChanged, this, &ShortcutsSettingsWidget::setWidgetStates);
 
 	setWidgetStates();
 
-	connect(useDefault, SIGNAL(clicked(bool)), SLOT(toggledCustomOrDefault()));
-	connect(useCustom, SIGNAL(clicked(bool)), SLOT(toggledCustomOrDefault()));
+	connect(useDefault, &QRadioButton::clicked, this, &ShortcutsSettingsWidget::toggledCustomOrDefault);
+	connect(useCustom, &QRadioButton::clicked, this, &ShortcutsSettingsWidget::toggledCustomOrDefault);
 
-	//   connect(_shortcutsModel, SIGNAL(hasChanged(bool)), SLOT(setChangedState(bool)));
+	//   connect(_shortcutsModel, &MpdSocket::hasChanged, this, &ShortcutsSettingsWidget::setChangedState);
 
 	// fugly, but directly setting it from the ctor doesn't seem to work
-	QTimer::singleShot(0, searchEdit, SLOT(setFocus()));
+	QTimer::singleShot(0, searchEdit, [this] { searchEdit->setFocus(); });
 }
 
 QTreeView* ShortcutsSettingsWidget::view()
diff --git a/support/spinner.cpp b/support/spinner.cpp
index 43d4d2b00..06b1e2ce4 100644
--- a/support/spinner.cpp
+++ b/support/spinner.cpp
@@ -55,7 +55,7 @@ void Spinner::start()
 	active = true;
 	if (!timer) {
 		timer = new QTimer(this);
-		connect(timer, SIGNAL(timeout()), this, SLOT(timeout()));
+		connect(timer, &QTimer::timeout, this, &Spinner::timeout);
 	}
 	timer->start(75);
 }
diff --git a/support/thread.cpp b/support/thread.cpp
index 6a8520639..45afe1f16 100644
--- a/support/thread.cpp
+++ b/support/thread.cpp
@@ -53,7 +53,7 @@ void ThreadCleaner::stopAll()
 	DBUG << "Remaining threads:" << threads.count();
 	for (Thread* thread : threads) {
 		DBUG << "Cleanup" << thread->objectName();
-		disconnect(thread, SIGNAL(finished()), this, SLOT(threadFinished()));
+		disconnect(thread, &Thread::finished, this, &ThreadCleaner::threadFinished);
 	}
 
 	for (Thread* thread : threads) {
@@ -91,7 +91,7 @@ void ThreadCleaner::threadFinished()
 void ThreadCleaner::add(Thread* thread)
 {
 	threads.append(thread);
-	connect(thread, SIGNAL(finished()), this, SLOT(threadFinished()));
+	connect(thread, &Thread::finished, this, &ThreadCleaner::threadFinished);
 	DBUG << "Thread created" << thread->objectName() << "Total threads:" << threads.count();
 }
 
@@ -115,14 +115,14 @@ void Thread::run()
 QTimer* Thread::createTimer(QObject* parent)
 {
 	QTimer* timer = new QTimer(parent ? parent : this);
-	connect(this, SIGNAL(finished()), timer, SLOT(stop()));
+	connect(this, &Thread::finished, timer, &QTimer::stop);
 	return timer;
 }
 
 void Thread::deleteTimer(QTimer* timer)
 {
 	if (timer) {
-		disconnect(this, SIGNAL(finished()), timer, SLOT(stop()));
+		disconnect(this, &Thread::finished, timer, &QTimer::stop);
 		timer->deleteLater();
 	}
 }
diff --git a/support/urllabel.cpp b/support/urllabel.cpp
index 71bae1e3e..185a8eec9 100644
--- a/support/urllabel.cpp
+++ b/support/urllabel.cpp
@@ -33,7 +33,7 @@ UrlLabel::UrlLabel(QWidget* p)
 	setCursor(QCursor(Qt::PointingHandCursor));
 	setTextInteractionFlags(Qt::TextBrowserInteraction);
 	setOpenExternalLinks(false);
-	connect(this, SIGNAL(linkActivated(QString)), this, SIGNAL(leftClickedUrl()));
+	connect(this, &UrlLabel::linkActivated, this, &UrlLabel::leftClickedUrl);
 }
 
 void UrlLabel::setText(const QString& t)
diff --git a/tags/tageditor.cpp b/tags/tageditor.cpp
index 5c650265d..0ebc9b7e0 100644
--- a/tags/tageditor.cpp
+++ b/tags/tageditor.cpp
@@ -178,9 +178,9 @@ TagEditor::TagEditor(QWidget* parent, const QList<Song>& songs,
 		REMOVE(ratingNoteLabel);
 	}
 	else {
-		connect(this, SIGNAL(getRating(QString)), MPDConnection::self(), SLOT(getRating(QString)));
-		connect(this, SIGNAL(setRating(QString, quint8)), MPDConnection::self(), SLOT(setRating(QString, quint8)));
-		connect(MPDConnection::self(), SIGNAL(rating(QString, quint8)), this, SLOT(rating(QString, quint8)));
+		connect(this, &TagEditor::getRating, MPDConnection::self(), &MPDConnection::getRating);
+		connect(this, &TagEditor::setRating, MPDConnection::self(), qOverload<const QString&, quint8>(&MPDConnection::setRating));
+		connect(MPDConnection::self(), &MPDConnection::rating, this, &TagEditor::rating);
 		ratingWidget->setShowZeroForNull(true);
 		QColor col = palette().color(QPalette::WindowText);
 		ratingVarious->setStyleSheet(QString("QLabel{color:rgba(%1,%2,%3,128);}").arg(col.red()).arg(col.green()).arg(col.blue()));
@@ -201,14 +201,14 @@ TagEditor::TagEditor(QWidget* parent, const QList<Song>& songs,
 	setButtonGuiItem(Ok, StdGuiItem::save());
 	setButtonGuiItem(User3, GuiItem(tr("Tools"), fa::fa_solid, fa::fa_magic));
 	QMenu* toolsMenu = new QMenu(this);
-	toolsMenu->addAction(tr("Apply \"Various Artists\" Workaround"), this, SLOT(applyVa()));
-	toolsMenu->addAction(tr("Revert \"Various Artists\" Workaround"), this, SLOT(revertVa()));
-	toolsMenu->addAction(tr("Set 'Album Artist' from 'Artist'"), this, SLOT(setAlbumArtistFromArtist()));
-	toolsMenu->addAction(tr("Capitalize"), this, SLOT(capitalise()));
-	toolsMenu->addAction(tr("Adjust Track Numbers"), this, SLOT(adjustTrackNumbers()));
+	toolsMenu->addAction(tr("Apply \"Various Artists\" Workaround"), this, &TagEditor::applyVa);
+	toolsMenu->addAction(tr("Revert \"Various Artists\" Workaround"), this, &TagEditor::revertVa);
+	toolsMenu->addAction(tr("Set 'Album Artist' from 'Artist'"), this, &TagEditor::setAlbumArtistFromArtist);
+	toolsMenu->addAction(tr("Capitalize"), this, &TagEditor::capitalise);
+	toolsMenu->addAction(tr("Adjust Track Numbers"), this, &TagEditor::adjustTrackNumbers);
 	if (ratingsSupport) {
-		readRatingsAct = toolsMenu->addAction(tr("Read Ratings from File"), this, SLOT(readRatings()));
-		writeRatingsAct = toolsMenu->addAction(tr("Write Ratings to File"), this, SLOT(writeRatings()));
+		readRatingsAct = toolsMenu->addAction(tr("Read Ratings from File"), this, &TagEditor::readRatings);
+		writeRatingsAct = toolsMenu->addAction(tr("Write Ratings to File"), this, &TagEditor::writeRatings);
 		readRatingsAct->setEnabled(false);
 		writeRatingsAct->setEnabled(false);
 	}
@@ -344,29 +344,29 @@ TagEditor::TagEditor(QWidget* parent, const QList<Song>& songs,
 			}
 		}
 	}
-	connect(title, SIGNAL(textChanged(const QString&)), SLOT(checkChanged()));
-	connect(artist, SIGNAL(activated(int)), SLOT(checkChanged()));
-	connect(artist, SIGNAL(editTextChanged(const QString&)), SLOT(checkChanged()));
-	connect(albumArtist, SIGNAL(activated(int)), SLOT(checkChanged()));
-	connect(albumArtist, SIGNAL(editTextChanged(const QString&)), SLOT(checkChanged()));
+	connect(title, &LineEdit::textChanged, this, &TagEditor::checkChanged);
+	connect(artist, &CompletionCombo::activated, this, &TagEditor::checkChanged);
+	connect(artist, &CompletionCombo::editTextChanged, this, &TagEditor::checkChanged);
+	connect(albumArtist, &CompletionCombo::activated, this, &TagEditor::checkChanged);
+	connect(albumArtist, &CompletionCombo::editTextChanged, this, &TagEditor::checkChanged);
 	if (composerSupport) {
-		connect(composer, SIGNAL(activated(int)), SLOT(checkChanged()));
-		connect(composer, SIGNAL(editTextChanged(const QString&)), SLOT(checkChanged()));
+		connect(composer, &CompletionCombo::activated, this, &TagEditor::checkChanged);
+		connect(composer, &CompletionCombo::editTextChanged, this, &TagEditor::checkChanged);
 	}
 	if (commentSupport) {
-		connect(comment, SIGNAL(textChanged(const QString&)), SLOT(checkChanged()));
-	}
-	connect(album, SIGNAL(activated(int)), SLOT(checkChanged()));
-	connect(album, SIGNAL(editTextChanged(const QString&)), SLOT(checkChanged()));
-	connect(genre, SIGNAL(activated(int)), SLOT(checkChanged()));
-	connect(track, SIGNAL(valueChanged(int)), SLOT(checkChanged()));
-	connect(disc, SIGNAL(valueChanged(int)), SLOT(checkChanged()));
-	connect(genre, SIGNAL(editTextChanged(const QString&)), SLOT(checkChanged()));
-	connect(year, SIGNAL(valueChanged(int)), SLOT(checkChanged()));
-	connect(trackName, SIGNAL(activated(int)), SLOT(setIndex(int)));
-	connect(this, SIGNAL(update()), MPDConnection::self(), SLOT(updateMaybe()));
+		connect(comment, &LineEdit::textChanged, this, &TagEditor::checkChanged);
+	}
+	connect(album, &CompletionCombo::activated, this, &TagEditor::checkChanged);
+	connect(album, &CompletionCombo::editTextChanged, this, &TagEditor::checkChanged);
+	connect(genre, &CompletionCombo::activated, this, &TagEditor::checkChanged);
+	connect(track, &TagSpinBox::valueChanged, this, &TagEditor::checkChanged);
+	connect(disc, &TagSpinBox::valueChanged, this, &TagEditor::checkChanged);
+	connect(genre, &CompletionCombo::editTextChanged, this, &TagEditor::checkChanged);
+	connect(year, &TagSpinBox::valueChanged, this, &TagEditor::checkChanged);
+	connect(trackName, &QComboBox::activated, this, &TagEditor::setIndex);
+	connect(this, &TagEditor::update, MPDConnection::self(), &MPDConnection::updateMaybe);
 	if (ratingWidget) {
-		connect(ratingWidget, SIGNAL(valueChanged(int)), SLOT(checkRating()));
+		connect(ratingWidget, &RatingWidget::valueChanged, this, &TagEditor::checkRating);
 	}
 	adjustSize();
 	int w = Utils::scaleForDpi(600);
@@ -374,7 +374,7 @@ TagEditor::TagEditor(QWidget* parent, const QList<Song>& songs,
 		resize(w, height());
 	}
 	if (commentSupport) {
-		QTimer::singleShot(0, this, SLOT(readComments()));
+		QTimer::singleShot(0, this, &TagEditor::readComments);
 	}
 	trackName->lineEdit()->setReadOnly(true);
 }
diff --git a/tags/taghelper.cpp b/tags/taghelper.cpp
index 6d772ed27..14a088674 100644
--- a/tags/taghelper.cpp
+++ b/tags/taghelper.cpp
@@ -63,12 +63,12 @@ TagHelper::TagHelper(const QString& sockName, int parent)
 {
 	socket = new QLocalSocket(this);
 	socket->connectToServer(sockName);
-	connect(socket, SIGNAL(readyRead()), SLOT(dataReady()));
-	connect(socket, SIGNAL(disconnected()), qApp, SLOT(quit()));
+	connect(socket, &QLocalSocket::readyRead, this, &TagHelper::dataReady);
+	connect(socket, &QLocalSocket::disconnected, qApp, &QCoreApplication::quit);
 	QTimer* timer = new QTimer(this);
 	timer->setSingleShot(false);
 	timer->start(5000);
-	connect(timer, SIGNAL(timeout()), SLOT(checkParent()));
+	connect(timer, &QTimer::timeout, this, &TagHelper::checkParent);
 	socketName = sockName;
 	atexit(deleteSocket);
 }
diff --git a/tags/taghelperiface.cpp b/tags/taghelperiface.cpp
index c19136b74..d40c713b0 100644
--- a/tags/taghelperiface.cpp
+++ b/tags/taghelperiface.cpp
@@ -316,7 +316,7 @@ bool TagHelperIface::startHelper()
 		proc->setProcessChannelMode(QProcess::ForwardedChannels);
 		proc->start(Utils::helper(QLatin1String("cantata-tags")), QStringList() << server->fullServerName() << QString::number(currentPid) << QString(debugEnabled ? "true" : "false"));
 
-		connect(proc, SIGNAL(finished(int)), this, SLOT(helperClosed()));
+		connect(proc, &QProcess::finished, this, &TagHelperIface::helperClosed);
 		if (proc->waitForStarted(constMaxWait)) {
 			DBUG << "Process started, on pid" << proc->processId() << "- wait for helper to connect";
 			if (server->waitForNewConnection(constMaxWait)) {
@@ -324,8 +324,8 @@ bool TagHelperIface::startHelper()
 			}
 			if (sock) {
 				DBUG << "Helper connected";
-				connect(sock, SIGNAL(readyRead()), this, SLOT(dataReady()));
-				connect(sock, SIGNAL(disconnected()), this, SLOT(helperClosed()));
+				connect(sock, &QLocalSocket::readyRead, this, &TagHelperIface::dataReady);
+				connect(sock, &QLocalSocket::disconnected, this, &TagHelperIface::helperClosed);
 				return true;
 			}
 			else {
@@ -353,8 +353,8 @@ void TagHelperIface::stopHelper()
 {
 	if (sock) {
 		DBUG << "Socket" << (void*)sock;
-		disconnect(sock, SIGNAL(readyRead()), this, SLOT(dataReady()));
-		disconnect(sock, SIGNAL(disconnected()), this, SLOT(helperClosed()));
+		disconnect(sock, &QLocalSocket::readyRead, this, &TagHelperIface::dataReady);
+		disconnect(sock, &QLocalSocket::disconnected, this, &TagHelperIface::helperClosed);
 		sock->flush();
 		sock->close();
 		sock->deleteLater();
@@ -367,7 +367,7 @@ void TagHelperIface::stopHelper()
 		server = nullptr;
 	}
 	if (proc) {
-		disconnect(proc, SIGNAL(finished(int)), this, SLOT(helperClosed()));
+		disconnect(proc, &QProcess::finished, this, &TagHelperIface::helperClosed);
 		DBUG << "Process" << (void*)proc;
 		if (QProcess::NotRunning != proc->state()) {
 			proc->kill();
diff --git a/tags/trackorganiser.cpp b/tags/trackorganiser.cpp
index 42ca82d83..7442e24eb 100644
--- a/tags/trackorganiser.cpp
+++ b/tags/trackorganiser.cpp
@@ -67,7 +67,7 @@ TrackOrganiser::TrackOrganiser(QWidget* parent)
 	setMainWidget(mainWidet);
 	configFilename->setIcon(Icons::self()->configureIcon);
 	setButtonGuiItem(Ok, GuiItem(tr("Rename")));
-	connect(this, SIGNAL(update()), MPDConnection::self(), SLOT(updateMaybe()));
+	connect(this, &TrackOrganiser::update, MPDConnection::self(), &MPDConnection::updateMaybe);
 	progress->setVisible(false);
 	files->setItemDelegate(new BasicItemDelegate(files));
 	files->setAlternatingRowColors(false);
@@ -76,8 +76,8 @@ TrackOrganiser::TrackOrganiser(QWidget* parent)
 	removeAct = new Action(tr("Remove From List"), files);
 	removeAct->setEnabled(false);
 	files->addAction(removeAct);
-	connect(files, SIGNAL(itemSelectionChanged()), SLOT(controlRemoveAct()));
-	connect(removeAct, SIGNAL(triggered()), SLOT(removeItems()));
+	connect(files, &QTreeWidget::itemSelectionChanged, this, &TrackOrganiser::controlRemoveAct);
+	connect(removeAct, &Action::triggered, this, &TrackOrganiser::removeItems);
 }
 
 TrackOrganiser::~TrackOrganiser()
@@ -134,17 +134,17 @@ void TrackOrganiser::show(const QList<Song>& songs, const QString& udi, bool for
 	ignoreThe->setChecked(opts.ignoreThe);
 	replaceSpaces->setChecked(opts.replaceSpaces);
 
-	connect(configFilename, SIGNAL(clicked()), SLOT(configureFilenameScheme()));
-	connect(filenameScheme, SIGNAL(textChanged(const QString&)), this, SLOT(updateView()));
-	connect(vfatSafe, SIGNAL(toggled(bool)), this, SLOT(updateView()));
-	connect(asciiOnly, SIGNAL(toggled(bool)), this, SLOT(updateView()));
-	connect(ignoreThe, SIGNAL(toggled(bool)), this, SLOT(updateView()));
-	connect(replaceSpaces, SIGNAL(toggled(bool)), this, SLOT(updateView()));
+	connect(configFilename, &QToolButton::clicked, this, &TrackOrganiser::configureFilenameScheme);
+	connect(filenameScheme, &LineEdit::textChanged, this, &TrackOrganiser::updateView);
+	connect(vfatSafe, &QCheckBox::toggled, this, &TrackOrganiser::updateView);
+	connect(asciiOnly, &QCheckBox::toggled, this, &TrackOrganiser::updateView);
+	connect(ignoreThe, &QCheckBox::toggled, this, &TrackOrganiser::updateView);
+	connect(replaceSpaces, &QCheckBox::toggled, this, &TrackOrganiser::updateView);
 
 	if (!songsOk(origSongs, musicFolder, udi.isEmpty())) {
 		return;
 	}
-	connect(ratingsNote, SIGNAL(leftClickedUrl()), SLOT(showRatingsMessage()));
+	connect(ratingsNote, &UrlNoteLabel::leftClickedUrl, this, &TrackOrganiser::showRatingsMessage);
 	Dialog::show();
 	enableButtonOk(false);
 	updateView();
@@ -161,7 +161,7 @@ void TrackOrganiser::slotButtonClicked(int button)
 			paused = true;
 			if (MessageBox::No == MessageBox::questionYesNo(this, tr("Abort renaming of files?"), tr("Abort"), GuiItem(tr("Abort")), StdGuiItem::cancel())) {
 				paused = false;
-				QTimer::singleShot(0, this, SLOT(renameFile()));
+				QTimer::singleShot(0, this, &TrackOrganiser::renameFile);
 				return;
 			}
 		}
@@ -178,7 +178,7 @@ void TrackOrganiser::configureFilenameScheme()
 {
 	if (!schemeDlg) {
 		schemeDlg = new FilenameSchemeDialog(this);
-		connect(schemeDlg, SIGNAL(scheme(const QString&)), this, SLOT(setFilenameScheme(const QString&)));
+		connect(schemeDlg, &FilenameSchemeDialog::scheme, this, &TrackOrganiser::setFilenameScheme);
 	}
 	readOptions();
 	schemeDlg->show(opts);
@@ -241,7 +241,7 @@ void TrackOrganiser::startRename()
 	paused = autoSkip = false;
 	saveOptions();
 
-	QTimer::singleShot(100, this, SLOT(renameFile()));
+	QTimer::singleShot(100, this, &TrackOrganiser::renameFile);
 }
 
 void TrackOrganiser::renameFile()
@@ -464,7 +464,7 @@ void TrackOrganiser::renameFile()
 		finish(true);
 	}
 	else {
-		QTimer::singleShot(100, this, SLOT(renameFile()));
+		QTimer::singleShot(100, this, &TrackOrganiser::renameFile);
 	}
 }
 
diff --git a/widgets/actionlabel.cpp b/widgets/actionlabel.cpp
index ae794c61d..f1267998f 100644
--- a/widgets/actionlabel.cpp
+++ b/widgets/actionlabel.cpp
@@ -73,7 +73,7 @@ ActionLabel::ActionLabel(QWidget* parent)
 
 	setPixmap(*theIcons[0]);
 	timer = new QTimer(this);
-	connect(timer, SIGNAL(timeout()), SLOT(rotateIcon()));
+	connect(timer, &QTimer::timeout, this, &ActionLabel::rotateIcon);
 }
 
 ActionLabel::~ActionLabel()
diff --git a/widgets/autohidingsplitter.cpp b/widgets/autohidingsplitter.cpp
index 37c63e8ac..e3143e56d 100644
--- a/widgets/autohidingsplitter.cpp
+++ b/widgets/autohidingsplitter.cpp
@@ -101,7 +101,7 @@ AutohidingSplitter::AutohidingSplitter(Qt::Orientation orientation, QWidget* par
 	autohideAnimation->setSplitter(this);
 	autohideAnimation->setDuration(100);
 	autohideAnimation->setEasingCurve(QEasingCurve::Linear);
-	//connect(this, SIGNAL(splitterMoved(int, int)), this, SLOT(updateAfterSplitterMoved(int, int)));
+	//connect(this, &AutohidingSplitter::splitterMoved, this, &AutohidingSplitter::updateAfterSplitterMoved);
 	setMinimumWidth(32);
 	setHandleWidth(splitterSize(this));
 }
@@ -114,7 +114,7 @@ AutohidingSplitter::AutohidingSplitter(QWidget* parent)
 	autohideAnimation->setSplitter(this);
 	autohideAnimation->setDuration(100);
 	autohideAnimation->setEasingCurve(QEasingCurve::Linear);
-	//connect(this, SIGNAL(splitterMoved(int, int)), this, SLOT(updateAfterSplitterMoved(int, int)));
+	//connect(this, &AutohidingSplitter::splitterMoved, this, &AutohidingSplitter::updateAfterSplitterMoved);
 	setMinimumWidth(32);
 	setHandleWidth(1);
 }
@@ -134,8 +134,8 @@ AutohidingSplitter::~AutohidingSplitter()
 QSplitterHandle* AutohidingSplitter::createHandle()
 {
 	AutohidingSplitterHandle* sh = new AutohidingSplitterHandle(orientation(), this);
-	connect(sh, SIGNAL(hoverStarted()), this, SLOT(handleHoverStarted()));
-	connect(sh, SIGNAL(hoverFinished()), this, SLOT(handleHoverFinished()));
+	connect(sh, &AutohidingSplitterHandle::hoverStarted, this, &AutohidingSplitter::handleHoverStarted);
+	connect(sh, &AutohidingSplitterHandle::hoverFinished, this, &AutohidingSplitter::handleHoverFinished);
 	return sh;
 }
 
@@ -261,13 +261,13 @@ void AutohidingSplitter::setAutoHideEnabled(bool ah)
 	autoHideEnabled = ah;
 	if (autoHideEnabled) {
 		expandedSizes = sizes();
-		connect(this, SIGNAL(splitterMoved(int, int)), this, SLOT(updateAfterSplitterMoved(int, int)));
+		connect(this, &AutohidingSplitter::splitterMoved, this, &AutohidingSplitter::updateAfterSplitterMoved);
 	}
 	else {
 		for (int i = 0; i < widgetAutohidden.count(); ++i) {
 			widgetAutohidden[i] = false;
 		}
-		disconnect(this, SIGNAL(splitterMoved(int, int)), this, SLOT(updateAfterSplitterMoved(int, int)));
+		disconnect(this, &AutohidingSplitter::splitterMoved, this, &AutohidingSplitter::updateAfterSplitterMoved);
 		setSizes(expandedSizes);
 	}
 }
@@ -308,7 +308,7 @@ void AutohidingSplitter::addWidget(QWidget* widget)
 		QTimer* sat = new QTimer(this);
 		sat->setSingleShot(true);
 		sat->setInterval(500);
-		connect(sat, SIGNAL(timeout()), this, SLOT(setWidgetForHiding()));
+		connect(sat, &QTimer::timeout, this, &AutohidingSplitter::setWidgetForHiding);
 		animationDelayTimer.append(sat);
 		widgetAutohidden.append(false);
 		widgetAutohiddenPrev.append(false);
@@ -479,14 +479,14 @@ void AutohidingSplitter::startAnimation()
 		return;
 	}
 
-	disconnect(this, SLOT(startAnimation()));
+	disconnect(autohideAnimation, &SplitterSizeAnimation::finished, this, &AutohidingSplitter::startAnimation);
 	if (!targetSizes.isEmpty()) {
 		QList<int> nextSizes = targetSizes.dequeue();
 
 		autohideAnimation->setStartValue(QVariant::fromValue(sizes()));
 		autohideAnimation->setCurrentTime(0);
 		autohideAnimation->setEndValue(QVariant::fromValue(nextSizes));
-		connect(autohideAnimation, SIGNAL(finished()), this, SLOT(startAnimation()));
+		connect(autohideAnimation, &SplitterSizeAnimation::finished, this, &AutohidingSplitter::startAnimation);
 		autohideAnimation->start();
 	}
 }
diff --git a/widgets/categorizedview.cpp b/widgets/categorizedview.cpp
index 4f0f467ca..6887ba114 100644
--- a/widgets/categorizedview.cpp
+++ b/widgets/categorizedview.cpp
@@ -109,10 +109,10 @@ CategorizedView::CategorizedView(QWidget* parent)
 	setUniformItemSizes(true);
 	setAttribute(Qt::WA_MouseTracking);
 	setVerticalScrollMode(QAbstractItemView::ScrollPerPixel);
-	connect(this, SIGNAL(customContextMenuRequested(const QPoint&)), SLOT(showCustomContextMenu(const QPoint&)));
-	connect(this, SIGNAL(doubleClicked(const QModelIndex&)), this, SLOT(checkDoubleClick(const QModelIndex&)));
-	connect(this, SIGNAL(clicked(const QModelIndex&)), this, SLOT(checkClicked(const QModelIndex&)));
-	connect(this, SIGNAL(activated(const QModelIndex&)), this, SLOT(checkActivated(const QModelIndex&)));
+	connect(this, &CategorizedView::customContextMenuRequested, this, &CategorizedView::showCustomContextMenu);
+	connect(this, &CategorizedView::doubleClicked, this, &CategorizedView::checkDoubleClick);
+	connect(this, &CategorizedView::clicked, this, &CategorizedView::checkClicked);
+	connect(this, &CategorizedView::activated, this, &CategorizedView::checkActivated);
 
 	setViewMode(QListView::IconMode);
 	setResizeMode(QListView::Adjust);
@@ -172,11 +172,11 @@ void CategorizedView::setModel(QAbstractItemModel* m)
 	proxy->setSourceModel(m);
 
 	if (old) {
-		disconnect(old, SIGNAL(layoutChanged()), this, SLOT(correctSelection()));
+		disconnect(old, &QAbstractItemModel::layoutChanged, this, &CategorizedView::correctSelection);
 	}
 
 	if (m && old != m) {
-		connect(m, SIGNAL(layoutChanged()), this, SLOT(correctSelection()));
+		connect(m, &QAbstractItemModel::layoutChanged, this, &CategorizedView::correctSelection);
 	}
 	if (m) {
 		KCategorizedView::setModel(proxy);
diff --git a/widgets/coverwidget.cpp b/widgets/coverwidget.cpp
index 437108a46..538e33f73 100644
--- a/widgets/coverwidget.cpp
+++ b/widgets/coverwidget.cpp
@@ -193,12 +193,12 @@ void CoverWidget::setSize(int min)
 void CoverWidget::setEnabled(bool e)
 {
 	if (e) {
-		connect(CurrentCover::self(), SIGNAL(coverImage(QImage)), this, SLOT(coverImage(QImage)));
+		connect(CurrentCover::self(), &CurrentCover::coverImage, this, &CoverWidget::coverImage);
 		coverImage(QImage());
 	}
 	else {
 		label->deletePix();
-		disconnect(CurrentCover::self(), SIGNAL(coverImage(QImage)), this, SLOT(coverImage(QImage)));
+		disconnect(CurrentCover::self(), &CurrentCover::coverImage, this, &CoverWidget::coverImage);
 	}
 	setVisible(e);
 	label->setEnabled(e);
diff --git a/widgets/genrecombo.cpp b/widgets/genrecombo.cpp
index a0863b2b6..3caab3349 100644
--- a/widgets/genrecombo.cpp
+++ b/widgets/genrecombo.cpp
@@ -42,7 +42,7 @@ GenreCombo::GenreCombo(QWidget* p)
 		action->setShortcut(Qt::ControlModifier | Qt::Key_G);
 	}
 	addAction(action);
-	connect(action, SIGNAL(triggered()), SLOT(showEntries()));
+	connect(action, &Action::triggered, this, &GenreCombo::showEntries);
 }
 
 void GenreCombo::update(const QSet<QString>& g)
diff --git a/widgets/groupedview.cpp b/widgets/groupedview.cpp
index bf43287e4..f4ae960e9 100644
--- a/widgets/groupedview.cpp
+++ b/widgets/groupedview.cpp
@@ -483,7 +483,7 @@ GroupedView::GroupedView(QWidget* parent, bool isPlayQueue)
 	setRootIsDecorated(false);
 	setSelectionBehavior(SelectRows);
 	setForceSingleColumn(true);
-	connect(this, SIGNAL(clicked(const QModelIndex&)), this, SLOT(itemClicked(const QModelIndex&)));
+	connect(this, &GroupedView::clicked, this, &GroupedView::itemClicked);
 	GroupedViewDelegate* delegate = new GroupedViewDelegate(this);
 	setItemDelegate(delegate);
 	if (isPlayQueue) {
@@ -504,11 +504,11 @@ void GroupedView::setModel(QAbstractItemModel* model)
 		if (startClosed) {
 			updateCollectionRows();
 		}
-		connect(Covers::self(), SIGNAL(loaded(Song, int)), this, SLOT(coverLoaded(Song, int)));
+		connect(Covers::self(), qOverload<const Song&, int>(&Covers::loaded), this, qOverload<const Song&, int>(&GroupedView::coverLoaded));
 	}
 	else {
 		controlledAlbums.clear();
-		disconnect(Covers::self(), SIGNAL(loaded(Song, int)), this, SLOT(coverLoaded(Song, int)));
+		disconnect(Covers::self(), qOverload<const Song&, int>(&Covers::loaded), this, qOverload<const Song&, int>(&GroupedView::coverLoaded));
 	}
 }
 
diff --git a/widgets/itemview.cpp b/widgets/itemview.cpp
index 91a4d29ca..6b3f58566 100644
--- a/widgets/itemview.cpp
+++ b/widgets/itemview.cpp
@@ -717,22 +717,22 @@ ItemView::ItemView(QWidget* p)
 	ViewEventHandler* treeViewEventHandler = new ViewEventHandler(td, treeView);
 	listView->installFilter(listViewEventHandler);
 	treeView->installFilter(treeViewEventHandler);
-	connect(searchWidget, SIGNAL(returnPressed()), this, SLOT(doSearch()));
-	connect(searchWidget, SIGNAL(textChanged(const QString)), this, SLOT(delaySearchItems()));
-	connect(searchWidget, SIGNAL(active(bool)), this, SLOT(searchActive(bool)));
-	connect(treeView, SIGNAL(itemsSelected(bool)), this, SIGNAL(itemsSelected(bool)));
-	connect(treeView, SIGNAL(itemActivated(const QModelIndex&)), this, SLOT(itemActivated(const QModelIndex&)));
-	connect(treeView, SIGNAL(doubleClicked(const QModelIndex&)), this, SIGNAL(doubleClicked(const QModelIndex&)));
-	connect(treeView, SIGNAL(clicked(const QModelIndex&)), this, SLOT(itemClicked(const QModelIndex&)));
-	connect(listView, SIGNAL(itemsSelected(bool)), this, SIGNAL(itemsSelected(bool)));
-	connect(listView, SIGNAL(activated(const QModelIndex&)), this, SLOT(activateItem(const QModelIndex&)));
-	connect(listView, SIGNAL(itemDoubleClicked(const QModelIndex&)), this, SIGNAL(doubleClicked(const QModelIndex&)));
-	connect(listView, SIGNAL(clicked(const QModelIndex&)), this, SLOT(itemClicked(const QModelIndex&)));
-	connect(backAction, SIGNAL(triggered()), this, SLOT(backActivated()));
-	connect(listViewEventHandler, SIGNAL(backspacePressed()), this, SLOT(backActivated()));
-	connect(title, SIGNAL(addToPlayQueue()), this, SLOT(addTitleButtonClicked()));
-	connect(title, SIGNAL(replacePlayQueue()), this, SLOT(replaceTitleButtonClicked()));
-	connect(Covers::self(), SIGNAL(loaded(Song, int)), this, SLOT(coverLoaded(Song, int)));
+	connect(searchWidget, &SearchWidget::returnPressed, this, &ItemView::doSearch);
+	connect(searchWidget, &SearchWidget::textChanged, this, &ItemView::delaySearchItems);
+	connect(searchWidget, &SearchWidget::active, this, &ItemView::searchActive);
+	connect(treeView, &TreeView::itemsSelected, this, &ItemView::itemsSelected);
+	connect(treeView, &TreeView::itemActivated, this, &ItemView::itemActivated);
+	connect(treeView, &TreeView::doubleClicked, this, &ItemView::doubleClicked);
+	connect(treeView, &TreeView::clicked, this, &ItemView::itemClicked);
+	connect(listView, &ListView::itemsSelected, this, &ItemView::itemsSelected);
+	connect(listView, &ListView::activated, this, [this](const QModelIndex& idx) { activateItem(idx); });
+	connect(listView, &ListView::itemDoubleClicked, this, &ItemView::doubleClicked);
+	connect(listView, &ListView::clicked, this, &ItemView::itemClicked);
+	connect(backAction, &Action::triggered, this, &ItemView::backActivated);
+	connect(listViewEventHandler, &ViewEventHandler::backspacePressed, this, &ItemView::backActivated);
+	connect(title, &TitleWidget::addToPlayQueue, this, &ItemView::addTitleButtonClicked);
+	connect(title, &TitleWidget::replacePlayQueue, this, &ItemView::replaceTitleButtonClicked);
+	connect(Covers::self(), qOverload<const Song&, int>(&Covers::loaded), this, &ItemView::coverLoaded);
 	searchWidget->setVisible(false);
 #ifdef Q_OS_MAC
 	treeView->setAttribute(Qt::WA_MacShowFocusRect, 0);
@@ -741,8 +741,8 @@ ItemView::ItemView(QWidget* p)
 
 	QWidget::addAction(StdActions::self()->zoomInAction);
 	QWidget::addAction(StdActions::self()->zoomOutAction);
-	connect(StdActions::self()->zoomInAction, SIGNAL(triggered()), SLOT(zoomIn()));
-	connect(StdActions::self()->zoomOutAction, SIGNAL(triggered()), SLOT(zoomOut()));
+	connect(StdActions::self()->zoomInAction, &Action::triggered, this, &ItemView::zoomIn);
+	connect(StdActions::self()->zoomOutAction, &Action::triggered, this, &ItemView::zoomOut);
 }
 
 ItemView::~ItemView()
@@ -801,10 +801,10 @@ void ItemView::allowGroupedView()
 		groupedView->installFilter(viewHandler);
 		groupedView->setAutoExpand(false);
 		groupedView->setMultiLevel(true);
-		connect(groupedView, SIGNAL(itemsSelected(bool)), this, SIGNAL(itemsSelected(bool)));
-		connect(groupedView, SIGNAL(itemActivated(const QModelIndex&)), this, SLOT(itemActivated(const QModelIndex&)));
-		connect(groupedView, SIGNAL(doubleClicked(const QModelIndex&)), this, SIGNAL(doubleClicked(const QModelIndex&)));
-		connect(groupedView, SIGNAL(clicked(const QModelIndex&)), this, SLOT(itemClicked(const QModelIndex&)));
+		connect(groupedView, &GroupedView::itemsSelected, this, &ItemView::itemsSelected);
+		connect(groupedView, &GroupedView::itemActivated, this, &ItemView::itemActivated);
+		connect(groupedView, &GroupedView::doubleClicked, this, &ItemView::doubleClicked);
+		connect(groupedView, &GroupedView::clicked, this, &ItemView::itemClicked);
 		groupedView->setProperty(ProxyStyle::constModifyFrameProp, ProxyStyle::VF_Side | ProxyStyle::VF_Top);
 #ifdef Q_OS_MAC
 		groupedView->setAttribute(Qt::WA_MacShowFocusRect, 0);
@@ -821,10 +821,10 @@ void ItemView::allowTableView(TableView* v)
 		tableView->setProperty(constPageProp, stackedWidget->count() - 1);
 		ViewEventHandler* viewHandler = new ViewEventHandler(nullptr, tableView);
 		tableView->installFilter(viewHandler);
-		connect(tableView, SIGNAL(itemsSelected(bool)), this, SIGNAL(itemsSelected(bool)));
-		connect(tableView, SIGNAL(itemActivated(const QModelIndex&)), this, SLOT(itemActivated(const QModelIndex&)));
-		connect(tableView, SIGNAL(doubleClicked(const QModelIndex&)), this, SIGNAL(doubleClicked(const QModelIndex&)));
-		connect(tableView, SIGNAL(clicked(const QModelIndex&)), this, SLOT(itemClicked(const QModelIndex&)));
+		connect(tableView, &TableView::itemsSelected, this, &ItemView::itemsSelected);
+		connect(tableView, &TableView::itemActivated, this, &ItemView::itemActivated);
+		connect(tableView, &TableView::doubleClicked, this, &ItemView::doubleClicked);
+		connect(tableView, &TableView::clicked, this, &ItemView::itemClicked);
 		tableView->setProperty(ProxyStyle::constModifyFrameProp, ProxyStyle::VF_Side | ProxyStyle::VF_Top);
 #ifdef Q_OS_MAC
 		tableView->setAttribute(Qt::WA_MacShowFocusRect, 0);
@@ -842,10 +842,10 @@ void ItemView::allowCategorized()
 		//KCategorizedView seems to handle mouse-over events better
 		//ViewEventHandler *viewHandler=new ViewEventHandler(nullptr, categorizedView);
 		//categorizedView->installFilter(viewHandler);
-		connect(categorizedView, SIGNAL(itemsSelected(bool)), this, SIGNAL(itemsSelected(bool)));
-		connect(categorizedView, SIGNAL(itemActivated(const QModelIndex&)), this, SLOT(activateItem(const QModelIndex&)));
-		connect(categorizedView, SIGNAL(itemDoubleClicked(const QModelIndex&)), this, SIGNAL(doubleClicked(const QModelIndex&)));
-		connect(categorizedView, SIGNAL(itemClicked(const QModelIndex&)), this, SLOT(itemClicked(const QModelIndex&)));
+		connect(categorizedView, &CategorizedView::itemsSelected, this, &ItemView::itemsSelected);
+		connect(categorizedView, &CategorizedView::itemActivated, this, [this](const QModelIndex& idx) { activateItem(idx); });
+		connect(categorizedView, &CategorizedView::itemDoubleClicked, this, &ItemView::doubleClicked);
+		connect(categorizedView, &CategorizedView::itemClicked, this, &ItemView::itemClicked);
 		categorizedView->setProperty(ProxyStyle::constModifyFrameProp, ProxyStyle::VF_Side | ProxyStyle::VF_Top);
 #ifdef Q_OS_MAC
 		categorizedView->setAttribute(Qt::WA_MacShowFocusRect, 0);
@@ -1154,12 +1154,12 @@ QAbstractItemView* ItemView::view() const
 void ItemView::setModel(QAbstractItemModel* m)
 {
 	if (itemModel) {
-		disconnect(itemModel, SIGNAL(modelReset()), this, SLOT(modelReset()));
+		disconnect(itemModel, &QAbstractItemModel::modelReset, this, &ItemView::modelReset);
 		if (qobject_cast<QAbstractProxyModel*>(itemModel)) {
-			disconnect(static_cast<QAbstractProxyModel*>(itemModel)->sourceModel(), SIGNAL(dataChanged(QModelIndex, QModelIndex)), this, SLOT(dataChanged(QModelIndex, QModelIndex)));
+			disconnect(static_cast<QAbstractProxyModel*>(itemModel)->sourceModel(), &QAbstractProxyModel::dataChanged, this, &ItemView::dataChanged);
 		}
 		else {
-			disconnect(itemModel, SIGNAL(dataChanged(QModelIndex, QModelIndex)), this, SLOT(dataChanged(QModelIndex, QModelIndex)));
+			disconnect(itemModel, &QAbstractItemModel::dataChanged, this, &ItemView::dataChanged);
 		}
 	}
 	itemModel = m;
@@ -1168,12 +1168,12 @@ void ItemView::setModel(QAbstractItemModel* m)
 		setMode(Mode_SimpleTree);
 	}
 	if (m) {
-		connect(m, SIGNAL(modelReset()), this, SLOT(modelReset()));
+		connect(m, &QAbstractItemModel::modelReset, this, &ItemView::modelReset);
 		if (qobject_cast<QAbstractProxyModel*>(m)) {
-			connect(static_cast<QAbstractProxyModel*>(m)->sourceModel(), SIGNAL(dataChanged(QModelIndex, QModelIndex)), this, SLOT(dataChanged(QModelIndex, QModelIndex)));
+			connect(static_cast<QAbstractProxyModel*>(m)->sourceModel(), &QAbstractProxyModel::dataChanged, this, &ItemView::dataChanged);
 		}
 		else {
-			connect(m, SIGNAL(dataChanged(QModelIndex, QModelIndex)), this, SLOT(dataChanged(QModelIndex, QModelIndex)));
+			connect(m, &QAbstractItemModel::dataChanged, this, &ItemView::dataChanged);
 		}
 	}
 	view()->setModel(m);
@@ -1510,18 +1510,13 @@ void ItemView::setSearchCategory(const QString& id)
 	searchWidget->setCategory(id);
 }
 
-void ItemView::showSpinner(bool v)
+void ItemView::showSpinner()
 {
-	if (v) {
-		if (!spinner) {
-			spinner = new Spinner(this);
-		}
-		spinner->setWidget(view());
-		spinner->start();
-	}
-	else {
-		hideSpinner();
+	if (!spinner) {
+		spinner = new Spinner(this);
 	}
+	spinner->setWidget(view());
+	spinner->start();
 }
 
 void ItemView::hideSpinner()
@@ -1819,7 +1814,7 @@ void ItemView::delaySearchItems()
 		if (!searchTimer) {
 			searchTimer = new QTimer(this);
 			searchTimer->setSingleShot(true);
-			connect(searchTimer, SIGNAL(timeout()), this, SLOT(doSearch()));
+			connect(searchTimer, &QTimer::timeout, this, &ItemView::doSearch);
 		}
 		int len = searchWidget->text().trimmed().length();
 		searchTimer->start(qMin(qMax(minSearchDebounce, len < 2 ? 1000u : len < 4 ? 750u
diff --git a/widgets/itemview.h b/widgets/itemview.h
index 5d7db897e..b0adc4f24 100644
--- a/widgets/itemview.h
+++ b/widgets/itemview.h
@@ -157,7 +157,7 @@ class ItemView : public QWidget, public Ui::ItemView {
 public Q_SLOTS:
 	void focusSearch(const QString& text = QString());
 	void focusView();
-	void showSpinner(bool v = true);
+	void showSpinner();
 	void hideSpinner();
 	void updating();
 	void updated();
diff --git a/widgets/listview.cpp b/widgets/listview.cpp
index 06a0d64fc..c52daf042 100644
--- a/widgets/listview.cpp
+++ b/widgets/listview.cpp
@@ -47,8 +47,8 @@ ListView::ListView(QWidget* parent)
 	setUniformItemSizes(true);
 	setAttribute(Qt::WA_MouseTracking);
 	setVerticalScrollMode(QAbstractItemView::ScrollPerPixel);
-	connect(this, SIGNAL(customContextMenuRequested(const QPoint&)), SLOT(showCustomContextMenu(const QPoint&)));
-	connect(this, SIGNAL(doubleClicked(const QModelIndex&)), this, SLOT(checkDoubleClick(const QModelIndex&)));
+	connect(this, &ListView::customContextMenuRequested, this, &ListView::showCustomContextMenu);
+	connect(this, &ListView::doubleClicked, this, &ListView::checkDoubleClick);
 }
 
 ListView::~ListView()
@@ -98,11 +98,11 @@ void ListView::setModel(QAbstractItemModel* m)
 	QListView::setModel(m);
 
 	if (old) {
-		disconnect(old, SIGNAL(layoutChanged()), this, SLOT(correctSelection()));
+		disconnect(old, &QAbstractItemModel::layoutChanged, this, &ListView::correctSelection);
 	}
 
 	if (m && old != m) {
-		connect(m, SIGNAL(layoutChanged()), this, SLOT(correctSelection()));
+		connect(m, &QAbstractItemModel::layoutChanged, this, &ListView::correctSelection);
 	}
 }
 
diff --git a/widgets/messageoverlay.cpp b/widgets/messageoverlay.cpp
index 85fdc807d..988e29696 100644
--- a/widgets/messageoverlay.cpp
+++ b/widgets/messageoverlay.cpp
@@ -51,7 +51,7 @@ MessageOverlay::MessageOverlay(QObject* p)
 	redOpt.insert("color", Icon::constRed);
 	cancelButton->setIcon(Icon::fa(fa::fa_solid, fa::fa_close, redOpt));
 	cancelButton->adjustSize();
-	connect(cancelButton, SIGNAL(clicked()), SIGNAL(cancel()));
+	connect(cancelButton, &ToolButton::clicked, this, &MessageOverlay::cancel);
 }
 
 void MessageOverlay::setWidget(QWidget* widget)
@@ -76,7 +76,7 @@ void MessageOverlay::setText(const QString& txt, int timeout, bool allowCancel)
 		if (-1 != timeout) {
 			if (!timer) {
 				timer = new QTimer(this);
-				connect(timer, SIGNAL(timeout()), this, SLOT(timeout()));
+				connect(timer, &QTimer::timeout, this, &MessageOverlay::timeout);
 			}
 			timer->start(timeout);
 		}
diff --git a/widgets/mirrormenu.cpp b/widgets/mirrormenu.cpp
index 87fea356d..f56c4c175 100644
--- a/widgets/mirrormenu.cpp
+++ b/widgets/mirrormenu.cpp
@@ -49,20 +49,6 @@ QAction* MirrorMenu::addAction(const QIcon& icon, const QString& text)
 	return act;
 }
 
-QAction* MirrorMenu::addAction(const QString& text, const QObject* receiver, const char* member, const QKeySequence& shortcut)
-{
-	QAction* act = QMenu::addAction(text, shortcut, receiver, member);
-	updateMenus();
-	return act;
-}
-
-QAction* MirrorMenu::addAction(const QIcon& icon, const QString& text, const QObject* receiver, const char* member, const QKeySequence& shortcut)
-{
-	QAction* act = QMenu::addAction(icon, text, shortcut, receiver, member);
-	updateMenus();
-	return act;
-}
-
 void MirrorMenu::removeAction(QAction* act)
 {
 	QMenu::removeAction(act);
@@ -80,7 +66,7 @@ QMenu* MirrorMenu::duplicate(QWidget* p)
 	QMenu* menu = new QMenu(p);
 	menus.append(menu);
 	updateMenu(menu);
-	connect(menu, SIGNAL(destroyed(QObject*)), this, SLOT(menuDestroyed(QObject*)));
+	connect(menu, &QMenu::destroyed, this, &MirrorMenu::menuDestroyed);
 	return menu;
 }
 
diff --git a/widgets/mirrormenu.h b/widgets/mirrormenu.h
index c2f8f6935..82af2f7f3 100644
--- a/widgets/mirrormenu.h
+++ b/widgets/mirrormenu.h
@@ -34,8 +34,24 @@ class MirrorMenu : public QMenu {
 	void addAction(QAction* act);
 	QAction* addAction(const QString& text);
 	QAction* addAction(const QIcon& icon, const QString& text);
-	QAction* addAction(const QString& text, const QObject* receiver, const char* member, const QKeySequence& shortcut = 0);
-	QAction* addAction(const QIcon& icon, const QString& text, const QObject* receiver, const char* member, const QKeySequence& shortcut = 0);
+
+	template <typename Receiver>
+	QAction* addAction(const QString& text, const Receiver* receiver, void (Receiver::*slot)(), const QKeySequence& shortcut = 0)
+	{
+		QAction* act = QMenu::addAction(text, shortcut, receiver, slot);
+		updateMenus();
+		return act;
+	}
+
+	template <typename Receiver>
+	QAction* addAction(const QIcon& icon, const QString& text, const Receiver* receiver, void (Receiver::*slot)(), const QKeySequence& shortcut = 0)
+
+	{
+		QAction* act = QMenu::addAction(icon, text, shortcut, receiver, slot);
+		updateMenus();
+		return act;
+	}
+
 	void removeAction(QAction* act);
 	void clear();
 	QMenu* duplicate(QWidget* p);
diff --git a/widgets/multipagewidget.cpp b/widgets/multipagewidget.cpp
index ad230e3de..64fb74e7b 100644
--- a/widgets/multipagewidget.cpp
+++ b/widgets/multipagewidget.cpp
@@ -243,13 +243,13 @@ void MultiPageWidget::addPage(const QString& name, const QIcon& icon, const QStr
 	static_cast<QVBoxLayout*>(view->layout())->insertWidget(view->layout()->count() - 1, e.btn);
 	addWidget(widget);
 	entries.insert(name, e);
-	connect(e.btn, SIGNAL(clicked()), SLOT(setPage()));
+	connect(e.btn, &SelectorButton::clicked, this, &MultiPageWidget::setPage);
 	infoLabel->setVisible(false);
 	if (qobject_cast<SinglePageWidget*>(widget)) {
-		connect(static_cast<SinglePageWidget*>(widget), SIGNAL(close()), this, SLOT(showMainView()));
+		connect(static_cast<SinglePageWidget*>(widget), &SinglePageWidget::close, this, &MultiPageWidget::showMainView);
 	}
 	else if (qobject_cast<StackedPageWidget*>(widget)) {
-		connect(static_cast<StackedPageWidget*>(widget), SIGNAL(close()), this, SLOT(showMainView()));
+		connect(static_cast<StackedPageWidget*>(widget), &StackedPageWidget::close, this, &MultiPageWidget::showMainView);
 	}
 }
 
diff --git a/widgets/notelabel.cpp b/widgets/notelabel.cpp
index cf6e443d8..b6a32ef37 100644
--- a/widgets/notelabel.cpp
+++ b/widgets/notelabel.cpp
@@ -86,7 +86,7 @@ UrlNoteLabel::UrlNoteLabel(QWidget* parent)
 	: QWidget(parent)
 {
 	label = static_cast<UrlLabel*>(init(this, true));
-	connect(label, SIGNAL(leftClickedUrl()), this, SIGNAL(leftClickedUrl()));
+	connect(label, &UrlLabel::leftClickedUrl, this, &UrlNoteLabel::leftClickedUrl);
 }
 
 void UrlNoteLabel::setProperty(const char* name, const QVariant& value)
diff --git a/widgets/nowplayingwidget.cpp b/widgets/nowplayingwidget.cpp
index a8101ae30..bba21f4fd 100644
--- a/widgets/nowplayingwidget.cpp
+++ b/widgets/nowplayingwidget.cpp
@@ -302,18 +302,18 @@ NowPlayingWidget::NowPlayingWidget(QWidget* p)
 	layout->addLayout(botLayout);
 	layout->addItem(new QSpacerItem(1, space / 4, QSizePolicy::Fixed, QSizePolicy::Fixed));
 	layout->addWidget(slider);
-	connect(slider, SIGNAL(sliderPressed()), this, SLOT(pressed()));
-	connect(slider, SIGNAL(sliderReleased()), this, SLOT(released()));
-	connect(slider, SIGNAL(positionSet()), this, SIGNAL(sliderReleased()));
-	connect(slider, SIGNAL(valueChanged(int)), this, SLOT(updateTimes()));
-	connect(this, SIGNAL(mpdPoll()), MPDConnection::self(), SLOT(getStatus()));
+	connect(slider, &PosSlider::sliderPressed, this, &NowPlayingWidget::pressed);
+	connect(slider, &PosSlider::sliderReleased, this, &NowPlayingWidget::released);
+	connect(slider, &PosSlider::positionSet, this, &NowPlayingWidget::sliderReleased);
+	connect(slider, &PosSlider::valueChanged, this, &NowPlayingWidget::updateTimes);
+	connect(this, &NowPlayingWidget::mpdPoll, MPDConnection::self(), &MPDConnection::getStatus);
 	setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
 	clearTimes();
 	update(Song());
-	connect(ratingWidget, SIGNAL(valueChanged(int)), SLOT(setRating(int)));
-	connect(this, SIGNAL(setRating(QString, quint8)), MPDConnection::self(), SLOT(setRating(QString, quint8)));
-	connect(PlayQueueModel::self(), SIGNAL(currentSongRating(QString, quint8)), this, SLOT(rating(QString, quint8)));
-	connect(MPDStatus::self(), SIGNAL(updated()), this, SLOT(updateInfo()));
+	connect(ratingWidget, &RatingWidget::valueChanged, this, qOverload<int>(&NowPlayingWidget::setRating));
+	connect(this, qOverload<const QString&, quint8>(&NowPlayingWidget::setRating), MPDConnection::self(), qOverload<const QString&, quint8>(&MPDConnection::setRating));
+	connect(PlayQueueModel::self(), &PlayQueueModel::currentSongRating, this, &NowPlayingWidget::rating);
+	connect(MPDStatus::self(), &MPDStatus::updated, this, &NowPlayingWidget::updateInfo);
 
 	Action* copy = ActionCollection::get()->createAction("copy-current-info", tr("Copy To Clipboard"));
 	copy->setSettingsText(tr("Now Playing") + QLatin1String(" / ") + Utils::strippedText(copy->text()));
@@ -321,7 +321,7 @@ NowPlayingWidget::NowPlayingWidget(QWidget* p)
 	artist->setContextMenuPolicy(Qt::NoContextMenu);
 	track->addAction(copy);
 	track->setContextMenuPolicy(Qt::NoContextMenu);
-	connect(copy, SIGNAL(triggered()), SLOT(copyInfo()));
+	connect(copy, &Action::triggered, this, &NowPlayingWidget::copyInfo);
 }
 
 void NowPlayingWidget::update(const Song& song)
@@ -341,7 +341,7 @@ void NowPlayingWidget::startTimer()
 	if (!timer) {
 		timer = new QTimer(this);
 		timer->setInterval(1000);
-		connect(timer, SIGNAL(timeout()), this, SLOT(updatePos()));
+		connect(timer, &QTimer::timeout, this, &NowPlayingWidget::updatePos);
 	}
 	elapsedTimer.start();
 	lastVal = value();
diff --git a/widgets/playqueueview.cpp b/widgets/playqueueview.cpp
index c0c04cf8e..42a69c94f 100644
--- a/widgets/playqueueview.cpp
+++ b/widgets/playqueueview.cpp
@@ -102,7 +102,7 @@ PlayQueueView::PlayQueueView(QWidget* parent)
 	setMode(ItemView::Mode_GroupedTree);
 	animator.setPropertyName("fade");
 	animator.setTargetObject(this);
-	connect(CurrentCover::self(), SIGNAL(coverImage(QImage)), this, SLOT(setImage(QImage)));
+	connect(CurrentCover::self(), &CurrentCover::coverImage, this, &PlayQueueView::setImage);
 }
 
 PlayQueueView::~PlayQueueView()
@@ -180,8 +180,8 @@ void PlayQueueView::setMode(ItemView::Mode m)
 			groupedView->setExpandsOnDoubleClick(false);
 			groupedView->installFilter(new KeyEventHandler(groupedView, removeFromAction));
 			addWidget(groupedView);
-			connect(groupedView, SIGNAL(itemsSelected(bool)), SIGNAL(itemsSelected(bool)));
-			connect(groupedView, SIGNAL(doubleClicked(const QModelIndex&)), SIGNAL(doubleClicked(const QModelIndex&)));
+			connect(groupedView, &PlayQueueGroupedView::itemsSelected, this, &PlayQueueView::itemsSelected);
+			connect(groupedView, &PlayQueueGroupedView::doubleClicked, this, &PlayQueueView::doubleClicked);
 			updatePalette();
 #ifdef Q_OS_MAC
 			groupedView->setAttribute(Qt::WA_MacShowFocusRect, 0);
@@ -197,8 +197,8 @@ void PlayQueueView::setMode(ItemView::Mode m)
 			treeView->installFilter(new KeyEventHandler(treeView, removeFromAction));
 			treeView->initHeader();
 			addWidget(treeView);
-			connect(treeView, SIGNAL(itemsSelected(bool)), SIGNAL(itemsSelected(bool)));
-			connect(treeView, SIGNAL(doubleClicked(const QModelIndex&)), SIGNAL(doubleClicked(const QModelIndex&)));
+			connect(treeView, &PlayQueueTreeView::itemsSelected, this, &PlayQueueView::itemsSelected);
+			connect(treeView, &PlayQueueTreeView::doubleClicked, this, &PlayQueueView::doubleClicked);
 			updatePalette();
 #ifdef Q_OS_MAC
 			treeView->setAttribute(Qt::WA_MacShowFocusRect, 0);
@@ -459,8 +459,8 @@ void PlayQueueView::streamFetchStatus(const QString& msg)
 	if (!msgOverlay) {
 		msgOverlay = new MessageOverlay(this);
 		msgOverlay->setWidget(view());
-		connect(msgOverlay, SIGNAL(cancel()), SIGNAL(cancelStreamFetch()));
-		connect(msgOverlay, SIGNAL(cancel()), SLOT(hideSpinner()));
+		connect(msgOverlay, &MessageOverlay::cancel, this, &PlayQueueView::cancelStreamFetch);
+		connect(msgOverlay, &MessageOverlay::cancel, this, &PlayQueueView::hideSpinner);
 	}
 	msgOverlay->setText(msg);
 }
diff --git a/widgets/searchwidget.cpp b/widgets/searchwidget.cpp
index 1e6497b47..79861ddef 100644
--- a/widgets/searchwidget.cpp
+++ b/widgets/searchwidget.cpp
@@ -81,9 +81,9 @@ SearchWidget::SearchWidget(QWidget* p, int extraSpace)
 	redOpt.insert("color", Icon::constRed);
 	closeButton->setIcon(Icon::fa(fa::fa_solid, fa::fa_close, redOpt));
 	Icon::init(closeButton);
-	connect(closeButton, SIGNAL(clicked()), this, SLOT(close()));
-	connect(edit, SIGNAL(textChanged(QString)), SIGNAL(textChanged(QString)));
-	connect(edit, SIGNAL(returnPressed()), SIGNAL(returnPressed()));
+	connect(closeButton, &ToolButton::clicked, this, &SearchWidget::close);
+	connect(edit, &LineEdit::textChanged, this, &SearchWidget::textChanged);
+	connect(edit, &LineEdit::returnPressed, this, &SearchWidget::returnPressed);
 	installEventFilter(new EscKeyEventHandler(this));
 	;
 	setTabOrder(edit, closeButton);
@@ -107,8 +107,8 @@ void SearchWidget::setCategories(const QList<Category>& categories)
 		QHBoxLayout* l = static_cast<QHBoxLayout*>(layout());
 		l->insertWidget(0, cat);
 		l->setSpacing(qMin(4, Utils::layoutSpacing(this)));
-		connect(cat, SIGNAL(activated(int)), SIGNAL(returnPressed()));
-		connect(cat, SIGNAL(activated(int)), this, SLOT(categoryActivated(int)));
+		connect(cat, &SelectorLabel::activated, this, &SearchWidget::returnPressed);
+		connect(cat, &SelectorLabel::activated, this, &SearchWidget::categoryActivated);
 		setTabOrder(cat, edit);
 		cat->setFixedHeight(edit->height());
 	}
diff --git a/widgets/selectorlabel.cpp b/widgets/selectorlabel.cpp
index fa96a3841..5b59c0e87 100644
--- a/widgets/selectorlabel.cpp
+++ b/widgets/selectorlabel.cpp
@@ -49,7 +49,7 @@ static QString addMarkup(const QString& s, bool arrow, bool bold)
 
 void SelectorLabel::addItem(const QString& text, const QString& data, const QString& tt)
 {
-	QAction* act = menu->addAction(text, this, SLOT(itemSelected()));
+	QAction* act = menu->addAction(text, this, &SelectorLabel::itemSelected);
 	act->setData(data);
 	if (!tt.isEmpty()) {
 		act->setToolTip(tt);
diff --git a/widgets/singlepagewidget.cpp b/widgets/singlepagewidget.cpp
index 89d171c03..95fb5b81e 100644
--- a/widgets/singlepagewidget.cpp
+++ b/widgets/singlepagewidget.cpp
@@ -58,10 +58,10 @@ SinglePageWidget::SinglePageWidget(QWidget* p)
 	layout->addWidget(sizer, 2, 2, 1, 1);
 	layout->setContentsMargins(0, 0, 0, 0);
 	layout->setSpacing(0);
-	connect(view, SIGNAL(searchItems()), this, SIGNAL(searchItems()));
-	connect(view, SIGNAL(itemsSelected(bool)), this, SLOT(controlActions()));
-	connect(this, SIGNAL(add(const QStringList&, int, quint8, bool)), MPDConnection::self(), SLOT(add(const QStringList&, int, quint8, bool)));
-	connect(this, SIGNAL(addSongsToPlaylist(const QString&, const QStringList&)), MPDConnection::self(), SLOT(addToPlaylist(const QString&, const QStringList&)));
+	connect(view, &ItemView::searchItems, this, &SinglePageWidget::searchItems);
+	connect(view, &ItemView::itemsSelected, this, &SinglePageWidget::controlActions);
+	connect(this, &SinglePageWidget::add, MPDConnection::self(), qOverload<const QStringList&, int, quint8, bool>(&MPDConnection::add));
+	connect(this, &SinglePageWidget::addSongsToPlaylist, MPDConnection::self(), qOverload<const QString&, const QStringList&>(&MPDConnection::addToPlaylist));
 }
 
 void SinglePageWidget::addWidget(QWidget* w)
@@ -104,11 +104,11 @@ void SinglePageWidget::init(int flags, const QList<QWidget*>& leftXtra, const QL
 		ToolButton* refreshButton = new ToolButton(this);
 		refreshAction = new Action(Icons::self()->reloadIcon, tr("Refresh"), this);
 		refreshButton->setDefaultAction(refreshAction);
-		connect(refreshAction, SIGNAL(triggered()), this, SLOT(refresh()));
+		connect(refreshAction, &Action::triggered, this, &SinglePageWidget::refresh);
 		left.append(refreshButton);
 	}
 
-	connect(this, SIGNAL(searchItems()), this, SLOT(doSearch()));
+	connect(this, &SinglePageWidget::searchItems, this, &SinglePageWidget::doSearch);
 
 	if (!left.isEmpty()) {
 		QHBoxLayout* ll = new QHBoxLayout();
@@ -162,22 +162,6 @@ void SinglePageWidget::hideEvent(QHideEvent* e)
 
 const char* SinglePageWidget::constValProp = "val";
 
-QList<QAction*> SinglePageWidget::createActions(const QList<SinglePageWidget::MenuItem>& values, int currentVal, QWidget* parent, const char* slot)
-{
-	QList<QAction*> actions;
-	QActionGroup* group = new QActionGroup(parent);
-	for (const MenuItem& v : values) {
-		QAction* act = new QAction(v.first, parent);
-		connect(act, SIGNAL(toggled(bool)), parent, slot);
-		act->setActionGroup(group);
-		act->setProperty(constValProp, v.second);
-		act->setCheckable(true);
-		act->setChecked(v.second == currentVal);
-		actions.append(act);
-	}
-	return actions;
-}
-
 Action* SinglePageWidget::createMenuGroup(const QString& name, const QList<QAction*> actions, QWidget* parent)
 {
 	Action* action = new Action(name, parent);
@@ -187,11 +171,6 @@ Action* SinglePageWidget::createMenuGroup(const QString& name, const QList<QActi
 	return action;
 }
 
-Action* SinglePageWidget::createMenuGroup(const QString& name, const QList<SinglePageWidget::MenuItem>& values, int currentVal, QWidget* parent, const char* slot)
-{
-	return createMenuGroup(name, createActions(values, currentVal, parent, slot), parent);
-}
-
 QList<QAction*> SinglePageWidget::createViewActions(QList<ItemView::Mode> modes)
 {
 	QList<QPair<QString, int>> vals;
@@ -199,7 +178,7 @@ QList<QAction*> SinglePageWidget::createViewActions(QList<ItemView::Mode> modes)
 		if (m != ItemView::Mode_Categorized)
 			vals.append(MenuItem(viewTypeString(m), m));
 	}
-	return createActions(vals, view->viewMode(), this, SLOT(viewModeSelected()));
+	return createActions(vals, view->viewMode(), this, &SinglePageWidget::viewModeSelected);
 }
 
 Action* SinglePageWidget::createViewMenu(QList<ItemView::Mode> modes)
diff --git a/widgets/singlepagewidget.h b/widgets/singlepagewidget.h
index d00e63903..b4dacba30 100644
--- a/widgets/singlepagewidget.h
+++ b/widgets/singlepagewidget.h
@@ -29,6 +29,7 @@
 #include "mpd-interface/song.h"
 #include "widgets/itemview.h"
 #include <QWidget>
+#include <QActionGroup>
 
 class Action;
 
@@ -45,9 +46,30 @@ class SinglePageWidget : public QWidget, public Page {
 
 	typedef QPair<QString, int> MenuItem;
 	static const char* constValProp;
-	static QList<QAction*> createActions(const QList<MenuItem>& values, int currentVal, QWidget* parent, const char* slot);
+	template <typename Widget>
+	static QList<QAction*> createActions(const QList<MenuItem>& values, int currentVal, Widget* parent, void (Widget::*slot)())
+	{
+		QList<QAction*> actions;
+		QActionGroup* group = new QActionGroup(parent);
+		for (const MenuItem& v : values) {
+			QAction* act = new QAction(v.first, parent);
+			connect(act, &QAction::toggled, parent, slot);
+			act->setActionGroup(group);
+			act->setProperty(constValProp, v.second);
+			act->setCheckable(true);
+			act->setChecked(v.second == currentVal);
+			actions.append(act);
+		}
+		return actions;
+	}
+
 	static Action* createMenuGroup(const QString& name, const QList<QAction*> actions, QWidget* parent);
-	static Action* createMenuGroup(const QString& name, const QList<MenuItem>& values, int currentVal, QWidget* parent, const char* slot);
+
+	template <typename Widget>
+	static Action* createMenuGroup(const QString& name, const QList<MenuItem>& values, int currentVal, Widget* parent, void (Widget::*slot)())
+	{
+		return createMenuGroup(name, createActions(values, currentVal, parent, slot), parent);
+	}
 
 	SinglePageWidget(QWidget* p);
 	~SinglePageWidget() override {}
diff --git a/widgets/stretchheaderview.cpp b/widgets/stretchheaderview.cpp
index 41302fc3a..ab849b1f3 100644
--- a/widgets/stretchheaderview.cpp
+++ b/widgets/stretchheaderview.cpp
@@ -33,7 +33,7 @@ StretchHeaderView::StretchHeaderView(Qt::Orientation orientation, QWidget* paren
 	  stretch_enabled_(false),
 	  in_mouse_move_event_(false)
 {
-	connect(this, SIGNAL(sectionResized(int, int, int)), SLOT(SectionResized(int, int, int)));
+	connect(this, &StretchHeaderView::sectionResized, this, &StretchHeaderView::SectionResized);
 }
 
 void StretchHeaderView::setModel(QAbstractItemModel* model)
diff --git a/widgets/tableview.cpp b/widgets/tableview.cpp
index 361d4dba5..c580d9206 100644
--- a/widgets/tableview.cpp
+++ b/widgets/tableview.cpp
@@ -92,7 +92,7 @@ TableView::TableView(const QString& cfgGroup, QWidget* parent, bool menuAlwaysAl
 	setAttribute(Qt::WA_MouseTracking, true);
 	StretchHeaderView* hdr = new StretchHeaderView(Qt::Horizontal, this);
 	setHeader(hdr);
-	connect(hdr, SIGNAL(StretchEnabledChanged(bool)), SLOT(stretchToggled(bool)));
+	connect(hdr, &StretchHeaderView::StretchEnabledChanged, this, &TableView::stretchToggled);
 }
 
 void TableView::setModel(QAbstractItemModel* m)
@@ -133,7 +133,7 @@ void TableView::initHeader()
 			}
 		}
 		hdr->setSectionsMovable(true);
-		connect(hdr, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(showMenu(QPoint)));
+		connect(hdr, &StretchHeaderView::customContextMenuRequested, this, &TableView::showMenu);
 	}
 
 	//Restore state
@@ -153,7 +153,7 @@ void TableView::initHeader()
 		QAction* stretch = new QAction(tr("Stretch Columns To Fit Window"), this);
 		stretch->setCheckable(true);
 		stretch->setChecked(hdr->is_stretch_enabled());
-		connect(stretch, SIGNAL(toggled(bool)), hdr, SLOT(SetStretchEnabled(bool)));
+		connect(stretch, &QAction::toggled, hdr, &StretchHeaderView::SetStretchEnabled);
 		menu->addAction(stretch);
 
 		QMenu* alignmentMenu = new QMenu(menu);
@@ -166,7 +166,7 @@ void TableView::initHeader()
 		alignCenterAction->setCheckable(true);
 		alignRightAction->setCheckable(true);
 		alignmentMenu->addActions(alignGroup->actions());
-		connect(alignGroup, SIGNAL(triggered(QAction*)), SLOT(alignmentChanged()));
+		connect(alignGroup, &QActionGroup::triggered, this, &TableView::alignmentChanged);
 		alignAction = new QAction(tr("Alignment"), menu);
 		alignAction->setMenu(alignmentMenu);
 		menu->addAction(alignAction);
@@ -178,7 +178,7 @@ void TableView::initHeader()
 			act->setChecked(!hdr->isSectionHidden(col));
 			menu->addAction(act);
 			act->setData(col);
-			connect(act, SIGNAL(toggled(bool)), this, SLOT(toggleHeaderItem(bool)));
+			connect(act, &QAction::toggled, this, &TableView::toggleHeaderItem);
 		}
 	}
 }
diff --git a/widgets/textbrowser.cpp b/widgets/textbrowser.cpp
index ebf71162b..d8259be48 100644
--- a/widgets/textbrowser.cpp
+++ b/widgets/textbrowser.cpp
@@ -115,7 +115,7 @@ void TextBrowser::handleSizeChange()
 			else {
 				timer = new QTimer(this);
 				timer->setSingleShot(true);
-				connect(timer, SIGNAL(timeout()), SLOT(refreshHtml()));
+				connect(timer, &QTimer::timeout, this, &TextBrowser::refreshHtml);
 			}
 			lastImageSize = imgSize;
 			timer->start();
diff --git a/widgets/titlewidget.cpp b/widgets/titlewidget.cpp
index 2bde8f01d..6a2b1d85a 100644
--- a/widgets/titlewidget.cpp
+++ b/widgets/titlewidget.cpp
@@ -91,9 +91,9 @@ TitleWidget::TitleWidget(QWidget* p)
 	chevron->setAttribute(Qt::WA_TransparentForMouseEvents);
 	viewport()->installEventFilter(this);
 	viewport()->setAttribute(Qt::WA_Hover);
-	connect(Covers::self(), SIGNAL(cover(Song, QImage, QString)), this, SLOT(coverRetrieved(Song, QImage, QString)));
-	connect(Covers::self(), SIGNAL(coverUpdated(Song, QImage, QString)), this, SLOT(coverRetrieved(Song, QImage, QString)));
-	connect(Covers::self(), SIGNAL(artistImage(Song, QImage, QString)), this, SLOT(coverRetrieved(Song, QImage, QString)));
+	connect(Covers::self(), &Covers::cover, this, &TitleWidget::coverRetrieved);
+	connect(Covers::self(), &Covers::coverUpdated, this, &TitleWidget::coverRetrieved);
+	connect(Covers::self(), &Covers::artistImage, this, &TitleWidget::coverRetrieved);
 	layout->setContentsMargins(0, 0, 0, 0);
 	layout->setSpacing(2);
 	textLayout->setContentsMargins(0, 0, 0, 0);
@@ -139,8 +139,8 @@ void TitleWidget::update(const Song& sng, const QIcon& icon, const QString& text
 			replace->setToolTip(tr("Add All And Replace Play Queue"));
 			l->addWidget(replace);
 			l->addWidget(add);
-			connect(add, SIGNAL(clicked()), this, SIGNAL(addToPlayQueue()));
-			connect(replace, SIGNAL(clicked()), this, SIGNAL(replacePlayQueue()));
+			connect(add, &ToolButton::clicked, this, &TitleWidget::addToPlayQueue);
+			connect(replace, &ToolButton::clicked, this, &TitleWidget::replacePlayQueue);
 			static_cast<QHBoxLayout*>(layout())->addWidget(controls);
 		}
 		controls->setVisible(true);
diff --git a/widgets/treeview.cpp b/widgets/treeview.cpp
index 2685128f6..2be930b1c 100644
--- a/widgets/treeview.cpp
+++ b/widgets/treeview.cpp
@@ -101,7 +101,7 @@ TreeView::TreeView(QWidget* parent, bool menuAlwaysAllowed)
 	//setAttribute(Qt::WA_MouseTracking);
 
 	if (SINGLE_CLICK) {
-		connect(this, SIGNAL(activated(const QModelIndex&)), this, SIGNAL(itemActivated(const QModelIndex&)));
+		connect(this, &TreeView::activated, this, &TreeView::itemActivated);
 	}
 }
 
@@ -121,7 +121,7 @@ void TreeView::setPageDefaults()
 
 void TreeView::setExpandOnClick()
 {
-	connect(this, SIGNAL(clicked(const QModelIndex&)), this, SLOT(itemWasClicked(const QModelIndex&)));
+	connect(this, &TreeView::clicked, this, &TreeView::itemWasClicked);
 }
 
 void TreeView::selectionChanged(const QItemSelection& selected, const QItemSelection& deselected)
@@ -362,11 +362,11 @@ void TreeView::setModel(QAbstractItemModel* m)
 	}
 
 	if (old) {
-		disconnect(old, SIGNAL(layoutChanged()), this, SLOT(correctSelection()));
+		disconnect(old, &QAbstractItemModel::layoutChanged, this, &TreeView::correctSelection);
 	}
 
 	if (m && old != m) {
-		connect(m, SIGNAL(layoutChanged()), this, SLOT(correctSelection()));
+		connect(m, &QAbstractItemModel::layoutChanged, this, &TreeView::correctSelection);
 	}
 }
 
diff --git a/widgets/volumecontrol.cpp b/widgets/volumecontrol.cpp
index 89fd7b3b2..3357a6b4e 100644
--- a/widgets/volumecontrol.cpp
+++ b/widgets/volumecontrol.cpp
@@ -56,7 +56,7 @@ VolumeControl::VolumeControl(QWidget* p)
 	layout->addWidget(label);
 	mpdVol->ensurePolished();
 	setFixedSize(mpdVol->width(), mpdVol->height() + (size * 2));
-	connect(httpVol, SIGNAL(stateChanged()), SLOT(stateChanged()));
+	connect(httpVol, &VolumeSlider::stateChanged, this, &VolumeControl::stateChanged);
 	mpdVol->setEnabled(true);
 	httpVol->setEnabled(false);
 	label->setAlignment(Qt::AlignCenter);
@@ -68,8 +68,8 @@ VolumeControl::VolumeControl(QWidget* p)
 	httpVol->setActive(false);
 	label->setVisible(false);
 
-	connect(label, SIGNAL(activated(int)), SLOT(itemSelected(int)));
-	QTimer::singleShot(500, this, SLOT(selectControl()));
+	connect(label, &SelectorLabel::activated, this, &VolumeControl::itemSelected);
+	QTimer::singleShot(500, this, &VolumeControl::selectControl);
 }
 
 VolumeControl::~VolumeControl()
diff --git a/widgets/volumeslider.cpp b/widgets/volumeslider.cpp
index ede59395a..11f015ee3 100644
--- a/widgets/volumeslider.cpp
+++ b/widgets/volumeslider.cpp
@@ -95,21 +95,21 @@ void VolumeSlider::initActions()
 	}
 	muteAction = ActionCollection::get()->createAction("mute", tr("Mute"));
 	addAction(muteAction);
-	connect(muteAction, SIGNAL(triggered()), this, SLOT(muteToggled()));
-	connect(StdActions::self()->increaseVolumeAction, SIGNAL(triggered()), this, SLOT(increaseVolume()));
-	connect(StdActions::self()->decreaseVolumeAction, SIGNAL(triggered()), this, SLOT(decreaseVolume()));
+	connect(muteAction, &Action::triggered, this, &VolumeSlider::muteToggled);
+	connect(StdActions::self()->increaseVolumeAction, &Action::triggered, this, &VolumeSlider::increaseVolume);
+	connect(StdActions::self()->decreaseVolumeAction, &Action::triggered, this, &VolumeSlider::decreaseVolume);
 	if (isMpdVol) {
-		connect(MPDStatus::self(), SIGNAL(updated()), this, SLOT(updateStatus()));
-		connect(this, SIGNAL(valueChanged(int)), MPDConnection::self(), SLOT(setVolume(int)));
-		connect(this, SIGNAL(toggleMute()), MPDConnection::self(), SLOT(toggleMute()));
+		connect(MPDStatus::self(), &MPDStatus::updated, this, &VolumeSlider::updateStatus);
+		connect(this, &VolumeSlider::valueChanged, MPDConnection::self(), &MPDConnection::setVolume);
+		connect(this, &VolumeSlider::toggleMute, MPDConnection::self(), &MPDConnection::toggleMute);
 	}
 #ifdef ENABLE_HTTP_STREAM_PLAYBACK
 	else {
-		connect(this, SIGNAL(valueChanged(int)), HttpStream::self(), SLOT(setVolume(int)));
-		connect(this, SIGNAL(toggleMute()), HttpStream::self(), SLOT(toggleMute()));
-		connect(HttpStream::self(), SIGNAL(update()), this, SLOT(updateStatus()));
-		connect(HttpStream::self(), SIGNAL(isEnabled(bool)), this, SLOT(setEnabled(bool)));
-		connect(HttpStream::self(), SIGNAL(isEnabled(bool)), this, SIGNAL(stateChanged()));
+		connect(this, &VolumeSlider::valueChanged, HttpStream::self(), &HttpStream::setVolume);
+		connect(this, &VolumeSlider::toggleMute, HttpStream::self(), &HttpStream::toggleMute);
+		connect(HttpStream::self(), &HttpStream::update, this, &VolumeSlider::updateStatus);
+		connect(HttpStream::self(), &HttpStream::isEnabled, this, &VolumeSlider::setEnabled);
+		connect(HttpStream::self(), &HttpStream::isEnabled, this, &VolumeSlider::stateChanged);
 	}
 #endif
 	addAction(StdActions::self()->increaseVolumeAction);
diff --git a/windows/thumbnailtoolbar.cpp b/windows/thumbnailtoolbar.cpp
index d97d6e8e2..3d413901b 100644
--- a/windows/thumbnailtoolbar.cpp
+++ b/windows/thumbnailtoolbar.cpp
@@ -101,7 +101,7 @@ QWinThumbnailToolButton* ThumbnailToolBar::createButton(Action* act)
 	btn->setToolTip(act->text());
 	btn->setIcon(act->icon());
 	btn->setEnabled(false);
-	QObject::connect(btn, SIGNAL(clicked()), act, SIGNAL(triggered()));
+	QObject::connect(btn, &QWinThumbnailToolButton::clicked, act, &MpdSocket::triggered);
 	addButton(btn);
 	return btn;
 }

From 59a4530f258bfb7d55b79a1b444b8aee51c9992c Mon Sep 17 00:00:00 2001
From: Markus Mittendrein <git@maxmitti.at>
Date: Mon, 8 Dec 2025 20:36:28 +0100
Subject: [PATCH 2/3] Listen to ApplicationPaletteChange instead of using
 deprecated paletteChanged signal

---
 gui/mainwindow.cpp | 9 ++++++++-
 gui/mainwindow.h   | 2 ++
 2 files changed, 10 insertions(+), 1 deletion(-)

diff --git a/gui/mainwindow.cpp b/gui/mainwindow.cpp
index 504cbb94b..5583cdc3c 100644
--- a/gui/mainwindow.cpp
+++ b/gui/mainwindow.cpp
@@ -891,7 +891,6 @@ MainWindow::MainWindow(QWidget* parent)
 	connect(playNextAction, &Action::triggered, this, &MainWindow::moveSelectionAfterCurrentSong);
 	connect(moveToBeginning, &Action::triggered, this, &MainWindow::moveSelectionAtQueueStart);
 	connect(moveToEnd, &Action::triggered, this, &MainWindow::moveSelectionAtQueueEnd);
-	connect(qApp, &QGuiApplication::paletteChanged, this, &MainWindow::paletteChanged);
 
 	connect(StdActions::self()->searchAction, &Action::triggered, this, &MainWindow::showSearch);
 	connect(searchPlayQueueAction, &Action::triggered, this, &MainWindow::showPlayQueueSearch);
@@ -1184,6 +1183,14 @@ void MainWindow::resizeEvent(QResizeEvent* event)
 	controlView();
 }
 
+bool MainWindow::event(QEvent* event)
+{
+	if (event->type() == QEvent::ApplicationPaletteChange) {
+		paletteChanged();
+	}
+	return QMainWindow::event(event);
+}
+
 void MainWindow::playQueueItemsSelected(bool s)
 {
 	int rc = playQueue->model() ? playQueue->model()->rowCount() : 0;
diff --git a/gui/mainwindow.h b/gui/mainwindow.h
index f8dc9b6f0..f0f79ece3 100644
--- a/gui/mainwindow.h
+++ b/gui/mainwindow.h
@@ -55,6 +55,7 @@ class QAbstractItemView;
 #ifdef QT_QTDBUS_FOUND
 class Mpris;
 #endif
+class QEvent;
 class QTimer;
 class QPropertyAnimation;
 class QActionGroup;
@@ -118,6 +119,7 @@ class MainWindow : public QMainWindow, private Ui::MainWindow {
 	void showEvent(QShowEvent* event) override;
 	void closeEvent(QCloseEvent* event) override;
 	void resizeEvent(QResizeEvent* event) override;
+	bool event(QEvent* event) override;
 
 private:
 #if !defined Q_OS_WIN

From 9ff855818f34fa6e3e51747d7bd163f65f609928 Mon Sep 17 00:00:00 2001
From: Markus Mittendrein <git@maxmitti.at>
Date: Thu, 11 Dec 2025 21:34:48 +0100
Subject: [PATCH 3/3] Restore MainWindow::showError with showActions
 functionality

---
 gui/mainwindow.cpp | 16 +++++++++++++---
 gui/mainwindow.h   |  1 +
 2 files changed, 14 insertions(+), 3 deletions(-)

diff --git a/gui/mainwindow.cpp b/gui/mainwindow.cpp
index 5583cdc3c..bc90ef1de 100644
--- a/gui/mainwindow.cpp
+++ b/gui/mainwindow.cpp
@@ -833,7 +833,7 @@ MainWindow::MainWindow(QWidget* parent)
 	connect(MPDConnection::self(), &MPDConnection::playlistUpdated, this, &MainWindow::updatePlayQueue);
 	connect(MPDConnection::self(), &MPDConnection::currentSongUpdated, this, [this](const Song& song) { updateCurrentSong(song); });
 	connect(MPDConnection::self(), &MPDConnection::stateChanged, this, &MainWindow::mpdConnectionStateChanged);
-	connect(MPDConnection::self(), &MPDConnection::error, this, &MainWindow::showError);
+	connect(MPDConnection::self(), &MPDConnection::error, this, &MainWindow::showErrorWithActions);
 	connect(MPDConnection::self(), &MPDConnection::info, this, &MainWindow::showInformation);
 	connect(MPDConnection::self(), &MPDConnection::dirChanged, this, &MainWindow::checkMpdDir);
 	connect(MPDConnection::self(), &MPDConnection::connectionNotChanged, this, &MainWindow::mpdConnectionName);
@@ -1072,7 +1072,7 @@ void MainWindow::addMenuAction(QMenu* menu, QAction* action)
 }
 #endif
 
-void MainWindow::showError(const QString& message)
+void MainWindow::showErrorWithActions(const QString& message, bool showActions)
 {
 	if (!message.isEmpty()) {
 		if (!isVisible()) {
@@ -1087,10 +1087,20 @@ void MainWindow::showError(const QString& message)
 	else {
 		messageWidget->setError(message);
 	}
-	messageWidget->removeAllActions();
+	if (showActions) {
+		messageWidget->setActions(QList<QAction*>() << prefAction << connectAction);
+	}
+	else {
+		messageWidget->removeAllActions();
+	}
 	QApplication::alert(this);
 }
 
+void MainWindow::showError(const QString& message)
+{
+	showErrorWithActions(message, false);
+}
+
 void MainWindow::showInformation(const QString& message)
 {
 	if (!messageWidget->showingError()) {
diff --git a/gui/mainwindow.h b/gui/mainwindow.h
index f0f79ece3..651f094dc 100644
--- a/gui/mainwindow.h
+++ b/gui/mainwindow.h
@@ -152,6 +152,7 @@ class MainWindow : public QMainWindow, private Ui::MainWindow {
 	void playNext(const QList<quint32>& items, quint32 pos, quint32 size);
 
 public Q_SLOTS:
+	void showErrorWithActions(const QString& message, bool showActions);
 	void showError(const QString& message);
 	void showInformation(const QString& message);
 	void dynamicStatus(const QString& message);
