diff --git a/audiomixer-test.diff b/audiomixer-test.diff
index 73b1274070..ffd7bc6aba 100644
--- a/audiomixer-test.diff
+++ b/audiomixer-test.diff
@@ -1,14 +1,28 @@
 diff --git a/audio/audio_driver.c b/audio/audio_driver.c
-index 10dcbc5b3..dd959f900 100644
+index 10dcbc5b3..203e89d0a 100644
 --- a/audio/audio_driver.c
 +++ b/audio/audio_driver.c
-@@ -597,6 +597,9 @@ static bool audio_driver_flush(const int16_t *data, size_t samples)
+@@ -597,6 +597,8 @@ static bool audio_driver_flush(const int16_t *data, size_t samples)
  
     audio_driver_resampler->process(audio_driver_resampler_data, &src_data);
  
-+   audio_mixer_load_wav("/home/squarepusher/nav.wav");
 +   audio_mixer_mix(audio_driver_output_samples_buf, src_data.output_frames);
 +
     output_data   = audio_driver_output_samples_buf;
     output_frames = (unsigned)src_data.output_frames;
  
+diff --git a/runloop.c b/runloop.c
+index 0e3a8dc44..4f79b2ed7 100644
+--- a/runloop.c
++++ b/runloop.c
+@@ -1021,7 +1021,10 @@ static enum runloop_state runloop_check_state(
+       command_event(CMD_EVENT_DISK_PREV, NULL);
+ 
+    if (runloop_cmd_triggered(trigger_input, RARCH_RESET))
++   {
+       command_event(CMD_EVENT_RESET, NULL);
++      audio_mixer_load_wav("/home/squarepusher/piano2.wav");
++   }
+ 
+    cheat_manager_state_checks(
+          runloop_cmd_triggered(trigger_input, RARCH_CHEAT_INDEX_PLUS),
diff --git a/cheevos/cheevos.c b/cheevos/cheevos.c
index c00cb75b2c..60379436a6 100644
--- a/cheevos/cheevos.c
+++ b/cheevos/cheevos.c
@@ -92,6 +92,10 @@
 #define CHEEVOS_JSON_KEY_MEM          0x0b8807e4U
 #define CHEEVOS_JSON_KEY_FORMAT       0xb341208eU
 
+#define CHEEVOS_SIX_MB     ( 6 * 1024 * 1024)
+#define CHEEVOS_EIGHT_MB   ( 8 * 1024 * 1024)
+#define CHEEVOS_SIZE_LIMIT (32 * 1024 * 1024)
+
 enum
 {
    /* Don't change those, the values match the console IDs
@@ -2704,9 +2708,6 @@ static int cheevos_deactivate_unlocks(unsigned game_id, retro_time_t *timeout)
 #endif
 }
 
-#define CHEEVOS_SIX_MB   (6 * 1024 * 1024)
-#define CHEEVOS_EIGHT_MB (8 * 1024 * 1024)
-
 static INLINE unsigned cheevos_next_power_of_2(unsigned n)
 {
    n--;
@@ -2736,6 +2737,11 @@ static size_t cheevos_eval_md5(
       if (info->size - offset < max_size)
          max_size = info->size - offset;
 
+#ifdef CHEEVOS_SIZE_LIMIT
+      if (max_size > CHEEVOS_SIZE_LIMIT)
+         max_size = CHEEVOS_SIZE_LIMIT;
+#endif
+
       MD5_Update(ctx, (void*)((uint8_t*)info->data + offset), max_size);
       return max_size;
    }
@@ -2746,8 +2752,22 @@ static size_t cheevos_eval_md5(
 
       if (!file)
          return 0;
+      
+      size = filestream_get_size(file);
+      
+      if (max_size == 0)
+         max_size = size;
+      
+      if (size - offset < max_size)
+         max_size = size - offset;
+      
+#ifdef CHEEVOS_SIZE_LIMIT
+      if (max_size > CHEEVOS_SIZE_LIMIT)
+         max_size = CHEEVOS_SIZE_LIMIT;
+#endif
 
       filestream_seek(file, offset, SEEK_SET);
+      size = 0;
 
       for (;;)
       {
@@ -2755,7 +2775,7 @@ static size_t cheevos_eval_md5(
          ssize_t num_read;
          size_t to_read = sizeof(buffer);
 
-         if (max_size != 0 && to_read > max_size)
+         if (to_read > max_size)
             to_read = max_size;
 
          num_read = filestream_read(file, (void*)buffer, to_read);
diff --git a/command.c b/command.c
index f76c18c6bb..19647df0d0 100644
--- a/command.c
+++ b/command.c
@@ -1756,24 +1756,6 @@ static bool command_event_main_state(unsigned cmd)
    return ret;
 }
 
-void handle_quit_event(void)
-{
-   command_event(CMD_EVENT_AUTOSAVE_STATE, NULL);
-   command_event(CMD_EVENT_DISABLE_OVERRIDES, NULL);
-   command_event(CMD_EVENT_RESTORE_DEFAULT_SHADER_PRESET, NULL);
-
-#ifdef HAVE_DYNAMIC
-#ifdef HAVE_MENU
-   menu_driver_ctl(RARCH_MENU_CTL_SYSTEM_INFO_DEINIT, NULL);
-#endif
-#endif
-
-   runloop_ctl(RUNLOOP_CTL_SET_SHUTDOWN, NULL);
-#ifdef HAVE_MENU
-   rarch_ctl(RARCH_CTL_MENU_RUNNING_FINISHED, NULL);
-#endif
-}
-
 static bool command_event_resize_windowed_scale(void)
 {
    unsigned idx           = 0;
@@ -1993,8 +1975,7 @@ bool command_event(enum event_command cmd, void *data)
          }
          break;
       case CMD_EVENT_QUIT:
-         handle_quit_event();
-         break;
+         return retroarch_main_quit();
       case CMD_EVENT_CHEEVOS_HARDCORE_MODE_TOGGLE:
 #ifdef HAVE_CHEEVOS
          cheevos_toggle_hardcore_mode();
@@ -2067,9 +2048,8 @@ bool command_event(enum event_command cmd, void *data)
             runloop_set(RUNLOOP_ACTION_AUTOSAVE);
          else
             runloop_unset(RUNLOOP_ACTION_AUTOSAVE);
-#else
-         break;
 #endif
+         break;
       case CMD_EVENT_AUTOSAVE_STATE:
          command_event_save_auto_state();
          break;
diff --git a/command.h b/command.h
index f15b108388..d5365c4c73 100644
--- a/command.h
+++ b/command.h
@@ -243,6 +243,8 @@ bool command_set(command_handle_t *handle);
 
 bool command_free(command_t *handle);
 
+bool command_event_quit(void);
+
 /**
  * command_event:
  * @cmd                  : Command index.
diff --git a/config.def.h b/config.def.h
index afdb4150a5..00c862396d 100644
--- a/config.def.h
+++ b/config.def.h
@@ -25,160 +25,6 @@
 #include "config.h"
 #endif
 
-#include "input/input_driver.h"
-
-enum video_driver_enum
-{
-   VIDEO_GL                 = 0,
-   VIDEO_VULKAN,
-   VIDEO_DRM,
-   VIDEO_XVIDEO,
-   VIDEO_SDL,
-   VIDEO_SDL2,
-   VIDEO_EXT,
-   VIDEO_WII,
-   VIDEO_WIIU,
-   VIDEO_XENON360,
-   VIDEO_XDK_D3D,
-   VIDEO_PSP1,
-   VIDEO_VITA2D,
-   VIDEO_CTR,
-   VIDEO_D3D9,
-   VIDEO_VG,
-   VIDEO_OMAP,
-   VIDEO_EXYNOS,
-   VIDEO_SUNXI,
-   VIDEO_DISPMANX,
-   VIDEO_CACA,
-   VIDEO_GDI,
-   VIDEO_VGA,
-   VIDEO_NULL
-};
-
-enum audio_driver_enum
-{
-   AUDIO_RSOUND             = VIDEO_NULL + 1,
-   AUDIO_OSS,
-   AUDIO_ALSA,
-   AUDIO_ALSATHREAD,
-   AUDIO_ROAR,
-   AUDIO_AL,
-   AUDIO_SL,
-   AUDIO_JACK,
-   AUDIO_SDL,
-   AUDIO_SDL2,
-   AUDIO_XAUDIO,
-   AUDIO_PULSE,
-   AUDIO_EXT,
-   AUDIO_DSOUND,
-   AUDIO_WASAPI,
-   AUDIO_COREAUDIO,
-   AUDIO_PS3,
-   AUDIO_XENON360,
-   AUDIO_WII,
-   AUDIO_WIIU,
-   AUDIO_RWEBAUDIO,
-   AUDIO_PSP,
-   AUDIO_CTR,
-   AUDIO_NULL
-};
-
-enum audio_resampler_driver_enum
-{
-   AUDIO_RESAMPLER_CC       = AUDIO_NULL + 1,
-   AUDIO_RESAMPLER_SINC,
-   AUDIO_RESAMPLER_NEAREST,
-   AUDIO_RESAMPLER_NULL
-};
-
-enum input_driver_enum
-{
-   INPUT_ANDROID            = AUDIO_RESAMPLER_NULL + 1,
-   INPUT_SDL,
-   INPUT_SDL2,
-   INPUT_X,
-   INPUT_WAYLAND,
-   INPUT_DINPUT,
-   INPUT_PS3,
-   INPUT_PSP,
-   INPUT_CTR,
-   INPUT_XENON360,
-   INPUT_WII,
-   INPUT_WIIU,
-   INPUT_XINPUT,
-   INPUT_UDEV,
-   INPUT_LINUXRAW,
-   INPUT_COCOA,
-   INPUT_QNX,
-   INPUT_RWEBINPUT,
-   INPUT_DOS,
-   INPUT_NULL
-};
-
-enum joypad_driver_enum
-{
-   JOYPAD_PS3               = INPUT_NULL + 1,
-   JOYPAD_XINPUT,
-   JOYPAD_GX,
-   JOYPAD_WIIU,
-   JOYPAD_XDK,
-   JOYPAD_PSP,
-   JOYPAD_CTR,
-   JOYPAD_DINPUT,
-   JOYPAD_UDEV,
-   JOYPAD_LINUXRAW,
-   JOYPAD_ANDROID,
-   JOYPAD_SDL,
-   JOYPAD_DOS,
-   JOYPAD_HID,
-   JOYPAD_QNX,
-   JOYPAD_NULL
-};
-
-enum camera_driver_enum
-{
-   CAMERA_V4L2              = JOYPAD_NULL + 1,
-   CAMERA_RWEBCAM,
-   CAMERA_ANDROID,
-   CAMERA_AVFOUNDATION,
-   CAMERA_NULL
-};
-
-enum wifi_driver_enum
-{
-   WIFI_CONNMANCTL          = CAMERA_NULL + 1,
-   WIFI_NULL
-};
-
-enum location_driver_enum
-{
-   LOCATION_ANDROID         = WIFI_NULL + 1,
-   LOCATION_CORELOCATION,
-   LOCATION_NULL
-};
-
-enum osk_driver_enum
-{
-   OSK_PS3                  = LOCATION_NULL + 1,
-   OSK_NULL
-};
-
-enum menu_driver_enum
-{
-   MENU_RGUI                = OSK_NULL + 1,
-   MENU_XUI,
-   MENU_MATERIALUI,
-   MENU_XMB,
-   MENU_NUKLEAR,
-   MENU_NULL
-};
-
-enum record_driver_enum
-{
-   RECORD_FFMPEG            = MENU_NULL + 1,
-   RECORD_NULL
-};
-
 #if defined(HW_RVL)
 #define MAX_GAMMA_SETTING 30
 #elif defined(GEKKO)
@@ -187,226 +33,6 @@ enum record_driver_enum
 #define MAX_GAMMA_SETTING 1
 #endif
 
-#if defined(HAVE_OPENGL) || defined(HAVE_OPENGLES) || defined(__CELLOS_LV2__)
-#define VIDEO_DEFAULT_DRIVER VIDEO_GL
-#elif defined(GEKKO)
-#define VIDEO_DEFAULT_DRIVER VIDEO_WII
-#elif defined(WIIU)
-#define VIDEO_DEFAULT_DRIVER VIDEO_WIIU
-#elif defined(XENON)
-#define VIDEO_DEFAULT_DRIVER VIDEO_XENON360
-#elif (defined(_XBOX1) || defined(_XBOX360)) && (defined(HAVE_D3D8) || defined(HAVE_D3D9))
-#define VIDEO_DEFAULT_DRIVER VIDEO_XDK_D3D
-#elif defined(HAVE_D3D9)
-#define VIDEO_DEFAULT_DRIVER VIDEO_D3D9
-#elif defined(HAVE_VG)
-#define VIDEO_DEFAULT_DRIVER VIDEO_VG
-#elif defined(HAVE_VITA2D)
-#define VIDEO_DEFAULT_DRIVER VIDEO_VITA2D
-#elif defined(PSP)
-#define VIDEO_DEFAULT_DRIVER VIDEO_PSP1
-#elif defined(_3DS)
-#define VIDEO_DEFAULT_DRIVER VIDEO_CTR
-#elif defined(HAVE_XVIDEO)
-#define VIDEO_DEFAULT_DRIVER VIDEO_XVIDEO
-#elif defined(HAVE_SDL)
-#define VIDEO_DEFAULT_DRIVER VIDEO_SDL
-#elif defined(HAVE_SDL2)
-#define VIDEO_DEFAULT_DRIVER VIDEO_SDL2
-#elif defined(_WIN32) && !defined(_XBOX)
-#define VIDEO_DEFAULT_DRIVER VIDEO_GDI
-#elif defined(DJGPP)
-#define VIDEO_DEFAULT_DRIVER VIDEO_VGA
-#elif defined(HAVE_DYLIB) && !defined(ANDROID)
-#define VIDEO_DEFAULT_DRIVER VIDEO_EXT
-#else
-#define VIDEO_DEFAULT_DRIVER VIDEO_NULL
-#endif
-
-#if defined(__CELLOS_LV2__)
-#define AUDIO_DEFAULT_DRIVER AUDIO_PS3
-#elif defined(XENON)
-#define AUDIO_DEFAULT_DRIVER AUDIO_XENON360
-#elif defined(GEKKO)
-#define AUDIO_DEFAULT_DRIVER AUDIO_WII
-#elif defined(WIIU)
-#define AUDIO_DEFAULT_DRIVER AUDIO_WIIU
-#elif defined(PSP) || defined(VITA)
-#define AUDIO_DEFAULT_DRIVER AUDIO_PSP
-#elif defined(_3DS)
-#define AUDIO_DEFAULT_DRIVER AUDIO_CTR
-#elif defined(HAVE_PULSE)
-#define AUDIO_DEFAULT_DRIVER AUDIO_PULSE
-#elif defined(HAVE_ALSA) && defined(HAVE_VIDEOCORE)
-#define AUDIO_DEFAULT_DRIVER AUDIO_ALSATHREAD
-#elif defined(HAVE_ALSA)
-#define AUDIO_DEFAULT_DRIVER AUDIO_ALSA
-#elif defined(HAVE_OSS)
-#define AUDIO_DEFAULT_DRIVER AUDIO_OSS
-#elif defined(HAVE_JACK)
-#define AUDIO_DEFAULT_DRIVER AUDIO_JACK
-#elif defined(HAVE_COREAUDIO)
-#define AUDIO_DEFAULT_DRIVER AUDIO_COREAUDIO
-#elif defined(HAVE_XAUDIO)
-#define AUDIO_DEFAULT_DRIVER AUDIO_XAUDIO
-#elif defined(HAVE_DSOUND)
-#define AUDIO_DEFAULT_DRIVER AUDIO_DSOUND
-#elif defined(HAVE_WASAPI)
-#define AUDIO_DEFAULT_DRIVER AUDIO_WASAPI
-#elif defined(HAVE_AL)
-#define AUDIO_DEFAULT_DRIVER AUDIO_AL
-#elif defined(HAVE_SL)
-#define AUDIO_DEFAULT_DRIVER AUDIO_SL
-#elif defined(EMSCRIPTEN)
-#define AUDIO_DEFAULT_DRIVER AUDIO_RWEBAUDIO
-#elif defined(HAVE_SDL)
-#define AUDIO_DEFAULT_DRIVER AUDIO_SDL
-#elif defined(HAVE_SDL2)
-#define AUDIO_DEFAULT_DRIVER AUDIO_SDL2
-#elif defined(HAVE_RSOUND)
-#define AUDIO_DEFAULT_DRIVER AUDIO_RSOUND
-#elif defined(HAVE_ROAR)
-#define AUDIO_DEFAULT_DRIVER AUDIO_ROAR
-#elif defined(HAVE_DYLIB) && !defined(ANDROID)
-#define AUDIO_DEFAULT_DRIVER AUDIO_EXT
-#else
-#define AUDIO_DEFAULT_DRIVER AUDIO_NULL
-#endif
-
-#if defined(PSP) || defined(EMSCRIPTEN)
-#define AUDIO_DEFAULT_RESAMPLER_DRIVER  AUDIO_RESAMPLER_CC
-#else
-#define AUDIO_DEFAULT_RESAMPLER_DRIVER  AUDIO_RESAMPLER_SINC
-#endif
-
-#if defined(HAVE_FFMPEG)
-#define RECORD_DEFAULT_DRIVER RECORD_FFMPEG
-#else
-#define RECORD_DEFAULT_DRIVER RECORD_NULL
-#endif
-
-#if defined(XENON)
-#define INPUT_DEFAULT_DRIVER INPUT_XENON360
-#elif defined(_XBOX360) || defined(_XBOX) || defined(HAVE_XINPUT2) || defined(HAVE_XINPUT_XBOX1)
-#define INPUT_DEFAULT_DRIVER INPUT_XINPUT
-#elif defined(ANDROID)
-#define INPUT_DEFAULT_DRIVER INPUT_ANDROID
-#elif defined(EMSCRIPTEN) && defined(HAVE_SDL2)
-#define INPUT_DEFAULT_DRIVER INPUT_SDL2
-#elif defined(EMSCRIPTEN)
-#define INPUT_DEFAULT_DRIVER INPUT_RWEBINPUT
-#elif defined(_WIN32)
-#define INPUT_DEFAULT_DRIVER INPUT_DINPUT
-#elif defined(__CELLOS_LV2__)
-#define INPUT_DEFAULT_DRIVER INPUT_PS3
-#elif defined(PSP) || defined(VITA)
-#define INPUT_DEFAULT_DRIVER INPUT_PSP
-#elif defined(_3DS)
-#define INPUT_DEFAULT_DRIVER INPUT_CTR
-#elif defined(GEKKO)
-#define INPUT_DEFAULT_DRIVER INPUT_WII
-#elif defined(WIIU)
-#define INPUT_DEFAULT_DRIVER INPUT_WIIU
-#elif defined(HAVE_UDEV)
-#define INPUT_DEFAULT_DRIVER INPUT_UDEV
-#elif defined(__linux__) && !defined(ANDROID)
-#define INPUT_DEFAULT_DRIVER INPUT_LINUXRAW
-#elif defined(HAVE_X11)
-#define INPUT_DEFAULT_DRIVER INPUT_X
-#elif defined(HAVE_WAYLAND)
-#define INPUT_DEFAULT_DRIVER INPUT_WAYLAND
-#elif defined(HAVE_COCOA) || defined(HAVE_COCOATOUCH)
-#define INPUT_DEFAULT_DRIVER INPUT_COCOA
-#elif defined(__QNX__)
-#define INPUT_DEFAULT_DRIVER INPUT_QNX
-#elif defined(HAVE_SDL)
-#define INPUT_DEFAULT_DRIVER INPUT_SDL
-#elif defined(HAVE_SDL2)
-#define INPUT_DEFAULT_DRIVER INPUT_SDL2
-#elif defined(DJGPP)
-#define INPUT_DEFAULT_DRIVER INPUT_DOS
-#else
-#define INPUT_DEFAULT_DRIVER INPUT_NULL
-#endif
-
-#if defined(__CELLOS_LV2__)
-#define JOYPAD_DEFAULT_DRIVER JOYPAD_PS3
-#elif defined(HAVE_XINPUT)
-#define JOYPAD_DEFAULT_DRIVER JOYPAD_XINPUT
-#elif defined(GEKKO)
-#define JOYPAD_DEFAULT_DRIVER JOYPAD_GX
-#elif defined(WIIU)
-#define JOYPAD_DEFAULT_DRIVER JOYPAD_WIIU
-#elif defined(_XBOX)
-#define JOYPAD_DEFAULT_DRIVER JOYPAD_XDK
-#elif defined(PSP) || defined(VITA)
-#define JOYPAD_DEFAULT_DRIVER JOYPAD_PSP
-#elif defined(_3DS)
-#define JOYPAD_DEFAULT_DRIVER JOYPAD_CTR
-#elif defined(HAVE_DINPUT)
-#define JOYPAD_DEFAULT_DRIVER JOYPAD_DINPUT
-#elif defined(HAVE_UDEV)
-#define JOYPAD_DEFAULT_DRIVER JOYPAD_UDEV
-#elif defined(__linux) && !defined(ANDROID)
-#define JOYPAD_DEFAULT_DRIVER JOYPAD_LINUXRAW
-#elif defined(ANDROID)
-#define JOYPAD_DEFAULT_DRIVER JOYPAD_ANDROID
-#elif defined(HAVE_SDL) || defined(HAVE_SDL2)
-#define JOYPAD_DEFAULT_DRIVER JOYPAD_SDL
-#elif defined(DJGPP)
-#define JOYPAD_DEFAULT_DRIVER JOYPAD_DOS
-#elif defined(HAVE_HID)
-#define JOYPAD_DEFAULT_DRIVER JOYPAD_HID
-#elif defined(__QNX__)
-#define JOYPAD_DEFAULT_DRIVER JOYPAD_QNX
-#else
-#define JOYPAD_DEFAULT_DRIVER JOYPAD_NULL
-#endif
-
-#if defined(HAVE_V4L2)
-#define CAMERA_DEFAULT_DRIVER CAMERA_V4L2
-#elif defined(EMSCRIPTEN)
-#define CAMERA_DEFAULT_DRIVER CAMERA_RWEBCAM
-#elif defined(ANDROID)
-#define CAMERA_DEFAULT_DRIVER CAMERA_ANDROID
-#elif defined(HAVE_AVFOUNDATION) && (defined(HAVE_COCOA) || defined(HAVE_COCOATOUCH))
-#define CAMERA_DEFAULT_DRIVER CAMERA_AVFOUNDATION
-#else
-#define CAMERA_DEFAULT_DRIVER CAMERA_NULL
-#endif
-
-#if defined(HAVE_LAKKA)
-#define WIFI_DEFAULT_DRIVER WIFI_CONNMANCTL
-#else
-#define WIFI_DEFAULT_DRIVER WIFI_NULL
-#endif
-
-#if defined(ANDROID)
-#define LOCATION_DEFAULT_DRIVER LOCATION_ANDROID
-#elif defined(HAVE_CORELOCATION) && (defined(HAVE_COCOA) || defined(HAVE_COCOATOUCH))
-#define LOCATION_DEFAULT_DRIVER LOCATION_CORELOCATION
-#else
-#define LOCATION_DEFAULT_DRIVER LOCATION_NULL
-#endif
-
-#if defined(__CELLOS_LV2__)
-#define OSK_DEFAULT_DRIVER OSK_PS3
-#else
-#define OSK_DEFAULT_DRIVER OSK_NULL
-#endif
-
-#if defined(HAVE_XUI)
-#define MENU_DEFAULT_DRIVER MENU_XUI
-#elif defined(HAVE_MATERIALUI) && defined(RARCH_MOBILE)
-#define MENU_DEFAULT_DRIVER MENU_MATERIALUI
-#elif defined(HAVE_XMB)
-#define MENU_DEFAULT_DRIVER MENU_XMB
-#elif defined(HAVE_RGUI)
-#define MENU_DEFAULT_DRIVER MENU_RGUI
-#else
-#define MENU_DEFAULT_DRIVER MENU_NULL
-#endif
-
 #if defined(XENON) || defined(_XBOX360) || defined(__CELLOS_LV2__)
 #define DEFAULT_ASPECT_RATIO 1.7778f
 #elif defined(_XBOX1) || defined(GEKKO) || defined(ANDROID)
@@ -421,8 +47,6 @@ static const bool pointer_enable = true;
 static const bool pointer_enable = false;
 #endif
 
-
-
 /* Certain platforms might have assets stored in the bundle that
  * we need to extract to a user-writable directory on first boot.
  *
diff --git a/configuration.c b/configuration.c
index 662b6cd617..066b3b8c07 100644
--- a/configuration.c
+++ b/configuration.c
@@ -105,6 +105,374 @@ struct config_path_setting
    bool handle;
 };
 
+enum video_driver_enum
+{
+   VIDEO_GL                 = 0,
+   VIDEO_VULKAN,
+   VIDEO_DRM,
+   VIDEO_XVIDEO,
+   VIDEO_SDL,
+   VIDEO_SDL2,
+   VIDEO_EXT,
+   VIDEO_WII,
+   VIDEO_WIIU,
+   VIDEO_XENON360,
+   VIDEO_XDK_D3D,
+   VIDEO_PSP1,
+   VIDEO_VITA2D,
+   VIDEO_CTR,
+   VIDEO_D3D9,
+   VIDEO_VG,
+   VIDEO_OMAP,
+   VIDEO_EXYNOS,
+   VIDEO_SUNXI,
+   VIDEO_DISPMANX,
+   VIDEO_CACA,
+   VIDEO_GDI,
+   VIDEO_VGA,
+   VIDEO_NULL
+};
+
+enum audio_driver_enum
+{
+   AUDIO_RSOUND             = VIDEO_NULL + 1,
+   AUDIO_OSS,
+   AUDIO_ALSA,
+   AUDIO_ALSATHREAD,
+   AUDIO_ROAR,
+   AUDIO_AL,
+   AUDIO_SL,
+   AUDIO_JACK,
+   AUDIO_SDL,
+   AUDIO_SDL2,
+   AUDIO_XAUDIO,
+   AUDIO_PULSE,
+   AUDIO_EXT,
+   AUDIO_DSOUND,
+   AUDIO_WASAPI,
+   AUDIO_COREAUDIO,
+   AUDIO_PS3,
+   AUDIO_XENON360,
+   AUDIO_WII,
+   AUDIO_WIIU,
+   AUDIO_RWEBAUDIO,
+   AUDIO_PSP,
+   AUDIO_CTR,
+   AUDIO_NULL
+};
+
+enum audio_resampler_driver_enum
+{
+   AUDIO_RESAMPLER_CC       = AUDIO_NULL + 1,
+   AUDIO_RESAMPLER_SINC,
+   AUDIO_RESAMPLER_NEAREST,
+   AUDIO_RESAMPLER_NULL
+};
+
+enum input_driver_enum
+{
+   INPUT_ANDROID            = AUDIO_RESAMPLER_NULL + 1,
+   INPUT_SDL,
+   INPUT_SDL2,
+   INPUT_X,
+   INPUT_WAYLAND,
+   INPUT_DINPUT,
+   INPUT_PS3,
+   INPUT_PSP,
+   INPUT_CTR,
+   INPUT_XENON360,
+   INPUT_WII,
+   INPUT_WIIU,
+   INPUT_XINPUT,
+   INPUT_UDEV,
+   INPUT_LINUXRAW,
+   INPUT_COCOA,
+   INPUT_QNX,
+   INPUT_RWEBINPUT,
+   INPUT_DOS,
+   INPUT_NULL
+};
+
+enum joypad_driver_enum
+{
+   JOYPAD_PS3               = INPUT_NULL + 1,
+   JOYPAD_XINPUT,
+   JOYPAD_GX,
+   JOYPAD_WIIU,
+   JOYPAD_XDK,
+   JOYPAD_PSP,
+   JOYPAD_CTR,
+   JOYPAD_DINPUT,
+   JOYPAD_UDEV,
+   JOYPAD_LINUXRAW,
+   JOYPAD_ANDROID,
+   JOYPAD_SDL,
+   JOYPAD_DOS,
+   JOYPAD_HID,
+   JOYPAD_QNX,
+   JOYPAD_NULL
+};
+
+enum camera_driver_enum
+{
+   CAMERA_V4L2              = JOYPAD_NULL + 1,
+   CAMERA_RWEBCAM,
+   CAMERA_ANDROID,
+   CAMERA_AVFOUNDATION,
+   CAMERA_NULL
+};
+
+enum wifi_driver_enum
+{
+   WIFI_CONNMANCTL          = CAMERA_NULL + 1,
+   WIFI_NULL
+};
+
+enum location_driver_enum
+{
+   LOCATION_ANDROID         = WIFI_NULL + 1,
+   LOCATION_CORELOCATION,
+   LOCATION_NULL
+};
+
+enum osk_driver_enum
+{
+   OSK_PS3                  = LOCATION_NULL + 1,
+   OSK_NULL
+};
+
+enum menu_driver_enum
+{
+   MENU_RGUI                = OSK_NULL + 1,
+   MENU_XUI,
+   MENU_MATERIALUI,
+   MENU_XMB,
+   MENU_NUKLEAR,
+   MENU_NULL
+};
+
+enum record_driver_enum
+{
+   RECORD_FFMPEG            = MENU_NULL + 1,
+   RECORD_NULL
+};
+
+
+#if defined(HAVE_OPENGL) || defined(HAVE_OPENGLES) || defined(__CELLOS_LV2__)
+static enum video_driver_enum VIDEO_DEFAULT_DRIVER = VIDEO_GL;
+#elif defined(GEKKO)
+static enum video_driver_enum VIDEO_DEFAULT_DRIVER = VIDEO_WII;
+#elif defined(WIIU)
+static enum video_driver_enum VIDEO_DEFAULT_DRIVER = VIDEO_WIIU;
+#elif defined(XENON)
+static enum video_driver_enum VIDEO_DEFAULT_DRIVER = VIDEO_XENON360;
+#elif (defined(_XBOX1) || defined(_XBOX360)) && (defined(HAVE_D3D8) || defined(HAVE_D3D9))
+static enum video_driver_enum VIDEO_DEFAULT_DRIVER = VIDEO_XDK_D3D;
+#elif defined(HAVE_D3D9)
+static enum video_driver_enum VIDEO_DEFAULT_DRIVER = VIDEO_D3D9;
+#elif defined(HAVE_VG)
+static enum video_driver_enum VIDEO_DEFAULT_DRIVER = VIDEO_VG;
+#elif defined(HAVE_VITA2D)
+static enum video_driver_enum VIDEO_DEFAULT_DRIVER = VIDEO_VITA2D;
+#elif defined(PSP)
+static enum video_driver_enum VIDEO_DEFAULT_DRIVER = VIDEO_PSP1;
+#elif defined(_3DS)
+static enum video_driver_enum VIDEO_DEFAULT_DRIVER = VIDEO_CTR;
+#elif defined(HAVE_XVIDEO)
+static enum video_driver_enum VIDEO_DEFAULT_DRIVER = VIDEO_XVIDEO;
+#elif defined(HAVE_SDL)
+static enum video_driver_enum VIDEO_DEFAULT_DRIVER = VIDEO_SDL;
+#elif defined(HAVE_SDL2)
+static enum video_driver_enum VIDEO_DEFAULT_DRIVER = VIDEO_SDL2;
+#elif defined(_WIN32) && !defined(_XBOX)
+static enum video_driver_enum VIDEO_DEFAULT_DRIVER = VIDEO_GDI;
+#elif defined(DJGPP)
+static enum video_driver_enum VIDEO_DEFAULT_DRIVER = VIDEO_VGA;
+#elif defined(HAVE_DYLIB) && !defined(ANDROID)
+static enum video_driver_enum VIDEO_DEFAULT_DRIVER = VIDEO_EXT;
+#else
+static enum video_driver_enum VIDEO_DEFAULT_DRIVER = VIDEO_NULL;
+#endif
+
+#if defined(__CELLOS_LV2__)
+static enum audio_driver_enum AUDIO_DEFAULT_DRIVER = AUDIO_PS3;
+#elif defined(XENON)
+static enum audio_driver_enum AUDIO_DEFAULT_DRIVER = AUDIO_XENON360;
+#elif defined(GEKKO)
+static enum audio_driver_enum AUDIO_DEFAULT_DRIVER = AUDIO_WII;
+#elif defined(WIIU)
+static enum audio_driver_enum AUDIO_DEFAULT_DRIVER = AUDIO_WIIU;
+#elif defined(PSP) || defined(VITA)
+static enum audio_driver_enum AUDIO_DEFAULT_DRIVER = AUDIO_PSP;
+#elif defined(_3DS)
+static enum audio_driver_enum AUDIO_DEFAULT_DRIVER = AUDIO_CTR;
+#elif defined(HAVE_PULSE)
+static enum audio_driver_enum AUDIO_DEFAULT_DRIVER = AUDIO_PULSE;
+#elif defined(HAVE_ALSA) && defined(HAVE_VIDEOCORE)
+static enum audio_driver_enum AUDIO_DEFAULT_DRIVER = AUDIO_ALSATHREAD;
+#elif defined(HAVE_ALSA)
+static enum audio_driver_enum AUDIO_DEFAULT_DRIVER = AUDIO_ALSA;
+#elif defined(HAVE_OSS)
+static enum audio_driver_enum AUDIO_DEFAULT_DRIVER = AUDIO_OSS;
+#elif defined(HAVE_JACK)
+static enum audio_driver_enum AUDIO_DEFAULT_DRIVER = AUDIO_JACK;
+#elif defined(HAVE_COREAUDIO)
+static enum audio_driver_enum AUDIO_DEFAULT_DRIVER = AUDIO_COREAUDIO;
+#elif defined(HAVE_XAUDIO)
+static enum audio_driver_enum AUDIO_DEFAULT_DRIVER = AUDIO_XAUDIO;
+#elif defined(HAVE_DSOUND)
+static enum audio_driver_enum AUDIO_DEFAULT_DRIVER = AUDIO_DSOUND;
+#elif defined(HAVE_WASAPI)
+static enum audio_driver_enum AUDIO_DEFAULT_DRIVER = AUDIO_WASAPI;
+#elif defined(HAVE_AL)
+static enum audio_driver_enum AUDIO_DEFAULT_DRIVER = AUDIO_AL;
+#elif defined(HAVE_SL)
+static enum audio_driver_enum AUDIO_DEFAULT_DRIVER = AUDIO_SL;
+#elif defined(EMSCRIPTEN)
+static enum audio_driver_enum AUDIO_DEFAULT_DRIVER = AUDIO_RWEBAUDIO;
+#elif defined(HAVE_SDL)
+static enum audio_driver_enum AUDIO_DEFAULT_DRIVER = AUDIO_SDL;
+#elif defined(HAVE_SDL2)
+static enum audio_driver_enum AUDIO_DEFAULT_DRIVER = AUDIO_SDL2;
+#elif defined(HAVE_RSOUND)
+static enum audio_driver_enum AUDIO_DEFAULT_DRIVER = AUDIO_RSOUND;
+#elif defined(HAVE_ROAR)
+static enum audio_driver_enum AUDIO_DEFAULT_DRIVER = AUDIO_ROAR;
+#elif defined(HAVE_DYLIB) && !defined(ANDROID)
+static enum audio_driver_enum AUDIO_DEFAULT_DRIVER = AUDIO_EXT;
+#else
+static enum audio_driver_enum AUDIO_DEFAULT_DRIVER = AUDIO_NULL;
+#endif
+
+#if defined(PSP) || defined(EMSCRIPTEN)
+static enum audio_resampler_driver_enum AUDIO_DEFAULT_RESAMPLER_DRIVER = AUDIO_RESAMPLER_CC;
+#else
+static enum audio_resampler_driver_enum AUDIO_DEFAULT_RESAMPLER_DRIVER = AUDIO_RESAMPLER_SINC;
+#endif
+
+#if defined(HAVE_FFMPEG)
+static enum record_driver_enum RECORD_DEFAULT_DRIVER = RECORD_FFMPEG;
+#else
+static enum record_driver_enum RECORD_DEFAULT_DRIVER = RECORD_NULL;
+#endif
+
+#if defined(XENON)
+static enum input_driver_enum INPUT_DEFAULT_DRIVER = INPUT_XENON360;
+#elif defined(_XBOX360) || defined(_XBOX) || defined(HAVE_XINPUT2) || defined(HAVE_XINPUT_XBOX1)
+static enum input_driver_enum INPUT_DEFAULT_DRIVER = INPUT_XINPUT;
+#elif defined(ANDROID)
+static enum input_driver_enum INPUT_DEFAULT_DRIVER = INPUT_ANDROID;
+#elif defined(EMSCRIPTEN) && defined(HAVE_SDL2)
+static enum input_driver_enum INPUT_DEFAULT_DRIVER = INPUT_SDL2;
+#elif defined(EMSCRIPTEN)
+static enum input_driver_enum INPUT_DEFAULT_DRIVER = INPUT_RWEBINPUT;
+#elif defined(_WIN32)
+static enum input_driver_enum INPUT_DEFAULT_DRIVER = INPUT_DINPUT;
+#elif defined(__CELLOS_LV2__)
+static enum input_driver_enum INPUT_DEFAULT_DRIVER = INPUT_PS3;
+#elif defined(PSP) || defined(VITA)
+static enum input_driver_enum INPUT_DEFAULT_DRIVER = INPUT_PSP;
+#elif defined(_3DS)
+static enum input_driver_enum INPUT_DEFAULT_DRIVER = INPUT_CTR;
+#elif defined(GEKKO)
+static enum input_driver_enum INPUT_DEFAULT_DRIVER = INPUT_WII;
+#elif defined(WIIU)
+static enum input_driver_enum INPUT_DEFAULT_DRIVER = INPUT_WIIU;
+#elif defined(HAVE_UDEV)
+static enum input_driver_enum INPUT_DEFAULT_DRIVER = INPUT_UDEV;
+#elif defined(__linux__) && !defined(ANDROID)
+static enum input_driver_enum INPUT_DEFAULT_DRIVER = INPUT_LINUXRAW;
+#elif defined(HAVE_X11)
+static enum input_driver_enum INPUT_DEFAULT_DRIVER = INPUT_X;
+#elif defined(HAVE_WAYLAND)
+static enum input_driver_enum INPUT_DEFAULT_DRIVER = INPUT_WAYLAND;
+#elif defined(HAVE_COCOA) || defined(HAVE_COCOATOUCH)
+static enum input_driver_enum INPUT_DEFAULT_DRIVER = INPUT_COCOA;
+#elif defined(__QNX__)
+static enum input_driver_enum INPUT_DEFAULT_DRIVER = INPUT_QNX;
+#elif defined(HAVE_SDL)
+static enum input_driver_enum INPUT_DEFAULT_DRIVER = INPUT_SDL;
+#elif defined(HAVE_SDL2)
+static enum input_driver_enum INPUT_DEFAULT_DRIVER = INPUT_SDL2;
+#elif defined(DJGPP)
+static enum input_driver_enum INPUT_DEFAULT_DRIVER = INPUT_DOS;
+#else
+static enum input_driver_enum INPUT_DEFAULT_DRIVER = INPUT_NULL;
+#endif
+
+#if defined(__CELLOS_LV2__)
+static enum joypad_driver_enum JOYPAD_DEFAULT_DRIVER = JOYPAD_PS3;
+#elif defined(HAVE_XINPUT)
+static enum joypad_driver_enum JOYPAD_DEFAULT_DRIVER = JOYPAD_XINPUT;
+#elif defined(GEKKO)
+static enum joypad_driver_enum JOYPAD_DEFAULT_DRIVER = JOYPAD_GX;
+#elif defined(WIIU)
+static enum joypad_driver_enum JOYPAD_DEFAULT_DRIVER = JOYPAD_WIIU;
+#elif defined(_XBOX)
+static enum joypad_driver_enum JOYPAD_DEFAULT_DRIVER = JOYPAD_XDK;
+#elif defined(PSP) || defined(VITA)
+static enum joypad_driver_enum JOYPAD_DEFAULT_DRIVER = JOYPAD_PSP;
+#elif defined(_3DS)
+static enum joypad_driver_enum JOYPAD_DEFAULT_DRIVER = JOYPAD_CTR;
+#elif defined(HAVE_DINPUT)
+static enum joypad_driver_enum JOYPAD_DEFAULT_DRIVER = JOYPAD_DINPUT;
+#elif defined(HAVE_UDEV)
+static enum joypad_driver_enum JOYPAD_DEFAULT_DRIVER = JOYPAD_UDEV;
+#elif defined(__linux) && !defined(ANDROID)
+static enum joypad_driver_enum JOYPAD_DEFAULT_DRIVER = JOYPAD_LINUXRAW;
+#elif defined(ANDROID)
+static enum joypad_driver_enum JOYPAD_DEFAULT_DRIVER = JOYPAD_ANDROID;
+#elif defined(HAVE_SDL) || defined(HAVE_SDL2)
+static enum joypad_driver_enum JOYPAD_DEFAULT_DRIVER = JOYPAD_SDL;
+#elif defined(DJGPP)
+static enum joypad_driver_enum JOYPAD_DEFAULT_DRIVER = JOYPAD_DOS;
+#elif defined(HAVE_HID)
+static enum joypad_driver_enum JOYPAD_DEFAULT_DRIVER = JOYPAD_HID;
+#elif defined(__QNX__)
+static enum joypad_driver_enum JOYPAD_DEFAULT_DRIVER = JOYPAD_QNX;
+#else
+static enum joypad_driver_enum JOYPAD_DEFAULT_DRIVER = JOYPAD_NULL;
+#endif
+
+#if defined(HAVE_V4L2)
+static enum camera_driver_enum CAMERA_DEFAULT_DRIVER = CAMERA_V4L2;
+#elif defined(EMSCRIPTEN)
+static enum camera_driver_enum CAMERA_DEFAULT_DRIVER = CAMERA_RWEBCAM;
+#elif defined(ANDROID)
+static enum camera_driver_enum CAMERA_DEFAULT_DRIVER = CAMERA_ANDROID;
+#elif defined(HAVE_AVFOUNDATION) && (defined(HAVE_COCOA) || defined(HAVE_COCOATOUCH))
+static enum camera_driver_enum CAMERA_DEFAULT_DRIVER = CAMERA_AVFOUNDATION;
+#else
+static enum camera_driver_enum CAMERA_DEFAULT_DRIVER = CAMERA_NULL;
+#endif
+
+#if defined(HAVE_LAKKA)
+static enum wifi_driver_enum WIFI_DEFAULT_DRIVER = WIFI_CONNMANCTL;
+#else
+static enum wifi_driver_enum WIFI_DEFAULT_DRIVER = WIFI_NULL;
+#endif
+
+#if defined(ANDROID)
+static enum location_driver_enum LOCATION_DEFAULT_DRIVER = LOCATION_ANDROID;
+#elif defined(HAVE_CORELOCATION) && (defined(HAVE_COCOA) || defined(HAVE_COCOATOUCH))
+static enum location_driver_enum LOCATION_DEFAULT_DRIVER = LOCATION_CORELOCATION;
+#else
+static enum location_driver_enum LOCATION_DEFAULT_DRIVER = LOCATION_NULL;
+#endif
+
+#if defined(HAVE_XUI)
+static enum menu_driver_enum MENU_DEFAULT_DRIVER = MENU_XUI;
+#elif defined(HAVE_MATERIALUI) && defined(RARCH_MOBILE)
+static enum menu_driver_enum MENU_DEFAULT_DRIVER = MENU_MATERIALUI;
+#elif defined(HAVE_XMB)
+static enum menu_driver_enum MENU_DEFAULT_DRIVER = MENU_XMB;
+#elif defined(HAVE_RGUI)
+static enum menu_driver_enum MENU_DEFAULT_DRIVER = MENU_RGUI;
+#else
+static enum menu_driver_enum MENU_DEFAULT_DRIVER = MENU_NULL;
+#endif
+
+
 #define GENERAL_SETTING(key, configval, default_enable, default_setting, type, handle_setting) \
 { \
    tmp[count].ident      = key; \
diff --git a/griffin/griffin.c b/griffin/griffin.c
index cd66acbc9c..5be8e8af3a 100644
--- a/griffin/griffin.c
+++ b/griffin/griffin.c
@@ -134,7 +134,7 @@ ACHIEVEMENTS
 
 #include "../libretro-common/formats/json/jsonsax.c"
 #include "../network/net_http_special.c"
-#include "../tasks/task_cheevos.c"
+#include "../cheevos/cheevos.c"
 #endif
 
 /*============================================================
diff --git a/libretro-common/audio/audio_mixer.c b/libretro-common/audio/audio_mixer.c
index 796d725068..f5b5d038c0 100644
--- a/libretro-common/audio/audio_mixer.c
+++ b/libretro-common/audio/audio_mixer.c
@@ -425,10 +425,10 @@ audio_mixer_voice_t* audio_mixer_play(audio_mixer_sound_t* sound, bool repeat,
       float volume, audio_mixer_stop_cb_t stop_cb)
 {
    unsigned i;
-   audio_mixer_voice_t* voice = NULL;
    bool res                   = false;
+   audio_mixer_voice_t* voice = s_voices;
    
-   for (i = 0, voice = s_voices; i < AUDIO_MIXER_MAX_VOICES; i++, voice++)
+   for (i = 0; i < AUDIO_MIXER_MAX_VOICES; i++, voice++)
    {
       if (voice->type == AUDIO_MIXER_TYPE_NONE)
       {
@@ -455,7 +455,8 @@ audio_mixer_voice_t* audio_mixer_play(audio_mixer_sound_t* sound, bool repeat,
 
 void audio_mixer_stop(audio_mixer_voice_t* voice)
 {
-   voice->stop_cb(voice, AUDIO_MIXER_SOUND_STOPPED);
+   if (voice && voice->stop_cb)
+      voice->stop_cb(voice, AUDIO_MIXER_SOUND_STOPPED);
 }
 
 static void mix_wav(float* buffer, size_t num_frames, audio_mixer_voice_t* voice)
@@ -579,9 +580,9 @@ void audio_mixer_mix(float* buffer, size_t num_frames)
    unsigned i;
    size_t j                   = 0;
    float* sample              = NULL;
-   audio_mixer_voice_t* voice = NULL;
+   audio_mixer_voice_t* voice = s_voices;
    
-   for (i = 0, voice = s_voices; i < AUDIO_MIXER_MAX_VOICES; i++, voice++)
+   for (i = 0; i < AUDIO_MIXER_MAX_VOICES; i++, voice++)
    {
       if (voice->type == AUDIO_MIXER_TYPE_WAV)
          mix_wav(buffer, num_frames, voice);
diff --git a/movie.c b/movie.c
index 0f57076b61..5b3179b82b 100644
--- a/movie.c
+++ b/movie.c
@@ -73,7 +73,7 @@ static struct bsv_state bsv_movie_state;
 
 static bool bsv_movie_init_playback(bsv_movie_t *handle, const char *path)
 {
-   uint32_t state_size;
+   uint32_t state_size       = 0;
    uint32_t content_crc      = 0;
    uint32_t header[4]        = {0};
    RFILE *file               = filestream_open(path, RFILE_MODE_READ, -1);
@@ -149,7 +149,7 @@ static bool bsv_movie_init_playback(bsv_movie_t *handle, const char *path)
 static bool bsv_movie_init_record(bsv_movie_t *handle, const char *path)
 {
    retro_ctx_size_info_t info;
-   uint32_t state_size;
+   uint32_t state_size       = 0;
    uint32_t content_crc      = 0;
    uint32_t header[4]        = {0};
    RFILE *file               = filestream_open(path, RFILE_MODE_WRITE, -1);
@@ -464,9 +464,11 @@ void bsv_movie_set_start_path(const char *path)
 bool bsv_movie_init_handle(const char *path,
       enum rarch_movie_type type)
 {
-   bsv_movie_state_handle = bsv_movie_init_internal(path, type);
-   if (!bsv_movie_state_handle)
+   bsv_movie_t *state     = bsv_movie_init_internal(path, type);
+   if (!state)
       return false;
+
+   bsv_movie_state_handle = state;
    return true;
 }
 
@@ -536,24 +538,20 @@ static bool runloop_check_movie_init(void)
    bsv_movie_init_handle(path, RARCH_MOVIE_RECORD);
 
    if (!bsv_movie_state_handle)
-      return false;
-
-   if (bsv_movie_state_handle)
-   {
-      runloop_msg_queue_push(msg, 2, 180, true);
-      RARCH_LOG("%s \"%s\".\n",
-            msg_hash_to_str(MSG_STARTING_MOVIE_RECORD_TO),
-            path);
-   }
-   else
    {
       runloop_msg_queue_push(
             msg_hash_to_str(MSG_FAILED_TO_START_MOVIE_RECORD),
             2, 180, true);
       RARCH_ERR("%s\n",
             msg_hash_to_str(MSG_FAILED_TO_START_MOVIE_RECORD));
+      return false;
    }
 
+   runloop_msg_queue_push(msg, 2, 180, true);
+   RARCH_LOG("%s \"%s\".\n",
+         msg_hash_to_str(MSG_STARTING_MOVIE_RECORD_TO),
+         path);
+
    return true;
 }
 
diff --git a/network/httpserver/httpserver.c b/network/httpserver/httpserver.c
index c46ba87f2f..77b7c79a16 100644
--- a/network/httpserver/httpserver.c
+++ b/network/httpserver/httpserver.c
@@ -29,7 +29,7 @@
 #include "../../core.h"
 #include "../../gfx/video_driver.h"
 #include "../../managers/core_option_manager.h"
-#include "../../tasks/task_cheevos.h"
+#include "../../cheevos/cheevos.h"
 #include "../../content.h"
 
 #define BASIC_INFO "info"
diff --git a/retroarch.c b/retroarch.c
index 2de763d56c..259827db50 100644
--- a/retroarch.c
+++ b/retroarch.c
@@ -1044,7 +1044,8 @@ bool retroarch_main_init(int argc, char *argv[])
       return false;
    }
 
-   rarch_ctl(RARCH_CTL_SET_ERROR_ON_INIT, NULL);
+   rarch_error_on_init = true;
+
    retro_main_log_file_init(NULL);
    retroarch_parse_input(argc, argv);
 
@@ -1116,14 +1117,14 @@ bool retroarch_main_init(int argc, char *argv[])
 
    command_event(CMD_EVENT_SET_PER_GAME_RESOLUTION, NULL);
 
-   rarch_ctl(RARCH_CTL_UNSET_ERROR_ON_INIT, NULL);
-   rarch_ctl(RARCH_CTL_SET_INITED, NULL);
+   rarch_error_on_init     = false;
+   rarch_is_inited         = true;
 
    return true;
 
 error:
    command_event(CMD_EVENT_CORE_DEINIT, NULL);
-   rarch_ctl(RARCH_CTL_UNSET_INITED, NULL);
+   rarch_is_inited         = false;
    return false;
 }
 
@@ -1190,12 +1191,6 @@ bool rarch_ctl(enum rarch_ctl_state state, void *data)
          return has_set_username;
       case RARCH_CTL_IS_INITED:
          return rarch_is_inited;
-      case RARCH_CTL_UNSET_INITED:
-         rarch_is_inited         = false;
-         break;
-      case RARCH_CTL_SET_INITED:
-         rarch_is_inited         = true;
-         break;
       case RARCH_CTL_DESTROY:
          has_set_username        = false;
          rarch_is_inited         = false;
@@ -1250,7 +1245,7 @@ bool rarch_ctl(enum rarch_ctl_state state, void *data)
          path_deinit_subsystem();
          path_deinit_savefile();
 
-         rarch_ctl(RARCH_CTL_UNSET_INITED, NULL);
+         rarch_is_inited         = false;
 
 #ifdef HAVE_THREAD_STORAGE
          sthread_tls_delete(&rarch_tls);
@@ -1313,14 +1308,6 @@ bool rarch_ctl(enum rarch_ctl_state state, void *data)
       case RARCH_CTL_UNSET_SRAM_ENABLE:
          rarch_use_sram = false;
          break;
-      case RARCH_CTL_SET_ERROR_ON_INIT:
-         rarch_error_on_init = true;
-         break;
-      case RARCH_CTL_UNSET_ERROR_ON_INIT:
-         rarch_error_on_init = false;
-         break;
-      case RARCH_CTL_IS_ERROR_ON_INIT:
-         return rarch_error_on_init;
       case RARCH_CTL_SET_FORCE_FULLSCREEN:
          rarch_force_fullscreen = true;
          break;
@@ -1671,8 +1658,28 @@ void retroarch_fail(int error_code, const char *error)
    /* We cannot longjmp unless we're in retroarch_main_init().
     * If not, something went very wrong, and we should
     * just exit right away. */
-   retro_assert(rarch_ctl(RARCH_CTL_IS_ERROR_ON_INIT, NULL));
+   retro_assert(rarch_error_on_init);
 
    strlcpy(error_string, error, sizeof(error_string));
    longjmp(error_sjlj_context, error_code);
 }
+
+bool retroarch_main_quit(void)
+{
+   command_event(CMD_EVENT_AUTOSAVE_STATE, NULL);
+   command_event(CMD_EVENT_DISABLE_OVERRIDES, NULL);
+   command_event(CMD_EVENT_RESTORE_DEFAULT_SHADER_PRESET, NULL);
+
+#ifdef HAVE_DYNAMIC
+#ifdef HAVE_MENU
+   menu_driver_ctl(RARCH_MENU_CTL_SYSTEM_INFO_DEINIT, NULL);
+#endif
+#endif
+
+   runloop_ctl(RUNLOOP_CTL_SET_SHUTDOWN, NULL);
+#ifdef HAVE_MENU
+   rarch_ctl(RARCH_CTL_MENU_RUNNING_FINISHED, NULL);
+#endif
+
+   return true;
+}
diff --git a/retroarch.h b/retroarch.h
index 32d9a860aa..3e22d5ac08 100644
--- a/retroarch.h
+++ b/retroarch.h
@@ -39,10 +39,6 @@ enum rarch_ctl_state
    /* Deinitializes RetroArch. */
    RARCH_CTL_MAIN_DEINIT,
 
-   RARCH_CTL_UNSET_INITED,
-
-   RARCH_CTL_SET_INITED,
-
    RARCH_CTL_IS_INITED,
 
    RARCH_CTL_IS_PLAIN_CORE,
@@ -98,11 +94,6 @@ enum rarch_ctl_state
    RARCH_CTL_UNSET_BLOCK_CONFIG_READ,
    RARCH_CTL_IS_BLOCK_CONFIG_READ,
 
-   /* Error */
-   RARCH_CTL_SET_ERROR_ON_INIT,
-   RARCH_CTL_UNSET_ERROR_ON_INIT,
-   RARCH_CTL_IS_ERROR_ON_INIT,
-
    /* Username */
    RARCH_CTL_HAS_SET_USERNAME,
    RARCH_CTL_USERNAME_SET,
@@ -191,6 +182,8 @@ void retroarch_fail(int error_code, const char *error);
  **/
 bool retroarch_main_init(int argc, char *argv[]);
 
+bool retroarch_main_quit(void);
+
 RETRO_END_DECLS
 
 #endif
diff --git a/runloop.c b/runloop.c
index a46fc524ae..0e3a8dc44f 100644
--- a/runloop.c
+++ b/runloop.c
@@ -56,6 +56,7 @@
 #endif
 
 #include "autosave.h"
+#include "command.h"
 #include "configuration.h"
 #include "driver.h"
 #include "movie.h"
@@ -447,14 +448,6 @@ bool runloop_ctl(enum runloop_ctl_state state, void *data)
             runloop_idle = *ptr;
          }
          break;
-      case RUNLOOP_CTL_SET_SLOWMOTION:
-         {
-            bool *ptr = (bool*)data;
-            if (!ptr)
-               return false;
-            runloop_slowmotion = *ptr;
-         }
-         break;
       case RUNLOOP_CTL_SET_PAUSED:
          {
             bool *ptr = (bool*)data;
@@ -516,9 +509,6 @@ bool runloop_ctl(enum runloop_ctl_state state, void *data)
          break;
       case RUNLOOP_CTL_IS_SHUTDOWN:
          return runloop_shutdown_initiated;
-      case RUNLOOP_CTL_SET_EXEC:
-         runloop_exec = true;
-         break;
       case RUNLOOP_CTL_DATA_DEINIT:
          task_queue_deinit();
          break;
@@ -750,7 +740,10 @@ static enum runloop_state runloop_check_state(
          content_info.environ_get        = NULL;
 
          if (!task_push_start_dummy_core(&content_info))
+         {
+            retroarch_main_quit();
             return RUNLOOP_STATE_QUIT;
+         }
 
          /* Loads dummy core instead of exiting RetroArch completely.
           * Aborts core shutdown if invoked. */
@@ -758,7 +751,10 @@ static enum runloop_state runloop_check_state(
          runloop_core_shutdown_initiated = false;
       }
       else
+      {
+         retroarch_main_quit();
          return RUNLOOP_STATE_QUIT;
+      }
    }
 
 #ifdef HAVE_MENU
diff --git a/runloop.h b/runloop.h
index f2899307f2..363dae314e 100644
--- a/runloop.h
+++ b/runloop.h
@@ -68,8 +68,6 @@ enum runloop_ctl_state
 
    RUNLOOP_CTL_SET_LIBRETRO_PATH,
 
-   RUNLOOP_CTL_SET_SLOWMOTION,
-   
    RUNLOOP_CTL_IS_PAUSED,
    RUNLOOP_CTL_SET_PAUSED,
    RUNLOOP_CTL_SET_MAX_FRAMES,
@@ -80,8 +78,6 @@ enum runloop_ctl_state
    RUNLOOP_CTL_SET_SHUTDOWN,
    RUNLOOP_CTL_IS_SHUTDOWN,
 
-   RUNLOOP_CTL_SET_EXEC,
-
    /* Runloop state */
    RUNLOOP_CTL_CLEAR_STATE,
    RUNLOOP_CTL_STATE_FREE,
diff --git a/tasks/task_content.c b/tasks/task_content.c
index 780dd7eac1..77caf2358b 100644
--- a/tasks/task_content.c
+++ b/tasks/task_content.c
@@ -1051,10 +1051,10 @@ bool task_push_start_dummy_core(content_ctx_info_t *content_info)
 
    /* Preliminary stuff that has to be done before we
     * load the actual content. Can differ per mode. */
-   runloop_ctl(RUNLOOP_CTL_STATE_FREE, NULL);
 #ifdef HAVE_MENU
    menu_driver_ctl(RARCH_MENU_CTL_UNSET_LOAD_NO_CONTENT, NULL);
 #endif
+   runloop_ctl(RUNLOOP_CTL_STATE_FREE, NULL);
    runloop_ctl(RUNLOOP_CTL_DATA_DEINIT, NULL);
    runloop_ctl(RUNLOOP_CTL_TASK_INIT, NULL);