diff -Naur MPlayer-0.90.orig/libmenu/menu_pt.c MPlayer-0.90/libmenu/menu_pt.c
--- MPlayer-0.90.orig/libmenu/menu_pt.c	2003-06-17 22:49:54.000000000 +0200
+++ MPlayer-0.90/libmenu/menu_pt.c	2003-06-22 16:45:27.000000000 +0200
@@ -31,11 +31,13 @@
 struct menu_priv_s {
   menu_list_priv_t p;
   char* title;
+  int auto_close;
 };
 
 static struct menu_priv_s cfg_dflt = {
   MENU_LIST_PRIV_DFLT,
-  "Jump to"
+  "Jump to",
+  0
 };
 
 #define ST_OFF(m) M_ST_OFF(struct menu_priv_s,m)
@@ -43,27 +45,77 @@
 static m_option_t cfg_fields[] = {
   MENU_LIST_PRIV_FIELDS,
   { "title", ST_OFF(title),  CONF_TYPE_STRING, 0, 0, 0, NULL },
+  { "auto-close", ST_OFF(auto_close), CONF_TYPE_FLAG, 0, 0, 1, NULL },
   { NULL, NULL, NULL, 0,0,0,NULL }
 };
 
 #define mpriv (menu->priv)
 
+static int fill_menu(menu_t* menu) {
+  play_tree_t* i;
+  list_entry_t* e;
+
+  menu_list_init(menu);
+
+  mpriv->p.title = mpriv->title;
+
+  if(playtree_iter->tree->parent != playtree_iter->root) {
+    e = calloc(1,sizeof(list_entry_t));
+    e->p.txt = "..";
+    e->pt = playtree_iter->tree->parent;
+    menu_list_add_entry(menu,e);
+  }
+  
+  for(i = playtree_iter->tree ; i->prev != NULL ; i = i->prev)
+    /* NOP */;
+  for( ; i != NULL ; i = i->next ) {
+    e = calloc(1,sizeof(list_entry_t));
+    if(i->files) {
+#if defined(HAVE_VCD) || defined(HAVE_CDDA)
+      if (i->entry_type == PLAY_TREE_ENTRY_VCD
+          || !strncasecmp(i->files[0],"cdda://",7)) {
+        e->p.txt = (char *) malloc (10*sizeof(char));
+        sprintf(e->p.txt, "Track %s", mp_basename(i->files[0]));
+      }
+      else
+#endif
+#ifdef USE_DVDREAD
+      if (i->entry_type == PLAY_TREE_ENTRY_DVD) {
+        e->p.txt = (char *) malloc (10*sizeof(char));
+        sprintf(e->p.txt, "Title %s", mp_basename(i->files[0]));
+      }
+      else
+#endif
+        e->p.txt = mp_basename(i->files[0]);
+    }
+    else
+      e->p.txt = "Group ...";
+    e->pt = i;
+    menu_list_add_entry(menu,e);
+  }
+
+  return 1;
+}
+
 static void read_cmd(menu_t* menu,int cmd) {
   switch(cmd) {
   case MENU_CMD_OK: {
-    int d = 1;
+    int d = 0;
     char str[15];
     play_tree_t* i;
     mp_cmd_t* c;
 
 
-    if(playtree_iter->tree == mpriv->p.current->pt)
-      break;
-
-    if(playtree_iter->tree->parent && mpriv->p.current->pt == playtree_iter->tree->parent)
-      snprintf(str,15,"pt_up_step 1");
-    else {
-      for(i = playtree_iter->tree->next; i != NULL ; i = i->next) {
+    if(playtree_iter->tree->parent && mpriv->p.current->pt == playtree_iter->tree->parent){
+      playtree_iter->tree = playtree_iter->tree->parent;
+      menu_list_uninit(menu,NULL);
+      fill_menu(menu);
+    } else if(mpriv->p.current->pt->child) {
+      playtree_iter->tree = mpriv->p.current->pt->child;
+      menu_list_uninit(menu,NULL);
+      fill_menu(menu);
+    } else {
+      for(i = playtree_iter->tree; i != NULL ; i = i->next) {
 	if(i == mpriv->p.current->pt)
 	  break;
 	d++;
@@ -81,12 +133,16 @@
 	}
       }
       snprintf(str,15,"pt_step %d",d);
+
+      c = mp_input_parse_cmd(str);
+      if(c){
+        if(mpriv->auto_close)
+          mp_input_queue_cmd(mp_input_parse_cmd("menu hide"));
+        mp_input_queue_cmd(c);
+      }
+      else
+        printf("Failed to build command %s\n",str);
     }
-    c = mp_input_parse_cmd(str);
-    if(c)
-      mp_input_queue_cmd(c);
-    else
-      printf("Failed to build command %s\n",str);
   } break;
   default:
     menu_list_read_cmd(menu,cmd);
@@ -102,8 +158,6 @@
 }
 
 static int op(menu_t* menu, char* args) {
-  play_tree_t* i;
-  list_entry_t* e;
   args = NULL; // Warning kill
 
   menu->draw = menu_list_draw;
@@ -111,30 +165,7 @@
   menu->read_key = read_key;
   menu->close = close;
 
-  menu_list_init(menu);
-
-  mpriv->p.title = mpriv->title;
-
-  if(playtree_iter->tree->parent != playtree_iter->root) {
-    e = calloc(1,sizeof(list_entry_t));
-    e->p.txt = "..";
-    e->pt = playtree_iter->tree->parent;
-    menu_list_add_entry(menu,e);
-  }
-  
-  for(i = playtree_iter->tree ; i->prev != NULL ; i = i->prev)
-    /* NOP */;
-  for( ; i != NULL ; i = i->next ) {
-    e = calloc(1,sizeof(list_entry_t));
-    if(i->files)
-      e->p.txt = mp_basename(i->files[0]);
-    else
-      e->p.txt = "Group ...";
-    e->pt = i;
-    menu_list_add_entry(menu,e);
-  }
-
-  return 1;
+  return fill_menu(menu);
 }
 
 const menu_info_t menu_info_pt = {
diff -Naur MPlayer-0.90.orig/mplayer.c MPlayer-0.90/mplayer.c
--- MPlayer-0.90.orig/mplayer.c	2003-06-17 22:49:54.000000000 +0200
+++ MPlayer-0.90/mplayer.c	2003-06-21 19:11:36.000000000 +0200
@@ -2340,7 +2340,7 @@
       grab_frames=2;
     } break;
     case MP_CMD_PLAY_TREE_STEP : {
-      int n = cmd->args[0].v.i == 0 ? 1 : cmd->args[0].v.i;
+      int n = cmd->args[0].v.i;
       int force = cmd->args[1].v.i;
 
 #ifdef HAVE_NEW_GUI
diff -Naur MPlayer-0.90.orig/playtree.c MPlayer-0.90/playtree.c
--- MPlayer-0.90.orig/playtree.c	2003-06-17 22:49:54.000000000 +0200
+++ MPlayer-0.90/playtree.c	2003-06-21 17:46:07.000000000 +0200
@@ -249,7 +249,6 @@
 
 #ifdef MP_DEBUG
   assert(pt != NULL);
-  assert(pt->child == NULL);
   assert(file != NULL);
 #endif
 
@@ -659,9 +658,6 @@
 #endif
 
   if(pt->entry_type != PLAY_TREE_ENTRY_NODE) {
-#ifdef MP_DEBUG
-    assert(pt->child == NULL);
-#endif
     return 1;
   }
   else if (pt->child != NULL) {
@@ -720,7 +716,6 @@
 play_tree_iter_down_step(play_tree_iter_t* iter, int d,int with_nodes) {
 
 #ifdef MP_DEBUG
-  assert(iter->tree->files == NULL);
   assert(iter->tree->child != NULL);
   assert(iter->tree->child->parent == iter->tree);
   //printf("PT : Go DOWN\n");
diff -Naur MPlayer-0.90.orig/playtreeparser.c MPlayer-0.90/playtreeparser.c
--- MPlayer-0.90.orig/playtreeparser.c	2003-06-17 22:49:54.000000000 +0200
+++ MPlayer-0.90/playtreeparser.c	2003-06-21 17:43:14.000000000 +0200
@@ -538,6 +538,7 @@
   free_stream(stream);
 
   play_tree_add_bpf(ret, file);
+  play_tree_add_file(ret,file);
 
   return ret;
 
