Index: NuppelVideoPlayer.cpp
===================================================================
--- NuppelVideoPlayer.cpp	(revision 16832)
+++ NuppelVideoPlayer.cpp	(working copy)
@@ -806,6 +806,9 @@
     }
 
     InitFilters();
+
+    if (ringBuffer->InDVDMenuOrStillFrame())
+        ringBuffer->DVD()->SetRunSeekCellStart(true);
 }
 
 QString NuppelVideoPlayer::ReinitAudio(void)
Index: avformatdecoder.cpp
===================================================================
--- avformatdecoder.cpp	(revision 16832)
+++ avformatdecoder.cpp	(working copy)
@@ -413,8 +413,7 @@
       lastdvdtitle(-1), lastcellstart(0),
       decodeStillFrame(false),
       dvd_xvmc_enabled(false), dvd_video_codec_changed(false),
-      dvdTitleChanged(false), mpeg_seq_end_seen(false),
-      lastDVDStillFrame(NULL)
+      dvdTitleChanged(false), mpeg_seq_end_seen(false)
 {
     bzero(&params, sizeof(AVFormatParameters));
     bzero(audioSamples, AVCODEC_MAX_AUDIO_FRAME_SIZE * sizeof(short int));
@@ -446,9 +445,6 @@
         delete pkt;
     }
 
-    if (lastDVDStillFrame)
-        av_free_packet(lastDVDStillFrame);
-
     CloseContext();
     delete ccd608;
     delete ccd708;
@@ -1623,9 +1619,9 @@
 
                 InitVideoCodec(ic->streams[i], enc,
                                selectedVideoIndex == (int) i);
-
+                
                 ScanATSCCaptionStreams(i);
-
+                
                 VERBOSE(VB_PLAYBACK, LOC + 
                         QString("Using %1 for video decoding")
                         .arg(GetCodecDecoderName()));
@@ -3041,36 +3039,17 @@
             else
             {
                 storevideoframes = false;
-                int numVidFrames = 0;
-                if (GetNVP() && GetNVP()->getVideoOutput())
-                    numVidFrames = GetNVP()->getVideoOutput()->ValidVideoFrames();
+                
                 bool inDVDStill = ringBuffer->DVD()->InStillFrame();
 
                 if (decodeStillFrame && !inDVDStill)
-                {
                     decodeStillFrame = false;
-                }
+                
+                if (inDVDStill)
+                    ringBuffer->DVD()->RunSeekCellStart();
 
-                if (numVidFrames == 0 && inDVDStill)
-                {
-                    if (lastDVDStillFrame)
-                    {
-                        VERBOSE(VB_PLAYBACK, LOC + "DVD: in still frame but "
-                                "there is no picture. Using last stored still "
-                                "frame");
-                        storedPackets.append(lastDVDStillFrame);
-                        ringBuffer->DVD()->SeekCellStart();
-                        lastDVDStillFrame = NULL;
-                        decodeStillFrame = true;
-                    }
-                    else
-                        ringBuffer->DVD()->SeekCellStart();
-                }
-                else    
-                {   
-                    if (storedPackets.count() < 2 && !decodeStillFrame)
-                        storevideoframes = true;
-                }
+                if (storedPackets.count() < 2 && !decodeStillFrame)
+                    storevideoframes = true;
             }          
             if (GetNVP()->AtNormalSpeed() &&
                 ((lastcellstart != cellstart) || (lastdvdtitle != dvdtitle)))
@@ -3757,9 +3736,6 @@
 
                     picframe->frameNumber = framesPlayed;
                     GetNVP()->ReleaseNextVideoFrame(picframe, temppts);
-                    /* HACK remove from root of still frame display issue is fixed */
-                    if (decodeStillFrame)
-                        GetNVP()->ReleaseNextVideoFrame(picframe, temppts);
                     if (d->HasMPEG2Dec() && mpa_pic.data[3])
                         context->release_buffer(context, &mpa_pic);
 
@@ -3767,15 +3743,8 @@
                     gotvideo = 1;
                     framesPlayed++;
 
-                    if (ringBuffer->InDVDMenuOrStillFrame() && decodeStillFrame)
-                    {
-                        if (lastDVDStillFrame)
-                            av_free_packet(lastDVDStillFrame);
-                        av_dup_packet(pkt);
-                        lastDVDStillFrame = pkt;
-                        pkt = NULL;
+                    if (decodeStillFrame)
                         decodeStillFrame = false;
-                    }
 
                     lastvpts = temppts;
                     break;
Index: DVDRingBuffer.cpp
===================================================================
--- DVDRingBuffer.cpp	(revision 16832)
+++ DVDRingBuffer.cpp	(working copy)
@@ -44,7 +44,8 @@
       buttonExists(false), cellid(0), 
       lastcellid(0), vobid(0), 
       lastvobid(0), cellRepeated(false), 
-      buttonstreamid(0), gotoCellStart(false), 
+      buttonstreamid(0), runningCellStart(false), 
+      runSeekCellStart(false),
       menupktpts(0), curAudioTrack(0),
       curSubtitleTrack(0), autoselectaudio(true),
       autoselectsubtitle(true), 
@@ -120,8 +121,9 @@
     {
         VERBOSE(VB_PLAYBACK, LOC_ERR + 
                 QString("Seek() to time %1 failed").arg(time));
+        return -1;
     }
-    else if (!IsInMenu() && !gotoCellStart)
+    else if (!IsInMenu() && !runningCellStart)
     {
         gotStop = false;
         if (time > 0 && ffrewSkip == 1)
@@ -307,10 +309,10 @@
                             .arg(title).arg(part).arg(titleParts));
 
                 buttonSelected = false;
-                if (gotoCellStart)
+                if (runningCellStart)
                 {
                     lastvobid = lastcellid = 0;
-                    gotoCellStart = false;
+                    runningCellStart = false;
                 }
                 else
                 {
@@ -356,7 +358,10 @@
                 subTrackMap.clear();
                 uint count = dvdnav_subp_get_stream_count(dvdnav);
 
-                ClearMenuSPUParameters();
+                //ClearMenuSPUParameters();
+                if (parent)
+                    parent->HideDVDButton(true);
+
                 ClearSubtitlesOSD();
 
                 if (IsInMenu())
@@ -550,7 +555,7 @@
 
                 ClearSubtitlesOSD();
 
-                if (parent && buttonExists && NumMenuButtons() > 0)
+                if (parent && buttonExists)
                     parent->HideDVDButton(false);
 
                 if (blockBuf != dvdBlockWriteBuf)
@@ -1292,13 +1302,29 @@
     return false;
 }
 
+/** \brief Run SeekCellStart its okay to run seekcellstart
+ ** ffmpeg for some reason doesnt' output menu spu if seekcellstart
+ ** is started too soon after a video codec/resolution change
+ */
+void DVDRingBufferPriv::RunSeekCellStart(void)
+{
+    bool ret = true;
+    if (NumMenuButtons() > 0 && !buttonExists)
+        ret = false;
+    if (ret && runSeekCellStart)
+    {
+        ret = SeekCellStart();
+        runSeekCellStart = !ret;
+    }
+}
+
 /** \brief seek the beginning of a dvd cell
  */
-void DVDRingBufferPriv::SeekCellStart(void)
+bool DVDRingBufferPriv::SeekCellStart(void)
 {
     QMutexLocker lock(&seekLock);
-    gotoCellStart = true;
-    Seek(cellStart);
+    runningCellStart = true;
+    return (Seek(cellStart) == 0);
 }
 
 /** \brief set dvd speed. uses the DVDDriveSpeed Setting from the settings 
Index: DVDRingBuffer.h
===================================================================
--- DVDRingBuffer.h	(revision 16832)
+++ DVDRingBuffer.h	(working copy)
@@ -75,6 +75,7 @@
     int GetCellID(void) { return cellid; }
     int GetVobID(void)  { return vobid; }
     bool IsSameChapter(int tmpcellid, int tmpvobid);
+    void RunSeekCellStart(void);
 
     // commands
     bool OpenFile(const QString &filename);
@@ -105,9 +106,9 @@
     int   GetTrack(uint type);
     uint8_t GetNumAudioChannels(int id);
     void JumpToTitle(bool change) { jumptotitle = change; }
-    void SeekCellStart(void);
     void SetDVDSpeed(void);
     void SetDVDSpeed(int speed);
+    void SetRunSeekCellStart(bool change) { runSeekCellStart = change; }
 
     void SetParent(NuppelVideoPlayer *p) { parent = p; }
 
@@ -156,7 +157,8 @@
     int            lastvobid;
     bool           cellRepeated;
     int            buttonstreamid;
-    bool           gotoCellStart;
+    bool           runningCellStart;
+    bool           runSeekCellStart;
     long long      menupktpts;
     int            curAudioTrack;
     int8_t         curSubtitleTrack;
@@ -188,6 +190,7 @@
     uint ConvertLangCode(uint16_t code);
     void SelectDefaultButton(void);
     void ClearSubtitlesOSD(void);
+    bool SeekCellStart(void);
 
     int get_nibble(const uint8_t *buf, int nibble_offset);
     int decode_rle(uint8_t *bitmap, int linesize, int w, int h,
Index: avformatdecoder.h
===================================================================
--- avformatdecoder.h	(revision 16832)
+++ avformatdecoder.h	(working copy)
@@ -278,8 +278,6 @@
     bool dvd_video_codec_changed;
     bool dvdTitleChanged;
     bool mpeg_seq_end_seen;
-    /// \brief contains last dvd still frame decoded
-    AVPacket *lastDVDStillFrame;
 };
 
 #endif
