diff --git a/src/citra_qt/bootmanager.cpp b/src/citra_qt/bootmanager.cpp
index 4be410fe00c9238dfcdc9493f3bd4e9ad062b600..66a9e6fba25cc9622a1d8c3aacae5f3ae7cc8e81 100644
--- a/src/citra_qt/bootmanager.cpp
+++ b/src/citra_qt/bootmanager.cpp
@@ -48,7 +48,7 @@ void EmuThread::run() {
             Core::RunLoop();
 
             was_active = running || exec_step;
-            if (!was_active)
+            if (!was_active && !stop_run)
                 emit DebugModeEntered();
         } else if (exec_step) {
             if (!was_active)
@@ -273,10 +273,10 @@ void GRenderWindow::OnMinimalClientAreaChangeRequest(const std::pair<unsigned,un
     setMinimumSize(minimal_size.first, minimal_size.second);
 }
 
-void GRenderWindow::OnEmulationStarted(EmuThread* emu_thread) {
+void GRenderWindow::OnEmulationStarting(EmuThread* emu_thread) {
     this->emu_thread = emu_thread;
 }
 
-void GRenderWindow::OnEmulationStopped() {
+void GRenderWindow::OnEmulationStopping() {
     emu_thread = nullptr;
 }
diff --git a/src/citra_qt/bootmanager.h b/src/citra_qt/bootmanager.h
index e575221877a0dde6b812f36af5cf97a97ea48a18..715faf2d7a8922250c2af2e19798207146b50d22 100644
--- a/src/citra_qt/bootmanager.h
+++ b/src/citra_qt/bootmanager.h
@@ -51,9 +51,9 @@ public:
     bool IsRunning() { return running; }
 
     /**
-     * Requests for the emulation thread to stop running and shutdown emulation
+     * Requests for the emulation thread to stop running
      */
-    void RequestShutdown() {
+    void RequestStop() {
         stop_run = true;
         running = false;
     };
@@ -115,8 +115,8 @@ public:
 public slots:
     void moveContext();  // overridden
 
-    void OnEmulationStarted(EmuThread* emu_thread);
-    void OnEmulationStopped();
+    void OnEmulationStarting(EmuThread* emu_thread);
+    void OnEmulationStopping();
 
 private:
     void OnMinimalClientAreaChangeRequest(const std::pair<unsigned,unsigned>& minimal_size) override;
diff --git a/src/citra_qt/debugger/disassembler.cpp b/src/citra_qt/debugger/disassembler.cpp
index 6400bb8560dc102e82fc0e0a59f5270e7fa6c26e..08c6b49bd158c5dd9d2f0fe213c27be6fb00075e 100644
--- a/src/citra_qt/debugger/disassembler.cpp
+++ b/src/citra_qt/debugger/disassembler.cpp
@@ -241,7 +241,7 @@ int DisassemblerWidget::SelectedRow() {
     return disasm_ui.treeView->selectionModel()->currentIndex().row();
 }
 
-void DisassemblerWidget::OnEmulationStarted(EmuThread* emu_thread) {
+void DisassemblerWidget::OnEmulationStarting(EmuThread* emu_thread) {
     this->emu_thread = emu_thread;
 
     model = new DisassemblerModel(this);
@@ -256,7 +256,7 @@ void DisassemblerWidget::OnEmulationStarted(EmuThread* emu_thread) {
     setEnabled(true);
 }
 
-void DisassemblerWidget::OnEmulationStopped() {
+void DisassemblerWidget::OnEmulationStopping() {
     disasm_ui.treeView->setModel(nullptr);
     delete model;
     emu_thread = nullptr;
diff --git a/src/citra_qt/debugger/disassembler.h b/src/citra_qt/debugger/disassembler.h
index b771e95b742350905e49ba935fbf0a271c40d136..45b0a7e081be2529af2a2784b3d0871e88127a09 100644
--- a/src/citra_qt/debugger/disassembler.h
+++ b/src/citra_qt/debugger/disassembler.h
@@ -65,8 +65,8 @@ public slots:
     void OnDebugModeEntered();
     void OnDebugModeLeft();
 
-    void OnEmulationStarted(EmuThread* emu_thread);
-    void OnEmulationStopped();
+    void OnEmulationStarting(EmuThread* emu_thread);
+    void OnEmulationStopping();
 
 private:
     // returns -1 if no row is selected
diff --git a/src/citra_qt/debugger/registers.cpp b/src/citra_qt/debugger/registers.cpp
index 2b1e8ceb849ea4c95ebfed57c30ce7b13b14d4bb..5527a2afd97bc94f71c039b59d3ae5f9204ccf6a 100644
--- a/src/citra_qt/debugger/registers.cpp
+++ b/src/citra_qt/debugger/registers.cpp
@@ -71,11 +71,11 @@ void RegistersWidget::OnDebugModeEntered() {
 void RegistersWidget::OnDebugModeLeft() {
 }
 
-void RegistersWidget::OnEmulationStarted(EmuThread* emu_thread) {
+void RegistersWidget::OnEmulationStarting(EmuThread* emu_thread) {
     setEnabled(true);
 }
 
-void RegistersWidget::OnEmulationStopped() {
+void RegistersWidget::OnEmulationStopping() {
     // Reset widget text
     for (int i = 0; i < 16; ++i)
         registers->child(i)->setText(1, QString(""));
diff --git a/src/citra_qt/debugger/registers.h b/src/citra_qt/debugger/registers.h
index 0356de290a903fe399bac00b82c3b3b5b29ddab7..68e3fb908c041b3fa4e6b287d428106a9b7e3019 100644
--- a/src/citra_qt/debugger/registers.h
+++ b/src/citra_qt/debugger/registers.h
@@ -21,8 +21,8 @@ public slots:
     void OnDebugModeEntered();
     void OnDebugModeLeft();
 
-    void OnEmulationStarted(EmuThread* emu_thread);
-    void OnEmulationStopped();
+    void OnEmulationStarting(EmuThread* emu_thread);
+    void OnEmulationStopping();
 
 private:
     Ui::ARMRegisters cpu_regs_ui;
diff --git a/src/citra_qt/main.cpp b/src/citra_qt/main.cpp
index f21c55db64d45c8332e55c099fff10fd421cc2b0..c3e6377929089ec57d1ad926b53c51c3beeabb35 100644
--- a/src/citra_qt/main.cpp
+++ b/src/citra_qt/main.cpp
@@ -139,12 +139,12 @@ GMainWindow::GMainWindow() : emu_thread(nullptr)
     connect(ui.action_Single_Window_Mode, SIGNAL(triggered(bool)), this, SLOT(ToggleWindowMode()));
     connect(ui.action_Hotkeys, SIGNAL(triggered()), this, SLOT(OnOpenHotkeysDialog()));
 
-    connect(this, SIGNAL(EmulationStarted(EmuThread*)), disasmWidget, SLOT(OnEmulationStarted(EmuThread*)));
-    connect(this, SIGNAL(EmulationStopped()), disasmWidget, SLOT(OnEmulationStopped()));
-    connect(this, SIGNAL(EmulationStarted(EmuThread*)), registersWidget, SLOT(OnEmulationStarted(EmuThread*)));
-    connect(this, SIGNAL(EmulationStopped()), registersWidget, SLOT(OnEmulationStopped()));
-    connect(this, SIGNAL(EmulationStarted(EmuThread*)), render_window, SLOT(OnEmulationStarted(EmuThread*)));
-    connect(this, SIGNAL(EmulationStopped()), render_window, SLOT(OnEmulationStopped()));
+    connect(this, SIGNAL(EmulationStarting(EmuThread*)), disasmWidget, SLOT(OnEmulationStarting(EmuThread*)));
+    connect(this, SIGNAL(EmulationStopping()), disasmWidget, SLOT(OnEmulationStopping()));
+    connect(this, SIGNAL(EmulationStarting(EmuThread*)), registersWidget, SLOT(OnEmulationStarting(EmuThread*)));
+    connect(this, SIGNAL(EmulationStopping()), registersWidget, SLOT(OnEmulationStopping()));
+    connect(this, SIGNAL(EmulationStarting(EmuThread*)), render_window, SLOT(OnEmulationStarting(EmuThread*)));
+    connect(this, SIGNAL(EmulationStopping()), render_window, SLOT(OnEmulationStopping()));
 
     // Setup hotkeys
     RegisterHotkey("Main Window", "Load File", QKeySequence::Open);
@@ -210,7 +210,7 @@ void GMainWindow::BootGame(std::string filename) {
 
     // Create and start the emulation thread
     emu_thread = Common::make_unique<EmuThread>(render_window);
-    emit EmulationStarted(emu_thread.get());
+    emit EmulationStarting(emu_thread.get());
     emu_thread->start();
 
     // BlockingQueuedConnection is important here, it makes sure we've finished refreshing our views before the CPU continues
@@ -230,25 +230,16 @@ void GMainWindow::BootGame(std::string filename) {
 }
 
 void GMainWindow::ShutdownGame() {
-    // Shutdown the emulation thread
-    emu_thread->RequestShutdown();
-
-    // Disconnect signals that are attached to the current emulation thread
-    disconnect(emu_thread.get(), SIGNAL(DebugModeEntered()), disasmWidget, SLOT(OnDebugModeEntered()));
-    disconnect(emu_thread.get(), SIGNAL(DebugModeEntered()), registersWidget, SLOT(OnDebugModeEntered()));
-    disconnect(emu_thread.get(), SIGNAL(DebugModeEntered()), callstackWidget, SLOT(OnDebugModeEntered()));
-    disconnect(emu_thread.get(), SIGNAL(DebugModeLeft()), disasmWidget, SLOT(OnDebugModeLeft()));
-    disconnect(emu_thread.get(), SIGNAL(DebugModeLeft()), registersWidget, SLOT(OnDebugModeLeft()));
-    disconnect(emu_thread.get(), SIGNAL(DebugModeLeft()), callstackWidget, SLOT(OnDebugModeLeft()));
+    emu_thread->RequestStop();
 
     // Release emu threads from any breakpoints
-    // This belongs after RequestShutdown() and before wait() because if emulation stops on a GPU
-    // breakpoint after (or before) RequestShutdown() is called, the emulation would never be able
+    // This belongs after RequestStop() and before wait() because if emulation stops on a GPU
+    // breakpoint after (or before) RequestStop() is called, the emulation would never be able
     // to continue out to the main loop and terminate. Thus wait() would hang forever.
     // TODO(bunnei): This function is not thread safe, but it's being used as if it were
     Pica::g_debug_context->ClearBreakpoints();
 
-    emit EmulationStopped();
+    emit EmulationStopping();
 
     // Wait for emulation thread to complete and delete it
     emu_thread->wait();