diff --git a/docs/retroarch.1 b/docs/retroarch.1
index ede5337d1c..3fc3c369b9 100644
--- a/docs/retroarch.1
+++ b/docs/retroarch.1
@@ -123,11 +123,6 @@ If a ROM is skipped, use a blank ("") command line argument.
 ROMs must be loaded in an order which depends on the particular subsystem used.
 See verbose log output to learn how a particular subsystem wants ROMs to be loaded.
 
-.TP
-\fB--mouse PORT, -m PORT\fR
-Connects a mouse into port number PORT. Possible values for PORT are 1 to 8.
-If set explicitly here, overrides config file for that port.
-
 .TP
 \fB--nodevice PORT, -N PORT\fR
 Disconnects an input device from port number PORT. Possible values for PORT are 1 to 8. This may be needed for some odd games to run properly.
diff --git a/frontend/menu/menu_settings.c b/frontend/menu/menu_settings.c
index 05fd2409bb..bdea6861c3 100644
--- a/frontend/menu/menu_settings.c
+++ b/frontend/menu/menu_settings.c
@@ -929,19 +929,30 @@ int menu_set_settings(void *data, unsigned setting, unsigned action)
          break;
       case RGUI_SETTINGS_BIND_DEVICE_TYPE:
          {
-            static const unsigned device_types[] = {
-               RETRO_DEVICE_NONE,
-               RETRO_DEVICE_JOYPAD,
-               RETRO_DEVICE_ANALOG,
-               RETRO_DEVICE_MOUSE,
-            };
-
             unsigned current_device, current_index, i;
+            unsigned types = 0;
+            unsigned devices[128];
+
+            devices[types++] = RETRO_DEVICE_NONE;
+            devices[types++] = RETRO_DEVICE_JOYPAD;
+            devices[types++] = RETRO_DEVICE_ANALOG;
+
+            const struct retro_controller_info *desc = port < g_extern.system.num_ports ? &g_extern.system.ports[port] : NULL;
+            if (desc)
+            {
+               for (i = 0; i < desc->num_types; i++)
+               {
+                  unsigned id = desc->types[i].id;
+                  if (types < ARRAY_SIZE(devices) && id != RETRO_DEVICE_NONE && id != RETRO_DEVICE_JOYPAD && id != RETRO_DEVICE_ANALOG)
+                     devices[types++] = id;
+               }
+            }
+
             current_device = g_settings.input.libretro_device[port];
             current_index = 0;
-            for (i = 0; i < ARRAY_SIZE(device_types); i++)
+            for (i = 0; i < types; i++)
             {
-               if (current_device == device_types[i])
+               if (current_device == devices[i])
                {
                   current_index = i;
                   break;
@@ -956,12 +967,12 @@ int menu_set_settings(void *data, unsigned setting, unsigned action)
                   break;
 
                case RGUI_ACTION_LEFT:
-                  current_device = device_types[(current_index + ARRAY_SIZE(device_types) - 1) % ARRAY_SIZE(device_types)];
+                  current_device = devices[(current_index + types - 1) % types];
                   break;
 
                case RGUI_ACTION_RIGHT:
                case RGUI_ACTION_OK:
-                  current_device = device_types[(current_index + 1) % ARRAY_SIZE(device_types)];
+                  current_device = devices[(current_index + 1) % types];
                   break;
 
                default:
@@ -2216,7 +2227,6 @@ void menu_set_settings_label(char *type_str, size_t type_str_size, unsigned *w,
                case RETRO_DEVICE_NONE: name = "None"; break;
                case RETRO_DEVICE_JOYPAD: name = "Joypad"; break;
                case RETRO_DEVICE_ANALOG: name = "Joypad w/ Analog"; break;
-               case RETRO_DEVICE_MOUSE: name = "Mouse"; break;
                default: name = "Unknown"; break;
             }
          }
diff --git a/libretro-test/libretro-test.c b/libretro-test/libretro-test.c
index 905c52f6f0..0c69383afd 100644
--- a/libretro-test/libretro-test.c
+++ b/libretro-test/libretro-test.c
@@ -133,10 +133,11 @@ void retro_set_environment(retro_environment_t cb)
    static const struct retro_controller_description controllers[] = {
       { "Dummy Controller #1", RETRO_DEVICE_SUBCLASS(RETRO_DEVICE_JOYPAD, 0) },
       { "Dummy Controller #2", RETRO_DEVICE_SUBCLASS(RETRO_DEVICE_JOYPAD, 1) },
+      { "Augmented Joypad", RETRO_DEVICE_JOYPAD }, // Test overriding generic description in UI.
    };
 
    static const struct retro_controller_info ports[] = {
-      { controllers, 2 },
+      { controllers, 3 },
       { NULL, 0 },
    };
 
diff --git a/retroarch.c b/retroarch.c
index ca0c54817a..3f2ddc901e 100644
--- a/retroarch.c
+++ b/retroarch.c
@@ -783,7 +783,6 @@ static void print_help(void)
 
    printf("\t-N/--nodevice: Disconnects controller device connected to port (1 to %d).\n", MAX_PLAYERS);
    printf("\t-A/--dualanalog: Connect a DualAnalog controller to port (1 to %d).\n", MAX_PLAYERS);
-   printf("\t-m/--mouse: Connect a mouse into controller port (1 to %d).\n", MAX_PLAYERS);
    printf("\t-d/--device: Connect a generic device into port of the device (1 to %d).\n", MAX_PLAYERS);
    puts("\t\tFormat is port:ID, where ID is an unsigned number corresponding to the particular device.\n");
 
@@ -929,7 +928,6 @@ static void parse_input(int argc, char *argv[])
       { "verbose", 0, NULL, 'v' },
       { "config", 1, NULL, 'c' },
       { "appendconfig", 1, &val, 'C' },
-      { "mouse", 1, NULL, 'm' },
       { "nodevice", 1, NULL, 'N' },
       { "dualanalog", 1, NULL, 'A' },
       { "device", 1, NULL, 'd' },
@@ -984,7 +982,7 @@ static void parse_input(int argc, char *argv[])
 #define BSV_MOVIE_ARG
 #endif
 
-   const char *optstring = "hs:fvS:m:A:c:U:DN:d:" BSV_MOVIE_ARG NETPLAY_ARG DYNAMIC_ARG FFMPEG_RECORD_ARG;
+   const char *optstring = "hs:fvS:A:c:U:DN:d:" BSV_MOVIE_ARG NETPLAY_ARG DYNAMIC_ARG FFMPEG_RECORD_ARG;
 
    for (;;)
    {
@@ -1053,18 +1051,6 @@ static void parse_input(int argc, char *argv[])
             g_extern.verbose = true;
             break;
 
-         case 'm':
-            port = strtol(optarg, NULL, 0);
-            if (port < 1 || port > MAX_PLAYERS)
-            {
-               RARCH_ERR("Connect mouse to a valid port.\n");
-               print_help();
-               rarch_fail(1, "parse_input()");
-            }
-            g_settings.input.libretro_device[port - 1] = RETRO_DEVICE_MOUSE;
-            g_extern.has_set_libretro_device[port - 1] = true;
-            break;
-
          case 'N':
             port = strtol(optarg, NULL, 0);
             if (port < 1 || port > MAX_PLAYERS)
@@ -1277,7 +1263,6 @@ static void init_controllers(void)
       {
          switch (device)
          {
-            case RETRO_DEVICE_MOUSE: ident = "mouse"; break;
             case RETRO_DEVICE_ANALOG: ident = "analog"; break;
             default: ident = "Unknown"; break;
          }