diff --git a/src/gui/MainWindow.cc b/src/gui/MainWindow.cc
index f762cd1fa..ae947f3aa 100644
--- a/src/gui/MainWindow.cc
+++ b/src/gui/MainWindow.cc
@@ -1516,15 +1516,6 @@ bool MainWindow::event(QEvent *event)
 
 bool MainWindow::eventFilter(QObject *obj, QEvent *event)
 {
-  // OpenSCAD quits by closing all top-level windows. However, the order in which top-level are closed is
-  // not defined by Qt, so we may end up closing undocked dock widgets before we've had a chance to save
-  // their window state. This overrides close to proactively save the window state.
-  if (event->type() == QEvent::Close) {
-    if (qobject_cast<Dock *>(obj) && !static_cast<QCloseEvent *>(event)->spontaneous()) {
-      saveWindowStateOnClose();
-    }
-  }
-
   if (rubberBandManager.isVisible()) {
     if (event->type() == QEvent::KeyRelease) {
       auto keyEvent = static_cast<QKeyEvent *>(event);
@@ -3237,9 +3228,6 @@ void MainWindow::on_helpActionLibraryInfo_triggered()
 
 void MainWindow::saveWindowStateOnClose()
 {
-  if (windowStateSaved) return;
-  windowStateSaved = true;
-
   QSettingsCached settings;
   settings.setValue("window/geometry", saveGeometry());
   auto windowState = saveState();
@@ -3780,7 +3768,7 @@ void MainWindow::setupMenusAndActions()
 #endif
 
 
-  connect(this->fileActionQuit, &QAction::triggered, scadApp, &OpenSCADApp::quit, Qt::QueuedConnection);
+  connect(this->fileActionQuit, &QAction::triggered, scadApp, &OpenSCADApp::closeAllWindows, Qt::QueuedConnection);
 
 #ifdef ENABLE_PYTHON
 #else
diff --git a/src/gui/MainWindow.h b/src/gui/MainWindow.h
index ef447416e..357e587f3 100644
--- a/src/gui/MainWindow.h
+++ b/src/gui/MainWindow.h
@@ -131,7 +131,6 @@ private:
   std::vector<std::pair<Dock *, QString>> docks;
 
   volatile bool isClosing = false;
-  bool windowStateSaved = false;
   void saveWindowStateOnClose();
   void consoleOutputRaw(const QString& msg);
   void clearAllSelectionIndicators();
