From 295025eba6e32b55c42c98ff6d6c355c5b7233cc Mon Sep 17 00:00:00 2001
From: twinaphex <libretro@gmail.com>
Date: Sun, 7 Jun 2015 23:55:57 +0200
Subject: [PATCH 01/14] Refactor menu_entries_common_is_settings_entry

---
 menu/menu_entries_cbs.c               | 6 ++----
 menu/menu_entries_cbs.h               | 2 +-
 menu/menu_entries_cbs_deferred_push.c | 2 +-
 menu/menu_entries_cbs_left.c          | 2 +-
 menu/menu_entries_cbs_right.c         | 2 +-
 menu/menu_entries_cbs_title.c         | 6 +++---
 6 files changed, 9 insertions(+), 11 deletions(-)

diff --git a/menu/menu_entries_cbs.c b/menu/menu_entries_cbs.c
index a76b0de45d..1b90051ed3 100644
--- a/menu/menu_entries_cbs.c
+++ b/menu/menu_entries_cbs.c
@@ -130,11 +130,9 @@ int cb_core_updater_download(void *data, size_t len)
 }
 #endif
 
-int menu_entries_common_is_settings_entry(const char *label)
+int menu_entries_common_is_settings_entry(uint32_t label_hash)
 {
-   uint32_t    hash = djb2_calculate(label);
-
-   switch (hash)
+   switch (label_hash)
    {
       case MENU_LABEL_DRIVER_SETTINGS:
       case MENU_LABEL_CORE_SETTINGS:
diff --git a/menu/menu_entries_cbs.h b/menu/menu_entries_cbs.h
index 88fa052df4..46fcc9bac6 100644
--- a/menu/menu_entries_cbs.h
+++ b/menu/menu_entries_cbs.h
@@ -45,7 +45,7 @@ int action_right_cheat(unsigned type, const char *label,
 
 void menu_entries_common_load_content(bool persist);
 
-int menu_entries_common_is_settings_entry(const char *label);
+int menu_entries_common_is_settings_entry(uint32_t label_hash);
 
 int menu_entries_cbs_init_bind_left(menu_file_list_cbs_t *cbs,
       const char *path, const char *label, unsigned type, size_t idx,
diff --git a/menu/menu_entries_cbs_deferred_push.c b/menu/menu_entries_cbs_deferred_push.c
index 64724159a2..4f06b73065 100644
--- a/menu/menu_entries_cbs_deferred_push.c
+++ b/menu/menu_entries_cbs_deferred_push.c
@@ -645,7 +645,7 @@ int menu_entries_cbs_init_bind_deferred_push(menu_file_list_cbs_t *cbs,
 
    if ((strlen(elem1) != 0) && !!strcmp(elem0, elem1))
    {
-      if (menu_entries_common_is_settings_entry(elem0))
+      if (menu_entries_common_is_settings_entry(label_hash))
       {
          if (!settings->menu.collapse_subgroups_enable)
          {
diff --git a/menu/menu_entries_cbs_left.c b/menu/menu_entries_cbs_left.c
index ee00caa964..cbb19f3c5b 100644
--- a/menu/menu_entries_cbs_left.c
+++ b/menu/menu_entries_cbs_left.c
@@ -350,7 +350,7 @@ static int menu_entries_cbs_init_bind_left_compare_label(menu_file_list_cbs_t *c
 
    if (label)
    {
-      if (menu_entries_common_is_settings_entry(elem0))
+      if (menu_entries_common_is_settings_entry(label_hash))
       {
          cbs->action_left = action_left_scroll;
          return 0;
diff --git a/menu/menu_entries_cbs_right.c b/menu/menu_entries_cbs_right.c
index a06b23846a..616ebed433 100644
--- a/menu/menu_entries_cbs_right.c
+++ b/menu/menu_entries_cbs_right.c
@@ -422,7 +422,7 @@ static int menu_entries_cbs_init_bind_right_compare_label(menu_file_list_cbs_t *
 
    if (label)
    {
-      if (menu_entries_common_is_settings_entry(elem0))
+      if (menu_entries_common_is_settings_entry(label_hash))
       {
          cbs->action_right = action_right_scroll;
          return 0;
diff --git a/menu/menu_entries_cbs_title.c b/menu/menu_entries_cbs_title.c
index 9d5bffcadd..1ed56d099e 100644
--- a/menu/menu_entries_cbs_title.c
+++ b/menu/menu_entries_cbs_title.c
@@ -70,11 +70,13 @@ static int action_get_title_default(const char *path, const char *label,
       string_list_free(list_path);
    }
 
+   hash = djb2_calculate(label);
+
 #if 0
    RARCH_LOG("label %s, elem0 %s, elem1 %s\n", label, elem0, elem1);
 #endif
 
-   if (menu_entries_common_is_settings_entry(label) == 1)
+   if (menu_entries_common_is_settings_entry(hash) == 1)
    {
       strlcpy(s, string_to_upper(elem0), len);
       if (elem1[0] != '\0')
@@ -84,8 +86,6 @@ static int action_get_title_default(const char *path, const char *label,
       }
       return 0;
    }
-    
-   hash = djb2_calculate(label);
 
    switch (hash)
    {

From 1ed787cc803db5308f2bfcf5f7acb347588edf84 Mon Sep 17 00:00:00 2001
From: twinaphex <libretro@gmail.com>
Date: Mon, 8 Jun 2015 00:02:04 +0200
Subject: [PATCH 02/14] (menu_entries_cbs_title.c) Refactors

---
 menu/menu_entries_cbs_title.c | 57 ++++++++++++++++++-----------------
 1 file changed, 29 insertions(+), 28 deletions(-)

diff --git a/menu/menu_entries_cbs_title.c b/menu/menu_entries_cbs_title.c
index 1ed56d099e..4de4f98fae 100644
--- a/menu/menu_entries_cbs_title.c
+++ b/menu/menu_entries_cbs_title.c
@@ -45,6 +45,7 @@ static int action_get_title_default(const char *path, const char *label,
    char elem0_path[PATH_MAX_LENGTH], elem1_path[PATH_MAX_LENGTH];
    struct string_list *list_label = string_split(label, "|");
    struct string_list *list_path  = string_split(path, "|");
+   driver_t               *driver = driver_get_ptr();
 
    *elem0 = *elem1 = *elem0_path = *elem1_path = 0;
 
@@ -283,36 +284,36 @@ static int action_get_title_default(const char *path, const char *label,
          snprintf(s, len, "AUTOCONFIG DIR %s", path);
          break;
       default:
-         if (menu_type == MENU_SETTINGS_CUSTOM_VIEWPORT ||
-               menu_type == MENU_SETTINGS)
-            snprintf(s, len, "MENU %s", path);
-         else if (menu_type == MENU_SETTINGS_CUSTOM_BIND ||
-               menu_type == MENU_SETTINGS_CUSTOM_BIND_KEYBOARD)
+         switch (menu_type)
          {
-            strlcpy(s, "INPUT SETTINGS", len);
-            if (elem1[0] != '\0')
-            {
-               strlcat(s, " - ", len);
-               strlcat(s, string_to_upper(elem1), len);
-            }
-         }
-         else
-         {
-            driver_t *driver = driver_get_ptr();
+            case MENU_SETTINGS_CUSTOM_VIEWPORT:
+            case MENU_SETTINGS:
+               snprintf(s, len, "MENU %s", path);
+               break;
+            case MENU_SETTINGS_CUSTOM_BIND:
+            case MENU_SETTINGS_CUSTOM_BIND_KEYBOARD:
+               strlcpy(s, "INPUT SETTINGS", len);
+               if (elem1[0] != '\0')
+               {
+                  strlcat(s, " - ", len);
+                  strlcat(s, string_to_upper(elem1), len);
+               }
+               break;
+            default:
+               if (driver->menu->defer_core)
+                  snprintf(s, len, "CONTENT %s", path);
+               else
+               {
+                  global_t *global      = global_get_ptr();
+                  const char *core_name = global->menu.info.library_name;
 
-            if (driver->menu->defer_core)
-               snprintf(s, len, "CONTENT %s", path);
-            else
-            {
-               global_t *global      = global_get_ptr();
-               const char *core_name = global->menu.info.library_name;
-
-               if (!core_name)
-                  core_name = global->system.info.library_name;
-               if (!core_name)
-                  core_name = "No Core";
-               snprintf(s, len, "CONTENT (%s) %s", core_name, path);
-            }
+                  if (!core_name)
+                     core_name = global->system.info.library_name;
+                  if (!core_name)
+                     core_name = "No Core";
+                  snprintf(s, len, "CONTENT (%s) %s", core_name, path);
+               }
+               break;
          }
          break;
    }

From 8f31edf14b9d826e42b97f11043aa545f564b579 Mon Sep 17 00:00:00 2001
From: twinaphex <libretro@gmail.com>
Date: Mon, 8 Jun 2015 00:09:12 +0200
Subject: [PATCH 03/14] (menu_entries_cbs_deferred_push.c) Cleanups

---
 menu/menu_entries_cbs_deferred_push.c | 26 +++++++++++++-------------
 1 file changed, 13 insertions(+), 13 deletions(-)

diff --git a/menu/menu_entries_cbs_deferred_push.c b/menu/menu_entries_cbs_deferred_push.c
index 4f06b73065..3b1d74c4c3 100644
--- a/menu/menu_entries_cbs_deferred_push.c
+++ b/menu/menu_entries_cbs_deferred_push.c
@@ -460,19 +460,6 @@ static int menu_entries_cbs_init_bind_deferred_push_compare_label(menu_file_list
 {
    if (strstr(label, "deferred_rdb_entry_detail"))
       cbs->action_deferred_push = deferred_push_rdb_entry_detail;
-   else
-      return -1;
-
-   return 0;
-}
-
-static int menu_entries_cbs_init_bind_deferred_push_compare_type(menu_file_list_cbs_t *cbs, unsigned type,
-      uint32_t label_hash)
-{
-   if (type == MENU_SETTING_GROUP)
-      cbs->action_deferred_push = deferred_push_category;
-   else if (type == MENU_FILE_PLAYLIST_COLLECTION)
-      cbs->action_deferred_push = deferred_push_rdb_collection;
    else
    {
       switch (label_hash)
@@ -631,6 +618,19 @@ static int menu_entries_cbs_init_bind_deferred_push_compare_type(menu_file_list_
    return 0;
 }
 
+static int menu_entries_cbs_init_bind_deferred_push_compare_type(menu_file_list_cbs_t *cbs, unsigned type,
+      uint32_t label_hash)
+{
+   if (type == MENU_SETTING_GROUP)
+      cbs->action_deferred_push = deferred_push_category;
+   else if (type == MENU_FILE_PLAYLIST_COLLECTION)
+      cbs->action_deferred_push = deferred_push_rdb_collection;
+   else
+      return -1;
+
+   return 0;
+}
+
 int menu_entries_cbs_init_bind_deferred_push(menu_file_list_cbs_t *cbs,
       const char *path, const char *label, unsigned type, size_t idx,
       const char *elem0, const char *elem1,

From eeaa83998c2b01a43f084499b87bbca6e815e258 Mon Sep 17 00:00:00 2001
From: twinaphex <libretro@gmail.com>
Date: Mon, 8 Jun 2015 00:21:20 +0200
Subject: [PATCH 04/14] Initialize rarch_setting_t with memset

---
 menu/menu_setting.c | 30 ++++++++++++++++++++----------
 1 file changed, 20 insertions(+), 10 deletions(-)

diff --git a/menu/menu_setting.c b/menu/menu_setting.c
index 403c6fd486..92407c3506 100644
--- a/menu/menu_setting.c
+++ b/menu/menu_setting.c
@@ -1627,7 +1627,8 @@ static rarch_setting_t setting_action_setting(const char* name,
       const char* short_description,
       const char *group, const char *subgroup)
 {
-   rarch_setting_t result = {0};
+   rarch_setting_t result;
+   memset(&result, 0, sizeof(result));
 
    result.type                      = ST_ACTION;
    result.name                      = name;
@@ -1661,7 +1662,8 @@ static rarch_setting_t setting_action_setting(const char* name,
  **/
 static rarch_setting_t setting_group_setting(enum setting_type type, const char* name)
 {
-   rarch_setting_t result = {0};
+   rarch_setting_t result;
+   memset(&result, 0, sizeof(result));
 
    result.type              = type;
    result.name              = name;
@@ -1685,7 +1687,8 @@ static rarch_setting_t setting_group_setting(enum setting_type type, const char*
 static rarch_setting_t setting_subgroup_setting(enum setting_type type,
       const char* name, const char *parent_name)
 {
-   rarch_setting_t result = {0};
+   rarch_setting_t result;
+   memset(&result, 0, sizeof(result));
 
    result.type              = type;
    result.name              = name;
@@ -1719,7 +1722,8 @@ static rarch_setting_t setting_float_setting(const char* name,
       const char *rounding, const char *group, const char *subgroup,
       change_handler_t change_handler, change_handler_t read_handler)
 {
-   rarch_setting_t result = {0};
+   rarch_setting_t result;
+   memset(&result, 0, sizeof(result));
 
    result.type                    = ST_FLOAT;
    result.name                    = name;
@@ -1769,7 +1773,8 @@ static rarch_setting_t setting_bool_setting(const char* name,
       const char *group, const char *subgroup,
       change_handler_t change_handler, change_handler_t read_handler)
 {
-   rarch_setting_t result = {0};
+   rarch_setting_t result;
+   memset(&result, 0, sizeof(result));
 
    result.type                   = ST_BOOL;
    result.name                   = name;
@@ -1817,7 +1822,8 @@ static rarch_setting_t setting_int_setting(const char* name,
       const char *group, const char *subgroup, change_handler_t change_handler,
       change_handler_t read_handler)
 {
-   rarch_setting_t result = {0};
+   rarch_setting_t result;
+   memset(&result, 0, sizeof(result));
 
    result.type                   = ST_INT;
    result.name                   = name;
@@ -1857,7 +1863,8 @@ static rarch_setting_t setting_uint_setting(const char* name,
       unsigned int default_value, const char *group, const char *subgroup,
       change_handler_t change_handler, change_handler_t read_handler)
 {
-   rarch_setting_t result = {0};
+   rarch_setting_t result;
+   memset(&result, 0, sizeof(result));
 
    result.type                            = ST_UINT;
    result.name                            = name;
@@ -1902,7 +1909,8 @@ static rarch_setting_t setting_hex_setting(const char* name,
       unsigned int default_value, const char *group, const char *subgroup,
       change_handler_t change_handler, change_handler_t read_handler)
 {
-   rarch_setting_t result = {0};
+   rarch_setting_t result;
+   memset(&result, 0, sizeof(result));
 
    result.type                            = ST_HEX;
    result.name                            = name;
@@ -1948,7 +1956,8 @@ static rarch_setting_t setting_bind_setting(const char* name,
       const struct retro_keybind* default_value,
       const char *group, const char *subgroup)
 {
-   rarch_setting_t result = {0};
+   rarch_setting_t result;
+   memset(&result, 0, sizeof(result));
 
    result.type                  = ST_BIND;
    result.name                  = name;
@@ -1994,7 +2003,8 @@ rarch_setting_t setting_string_setting(enum setting_type type,
       const char *group, const char *subgroup, change_handler_t change_handler,
       change_handler_t read_handler)
 {
-   rarch_setting_t result = {0};
+   rarch_setting_t result;
+   memset(&result, 0, sizeof(result));
 
    result.type                 = type;
    result.name                 = name;

From 398a361e05a53967d5c71c1186375a56bbf52023 Mon Sep 17 00:00:00 2001
From: twinaphex <libretro@gmail.com>
Date: Mon, 8 Jun 2015 00:24:16 +0200
Subject: [PATCH 05/14] (query.c) Cleanups

---
 libretro-db/query.c | 21 ++++++++++++++-------
 1 file changed, 14 insertions(+), 7 deletions(-)

diff --git a/libretro-db/query.c b/libretro-db/query.c
index ac625b8ed8..c7df437247 100644
--- a/libretro-db/query.c
+++ b/libretro-db/query.c
@@ -185,7 +185,8 @@ static struct buffer parse_argument(struct buffer buff, struct argument *arg,
 static struct rmsgpack_dom_value is_true(struct rmsgpack_dom_value input,
       unsigned argc, const struct argument *argv)
 {
-   struct rmsgpack_dom_value res = {0};
+   struct rmsgpack_dom_value res;
+   memset(&res, 0, sizeof(res));
 
    res.type  = RDT_BOOL;
    res.bool_ = 0;
@@ -202,7 +203,8 @@ static struct rmsgpack_dom_value equals(struct rmsgpack_dom_value input,
       unsigned argc, const struct argument * argv)
 {
    struct argument arg;
-   struct rmsgpack_dom_value res = {0};
+   struct rmsgpack_dom_value res;
+   memset(&res, 0, sizeof(res));
 
    res.type = RDT_BOOL;
 
@@ -231,7 +233,8 @@ static struct rmsgpack_dom_value operator_or(struct rmsgpack_dom_value input,
       unsigned argc, const struct argument * argv)
 {
    unsigned i;
-   struct rmsgpack_dom_value res = {0};
+   struct rmsgpack_dom_value res;
+   memset(&res, 0, sizeof(res));
 
    res.type = RDT_BOOL;
    res.bool_ = 0;
@@ -258,8 +261,9 @@ static struct rmsgpack_dom_value operator_or(struct rmsgpack_dom_value input,
 static struct rmsgpack_dom_value between(struct rmsgpack_dom_value input,
       unsigned argc, const struct argument * argv)
 {
-   struct rmsgpack_dom_value res = {0};
+   struct rmsgpack_dom_value res;
    unsigned i                     = 0;
+   memset(&res, 0, sizeof(res));
 
    res.type = RDT_BOOL;
    res.bool_ = 0;
@@ -292,7 +296,8 @@ static struct rmsgpack_dom_value operator_and(struct rmsgpack_dom_value input,
       unsigned argc, const struct argument * argv)
 {
    unsigned i;
-   struct rmsgpack_dom_value res = {0};
+   struct rmsgpack_dom_value res;
+   memset(&res, 0, sizeof(res));
 
    res.type = RDT_BOOL;
    res.bool_ = 0;
@@ -320,8 +325,9 @@ static struct rmsgpack_dom_value operator_and(struct rmsgpack_dom_value input,
 static struct rmsgpack_dom_value q_glob(struct rmsgpack_dom_value input,
       unsigned argc, const struct argument * argv)
 {
+   struct rmsgpack_dom_value res;
    unsigned i = 0;
-   struct rmsgpack_dom_value res = {0};
+   memset(&res, 0, sizeof(res));
 
    res.type = RDT_BOOL;
    res.bool_ = 0;
@@ -347,9 +353,10 @@ static struct rmsgpack_dom_value all_map(struct rmsgpack_dom_value input,
 {
    unsigned i;
    struct argument arg;
+   struct rmsgpack_dom_value res;
    struct rmsgpack_dom_value nil_value;
-   struct rmsgpack_dom_value res = {0};
    struct rmsgpack_dom_value *value = NULL;
+   memset(&res, 0, sizeof(res));
 
    nil_value.type = RDT_NULL;
    res.type       = RDT_BOOL;

From b7a480afec0757775cd4ef577e8827f1881b77c9 Mon Sep 17 00:00:00 2001
From: twinaphex <libretro@gmail.com>
Date: Mon, 8 Jun 2015 00:26:58 +0200
Subject: [PATCH 06/14] (MSVC/libretrodb) Build fixes

---
 libretro-db/libretrodb.c | 8 ++++----
 libretro-db/query.c      | 2 +-
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/libretro-db/libretrodb.c b/libretro-db/libretrodb.c
index 9523582d94..20834ac3dd 100644
--- a/libretro-db/libretrodb.c
+++ b/libretro-db/libretrodb.c
@@ -28,10 +28,10 @@ struct node_iter_ctx
 
 static struct rmsgpack_dom_value sentinal;
 
-static inline off_t flseek(FILE *fp, off_t offset, int whence)
+static inline off_t flseek(FILE *fp, int offset, int whence)
 {
-   fseeko(fp, offset, whence);
-   return ftello(fp);
+   fseek(fp, offset, whence);
+   return ftell(fp);
 }
 
 static int libretrodb_read_metadata(FILE *fp, libretrodb_metadata_t *md)
@@ -395,7 +395,7 @@ static int node_iter(void * value, void * ctx)
 
 static uint64_t libretrodb_tell(libretrodb_t *db)
 {
-   return ftello(db->fp);
+   return ftell(db->fp);
 }
 
 int libretrodb_create_index(libretrodb_t *db,
diff --git a/libretro-db/query.c b/libretro-db/query.c
index c7df437247..cc41866718 100644
--- a/libretro-db/query.c
+++ b/libretro-db/query.c
@@ -707,7 +707,7 @@ static struct buffer parse_table(struct buffer buff,
    unsigned i;
    const char *ident_name;
    size_t ident_len;
-   struct argument args[MAX_ARGS] = {{0}};
+   struct argument args[MAX_ARGS];
    unsigned argi = 0;
 
    buff = chomp(buff);

From 0088ea42d78fb5c9b05a2a499e24e5972a0af44a Mon Sep 17 00:00:00 2001
From: twinaphex <libretro@gmail.com>
Date: Mon, 8 Jun 2015 00:30:29 +0200
Subject: [PATCH 07/14] (libretrodb.c) Change 'int' to 'long'

---
 libretro-db/libretrodb.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/libretro-db/libretrodb.c b/libretro-db/libretrodb.c
index 20834ac3dd..14c9ca658d 100644
--- a/libretro-db/libretrodb.c
+++ b/libretro-db/libretrodb.c
@@ -28,7 +28,7 @@ struct node_iter_ctx
 
 static struct rmsgpack_dom_value sentinal;
 
-static inline off_t flseek(FILE *fp, int offset, int whence)
+static inline off_t flseek(FILE *fp, long offset, int whence)
 {
    fseek(fp, offset, whence);
    return ftell(fp);

From c7e016345006377e448a354bb289cdf8c44147b9 Mon Sep 17 00:00:00 2001
From: twinaphex <libretro@gmail.com>
Date: Mon, 8 Jun 2015 00:32:21 +0200
Subject: [PATCH 08/14] (PS3) Buildfix

---
 input/drivers/ps3_input.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/input/drivers/ps3_input.c b/input/drivers/ps3_input.c
index 0bfb0adccf..1ad8349886 100644
--- a/input/drivers/ps3_input.c
+++ b/input/drivers/ps3_input.c
@@ -164,7 +164,7 @@ static void* ps3_input_init(void)
    ps3->joypad = input_joypad_init_driver(settings->input.joypad_driver, ps3);
 
    if (ps3->joypad)
-      ps3->joypad->init();
+      ps3->joypad->init(ps3);
 
 #ifdef HAVE_MOUSE
    cellMouseInit(MAX_MICE);

From 7f8a2bef7976cd1680735546dabf7867fcea0493 Mon Sep 17 00:00:00 2001
From: twinaphex <libretro@gmail.com>
Date: Mon, 8 Jun 2015 00:33:49 +0200
Subject: [PATCH 09/14] (Salamander) Some spurious code where it tries to use
 'len' instead of 's'

---
 frontend/frontend_salamander.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/frontend/frontend_salamander.c b/frontend/frontend_salamander.c
index 4593efabf4..b026c31847 100644
--- a/frontend/frontend_salamander.c
+++ b/frontend/frontend_salamander.c
@@ -128,7 +128,7 @@ static void salamander_init(char *s, size_t len)
    if (!config_file_exists || !strcmp(s, ""))
       find_and_set_first_file(s, len, EXT_EXECUTABLES);
    else
-      RARCH_LOG("Start [%s] found in retroarch.cfg.\n", len);
+      RARCH_LOG("Start [%s] found in retroarch.cfg.\n", s);
 
    if (!config_file_exists)
    {
@@ -136,7 +136,7 @@ static void salamander_init(char *s, size_t len)
 
       if (conf)
       {
-         config_set_string(conf, "libretro_path", len);
+         config_set_string(conf, "libretro_path", s);
          config_file_write(conf, g_defaults.config_path);
          config_file_free(conf);
       }

From b4b9924eeb897c58c3c7a5e28de753ef361c86fb Mon Sep 17 00:00:00 2001
From: twinaphex <libretro@gmail.com>
Date: Mon, 8 Jun 2015 00:46:56 +0200
Subject: [PATCH 10/14] (PS3) Compile with HAVE_LIBRETRODB support

---
 Makefile.ps3 | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Makefile.ps3 b/Makefile.ps3
index 5cfe5a2773..22eaa84921 100644
--- a/Makefile.ps3
+++ b/Makefile.ps3
@@ -106,7 +106,7 @@ PPU_LDLIBS =  $(FONT_LIBS) $(GL_LIBS) $(WHOLE_START) -lretro_ps3 $(WHOLE_END) -l
 
 PPU_RANLIB = $(CELL_SDK)/host-win32/ppu/bin/ppu-lv2-ranlib.exe
 
-DEFINES += -DHAVE_THREADS -DRARCH_CONSOLE -DHAVE_OPENGL -DHAVE_HEADSET -DHAVE_OPENGLES -DHAVE_OPENGLES1 -DHAVE_PSGL -DHAVE_CG -DHAVE_CG_RUNTIME_COMPILER -DHAVE_FBO -DHAVE_SYSMODULES -DHAVE_SYSUTILS -DHAVE_RARCH_EXEC -DHAVE_LIBRETRO_MANAGEMENT -DHAVE_RSOUND -DHAVE_ZLIB -DHAVE_RPNG -DHAVE_7Z -DWANT_ZLIB -DSINC_LOWER_QUALITY -D__CELLOS_LV2__ -DHAVE_NETPLAY=1 -DHAVE_NETWORKING=1 -DHAVE_SOCKET_LEGACY=1 -DHAVE_MOUSE -DHAVE_GRIFFIN=1 -DHAVE_MULTIMAN=1 -DPC_DEVELOPMENT_IP_ADDRESS=\"$(PC_DEVELOPMENT_IP_ADDRESS)\" -DPC_DEVELOPMENT_UDP_PORT=$(PC_DEVELOPMENT_UDP_PORT) -DHAVE_FILTERS_BUILTIN -DHAVE_BUILTIN_AUTOCONFIG
+DEFINES += -DHAVE_THREADS -DRARCH_CONSOLE -DHAVE_OPENGL -DHAVE_HEADSET -DHAVE_LIBRETRODB -DHAVE_OPENGLES -DHAVE_OPENGLES1 -DHAVE_PSGL -DHAVE_CG -DHAVE_CG_RUNTIME_COMPILER -DHAVE_FBO -DHAVE_SYSMODULES -DHAVE_SYSUTILS -DHAVE_RARCH_EXEC -DHAVE_LIBRETRO_MANAGEMENT -DHAVE_RSOUND -DHAVE_ZLIB -DHAVE_RPNG -DHAVE_7Z -DWANT_ZLIB -DSINC_LOWER_QUALITY -D__CELLOS_LV2__ -DHAVE_NETPLAY=1 -DHAVE_NETWORKING=1 -DHAVE_SOCKET_LEGACY=1 -DHAVE_MOUSE -DHAVE_GRIFFIN=1 -DHAVE_MULTIMAN=1 -DPC_DEVELOPMENT_IP_ADDRESS=\"$(PC_DEVELOPMENT_IP_ADDRESS)\" -DPC_DEVELOPMENT_UDP_PORT=$(PC_DEVELOPMENT_UDP_PORT) -DHAVE_FILTERS_BUILTIN -DHAVE_BUILTIN_AUTOCONFIG
 
 ifeq ($(DEBUG), 1)
    PPU_OPTIMIZE_LV	:= -O0 -g

From e81fb296995697c0140996afffe4475ee2e67674 Mon Sep 17 00:00:00 2001
From: twinaphex <libretro@gmail.com>
Date: Mon, 8 Jun 2015 00:48:21 +0200
Subject: [PATCH 11/14] (Makefile.griffin) Add HAVE_LIBRETRODB rule

---
 Makefile.griffin | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/Makefile.griffin b/Makefile.griffin
index f893cd9350..b49b053205 100644
--- a/Makefile.griffin
+++ b/Makefile.griffin
@@ -157,6 +157,10 @@ ifeq ($(HAVE_LIBSICKSAXIS), 1)
 CFLAGS		+= -DHAVE_LIBSICKSAXIS
 endif
 
+ifeq ($(HAVE_LIBRETRODB), 1)
+CFLAGS		+= -DHAVE_LIBRETRODB
+endif
+
 ifeq ($(HAVE_RPNG), 1)
 CFLAGS      += -DWANT_RPNG
 endif

From a84f0d52f8c2123de722584a929d1ddcdcde627e Mon Sep 17 00:00:00 2001
From: twinaphex <libretro@gmail.com>
Date: Mon, 8 Jun 2015 00:56:08 +0200
Subject: [PATCH 12/14] (Content Collection) Can now scroll left/right

---
 menu/menu_entries_cbs_left.c  | 1 +
 menu/menu_entries_cbs_right.c | 1 +
 2 files changed, 2 insertions(+)

diff --git a/menu/menu_entries_cbs_left.c b/menu/menu_entries_cbs_left.c
index cbb19f3c5b..1ca7c6298c 100644
--- a/menu/menu_entries_cbs_left.c
+++ b/menu/menu_entries_cbs_left.c
@@ -447,6 +447,7 @@ static int menu_entries_cbs_init_bind_left_compare_type(menu_file_list_cbs_t *cb
          case MENU_FILE_DOWNLOAD_CORE:
          case MENU_FILE_CHEAT:
          case MENU_FILE_REMAP:
+         case MENU_FILE_PLAYLIST_COLLECTION:
          case MENU_SETTING_GROUP:
             switch (menu_label_hash)
             {
diff --git a/menu/menu_entries_cbs_right.c b/menu/menu_entries_cbs_right.c
index 616ebed433..d27987f9f4 100644
--- a/menu/menu_entries_cbs_right.c
+++ b/menu/menu_entries_cbs_right.c
@@ -392,6 +392,7 @@ static int menu_entries_cbs_init_bind_right_compare_type(menu_file_list_cbs_t *c
          case MENU_FILE_DOWNLOAD_CORE:
          case MENU_FILE_CHEAT:
          case MENU_FILE_REMAP:
+         case MENU_FILE_PLAYLIST_COLLECTION:
          case MENU_SETTING_GROUP:
             switch (menu_label_hash)
             {

From 2a8704d2d2c2a02a973ec094842eee0f82103ddb Mon Sep 17 00:00:00 2001
From: twinaphex <libretro@gmail.com>
Date: Mon, 8 Jun 2015 01:40:25 +0200
Subject: [PATCH 13/14] (menu_setting.c) Add 'parent group'

---
 menu/menu_setting.c | 814 ++++++++++++++++++++++++++++----------------
 menu/menu_setting.h |   1 +
 2 files changed, 529 insertions(+), 286 deletions(-)

diff --git a/menu/menu_setting.c b/menu/menu_setting.c
index 92407c3506..b22247f3be 100644
--- a/menu/menu_setting.c
+++ b/menu/menu_setting.c
@@ -1625,7 +1625,8 @@ static void setting_get_string_representation_hex(void *data,
  **/
 static rarch_setting_t setting_action_setting(const char* name,
       const char* short_description,
-      const char *group, const char *subgroup)
+      const char *group, const char *subgroup,
+      const char *parent_group)
 {
    rarch_setting_t result;
    memset(&result, 0, sizeof(result));
@@ -1634,6 +1635,7 @@ static rarch_setting_t setting_action_setting(const char* name,
    result.name                      = name;
 
    result.short_description         = short_description;
+   result.parent_group              = parent_group;
    result.group                     = group;
    result.subgroup                  = subgroup;
    result.change_handler            = NULL;
@@ -1660,11 +1662,13 @@ static rarch_setting_t setting_action_setting(const char* name,
  *
  * Returns: setting of type ST_GROUP.
  **/
-static rarch_setting_t setting_group_setting(enum setting_type type, const char* name)
+static rarch_setting_t setting_group_setting(enum setting_type type, const char* name,
+      const char *parent_group)
 {
    rarch_setting_t result;
    memset(&result, 0, sizeof(result));
 
+   result.parent_group      = parent_group;
    result.type              = type;
    result.name              = name;
    result.short_description = name;
@@ -1685,7 +1689,7 @@ static rarch_setting_t setting_group_setting(enum setting_type type, const char*
  * Returns: setting of type ST_SUBGROUP.
  **/
 static rarch_setting_t setting_subgroup_setting(enum setting_type type,
-      const char* name, const char *parent_name)
+      const char* name, const char *parent_name, const char *parent_group)
 {
    rarch_setting_t result;
    memset(&result, 0, sizeof(result));
@@ -1695,6 +1699,7 @@ static rarch_setting_t setting_subgroup_setting(enum setting_type type,
 
    result.short_description = name;
    result.group             = parent_name;
+   result.parent_group      = parent_group;
 
    result.get_string_representation       = &setting_get_string_representation_default;
 
@@ -1720,6 +1725,7 @@ static rarch_setting_t setting_subgroup_setting(enum setting_type type,
 static rarch_setting_t setting_float_setting(const char* name,
       const char* short_description, float* target, float default_value,
       const char *rounding, const char *group, const char *subgroup,
+      const char *parent_group,
       change_handler_t change_handler, change_handler_t read_handler)
 {
    rarch_setting_t result;
@@ -1731,6 +1737,7 @@ static rarch_setting_t setting_float_setting(const char* name,
    result.short_description       = short_description;
    result.group                   = group;
    result.subgroup                = subgroup;
+   result.parent_group            = parent_group;
 
    result.rounding_fraction       = rounding;
    result.change_handler          = change_handler;
@@ -1770,7 +1777,7 @@ static rarch_setting_t setting_float_setting(const char* name,
 static rarch_setting_t setting_bool_setting(const char* name,
       const char* short_description, bool* target, bool default_value,
       const char *off, const char *on,
-      const char *group, const char *subgroup,
+      const char *group, const char *subgroup, const char *parent_group,
       change_handler_t change_handler, change_handler_t read_handler)
 {
    rarch_setting_t result;
@@ -1782,6 +1789,7 @@ static rarch_setting_t setting_bool_setting(const char* name,
    result.short_description      = short_description;
    result.group                  = group;
    result.subgroup               = subgroup;
+   result.parent_group           = parent_group;
 
    result.change_handler         = change_handler;
    result.read_handler           = read_handler;
@@ -1819,7 +1827,8 @@ static rarch_setting_t setting_bool_setting(const char* name,
  **/
 static rarch_setting_t setting_int_setting(const char* name,
       const char* short_description, int* target, int default_value,
-      const char *group, const char *subgroup, change_handler_t change_handler,
+      const char *group, const char *subgroup, const char *parent_group,
+      change_handler_t change_handler,
       change_handler_t read_handler)
 {
    rarch_setting_t result;
@@ -1831,6 +1840,7 @@ static rarch_setting_t setting_int_setting(const char* name,
    result.short_description      = short_description;
    result.group                  = group;
    result.subgroup               = subgroup;
+   result.parent_group           = parent_group;
 
    result.change_handler         = change_handler;
    result.read_handler           = read_handler;
@@ -1860,7 +1870,8 @@ static rarch_setting_t setting_int_setting(const char* name,
  **/
 static rarch_setting_t setting_uint_setting(const char* name,
       const char* short_description, unsigned int* target,
-      unsigned int default_value, const char *group, const char *subgroup,
+      unsigned int default_value,
+      const char *group, const char *subgroup, const char *parent_group,
       change_handler_t change_handler, change_handler_t read_handler)
 {
    rarch_setting_t result;
@@ -1872,6 +1883,7 @@ static rarch_setting_t setting_uint_setting(const char* name,
    result.short_description               = short_description;
    result.group                           = group;
    result.subgroup                        = subgroup;
+   result.parent_group                    = parent_group;
 
    result.change_handler                  = change_handler;
    result.read_handler                    = read_handler;
@@ -1906,7 +1918,8 @@ static rarch_setting_t setting_uint_setting(const char* name,
  **/
 static rarch_setting_t setting_hex_setting(const char* name,
       const char* short_description, unsigned int* target,
-      unsigned int default_value, const char *group, const char *subgroup,
+      unsigned int default_value,
+      const char *group, const char *subgroup, const char *parent_group,
       change_handler_t change_handler, change_handler_t read_handler)
 {
    rarch_setting_t result;
@@ -1918,6 +1931,7 @@ static rarch_setting_t setting_hex_setting(const char* name,
    result.short_description               = short_description;
    result.group                           = group;
    result.subgroup                        = subgroup;
+   result.parent_group                    = parent_group;
 
    result.change_handler                  = change_handler;
    result.read_handler                    = read_handler;
@@ -1954,7 +1968,7 @@ static rarch_setting_t setting_bind_setting(const char* name,
       const char* short_description, struct retro_keybind* target,
       uint32_t idx, uint32_t idx_offset,
       const struct retro_keybind* default_value,
-      const char *group, const char *subgroup)
+      const char *group, const char *subgroup, const char *parent_group)
 {
    rarch_setting_t result;
    memset(&result, 0, sizeof(result));
@@ -1965,6 +1979,7 @@ static rarch_setting_t setting_bind_setting(const char* name,
    result.short_description     = short_description;
    result.group                 = group;
    result.subgroup              = subgroup;
+   result.parent_group          = parent_group;
 
    result.value.keybind         = target;
    result.default_value.keybind = default_value;
@@ -2000,7 +2015,8 @@ static rarch_setting_t setting_bind_setting(const char* name,
 rarch_setting_t setting_string_setting(enum setting_type type,
       const char* name, const char* short_description, char* target,
       unsigned size, const char* default_value, const char *empty,
-      const char *group, const char *subgroup, change_handler_t change_handler,
+      const char *group, const char *subgroup, const char *parent_group,
+      change_handler_t change_handler,
       change_handler_t read_handler)
 {
    rarch_setting_t result;
@@ -2012,6 +2028,7 @@ rarch_setting_t setting_string_setting(enum setting_type type,
    result.short_description    = short_description;
    result.group                = group;
    result.subgroup             = subgroup;
+   result.parent_group         = parent_group;
 
    result.dir.empty_path       = empty;
    result.change_handler       = change_handler;
@@ -2063,13 +2080,14 @@ static rarch_setting_t setting_string_setting_options(enum setting_type type,
       const char* name, const char* short_description, char* target,
       unsigned size, const char* default_value,
       const char *empty, const char *values,
-      const char *group, const char *subgroup,
+      const char *group, const char *subgroup, const char *parent_group,
       change_handler_t change_handler, change_handler_t read_handler)
 {
   rarch_setting_t result = setting_string_setting(type, name,
         short_description, target, size, default_value, empty, group,
-        subgroup, change_handler, read_handler);
+        subgroup, parent_group, change_handler, read_handler);
 
+  result.parent_group    = parent_group;
   result.values          = values;
   return result;
 }
@@ -3318,81 +3336,81 @@ static void general_write_handler(void *data)
       event_command(rarch_cmd);
 }
 
-#define START_GROUP(group_info, NAME) \
+#define START_GROUP(group_info, NAME, parent_group) \
 { \
    group_info.name = NAME; \
-   if (!(menu_settings_list_append(list, list_info, setting_group_setting (ST_GROUP, NAME)))) return false; \
+   if (!(menu_settings_list_append(list, list_info, setting_group_setting (ST_GROUP, NAME, parent_group)))) return false; \
 }
 
-#define END_GROUP(list, list_info) \
+#define END_GROUP(list, list_info, parent_group) \
 { \
-   if (!(menu_settings_list_append(list, list_info, setting_group_setting (ST_END_GROUP, 0)))) return false; \
+   if (!(menu_settings_list_append(list, list_info, setting_group_setting (ST_END_GROUP, 0, parent_group)))) return false; \
 }
 
-#define START_SUB_GROUP(list, list_info, NAME, group_info, subgroup_info) \
+#define START_SUB_GROUP(list, list_info, NAME, group_info, subgroup_info, parent_group) \
 { \
    subgroup_info.name = NAME; \
-   if (!(menu_settings_list_append(list, list_info, setting_subgroup_setting (ST_SUB_GROUP, NAME, group_info)))) return false; \
+   if (!(menu_settings_list_append(list, list_info, setting_subgroup_setting (ST_SUB_GROUP, NAME, group_info, parent_group)))) return false; \
 }
 
-#define END_SUB_GROUP(list, list_info) \
+#define END_SUB_GROUP(list, list_info, parent_group) \
 { \
-   if (!(menu_settings_list_append(list, list_info, setting_group_setting (ST_END_SUB_GROUP, 0)))) return false; \
+   if (!(menu_settings_list_append(list, list_info, setting_group_setting (ST_END_SUB_GROUP, 0, parent_group)))) return false; \
 }
 
-#define CONFIG_ACTION(NAME, SHORT, group_info, subgroup_info) \
+#define CONFIG_ACTION(NAME, SHORT, group_info, subgroup_info, parent_group) \
 { \
-   if (!menu_settings_list_append(list, list_info, setting_action_setting  (NAME, SHORT, group_info, subgroup_info))) return false; \
+   if (!menu_settings_list_append(list, list_info, setting_action_setting  (NAME, SHORT, group_info, subgroup_info, parent_group))) return false; \
 }
 
-#define CONFIG_BOOL(TARGET, NAME, SHORT, DEF, OFF, ON, group_info, subgroup_info, CHANGE_HANDLER, READ_HANDLER) \
+#define CONFIG_BOOL(TARGET, NAME, SHORT, DEF, OFF, ON, group_info, subgroup_info, parent_group, CHANGE_HANDLER, READ_HANDLER) \
 { \
-   if (!menu_settings_list_append(list, list_info, setting_bool_setting  (NAME, SHORT, &TARGET, DEF, OFF, ON, group_info, subgroup_info, CHANGE_HANDLER, READ_HANDLER)))return false; \
+   if (!menu_settings_list_append(list, list_info, setting_bool_setting  (NAME, SHORT, &TARGET, DEF, OFF, ON, group_info, subgroup_info, parent_group, CHANGE_HANDLER, READ_HANDLER)))return false; \
 }
 
-#define CONFIG_INT(TARGET, NAME, SHORT, DEF, group_info, subgroup_info, CHANGE_HANDLER, READ_HANDLER) \
+#define CONFIG_INT(TARGET, NAME, SHORT, DEF, group_info, subgroup_info, parent_group, CHANGE_HANDLER, READ_HANDLER) \
 { \
-   if (!(menu_settings_list_append(list, list_info, setting_int_setting   (NAME, SHORT, &TARGET, DEF, group_info, subgroup_info, CHANGE_HANDLER, READ_HANDLER)))) return false; \
+   if (!(menu_settings_list_append(list, list_info, setting_int_setting   (NAME, SHORT, &TARGET, DEF, group_info, subgroup_info, parent_group, CHANGE_HANDLER, READ_HANDLER)))) return false; \
 }
 
-#define CONFIG_UINT(TARGET, NAME, SHORT, DEF, group_info, subgroup_info, CHANGE_HANDLER, READ_HANDLER) \
+#define CONFIG_UINT(TARGET, NAME, SHORT, DEF, group_info, subgroup_info, parent_group, CHANGE_HANDLER, READ_HANDLER) \
 { \
-   if (!(menu_settings_list_append(list, list_info, setting_uint_setting  (NAME, SHORT, &TARGET, DEF, group_info, subgroup_info, CHANGE_HANDLER, READ_HANDLER)))) return false; \
+   if (!(menu_settings_list_append(list, list_info, setting_uint_setting  (NAME, SHORT, &TARGET, DEF, group_info, subgroup_info, parent_group, CHANGE_HANDLER, READ_HANDLER)))) return false; \
 }
 
-#define CONFIG_FLOAT(TARGET, NAME, SHORT, DEF, ROUNDING, group_info, subgroup_info, CHANGE_HANDLER, READ_HANDLER) \
+#define CONFIG_FLOAT(TARGET, NAME, SHORT, DEF, ROUNDING, group_info, subgroup_info, parent_group, CHANGE_HANDLER, READ_HANDLER) \
 { \
-   if (!(menu_settings_list_append(list, list_info, setting_float_setting (NAME, SHORT, &TARGET, DEF, ROUNDING, group_info, subgroup_info, CHANGE_HANDLER, READ_HANDLER)))) return false; \
+   if (!(menu_settings_list_append(list, list_info, setting_float_setting (NAME, SHORT, &TARGET, DEF, ROUNDING, group_info, subgroup_info, parent_group, CHANGE_HANDLER, READ_HANDLER)))) return false; \
 }
 
-#define CONFIG_PATH(TARGET, NAME, SHORT, DEF, group_info, subgroup_info, CHANGE_HANDLER, READ_HANDLER) \
+#define CONFIG_PATH(TARGET, NAME, SHORT, DEF, group_info, subgroup_info, parent_group, CHANGE_HANDLER, READ_HANDLER) \
 { \
-   if (!(menu_settings_list_append(list, list_info, setting_string_setting(ST_PATH, NAME, SHORT, TARGET, sizeof(TARGET), DEF, "", group_info, subgroup_info, CHANGE_HANDLER, READ_HANDLER)))) return false; \
+   if (!(menu_settings_list_append(list, list_info, setting_string_setting(ST_PATH, NAME, SHORT, TARGET, sizeof(TARGET), DEF, "", group_info, subgroup_info, parent_group, CHANGE_HANDLER, READ_HANDLER)))) return false; \
 }
 
-#define CONFIG_DIR(TARGET, NAME, SHORT, DEF, EMPTY, group_info, subgroup_info, CHANGE_HANDLER, READ_HANDLER) \
+#define CONFIG_DIR(TARGET, NAME, SHORT, DEF, EMPTY, group_info, subgroup_info, parent_group, CHANGE_HANDLER, READ_HANDLER) \
 { \
-   if (!(menu_settings_list_append(list, list_info, setting_string_setting(ST_DIR, NAME, SHORT, TARGET, sizeof(TARGET), DEF, EMPTY, group_info, subgroup_info, CHANGE_HANDLER, READ_HANDLER)))) return false; \
+   if (!(menu_settings_list_append(list, list_info, setting_string_setting(ST_DIR, NAME, SHORT, TARGET, sizeof(TARGET), DEF, EMPTY, group_info, subgroup_info, parent_group, CHANGE_HANDLER, READ_HANDLER)))) return false; \
 }
 
-#define CONFIG_STRING(TARGET, NAME, SHORT, DEF, group_info, subgroup_info, CHANGE_HANDLER, READ_HANDLER) \
+#define CONFIG_STRING(TARGET, NAME, SHORT, DEF, group_info, subgroup_info, parent_group, CHANGE_HANDLER, READ_HANDLER) \
 { \
-   if (!(menu_settings_list_append(list, list_info, setting_string_setting(ST_STRING, NAME, SHORT, TARGET, sizeof(TARGET), DEF, "", group_info, subgroup_info, CHANGE_HANDLER, READ_HANDLER)))) return false; \
+   if (!(menu_settings_list_append(list, list_info, setting_string_setting(ST_STRING, NAME, SHORT, TARGET, sizeof(TARGET), DEF, "", group_info, subgroup_info, parent_group, CHANGE_HANDLER, READ_HANDLER)))) return false; \
 }
 
-#define CONFIG_STRING_OPTIONS(TARGET, NAME, SHORT, DEF, OPTS, group_info, subgroup_info, CHANGE_HANDLER, READ_HANDLER) \
+#define CONFIG_STRING_OPTIONS(TARGET, NAME, SHORT, DEF, OPTS, group_info, subgroup_info, parent_group, CHANGE_HANDLER, READ_HANDLER) \
 { \
-  if (!(menu_settings_list_append(list, list_info, setting_string_setting_options(ST_STRING, NAME, SHORT, TARGET, sizeof(TARGET), DEF, "", OPTS, group_info, subgroup_info, CHANGE_HANDLER, READ_HANDLER)))) return false; \
+  if (!(menu_settings_list_append(list, list_info, setting_string_setting_options(ST_STRING, NAME, SHORT, TARGET, sizeof(TARGET), DEF, "", OPTS, group_info, subgroup_info, parent_group, CHANGE_HANDLER, READ_HANDLER)))) return false; \
 }
 
-#define CONFIG_HEX(TARGET, NAME, SHORT, DEF, group_info, subgroup_info, CHANGE_HANDLER, READ_HANDLER) \
+#define CONFIG_HEX(TARGET, NAME, SHORT, DEF, group_info, subgroup_info, parent_group, CHANGE_HANDLER, READ_HANDLER) \
 { \
-   if (!(menu_settings_list_append(list, list_info, setting_hex_setting(NAME, SHORT, &TARGET, DEF, group_info, subgroup_info, CHANGE_HANDLER, READ_HANDLER)))) return false; \
+   if (!(menu_settings_list_append(list, list_info, setting_hex_setting(NAME, SHORT, &TARGET, DEF, group_info, subgroup_info, parent_group, CHANGE_HANDLER, READ_HANDLER)))) return false; \
 }
 
-#define CONFIG_BIND(TARGET, PLAYER, PLAYER_OFFSET, NAME, SHORT, DEF, group_info, subgroup_info) \
+#define CONFIG_BIND(TARGET, PLAYER, PLAYER_OFFSET, NAME, SHORT, DEF, group_info, subgroup_info, parent_group) \
 { \
-   if (!(menu_settings_list_append(list, list_info, setting_bind_setting  (NAME, SHORT, &TARGET, PLAYER, PLAYER_OFFSET, DEF, group_info, subgroup_info)))) return false; \
+   if (!(menu_settings_list_append(list, list_info, setting_bind_setting  (NAME, SHORT, &TARGET, PLAYER, PLAYER_OFFSET, DEF, group_info, subgroup_info, parent_group)))) return false; \
 }
 
 #ifdef GEKKO
@@ -3463,21 +3481,23 @@ static void overlay_enable_toggle_change_handler(void *data)
 
 static bool setting_append_list_main_menu_options(
       rarch_setting_t **list,
-      rarch_setting_info_t *list_info)
+      rarch_setting_info_t *list_info,
+      const char *parent_group)
 {
    rarch_setting_group_info_t group_info    = {0};
    rarch_setting_group_info_t subgroup_info = {0};
    settings_t *settings = config_get_ptr();
    global_t *global     = global_get_ptr();
 
-   START_GROUP(group_info, "Main Menu");
-   START_SUB_GROUP(list, list_info, "State", group_info.name, subgroup_info);
+   START_GROUP(group_info, "Main Menu", parent_group);
+   START_SUB_GROUP(list, list_info, "State", group_info.name, subgroup_info, parent_group);
 #if defined(HAVE_DYNAMIC) || defined(HAVE_LIBRETRO_MANAGEMENT)
    CONFIG_ACTION(
          "core_list",
          "Core Selection",
          group_info.name,
-         subgroup_info.name);
+         subgroup_info.name,
+         parent_group);
    (*list)[list_info->index - 1].size = sizeof(settings->libretro);
    (*list)[list_info->index - 1].value.string = settings->libretro;
    (*list)[list_info->index - 1].values = EXT_EXECUTABLES;
@@ -3496,7 +3516,8 @@ static bool setting_append_list_main_menu_options(
          "core_updater_list",
          "Core Updater",
          group_info.name,
-         subgroup_info.name);
+         subgroup_info.name,
+         parent_group);
 #endif
 
 #ifdef HAVE_LIBRETRODB
@@ -3504,7 +3525,8 @@ static bool setting_append_list_main_menu_options(
          "content_collection_list",
          "Load Content (Collection)",
          group_info.name,
-         subgroup_info.name);
+         subgroup_info.name,
+         parent_group);
 #endif
 
    if (settings->history_list_enable)
@@ -3513,7 +3535,8 @@ static bool setting_append_list_main_menu_options(
             "history_list",
             "Load Content (History)",
             group_info.name,
-            subgroup_info.name);
+            subgroup_info.name,
+            parent_group);
    }
    if (global->core_info && core_info_list_num_info_files(global->core_info))
    {
@@ -3521,14 +3544,16 @@ static bool setting_append_list_main_menu_options(
             "detect_core_list",
             "Load Content (Detect Core)",
             group_info.name,
-            subgroup_info.name);
+            subgroup_info.name,
+            parent_group);
       settings_data_list_current_add_flags(list, list_info, SD_FLAG_BROWSER_ACTION);
    }
    CONFIG_ACTION(
          "load_content",
          "Load Content",
          group_info.name,
-         subgroup_info.name);
+         subgroup_info.name,
+         parent_group);
    (*list)[list_info->index - 1].size = sizeof(global->fullpath);
    (*list)[list_info->index - 1].value.string   = global->fullpath;
    (*list)[list_info->index - 1].action_left    = load_content_action_toggle;
@@ -3546,7 +3571,8 @@ static bool setting_append_list_main_menu_options(
                "unload_core",
                "Unload Core",
                group_info.name,
-               subgroup_info.name);
+               subgroup_info.name,
+               parent_group);
       menu_settings_list_current_add_cmd(list, list_info, EVENT_CMD_UNLOAD_CORE);
    }
 
@@ -3554,32 +3580,37 @@ static bool setting_append_list_main_menu_options(
          "core_information",
          "Core Information",
          group_info.name,
-         subgroup_info.name);
+         subgroup_info.name,
+         parent_group);
 
    CONFIG_ACTION(
          "management",
          "Management",
          group_info.name,
-         subgroup_info.name);
+         subgroup_info.name,
+         parent_group);
    settings_data_list_current_add_flags(list, list_info, SD_FLAG_ADVANCED);
 
    CONFIG_ACTION(
          "options",
          "Options",
          group_info.name,
-         subgroup_info.name);
+         subgroup_info.name,
+         parent_group);
 
    CONFIG_ACTION(
          "settings",
          "Settings",
          group_info.name,
-         subgroup_info.name);
+         subgroup_info.name,
+         parent_group);
 
    CONFIG_ACTION(
          "system_information",
          "System Information",
          group_info.name,
-         subgroup_info.name);
+         subgroup_info.name,
+         parent_group);
 
    if (global->perfcnt_enable)
    {
@@ -3587,7 +3618,8 @@ static bool setting_append_list_main_menu_options(
             "performance_counters",
             "Performance Counters",
             group_info.name,
-            subgroup_info.name);
+            subgroup_info.name,
+            parent_group);
       settings_data_list_current_add_flags(list, list_info, SD_FLAG_ADVANCED);
    }
    if (global->main_is_init && !global->libretro_dummy)
@@ -3596,7 +3628,8 @@ static bool setting_append_list_main_menu_options(
             "savestate",
             "Save State",
             group_info.name,
-            subgroup_info.name);
+            subgroup_info.name,
+            parent_group);
       (*list)[list_info->index - 1].action_left   = &setting_action_left_savestates;
       (*list)[list_info->index - 1].action_right  = &setting_action_right_savestates;
       (*list)[list_info->index - 1].action_start  = &setting_action_start_savestates;
@@ -3609,7 +3642,8 @@ static bool setting_append_list_main_menu_options(
             "loadstate",
             "Load State",
             group_info.name,
-            subgroup_info.name);
+            subgroup_info.name,
+            parent_group);
       (*list)[list_info->index - 1].action_left   = &setting_action_left_savestates;
       (*list)[list_info->index - 1].action_right  = &setting_action_left_savestates;
       (*list)[list_info->index - 1].action_start  = &setting_action_start_savestates;
@@ -3622,14 +3656,16 @@ static bool setting_append_list_main_menu_options(
             "take_screenshot",
             "Take Screenshot",
             group_info.name,
-            subgroup_info.name);
+            subgroup_info.name,
+            parent_group);
       menu_settings_list_current_add_cmd  (list, list_info, EVENT_CMD_TAKE_SCREENSHOT);
 
       CONFIG_ACTION(
             "resume_content",
             "Resume Content",
             group_info.name,
-            subgroup_info.name);
+            subgroup_info.name,
+            parent_group);
       menu_settings_list_current_add_cmd  (list, list_info, EVENT_CMD_RESUME);
       (*list)[list_info->index - 1].action_ok     = &setting_bool_action_ok_exit;
       (*list)[list_info->index - 1].action_select = &setting_bool_action_ok_exit;
@@ -3638,7 +3674,8 @@ static bool setting_append_list_main_menu_options(
             "restart_content",
             "Restart Content",
             group_info.name,
-            subgroup_info.name);
+            subgroup_info.name,
+            parent_group);
       menu_settings_list_current_add_cmd(list, list_info, EVENT_CMD_RESET);
       (*list)[list_info->index - 1].action_ok = 
       (*list)[list_info->index - 1].action_select = &setting_bool_action_ok_exit;
@@ -3648,7 +3685,8 @@ static bool setting_append_list_main_menu_options(
          "restart_retroarch",
          "Restart RetroArch",
          group_info.name,
-         subgroup_info.name);
+         subgroup_info.name,
+         parent_group);
    menu_settings_list_current_add_cmd(list, list_info, EVENT_CMD_RESTART_RETROARCH);
 #endif
 
@@ -3656,21 +3694,23 @@ static bool setting_append_list_main_menu_options(
          "configurations",
          "Configuration Files",
          group_info.name,
-         subgroup_info.name);
+         subgroup_info.name,
+         parent_group);
 
    CONFIG_ACTION(
          "save_new_config",
          "Save New Config",
          group_info.name,
-         subgroup_info.name);
+         subgroup_info.name,
+         parent_group);
    menu_settings_list_current_add_cmd(list, list_info, EVENT_CMD_MENU_SAVE_CONFIG);
 
    CONFIG_ACTION(
          "help",
          "Help",
          group_info.name,
-         subgroup_info.name);
-
+         subgroup_info.name,
+         parent_group);
 
 #if !defined(IOS)
    /* Apple rejects iOS apps that lets you forcibly quit an application. */
@@ -3678,27 +3718,29 @@ static bool setting_append_list_main_menu_options(
          "quit_retroarch",
          "Quit RetroArch",
          group_info.name,
-         subgroup_info.name);
+         subgroup_info.name,
+         parent_group);
    menu_settings_list_current_add_cmd(list, list_info, EVENT_CMD_QUIT_RETROARCH);
 #endif
 
-   END_SUB_GROUP(list, list_info);
-   END_GROUP(list, list_info);
+   END_SUB_GROUP(list, list_info, parent_group);
+   END_GROUP(list, list_info, parent_group);
 
    return true;
 }
 
 static bool setting_append_list_driver_options(
       rarch_setting_t **list,
-      rarch_setting_info_t *list_info)
+      rarch_setting_info_t *list_info,
+      const char *parent_group)
 {
    rarch_setting_group_info_t group_info    = {0};
    rarch_setting_group_info_t subgroup_info = {0};
    settings_t *settings = config_get_ptr();
    
-   START_GROUP(group_info, "Driver Settings");
-
-   START_SUB_GROUP(list, list_info, "State", group_info.name, subgroup_info);
+   START_GROUP(group_info, "Driver Settings", parent_group);
+   START_SUB_GROUP(list, list_info, "State", group_info.name,
+         subgroup_info, parent_group);
    
    CONFIG_STRING_OPTIONS(
          settings->input.driver,
@@ -3708,6 +3750,7 @@ static bool setting_append_list_driver_options(
          config_get_input_driver_options(),
          group_info.name,
          subgroup_info.name,
+         parent_group,
          NULL,
          NULL);
    settings_data_list_current_add_flags(list, list_info, SD_FLAG_IS_DRIVER);
@@ -3720,6 +3763,7 @@ static bool setting_append_list_driver_options(
          config_get_joypad_driver_options(),
          group_info.name,
          subgroup_info.name,
+         parent_group,
          NULL,
          NULL);
    settings_data_list_current_add_flags(list, list_info, SD_FLAG_IS_DRIVER);
@@ -3732,6 +3776,7 @@ static bool setting_append_list_driver_options(
          config_get_video_driver_options(),
          group_info.name,
          subgroup_info.name,
+         parent_group,
          NULL,
          NULL);
    settings_data_list_current_add_flags(list, list_info, SD_FLAG_IS_DRIVER);
@@ -3744,6 +3789,7 @@ static bool setting_append_list_driver_options(
          config_get_audio_driver_options(),
          group_info.name,
          subgroup_info.name,
+         parent_group,
          NULL,
          NULL);
    settings_data_list_current_add_flags(list, list_info, SD_FLAG_IS_DRIVER);
@@ -3756,6 +3802,7 @@ static bool setting_append_list_driver_options(
          config_get_audio_resampler_driver_options(),
          group_info.name,
          subgroup_info.name,
+         parent_group,
          NULL,
          NULL);
    settings_data_list_current_add_flags(list, list_info, SD_FLAG_IS_DRIVER);
@@ -3768,6 +3815,7 @@ static bool setting_append_list_driver_options(
          config_get_camera_driver_options(),
          group_info.name,
          subgroup_info.name,
+         parent_group,
          NULL,
          NULL);
    settings_data_list_current_add_flags(list, list_info, SD_FLAG_IS_DRIVER);
@@ -3780,6 +3828,7 @@ static bool setting_append_list_driver_options(
          config_get_location_driver_options(),
          group_info.name,
          subgroup_info.name,
+         parent_group,
          NULL,
          NULL);
    settings_data_list_current_add_flags(list, list_info, SD_FLAG_IS_DRIVER);
@@ -3792,6 +3841,7 @@ static bool setting_append_list_driver_options(
          config_get_menu_driver_options(),
          group_info.name,
          subgroup_info.name,
+         parent_group,
          NULL,
          NULL);
    settings_data_list_current_add_flags(list, list_info, SD_FLAG_IS_DRIVER);
@@ -3804,27 +3854,30 @@ static bool setting_append_list_driver_options(
          config_get_record_driver_options(),
          group_info.name,
          subgroup_info.name,
+         parent_group,
          NULL,
          NULL);
    settings_data_list_current_add_flags(list, list_info, SD_FLAG_IS_DRIVER);
 
-   END_SUB_GROUP(list, list_info);
-   END_GROUP(list, list_info);
+   END_SUB_GROUP(list, list_info, parent_group);
+   END_GROUP(list, list_info, parent_group);
 
    return true;
 }
 
 static bool setting_append_list_core_options(
       rarch_setting_t **list,
-      rarch_setting_info_t *list_info)
+      rarch_setting_info_t *list_info,
+      const char *parent_group)
 {
    rarch_setting_group_info_t group_info    = {0};
    rarch_setting_group_info_t subgroup_info = {0};
    settings_t *settings = config_get_ptr();
 
-   START_GROUP(group_info, "Core Settings");
+   START_GROUP(group_info, "Core Settings", parent_group);
 
-   START_SUB_GROUP(list, list_info, "State", group_info.name, subgroup_info);
+   START_SUB_GROUP(list, list_info, "State", group_info.name, subgroup_info,
+         parent_group);
 
    CONFIG_BOOL(
          settings->video.shared_context,
@@ -3835,6 +3888,7 @@ static bool setting_append_list_core_options(
          "ON",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    settings_data_list_current_add_flags(list, list_info, SD_FLAG_ADVANCED);
@@ -3848,6 +3902,7 @@ static bool setting_append_list_core_options(
          "ON",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    settings_data_list_current_add_flags(list, list_info, SD_FLAG_ADVANCED);
@@ -3861,28 +3916,30 @@ static bool setting_append_list_core_options(
          "ON",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    settings_data_list_current_add_flags(list, list_info, SD_FLAG_ADVANCED);
 
-   END_SUB_GROUP(list, list_info);
-
-   END_GROUP(list, list_info);
+   END_SUB_GROUP(list, list_info, parent_group);
+   END_GROUP(list, list_info, parent_group);
 
    return true;
 }
 
 static bool setting_append_list_configuration_options(
       rarch_setting_t **list,
-      rarch_setting_info_t *list_info)
+      rarch_setting_info_t *list_info,
+      const char *parent_group)
 {
    rarch_setting_group_info_t group_info    = {0};
    rarch_setting_group_info_t subgroup_info = {0};
    settings_t *settings = config_get_ptr();
 
-   START_GROUP(group_info, "Configuration Settings");
+   START_GROUP(group_info, "Configuration Settings", parent_group);
 
-   START_SUB_GROUP(list, list_info, "State", group_info.name, subgroup_info);
+   START_SUB_GROUP(list, list_info, "State", group_info.name, subgroup_info,
+         parent_group);
 
    CONFIG_BOOL(settings->config_save_on_exit,
          "config_save_on_exit",
@@ -3892,6 +3949,7 @@ static bool setting_append_list_configuration_options(
          "ON",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
 
@@ -3904,6 +3962,7 @@ static bool setting_append_list_configuration_options(
          "ON",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
 
@@ -3916,6 +3975,7 @@ static bool setting_append_list_configuration_options(
          "ON",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
 
@@ -3928,28 +3988,29 @@ static bool setting_append_list_configuration_options(
          "ON",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
 
-   END_SUB_GROUP(list, list_info);
-
-
-   END_GROUP(list, list_info);
+   END_SUB_GROUP(list, list_info, parent_group);
+   END_GROUP(list, list_info, parent_group);
 
    return true;
 }
 
 static bool setting_append_list_saving_options(
       rarch_setting_t **list,
-      rarch_setting_info_t *list_info)
+      rarch_setting_info_t *list_info,
+      const char *parent_group)
 {
    rarch_setting_group_info_t group_info    = {0};
    rarch_setting_group_info_t subgroup_info = {0};
    settings_t *settings = config_get_ptr();
 
-   START_GROUP(group_info, "Saving Settings");
+   START_GROUP(group_info, "Saving Settings", parent_group);
 
-   START_SUB_GROUP(list, list_info, "State", group_info.name, subgroup_info);
+   START_SUB_GROUP(list, list_info, "State", group_info.name, subgroup_info,
+         parent_group);
 
    CONFIG_BOOL(
          settings->sort_savefiles_enable,
@@ -3960,6 +4021,7 @@ static bool setting_append_list_saving_options(
          "ON",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
 
@@ -3972,6 +4034,7 @@ static bool setting_append_list_saving_options(
          "ON",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
 
@@ -3984,6 +4047,7 @@ static bool setting_append_list_saving_options(
          "ON",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    settings_data_list_current_add_flags(list, list_info, SD_FLAG_ADVANCED);
@@ -3996,6 +4060,7 @@ static bool setting_append_list_saving_options(
          autosave_interval,
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    menu_settings_list_current_add_cmd(list, list_info, EVENT_CMD_AUTOSAVE_INIT);
@@ -4014,6 +4079,7 @@ static bool setting_append_list_saving_options(
          "ON",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
 
@@ -4026,8 +4092,9 @@ static bool setting_append_list_saving_options(
          "ON",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
-            general_read_handler);
+         general_read_handler);
 
    CONFIG_BOOL(
          settings->savestate_auto_load,
@@ -4038,29 +4105,30 @@ static bool setting_append_list_saving_options(
          "ON",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
 
-
-   END_SUB_GROUP(list, list_info);
-
-   END_GROUP(list, list_info);
+   END_SUB_GROUP(list, list_info, parent_group);
+   END_GROUP(list, list_info, parent_group);
 
    return true;
 }
 
 static bool setting_append_list_logging_options(
       rarch_setting_t **list,
-      rarch_setting_info_t *list_info)
+      rarch_setting_info_t *list_info,
+      const char *parent_group)
 {
    rarch_setting_group_info_t group_info    = {0};
    rarch_setting_group_info_t subgroup_info = {0};
    settings_t *settings = config_get_ptr();
    global_t   *global   = global_get_ptr();
 
-   START_GROUP(group_info, "Logging Settings");
+   START_GROUP(group_info, "Logging Settings", parent_group);
 
-   START_SUB_GROUP(list, list_info, "State", group_info.name, subgroup_info);
+   START_SUB_GROUP(list, list_info, "State", group_info.name, subgroup_info,
+         parent_group);
 
    CONFIG_BOOL(
          global->verbosity,
@@ -4071,6 +4139,7 @@ static bool setting_append_list_logging_options(
          "ON",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    settings_data_list_current_add_flags(list, list_info, SD_FLAG_ADVANCED);
@@ -4082,6 +4151,7 @@ static bool setting_append_list_logging_options(
          libretro_log_level,
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    menu_settings_list_current_add_range(list, list_info, 0, 3, 1.0, true, true);
@@ -4089,9 +4159,10 @@ static bool setting_append_list_logging_options(
       &setting_get_string_representation_uint_libretro_log_level;
    settings_data_list_current_add_flags(list, list_info, SD_FLAG_ADVANCED);
 
-   END_SUB_GROUP(list, list_info);
+   END_SUB_GROUP(list, list_info, parent_group);
 
-   START_SUB_GROUP(list, list_info, "Performance Counters", group_info.name, subgroup_info);
+   START_SUB_GROUP(list, list_info, "Performance Counters", group_info.name, subgroup_info,
+         parent_group);
 
    CONFIG_BOOL(global->perfcnt_enable,
          "perfcnt_enable",
@@ -4101,29 +4172,29 @@ static bool setting_append_list_logging_options(
          "ON",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    settings_data_list_current_add_flags(list, list_info, SD_FLAG_ADVANCED);
 
-
-   END_SUB_GROUP(list, list_info);
-
-   END_GROUP(list, list_info);
+   END_SUB_GROUP(list, list_info, parent_group);
+   END_GROUP(list, list_info, parent_group);
 
    return true;
 }
 
 static bool setting_append_list_frame_throttling_options(
       rarch_setting_t **list,
-      rarch_setting_info_t *list_info)
+      rarch_setting_info_t *list_info,
+      const char *parent_group)
 {
    rarch_setting_group_info_t group_info    = {0};
    rarch_setting_group_info_t subgroup_info = {0};
    settings_t *settings = config_get_ptr();
 
-   START_GROUP(group_info, "Frame Throttle Settings");
+   START_GROUP(group_info, "Frame Throttle Settings", parent_group);
 
-   START_SUB_GROUP(list, list_info, "State", group_info.name, subgroup_info);
+   START_SUB_GROUP(list, list_info, "State", group_info.name, subgroup_info, parent_group);
 
    CONFIG_BOOL(
          settings->fastforward_ratio_throttle_enable,
@@ -4134,6 +4205,7 @@ static bool setting_append_list_frame_throttling_options(
          "ON",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
 
@@ -4145,6 +4217,7 @@ static bool setting_append_list_frame_throttling_options(
          "%.1fx",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    menu_settings_list_current_add_range(list, list_info, 1, 10, 0.1, true, true);
@@ -4157,28 +4230,28 @@ static bool setting_append_list_frame_throttling_options(
          "%.1fx",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    menu_settings_list_current_add_range(list, list_info, 1, 10, 1.0, true, true);
 
-   END_SUB_GROUP(list, list_info);
-
-   END_GROUP(list, list_info);
+   END_SUB_GROUP(list, list_info, parent_group);
+   END_GROUP(list, list_info, parent_group);
 
    return true;
 }
 
 static bool setting_append_list_rewind_options(
       rarch_setting_t **list,
-      rarch_setting_info_t *list_info)
+      rarch_setting_info_t *list_info, const char *parent_group)
 {
    rarch_setting_group_info_t group_info    = {0};
    rarch_setting_group_info_t subgroup_info = {0};
    settings_t *settings = config_get_ptr();
 
-   START_GROUP(group_info, "Rewind Settings");
+   START_GROUP(group_info, "Rewind Settings", parent_group);
 
-   START_SUB_GROUP(list, list_info, "State", group_info.name, subgroup_info);
+   START_SUB_GROUP(list, list_info, "State", group_info.name, subgroup_info, parent_group);
 
 
    CONFIG_BOOL(
@@ -4190,6 +4263,7 @@ static bool setting_append_list_rewind_options(
          "ON",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    menu_settings_list_current_add_cmd(list, list_info, EVENT_CMD_REWIND_TOGGLE);
@@ -4202,6 +4276,7 @@ static bool setting_append_list_rewind_options(
          rewind_buffer_size,
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler)
 #endif
@@ -4212,30 +4287,30 @@ static bool setting_append_list_rewind_options(
             rewind_granularity,
             group_info.name,
             subgroup_info.name,
+            parent_group,
             general_write_handler,
             general_read_handler);
    menu_settings_list_current_add_range(list, list_info, 1, 32768, 1, true, false);
    settings_data_list_current_add_flags(list, list_info, SD_FLAG_ADVANCED);
 
-   END_SUB_GROUP(list, list_info);
-
-   END_GROUP(list, list_info);
+   END_SUB_GROUP(list, list_info, parent_group);
+   END_GROUP(list, list_info, parent_group);
 
    return true;
 }
 
 static bool setting_append_list_recording_options(
       rarch_setting_t **list,
-      rarch_setting_info_t *list_info)
+      rarch_setting_info_t *list_info, const char *parent_group)
 {
    rarch_setting_group_info_t group_info    = {0};
    rarch_setting_group_info_t subgroup_info = {0};
    settings_t *settings = config_get_ptr();
    global_t   *global   = global_get_ptr();
 
-   START_GROUP(group_info, "Recording Settings");
+   START_GROUP(group_info, "Recording Settings", parent_group);
 
-   START_SUB_GROUP(list, list_info, "State", group_info.name, subgroup_info);
+   START_SUB_GROUP(list, list_info, "State", group_info.name, subgroup_info, parent_group);
 
    CONFIG_BOOL(
          global->record.enable,
@@ -4246,6 +4321,7 @@ static bool setting_append_list_recording_options(
          "ON",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
 
@@ -4256,6 +4332,7 @@ static bool setting_append_list_recording_options(
          "",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    menu_settings_list_current_add_values(list, list_info, "cfg");
@@ -4268,6 +4345,7 @@ static bool setting_append_list_recording_options(
          "",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    settings_data_list_current_add_flags(list, list_info, SD_FLAG_ALLOW_INPUT);
@@ -4281,12 +4359,13 @@ static bool setting_append_list_recording_options(
          "ON",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
 
-   END_SUB_GROUP(list, list_info);
+   END_SUB_GROUP(list, list_info, parent_group);
 
-   START_SUB_GROUP(list, list_info, "Miscellaneous", group_info.name, subgroup_info);
+   START_SUB_GROUP(list, list_info, "Miscellaneous", group_info.name, subgroup_info, parent_group);
 
    CONFIG_BOOL(
          settings->video.post_filter_record,
@@ -4297,6 +4376,7 @@ static bool setting_append_list_recording_options(
          "ON",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
 
@@ -4309,18 +4389,20 @@ static bool setting_append_list_recording_options(
          "ON",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
 
-   END_SUB_GROUP(list, list_info);
-   END_GROUP(list, list_info);
+   END_SUB_GROUP(list, list_info, parent_group);
+   END_GROUP(list, list_info, parent_group);
 
    return true;
 }
 
 static bool setting_append_list_video_options(
       rarch_setting_t **list,
-      rarch_setting_info_t *list_info)
+      rarch_setting_info_t *list_info,
+      const char *parent_group)
 {
    rarch_setting_group_info_t group_info    = {0};
    rarch_setting_group_info_t subgroup_info = {0};
@@ -4330,8 +4412,8 @@ static bool setting_append_list_video_options(
     
    (void)global;
 
-   START_GROUP(group_info, "Video Settings");
-   START_SUB_GROUP(list, list_info, "State", group_info.name, subgroup_info);
+   START_GROUP(group_info, "Video Settings", parent_group);
+   START_SUB_GROUP(list, list_info, "State", group_info.name, subgroup_info, parent_group);
 
    CONFIG_BOOL(settings->fps_show,
          "fps_show",
@@ -4341,12 +4423,13 @@ static bool setting_append_list_video_options(
          "ON",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
 
 
-   END_SUB_GROUP(list, list_info);
-   START_SUB_GROUP(list, list_info, "Monitor", group_info.name, subgroup_info);
+   END_SUB_GROUP(list, list_info, parent_group);
+   START_SUB_GROUP(list, list_info, "Monitor", group_info.name, subgroup_info, parent_group);
 
    CONFIG_UINT(
          settings->video.monitor_index,
@@ -4355,6 +4438,7 @@ static bool setting_append_list_video_options(
          monitor_index,
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    menu_settings_list_current_add_cmd(list, list_info, EVENT_CMD_REINIT);
@@ -4373,6 +4457,7 @@ static bool setting_append_list_video_options(
          "ON",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    menu_settings_list_current_add_cmd(list, list_info, EVENT_CMD_REINIT);
@@ -4387,6 +4472,7 @@ static bool setting_append_list_video_options(
          "ON",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
 
@@ -4397,6 +4483,7 @@ static bool setting_append_list_video_options(
          fullscreen_x,
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    settings_data_list_current_add_flags(list, list_info, SD_FLAG_ADVANCED);
@@ -4408,6 +4495,7 @@ static bool setting_append_list_video_options(
          fullscreen_y,
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    settings_data_list_current_add_flags(list, list_info, SD_FLAG_ADVANCED);
@@ -4420,6 +4508,7 @@ static bool setting_append_list_video_options(
          "%.3f Hz",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    menu_settings_list_current_add_range(list, list_info, 0, 0, 0.001, true, false);
@@ -4432,6 +4521,7 @@ static bool setting_append_list_video_options(
          "%.3f Hz",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    (*list)[list_info->index - 1].action_start  = &setting_action_start_video_refresh_rate_auto;
@@ -4449,14 +4539,14 @@ static bool setting_append_list_video_options(
          "ON",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    menu_settings_list_current_add_cmd(list, list_info, EVENT_CMD_REINIT);
    settings_data_list_current_add_flags(list, list_info, SD_FLAG_CMD_APPLY_AUTO|SD_FLAG_ADVANCED);
 
-   END_SUB_GROUP(list, list_info);
-
-   START_SUB_GROUP(list, list_info, "Aspect", group_info.name, subgroup_info);
+   END_SUB_GROUP(list, list_info, parent_group);
+   START_SUB_GROUP(list, list_info, "Aspect", group_info.name, subgroup_info, parent_group);
    CONFIG_BOOL(
          settings->video.force_aspect,
          "video_force_aspect",
@@ -4466,6 +4556,7 @@ static bool setting_append_list_video_options(
          "ON",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
 
@@ -4477,6 +4568,7 @@ static bool setting_append_list_video_options(
          "%.2f",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
 
@@ -4489,6 +4581,7 @@ static bool setting_append_list_video_options(
          "ON",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
 
@@ -4499,6 +4592,7 @@ static bool setting_append_list_video_options(
          aspect_ratio_idx,
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    menu_settings_list_current_add_cmd(
@@ -4517,9 +4611,8 @@ static bool setting_append_list_video_options(
    (*list)[list_info->index - 1].get_string_representation = 
       &setting_get_string_representation_uint_aspect_ratio_index;
 
-   END_SUB_GROUP(list, list_info);
-
-   START_SUB_GROUP(list, list_info, "Scaling", group_info.name, subgroup_info);
+   END_SUB_GROUP(list, list_info, parent_group);
+   START_SUB_GROUP(list, list_info, "Scaling", group_info.name, subgroup_info, parent_group);
 
 #if !defined(RARCH_CONSOLE) && !defined(RARCH_MOBILE)
    CONFIG_FLOAT(
@@ -4530,6 +4623,7 @@ static bool setting_append_list_video_options(
          "%.1fx",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    menu_settings_list_current_add_range(list, list_info, 1.0, 10.0, 1.0, true, true);
@@ -4544,6 +4638,7 @@ static bool setting_append_list_video_options(
          "ON",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
 
@@ -4554,6 +4649,7 @@ static bool setting_append_list_video_options(
          0,
          group_info.name,
          subgroup_info.name,
+         parent_group,
          NULL,
          NULL);
    settings_data_list_current_add_flags(list, list_info, SD_FLAG_ADVANCED);
@@ -4565,6 +4661,7 @@ static bool setting_append_list_video_options(
          0,
          group_info.name,
          subgroup_info.name,
+         parent_group,
          NULL,
          NULL);
    settings_data_list_current_add_flags(list, list_info, SD_FLAG_ADVANCED);
@@ -4576,6 +4673,7 @@ static bool setting_append_list_video_options(
          0,
          group_info.name,
          subgroup_info.name,
+         parent_group,
          NULL,
          NULL);
    settings_data_list_current_add_flags(list, list_info, SD_FLAG_ADVANCED);
@@ -4587,6 +4685,7 @@ static bool setting_append_list_video_options(
          0,
          group_info.name,
          subgroup_info.name,
+         parent_group,
          NULL,
          NULL);
    settings_data_list_current_add_flags(list, list_info, SD_FLAG_ADVANCED);
@@ -4599,6 +4698,7 @@ static bool setting_append_list_video_options(
          video_viwidth,
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    menu_settings_list_current_add_range(list, list_info, 640, 720, 2, true, true);
@@ -4612,6 +4712,7 @@ static bool setting_append_list_video_options(
          "ON",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
 #endif
@@ -4625,6 +4726,7 @@ static bool setting_append_list_video_options(
          "ON",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
 
@@ -4638,6 +4740,7 @@ static bool setting_append_list_video_options(
          "ON",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
 #endif
@@ -4649,6 +4752,7 @@ static bool setting_append_list_video_options(
          0,
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    menu_settings_list_current_add_range(list, list_info, 0, 3, 1, true, true);
@@ -4664,6 +4768,7 @@ static bool setting_append_list_video_options(
          0,
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    menu_settings_list_current_add_cmd(
@@ -4681,14 +4786,14 @@ static bool setting_append_list_video_options(
    settings_data_list_current_add_flags(list, list_info, SD_FLAG_CMD_APPLY_AUTO|SD_FLAG_ADVANCED);
 
 #endif
-   END_SUB_GROUP(list, list_info);
-
+   END_SUB_GROUP(list, list_info, parent_group);
    START_SUB_GROUP(
          list,
          list_info,
          "Synchronization",
          group_info.name,
-         subgroup_info);
+         subgroup_info,
+         parent_group);
 
 #if defined(HAVE_THREADS) && !defined(RARCH_CONSOLE)
    CONFIG_BOOL(
@@ -4700,6 +4805,7 @@ static bool setting_append_list_video_options(
          "ON",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    menu_settings_list_current_add_cmd(list, list_info, EVENT_CMD_REINIT);
@@ -4715,6 +4821,7 @@ static bool setting_append_list_video_options(
          "ON",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
 
@@ -4725,6 +4832,7 @@ static bool setting_append_list_video_options(
          swap_interval,
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    menu_settings_list_current_add_cmd(list, list_info, EVENT_CMD_VIDEO_SET_BLOCKING_STATE);
@@ -4740,6 +4848,7 @@ static bool setting_append_list_video_options(
          "ON",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
 
@@ -4750,6 +4859,7 @@ static bool setting_append_list_video_options(
          hard_sync_frames,
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    menu_settings_list_current_add_range(list, list_info, 0, 3, 1, true, true);
@@ -4762,6 +4872,7 @@ static bool setting_append_list_video_options(
          frame_delay,
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    menu_settings_list_current_add_range(list, list_info, 0, 15, 1, true, true);
@@ -4777,17 +4888,18 @@ static bool setting_append_list_video_options(
          "ON",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
 #endif
-   END_SUB_GROUP(list, list_info);
-
+   END_SUB_GROUP(list, list_info, parent_group);
    START_SUB_GROUP(
          list,
          list_info,
          "Miscellaneous",
          group_info.name,
-         subgroup_info);
+         subgroup_info,
+         parent_group);
 
    CONFIG_BOOL(
          settings->video.gpu_screenshot,
@@ -4798,6 +4910,7 @@ static bool setting_append_list_video_options(
          "ON",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    settings_data_list_current_add_flags(list, list_info, SD_FLAG_ADVANCED);
@@ -4811,6 +4924,7 @@ static bool setting_append_list_video_options(
          "ON",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    settings_data_list_current_add_flags(list, list_info, SD_FLAG_ADVANCED);
@@ -4824,6 +4938,7 @@ static bool setting_append_list_video_options(
          "ON",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
 
@@ -4837,6 +4952,7 @@ static bool setting_append_list_video_options(
          "ON",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    menu_settings_list_current_add_cmd(
@@ -4853,26 +4969,28 @@ static bool setting_append_list_video_options(
          0,
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    menu_settings_list_current_add_range(list, list_info, 0, 5, 1, true, true);
 #endif
-   END_SUB_GROUP(list, list_info);
-   END_GROUP(list, list_info);
+   END_SUB_GROUP(list, list_info, parent_group);
+   END_GROUP(list, list_info, parent_group);
 
    return true;
 }
 
 static bool setting_append_list_font_options(
       rarch_setting_t **list,
-      rarch_setting_info_t *list_info)
+      rarch_setting_info_t *list_info,
+      const char *parent_group)
 {
    rarch_setting_group_info_t group_info    = {0};
    rarch_setting_group_info_t subgroup_info = {0};
    settings_t *settings = config_get_ptr();
 
-   START_GROUP(group_info, "Onscreen Display Settings");
-   START_SUB_GROUP(list, list_info, "Messages", group_info.name, subgroup_info);
+   START_GROUP(group_info, "Onscreen Display Settings", parent_group);
+   START_SUB_GROUP(list, list_info, "Messages", group_info.name, subgroup_info, parent_group);
 
 #ifndef RARCH_CONSOLE
    CONFIG_BOOL(
@@ -4884,6 +5002,7 @@ static bool setting_append_list_font_options(
          "ON",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
 #endif
@@ -4895,6 +5014,7 @@ static bool setting_append_list_font_options(
          "",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    settings_data_list_current_add_flags(list, list_info, SD_FLAG_ALLOW_EMPTY);
@@ -4907,6 +5027,7 @@ static bool setting_append_list_font_options(
          "%.1f",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    menu_settings_list_current_add_range(list, list_info, 1.00, 100.00, 1.0, true, true);
@@ -4919,6 +5040,7 @@ static bool setting_append_list_font_options(
          "%.3f",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    menu_settings_list_current_add_range(list, list_info, 0, 1, 0.01, true, true);
@@ -4931,27 +5053,29 @@ static bool setting_append_list_font_options(
          "%.3f",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    menu_settings_list_current_add_range(list, list_info, 0, 1, 0.01, true, true);
 
-   END_SUB_GROUP(list, list_info);
-   END_GROUP(list, list_info);
+   END_SUB_GROUP(list, list_info, parent_group);
+   END_GROUP(list, list_info, parent_group);
 
    return true;
 }
 
 static bool setting_append_list_audio_options(
       rarch_setting_t **list,
-      rarch_setting_info_t *list_info)
+      rarch_setting_info_t *list_info,
+      const char *parent_group)
 {
    rarch_setting_group_info_t group_info    = {0};
    rarch_setting_group_info_t subgroup_info = {0};
    settings_t *settings = config_get_ptr();
    global_t   *global   = global_get_ptr();
 
-   START_GROUP(group_info, "Audio Settings");
-   START_SUB_GROUP(list, list_info, "State", group_info.name, subgroup_info);
+   START_GROUP(group_info, "Audio Settings", parent_group);
+   START_SUB_GROUP(list, list_info, "State", group_info.name, subgroup_info, parent_group);
 
    (void)global;
 
@@ -4964,6 +5088,7 @@ static bool setting_append_list_audio_options(
          "ON",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    settings_data_list_current_add_flags(list, list_info, SD_FLAG_ADVANCED);
@@ -4977,6 +5102,7 @@ static bool setting_append_list_audio_options(
          "ON",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
 
@@ -4988,6 +5114,7 @@ static bool setting_append_list_audio_options(
          "%.1f",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    menu_settings_list_current_add_range(list, list_info, -80, 12, 1.0, true, true);
@@ -5002,18 +5129,20 @@ static bool setting_append_list_audio_options(
          "ON",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
 #endif
 
-   END_SUB_GROUP(list, list_info);
+   END_SUB_GROUP(list, list_info, parent_group);
 
    START_SUB_GROUP(
          list,
          list_info,
          "Synchronization",
          group_info.name,
-         subgroup_info);
+         subgroup_info,
+         parent_group);
 
    CONFIG_BOOL(
          settings->audio.sync,
@@ -5024,6 +5153,7 @@ static bool setting_append_list_audio_options(
          "ON",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
 
@@ -5035,6 +5165,7 @@ static bool setting_append_list_audio_options(
          g_defaults.settings.out_latency : out_latency,
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    menu_settings_list_current_add_range(list, list_info, 1, 256, 1.0, true, true);
@@ -5048,6 +5179,7 @@ static bool setting_append_list_audio_options(
          "%.3f",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    menu_settings_list_current_add_range(
@@ -5068,6 +5200,7 @@ static bool setting_append_list_audio_options(
          "%.2f",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    menu_settings_list_current_add_range(
@@ -5087,18 +5220,20 @@ static bool setting_append_list_audio_options(
          0,
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    settings_data_list_current_add_flags(list, list_info, SD_FLAG_ADVANCED);
 
-   END_SUB_GROUP(list, list_info);
+   END_SUB_GROUP(list, list_info, parent_group);
 
    START_SUB_GROUP(
          list,
          list_info,
          "Miscellaneous",
          group_info.name,
-         subgroup_info);
+         subgroup_info,
+         parent_group);
 
    CONFIG_STRING(
          settings->audio.device,
@@ -5107,6 +5242,7 @@ static bool setting_append_list_audio_options(
          "",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    settings_data_list_current_add_flags(list, list_info, SD_FLAG_ALLOW_INPUT | SD_FLAG_ADVANCED);
@@ -5118,6 +5254,7 @@ static bool setting_append_list_audio_options(
          out_rate,
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    settings_data_list_current_add_flags(list, list_info, SD_FLAG_ADVANCED);
@@ -5129,29 +5266,32 @@ static bool setting_append_list_audio_options(
          settings->audio.filter_dir,
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    menu_settings_list_current_add_values(list, list_info, "dsp");
    menu_settings_list_current_add_cmd(list, list_info, EVENT_CMD_DSP_FILTER_INIT);
    settings_data_list_current_add_flags(list, list_info, SD_FLAG_ALLOW_EMPTY);
 
-   END_SUB_GROUP(list, list_info);
-   END_GROUP(list, list_info);
+   END_SUB_GROUP(list, list_info, parent_group);
+   END_GROUP(list, list_info, parent_group);
 
    return true;
 }
 
 static bool setting_append_list_input_hotkey_options(
       rarch_setting_t **list,
-      rarch_setting_info_t *list_info)
+      rarch_setting_info_t *list_info,
+      const char *parent_group)
 {
    unsigned i;
    rarch_setting_group_info_t group_info    = {0};
    rarch_setting_group_info_t subgroup_info = {0};
    settings_t *settings = config_get_ptr();
 
-   START_GROUP(group_info, "Input Hotkey Binds");
-   START_SUB_GROUP(list, list_info, "State", group_info.name, subgroup_info);
+   START_GROUP(group_info, "Input Hotkey Binds", parent_group);
+   START_SUB_GROUP(list, list_info, "State", group_info.name, subgroup_info,
+         parent_group);
 
    for (i = 0; i < RARCH_BIND_LIST_END; i ++)
    {
@@ -5163,12 +5303,12 @@ static bool setting_append_list_input_hotkey_options(
 
       CONFIG_BIND(settings->input.binds[0][i], 0, 0,
             keybind->base, keybind->desc, &retro_keybinds_1[i],
-            group_info.name, subgroup_info.name);
+            group_info.name, subgroup_info.name, parent_group);
       menu_settings_list_current_add_bind_type(list, list_info, i + MENU_SETTINGS_BIND_BEGIN);
    }
 
-   END_SUB_GROUP(list, list_info);
-   END_GROUP(list, list_info);
+   END_SUB_GROUP(list, list_info, parent_group);
+   END_GROUP(list, list_info, parent_group);
 
    return true;
 }
@@ -5176,7 +5316,8 @@ static bool setting_append_list_input_hotkey_options(
 
 static bool setting_append_list_input_options(
       rarch_setting_t **list,
-      rarch_setting_info_t *list_info)
+      rarch_setting_info_t *list_info,
+      const char *parent_group)
 {
    unsigned user;
    rarch_setting_group_info_t group_info    = {0};
@@ -5184,8 +5325,8 @@ static bool setting_append_list_input_options(
    settings_t *settings = config_get_ptr();
    global_t   *global   = global_get_ptr();
 
-   START_GROUP(group_info, "Input Settings");
-   START_SUB_GROUP(list, list_info, "State", group_info.name, subgroup_info);
+   START_GROUP(group_info, "Input Settings", parent_group);
+   START_SUB_GROUP(list, list_info, "State", group_info.name, subgroup_info, parent_group);
 
    CONFIG_UINT(
          settings->input.max_users,
@@ -5194,6 +5335,7 @@ static bool setting_append_list_input_options(
          MAX_USERS,
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    menu_settings_list_current_add_range(list, list_info, 1, MAX_USERS, 1, true, true);
@@ -5207,6 +5349,7 @@ static bool setting_append_list_input_options(
          "ON",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
 
@@ -5219,6 +5362,7 @@ static bool setting_append_list_input_options(
          "ON",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
 
@@ -5231,6 +5375,7 @@ static bool setting_append_list_input_options(
          "ON",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
 
@@ -5243,6 +5388,7 @@ static bool setting_append_list_input_options(
          "ON",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
 
@@ -5255,17 +5401,19 @@ static bool setting_append_list_input_options(
          "ON",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
 
-   END_SUB_GROUP(list, list_info);
+   END_SUB_GROUP(list, list_info, parent_group);
 
    START_SUB_GROUP(
          list,
          list_info,
          "Input Device Mapping",
          group_info.name,
-         subgroup_info);
+         subgroup_info,
+         parent_group);
 
    CONFIG_BOOL(
          global->menu.bind_mode_keyboard,
@@ -5276,6 +5424,7 @@ static bool setting_append_list_input_options(
          "RetroKeyboard",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
 
@@ -5327,6 +5476,7 @@ static bool setting_append_list_input_options(
             user,
             group_info.name,
             subgroup_info.name,
+            parent_group,
             general_write_handler,
             general_read_handler);
       (*list)[list_info->index - 1].index = user + 1;
@@ -5345,6 +5495,7 @@ static bool setting_append_list_input_options(
             user,
             group_info.name,
             subgroup_info.name,
+            parent_group,
             general_write_handler,
             general_read_handler);
       (*list)[list_info->index - 1].index = user + 1;
@@ -5360,7 +5511,8 @@ static bool setting_append_list_input_options(
             key[user],
             label[user],
             group_info.name,
-            subgroup_info.name);
+            subgroup_info.name,
+            parent_group);
       (*list)[list_info->index - 1].index = user + 1;
       (*list)[list_info->index - 1].index_offset = user;
       (*list)[list_info->index - 1].action_start  = &setting_action_start_bind_device;
@@ -5373,7 +5525,8 @@ static bool setting_append_list_input_options(
             key_bind_all[user],
             label_bind_all[user],
             group_info.name,
-            subgroup_info.name);
+            subgroup_info.name,
+            parent_group);
       (*list)[list_info->index - 1].index          = user + 1;
       (*list)[list_info->index - 1].index_offset   = user;
       (*list)[list_info->index - 1].action_ok      = &setting_action_ok_bind_all;
@@ -5383,7 +5536,8 @@ static bool setting_append_list_input_options(
             key_bind_defaults[user],
             label_bind_defaults[user],
             group_info.name,
-            subgroup_info.name);
+            subgroup_info.name,
+            parent_group);
       (*list)[list_info->index - 1].index          = user + 1;
       (*list)[list_info->index - 1].index_offset   = user;
       (*list)[list_info->index - 1].action_ok      = &setting_action_ok_bind_defaults;
@@ -5395,7 +5549,8 @@ static bool setting_append_list_input_options(
          list_info,
          "Turbo/Deadzone",
          group_info.name,
-         subgroup_info);
+         subgroup_info,
+         parent_group);
 
    CONFIG_FLOAT(
          settings->input.axis_threshold,
@@ -5405,6 +5560,7 @@ static bool setting_append_list_input_options(
          "%.3f",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    menu_settings_list_current_add_range(list, list_info, 0, 1.00, 0.001, true, true);
@@ -5416,6 +5572,7 @@ static bool setting_append_list_input_options(
          turbo_period,
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    menu_settings_list_current_add_range(list, list_info, 1, 0, 1, true, false);
@@ -5427,21 +5584,21 @@ static bool setting_append_list_input_options(
          turbo_duty_cycle,
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    menu_settings_list_current_add_range(list, list_info, 1, 0, 1, true, false);
 
-   END_SUB_GROUP(list, list_info);
-
-
-   END_GROUP(list, list_info);
+   END_SUB_GROUP(list, list_info, parent_group);
+   END_GROUP(list, list_info, parent_group);
 
    return true;
 }
 
 static bool setting_append_list_overlay_options(
       rarch_setting_t **list,
-      rarch_setting_info_t *list_info)
+      rarch_setting_info_t *list_info,
+      const char *parent_group)
 {
 #ifdef HAVE_OVERLAY
    rarch_setting_group_info_t group_info    = {0};
@@ -5449,8 +5606,8 @@ static bool setting_append_list_overlay_options(
    settings_t *settings = config_get_ptr();
    global_t   *global   = global_get_ptr();
 
-   START_GROUP(group_info, "Onscreen Overlay Settings");
-   START_SUB_GROUP(list, list_info, "State", group_info.name, subgroup_info);
+   START_GROUP(group_info, "Onscreen Overlay Settings", parent_group);
+   START_SUB_GROUP(list, list_info, "State", group_info.name, subgroup_info, parent_group);
 
    CONFIG_BOOL(
          settings->input.overlay_enable,
@@ -5461,6 +5618,7 @@ static bool setting_append_list_overlay_options(
          "ON",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    (*list)[list_info->index - 1].change_handler = overlay_enable_toggle_change_handler;
@@ -5472,6 +5630,7 @@ static bool setting_append_list_overlay_options(
          global->overlay_dir,
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    menu_settings_list_current_add_values(list, list_info, "cfg");
@@ -5486,6 +5645,7 @@ static bool setting_append_list_overlay_options(
          "%.2f",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    menu_settings_list_current_add_cmd(list, list_info, EVENT_CMD_OVERLAY_SET_ALPHA_MOD);
@@ -5500,14 +5660,15 @@ static bool setting_append_list_overlay_options(
          "%.2f",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    menu_settings_list_current_add_cmd(list, list_info, EVENT_CMD_OVERLAY_SET_SCALE_FACTOR);
    menu_settings_list_current_add_range(list, list_info, 0, 2, 0.01, true, true);
    settings_data_list_current_add_flags(list, list_info, SD_FLAG_CMD_APPLY_AUTO);
 
-   END_SUB_GROUP(list, list_info);
-   END_GROUP(list, list_info);
+   END_SUB_GROUP(list, list_info, parent_group);
+   END_GROUP(list, list_info, parent_group);
 #endif
 
    return true;
@@ -5515,7 +5676,8 @@ static bool setting_append_list_overlay_options(
 
 static bool setting_append_list_osk_overlay_options(
       rarch_setting_t **list,
-      rarch_setting_info_t *list_info)
+      rarch_setting_info_t *list_info,
+      const char *parent_group)
 {
 #ifdef HAVE_OVERLAY
    rarch_setting_group_info_t group_info    = {0};
@@ -5523,8 +5685,8 @@ static bool setting_append_list_osk_overlay_options(
    settings_t *settings = config_get_ptr();
    global_t   *global   = global_get_ptr();
 
-   START_GROUP(group_info, "Onscreen Keyboard Overlay Settings");
-   START_SUB_GROUP(list, list_info, "State", group_info.name, subgroup_info);
+   START_GROUP(group_info, "Onscreen Keyboard Overlay Settings", parent_group);
+   START_SUB_GROUP(list, list_info, "State", group_info.name, subgroup_info, parent_group);
 
    CONFIG_BOOL(
          settings->osk.enable,
@@ -5535,6 +5697,7 @@ static bool setting_append_list_osk_overlay_options(
          "ON",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
 
@@ -5545,13 +5708,14 @@ static bool setting_append_list_osk_overlay_options(
          global->osk_overlay_dir,
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    menu_settings_list_current_add_values(list, list_info, "cfg");
    settings_data_list_current_add_flags(list, list_info, SD_FLAG_ALLOW_EMPTY);
 
-   END_SUB_GROUP(list, list_info);
-   END_GROUP(list, list_info);
+   END_SUB_GROUP(list, list_info, parent_group);
+   END_GROUP(list, list_info, parent_group);
 #endif
 
    return true;
@@ -5559,14 +5723,15 @@ static bool setting_append_list_osk_overlay_options(
 
 static bool setting_append_list_menu_options(
       rarch_setting_t **list,
-      rarch_setting_info_t *list_info)
+      rarch_setting_info_t *list_info,
+      const char *parent_group)
 {
    rarch_setting_group_info_t group_info    = {0};
    rarch_setting_group_info_t subgroup_info = {0};
    settings_t *settings = config_get_ptr();
 
-   START_GROUP(group_info, "Menu Settings");
-   START_SUB_GROUP(list, list_info, "State", group_info.name, subgroup_info);
+   START_GROUP(group_info, "Menu Settings", parent_group);
+   START_SUB_GROUP(list, list_info, "State", group_info.name, subgroup_info, parent_group);
 
    CONFIG_PATH(
          settings->menu.wallpaper,
@@ -5575,6 +5740,7 @@ static bool setting_append_list_menu_options(
          "",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    menu_settings_list_current_add_values(list, list_info, "png");
@@ -5589,6 +5755,7 @@ static bool setting_append_list_menu_options(
          "ON",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
 
@@ -5601,6 +5768,7 @@ static bool setting_append_list_menu_options(
          "ON",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    menu_settings_list_current_add_cmd(list, list_info, EVENT_CMD_MENU_PAUSE_LIBRETRO);
@@ -5615,6 +5783,7 @@ static bool setting_append_list_menu_options(
          "ON",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
 
@@ -5627,12 +5796,13 @@ static bool setting_append_list_menu_options(
          "ON",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
 
-   END_SUB_GROUP(list, list_info);
+   END_SUB_GROUP(list, list_info, parent_group);
 
-   START_SUB_GROUP(list, list_info, "Navigation", group_info.name, subgroup_info);
+   START_SUB_GROUP(list, list_info, "Navigation", group_info.name, subgroup_info, parent_group);
 
    CONFIG_BOOL(
          settings->menu.navigation.wraparound.horizontal_enable,
@@ -5643,6 +5813,7 @@ static bool setting_append_list_menu_options(
          "ON",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    settings_data_list_current_add_flags(list, list_info, SD_FLAG_ADVANCED);
@@ -5656,13 +5827,13 @@ static bool setting_append_list_menu_options(
          "ON",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    settings_data_list_current_add_flags(list, list_info, SD_FLAG_ADVANCED);
 
-   END_SUB_GROUP(list, list_info);
-
-   START_SUB_GROUP(list, list_info, "Settings View", group_info.name, subgroup_info);
+   END_SUB_GROUP(list, list_info, parent_group);
+   START_SUB_GROUP(list, list_info, "Settings View", group_info.name, subgroup_info, parent_group);
 
    CONFIG_BOOL(
          settings->menu.collapse_subgroups_enable,
@@ -5673,6 +5844,7 @@ static bool setting_append_list_menu_options(
          "ON",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    settings_data_list_current_add_flags(list, list_info, SD_FLAG_ADVANCED);
@@ -5686,6 +5858,7 @@ static bool setting_append_list_menu_options(
          "ON",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
 
@@ -5699,6 +5872,7 @@ static bool setting_append_list_menu_options(
          "ON",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
 #endif
@@ -5711,6 +5885,7 @@ static bool setting_append_list_menu_options(
          menu_entry_normal_color,
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    settings_data_list_current_add_flags(list, list_info, SD_FLAG_ALLOW_INPUT);
@@ -5723,6 +5898,7 @@ static bool setting_append_list_menu_options(
          menu_entry_hover_color,
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    settings_data_list_current_add_flags(list, list_info, SD_FLAG_ALLOW_INPUT);
@@ -5735,14 +5911,14 @@ static bool setting_append_list_menu_options(
          menu_title_color,
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    settings_data_list_current_add_flags(list, list_info, SD_FLAG_ALLOW_INPUT);
    settings_data_list_current_add_flags(list, list_info, SD_FLAG_ADVANCED);
 
-   END_SUB_GROUP(list, list_info);
-
-   START_SUB_GROUP(list, list_info, "Browser", group_info.name, subgroup_info);
+   END_SUB_GROUP(list, list_info, parent_group);
+   START_SUB_GROUP(list, list_info, "Browser", group_info.name, subgroup_info, parent_group);
 
    CONFIG_BOOL(
          settings->menu.navigation.browser.filter.supported_extensions_enable,
@@ -5753,6 +5929,7 @@ static bool setting_append_list_menu_options(
          "ON",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
 
@@ -5765,6 +5942,7 @@ static bool setting_append_list_menu_options(
          "ON",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
 
@@ -5777,6 +5955,7 @@ static bool setting_append_list_menu_options(
          "ON",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
 
@@ -5789,13 +5968,13 @@ static bool setting_append_list_menu_options(
          "ON",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
 
 
-   END_SUB_GROUP(list, list_info);
-
-   START_SUB_GROUP(list, list_info, "Display", group_info.name, subgroup_info);
+   END_SUB_GROUP(list, list_info, parent_group);
+   START_SUB_GROUP(list, list_info, "Display", group_info.name, subgroup_info, parent_group);
 
    CONFIG_BOOL(
          settings->menu.dpi.override_enable,
@@ -5806,6 +5985,7 @@ static bool setting_append_list_menu_options(
          "ON",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
 
@@ -5816,27 +5996,28 @@ static bool setting_append_list_menu_options(
          menu_dpi_override_value,
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    menu_settings_list_current_add_range(list, list_info, 72, 999, 1, true, true);
 
-   END_SUB_GROUP(list, list_info);
-
-   END_GROUP(list, list_info);
+   END_SUB_GROUP(list, list_info, parent_group);
+   END_GROUP(list, list_info, parent_group);
 
    return true;
 }
 
 static bool setting_append_list_ui_options(
       rarch_setting_t **list,
-      rarch_setting_info_t *list_info)
+      rarch_setting_info_t *list_info,
+      const char *parent_group)
 {
    rarch_setting_group_info_t group_info    = {0};
    rarch_setting_group_info_t subgroup_info = {0};
    settings_t *settings = config_get_ptr();
 
-   START_GROUP(group_info, "UI Settings");
-   START_SUB_GROUP(list, list_info, "State", group_info.name, subgroup_info);
+   START_GROUP(group_info, "UI Settings", parent_group);
+   START_SUB_GROUP(list, list_info, "State", group_info.name, subgroup_info, parent_group);
 
    CONFIG_BOOL(
          settings->video.disable_composition,
@@ -5847,6 +6028,7 @@ static bool setting_append_list_ui_options(
          "ON",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    menu_settings_list_current_add_cmd(list, list_info, EVENT_CMD_REINIT);
@@ -5861,6 +6043,7 @@ static bool setting_append_list_ui_options(
          "ON",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    
@@ -5873,6 +6056,7 @@ static bool setting_append_list_ui_options(
          "ON",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    settings_data_list_current_add_flags(list, list_info, SD_FLAG_ADVANCED);
@@ -5886,6 +6070,7 @@ static bool setting_append_list_ui_options(
          "ON",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
 
@@ -5898,26 +6083,27 @@ static bool setting_append_list_ui_options(
          "ON",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
 
-   END_SUB_GROUP(list, list_info);
-
-   END_GROUP(list, list_info);
+   END_SUB_GROUP(list, list_info, parent_group);
+   END_GROUP(list, list_info, parent_group);
 
    return true;
 }
 
 static bool setting_append_list_archive_options(
       rarch_setting_t **list,
-      rarch_setting_info_t *list_info)
+      rarch_setting_info_t *list_info,
+      const char *parent_group)
 {
    rarch_setting_group_info_t group_info    = {0};
    rarch_setting_group_info_t subgroup_info = {0};
    settings_t *settings = config_get_ptr();
 
-   START_GROUP(group_info, "Archive Settings");
-   START_SUB_GROUP(list, list_info, "State", group_info.name, subgroup_info);
+   START_GROUP(group_info, "Archive Settings", parent_group);
+   START_SUB_GROUP(list, list_info, "State", group_info.name, subgroup_info, parent_group);
 
    CONFIG_UINT(
          settings->archive.mode,
@@ -5926,30 +6112,31 @@ static bool setting_append_list_archive_options(
          0,
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    menu_settings_list_current_add_range(list, list_info, 0, 2, 1, true, true);
    (*list)[list_info->index - 1].get_string_representation = 
       &setting_get_string_representation_uint_archive_mode;
 
-   END_SUB_GROUP(list, list_info);
-   END_GROUP(list, list_info);
+   END_SUB_GROUP(list, list_info, parent_group);
+   END_GROUP(list, list_info, parent_group);
 
    return true;
 }
 
 static bool setting_append_list_core_updater_options(
       rarch_setting_t **list,
-      rarch_setting_info_t *list_info)
+      rarch_setting_info_t *list_info,
+      const char *parent_group)
 {
 #ifdef HAVE_NETWORKING
    rarch_setting_group_info_t group_info    = {0};
    rarch_setting_group_info_t subgroup_info = {0};
    settings_t *settings = config_get_ptr();
 
-   START_GROUP(group_info, "Core Updater Settings");
-
-   START_SUB_GROUP(list, list_info, "State", group_info.name, subgroup_info);
+   START_GROUP(group_info, "Core Updater Settings", parent_group);
+   START_SUB_GROUP(list, list_info, "State", group_info.name, subgroup_info, parent_group);
 
    CONFIG_STRING(
          settings->network.buildbot_url,
@@ -5958,6 +6145,7 @@ static bool setting_append_list_core_updater_options(
          buildbot_server_url, 
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    settings_data_list_current_add_flags(list, list_info, SD_FLAG_ALLOW_INPUT);
@@ -5969,6 +6157,7 @@ static bool setting_append_list_core_updater_options(
          buildbot_assets_server_url, 
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    settings_data_list_current_add_flags(list, list_info, SD_FLAG_ALLOW_INPUT);
@@ -5982,11 +6171,12 @@ static bool setting_append_list_core_updater_options(
          "ON",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
 
-   END_SUB_GROUP(list, list_info);
-   END_GROUP(list, list_info);
+   END_SUB_GROUP(list, list_info, parent_group);
+   END_GROUP(list, list_info, parent_group);
 #endif
 
    return true;
@@ -5994,7 +6184,8 @@ static bool setting_append_list_core_updater_options(
 
 static bool setting_append_list_netplay_options(
       rarch_setting_t **list,
-      rarch_setting_info_t *list_info)
+      rarch_setting_info_t *list_info,
+      const char *parent_group)
 {
 #ifdef HAVE_NETPLAY
    rarch_setting_group_info_t group_info    = {0};
@@ -6002,9 +6193,9 @@ static bool setting_append_list_netplay_options(
    settings_t *settings = config_get_ptr();
    global_t   *global   = global_get_ptr();
 
-   START_GROUP(group_info, "Network Settings");
+   START_GROUP(group_info, "Network Settings", parent_group);
 
-   START_SUB_GROUP(list, list_info, "Netplay", group_info.name, subgroup_info);
+   START_SUB_GROUP(list, list_info, "Netplay", group_info.name, subgroup_info, parent_group);
 
    CONFIG_BOOL(
          global->netplay_enable,
@@ -6015,6 +6206,7 @@ static bool setting_append_list_netplay_options(
          "ON",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
 
@@ -6027,6 +6219,7 @@ static bool setting_append_list_netplay_options(
          "ON",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
 
@@ -6037,6 +6230,7 @@ static bool setting_append_list_netplay_options(
          "",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    settings_data_list_current_add_flags(list, list_info, SD_FLAG_ALLOW_INPUT);
@@ -6050,6 +6244,7 @@ static bool setting_append_list_netplay_options(
          "ON",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
 
@@ -6062,6 +6257,7 @@ static bool setting_append_list_netplay_options(
          "ON",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    
@@ -6072,6 +6268,7 @@ static bool setting_append_list_netplay_options(
          0,
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    menu_settings_list_current_add_range(list, list_info, 0, 10, 1, true, false);
@@ -6084,19 +6281,21 @@ static bool setting_append_list_netplay_options(
          RARCH_DEFAULT_PORT,
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    menu_settings_list_current_add_range(list, list_info, 1, 99999, 1, true, true);
    settings_data_list_current_add_flags(list, list_info, SD_FLAG_ALLOW_INPUT);
 
-   END_SUB_GROUP(list, list_info);
+   END_SUB_GROUP(list, list_info, parent_group);
 
    START_SUB_GROUP(
          list,
          list_info,
          "Miscellaneous",
          group_info.name,
-         subgroup_info);
+         subgroup_info,
+         parent_group);
 
 
 #if defined(HAVE_NETWORK_CMD)
@@ -6109,6 +6308,7 @@ static bool setting_append_list_netplay_options(
          "ON",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    settings_data_list_current_add_flags(list, list_info, SD_FLAG_ADVANCED);
@@ -6120,6 +6320,7 @@ static bool setting_append_list_netplay_options(
          network_cmd_port,
          group_info.name,
          subgroup_info.name,
+         parent_group,
          NULL,
          NULL);
    settings_data_list_current_add_flags(list, list_info, SD_FLAG_ADVANCED);
@@ -6133,12 +6334,13 @@ static bool setting_append_list_netplay_options(
          "ON",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    settings_data_list_current_add_flags(list, list_info, SD_FLAG_ADVANCED);
 #endif
-   END_SUB_GROUP(list, list_info);
-   END_GROUP(list, list_info);
+   END_SUB_GROUP(list, list_info, parent_group);
+   END_GROUP(list, list_info, parent_group);
 #endif
 
    return true;
@@ -6147,12 +6349,13 @@ static bool setting_append_list_netplay_options(
 #if 0
 static bool setting_append_list_patch_options(
       rarch_setting_t **list,
-      rarch_setting_info_t *list_info)
+      rarch_setting_info_t *list_info,
+      const char *parent_group)
 {
    rarch_setting_group_info_t group_info    = {0};
    rarch_setting_group_info_t subgroup_info = {0};
 
-   START_GROUP(group_info, "Patch Settings");
+   START_GROUP(group_info, "Patch Settings", parent_group);
    START_SUB_GROUP(list, list_info, "State", group_info.name, subgroup_info);
 
    CONFIG_BOOL(
@@ -6191,8 +6394,8 @@ static bool setting_append_list_patch_options(
          general_write_handler,
          general_read_handler);
 
-   END_SUB_GROUP(list, list_info);
-   END_GROUP(list, list_info);
+   END_SUB_GROUP(list, list_info, parent_group);
+   END_GROUP(list, list_info, parent_group);
 
    return true;
 }
@@ -6200,14 +6403,15 @@ static bool setting_append_list_patch_options(
 
 static bool setting_append_list_playlist_options(
       rarch_setting_t **list,
-      rarch_setting_info_t *list_info)
+      rarch_setting_info_t *list_info,
+      const char *parent_group)
 {
    rarch_setting_group_info_t group_info    = {0};
    rarch_setting_group_info_t subgroup_info = {0};
    settings_t *settings = config_get_ptr();
 
-   START_GROUP(group_info, "Playlist Settings");
-   START_SUB_GROUP(list, list_info, "History", group_info.name, subgroup_info);
+   START_GROUP(group_info, "Playlist Settings", parent_group);
+   START_SUB_GROUP(list, list_info, "History", group_info.name, subgroup_info, parent_group);
 
    CONFIG_BOOL(
          settings->history_list_enable,
@@ -6218,6 +6422,7 @@ static bool setting_append_list_playlist_options(
          "ON",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
 
@@ -6228,26 +6433,28 @@ static bool setting_append_list_playlist_options(
          default_content_history_size,
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    menu_settings_list_current_add_range(list, list_info, 0, 0, 1.0, true, false);
 
-   END_SUB_GROUP(list, list_info);
-   END_GROUP(list, list_info);
+   END_SUB_GROUP(list, list_info, parent_group);
+   END_GROUP(list, list_info, parent_group);
 
    return true;
 }
 
 static bool setting_append_list_user_options(
       rarch_setting_t **list,
-      rarch_setting_info_t *list_info)
+      rarch_setting_info_t *list_info,
+      const char *parent_group)
 {
    rarch_setting_group_info_t group_info    = {0};
    rarch_setting_group_info_t subgroup_info = {0};
    settings_t *settings = config_get_ptr();
 
-   START_GROUP(group_info, "User Settings");
-   START_SUB_GROUP(list, list_info, "State", group_info.name, subgroup_info);
+   START_GROUP(group_info, "User Settings", parent_group);
+   START_SUB_GROUP(list, list_info, "State", group_info.name, subgroup_info, parent_group);
 
    CONFIG_STRING(
          settings->username,
@@ -6256,6 +6463,7 @@ static bool setting_append_list_user_options(
          "",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    settings_data_list_current_add_flags(list, list_info, SD_FLAG_ALLOW_INPUT);
@@ -6267,6 +6475,7 @@ static bool setting_append_list_user_options(
          def_user_language,
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    menu_settings_list_current_add_range(
@@ -6281,24 +6490,25 @@ static bool setting_append_list_user_options(
    (*list)[list_info->index - 1].get_string_representation = 
       &setting_get_string_representation_uint_user_language;
 
-   END_SUB_GROUP(list, list_info);
-   END_GROUP(list, list_info);
+   END_SUB_GROUP(list, list_info, parent_group);
+   END_GROUP(list, list_info, parent_group);
 
    return true;
 }
 
 static bool setting_append_list_directory_options(
       rarch_setting_t **list,
-      rarch_setting_info_t *list_info)
+      rarch_setting_info_t *list_info,
+      const char *parent_group)
 {
    rarch_setting_group_info_t group_info    = {0};
    rarch_setting_group_info_t subgroup_info = {0};
    settings_t *settings = config_get_ptr();
    global_t *global     = global_get_ptr();
 
-   START_GROUP(group_info, "Directory Settings");
+   START_GROUP(group_info, "Directory Settings", parent_group);
 
-   START_SUB_GROUP(list, list_info, "State", group_info.name, subgroup_info);
+   START_SUB_GROUP(list, list_info, "State", group_info.name, subgroup_info, parent_group);
 
    CONFIG_DIR(
          settings->core_assets_directory,
@@ -6308,6 +6518,7 @@ static bool setting_append_list_directory_options(
          "<default>",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    settings_data_list_current_add_flags(
@@ -6323,6 +6534,7 @@ static bool setting_append_list_directory_options(
          "<default>",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    settings_data_list_current_add_flags(
@@ -6338,6 +6550,7 @@ static bool setting_append_list_directory_options(
          "<default>",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    settings_data_list_current_add_flags(
@@ -6353,6 +6566,7 @@ static bool setting_append_list_directory_options(
          "<default>",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    settings_data_list_current_add_flags(
@@ -6369,6 +6583,7 @@ static bool setting_append_list_directory_options(
          "<default>",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    settings_data_list_current_add_flags(
@@ -6385,6 +6600,7 @@ static bool setting_append_list_directory_options(
          "<None>",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    menu_settings_list_current_add_cmd(list, list_info, EVENT_CMD_CORE_INFO_INIT);
@@ -6401,6 +6617,7 @@ static bool setting_append_list_directory_options(
          "<None>",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    menu_settings_list_current_add_cmd(list, list_info, EVENT_CMD_CORE_INFO_INIT);
@@ -6418,6 +6635,7 @@ static bool setting_append_list_directory_options(
          "<None>",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    settings_data_list_current_add_flags(
@@ -6433,6 +6651,7 @@ static bool setting_append_list_directory_options(
          "<None>",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    settings_data_list_current_add_flags(
@@ -6449,6 +6668,7 @@ static bool setting_append_list_directory_options(
          "<None>",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    settings_data_list_current_add_flags(
@@ -6464,6 +6684,7 @@ static bool setting_append_list_directory_options(
          "<default>",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    settings_data_list_current_add_flags(
@@ -6479,6 +6700,7 @@ static bool setting_append_list_directory_options(
          "<default>",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    settings_data_list_current_add_flags(
@@ -6494,6 +6716,7 @@ static bool setting_append_list_directory_options(
          "<default>",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    settings_data_list_current_add_flags(
@@ -6509,6 +6732,7 @@ static bool setting_append_list_directory_options(
          "<default>",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    settings_data_list_current_add_flags(
@@ -6524,6 +6748,7 @@ static bool setting_append_list_directory_options(
          "<default>",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    settings_data_list_current_add_flags(
@@ -6540,6 +6765,7 @@ static bool setting_append_list_directory_options(
          "<default>",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    settings_data_list_current_add_flags(
@@ -6555,6 +6781,7 @@ static bool setting_append_list_directory_options(
          "<default>",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    settings_data_list_current_add_flags(
@@ -6571,6 +6798,7 @@ static bool setting_append_list_directory_options(
          "<Content dir>",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    settings_data_list_current_add_flags(
@@ -6586,6 +6814,7 @@ static bool setting_append_list_directory_options(
          "<default>",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    settings_data_list_current_add_flags(
@@ -6601,6 +6830,7 @@ static bool setting_append_list_directory_options(
          "<None>",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    settings_data_list_current_add_flags(
@@ -6616,6 +6846,7 @@ static bool setting_append_list_directory_options(
          "<default>",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    settings_data_list_current_add_flags(
@@ -6631,6 +6862,7 @@ static bool setting_append_list_directory_options(
          "<Content dir>",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    settings_data_list_current_add_flags(
@@ -6646,6 +6878,7 @@ static bool setting_append_list_directory_options(
          "<Content dir>",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    settings_data_list_current_add_flags(
@@ -6661,6 +6894,7 @@ static bool setting_append_list_directory_options(
          "<Content dir>",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    settings_data_list_current_add_flags(
@@ -6676,29 +6910,32 @@ static bool setting_append_list_directory_options(
          "<None>",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
    settings_data_list_current_add_flags(
          list,
          list_info,
          SD_FLAG_ALLOW_EMPTY | SD_FLAG_PATH_DIR | SD_FLAG_BROWSER_ACTION);
-   END_SUB_GROUP(list, list_info);
-   END_GROUP(list, list_info);
+
+   END_SUB_GROUP(list, list_info, parent_group);
+   END_GROUP(list, list_info, parent_group);
 
    return true;
 }
 
 static bool setting_append_list_privacy_options(
       rarch_setting_t **list,
-      rarch_setting_info_t *list_info)
+      rarch_setting_info_t *list_info,
+      const char *parent_group)
 {
    rarch_setting_group_info_t group_info    = {0};
    rarch_setting_group_info_t subgroup_info = {0};
    settings_t *settings = config_get_ptr();
 
-   START_GROUP(group_info, "Privacy Settings");
+   START_GROUP(group_info, "Privacy Settings", parent_group);
    START_SUB_GROUP(list, list_info, "State",
-         group_info.name, subgroup_info);
+         group_info.name, subgroup_info, parent_group);
 
    CONFIG_BOOL(
          settings->camera.allow,
@@ -6709,6 +6946,7 @@ static bool setting_append_list_privacy_options(
          "ON",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
 
@@ -6721,10 +6959,12 @@ static bool setting_append_list_privacy_options(
          "ON",
          group_info.name,
          subgroup_info.name,
+         parent_group,
          general_write_handler,
          general_read_handler);
-   END_SUB_GROUP(list, list_info);
-   END_GROUP(list, list_info);
+
+   END_SUB_GROUP(list, list_info, parent_group);
+   END_GROUP(list, list_info, parent_group);
 
    return true;
 }
@@ -6732,6 +6972,7 @@ static bool setting_append_list_privacy_options(
 static bool setting_append_list_input_player_options(
       rarch_setting_t **list,
       rarch_setting_info_t *list_info,
+      const char *parent_group,
       unsigned user)
 {
    /* This constants matches the string length.
@@ -6753,14 +6994,15 @@ static bool setting_append_list_input_player_options(
    snprintf(group_lbl[user], sizeof(group_lbl[user]),
          "Input %s Binds", buffer[user]);
 
-   START_GROUP(group_info, group_lbl[user]);
+   START_GROUP(group_info, group_lbl[user], parent_group);
 
    START_SUB_GROUP(
          list,
          list_info,
          buffer[user],
          group_info.name,
-         subgroup_info);
+         subgroup_info,
+         parent_group);
 
    for (i = 0; i < RARCH_BIND_LIST_END; i ++)
    {
@@ -6806,12 +7048,14 @@ static bool setting_append_list_input_player_options(
                strdup(label),
                &defaults[i],
                group_info.name,
-               subgroup_info.name);
+               subgroup_info.name,
+               parent_group);
          menu_settings_list_current_add_bind_type(list, list_info, i + MENU_SETTINGS_BIND_BEGIN);
       }
    }
-   END_SUB_GROUP(list, list_info);
-   END_GROUP(list, list_info);
+
+   END_SUB_GROUP(list, list_info, parent_group);
+   END_GROUP(list, list_info, parent_group);
 
    return true;
 }
@@ -6843,55 +7087,55 @@ rarch_setting_t *menu_setting_new(unsigned mask)
 
    if (mask & SL_FLAG_MAIN_MENU)
    {
-      if (!setting_append_list_main_menu_options(&list, list_info))
+      if (!setting_append_list_main_menu_options(&list, list_info, "Main Menu"))
          goto error;
    }
 
    if (mask & SL_FLAG_DRIVER_OPTIONS)
    {
-      if (!setting_append_list_driver_options(&list, list_info))
+      if (!setting_append_list_driver_options(&list, list_info, "Settings"))
          goto error;
    }
 
    if (mask & SL_FLAG_CORE_OPTIONS)
    {
-      if (!setting_append_list_core_options(&list, list_info))
+      if (!setting_append_list_core_options(&list, list_info, "Settings"))
          goto error;
    }
 
    if (mask & SL_FLAG_CONFIGURATION_OPTIONS)
    {
-      if (!setting_append_list_configuration_options(&list, list_info))
+      if (!setting_append_list_configuration_options(&list, list_info, "Settings"))
          goto error;
    }
 
    if (mask & SL_FLAG_LOGGING_OPTIONS)
    {
-      if (!setting_append_list_logging_options(&list, list_info))
+      if (!setting_append_list_logging_options(&list, list_info, "Settings"))
          goto error;
    }
    
    if (mask & SL_FLAG_SAVING_OPTIONS)
    {
-      if (!setting_append_list_saving_options(&list, list_info))
+      if (!setting_append_list_saving_options(&list, list_info, "Settings"))
          goto error;
    }
 
    if (mask & SL_FLAG_REWIND_OPTIONS)
    {
-      if (!setting_append_list_rewind_options(&list, list_info))
+      if (!setting_append_list_rewind_options(&list, list_info, "Settings"))
          goto error;
    }
 
    if (mask & SL_FLAG_VIDEO_OPTIONS)
    {
-      if (!setting_append_list_video_options(&list, list_info))
+      if (!setting_append_list_video_options(&list, list_info, "Settings"))
          goto error;
    }
 
    if (mask & SL_FLAG_AUDIO_OPTIONS)
    {
-      if (!setting_append_list_audio_options(&list, list_info))
+      if (!setting_append_list_audio_options(&list, list_info, "Settings"))
          goto error;
    }
 
@@ -6900,112 +7144,110 @@ rarch_setting_t *menu_setting_new(unsigned mask)
       unsigned user;
       settings_t      *settings = config_get_ptr();
 
-      if (!setting_append_list_input_options(&list, list_info))
+      if (!setting_append_list_input_options(&list, list_info, "Settings"))
          goto error;
 
       for (user = 0; user < settings->input.max_users; user++)
-         setting_append_list_input_player_options(&list, list_info, user);
+         setting_append_list_input_player_options(&list, list_info, "Settings", user);
    }
 
 
     
    if (mask & SL_FLAG_INPUT_HOTKEY_OPTIONS)
    {
-      if (!setting_append_list_input_hotkey_options(&list, list_info))
+      if (!setting_append_list_input_hotkey_options(&list, list_info, "Settings"))
          goto error;
    }
 
    if (mask & SL_FLAG_RECORDING_OPTIONS)
    {
-      if (!setting_append_list_recording_options(&list, list_info))
+      if (!setting_append_list_recording_options(&list, list_info, "Settings"))
          goto error;
    }
 
    if (mask & SL_FLAG_FRAME_THROTTLE_OPTIONS)
    {
-      if (!setting_append_list_frame_throttling_options(&list, list_info))
+      if (!setting_append_list_frame_throttling_options(&list, list_info, "Settings"))
          goto error;
    }
 
    if (mask & SL_FLAG_FONT_OPTIONS)
    {
-      if (!setting_append_list_font_options(&list, list_info))
+      if (!setting_append_list_font_options(&list, list_info, "Settings"))
          goto error;
    }
 
    if (mask & SL_FLAG_OVERLAY_OPTIONS)
    {
-      if (!setting_append_list_overlay_options(&list, list_info))
+      if (!setting_append_list_overlay_options(&list, list_info, "Settings"))
          goto error;
    }
    
    if (mask & SL_FLAG_OSK_OVERLAY_OPTIONS)
    {
-      if (!setting_append_list_osk_overlay_options(&list, list_info))
+      if (!setting_append_list_osk_overlay_options(&list, list_info, "Settings"))
          goto error;
    }
 
-
-
    if (mask & SL_FLAG_MENU_OPTIONS)
    {
-      if (!setting_append_list_menu_options(&list, list_info))
+      if (!setting_append_list_menu_options(&list, list_info, "Settings"))
          goto error;
    }
 
    if (mask & SL_FLAG_UI_OPTIONS)
    {
-      if (!setting_append_list_ui_options(&list, list_info))
+      if (!setting_append_list_ui_options(&list, list_info, "Settings"))
          goto error;
    }
 
 #if 0
    if (mask & SL_FLAG_PATCH_OPTIONS)
    {
-      if (!setting_append_list_patch_options(&list, list_info))
+      if (!setting_append_list_patch_options(&list, list_info, "Settings"))
          goto error;
    }
 #endif
 
    if (mask & SL_FLAG_PLAYLIST_OPTIONS)
    {
-      if (!setting_append_list_playlist_options(&list, list_info))
+      if (!setting_append_list_playlist_options(&list, list_info, "Settings"))
          goto error;
    }
 
    if (mask & SL_FLAG_CORE_UPDATER_OPTIONS)
    {
-      if (!setting_append_list_core_updater_options(&list, list_info))
+      if (!setting_append_list_core_updater_options(&list, list_info, "Settings"))
          goto error;
    }
 
    if (mask & SL_FLAG_NETPLAY_OPTIONS)
    {
-      if (!setting_append_list_netplay_options(&list, list_info))
+      if (!setting_append_list_netplay_options(&list, list_info, "Settings"))
          goto error;
    }
 
    if (mask & SL_FLAG_ARCHIVE_OPTIONS)
    {
-      if (!setting_append_list_archive_options(&list, list_info))
+      if (!setting_append_list_archive_options(&list, list_info, "Settings"))
          goto error;
    }
 
    if (mask & SL_FLAG_USER_OPTIONS)
    {
-      if (!setting_append_list_user_options(&list, list_info))
+      if (!setting_append_list_user_options(&list, list_info, "Settings"))
          goto error;
    }
 
    if (mask & SL_FLAG_DIRECTORY_OPTIONS)
    {
-      if (!setting_append_list_directory_options(&list, list_info))
+      if (!setting_append_list_directory_options(&list, list_info, "Settings"))
          goto error;
    }
 
    if (mask & SL_FLAG_PRIVACY_OPTIONS)
    {
-      if (!setting_append_list_privacy_options(&list, list_info))
+      if (!setting_append_list_privacy_options(&list, list_info, "Settings"))
          goto error;
    }
 
diff --git a/menu/menu_setting.h b/menu/menu_setting.h
index 1aeda4de6b..5526f6c1e8 100644
--- a/menu/menu_setting.h
+++ b/menu/menu_setting.h
@@ -135,6 +135,7 @@ typedef struct rarch_setting
    const char           *short_description;
    const char           *group;
    const char           *subgroup;
+   const char           *parent_group;
    const char           *values;
 
    uint32_t             index;

From 229c19225f4ff3d8274c930698e675f32989e273 Mon Sep 17 00:00:00 2001
From: twinaphex <libretro@gmail.com>
Date: Mon, 8 Jun 2015 02:03:50 +0200
Subject: [PATCH 14/14] Get rid of hardcoded
 menu_entries_common_is_settings_entry

---
 menu/menu_entries_cbs.c               |  54 -----------
 menu/menu_entries_cbs.h               |   2 -
 menu/menu_entries_cbs_deferred_push.c |   5 +-
 menu/menu_entries_cbs_left.c          |   5 +-
 menu/menu_entries_cbs_right.c         |   5 +-
 menu/menu_entries_cbs_title.c         |  18 ++--
 menu/menu_setting.c                   | 125 ++++++++++++++++++++------
 7 files changed, 118 insertions(+), 96 deletions(-)

diff --git a/menu/menu_entries_cbs.c b/menu/menu_entries_cbs.c
index 1b90051ed3..9c7868c407 100644
--- a/menu/menu_entries_cbs.c
+++ b/menu/menu_entries_cbs.c
@@ -130,60 +130,6 @@ int cb_core_updater_download(void *data, size_t len)
 }
 #endif
 
-int menu_entries_common_is_settings_entry(uint32_t label_hash)
-{
-   switch (label_hash)
-   {
-      case MENU_LABEL_DRIVER_SETTINGS:
-      case MENU_LABEL_CORE_SETTINGS:
-      case MENU_LABEL_CONFIGURATION_SETTINGS:
-      case MENU_LABEL_LOGGING_SETTINGS:
-      case MENU_LABEL_SAVING_SETTINGS:
-      case MENU_LABEL_REWIND_SETTINGS:
-      case MENU_LABEL_VIDEO_SETTINGS:
-      case MENU_LABEL_RECORDING_SETTINGS:
-      case MENU_LABEL_FRAME_THROTTLE_SETTINGS:
-      case MENU_LABEL_SHADER_SETTINGS:
-      case MENU_LABEL_ONSCREEN_DISPLAY_SETTINGS:
-      case MENU_LABEL_AUDIO_SETTINGS:
-      case MENU_LABEL_INPUT_SETTINGS:
-      case MENU_LABEL_INPUT_USER_1_BINDS:
-      case MENU_LABEL_INPUT_USER_2_BINDS:
-      case MENU_LABEL_INPUT_USER_3_BINDS:
-      case MENU_LABEL_INPUT_USER_4_BINDS:
-      case MENU_LABEL_INPUT_USER_5_BINDS:
-      case MENU_LABEL_INPUT_USER_6_BINDS:
-      case MENU_LABEL_INPUT_USER_7_BINDS:
-      case MENU_LABEL_INPUT_USER_8_BINDS:
-      case MENU_LABEL_INPUT_USER_9_BINDS:
-      case MENU_LABEL_INPUT_USER_10_BINDS:
-      case MENU_LABEL_INPUT_USER_11_BINDS:
-      case MENU_LABEL_INPUT_USER_12_BINDS:
-      case MENU_LABEL_INPUT_USER_13_BINDS:
-      case MENU_LABEL_INPUT_USER_14_BINDS:
-      case MENU_LABEL_INPUT_USER_15_BINDS:
-      case MENU_LABEL_INPUT_USER_16_BINDS:
-      case MENU_LABEL_INPUT_HOTKEY_SETTINGS:
-      case MENU_LABEL_OVERLAY_SETTINGS:
-      case MENU_LABEL_ONSCREEN_KEYBOARD_OVERLAY_SETTINGS:
-      case MENU_LABEL_MENU_SETTINGS:
-      case MENU_LABEL_UI_SETTINGS:
-      case MENU_LABEL_PATCH_SETTINGS:
-      case MENU_LABEL_PLAYLIST_SETTINGS:
-      case MENU_LABEL_CORE_UPDATER_SETTINGS:
-      case MENU_LABEL_NETWORK_SETTINGS:
-      case MENU_LABEL_ARCHIVE_SETTINGS:
-      case MENU_LABEL_USER_SETTINGS:
-      case MENU_LABEL_DIRECTORY_SETTINGS:
-      case MENU_LABEL_PRIVACY_SETTINGS:
-         break;
-      default:
-         return 0;
-   }
-
-   return 1;
-}
-
 #if 0
 #define DEBUG_LOG
 #endif
diff --git a/menu/menu_entries_cbs.h b/menu/menu_entries_cbs.h
index 46fcc9bac6..67ba544098 100644
--- a/menu/menu_entries_cbs.h
+++ b/menu/menu_entries_cbs.h
@@ -45,8 +45,6 @@ int action_right_cheat(unsigned type, const char *label,
 
 void menu_entries_common_load_content(bool persist);
 
-int menu_entries_common_is_settings_entry(uint32_t label_hash);
-
 int menu_entries_cbs_init_bind_left(menu_file_list_cbs_t *cbs,
       const char *path, const char *label, unsigned type, size_t idx,
       const char *elem0, const char *elem1, const char *menu_label,
diff --git a/menu/menu_entries_cbs_deferred_push.c b/menu/menu_entries_cbs_deferred_push.c
index 3b1d74c4c3..a947ee3842 100644
--- a/menu/menu_entries_cbs_deferred_push.c
+++ b/menu/menu_entries_cbs_deferred_push.c
@@ -637,15 +637,16 @@ int menu_entries_cbs_init_bind_deferred_push(menu_file_list_cbs_t *cbs,
       uint32_t label_hash, uint32_t menu_label_hash)
 {
    settings_t *settings   = config_get_ptr();
+   rarch_setting_t *setting = menu_setting_find(elem0);
 
    if (!cbs)
       return -1;
 
    cbs->action_deferred_push = deferred_push_default;
 
-   if ((strlen(elem1) != 0) && !!strcmp(elem0, elem1))
+   if (setting)
    {
-      if (menu_entries_common_is_settings_entry(label_hash))
+      if (!strcmp(setting->parent_group, "Main Menu") && setting->type == ST_GROUP)
       {
          if (!settings->menu.collapse_subgroups_enable)
          {
diff --git a/menu/menu_entries_cbs_left.c b/menu/menu_entries_cbs_left.c
index 1ca7c6298c..9e700de4e6 100644
--- a/menu/menu_entries_cbs_left.c
+++ b/menu/menu_entries_cbs_left.c
@@ -347,10 +347,11 @@ static int menu_entries_cbs_init_bind_left_compare_label(menu_file_list_cbs_t *c
       const char *label, uint32_t label_hash, const char *elem0)
 {
    unsigned i;
+   rarch_setting_t *setting = menu_setting_find(label);
 
-   if (label)
+   if (setting)
    {
-      if (menu_entries_common_is_settings_entry(label_hash))
+      if (!strcmp(setting->parent_group, "Main Menu") && setting->type == ST_GROUP)
       {
          cbs->action_left = action_left_scroll;
          return 0;
diff --git a/menu/menu_entries_cbs_right.c b/menu/menu_entries_cbs_right.c
index d27987f9f4..a10b773024 100644
--- a/menu/menu_entries_cbs_right.c
+++ b/menu/menu_entries_cbs_right.c
@@ -420,10 +420,11 @@ static int menu_entries_cbs_init_bind_right_compare_label(menu_file_list_cbs_t *
       const char *label, uint32_t label_hash, uint32_t menu_label_hash, const char *elem0)
 {
    unsigned i;
+   rarch_setting_t *setting = menu_setting_find(label);
 
-   if (label)
+   if (setting)
    {
-      if (menu_entries_common_is_settings_entry(label_hash))
+      if (!strcmp(setting->parent_group, "Settings") && setting->type == ST_GROUP)
       {
          cbs->action_right = action_right_scroll;
          return 0;
diff --git a/menu/menu_entries_cbs_title.c b/menu/menu_entries_cbs_title.c
index 4de4f98fae..ff951bf811 100644
--- a/menu/menu_entries_cbs_title.c
+++ b/menu/menu_entries_cbs_title.c
@@ -46,6 +46,7 @@ static int action_get_title_default(const char *path, const char *label,
    struct string_list *list_label = string_split(label, "|");
    struct string_list *list_path  = string_split(path, "|");
    driver_t               *driver = driver_get_ptr();
+   rarch_setting_t *setting = NULL;
 
    *elem0 = *elem1 = *elem0_path = *elem1_path = 0;
 
@@ -77,15 +78,20 @@ static int action_get_title_default(const char *path, const char *label,
    RARCH_LOG("label %s, elem0 %s, elem1 %s\n", label, elem0, elem1);
 #endif
 
-   if (menu_entries_common_is_settings_entry(hash) == 1)
+   setting = menu_setting_find(label);
+
+   if (setting)
    {
-      strlcpy(s, string_to_upper(elem0), len);
-      if (elem1[0] != '\0')
+      if (!strcmp(setting->parent_group, "Main Menu") && setting->type == ST_GROUP)
       {
-         strlcat(s, " - ", len);
-         strlcat(s, string_to_upper(elem1), len);
+         strlcpy(s, string_to_upper(elem0), len);
+         if (elem1[0] != '\0')
+         {
+            strlcat(s, " - ", len);
+            strlcat(s, string_to_upper(elem1), len);
+         }
+         return 0;
       }
-      return 0;
    }
 
    switch (hash)
diff --git a/menu/menu_setting.c b/menu/menu_setting.c
index b22247f3be..1e7cd0afdd 100644
--- a/menu/menu_setting.c
+++ b/menu/menu_setting.c
@@ -3629,7 +3629,7 @@ static bool setting_append_list_main_menu_options(
             "Save State",
             group_info.name,
             subgroup_info.name,
-            parent_group);
+            "N/A");
       (*list)[list_info->index - 1].action_left   = &setting_action_left_savestates;
       (*list)[list_info->index - 1].action_right  = &setting_action_right_savestates;
       (*list)[list_info->index - 1].action_start  = &setting_action_start_savestates;
@@ -3643,7 +3643,7 @@ static bool setting_append_list_main_menu_options(
             "Load State",
             group_info.name,
             subgroup_info.name,
-            parent_group);
+            "N/A");
       (*list)[list_info->index - 1].action_left   = &setting_action_left_savestates;
       (*list)[list_info->index - 1].action_right  = &setting_action_left_savestates;
       (*list)[list_info->index - 1].action_start  = &setting_action_start_savestates;
@@ -3739,6 +3739,9 @@ static bool setting_append_list_driver_options(
    settings_t *settings = config_get_ptr();
    
    START_GROUP(group_info, "Driver Settings", parent_group);
+
+   parent_group = "Settings";
+
    START_SUB_GROUP(list, list_info, "State", group_info.name,
          subgroup_info, parent_group);
    
@@ -3876,6 +3879,8 @@ static bool setting_append_list_core_options(
 
    START_GROUP(group_info, "Core Settings", parent_group);
 
+   parent_group = "Settings";
+
    START_SUB_GROUP(list, list_info, "State", group_info.name, subgroup_info,
          parent_group);
 
@@ -3938,6 +3943,8 @@ static bool setting_append_list_configuration_options(
 
    START_GROUP(group_info, "Configuration Settings", parent_group);
 
+   parent_group = "Settings";
+
    START_SUB_GROUP(list, list_info, "State", group_info.name, subgroup_info,
          parent_group);
 
@@ -4009,6 +4016,8 @@ static bool setting_append_list_saving_options(
 
    START_GROUP(group_info, "Saving Settings", parent_group);
 
+   parent_group = "Settings";
+
    START_SUB_GROUP(list, list_info, "State", group_info.name, subgroup_info,
          parent_group);
 
@@ -4127,6 +4136,8 @@ static bool setting_append_list_logging_options(
 
    START_GROUP(group_info, "Logging Settings", parent_group);
 
+   parent_group = "Settings";
+
    START_SUB_GROUP(list, list_info, "State", group_info.name, subgroup_info,
          parent_group);
 
@@ -4194,6 +4205,8 @@ static bool setting_append_list_frame_throttling_options(
 
    START_GROUP(group_info, "Frame Throttle Settings", parent_group);
 
+   parent_group = "Settings";
+
    START_SUB_GROUP(list, list_info, "State", group_info.name, subgroup_info, parent_group);
 
    CONFIG_BOOL(
@@ -4251,6 +4264,8 @@ static bool setting_append_list_rewind_options(
 
    START_GROUP(group_info, "Rewind Settings", parent_group);
 
+   parent_group = "Settings";
+
    START_SUB_GROUP(list, list_info, "State", group_info.name, subgroup_info, parent_group);
 
 
@@ -4310,6 +4325,8 @@ static bool setting_append_list_recording_options(
 
    START_GROUP(group_info, "Recording Settings", parent_group);
 
+   parent_group = "Settings";
+
    START_SUB_GROUP(list, list_info, "State", group_info.name, subgroup_info, parent_group);
 
    CONFIG_BOOL(
@@ -4413,6 +4430,9 @@ static bool setting_append_list_video_options(
    (void)global;
 
    START_GROUP(group_info, "Video Settings", parent_group);
+
+   parent_group = "Settings";
+
    START_SUB_GROUP(list, list_info, "State", group_info.name, subgroup_info, parent_group);
 
    CONFIG_BOOL(settings->fps_show,
@@ -4990,6 +5010,9 @@ static bool setting_append_list_font_options(
    settings_t *settings = config_get_ptr();
 
    START_GROUP(group_info, "Onscreen Display Settings", parent_group);
+
+   parent_group = "Settings";
+
    START_SUB_GROUP(list, list_info, "Messages", group_info.name, subgroup_info, parent_group);
 
 #ifndef RARCH_CONSOLE
@@ -5075,6 +5098,9 @@ static bool setting_append_list_audio_options(
    global_t   *global   = global_get_ptr();
 
    START_GROUP(group_info, "Audio Settings", parent_group);
+
+   parent_group = "Settings";
+
    START_SUB_GROUP(list, list_info, "State", group_info.name, subgroup_info, parent_group);
 
    (void)global;
@@ -5136,6 +5162,8 @@ static bool setting_append_list_audio_options(
 
    END_SUB_GROUP(list, list_info, parent_group);
 
+   parent_group = "Settings";
+
    START_SUB_GROUP(
          list,
          list_info,
@@ -5227,6 +5255,8 @@ static bool setting_append_list_audio_options(
 
    END_SUB_GROUP(list, list_info, parent_group);
 
+   parent_group = "Settings";
+
    START_SUB_GROUP(
          list,
          list_info,
@@ -5290,6 +5320,9 @@ static bool setting_append_list_input_hotkey_options(
    settings_t *settings = config_get_ptr();
 
    START_GROUP(group_info, "Input Hotkey Binds", parent_group);
+
+   parent_group = "Settings";
+
    START_SUB_GROUP(list, list_info, "State", group_info.name, subgroup_info,
          parent_group);
 
@@ -5326,6 +5359,9 @@ static bool setting_append_list_input_options(
    global_t   *global   = global_get_ptr();
 
    START_GROUP(group_info, "Input Settings", parent_group);
+
+   parent_group = "Settings";
+
    START_SUB_GROUP(list, list_info, "State", group_info.name, subgroup_info, parent_group);
 
    CONFIG_UINT(
@@ -5607,6 +5643,9 @@ static bool setting_append_list_overlay_options(
    global_t   *global   = global_get_ptr();
 
    START_GROUP(group_info, "Onscreen Overlay Settings", parent_group);
+
+   parent_group = "Settings";
+
    START_SUB_GROUP(list, list_info, "State", group_info.name, subgroup_info, parent_group);
 
    CONFIG_BOOL(
@@ -5686,6 +5725,9 @@ static bool setting_append_list_osk_overlay_options(
    global_t   *global   = global_get_ptr();
 
    START_GROUP(group_info, "Onscreen Keyboard Overlay Settings", parent_group);
+
+   parent_group = "Settings";
+
    START_SUB_GROUP(list, list_info, "State", group_info.name, subgroup_info, parent_group);
 
    CONFIG_BOOL(
@@ -5731,6 +5773,9 @@ static bool setting_append_list_menu_options(
    settings_t *settings = config_get_ptr();
 
    START_GROUP(group_info, "Menu Settings", parent_group);
+   
+   parent_group = "Settings";
+
    START_SUB_GROUP(list, list_info, "State", group_info.name, subgroup_info, parent_group);
 
    CONFIG_PATH(
@@ -6017,6 +6062,9 @@ static bool setting_append_list_ui_options(
    settings_t *settings = config_get_ptr();
 
    START_GROUP(group_info, "UI Settings", parent_group);
+
+   parent_group = "Settings";
+
    START_SUB_GROUP(list, list_info, "State", group_info.name, subgroup_info, parent_group);
 
    CONFIG_BOOL(
@@ -6103,6 +6151,9 @@ static bool setting_append_list_archive_options(
    settings_t *settings = config_get_ptr();
 
    START_GROUP(group_info, "Archive Settings", parent_group);
+
+   parent_group = "Settings";
+
    START_SUB_GROUP(list, list_info, "State", group_info.name, subgroup_info, parent_group);
 
    CONFIG_UINT(
@@ -6195,6 +6246,8 @@ static bool setting_append_list_netplay_options(
 
    START_GROUP(group_info, "Network Settings", parent_group);
 
+   parent_group = "Settings";
+
    START_SUB_GROUP(list, list_info, "Netplay", group_info.name, subgroup_info, parent_group);
 
    CONFIG_BOOL(
@@ -6356,6 +6409,9 @@ static bool setting_append_list_patch_options(
    rarch_setting_group_info_t subgroup_info = {0};
 
    START_GROUP(group_info, "Patch Settings", parent_group);
+
+   parent_group = "Settings";
+
    START_SUB_GROUP(list, list_info, "State", group_info.name, subgroup_info);
 
    CONFIG_BOOL(
@@ -6411,6 +6467,9 @@ static bool setting_append_list_playlist_options(
    settings_t *settings = config_get_ptr();
 
    START_GROUP(group_info, "Playlist Settings", parent_group);
+
+   parent_group = "Settings";
+
    START_SUB_GROUP(list, list_info, "History", group_info.name, subgroup_info, parent_group);
 
    CONFIG_BOOL(
@@ -6454,6 +6513,9 @@ static bool setting_append_list_user_options(
    settings_t *settings = config_get_ptr();
 
    START_GROUP(group_info, "User Settings", parent_group);
+
+   parent_group = "Settings";
+
    START_SUB_GROUP(list, list_info, "State", group_info.name, subgroup_info, parent_group);
 
    CONFIG_STRING(
@@ -6508,6 +6570,8 @@ static bool setting_append_list_directory_options(
 
    START_GROUP(group_info, "Directory Settings", parent_group);
 
+   parent_group = "Settings";
+
    START_SUB_GROUP(list, list_info, "State", group_info.name, subgroup_info, parent_group);
 
    CONFIG_DIR(
@@ -6934,6 +6998,9 @@ static bool setting_append_list_privacy_options(
    settings_t *settings = config_get_ptr();
 
    START_GROUP(group_info, "Privacy Settings", parent_group);
+
+   parent_group = "Settings";
+
    START_SUB_GROUP(list, list_info, "State",
          group_info.name, subgroup_info, parent_group);
 
@@ -6996,6 +7063,8 @@ static bool setting_append_list_input_player_options(
 
    START_GROUP(group_info, group_lbl[user], parent_group);
 
+   parent_group = "Settings";
+
    START_SUB_GROUP(
          list,
          list_info,
@@ -7093,49 +7162,49 @@ rarch_setting_t *menu_setting_new(unsigned mask)
 
    if (mask & SL_FLAG_DRIVER_OPTIONS)
    {
-      if (!setting_append_list_driver_options(&list, list_info, "Settings"))
+      if (!setting_append_list_driver_options(&list, list_info, "Main Menu"))
          goto error;
    }
 
    if (mask & SL_FLAG_CORE_OPTIONS)
    {
-      if (!setting_append_list_core_options(&list, list_info, "Settings"))
+      if (!setting_append_list_core_options(&list, list_info, "Main Menu"))
          goto error;
    }
 
    if (mask & SL_FLAG_CONFIGURATION_OPTIONS)
    {
-      if (!setting_append_list_configuration_options(&list, list_info, "Settings"))
+      if (!setting_append_list_configuration_options(&list, list_info, "Main Menu"))
          goto error;
    }
 
    if (mask & SL_FLAG_LOGGING_OPTIONS)
    {
-      if (!setting_append_list_logging_options(&list, list_info, "Settings"))
+      if (!setting_append_list_logging_options(&list, list_info, "Main Menu"))
          goto error;
    }
    
    if (mask & SL_FLAG_SAVING_OPTIONS)
    {
-      if (!setting_append_list_saving_options(&list, list_info, "Settings"))
+      if (!setting_append_list_saving_options(&list, list_info, "Main Menu"))
          goto error;
    }
 
    if (mask & SL_FLAG_REWIND_OPTIONS)
    {
-      if (!setting_append_list_rewind_options(&list, list_info, "Settings"))
+      if (!setting_append_list_rewind_options(&list, list_info, "Main Menu"))
          goto error;
    }
 
    if (mask & SL_FLAG_VIDEO_OPTIONS)
    {
-      if (!setting_append_list_video_options(&list, list_info, "Settings"))
+      if (!setting_append_list_video_options(&list, list_info, "Main Menu"))
          goto error;
    }
 
    if (mask & SL_FLAG_AUDIO_OPTIONS)
    {
-      if (!setting_append_list_audio_options(&list, list_info, "Settings"))
+      if (!setting_append_list_audio_options(&list, list_info, "Main Menu"))
          goto error;
    }
 
@@ -7144,110 +7213,110 @@ rarch_setting_t *menu_setting_new(unsigned mask)
       unsigned user;
       settings_t      *settings = config_get_ptr();
 
-      if (!setting_append_list_input_options(&list, list_info, "Settings"))
+      if (!setting_append_list_input_options(&list, list_info, "Main Menu"))
          goto error;
 
       for (user = 0; user < settings->input.max_users; user++)
-         setting_append_list_input_player_options(&list, list_info, "Settings", user);
+         setting_append_list_input_player_options(&list, list_info, "Main Menu", user);
    }
 
 
     
    if (mask & SL_FLAG_INPUT_HOTKEY_OPTIONS)
    {
-      if (!setting_append_list_input_hotkey_options(&list, list_info, "Settings"))
+      if (!setting_append_list_input_hotkey_options(&list, list_info, "Main Menu"))
          goto error;
    }
 
    if (mask & SL_FLAG_RECORDING_OPTIONS)
    {
-      if (!setting_append_list_recording_options(&list, list_info, "Settings"))
+      if (!setting_append_list_recording_options(&list, list_info, "Main Menu"))
          goto error;
    }
 
    if (mask & SL_FLAG_FRAME_THROTTLE_OPTIONS)
    {
-      if (!setting_append_list_frame_throttling_options(&list, list_info, "Settings"))
+      if (!setting_append_list_frame_throttling_options(&list, list_info, "Main Menu"))
          goto error;
    }
 
    if (mask & SL_FLAG_FONT_OPTIONS)
    {
-      if (!setting_append_list_font_options(&list, list_info, "Settings"))
+      if (!setting_append_list_font_options(&list, list_info, "Main Menu"))
          goto error;
    }
 
    if (mask & SL_FLAG_OVERLAY_OPTIONS)
    {
-      if (!setting_append_list_overlay_options(&list, list_info, "Settings"))
+      if (!setting_append_list_overlay_options(&list, list_info, "Main Menu"))
          goto error;
    }
    
    if (mask & SL_FLAG_OSK_OVERLAY_OPTIONS)
    {
-      if (!setting_append_list_osk_overlay_options(&list, list_info, "Settings"))
+      if (!setting_append_list_osk_overlay_options(&list, list_info, "Main Menu"))
          goto error;
    }
 
    if (mask & SL_FLAG_MENU_OPTIONS)
    {
-      if (!setting_append_list_menu_options(&list, list_info, "Settings"))
+      if (!setting_append_list_menu_options(&list, list_info, "Main Menu"))
          goto error;
    }
 
    if (mask & SL_FLAG_UI_OPTIONS)
    {
-      if (!setting_append_list_ui_options(&list, list_info, "Settings"))
+      if (!setting_append_list_ui_options(&list, list_info, "Main Menu"))
          goto error;
    }
 
 #if 0
    if (mask & SL_FLAG_PATCH_OPTIONS)
    {
-      if (!setting_append_list_patch_options(&list, list_info, "Settings"))
+      if (!setting_append_list_patch_options(&list, list_info, "Main Menu"))
          goto error;
    }
 #endif
 
    if (mask & SL_FLAG_PLAYLIST_OPTIONS)
    {
-      if (!setting_append_list_playlist_options(&list, list_info, "Settings"))
+      if (!setting_append_list_playlist_options(&list, list_info, "Main Menu"))
          goto error;
    }
 
    if (mask & SL_FLAG_CORE_UPDATER_OPTIONS)
    {
-      if (!setting_append_list_core_updater_options(&list, list_info, "Settings"))
+      if (!setting_append_list_core_updater_options(&list, list_info, "Main Menu"))
          goto error;
    }
 
    if (mask & SL_FLAG_NETPLAY_OPTIONS)
    {
-      if (!setting_append_list_netplay_options(&list, list_info, "Settings"))
+      if (!setting_append_list_netplay_options(&list, list_info, "Main Menu"))
          goto error;
    }
 
    if (mask & SL_FLAG_ARCHIVE_OPTIONS)
    {
-      if (!setting_append_list_archive_options(&list, list_info, "Settings"))
+      if (!setting_append_list_archive_options(&list, list_info, "Main Menu"))
          goto error;
    }
 
    if (mask & SL_FLAG_USER_OPTIONS)
    {
-      if (!setting_append_list_user_options(&list, list_info, "Settings"))
+      if (!setting_append_list_user_options(&list, list_info, "Main Menu"))
          goto error;
    }
 
    if (mask & SL_FLAG_DIRECTORY_OPTIONS)
    {
-      if (!setting_append_list_directory_options(&list, list_info, "Settings"))
+      if (!setting_append_list_directory_options(&list, list_info, "Main Menu"))
          goto error;
    }
 
    if (mask & SL_FLAG_PRIVACY_OPTIONS)
    {
-      if (!setting_append_list_privacy_options(&list, list_info, "Settings"))
+      if (!setting_append_list_privacy_options(&list, list_info, "Main Menu"))
          goto error;
    }