diff --git a/src/yuzu/CMakeLists.txt b/src/yuzu/CMakeLists.txt
index 9379d9110f..53acba66b0 100644
--- a/src/yuzu/CMakeLists.txt
+++ b/src/yuzu/CMakeLists.txt
@@ -29,6 +29,8 @@ add_executable(yuzu
configuration/configure_input.h
configuration/configure_system.cpp
configuration/configure_system.h
+ configuration/configure_per_game_dialog.cpp
+ configuration/configure_per_game_dialog.h
configuration/configure_web.cpp
configuration/configure_web.h
debugger/graphics/graphics_breakpoint_observer.cpp
@@ -74,6 +76,7 @@ set(UIS
configuration/configure_general.ui
configuration/configure_graphics.ui
configuration/configure_input.ui
+ configuration/configure_per_game.ui
configuration/configure_system.ui
configuration/configure_web.ui
hotkeys.ui
diff --git a/src/yuzu/configuration/configure_per_game.ui b/src/yuzu/configuration/configure_per_game.ui
new file mode 100644
index 0000000000..df4f291b87
--- /dev/null
+++ b/src/yuzu/configuration/configure_per_game.ui
@@ -0,0 +1,125 @@
+
+
+ ConfigurePerGameDialog
+
+
+
+ 0
+ 0
+ 461
+ 500
+
+
+
+ yuzu Game Configuration
+
+
+ -
+
+
+ 0
+
+
+
+ General
+
+
+
+
+ Input
+
+
+
+
+ Graphics
+
+
+
+
+ Audio
+
+
+
+
+ Debug
+
+
+
+
+ -
+
+
+ QDialogButtonBox::Cancel|QDialogButtonBox::Ok
+
+
+
+
+
+
+
+ ConfigurePerGameGeneral
+ QWidget
+ configuration/configure_per_general.h
+ 1
+
+
+ ConfigureInput
+ QWidget
+ configuration/configure_input.h
+ 1
+
+
+ ConfigureGraphics
+ QWidget
+ configuration/configure_graphics.h
+ 1
+
+
+ ConfigureAudio
+ QWidget
+ configuration/configure_audio.h
+ 1
+
+
+ ConfigureDebug
+ QWidget
+ configuration/configure_debug.h
+ 1
+
+
+
+
+
+ buttonBox
+ accepted()
+ ConfigurePerGameDialog
+ accept()
+
+
+ 220
+ 380
+
+
+ 220
+ 200
+
+
+
+
+ buttonBox
+ rejected()
+ ConfigurePerGameDialog
+ reject()
+
+
+ 220
+ 380
+
+
+ 220
+ 200
+
+
+
+
+
diff --git a/src/yuzu/configuration/configure_per_game_dialog.cpp b/src/yuzu/configuration/configure_per_game_dialog.cpp
new file mode 100644
index 0000000000..b379cda127
--- /dev/null
+++ b/src/yuzu/configuration/configure_per_game_dialog.cpp
@@ -0,0 +1,45 @@
+// Copyright 2016 Citra Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#include "core/settings.h"
+#include "ui_configure_per_game.h"
+#include "yuzu/configuration/config.h"
+#include "yuzu/configuration/configure_per_game_dialog.h"
+
+ConfigurePerGameDialog::ConfigurePerGameDialog(QWidget* parent, FileSys::VirtualFile file,
+ const PerGameValuesChange& change)
+ : QDialog(parent), ui(new Ui::ConfigurePerGameDialog) {
+ ui->setupUi(this);
+ ui->generalTab->loadFromFile(std::move(file));
+ ui->generalTab->loadValuesChange(change);
+ ui->inputTab->setPerGame(true);
+ ui->inputTab->loadValuesChange(change);
+ ui->graphicsTab->setPerGame(true);
+ ui->graphicsTab->loadValuesChange(change);
+ ui->audioTab->setPerGame(true);
+ ui->audioTab->loadValuesChange(change);
+ ui->debugTab->setPerGame(true);
+ ui->debugTab->loadValuesChange(change);
+ this->setConfiguration();
+}
+
+ConfigurePerGameDialog::~ConfigurePerGameDialog() = default;
+
+void ConfigurePerGameDialog::setConfiguration() {}
+
+PerGameValuesChange ConfigurePerGameDialog::applyConfiguration() {
+ PerGameValuesChange out{};
+ ui->generalTab->applyConfiguration();
+ ui->generalTab->mergeValuesChange(out);
+ ui->inputTab->applyConfiguration();
+ ui->inputTab->mergeValuesChange(out);
+ ui->graphicsTab->applyConfiguration();
+ ui->graphicsTab->mergeValuesChange(out);
+ ui->audioTab->applyConfiguration();
+ ui->audioTab->mergeValuesChange(out);
+ ui->debugTab->applyConfiguration();
+ ui->debugTab->mergeValuesChange(out);
+ Settings::Apply();
+ return out;
+}
diff --git a/src/yuzu/configuration/configure_per_game_dialog.h b/src/yuzu/configuration/configure_per_game_dialog.h
new file mode 100644
index 0000000000..febd69afca
--- /dev/null
+++ b/src/yuzu/configuration/configure_per_game_dialog.h
@@ -0,0 +1,29 @@
+// Copyright 2016 Citra Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#pragma once
+
+#include
+#include
+#include "core/file_sys/vfs.h"
+
+namespace Ui {
+class ConfigurePerGameDialog;
+}
+
+class ConfigurePerGameDialog : public QDialog {
+ Q_OBJECT
+
+public:
+ explicit ConfigurePerGameDialog(QWidget* parent, FileSys::VirtualFile file,
+ const PerGameValuesChange& change);
+ ~ConfigurePerGameDialog();
+
+ PerGameValuesChange applyConfiguration();
+
+private:
+ void setConfiguration();
+
+ std::unique_ptr ui;
+};