Index: mplayer.c
===================================================================
--- mplayer.c	(revision 36962)
+++ mplayer.c	(working copy)
@@ -1961,14 +1961,32 @@
     ctx->delay   = -audio_delay;
     audio_delay = 0.0f;
     mpctx->sub_counts[SUB_SOURCE_DEMUX] = mp_dvdnav_number_of_subs(mpctx->stream);
+
+    int is_menu = mpctx->sub_counts[SUB_SOURCE_DEMUX] == 0;
+    int saved_dvdsub_id = dvdsub_id;    // save current dvdsub_id
+
+    // menu ?
+    if (is_menu)
+        dvdsub_id = 0;  // use id 0 unconditionally if menu
+    else
     if (dvdsub_lang && dvdsub_id == dvdsub_lang_id) {
         dvdsub_lang_id = mp_dvdnav_sid_from_lang(ctx->stream, dvdsub_lang);
         if (dvdsub_lang_id != dvdsub_id) {
             dvdsub_id = dvdsub_lang_id;
-            select_subtitle(ctx);
         }
     }

+    if (dvdsub_id >= -1)
+        select_subtitle(ctx);
+    else if (dvdsub_id == -2) {
+        int id = dvdsub_id;
+        mp_property_do("sub_demux", M_PROPERTY_SET, &id, mpctx);
+    }
+
+    // menu ?
+    if (is_menu)
+        dvdsub_id = saved_dvdsub_id;    // restore to the saved dvdsub_id
+
     // clear all EOF related flags
     ctx->d_video->eof = ctx->d_audio->eof = ctx->stream->eof = 0;
 }
@@ -3365,6 +3383,16 @@
 //============ Open DEMUXERS --- DETECT file type =======================
     current_module = "demux_open";

+#ifdef CONFIG_DVDNAV
+    // save dvdsub_id for dvdnav menu
+    int saved_dvdsub_id = dvdsub_id;
+
+    // set dvdsub_id to 0 to display an correct image in a dvdnav menu
+    // regardless of -sid and -nosub
+    if (mpctx->stream->type ==  STREAMTYPE_DVDNAV)
+        dvdsub_id = 0;
+#endif
+
     mpctx->demuxer = demux_open(mpctx->stream, mpctx->file_format, audio_id, video_id, dvdsub_id, filename);

     // HACK to get MOV Reference Files working
@@ -3607,6 +3635,13 @@
         }
     }

+#ifdef CONFIG_DVDNAV
+    // restore dvdsub_id for dvdnav to play
+    if (mpctx->stream->type == STREAMTYPE_DVDNAV) {
+        dvdsub_id = saved_dvdsub_id;
+    }
+#endif
+
     print_file_properties(mpctx, filename);

     // Adjust EDL positions with start_pts
Index: command.c
===================================================================
--- command.c	(revision 36962)
+++ command.c	(working copy)
@@ -1516,14 +1516,29 @@
             *(int *) arg = -1;
         else if (*(int *) arg >= global_sub_size)
             *(int *) arg = global_sub_size - 1;
+        // already done ?
+        if (mpctx->global_sub_pos == *(int *) arg)
+            return M_PROPERTY_OK;
         mpctx->global_sub_pos = *(int *) arg;
         break;
     case M_PROPERTY_STEP_UP:
+#ifdef CONFIG_DVDNAV
+        // disable subtitle cycling in a dvdnav menu
+        if (IS_STREAMTYPE(DVDNAV)
+            && mp_dvdnav_number_of_subs(mpctx->stream) == 0)
+            return M_PROPERTY_UNAVAILABLE;
+#endif
         mpctx->global_sub_pos += 2;
         mpctx->global_sub_pos =
             (mpctx->global_sub_pos % (global_sub_size + 1)) - 1;
         break;
     case M_PROPERTY_STEP_DOWN:
+#ifdef CONFIG_DVDNAV
+        // disable subtitle cycling in a dvdnav menu
+        if (IS_STREAMTYPE(DVDNAV)
+            && mp_dvdnav_number_of_subs(mpctx->stream) == 0)
+            return M_PROPERTY_UNAVAILABLE;
+#endif
         mpctx->global_sub_pos += global_sub_size + 1;
         mpctx->global_sub_pos =
             (mpctx->global_sub_pos % (global_sub_size + 1)) - 1;
Index: libmpdemux/demux_mpg.c
===================================================================
--- libmpdemux/demux_mpg.c	(revision 36962)
+++ libmpdemux/demux_mpg.c	(working copy)
@@ -486,7 +486,7 @@

         if(demux->sub->id > -1)
           demux->sub->id &= 0x1F;
-        if(!dvdsub_lang && demux->sub->id == -1)
+        if(demux->sub->id == -1)
           demux->sub->id = aid;
         if(demux->sub->id==aid){
             ds=demux->sub;