diff --git a/dynamic.c b/dynamic.c
index 0799b42d4e..35f4f89ba9 100644
--- a/dynamic.c
+++ b/dynamic.c
@@ -576,6 +576,7 @@ void uninit_libretro_sym(struct retro_core_t *current_core)
 
    runloop_ctl(RUNLOOP_CTL_CORE_OPTIONS_DEINIT, NULL);
    runloop_ctl(RUNLOOP_CTL_SYSTEM_INFO_FREE, NULL);
+   runloop_ctl(RUNLOOP_CTL_FRAME_TIME_FREE, NULL);
    camera_driver_ctl(RARCH_CAMERA_CTL_UNSET_ACTIVE, NULL);
    location_driver_ctl(RARCH_LOCATION_CTL_UNSET_ACTIVE, NULL);
 
diff --git a/libretro_version_1.c b/libretro_version_1.c
index 08288e39db..feb95096e5 100644
--- a/libretro_version_1.c
+++ b/libretro_version_1.c
@@ -310,7 +310,6 @@ bool core_ctl(enum core_ctl_state state, void *data)
       case CORE_CTL_RETRO_DEINIT:
          core.retro_deinit();
          uninit_libretro_sym(&core);
-         runloop_ctl(RUNLOOP_CTL_FRAME_TIME_FREE, NULL);
          break;
       case CORE_CTL_RETRO_UNLOAD_GAME:
          video_driver_ctl(RARCH_DISPLAY_CTL_DEINIT_HW_CONTEXT, NULL);
diff --git a/menu/cbs/menu_cbs_get_value.c b/menu/cbs/menu_cbs_get_value.c
index 9b7b12e672..67fca5425e 100644
--- a/menu/cbs/menu_cbs_get_value.c
+++ b/menu/cbs/menu_cbs_get_value.c
@@ -27,6 +27,7 @@
 #include "../../input/input_config.h"
 
 #include "../../core_info.h"
+#include "../../core_options.h"
 #include "../../cheats.h"
 #include "../../general.h"
 #include "../../performance.h"
@@ -1068,11 +1069,8 @@ static void menu_action_setting_disp_set_label(file_list_t* list,
       const char *path,
       char *s2, size_t len2)
 {
-   rarch_system_info_t *system = NULL;
    uint32_t hash_label         = menu_hash_calculate(label);
 
-   runloop_ctl(RUNLOOP_CTL_SYSTEM_INFO_GET, &system);
-
    *s = '\0';
    *w = 19;
 
@@ -1137,17 +1135,19 @@ static void menu_action_setting_disp_set_label(file_list_t* list,
    }
    else if (type >= MENU_SETTINGS_CORE_OPTION_START)
    {
+      core_option_manager_t *coreopts = NULL;
       const char *core_opt = NULL;
-      if (!system)
-         return;
 
-      core_opt = core_option_get_val(system->core_options,
+      if (runloop_ctl(RUNLOOP_CTL_COREOPTS_GET, &coreopts))
+      {
+         core_opt = core_option_get_val(coreopts,
                type - MENU_SETTINGS_CORE_OPTION_START);
 
-      strlcpy(s, "", len);
+         strlcpy(s, "", len);
 
-      if (core_opt)
-         strlcpy(s, core_opt, len);
+         if (core_opt)
+            strlcpy(s, core_opt, len);
+      }
    }
    else
       menu_setting_get_label(list, s,
diff --git a/menu/cbs/menu_cbs_start.c b/menu/cbs/menu_cbs_start.c
index 1cbfd14566..da9c457325 100644
--- a/menu/cbs/menu_cbs_start.c
+++ b/menu/cbs/menu_cbs_start.c
@@ -25,6 +25,7 @@
 #include "../menu_hash.h"
 
 #include "../../core_info.h"
+#include "../../core_options.h"
 #include "../../cheats.h"
 #include "../../general.h"
 #include "../../retroarch.h"
@@ -255,12 +256,10 @@ static int action_start_core_setting(unsigned type,
       const char *label)
 {
    unsigned idx                = type - MENU_SETTINGS_CORE_OPTION_START;
-   rarch_system_info_t *system = NULL;
+   core_option_manager_t *coreopts = NULL;
    
-   runloop_ctl(RUNLOOP_CTL_SYSTEM_INFO_GET, &system);
-
-   if (system)
-      core_option_set_default(system->core_options, idx);
+   if (runloop_ctl(RUNLOOP_CTL_COREOPTS_GET, &coreopts))
+      core_option_set_default(coreopts, idx);
 
    return 0;
 }
diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c
index ab2eb9a3b7..bc9bd244a5 100644
--- a/menu/menu_displaylist.c
+++ b/menu/menu_displaylist.c
@@ -45,6 +45,7 @@
 #include "../list_special.h"
 #include "../performance.h"
 #include "../core_info.h"
+#include "../core_options.h"
 
 #ifdef HAVE_CHEEVOS
 #include "../cheevos.h"
@@ -2934,7 +2935,6 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, void *data)
    video_shader_ctx_t shader_info;
 #endif
    int ret                       = 0;
-   rarch_system_info_t *system   = NULL;
    core_info_list_t *list        = NULL;
    menu_handle_t       *menu     = NULL;
    settings_t      *settings     = NULL;
@@ -2958,7 +2958,6 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, void *data)
    settings = config_get_ptr();
 
    core_info_ctl(CORE_INFO_CTL_LIST_GET,    &list);
-   runloop_ctl(RUNLOOP_CTL_SYSTEM_INFO_GET, &system);
 
    disp_list.info = info;
    disp_list.type = type;
@@ -3153,75 +3152,78 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, void *data)
          info->need_push    = true;
          break;
       case DISPLAYLIST_MAIN_MENU:
-         runloop_ctl(RUNLOOP_CTL_SYSTEM_INFO_GET, &system);
+         {
+            rarch_system_info_t *system   = NULL;
+            runloop_ctl(RUNLOOP_CTL_SYSTEM_INFO_GET, &system);
 
-         if (!rarch_ctl(RARCH_CTL_IS_DUMMY_CORE, NULL))
+            if (!rarch_ctl(RARCH_CTL_IS_DUMMY_CORE, NULL))
+               menu_displaylist_parse_settings(menu, info,
+                     menu_hash_to_str(MENU_LABEL_CONTENT_SETTINGS),
+                     PARSE_ACTION, false);
             menu_displaylist_parse_settings(menu, info,
-                  menu_hash_to_str(MENU_LABEL_CONTENT_SETTINGS),
-                  PARSE_ACTION, false);
-         menu_displaylist_parse_settings(menu, info,
-               menu_hash_to_str(MENU_LABEL_START_CORE), PARSE_ACTION, false);
+                  menu_hash_to_str(MENU_LABEL_START_CORE), PARSE_ACTION, false);
 
 #ifndef HAVE_DYNAMIC
-         if (frontend_driver_has_fork())
+            if (frontend_driver_has_fork())
 #endif
-         {
-            menu_displaylist_parse_settings(menu, info,
-                  menu_hash_to_str(MENU_LABEL_CORE_LIST), PARSE_ACTION, false);
-         }
+            {
+               menu_displaylist_parse_settings(menu, info,
+                     menu_hash_to_str(MENU_LABEL_CORE_LIST), PARSE_ACTION, false);
+            }
 
-         menu_displaylist_parse_settings(menu, info,
-               menu_hash_to_str(MENU_LABEL_LOAD_CONTENT_LIST),
-               PARSE_ACTION, false);
-         menu_displaylist_parse_settings(menu, info,
-               menu_hash_to_str(MENU_LABEL_LOAD_CONTENT_HISTORY),
-               PARSE_ACTION, false);
+            menu_displaylist_parse_settings(menu, info,
+                  menu_hash_to_str(MENU_LABEL_LOAD_CONTENT_LIST),
+                  PARSE_ACTION, false);
+            menu_displaylist_parse_settings(menu, info,
+                  menu_hash_to_str(MENU_LABEL_LOAD_CONTENT_HISTORY),
+                  PARSE_ACTION, false);
 #if defined(HAVE_NETWORKING)
 #if defined(HAVE_LIBRETRODB)
-         menu_displaylist_parse_settings(menu, info,
-               menu_hash_to_str(MENU_LABEL_ADD_CONTENT_LIST),
-               PARSE_ACTION, false);
+            menu_displaylist_parse_settings(menu, info,
+                  menu_hash_to_str(MENU_LABEL_ADD_CONTENT_LIST),
+                  PARSE_ACTION, false);
 #endif
-         menu_displaylist_parse_settings(menu, info,
-               menu_hash_to_str(MENU_LABEL_ONLINE_UPDATER),
-               PARSE_ACTION, false);
+            menu_displaylist_parse_settings(menu, info,
+                  menu_hash_to_str(MENU_LABEL_ONLINE_UPDATER),
+                  PARSE_ACTION, false);
 #endif
-         menu_displaylist_parse_settings(menu, info,
-               menu_hash_to_str(MENU_LABEL_SETTINGS), PARSE_ACTION, false);
-         menu_displaylist_parse_settings(menu, info,
-               menu_hash_to_str(MENU_LABEL_INFORMATION_LIST),
-               PARSE_ACTION, false);
+            menu_displaylist_parse_settings(menu, info,
+                  menu_hash_to_str(MENU_LABEL_SETTINGS), PARSE_ACTION, false);
+            menu_displaylist_parse_settings(menu, info,
+                  menu_hash_to_str(MENU_LABEL_INFORMATION_LIST),
+                  PARSE_ACTION, false);
 #ifndef HAVE_DYNAMIC
-         menu_displaylist_parse_settings(menu, info,
-               menu_hash_to_str(MENU_LABEL_RESTART_RETROARCH),
-               PARSE_ACTION, false);
+            menu_displaylist_parse_settings(menu, info,
+                  menu_hash_to_str(MENU_LABEL_RESTART_RETROARCH),
+                  PARSE_ACTION, false);
 #endif
-         menu_displaylist_parse_settings(menu, info,
-               menu_hash_to_str(MENU_LABEL_CONFIGURATIONS),
-               PARSE_ACTION, false);
-         menu_displaylist_parse_settings(menu, info,
-               menu_hash_to_str(MENU_LABEL_SAVE_CURRENT_CONFIG),
-               PARSE_ACTION, false);
-         menu_displaylist_parse_settings(menu, info,
-               menu_hash_to_str(MENU_LABEL_SAVE_NEW_CONFIG),
-               PARSE_ACTION, false);
-         menu_displaylist_parse_settings(menu, info,
-               menu_hash_to_str(MENU_LABEL_HELP_LIST),
-               PARSE_ACTION, false);
+            menu_displaylist_parse_settings(menu, info,
+                  menu_hash_to_str(MENU_LABEL_CONFIGURATIONS),
+                  PARSE_ACTION, false);
+            menu_displaylist_parse_settings(menu, info,
+                  menu_hash_to_str(MENU_LABEL_SAVE_CURRENT_CONFIG),
+                  PARSE_ACTION, false);
+            menu_displaylist_parse_settings(menu, info,
+                  menu_hash_to_str(MENU_LABEL_SAVE_NEW_CONFIG),
+                  PARSE_ACTION, false);
+            menu_displaylist_parse_settings(menu, info,
+                  menu_hash_to_str(MENU_LABEL_HELP_LIST),
+                  PARSE_ACTION, false);
 #if !defined(IOS)
-         menu_displaylist_parse_settings(menu, info,
-               menu_hash_to_str(MENU_LABEL_QUIT_RETROARCH),
-               PARSE_ACTION, false);
+            menu_displaylist_parse_settings(menu, info,
+                  menu_hash_to_str(MENU_LABEL_QUIT_RETROARCH),
+                  PARSE_ACTION, false);
 #endif
 #if defined(HAVE_LAKKA)
-         menu_displaylist_parse_settings(menu, info,
-               menu_hash_to_str(MENU_LABEL_SHUTDOWN),
-               PARSE_ACTION, false);
-         menu_displaylist_parse_settings(menu, info,
-               menu_hash_to_str(MENU_LABEL_REBOOT),
-               PARSE_ACTION, false);
+            menu_displaylist_parse_settings(menu, info,
+                  menu_hash_to_str(MENU_LABEL_SHUTDOWN),
+                  PARSE_ACTION, false);
+            menu_displaylist_parse_settings(menu, info,
+                  menu_hash_to_str(MENU_LABEL_REBOOT),
+                  PARSE_ACTION, false);
 #endif
-         info->need_push    = true;
+            info->need_push    = true;
+         }
          break;
       case DISPLAYLIST_PLAYLIST_SETTINGS_LIST:
          ret = menu_displaylist_parse_settings(menu, info,
@@ -3733,9 +3735,13 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, void *data)
             }
             else
             {
+               core_option_manager_t *coreopts = NULL;
+
+               runloop_ctl(RUNLOOP_CTL_COREOPTS_GET, &coreopts);
+
                for (i = 0; i < opts; i++)
                   menu_entries_push(info->list,
-                        core_option_get_desc(system->core_options, i), "",
+                        core_option_get_desc(coreopts, i), "",
                         MENU_SETTINGS_CORE_OPTION_START + i, 0, 0);
             }
          }
diff --git a/runloop.c b/runloop.c
index 4ed991aaa8..c0c698d44d 100644
--- a/runloop.c
+++ b/runloop.c
@@ -37,6 +37,7 @@
 #endif
 #include "autosave.h"
 #include "core_info.h"
+#include "core_options.h"
 #include "cheats.h"
 #include "configuration.h"
 #include "performance.h"
@@ -429,6 +430,7 @@ bool runloop_ctl(enum runloop_ctl_state state, void *data)
    static bool runloop_perfcnt_enable               = false;
    static bool runloop_overrides_active             = false;
    static bool runloop_game_options_active          = false;
+   static core_option_manager_t *runloop_core_options = NULL;
 #ifdef HAVE_THREADS
    static slock_t *runloop_msg_queue_lock           = NULL;
 #endif
@@ -465,11 +467,19 @@ bool runloop_ctl(enum runloop_ctl_state state, void *data)
             unsigned *idx = (unsigned*)data;
             if (!idx)
                return false;
-            *idx = core_option_size(runloop_system.core_options);
+            *idx = core_option_size(runloop_core_options);
          }
          break;
       case RUNLOOP_CTL_HAS_CORE_OPTIONS:
-         return runloop_system.core_options;
+         return runloop_core_options;
+      case RUNLOOP_CTL_COREOPTS_GET:
+         {
+            core_option_manager_t **coreopts = (core_option_manager_t**)data;
+            if (!coreopts)
+               return false;
+            *coreopts = runloop_core_options;
+         }
+         break;
       case RUNLOOP_CTL_SYSTEM_INFO_GET:
          {
             rarch_system_info_t **system = (rarch_system_info_t**)data;
@@ -479,18 +489,11 @@ bool runloop_ctl(enum runloop_ctl_state state, void *data)
          }
          break;
       case RUNLOOP_CTL_SYSTEM_INFO_FREE:
-         if (runloop_system.core_options)
-         {
-            core_option_flush(runloop_system.core_options);
-            core_option_free(runloop_system.core_options);
-         }
-
-         runloop_system.core_options   = NULL;
 
          /* No longer valid. */
          if (runloop_system.subsystem.data)
             free(runloop_system.subsystem.data);
-         runloop_system.subsystem.data        = NULL;
+         runloop_system.subsystem.data = NULL;
          if (runloop_system.ports.data)
             free(runloop_system.ports.data);
          runloop_system.subsystem.size = 0;
@@ -1067,15 +1070,15 @@ bool runloop_ctl(enum runloop_ctl_state state, void *data)
          task_queue_ctl(TASK_QUEUE_CTL_DEINIT, NULL);
          break;
       case RUNLOOP_CTL_IS_CORE_OPTION_UPDATED:
-         if (!runloop_system.core_options)
+         if (!runloop_core_options)
             return false;
-         return  core_option_updated(runloop_system.core_options);
+         return  core_option_updated(runloop_core_options);
       case RUNLOOP_CTL_CORE_OPTION_PREV:
          {
             unsigned *idx = (unsigned*)data;
             if (!idx)
                return false;
-            core_option_prev(runloop_system.core_options, *idx);
+            core_option_prev(runloop_core_options, *idx);
             if (ui_companion_is_on_foreground())
                ui_companion_driver_notify_refresh();
          }
@@ -1085,7 +1088,7 @@ bool runloop_ctl(enum runloop_ctl_state state, void *data)
             unsigned *idx = (unsigned*)data;
             if (!idx)
                return false;
-            core_option_next(runloop_system.core_options, *idx);
+            core_option_next(runloop_core_options, *idx);
             if (ui_companion_is_on_foreground())
                ui_companion_driver_notify_refresh();
          }
@@ -1094,11 +1097,11 @@ bool runloop_ctl(enum runloop_ctl_state state, void *data)
          {
             struct retro_variable *var = (struct retro_variable*)data;
 
-            if (!runloop_system.core_options || !var)
+            if (!runloop_core_options || !var)
                return false;
 
             RARCH_LOG("Environ GET_VARIABLE %s:\n", var->key);
-            core_option_get(runloop_system.core_options, var);
+            core_option_get(runloop_core_options, var);
             RARCH_LOG("\t%s\n", var->value ? var->value : "N/A");
          }
          break;
@@ -1126,42 +1129,45 @@ bool runloop_ctl(enum runloop_ctl_state state, void *data)
             if(ret)
             {
                runloop_ctl(RUNLOOP_CTL_SET_GAME_OPTIONS_ACTIVE, NULL);
-               runloop_system.core_options = 
+               runloop_core_options = 
                   core_option_new(game_options_path, vars);
                free(game_options_path);
             }
             else
             {
                runloop_ctl(RUNLOOP_CTL_UNSET_GAME_OPTIONS_ACTIVE, NULL);
-               runloop_system.core_options = 
+               runloop_core_options = 
                   core_option_new(options_path, vars);
             }
 
          }
          break;
+      case RUNLOOP_CTL_CORE_OPTIONS_FREE:
+         if (runloop_core_options)
+            core_option_free(runloop_core_options);
+         runloop_core_options          = NULL;
+         break;
       case RUNLOOP_CTL_CORE_OPTIONS_DEINIT:
          {
             global_t *global                  = global_get_ptr();
-            if (!global || !runloop_system.core_options)
+            if (!runloop_core_options)
                return false;
 
             /* check if game options file was just created and flush
                to that file instead */
-            if(!string_is_empty(global->path.core_options_path))
+            if(global && !string_is_empty(global->path.core_options_path))
             {
-               core_option_flush_game_specific(runloop_system.core_options,
+               core_option_flush_game_specific(runloop_core_options,
                      global->path.core_options_path);
                global->path.core_options_path[0] = '\0';
             }
             else
-               core_option_flush(runloop_system.core_options);
-
-            core_option_free(runloop_system.core_options);
+               core_option_flush(runloop_core_options);
 
             if (runloop_ctl(RUNLOOP_CTL_IS_GAME_OPTIONS_ACTIVE, NULL))
                runloop_ctl(RUNLOOP_CTL_UNSET_GAME_OPTIONS_ACTIVE, NULL);
 
-            runloop_system.core_options = NULL;
+            runloop_ctl(RUNLOOP_CTL_CORE_OPTIONS_FREE, NULL);
          }
          break;
       case RUNLOOP_CTL_KEY_EVENT_GET:
diff --git a/runloop.h b/runloop.h
index 29747212bf..bfd0281447 100644
--- a/runloop.h
+++ b/runloop.h
@@ -118,11 +118,13 @@ enum runloop_ctl_state
    RUNLOOP_CTL_HAS_CORE_OPTIONS,
    RUNLOOP_CTL_GET_CORE_OPTION_SIZE,
    RUNLOOP_CTL_IS_CORE_OPTION_UPDATED,
+   RUNLOOP_CTL_COREOPTS_GET,
    RUNLOOP_CTL_CORE_OPTION_PREV,
    RUNLOOP_CTL_CORE_OPTION_NEXT,
    RUNLOOP_CTL_CORE_OPTIONS_GET,
    RUNLOOP_CTL_CORE_OPTIONS_INIT,
    RUNLOOP_CTL_CORE_OPTIONS_DEINIT,
+   RUNLOOP_CTL_CORE_OPTIONS_FREE,
    RUNLOOP_CTL_SHADER_DIR_DEINIT,
    RUNLOOP_CTL_SHADER_DIR_INIT,
    RUNLOOP_CTL_SYSTEM_INFO_GET,
diff --git a/system.h b/system.h
index dbb2b0edd6..a878b1d624 100644
--- a/system.h
+++ b/system.h
@@ -19,7 +19,6 @@
 #include <retro_miscellaneous.h>
 
 #include "driver.h"
-#include "core_options.h"
 #include "libretro.h"
 
 #ifndef MAX_USERS
@@ -43,7 +42,6 @@ typedef struct rarch_system_info
    struct retro_disk_control_callback  disk_control_cb; 
    struct retro_location_callback      location_cb;
 
-   core_option_manager_t *core_options;
 
    struct
    {