diff --git a/src/yuzu/configuration/config.cpp b/src/yuzu/configuration/config.cpp
index 0ea508acd..eb58bfa5b 100644
--- a/src/yuzu/configuration/config.cpp
+++ b/src/yuzu/configuration/config.cpp
@@ -1632,12 +1632,6 @@ void Config::Save() {
     SaveValues();
 }
 
-void Config::ResetDefaults() {
-    FS::Delete(qt_config_loc);
-    FS::CreateFullPath(qt_config_loc);
-    Reload();
-}
-
 void Config::ReadControlPlayerValue(std::size_t player_index) {
     qt_config->beginGroup(QStringLiteral("Controls"));
     ReadPlayerValue(player_index);
diff --git a/src/yuzu/configuration/config.h b/src/yuzu/configuration/config.h
index cd68d7b4d..ce3355588 100644
--- a/src/yuzu/configuration/config.h
+++ b/src/yuzu/configuration/config.h
@@ -28,7 +28,6 @@ public:
 
     void Reload();
     void Save();
-    void ResetDefaults();
 
     void ReadControlPlayerValue(std::size_t player_index);
     void SaveControlPlayerValue(std::size_t player_index);
diff --git a/src/yuzu/configuration/configure_dialog.cpp b/src/yuzu/configuration/configure_dialog.cpp
index 6028135c5..167323831 100644
--- a/src/yuzu/configuration/configure_dialog.cpp
+++ b/src/yuzu/configuration/configure_dialog.cpp
@@ -16,6 +16,10 @@
 #include "yuzu/configuration/configure_input_player.h"
 #include "yuzu/hotkeys.h"
 
+static void CloseDialog(ConfigureDialog *dialog) {
+    dialog->close();
+}
+
 ConfigureDialog::ConfigureDialog(QWidget* parent, HotkeyRegistry& registry,
                                  InputCommon::InputSubsystem* input_subsystem)
     : QDialog(parent), ui(new Ui::ConfigureDialog), registry(registry) {
@@ -27,6 +31,8 @@ ConfigureDialog::ConfigureDialog(QWidget* parent, HotkeyRegistry& registry,
 
     ui->inputTab->Initialize(input_subsystem);
 
+    ui->generalTab->SetResetCallback(&CloseDialog, this);
+
     SetConfiguration();
     PopulateSelectionList();
 
diff --git a/src/yuzu/configuration/configure_general.cpp b/src/yuzu/configuration/configure_general.cpp
index a107cd3e1..28aaf47be 100644
--- a/src/yuzu/configuration/configure_general.cpp
+++ b/src/yuzu/configuration/configure_general.cpp
@@ -3,14 +3,14 @@
 // Refer to the license.txt file included.
 
 #include <QCheckBox>
-#include <QSpinBox>
 #include <QMessageBox>
+#include <QSpinBox>
 #include "common/settings.h"
 #include "core/core.h"
 #include "ui_configure_general.h"
+#include "yuzu/configuration/config.h"
 #include "yuzu/configuration/configuration_shared.h"
 #include "yuzu/configuration/configure_general.h"
-#include "yuzu/configuration/config.h"
 #include "yuzu/uisettings.h"
 
 ConfigureGeneral::ConfigureGeneral(QWidget* parent)
@@ -46,6 +46,8 @@ void ConfigureGeneral::SetConfiguration() {
     ui->toggle_frame_limit->setChecked(Settings::values.use_frame_limit.GetValue());
     ui->frame_limit->setValue(Settings::values.frame_limit.GetValue());
 
+    ui->button_reset_defaults->setEnabled(runtime_lock);
+
     if (Settings::IsConfiguringGlobal()) {
         ui->frame_limit->setEnabled(Settings::values.use_frame_limit.GetValue());
     } else {
@@ -54,13 +56,24 @@ void ConfigureGeneral::SetConfiguration() {
     }
 }
 
+// Called to set the callback when resetting settings to defaults
+void ConfigureGeneral::SetResetCallback(void (*callback)(ConfigureDialog*),
+                                        ConfigureDialog* param) {
+    ResetCallback = callback;
+    reset_callback_param = param;
+}
+
 void ConfigureGeneral::ResetDefaults() {
     QMessageBox::StandardButton answer = QMessageBox::question(
-        this, tr("yuzu"), tr("Are you sure you want to <b>reset your settings</b>?"),
+        this, tr("yuzu"),
+        tr("This reset all settings and remove all per-game configurations. This will not delete "
+           "game directories, profiles, or input profiles. Proceed?"),
         QMessageBox::Yes | QMessageBox::No, QMessageBox::No);
     if (answer == QMessageBox::No)
         return;
-    UISettings::values.
+    UISettings::values.reset_to_defaults = true;
+    UISettings::values.is_game_list_reload_pending.exchange(true);
+    (*ResetCallback)(reset_callback_param);
 }
 
 void ConfigureGeneral::ApplyConfiguration() {
@@ -119,6 +132,8 @@ void ConfigureGeneral::SetupPerGameUI() {
     ui->toggle_background_pause->setVisible(false);
     ui->toggle_hide_mouse->setVisible(false);
 
+    ui->button_reset_defaults->setVisible(false);
+
     ConfigurationShared::SetColoredTristate(ui->toggle_frame_limit,
                                             Settings::values.use_frame_limit, use_frame_limit);
     ConfigurationShared::SetColoredTristate(ui->use_multi_core, Settings::values.use_multi_core,
diff --git a/src/yuzu/configuration/configure_general.h b/src/yuzu/configuration/configure_general.h
index 3d8a1dae0..2a7741ad9 100644
--- a/src/yuzu/configuration/configure_general.h
+++ b/src/yuzu/configuration/configure_general.h
@@ -7,6 +7,8 @@
 #include <memory>
 #include <QWidget>
 
+class ConfigureDialog;
+
 namespace ConfigurationShared {
 enum class CheckState;
 }
@@ -24,6 +26,7 @@ public:
     explicit ConfigureGeneral(QWidget* parent = nullptr);
     ~ConfigureGeneral() override;
 
+    void SetResetCallback(void (*callback)(ConfigureDialog*), ConfigureDialog *param);
     void ResetDefaults();
     void ApplyConfiguration();
 
@@ -35,6 +38,9 @@ private:
 
     void SetupPerGameUI();
 
+    void (*ResetCallback)(ConfigureDialog*);
+    ConfigureDialog *reset_callback_param;
+
     std::unique_ptr<Ui::ConfigureGeneral> ui;
 
     ConfigurationShared::CheckState use_frame_limit;
diff --git a/src/yuzu/configuration/configure_general.ui b/src/yuzu/configuration/configure_general.ui
index ae8ed5ca5..bc7041090 100644
--- a/src/yuzu/configuration/configure_general.ui
+++ b/src/yuzu/configuration/configure_general.ui
@@ -6,7 +6,7 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>300</width>
+    <width>329</width>
     <height>407</height>
    </rect>
   </property>
@@ -91,13 +91,6 @@
        </layout>
       </widget>
      </item>
-      <item alignment="Qt::AlignRight">
-        <widget class="QPushButton" name="button_reset_defaults">
-          <property name="text">
-            <string>Reset All Settings</string>
-          </property>
-        </widget>
-      </item>
      <item>
       <spacer name="verticalSpacer">
        <property name="orientation">
@@ -111,6 +104,45 @@
        </property>
       </spacer>
      </item>
+     <item>
+      <layout class="QHBoxLayout" name="layout_reset">
+       <property name="spacing">
+        <number>6</number>
+       </property>
+       <property name="leftMargin">
+        <number>5</number>
+       </property>
+       <property name="topMargin">
+        <number>5</number>
+       </property>
+       <property name="rightMargin">
+        <number>5</number>
+       </property>
+       <property name="bottomMargin">
+        <number>5</number>
+       </property>
+       <item>
+        <widget class="QPushButton" name="button_reset_defaults">
+         <property name="text">
+          <string>Reset All Settings</string>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <spacer name="spacer_reset">
+         <property name="orientation">
+          <enum>Qt::Horizontal</enum>
+         </property>
+         <property name="sizeHint" stdset="0">
+          <size>
+           <width>40</width>
+           <height>20</height>
+          </size>
+         </property>
+        </spacer>
+       </item>
+      </layout>
+     </item>
     </layout>
    </item>
   </layout>
diff --git a/src/yuzu/main.cpp b/src/yuzu/main.cpp
index 838bb6926..e5a2fdf8c 100644
--- a/src/yuzu/main.cpp
+++ b/src/yuzu/main.cpp
@@ -2587,14 +2587,49 @@ void GMainWindow::OnConfigure() {
             &GMainWindow::OnLanguageChanged);
 
     const auto result = configure_dialog.exec();
-    if (result != QDialog::Accepted && !UISettings::values.configuration_applied) {
+    if (result != QDialog::Accepted && !UISettings::values.configuration_applied &&
+        !UISettings::values.reset_to_defaults) {
+        // Runs if the user hit Cancel or closed the window, and did not ever press the Apply button
+        // or `Reset to Defaults` button
         return;
     } else if (result == QDialog::Accepted) {
+        // Only apply new changes if user hit Okay
+        // This is here to avoid applying changes if the user hit Apply, made some changes, then hit
+        // Cancel
         configure_dialog.ApplyConfiguration();
-        controller_dialog->refreshConfiguration();
-    }
+    } else if (UISettings::values.reset_to_defaults) {
+        LOG_INFO(Frontend, "Resetting all settings to defaults");
+        if (!Common::FS::RemoveFile(config->GetConfigFilePath())) {
+            LOG_WARNING(Frontend, "Failed to remove configuration file");
+        }
+        if (!Common::FS::RemoveDirContentsRecursively(
+                Common::FS::GetYuzuPath(Common::FS::YuzuPath::ConfigDir) / "custom")) {
+            LOG_WARNING(Frontend, "Failed to remove custom configuration files");
+        }
+        if (!Common::FS::RemoveDirRecursively(
+                Common::FS::GetYuzuPath(Common::FS::YuzuPath::CacheDir) / "game_list")) {
+            LOG_WARNING(Frontend, "Failed to remove game metadata cache files");
+        }
 
-    configure_dialog.ApplyConfiguration();
+        // Explicitly save the game directories, since reinitializing config does not do so.
+        QVector<UISettings::GameDir> old_game_dirs = UISettings::values.game_dirs;
+        QVector<u64> old_favorited_ids = UISettings::values.favorited_ids;
+
+        Settings::values.disabled_addons.clear();
+
+        config = std::make_unique<Config>();
+        UISettings::values.reset_to_defaults = false;
+
+        UISettings::values.game_dirs = old_game_dirs;
+        UISettings::values.favorited_ids = old_favorited_ids;
+
+        InitializeRecentFileMenuActions();
+
+        SetDefaultUIGeometry();
+        RestoreUIState();
+
+        ShowTelemetryCallout();
+    }
     controller_dialog->refreshConfiguration();
     InitializeHotkeys();
 
diff --git a/src/yuzu/uisettings.h b/src/yuzu/uisettings.h
index 49122ec32..cdcb83f9f 100644
--- a/src/yuzu/uisettings.h
+++ b/src/yuzu/uisettings.h
@@ -97,6 +97,7 @@ struct Values {
     bool cache_game_list;
 
     bool configuration_applied;
+    bool reset_to_defaults;
 };
 
 extern Values values;