diff --git a/src/citra/config.cpp b/src/citra/config.cpp
index 432bf2ced..e44931abd 100644
--- a/src/citra/config.cpp
+++ b/src/citra/config.cpp
@@ -82,7 +82,8 @@ void Config::ReadValues() {
         sdl2_config->Get("Controls", "touch_device", "engine:emu_window");
 
     // Core
-    Settings::values.use_cpu_jit = sdl2_config->GetBoolean("Core", "use_cpu_jit", true);
+    Settings::values.cpu_core =
+        static_cast<Settings::CpuCore>(sdl2_config->GetInteger("Core", "cpu_core", 1));
 
     // Renderer
     Settings::values.use_hw_renderer = sdl2_config->GetBoolean("Renderer", "use_hw_renderer", true);
diff --git a/src/citra/default_ini.h b/src/citra/default_ini.h
index 783c4a835..b4914d29f 100644
--- a/src/citra/default_ini.h
+++ b/src/citra/default_ini.h
@@ -67,9 +67,9 @@ motion_device=
 touch_device=
 
 [Core]
-# Whether to use the Just-In-Time (JIT) compiler for CPU emulation
-# 0: Interpreter (slow), 1 (default): JIT (fast)
-use_cpu_jit =
+# Which CPU core to use for CPU emulation
+# 0: Unicorn (slow), 1 (default): Dynarmic (faster)
+cpu_core =
 
 [Renderer]
 # Whether to use software or hardware rendering.
diff --git a/src/citra_qt/configuration/config.cpp b/src/citra_qt/configuration/config.cpp
index c268e0068..68d565c39 100644
--- a/src/citra_qt/configuration/config.cpp
+++ b/src/citra_qt/configuration/config.cpp
@@ -67,7 +67,8 @@ void Config::ReadValues() {
     qt_config->endGroup();
 
     qt_config->beginGroup("Core");
-    Settings::values.use_cpu_jit = qt_config->value("use_cpu_jit", true).toBool();
+    Settings::values.cpu_core =
+        static_cast<Settings::CpuCore>(qt_config->value("cpu_core", 1).toInt());
     qt_config->endGroup();
 
     qt_config->beginGroup("Renderer");
@@ -207,7 +208,7 @@ void Config::SaveValues() {
     qt_config->endGroup();
 
     qt_config->beginGroup("Core");
-    qt_config->setValue("use_cpu_jit", Settings::values.use_cpu_jit);
+    qt_config->setValue("cpu_core", static_cast<int>(Settings::values.cpu_core));
     qt_config->endGroup();
 
     qt_config->beginGroup("Renderer");
diff --git a/src/citra_qt/configuration/configure_general.cpp b/src/citra_qt/configuration/configure_general.cpp
index 939379717..0de27aa8b 100644
--- a/src/citra_qt/configuration/configure_general.cpp
+++ b/src/citra_qt/configuration/configure_general.cpp
@@ -19,7 +19,7 @@ ConfigureGeneral::ConfigureGeneral(QWidget* parent)
 
     this->setConfiguration();
 
-    ui->toggle_cpu_jit->setEnabled(!Core::System::GetInstance().IsPoweredOn());
+    ui->cpu_core_combobox->setEnabled(!Core::System::GetInstance().IsPoweredOn());
 }
 
 ConfigureGeneral::~ConfigureGeneral() {}
@@ -27,12 +27,12 @@ ConfigureGeneral::~ConfigureGeneral() {}
 void ConfigureGeneral::setConfiguration() {
     ui->toggle_deepscan->setChecked(UISettings::values.gamedir_deepscan);
     ui->toggle_check_exit->setChecked(UISettings::values.confirm_before_closing);
-    ui->toggle_cpu_jit->setChecked(Settings::values.use_cpu_jit);
 
     // The first item is "auto-select" with actual value -1, so plus one here will do the trick
     ui->region_combobox->setCurrentIndex(Settings::values.region_value + 1);
 
     ui->theme_combobox->setCurrentIndex(ui->theme_combobox->findData(UISettings::values.theme));
+    ui->cpu_core_combobox->setCurrentIndex(static_cast<int>(Settings::values.cpu_core));
 }
 
 void ConfigureGeneral::applyConfiguration() {
@@ -41,6 +41,7 @@ void ConfigureGeneral::applyConfiguration() {
     UISettings::values.theme =
         ui->theme_combobox->itemData(ui->theme_combobox->currentIndex()).toString();
     Settings::values.region_value = ui->region_combobox->currentIndex() - 1;
-    Settings::values.use_cpu_jit = ui->toggle_cpu_jit->isChecked();
+    Settings::values.cpu_core =
+        static_cast<Settings::CpuCore>(ui->cpu_core_combobox->currentIndex());
     Settings::Apply();
 }
diff --git a/src/citra_qt/configuration/configure_general.ui b/src/citra_qt/configuration/configure_general.ui
index eedf2cbb0..e88c37936 100644
--- a/src/citra_qt/configuration/configure_general.ui
+++ b/src/citra_qt/configuration/configure_general.ui
@@ -46,16 +46,23 @@
      <item>
        <widget class="QGroupBox" name="groupBox_2">
          <property name="title">
-           <string>Performance</string>
+           <string>CPU Core</string>
          </property>
          <layout class="QHBoxLayout" name="horizontalLayout_7">
            <item>
              <layout class="QVBoxLayout" name="verticalLayout_5">
                <item>
-                 <widget class="QCheckBox" name="toggle_cpu_jit">
+                 <widget class="QComboBox" name="cpu_core_combobox">
+                  <item>
                    <property name="text">
-                     <string>Enable CPU JIT</string>
+                    <string>Unicorn</string>
                    </property>
+                  </item>
+                  <item>
+                   <property name="text">
+                    <string>Dynarmic</string>
+                   </property>
+                  </item>
                  </widget>
                </item>
              </layout>
diff --git a/src/core/core.cpp b/src/core/core.cpp
index 0240f946b..e5f299f26 100644
--- a/src/core/core.cpp
+++ b/src/core/core.cpp
@@ -140,8 +140,16 @@ void System::Reschedule() {
 System::ResultStatus System::Init(EmuWindow* emu_window, u32 system_mode) {
     LOG_DEBUG(HW_Memory, "initialized OK");
 
-    // TODO: Configuration option
-    cpu_core = std::make_unique<ARM_Dynarmic>();
+    switch (Settings::values.cpu_core) {
+    case Settings::CpuCore::Unicorn:
+        cpu_core = std::make_unique<ARM_Unicorn>();
+        break;
+    case Settings::CpuCore::Dynarmic:
+    default:
+        cpu_core = std::make_unique<ARM_Dynarmic>();
+        break;
+    }
+
     telemetry_session = std::make_unique<Core::TelemetrySession>();
 
     CoreTiming::Init();
diff --git a/src/core/settings.h b/src/core/settings.h
index 912b2c885..ebf072cff 100644
--- a/src/core/settings.h
+++ b/src/core/settings.h
@@ -72,6 +72,11 @@ static const std::array<const char*, NumAnalogs> mapping = {{
 }};
 } // namespace NativeAnalog
 
+enum class CpuCore {
+    Unicorn,
+    Dynarmic,
+};
+
 struct Values {
     // CheckNew3DS
     bool is_new_3ds;
@@ -83,7 +88,7 @@ struct Values {
     std::string touch_device;
 
     // Core
-    bool use_cpu_jit;
+    CpuCore cpu_core;
 
     // Data Storage
     bool use_virtual_sd;
diff --git a/src/core/telemetry_session.cpp b/src/core/telemetry_session.cpp
index ca517ff44..f9725b590 100644
--- a/src/core/telemetry_session.cpp
+++ b/src/core/telemetry_session.cpp
@@ -156,7 +156,8 @@ TelemetrySession::TelemetrySession() {
     // Log user configuration information
     AddField(Telemetry::FieldType::UserConfig, "Audio_EnableAudioStretching",
              Settings::values.enable_audio_stretching);
-    AddField(Telemetry::FieldType::UserConfig, "Core_UseCpuJit", Settings::values.use_cpu_jit);
+    AddField(Telemetry::FieldType::UserConfig, "Core_CpuCore",
+             static_cast<int>(Settings::values.cpu_core));
     AddField(Telemetry::FieldType::UserConfig, "Renderer_ResolutionFactor",
              Settings::values.resolution_factor);
     AddField(Telemetry::FieldType::UserConfig, "Renderer_ToggleFramelimit",