diff -urN xmms/main.c xmms.new/main.c
--- xmms/main.c	2005-04-05 14:04:22.000000000 +0300
+++ xmms.new/main.c	2005-04-05 14:05:44.000000000 +0300
@@ -149,7 +149,7 @@
 
 enum
 {
-	MAINWIN_SONGNAME_FILEINFO, MAINWIN_SONGNAME_JTF, MAINWIN_SONGNAME_JTT, MAINWIN_SONGNAME_SCROLL
+	MAINWIN_SONGNAME_FILEINFO, MAINWIN_SONGNAME_JTF, MAINWIN_SONGNAME_JTT, MAINWIN_SONGNAME_JTD, MAINWIN_SONGNAME_SCROLL
 };
 
 GtkItemFactoryEntry mainwin_songname_menu_entries[] =
@@ -157,6 +157,7 @@
 	{N_("/File Info"), NULL, mainwin_songname_menu_callback, MAINWIN_SONGNAME_FILEINFO, "<Item>"},
 	{N_("/Jump To File"), "J", mainwin_songname_menu_callback, MAINWIN_SONGNAME_JTF, "<Item>"},
 	{N_("/Jump To Time"), "<control>J", mainwin_songname_menu_callback, MAINWIN_SONGNAME_JTT, "<Item>"},
+	{N_("/Jump To Description"), "F", mainwin_songname_menu_callback, MAINWIN_SONGNAME_JTD, "<Item>"},
 	{N_("/Autoscroll Song Name"), NULL, mainwin_songname_menu_callback, MAINWIN_SONGNAME_SCROLL, "<ToggleItem>"},
 };
 
@@ -256,7 +257,7 @@
 	MAINWIN_GENERAL_PAUSE, MAINWIN_GENERAL_STOP, MAINWIN_GENERAL_NEXT,
 	MAINWIN_GENERAL_STOPFADE, MAINWIN_GENERAL_BACK5SEC,
 	MAINWIN_GENERAL_FWD5SEC, MAINWIN_GENERAL_START, MAINWIN_GENERAL_BACK10,
-	MAINWIN_GENERAL_FWD10, MAINWIN_GENERAL_JTT, MAINWIN_GENERAL_JTF,
+	MAINWIN_GENERAL_FWD10, MAINWIN_GENERAL_JTT, MAINWIN_GENERAL_JTF, MAINWIN_GENERAL_JTD,
 	MAINWIN_GENERAL_CQUEUE, MAINWIN_GENERAL_EXIT
 };
 
@@ -1638,6 +1639,114 @@
 	return 1;
 }
 
+static void mainwin_jump_to_desc_edit_cb(GtkWidget * widget, gpointer userdata)
+{ 
+  char* key;
+  GtkCList* clist;
+  GList *playlist;
+  char *desc_buf;
+  int songnr = 0;
+    
+  char *words[20];
+  int nw = 0, i;
+  char* ptr;
+    
+  PL_LOCK();
+  playlist = get_playlist();
+  key = g_strdup(gtk_entry_get_text(GTK_ENTRY(widget)));
+  clist = GTK_CLIST(userdata);
+
+  /* lowercase the key string */
+  g_strdown(key);
+  
+  /* Chop the key string into ' '-separeted key words */
+  for (ptr = key; nw < 20; ptr = strchr(ptr, ' '))
+  {
+          if (!ptr)
+      break;
+    else if (*ptr == ' ')
+    {
+      while (*ptr == ' ')
+      {
+              *ptr = '\0';
+        ptr++;
+      }
+      words[nw++] = ptr;      
+    }
+    else
+    {
+      words[nw++] = ptr;
+    }
+  }
+
+  gtk_clist_freeze(clist);
+  gtk_clist_clear(clist);
+
+  while (playlist)
+  {
+    int match = 0;
+    char *title, *filename;
+
+    title = ((PlaylistEntry *) playlist->data)->title;
+    filename = ((PlaylistEntry *) playlist->data)->filename;
+
+    if (title)
+      desc_buf = title;
+    else if (strchr(filename, '/'))
+      desc_buf = strrchr(filename, '/') + 1;
+    else
+                        desc_buf = filename;
+
+    if (nw == 0 ||                           /* zero char key */
+        (nw == 1 && words[0][0] == '\0') ||  /* zero char key */
+        (nw == 1 && strlen(words[0]) == 1 && /* one char key */
+         ((title && strchr(title, words[0][0])) ||
+          strchr(filename, words[0][0]))))
+      match = 1;
+    else if (nw == 1 && strlen(words[0]) == 1)
+      match = 0;
+    else
+                {
+      char song[256];
+    
+      /* Cook up a lowercased string that contains
+                           the filename and the (possible) title */
+      for (ptr = desc_buf, i = 0; ptr && *ptr && i < 254; i++, ptr++)
+            song[i] = tolower(*ptr);
+      song[i] = '\0';
+
+      /* Compare the key words to the string - if
+                           all the words match, add to the clist */
+      match = mainwin_jump_to_file_match(song, words, nw);
+    }
+
+    if (match)
+    {
+      int row, *data_buf;
+      row = gtk_clist_append(clist, &desc_buf);
+      data_buf = g_malloc(sizeof (int));
+      *data_buf = songnr;
+      gtk_clist_set_row_data_full(clist, row, data_buf, g_free);
+    }
+
+    songnr++;
+    playlist = playlist->next;
+  }
+
+  PL_UNLOCK();
+
+  if (cfg.sort_jump_to_file)
+  {
+    gtk_clist_set_sort_column(clist, 0);
+    gtk_clist_set_sort_type(clist, GTK_SORT_ASCENDING);
+    gtk_clist_sort(clist);
+  }
+  gtk_clist_select_row(clist, 0, 0);
+  gtk_clist_thaw(clist);
+
+  g_free(key);
+}
+
 static void mainwin_jump_to_file_edit_cb(GtkWidget * widget, gpointer userdata)
 {
 	char* key;
@@ -1767,7 +1876,7 @@
 	g_free(key);
 }
 
-static void mainwin_jump_to_file(void)
+static void mainwin_jump_to_file(int desc)
 {
 	GtkWidget *vbox, *scrollwin, *clist, *sep, *bbox, *jump, *queue, *cancel, *edit, *search_label, *hbox;
 	GList *playlist;
@@ -1813,7 +1922,7 @@
  
  	edit = gtk_entry_new();
  	gtk_entry_set_editable(GTK_ENTRY(edit), TRUE);
- 	gtk_signal_connect(GTK_OBJECT(edit), "changed", GTK_SIGNAL_FUNC(mainwin_jump_to_file_edit_cb), clist);
+	gtk_signal_connect(GTK_OBJECT(edit), "changed", GTK_SIGNAL_FUNC(desc?mainwin_jump_to_desc_edit_cb:mainwin_jump_to_file_edit_cb), clist);
  	gtk_signal_connect(GTK_OBJECT(edit), "key_press_event", GTK_SIGNAL_FUNC(mainwin_jump_to_file_entry_keypress_cb), clist);
  	gtk_box_pack_start(GTK_BOX(hbox), edit, TRUE, TRUE, 3);
  	gtk_widget_show(edit);
@@ -2334,8 +2443,11 @@
 		case MAINWIN_SONGNAME_FILEINFO:
 			playlist_fileinfo_current();
 			break;
+		case MAINWIN_SONGNAME_JTD:
+			mainwin_jump_to_file(1);
+			break;
 		case MAINWIN_SONGNAME_JTF:
-			mainwin_jump_to_file();
+			mainwin_jump_to_file(0);
 			break;
 		case MAINWIN_SONGNAME_JTT:
 			mainwin_jump_to_time();
@@ -2550,8 +2662,11 @@
 		mainwin_jump_to_time();
 		break;
 	case MAINWIN_GENERAL_JTF:
-		mainwin_jump_to_file();
+		mainwin_jump_to_file(0);
 		break;
+  case MAINWIN_GENERAL_JTD:
+    mainwin_jump_to_file(1);
+    break;
 	case MAINWIN_GENERAL_CQUEUE:
 		playlist_clear_queue();
 		break;
