Index: libs/libmythtv/DVDRingBuffer.h
===================================================================
--- libs/libmythtv/DVDRingBuffer.h	(revision 9056)
+++ libs/libmythtv/DVDRingBuffer.h	(working copy)
@@ -118,7 +118,12 @@
     bool           buttonSelected;
     bool           buttonExists;
     long long      menuspupts;
-
+    int            cellid;
+    int            lastcellid;
+    int            vobid;
+    int            lastvobid;
+    bool           cellRepeated;
+    
     NuppelVideoPlayer *parent;
 
     bool DrawMenuButton(uint8_t *spu_pkt, int buf_size);
@@ -126,6 +131,7 @@
     void ClearMenuSPUParameters(void);
     bool MenuButtonChanged(void);
     uint ConvertLangCode(uint16_t code); // converts 2char key to 3char key
+    void SelectDefaultButton(void);
     
     /* copied from dvdsub.c from ffmpeg */
     int get_nibble(const uint8_t *buf, int nibble_offset);
Index: libs/libmythtv/DVDRingBuffer.cpp
===================================================================
--- libs/libmythtv/DVDRingBuffer.cpp	(revision 9056)
+++ libs/libmythtv/DVDRingBuffer.cpp	(working copy)
@@ -34,7 +34,9 @@
       skipstillorwait(true), spuStreamLetterbox(false),
       cellstartPos(0), buttonSelected(false), 
       buttonExists(false), menuspupts(0),
-      parent(0)
+      cellid(0), lastcellid(0),
+      vobid(0), lastvobid(0), 
+      cellRepeated(false), parent(0)
 {
     dvdMenuButton = (AVSubtitleRect*)av_mallocz(sizeof(AVSubtitleRect));
 }
@@ -222,14 +224,13 @@
                 dvdnav_get_position(dvdnav, &pos, &length);
                 titleLength = length *DVD_BLOCK_SIZE;
                 cellstartPos = GetReadPosition();
-                buttonSelected = false; 
+                buttonSelected = false;
+                lastvobid = vobid;
+                lastcellid = cellid;
+                vobid = 0;
+                cellid = 0;
+                cellRepeated = false;
 
-                if (parent && parent->GetOSD())
-                {
-                    parent->GetOSD()->HideSet("subtitles");
-                    parent->GetOSD()->ClearAll("subtitles");
-                }
-
                 if (blockBuf != dvdBlockWriteBuf)
                 {
                     dvdnav_free_cache_block(dvdnav, blockBuf);
@@ -284,19 +285,27 @@
             case DVDNAV_NAV_PACKET:
             {
                 lastNav = (dvdnav_t *)blockBuf;
-                if (IsInMenu() && NumMenuButtons() > 0 && 
-                        !buttonSelected)
+                if (vobid == 0 && cellid == 0)
                 {
-                    pci_t *pci = dvdnav_get_current_nav_pci(dvdnav);
-
-                    uint8_t button = pci->hli.hl_gi.fosl_btnn;
-                    if (button > 0)
-                        dvdnav_button_select(dvdnav,pci,button);
-                    else
-                        dvdnav_button_select(dvdnav,pci,1);
-
-                    buttonSelected = true;
-                    spuchanged = false;
+                    dsi_t *dsi = dvdnav_get_current_nav_dsi(dvdnav);
+                    vobid  = dsi->dsi_gi.vobu_vob_idn;
+                    cellid = dsi->dsi_gi.vobu_c_idn;
+                    if ((lastvobid == vobid) && (lastcellid == cellid) 
+                            && IsInMenu())
+                        cellRepeated = true;
+                    if (parent && parent->GetOSD() && !cellRepeated)
+                    {
+                        parent->GetOSD()->HideSet("subtitles");
+                        parent->GetOSD()->ClearAll("subtitles");
+                    }
+                    
+                    if (NumMenuButtons() > 0 && !buttonSelected 
+                                && !cellRepeated)
+                    {
+                        SelectDefaultButton();
+                        buttonSelected = true;
+                        spuchanged = false;
+                    }
                 }
                 if (blockBuf != dvdBlockWriteBuf)
                 {
@@ -810,6 +819,22 @@
     return 0;
 }
 
+void DVDRingBufferPriv::SelectDefaultButton(void)
+{
+    pci_t *pci = dvdnav_get_current_nav_pci(dvdnav);
+    int button = pci->hli.hl_gi.fosl_btnn;
+    if (button > 0)
+    {
+        dvdnav_button_select(dvdnav,pci,button);
+        return;
+    }
+    dvdnav_get_current_highlight(dvdnav,&button);
+    if (button > 0 && button < NumMenuButtons())
+        dvdnav_button_select(dvdnav,pci,button);
+    else
+        dvdnav_button_select(dvdnav,pci,1);    
+}
+
 void DVDRingBufferPriv::guess_palette(uint32_t *rgba_palette,uint8_t *palette,
                                         uint8_t *alpha)
 {
