diff --git a/include/ChatPage.h b/include/ChatPage.h
index 8332225bfda8a7259b6293a5ad22fb0d69e9feec..f64d9589126ad257ee7643c7ec3c72ebfb10446c 100644
--- a/include/ChatPage.h
+++ b/include/ChatPage.h
@@ -110,8 +110,8 @@ private:
         // Keeps track of the users currently typing on each room.
         QMap<QString, QList<QString>> typingUsers_;
 
-        QuickSwitcher *quickSwitcher_     = nullptr;
-        OverlayModal *quickSwitcherModal_ = nullptr;
+        QSharedPointer<QuickSwitcher> quickSwitcher_;
+        QSharedPointer<OverlayModal> quickSwitcherModal_;
 
         // Matrix Client API provider.
         QSharedPointer<MatrixClient> client_;
diff --git a/include/EmojiPickButton.h b/include/EmojiPickButton.h
index 041e25a6910044b7365cf4fdf1b9efc914db03b3..d4226165e536768c9f312b2b24e90dcdc951d6f3 100644
--- a/include/EmojiPickButton.h
+++ b/include/EmojiPickButton.h
@@ -43,5 +43,5 @@ private:
         // Horizontal distance from panel's bottom right corner.
         int horizontal_distance_ = 70;
 
-        EmojiPanel *panel_;
+        QSharedPointer<EmojiPanel> panel_;
 };
diff --git a/include/MainWindow.h b/include/MainWindow.h
index 85cd5a707c177a1947cdb59a03a2b91bc17e41d0..a7a2b2e6e304e787b13a1396bf3f1d29f8df2c5e 100644
--- a/include/MainWindow.h
+++ b/include/MainWindow.h
@@ -83,8 +83,8 @@ private:
         ChatPage *chat_page_;
 
         // Used to hide undefined states between page transitions.
-        OverlayModal *progress_modal_;
-        LoadingIndicator *spinner_;
+        QSharedPointer<OverlayModal> progressModal_;
+        QSharedPointer<LoadingIndicator> spinner_;
 
         // Matrix Client API provider.
         QSharedPointer<MatrixClient> client_;
diff --git a/include/RoomList.h b/include/RoomList.h
index c2f4255d2fcafe77ff78d94610101fa469f1051e..d7b201f19fc9091e7527e9e2e9b403c9a5c07b76 100644
--- a/include/RoomList.h
+++ b/include/RoomList.h
@@ -76,8 +76,8 @@ private:
         OverlayModal *joinRoomModal_;
         JoinRoomDialog *joinRoomDialog_;
 
-        OverlayModal *leaveRoomModal;
-        LeaveRoomDialog *leaveRoomDialog_;
+        QSharedPointer<OverlayModal> leaveRoomModal_;
+        QSharedPointer<LeaveRoomDialog> leaveRoomDialog_;
 
         QMap<QString, QSharedPointer<RoomInfoListItem>> rooms_;
 
diff --git a/include/TopRoomBar.h b/include/TopRoomBar.h
index 5d8b394ec57c37fa8456593ebf769c8c6d9c407e..2c7af2188a40d6bbf93f40e61d43b248d81bd575 100644
--- a/include/TopRoomBar.h
+++ b/include/TopRoomBar.h
@@ -77,8 +77,8 @@ private:
 
         FlatButton *settingsBtn_;
 
-        OverlayModal *leaveRoomModal;
-        LeaveRoomDialog *leaveRoomDialog_;
+        QSharedPointer<OverlayModal> leaveRoomModal_;
+        QSharedPointer<LeaveRoomDialog> leaveRoomDialog_;
 
         Avatar *avatar_;
 
diff --git a/include/UserInfoWidget.h b/include/UserInfoWidget.h
index 25dc226559333e3a7feba20fd80fbfac42749650..b2c7b87662551cba8bdd03f4d71fb5d06dcf549b 100644
--- a/include/UserInfoWidget.h
+++ b/include/UserInfoWidget.h
@@ -68,8 +68,8 @@ private:
 
         QImage avatar_image_;
 
-        OverlayModal *logoutModal_;
-        LogoutDialog *logoutDialog_;
+        QSharedPointer<OverlayModal> logoutModal_;
+        QSharedPointer<LogoutDialog> logoutDialog_;
 
         int logoutButtonSize_;
 };
diff --git a/src/ChatPage.cc b/src/ChatPage.cc
index 0800fe3286fc855d3d7e20c38c9484208a32e174..dbffc6d0b40e9d4f1c08df497d0d4c579c4dceb3 100644
--- a/src/ChatPage.cc
+++ b/src/ChatPage.cc
@@ -572,21 +572,26 @@ ChatPage::keyPressEvent(QKeyEvent *event)
 void
 ChatPage::showQuickSwitcher()
 {
-        if (quickSwitcher_ == nullptr) {
-                quickSwitcher_ = new QuickSwitcher(this);
+        if (quickSwitcher_.isNull()) {
+                quickSwitcher_ = QSharedPointer<QuickSwitcher>(
+                  new QuickSwitcher(this),
+                  [=](QuickSwitcher *switcher) { switcher->deleteLater(); });
 
-                connect(quickSwitcher_,
+                connect(quickSwitcher_.data(),
                         &QuickSwitcher::roomSelected,
                         room_list_,
                         &RoomList::highlightSelectedRoom);
-                connect(quickSwitcher_, &QuickSwitcher::closing, this, [=]() {
-                        if (this->quickSwitcherModal_ != nullptr)
+
+                connect(quickSwitcher_.data(), &QuickSwitcher::closing, this, [=]() {
+                        if (!this->quickSwitcherModal_.isNull())
                                 this->quickSwitcherModal_->fadeOut();
                 });
         }
 
-        if (quickSwitcherModal_ == nullptr) {
-                quickSwitcherModal_ = new OverlayModal(MainWindow::instance(), quickSwitcher_);
+        if (quickSwitcherModal_.isNull()) {
+                quickSwitcherModal_ = QSharedPointer<OverlayModal>(
+                  new OverlayModal(MainWindow::instance(), quickSwitcher_.data()),
+                  [=](OverlayModal *modal) { modal->deleteLater(); });
                 quickSwitcherModal_->setDuration(0);
                 quickSwitcherModal_->setColor(QColor(30, 30, 30, 170));
         }
diff --git a/src/EmojiPickButton.cc b/src/EmojiPickButton.cc
index f3e30661189215aa2fa753e4c6cecf4012978a1b..4f7dd59e27fd654a08539f997e5f4dd16ad0f7fa 100644
--- a/src/EmojiPickButton.cc
+++ b/src/EmojiPickButton.cc
@@ -30,9 +30,10 @@ EmojiPickButton::enterEvent(QEvent *e)
 {
         Q_UNUSED(e);
 
-        if (panel_ == nullptr) {
-                panel_ = new EmojiPanel(this);
-                connect(panel_, &EmojiPanel::emojiSelected, this, &EmojiPickButton::emojiSelected);
+        if (panel_.isNull()) {
+                panel_ = QSharedPointer<EmojiPanel>(new EmojiPanel(this));
+                connect(
+                  panel_.data(), &EmojiPanel::emojiSelected, this, &EmojiPickButton::emojiSelected);
         }
 
         QPoint pos(rect().x(), rect().y());
diff --git a/src/MainWindow.cc b/src/MainWindow.cc
index 43f4a9491a978621dbb77bb2c4aff9f5622a6fbb..8072668356734e9e1a9c6a71d77f5696fd057a98 100644
--- a/src/MainWindow.cc
+++ b/src/MainWindow.cc
@@ -15,8 +15,8 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-#include "MainWindow.h"
 #include "Config.h"
+#include "MainWindow.h"
 
 #include <QApplication>
 #include <QLayout>
@@ -29,7 +29,7 @@ MainWindow *MainWindow::instance_ = nullptr;
 
 MainWindow::MainWindow(QWidget *parent)
   : QMainWindow(parent)
-  , progress_modal_{ nullptr }
+  , progressModal_{ nullptr }
   , spinner_{ nullptr }
 {
         QSizePolicy sizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
@@ -132,18 +132,14 @@ MainWindow::removeOverlayProgressBar()
         connect(timer, &QTimer::timeout, [=]() {
                 timer->deleteLater();
 
-                if (progress_modal_ != nullptr) {
-                        progress_modal_->deleteLater();
-                        progress_modal_->fadeOut();
-                }
-
-                if (spinner_ != nullptr)
-                        spinner_->deleteLater();
+                if (!progressModal_.isNull())
+                        progressModal_->fadeOut();
 
-                spinner_->stop();
+                if (!spinner_.isNull())
+                        spinner_->stop();
 
-                progress_modal_ = nullptr;
-                spinner_        = nullptr;
+                progressModal_.reset();
+                spinner_.reset();
         });
 
         timer->start(500);
@@ -166,18 +162,22 @@ MainWindow::showChatPage(QString userid, QString homeserver, QString token)
         QTimer::singleShot(
           modalOpacityDuration + 100, this, [=]() { pageStack_->setCurrentWidget(chat_page_); });
 
-        if (spinner_ == nullptr) {
-                spinner_ = new LoadingIndicator(this);
+        if (spinner_.isNull()) {
+                spinner_ = QSharedPointer<LoadingIndicator>(
+                  new LoadingIndicator(this),
+                  [=](LoadingIndicator *indicator) { indicator->deleteLater(); });
                 spinner_->setColor("#acc7dc");
                 spinner_->setFixedHeight(120);
                 spinner_->setFixedWidth(120);
                 spinner_->start();
         }
 
-        if (progress_modal_ == nullptr) {
-                progress_modal_ = new OverlayModal(this, spinner_);
-                progress_modal_->fadeIn();
-                progress_modal_->setDuration(modalOpacityDuration);
+        if (progressModal_.isNull()) {
+                progressModal_ =
+                  QSharedPointer<OverlayModal>(new OverlayModal(this, spinner_.data()),
+                                               [=](OverlayModal *modal) { modal->deleteLater(); });
+                progressModal_->fadeIn();
+                progressModal_->setDuration(modalOpacityDuration);
         }
 
         login_page_->reset();
diff --git a/src/RoomList.cc b/src/RoomList.cc
index 0383be6e916a3a0a0465ebaa29482cdd575d5235..90d8b83c268a104a22629c574c06f3e93717bfe7 100644
--- a/src/RoomList.cc
+++ b/src/RoomList.cc
@@ -168,16 +168,23 @@ RoomList::setInitialRooms(const QMap<QString, QSharedPointer<RoomSettings>> &set
 void
 RoomList::openLeaveRoomDialog(const QString &room_id)
 {
-        leaveRoomDialog_ = new LeaveRoomDialog(this);
-        connect(leaveRoomDialog_, &LeaveRoomDialog::closing, this, [=](bool leaving) {
-                closeLeaveRoomDialog(leaving, room_id);
-        });
+        if (leaveRoomDialog_.isNull()) {
+                leaveRoomDialog_ = QSharedPointer<LeaveRoomDialog>(new LeaveRoomDialog(this));
 
-        leaveRoomModal = new OverlayModal(MainWindow::instance(), leaveRoomDialog_);
-        leaveRoomModal->setDuration(0);
-        leaveRoomModal->setColor(QColor(55, 55, 55, 170));
+                connect(leaveRoomDialog_.data(),
+                        &LeaveRoomDialog::closing,
+                        this,
+                        [=](bool leaving) { closeLeaveRoomDialog(leaving, room_id); });
+        }
+
+        if (leaveRoomModal_.isNull()) {
+                leaveRoomModal_ = QSharedPointer<OverlayModal>(
+                  new OverlayModal(MainWindow::instance(), leaveRoomDialog_.data()));
+                leaveRoomModal_->setDuration(0);
+                leaveRoomModal_->setColor(QColor(30, 30, 30, 170));
+        }
 
-        leaveRoomModal->fadeIn();
+        leaveRoomModal_->fadeIn();
 }
 
 void
@@ -266,7 +273,7 @@ RoomList::closeJoinRoomDialog(bool isJoining, QString roomAlias)
 void
 RoomList::closeLeaveRoomDialog(bool leaving, const QString &room_id)
 {
-        leaveRoomModal->fadeOut();
+        leaveRoomModal_->fadeOut();
 
         if (leaving) {
                 client_->leaveRoom(room_id);
diff --git a/src/TopRoomBar.cc b/src/TopRoomBar.cc
index f8a7e600efd6a1bb915f40b38e35b334bfa9f655..3f93cad336ff7f2958fb2a1f6ff8e6eff70e6ccb 100644
--- a/src/TopRoomBar.cc
+++ b/src/TopRoomBar.cc
@@ -86,15 +86,24 @@ TopRoomBar::TopRoomBar(QWidget *parent)
 
         leaveRoom_ = new QAction(tr("Leave room"), this);
         connect(leaveRoom_, &QAction::triggered, this, [=]() {
-                leaveRoomDialog_ = new LeaveRoomDialog(this);
-                connect(
-                  leaveRoomDialog_, SIGNAL(closing(bool)), this, SLOT(closeLeaveRoomDialog(bool)));
-
-                leaveRoomModal = new OverlayModal(MainWindow::instance(), leaveRoomDialog_);
-                leaveRoomModal->setDuration(100);
-                leaveRoomModal->setColor(QColor(55, 55, 55, 170));
-
-                leaveRoomModal->fadeIn();
+                if (leaveRoomDialog_.isNull()) {
+                        leaveRoomDialog_ =
+                          QSharedPointer<LeaveRoomDialog>(new LeaveRoomDialog(this));
+
+                        connect(leaveRoomDialog_.data(),
+                                SIGNAL(closing(bool)),
+                                this,
+                                SLOT(closeLeaveRoomDialog(bool)));
+                }
+
+                if (leaveRoomModal_.isNull()) {
+                        leaveRoomModal_ = QSharedPointer<OverlayModal>(
+                          new OverlayModal(MainWindow::instance(), leaveRoomDialog_.data()));
+                        leaveRoomModal_->setDuration(0);
+                        leaveRoomModal_->setColor(QColor(30, 30, 30, 170));
+                }
+
+                leaveRoomModal_->fadeIn();
         });
 
         menu_->addAction(toggleNotifications_);
@@ -117,7 +126,7 @@ TopRoomBar::TopRoomBar(QWidget *parent)
 void
 TopRoomBar::closeLeaveRoomDialog(bool leaving)
 {
-        leaveRoomModal->fadeOut();
+        leaveRoomModal_->fadeOut();
 
         if (leaving) {
                 emit leaveRoom();
diff --git a/src/UserInfoWidget.cc b/src/UserInfoWidget.cc
index b65329da5d1ee6ee094eea6780ce13ef06400daf..09a75a3b205fcc154c488f6672cc76f57f409f96 100644
--- a/src/UserInfoWidget.cc
+++ b/src/UserInfoWidget.cc
@@ -93,18 +93,19 @@ UserInfoWidget::UserInfoWidget(QWidget *parent)
 
         // Show the confirmation dialog.
         connect(logoutButton_, &QPushButton::clicked, this, [=]() {
-                if (logoutDialog_ == nullptr) {
-                        logoutDialog_ = new LogoutDialog(this);
-                        connect(logoutDialog_,
+                if (logoutDialog_.isNull()) {
+                        logoutDialog_ = QSharedPointer<LogoutDialog>(new LogoutDialog(this));
+                        connect(logoutDialog_.data(),
                                 SIGNAL(closing(bool)),
                                 this,
                                 SLOT(closeLogoutDialog(bool)));
                 }
 
-                if (logoutModal_ == nullptr) {
-                        logoutModal_ = new OverlayModal(MainWindow::instance(), logoutDialog_);
+                if (logoutModal_.isNull()) {
+                        logoutModal_ = QSharedPointer<OverlayModal>(
+                          new OverlayModal(MainWindow::instance(), logoutDialog_.data()));
                         logoutModal_->setDuration(0);
-                        logoutModal_->setColor(QColor(55, 55, 55, 170));
+                        logoutModal_->setColor(QColor(30, 30, 30, 170));
                 }
 
                 logoutModal_->fadeIn();