Index: apps/plugins/viewers.config
===================================================================
--- apps/plugins/viewers.config	(revision 27935)
+++ apps/plugins/viewers.config	(working copy)
@@ -22,6 +22,13 @@
 rvf,viewers/video,4
 mp3,viewers/vbrfix,5
 m3u,viewers/search,-
+m3u,viewers/viewer,1
+m3u,apps/text_editor,2
+m3u,viewers/sort,-
+m3u8,viewers/search,-
+m3u8,viewers/viewer,1
+m3u8,apps/text_editor,2
+m3u8,viewers/sort,-
 txt,viewers/sort,-
 lrc,apps/lrcplayer,1
 lrc8,apps/lrcplayer,1
@@ -35,9 +42,18 @@
 pd,viewers/pdbox,2
 rsp,viewers/searchengine,8
 sok,games/sokoban,1
+sok,viewers/viewer,1
+sok,apps/text_editor,2
+sok,viewers/sort,-
 pgn,games/chessbox,1
+pgn,viewers/viewer,1
+pgn,apps/text_editor,2
+pgn,viewers/sort,-
 sgf,games/goban,1
 ss,games/sudoku,1
+ss,viewers/viewer,1
+ss,apps/text_editor,2
+ss,viewers/sort,-
 wav,viewers/wav2wv,-
 wav,viewers/mp3_encoder,-
 wav,viewers/wavplay,9
@@ -53,13 +69,30 @@
 sna,viewers/zxbox,12
 tzx,viewers/zxbox,12
 z80,viewers/zxbox,12
+cfg,viewers/viewer,1
+cfg,viewers/theme_remove,-
+cfg,apps/text_editor,2
+wps,viewers/viewer,1
+wps,apps/text_editor,2
+rwps,viewers/viewer,1
+rwps,apps/text_editor,2
+fmr,viewers/viewer,1
+fmr,apps/text_editor,2
+kbd,viewers/viewer,1
+kbd,apps/text_editor,2
+bmark,viewers/viewer,1
+bmark,apps/text_editor,2
+cue,viewers/viewer,1
+cue,apps/text_editor,2
 ppm,viewers/ppmviewer,2
-cfg,viewers/theme_remove,-
 *,viewers/properties,-
 colours,apps/text_editor,11
 ssg,games/superdom,-
 cells,games/rocklife,-
 link,viewers/shortcuts_view,-
+link,viewers/viewer,1
+link,apps/text_editor,2
+link,viewers/sort,-
 *,viewers/shortcuts_append,-
 *,apps/md5sum,-
 lua,viewers/lua,-
Index: apps/filetypes.c
===================================================================
--- apps/filetypes.c	(revision 27935)
+++ apps/filetypes.c	(working copy)
@@ -307,6 +307,15 @@
     *s = '\0';
 }
 
+static char *get_extension(const char* file)
+{
+    char *extension = strrchr(file, '.');
+    if (!extension)
+        return NULL;
+    extension++;
+    return (char *)extension;
+}
+
 static void read_builtin_types(void)
 {
     int count = sizeof(inbuilt_filetypes)/sizeof(*inbuilt_filetypes), i;
@@ -377,11 +386,10 @@
 
 int filetype_get_attr(const char* file)
 {
-    char *extension = strrchr(file, '.');
     int i;
+    char *extension = get_extension(file);
     if (!extension)
         return 0;
-    extension++;
     for (i=0; i<filetype_count; i++)
     {
         if (filetypes[i].extension && 
@@ -408,14 +416,12 @@
 #ifdef HAVE_LCD_COLOR
 int filetype_get_color(const char * name, int attr)
 {
-    char *extension;
     int i;
     if ((attr & ATTR_DIRECTORY)==ATTR_DIRECTORY)
         return custom_colors[0];
-    extension = strrchr(name, '.');
+    char *extension = get_extension(name);
     if (!extension)
         return custom_colors[MAX_FILETYPES];
-    extension++;
     
     for (i=1; i<filetype_count; i++)
     {
@@ -503,10 +509,16 @@
     int items[MAX_FILETYPES];
     struct simplelist_info info;
     struct cb_data data = { items, current_file };
+    char *ext = get_extension(current_file);
     for (i=0; i<filetype_count && count < MAX_FILETYPES; i++)
     {
         if (filetypes[i].plugin)
         {
+            /* do not show unrelated plugins, unless 'show files' is 'all' */
+            if (global_settings.dirfilter != 0)
+                if ( strcmp(filetypes[i].extension, "*") &&
+                     strcasecmp(filetypes[i].extension, ext) )
+                    continue;
             int j;
             for (j=0;j<count;j++) /* check if the plugin is in the list yet */
             {
