diff --git a/include/UserSettingsPage.h b/include/UserSettingsPage.h
index 9a4c01dd53b38e9f93c00bd6d0230ab8dfc38c45..6f6da2c52687bc470251460ebe392476293b3501 100644
--- a/include/UserSettingsPage.h
+++ b/include/UserSettingsPage.h
@@ -66,6 +66,7 @@ protected:
 
 signals:
         void moveBack();
+        void trayOptionChanged(bool value);
 
 private:
         // Layouts
diff --git a/src/MainWindow.cc b/src/MainWindow.cc
index 5c188903b9030fbf233e32610a9aafd024cc32ab..fd44e4059794eb6f55700f028e160adb6ca80f2d 100644
--- a/src/MainWindow.cc
+++ b/src/MainWindow.cc
@@ -94,6 +94,8 @@ MainWindow::MainWindow(QWidget *parent)
                 pageStack_->setCurrentWidget(chat_page_);
         });
 
+        connect(userSettingsPage_, SIGNAL(trayOptionChanged(bool)), trayIcon_, SLOT(setVisible(bool)));
+
         connect(trayIcon_,
                 SIGNAL(activated(QSystemTrayIcon::ActivationReason)),
                 this,
@@ -113,6 +115,8 @@ MainWindow::MainWindow(QWidget *parent)
 
         QSettings settings;
 
+        trayIcon_->setVisible(userSettings_->isTrayEnabled());
+
         if (hasActiveUser()) {
                 QString token       = settings.value("auth/access_token").toString();
                 QString home_server = settings.value("auth/home_server").toString();
@@ -253,7 +257,7 @@ MainWindow::showUserSettingsPage()
 void
 MainWindow::closeEvent(QCloseEvent *event)
 {
-        if (isVisible()) {
+        if (isVisible() && userSettings_->isTrayEnabled()) {
                 event->ignore();
                 hide();
         }
diff --git a/src/TrayIcon.cc b/src/TrayIcon.cc
index ad644ed9eff377231e34ba17dbd00a9bc434811a..ac84aacad9d2aff31592db94ae97bb86299c8ed3 100644
--- a/src/TrayIcon.cc
+++ b/src/TrayIcon.cc
@@ -123,9 +123,6 @@ TrayIcon::TrayIcon(const QString &filename, QWidget *parent)
         menu->addAction(quitAction_);
 
         setContextMenu(menu);
-
-        // We wait a little for the icon to load.
-        QTimer::singleShot(500, this, [=]() { show(); });
 }
 
 void
diff --git a/src/UserSettingsPage.cc b/src/UserSettingsPage.cc
index ff4714f5cbb0eb61de4660f03c6f9b11a3b7e1f0..d18b76befa4f5d1c7a053befdfb823607bbabac5 100644
--- a/src/UserSettingsPage.cc
+++ b/src/UserSettingsPage.cc
@@ -32,7 +32,7 @@ void
 UserSettings::load()
 {
         QSettings settings;
-        isTrayEnabled_ = settings.value("user/tray", true).toBool();
+        isTrayEnabled_ = settings.value("user/window/tray", true).toBool();
         theme_         = settings.value("user/theme", "default").toString();
 }
 
@@ -41,7 +41,11 @@ UserSettings::save()
 {
         QSettings settings;
         settings.beginGroup("user");
+
+        settings.beginGroup("window");
         settings.setValue("tray", isTrayEnabled_);
+        settings.endGroup();
+
         settings.setValue("theme", theme());
         settings.endGroup();
 }
@@ -122,8 +126,9 @@ UserSettingsPage::UserSettingsPage(QSharedPointer<UserSettings> settings, QWidge
                 static_cast<void (QComboBox::*)(const QString &)>(&QComboBox::activated),
                 [=](const QString &text) { settings_->setTheme(text.toLower()); });
 
-        connect(trayToggle_, &Toggle::toggled, this, [=](bool isEnabled) {
-                settings_->setTray(isEnabled);
+        connect(trayToggle_, &Toggle::toggled, this, [=](bool isDisabled) {
+                settings_->setTray(!isDisabled);
+                emit trayOptionChanged(!isDisabled);
         });
 
         connect(backBtn_, &QPushButton::clicked, this, [=]() {
@@ -136,5 +141,5 @@ void
 UserSettingsPage::showEvent(QShowEvent *)
 {
         themeCombo_->setCurrentIndex((settings_->theme() == "default" ? 0 : 1));
-        trayToggle_->setState(settings_->isTrayEnabled());
+        trayToggle_->setState(!settings_->isTrayEnabled()); // Treats true as "off"
 }