diff --git a/frontend/frontend.c b/frontend/frontend.c
index b33373375a..eb847bb44e 100644
--- a/frontend/frontend.c
+++ b/frontend/frontend.c
@@ -284,16 +284,19 @@ returntype main_entry(signature())
    settings_t *settings = NULL;
    driver_t *driver = driver_get_ptr();
 
-   rarch_main_state_new();
+   rarch_main_state_alloc();
 
-   driver->frontend_ctx = (frontend_ctx_driver_t*)frontend_ctx_init_first();
+   if (driver)
+      driver->frontend_ctx = (frontend_ctx_driver_t*)frontend_ctx_init_first();
 
-   if (!driver->frontend_ctx)
+   if (!driver || !driver->frontend_ctx)
       RARCH_WARN("Frontend context could not be initialized.\n");
 
    if (driver->frontend_ctx && driver->frontend_ctx->init)
       driver->frontend_ctx->init(args);
 
+   rarch_main_state_new();
+
    if (driver->frontend_ctx)
    {
       if (!(ret = (main_load_content(argc, argv, args,
diff --git a/retroarch.c b/retroarch.c
index 9aa43cc486..0bd34a7afc 100644
--- a/retroarch.c
+++ b/retroarch.c
@@ -1665,16 +1665,25 @@ static void free_temporary_content(void)
    string_list_free(global->temporary_content);
 }
 
-/* main_clear_state_extern:
- *
- * Clears all external state.
- */
-static void main_clear_state_extern(void)
+static void main_clear_state_drivers(bool inited)
 {
-   rarch_main_command(RARCH_CMD_HISTORY_DEINIT);
+   if (!inited)
+      return;
 
-   rarch_main_clear_state();
-   rarch_main_data_clear_state();
+   rarch_main_command(RARCH_CMD_DRIVERS_DEINIT);
+   rarch_main_command(RARCH_CMD_DRIVERS_INIT);
+}
+
+static void main_init_state_config(void)
+{
+   unsigned i;
+   settings_t *settings = config_get_ptr();
+
+   if (!settings)
+      return;
+
+   for (i = 0; i < MAX_USERS; i++)
+      settings->input.libretro_device[i] = RETRO_DEVICE_JOYPAD;
 }
 
 /**
@@ -1688,36 +1697,33 @@ static void main_clear_state_extern(void)
  **/
 static void main_clear_state(bool inited)
 {
-   unsigned i;
+   main_clear_state_drivers(inited);
+   init_state();
+   main_init_state_config();
+}
+
+void rarch_main_state_alloc(void)
+{
    settings_t *settings = config_get_ptr();
 
    if (settings)
       config_free();
-
    settings = config_init();
 
    if (!settings)
       return;
 
-   if (inited)
-      rarch_main_command(RARCH_CMD_DRIVERS_DEINIT);
+   rarch_main_command(RARCH_CMD_HISTORY_DEINIT);
 
-   main_clear_state_extern();
-
-   if (inited)
-      rarch_main_command(RARCH_CMD_DRIVERS_INIT);
-
-   init_state();
-
-   for (i = 0; i < MAX_USERS; i++)
-      settings->input.libretro_device[i] = RETRO_DEVICE_JOYPAD;
+   rarch_main_clear_state();
+   rarch_main_data_clear_state();
 }
 
 void rarch_main_state_new(void)
 {
    global_t *global = global_get_ptr();
 
-   main_clear_state(global ? global->main_is_init: false);
+   main_clear_state(global->main_is_init);
    rarch_main_command(RARCH_CMD_MSG_QUEUE_INIT);
 }
 
diff --git a/retroarch.h b/retroarch.h
index ac7bbf1b80..24c878b27a 100644
--- a/retroarch.h
+++ b/retroarch.h
@@ -218,6 +218,8 @@ struct rarch_main_wrap
    bool touched;
 };
 
+void rarch_main_state_alloc(void);
+
 void rarch_main_state_new(void);
 
 void rarch_main_state_free(void);