diff --git a/src/citra_qt/bootmanager.cpp b/src/citra_qt/bootmanager.cpp
index 16661767f3e219418395043ca71def610359034e..0fdf0c600c85e78f49f45635580e22c79299f024 100644
--- a/src/citra_qt/bootmanager.cpp
+++ b/src/citra_qt/bootmanager.cpp
@@ -40,7 +40,6 @@ void EmuThread::run() {
             Core::System::ResultStatus result = Core::System::GetInstance().RunLoop();
             if (result != Core::System::ResultStatus::Success) {
                 emit ErrorThrown(result);
-                break;
             }
 
             was_active = running || exec_step;
diff --git a/src/citra_qt/main.cpp b/src/citra_qt/main.cpp
index e24c48e901536002e1414334ea6cb47de42404c6..cc38cfc0ee5ac737d059629c4ec4eda40ac50c1d 100644
--- a/src/citra_qt/main.cpp
+++ b/src/citra_qt/main.cpp
@@ -300,7 +300,7 @@ bool GMainWindow::LoadROM(const QString& filename) {
     render_window->MakeCurrent();
 
     if (!gladLoadGL()) {
-        QMessageBox::critical(this, tr("Error while starting Citra!"),
+        QMessageBox::critical(this, tr("Error while initializing OpenGL 3.3 Core!"),
                               tr("Your GPU may not support OpenGL 3.3, or you do not"
                                  "have the latest graphics driver."));
         return false;
@@ -329,7 +329,7 @@ bool GMainWindow::LoadROM(const QString& filename) {
             QMessageBox::critical(
                 this, tr("Error while loading ROM!"),
                 tr("The game that you are trying to load must be decrypted before being used with "
-                   "Citra.<br/><br/>"
+                   "Citra. A real 3DS is required.<br/><br/>"
                    "For more information on dumping and decrypting games, please see the following "
                    "wiki pages: <ul>"
                    "<li><a href='https://citra-emu.org/wiki/Dumping-Game-Cartridges/'>Dumping Game "
@@ -344,10 +344,17 @@ bool GMainWindow::LoadROM(const QString& filename) {
                                   tr("The ROM format is not supported."));
             break;
 
-        case Core::System::ResultStatus::ErrorOpenGL:
-            QMessageBox::critical(this, tr("Error while loading OpenGL!"),
-                                  tr("Your GPU may not support OpenGL 3.3, or you do not "
-                                     "have the latest graphics driver."));
+        case Core::System::ResultStatus::ErrorVideoCore:
+            QMessageBox::critical(
+                this, tr("An error occured in the video core."),
+                tr("Citra has encountered an error while running the video core,  please see the "
+                   "log for more details."
+                   "For more information on accessing the log, please see the following page: "
+                   "<a href='https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>How "
+                   "to "
+                   "Upload the Log File</a>."
+                   "Ensure that you have the latest graphics drivers for your GPU."));
+
             break;
 
         default:
@@ -632,9 +639,6 @@ void GMainWindow::UpdateStatusBar() {
 }
 
 void GMainWindow::OnCoreError(Core::System::ResultStatus result) {
-    // Waiting for the dialog to be closed before shutting down causes a segfault, maybe because of
-    // the profiler
-    ShutdownGame();
     switch (result) {
     case Core::System::ResultStatus::ErrorSystemFiles:
         QMessageBox::critical(
@@ -664,13 +668,13 @@ void GMainWindow::OnCoreError(Core::System::ResultStatus result) {
             ".");
         break;
 
-    case Core::System::ResultStatus::ErrorUnknown:
+    default:
         QMessageBox::critical(
             this, "Fatal Error",
-            "Citra has encountered a fatal error, please see the log for more details.");
-        break;
-
-    default:
+            "Citra has encountered a fatal error, please see the log for more details. "
+            "For more information on accessing the log, please see the following page: "
+            "<a href='https://community.citra-emu.org/t/how-to-upload-the-log-file/296'>How to "
+            "Upload the Log File</a>.");
         break;
     }
 }
@@ -679,9 +683,10 @@ bool GMainWindow::ConfirmClose() {
     if (emu_thread == nullptr || !UISettings::values.confirm_before_closing)
         return true;
 
-    return QMessageBox::question(this, tr("Citra"), tr("Are you sure you want to close Citra?"),
-                                 QMessageBox::Yes | QMessageBox::No,
-                                 QMessageBox::No) != QMessageBox::No;
+    auto answer =
+        QMessageBox::question(this, tr("Citra"), tr("Are you sure you want to close Citra?"),
+                              QMessageBox::Yes | QMessageBox::No, QMessageBox::No);
+    return answer != QMessageBox::No;
 }
 
 void GMainWindow::closeEvent(QCloseEvent* event) {
diff --git a/src/core/core.cpp b/src/core/core.cpp
index 1861bfa9b68122f460ce49b435fc9f0be6145b7a..2a9664cb4da20172a7e49086a6fc717a58567230 100644
--- a/src/core/core.cpp
+++ b/src/core/core.cpp
@@ -3,6 +3,9 @@
 // Refer to the license.txt file included.
 
 #include <memory>
+#include <utility>
+
+#include <boost/optional.hpp>
 
 #include "audio_core/audio_core.h"
 #include "common/logging/log.h"
@@ -26,6 +29,7 @@ namespace Core {
 /*static*/ System System::s_instance;
 
 System::ResultStatus System::RunLoop(int tight_loop) {
+    this->status = ResultStatus::Success;
     if (!cpu_core) {
         return ResultStatus::ErrorNotInitialized;
     }
@@ -73,14 +77,14 @@ System::ResultStatus System::Load(EmuWindow* emu_window, const std::string& file
         LOG_CRITICAL(Core, "Failed to obtain loader for %s!", filepath.c_str());
         return ResultStatus::ErrorGetLoader;
     }
-    boost::optional<u32> system_mode = boost::none;
+    std::pair<boost::optional<u32>, Loader::ResultStatus> system_mode =
+        app_loader->LoadKernelSystemMode();
 
-    Loader::ResultStatus load_result{app_loader->LoadKernelSystemMode(system_mode)};
-    if (!system_mode) {
-        LOG_CRITICAL(Core, "Failed to determine system mode (Error %i)!", load_result);
+    if (system_mode.second != Loader::ResultStatus::Success) {
+        LOG_CRITICAL(Core, "Failed to determine system mode (Error %i)!", system_mode.second);
         System::Shutdown();
 
-        switch (load_result) {
+        switch (system_mode.second) {
         case Loader::ResultStatus::ErrorEncrypted:
             return ResultStatus::ErrorLoader_ErrorEncrypted;
         case Loader::ResultStatus::ErrorInvalidFormat:
@@ -90,15 +94,15 @@ System::ResultStatus System::Load(EmuWindow* emu_window, const std::string& file
         }
     }
 
-    ResultStatus init_result{Init(emu_window, system_mode.get())};
+    ResultStatus init_result{Init(emu_window, system_mode.first.get())};
     if (init_result != ResultStatus::Success) {
         LOG_CRITICAL(Core, "Failed to initialize system (Error %i)!", init_result);
         System::Shutdown();
         return init_result;
     }
 
-    load_result = app_loader->Load();
-    if (Loader::ResultStatus::Success != load_result) {
+    Loader::ResultStatus load_result = app_loader->Load();
+    if (load_result != Loader::ResultStatus::Success) {
         LOG_CRITICAL(Core, "Failed to load ROM (Error %i)!", load_result);
         System::Shutdown();
 
@@ -154,7 +158,7 @@ System::ResultStatus System::Init(EmuWindow* emu_window, u32 system_mode) {
     GDBStub::Init();
 
     if (!VideoCore::Init(emu_window)) {
-        return ResultStatus::ErrorOpenGL;
+        return ResultStatus::ErrorVideoCore;
     }
 
     LOG_DEBUG(Core, "Initialized OK");
diff --git a/src/core/core.h b/src/core/core.h
index 0963f273e1740f75742ff9827d7f3804ee9a4023..a7b4f8d626d9902b8fee1f593db2553b3d981359 100644
--- a/src/core/core.h
+++ b/src/core/core.h
@@ -43,7 +43,6 @@ public:
         ErrorSystemFiles,               ///< Error in finding system files
         ErrorSharedFont,                ///< Error in finding shared font
         ErrorVideoCore,                 ///< Error in the video core
-        ErrorOpenGL,                    ///< Error when initializing OpenGL
         ErrorUnknown                    ///< Any other error
     };
 
diff --git a/src/core/file_sys/archive_ncch.cpp b/src/core/file_sys/archive_ncch.cpp
index 89455e39c22b00b940f03909553270352055ee2e..bf4e0916b70916db88961c390d3a191f14ef3758 100644
--- a/src/core/file_sys/archive_ncch.cpp
+++ b/src/core/file_sys/archive_ncch.cpp
@@ -37,7 +37,8 @@ ResultVal<std::unique_ptr<ArchiveBackend>> ArchiveFactory_NCCH::Open(const Path&
     auto file = std::make_shared<FileUtil::IOFile>(file_path, "rb");
 
     if (!file->IsOpen()) {
-        return ResultCode(-1); // TODO(Subv): Find the right error code
+        return ResultCode(ErrorDescription::FS_NotFound, ErrorModule::FS, ErrorSummary::NotFound,
+                          ErrorLevel::Status);
     }
     auto size = file->GetSize();
 
diff --git a/src/core/hle/service/fs/archive.cpp b/src/core/hle/service/fs/archive.cpp
index 632712f2cc728f652072fb3ff722191fb74ab86c..6d1a49d92ffd4b1d40b8485ef0a69e450f9c74a3 100644
--- a/src/core/hle/service/fs/archive.cpp
+++ b/src/core/hle/service/fs/archive.cpp
@@ -257,11 +257,9 @@ ResultVal<ArchiveHandle> OpenArchive(ArchiveIdCode id_code, FileSys::Path& archi
     LOG_TRACE(Service_FS, "Opening archive with id code 0x%08X", id_code);
 
     auto itr = id_code_map.find(id_code);
-    if (itr == id_code_map.end()) {
-        // TODO: Verify error against hardware
-        return ResultCode(ErrorDescription::NotFound, ErrorModule::FS, ErrorSummary::NotFound,
-                          ErrorLevel::Permanent);
-    }
+    if (itr == id_code_map.end())
+        return ResultCode(ErrorDescription::FS_NotFound, ErrorModule::FS, ErrorSummary::NotFound,
+                          ErrorLevel::Status);
 
     CASCADE_RESULT(std::unique_ptr<ArchiveBackend> res, itr->second->Open(archive_path));
 
diff --git a/src/core/hle/service/fs/fs_user.cpp b/src/core/hle/service/fs/fs_user.cpp
index 5a44371235d34e64f6aee9ffe9d313b8a60c89f3..0538ffc9c58d316724509e275e2a237ccc61431c 100644
--- a/src/core/hle/service/fs/fs_user.cpp
+++ b/src/core/hle/service/fs/fs_user.cpp
@@ -133,12 +133,11 @@ static void OpenFileDirectly(Service::Interface* self) {
         LOG_ERROR(Service_FS,
                   "failed to get a handle for archive archive_id=0x%08X archive_path=%s",
                   static_cast<u32>(archive_id), archive_path.DebugStr().c_str());
-        if (static_cast<u32>(archive_id) == 0x2345678A) {
-            Core::System::GetInstance().SetStatus(Core::System::ResultStatus::ErrorSystemFiles);
-            return;
-        }
         cmd_buff[1] = archive_handle.Code().raw;
         cmd_buff[3] = 0;
+        if (static_cast<FS::ArchiveIdCode>(archive_id) == ArchiveIdCode::NCCH) {
+            Core::System::GetInstance().SetStatus(Core::System::ResultStatus::ErrorSystemFiles);
+        }
         return;
     }
     SCOPE_EXIT({ CloseArchive(*archive_handle); });
diff --git a/src/core/loader/loader.h b/src/core/loader/loader.h
index 21f73503eb96c9fca4b5799122f9566c740498c3..0a2d4a10e6ae97402c8ba45f4f2d2ca3000d38a5 100644
--- a/src/core/loader/loader.h
+++ b/src/core/loader/loader.h
@@ -8,8 +8,11 @@
 #include <initializer_list>
 #include <memory>
 #include <string>
+#include <utility>
 #include <vector>
+
 #include <boost/optional.hpp>
+
 #include "common/common_types.h"
 #include "common/file_util.h"
 
@@ -100,13 +103,11 @@ public:
      * Loads the system mode that this application needs.
      * This function defaults to 2 (96MB allocated to the application) if it can't read the
      * information.
-     * @param boost::optional<u32> Reference to Boost optional to store system mode.
-     * @ return Result of operation.
+     * @return A pair with the system mode (If found) and the result.
      */
-    virtual ResultStatus LoadKernelSystemMode(boost::optional<u32>& system_mode) {
+    virtual std::pair<boost::optional<u32>, ResultStatus> LoadKernelSystemMode() {
         // 96MB allocated to the application.
-        system_mode = 2;
-        return ResultStatus::Success;
+        return std::make_pair(2, ResultStatus::Success);
     }
 
     /**
diff --git a/src/core/loader/ncch.cpp b/src/core/loader/ncch.cpp
index 1a20762e4d9331ae4ce22c4264ae467e5514be91..ffc019560cb389553cf3fa48b6ba6578cb17fc98 100644
--- a/src/core/loader/ncch.cpp
+++ b/src/core/loader/ncch.cpp
@@ -121,19 +121,16 @@ FileType AppLoader_NCCH::IdentifyType(FileUtil::IOFile& file) {
     return FileType::Error;
 }
 
-ResultStatus AppLoader_NCCH::LoadKernelSystemMode(boost::optional<u32>& system_mode) {
+std::pair<boost::optional<u32>, ResultStatus> AppLoader_NCCH::LoadKernelSystemMode() {
     if (!is_loaded) {
         ResultStatus res = LoadExeFS();
         if (res != ResultStatus::Success) {
-            // Set the system mode as invalid.
-            system_mode = boost::none;
-            // Return the error code.
-            return res;
+            return std::make_pair(boost::none, res);
         }
     }
     // Set the system mode as the one from the exheader.
-    system_mode = exheader_header.arm11_system_local_caps.system_mode.Value();
-    return ResultStatus::Success;
+    return std::make_pair(exheader_header.arm11_system_local_caps.system_mode.Value(),
+                          ResultStatus::Success);
 }
 
 ResultStatus AppLoader_NCCH::LoadExec() {
diff --git a/src/core/loader/ncch.h b/src/core/loader/ncch.h
index 269fe4f49e9605284ba44d1b8a2ddf0f17fd0264..712d496a4ac75068425e5a2f46a4843285ac27e9 100644
--- a/src/core/loader/ncch.h
+++ b/src/core/loader/ncch.h
@@ -179,10 +179,9 @@ public:
 
     /**
      * Loads the Exheader and returns the system mode for this application.
-     * @param boost::optional<u32> Reference to Boost optional to store system mode.
-     * @return Result of operation.
+     * @return A pair with the system mode (If found) and the result.
      */
-    ResultStatus LoadKernelSystemMode(boost::optional<u32>& system_mode) override;
+    std::pair<boost::optional<u32>, ResultStatus> LoadKernelSystemMode() override;
 
     ResultStatus ReadCode(std::vector<u8>& buffer) override;