diff --git a/main.cpp b/main.cpp
index 019780c0a48d13042c5c6a5fafdaf39da8939698..1f25c8cd57e1e6aced26df6b56304f1727772a33 100644
--- a/main.cpp
+++ b/main.cpp
@@ -197,12 +197,12 @@ main(int argc, char *argv[])
         delete sem;
     });
 #endif
-
-    auto ret = a.exec();
-
-    QCoreApplication::exit();
-    GlobalSystemTray::instance().deleteLater();
-    GlobalSystemTray::instance().hide();
-
+
+    auto ret = a.exec();
+
+    QCoreApplication::exit();
+    GlobalSystemTray::instance().deleteLater();
+    GlobalSystemTray::instance().hide();
+
     return ret;
 }
diff --git a/mainwindow.cpp b/mainwindow.cpp
index 531d9c30db2787cc0f55f00838c7eaed8b429132..ed7b5aa252d29fed6cdf0bd974a0ffcc1774fe31 100644
--- a/mainwindow.cpp
+++ b/mainwindow.cpp
@@ -83,17 +83,7 @@ MainWindow::MainWindow(QWidget* parent) :
     }
 #endif
 
-    QSettings settings;
-    QVariant size = settings.value(SettingsKey::savedSize);
-    QVariant posV = settings.value(SettingsKey::savedPos);
-    if (size.isValid() && posV.isValid()) {
-        resize(size.toSize());
-        auto screenSize = QApplication::desktop()->screenGeometry();
-        auto pos = posV.toPoint();
-        if (pos.rx() < screenSize.width() && pos.ry() < screenSize.height())
-            move(pos);
-    } else
-        resize(800, 600);
+    readSettingsFromRegistry();
 
     win_sparkle_set_appcast_url("http://dl.ring.cx/windows/winsparkle-ring.xml");
     win_sparkle_set_app_details(L"Savoir-faire Linux", L"Ring", QString(NIGHTLY_VERSION).toStdWString().c_str());
@@ -111,9 +101,6 @@ MainWindow::MainWindow(QWidget* parent) :
 
     setContextMenuPolicy(Qt::NoContextMenu);
 
-    if (not settings.contains(SettingsKey::enableNotifications)) {
-        settings.setValue(SettingsKey::enableNotifications, true);
-    }
     connect(&GlobalSystemTray::instance(), SIGNAL(messageClicked()), this, SLOT(notificationClicked()));
 
     connect(&netManager_, &QNetworkConfigurationManager::onlineStateChanged, [=](bool online) {
@@ -227,7 +214,19 @@ MainWindow::closeEvent(QCloseEvent* event)
         this->hide();
         event->ignore();
     } else {
-        settings.setValue(SettingsKey::savedSize, size());
-        settings.setValue(SettingsKey::savedPos, pos());
+        settings.setValue(SettingsKey::geometry, saveGeometry());
+        settings.setValue(SettingsKey::windowState, saveState());
     }
+    QMainWindow::closeEvent(event);
 }
+
+void
+MainWindow::readSettingsFromRegistry()
+{
+    QSettings settings;
+    restoreGeometry(settings.value(SettingsKey::geometry).toByteArray());
+    restoreState(settings.value(SettingsKey::windowState).toByteArray());
+    if (not settings.contains(SettingsKey::enableNotifications)) {
+        settings.setValue(SettingsKey::enableNotifications, true);
+    }
+}
\ No newline at end of file
diff --git a/mainwindow.h b/mainwindow.h
index 54c19fa4dd266cf236bf3c6cde148fb8a8d0ced3..25306eae76dd023451657b1a1214594f3fa5a693 100644
--- a/mainwindow.h
+++ b/mainwindow.h
@@ -62,7 +62,10 @@ private slots:
 
 private:
     explicit MainWindow(QWidget* parent = 0);
-     ~MainWindow();
+    ~MainWindow();
+
+    void readSettingsFromRegistry();
+    
     Ui::MainWindow* ui;
     QNetworkConfigurationManager netManager_;
 };
diff --git a/settingskey.h b/settingskey.h
index d09a91e3931eb97dc8ddad0666e24c56d3a073b8..9fd4234c27928fac71b4f24dab1b8547a83d93ed 100644
--- a/settingskey.h
+++ b/settingskey.h
@@ -22,8 +22,8 @@ namespace SettingsKey {
 
 constexpr static char closeOrMinimized[] = "closeOrMin";
 constexpr static char autoAnswer[] = "autoAnswer";
-constexpr static char savedSize[] = "savedSize";
-constexpr static char savedPos[] = "savedPos";
+constexpr static char geometry[] = "geometry";
+constexpr static char windowState[] = "windowState";
 constexpr static char imShowAuthor[] = "imShowAuthor";
 constexpr static char imShowDate[] = "imShowDate";
 constexpr static char enableNotifications[] = "enableNotifications";