Index: libs/libmythtv/avformatdecoder.cpp
===================================================================
--- libs/libmythtv/avformatdecoder.cpp	(revision 19620)
+++ libs/libmythtv/avformatdecoder.cpp	(working copy)
@@ -2698,16 +2698,29 @@
         if (*buf == 0x02)
         {
             buf += 3;
+/*
+            cerr<<QString("vbi_dvb(%1,%2)")
+                .arg((int)(*(buf+1)))
+                .arg((int)(*(buf+2))).toAscii().constData()
+                <<endl;
+*/
             ttd->Decode(buf+1, VBI_DVB);
         }
         else if (*buf == 0x03)
         {
             buf += 3;
+/*
+            cerr<<QString("sub_dvb(%1,%2)")
+                .arg((int)(*(buf+1)))
+                .arg((int)(*(buf+2))).toAscii().constData()
+                <<endl;
             ttd->Decode(buf+1, VBI_DVB_SUBTITLE);
+*/
         }
         else if (*buf == 0xff)
         {
             buf += 3;
+//            cerr<<"dvb(0xff)"<<endl;
         }
         else
         {
@@ -3521,6 +3534,9 @@
         int subIdx = selectedTrack[kTrackTypeSubtitle].av_stream_index;
         avcodeclock.unlock();
 
+        static AVSubtitle subtitle;
+        memset(&subtitle, 0, sizeof(AVSubtitle));
+
         while (!have_err && len > 0)
         {
             int ret = 0;
@@ -3927,8 +3943,6 @@
                 case CODEC_TYPE_SUBTITLE:
                 {
                     int gotSubtitles = 0;
-                    AVSubtitle subtitle;
-                    memset(&subtitle, 0, sizeof(AVSubtitle));
 
                     if (ringBuffer->isDVD())
                     {
@@ -3954,17 +3968,26 @@
                         avcodec_decode_subtitle(curstream->codec,
                                                 &subtitle, &gotSubtitles,
                                                 ptr, len);
+                        VERBOSE(VB_IMPORTANT,
+                                QString("avcodec_decode_subtitles -> %1")
+                                .arg(gotSubtitles));
                     }
+                    else
+                    {
+                        VERBOSE(VB_IMPORTANT, "subtitles in silent stream");
+                    }
 
                     // the subtitle decoder always consumes the whole packet
                     ptr += len;
                     len = 0;
 
                     if (gotSubtitles) 
-                    {
+                    { 
+                        VERBOSE(VB_IMPORTANT, "gotSubtitles");
                         subtitle.start_display_time += pts;
                         subtitle.end_display_time += pts;
                         GetNVP()->AddAVSubtitle(subtitle);
+                        memset(&subtitle, 0, sizeof(AVSubtitle));
                     }
 
                     break;
Index: libs/libmythui/mythuibuttonlist.h
===================================================================
--- libs/libmythui/mythuibuttonlist.h	(revision 19620)
+++ libs/libmythui/mythuibuttonlist.h	(working copy)
@@ -65,7 +65,9 @@
      */
     MythImage *getImage(const QString &name="");
 
-    void SetImage(const QString &filename, const QString &name="");
+    void SetImage(const QString &filename, const QString &name="",
+                  bool force_reload = false);
+    QString GetImage(const QString &name="") const;
     const QString Image() const;
 
     void DisplayState(const QString &state, const QString &name);
Index: libs/libmythui/mythuibuttonlist.cpp
===================================================================
--- libs/libmythui/mythuibuttonlist.cpp	(revision 19620)
+++ libs/libmythui/mythuibuttonlist.cpp	(working copy)
@@ -1247,26 +1247,66 @@
     return NULL;
 }
 
-void MythUIButtonListItem::SetImage(const QString &filename, const QString &name)
+void MythUIButtonListItem::SetImage(
+    const QString &filename, const QString &name, bool force_reload)
 {
+    bool do_update = force_reload;
     if (!name.isEmpty())
-        m_imageFilenames.insert(name, filename);
-    else
+    {
+        QMap<QString, QString>::iterator it = m_imageFilenames.find(name);
+        if (it == m_imageFilenames.end())
+        {
+            m_imageFilenames.insert(name, filename);
+            do_update = true;
+        }
+        else if (*it != filename)
+        {
+            *it = filename;
+            do_update = true;
+        }
+    }
+    else if (m_imageFilename != filename)
+    {
         m_imageFilename = filename;
+        do_update = true;
+    }
 
-    if (m_parent)
+    if (m_parent && do_update)
         m_parent->Update();
 }
 
+QString MythUIButtonListItem::GetImage(const QString &name) const
+{
+    if (name.isEmpty())
+        return m_imageFilename;
+
+    QMap<QString, QString>::const_iterator it = m_imageFilenames.find(name);
+    if (it != m_imageFilenames.end())
+        return *it;
+
+    return QString::null;
+}
+
 void MythUIButtonListItem::DisplayState(const QString &state,
                                         const QString &name)
 {
     if (name.isEmpty())
         return;
 
-    m_states.insert(name, state);
+    bool do_update = false;
+    QMap<QString, QString>::iterator it = m_states.find(name);
+    if (it == m_states.end())
+    {
+        m_states.insert(name, state);
+        do_update = true;
+    }
+    else if (*it != state)
+    {
+        *it = state;
+        do_update = true;
+    }
 
-    if (m_parent)
+    if (m_parent && do_update)
         m_parent->Update();
 }
 
Index: programs/mythfrontend/playbackbox.cpp
===================================================================
--- programs/mythfrontend/playbackbox.cpp	(revision 19620)
+++ programs/mythfrontend/playbackbox.cpp	(working copy)
@@ -586,7 +586,8 @@
     updateIcons();
 }
 
-void PlaybackBox::UpdateProgramInfo(MythUIButtonListItem *item, bool is_sel)
+void PlaybackBox::UpdateProgramInfo(
+    MythUIButtonListItem *item, bool is_sel, bool force_preview_reload)
 {
     if (!item)
         return;
@@ -596,21 +597,37 @@
     if (!pginfo)
         return;
 
+    VERBOSE(VB_IMPORTANT, QString("UpdateProgramInfo(%1)")
+            .arg(pginfo->title));
+
     static const char *disp_flags[] = { "transcoding", "commflagging", };
     const bool disp_flag_stat[] =
     {
         !JobQueue::IsJobQueuedOrRunning(
             JOB_TRANSCODE, pginfo->chanid, pginfo->recstartts),
         !JobQueue::IsJobQueuedOrRunning(
-            JOB_COMMFLAG, pginfo->chanid, pginfo->recstartts),
+            JOB_COMMFLAG,  pginfo->chanid, pginfo->recstartts),
     };
 
     for (uint i = 0; i < sizeof(disp_flags) / sizeof(char*); i++)
         item->DisplayState(disp_flag_stat[i]?"yes":"no", disp_flags[i]);
 
-    QString imagefile = getPreviewImage(pginfo);
+    QString oldimgfile = item->GetImage("preview");
+    QString imagefile = QString::null;
+    if (oldimgfile.isEmpty() || force_preview_reload ||
+        ((is_sel && GetFocusWidget() == m_recordingList)))
+    {
+        VERBOSE(VB_IMPORTANT, QString(
+                    "%1 || %2 || (%3 && %4) -> true")
+                .arg(oldimgfile.isEmpty())
+                .arg(force_preview_reload)
+                .arg(is_sel)
+                .arg(GetFocusWidget() == m_recordingList));
+        imagefile = getPreviewImage(pginfo);
+    }
+
     if (!imagefile.isEmpty())
-        item->SetImage(imagefile, "preview");
+        item->SetImage(imagefile, "preview", force_preview_reload);
 
     if ((GetFocusWidget() == m_recordingList) && is_sel)
     {
@@ -622,6 +639,7 @@
 
         if (m_previewImage)
         {
+            QString imagefile = getPreviewImage(pginfo);
             m_previewImage->SetVisible(!imagefile.isEmpty());
             m_previewImage->SetFilename(imagefile);
             m_previewImage->Load();
@@ -3341,7 +3359,7 @@
         return;
 
     MythUIButtonListItem *sel_item = m_recordingList->GetItemCurrent();
-    UpdateProgramInfo(item, item == sel_item);
+    UpdateProgramInfo(item, item == sel_item, true);
 }
 
 bool check_lastmod(LastCheckedMap &elapsedtime, const QString &filename)
Index: programs/mythfrontend/playbackbox.h
===================================================================
--- programs/mythfrontend/playbackbox.h	(revision 19620)
+++ programs/mythfrontend/playbackbox.h	(working copy)
@@ -291,7 +291,8 @@
     void updateIcons(const ProgramInfo *pginfo = NULL);
     void updateUsage();
     void updateGroupInfo(const QString &groupname);
-    void UpdateProgramInfo(MythUIButtonListItem *item, bool is_sel);
+    void UpdateProgramInfo(MythUIButtonListItem *item, bool is_sel,
+                           bool force_preview_reload = false);
 
     void SetTextFromMap(MythUIType *parent, QMap<QString, QString> &infoMap);
     void ResetMap(MythUIType *parent, QMap<QString, QString> &infoMap);
