diff --git a/mythtv/libs/libmythtv/tv_actions.h b/mythtv/libs/libmythtv/tv_actions.h
index 1629ffc..aad35d7 100644
--- a/mythtv/libs/libmythtv/tv_actions.h
+++ b/mythtv/libs/libmythtv/tv_actions.h
@@ -22,7 +22,7 @@
 #define ACTION_TOGGLERECCONTROLS  "TOGGLERECCONTROLS"
 #define ACTION_TOGGLEINPUTS       "TOGGLEINPUTS"
 
-#define ACTION_LISTRECORDEDEPISODES "LISTRECORDEDEPISODES"
+#define ACTION_SHOWNEXTGROUP     "SHOWNEXTGROUP"
 
 #define ACTION_GUIDE             "GUIDE"
 #define ACTION_FINDER            "FINDER"
diff --git a/mythtv/libs/libmythtv/tv_play.cpp b/mythtv/libs/libmythtv/tv_play.cpp
index 2a0c7b8..37963f9 100644
--- a/mythtv/libs/libmythtv/tv_play.cpp
+++ b/mythtv/libs/libmythtv/tv_play.cpp
@@ -577,8 +577,8 @@ void TV::InitKeys(void)
             "Change Recording Group"), "");
     REG_KEY("TV Frontend", "CHANGEGROUPVIEW", QT_TRANSLATE_NOOP("MythControls",
             "Change Group View"), "");
-    REG_KEY("TV Frontend", ACTION_LISTRECORDEDEPISODES, QT_TRANSLATE_NOOP("MythControls",
-            "List recorded episodes"), "");
+    REG_KEY("TV Frontend", ACTION_SHOWNEXTGROUP, QT_TRANSLATE_NOOP("MythControls",
+            "Show Next Group"), "");
 
     REG_KEY("TV Playback", "BACK", QT_TRANSLATE_NOOP("MythControls",
             "Exit or return to DVD menu"), "Esc");
diff --git a/mythtv/programs/mythfrontend/playbackbox.cpp b/mythtv/programs/mythfrontend/playbackbox.cpp
index 165250b..ab70199 100644
--- a/mythtv/programs/mythfrontend/playbackbox.cpp
+++ b/mythtv/programs/mythfrontend/playbackbox.cpp
@@ -3129,12 +3129,7 @@ void PlaybackBox::ShowActionPopup(const ProgramInfo &pginfo)
 
         m_popupMenu->AddItem(tr("Recording Options"), NULL, createRecordingMenu());
 
-        if (m_groupList->GetItemPos(m_groupList->GetItemCurrent()) == 0)
-            m_popupMenu->AddItem(tr("List Recorded Episodes"),
-                                 SLOT(ShowRecordedEpisodes()));
-        else
-            m_popupMenu->AddItem(tr("List All Recordings"),
-                                 SLOT(ShowAllRecordings()));
+        m_popupMenu->AddItem(tr("Show Next Group"), SLOT(ShowNextGroup()));
 
         m_popupMenu->AddItem(tr("Delete"), SLOT(askDelete()));
 
@@ -3189,12 +3184,7 @@ void PlaybackBox::ShowActionPopup(const ProgramInfo &pginfo)
     m_popupMenu->AddItem(tr("Recording Options"), NULL, createRecordingMenu());
     m_popupMenu->AddItem(tr("Job Options"), NULL, createJobMenu());
 
-    if (m_groupList->GetItemPos(m_groupList->GetItemCurrent()) == 0)
-        m_popupMenu->AddItem(tr("List Recorded Episodes"),
-                             SLOT(ShowRecordedEpisodes()));
-    else
-        m_popupMenu->AddItem(tr("List All Recordings"),
-                             SLOT(ShowAllRecordings()));
+    m_popupMenu->AddItem(tr("Show Next Group"), SLOT(ShowNextGroup()));
 
     if (!sameProgram)
     {
@@ -3482,32 +3472,56 @@ void PlaybackBox::Delete(DeleteFlags flags)
     }
 }
 
-void PlaybackBox::ShowRecordedEpisodes()
+/// Find next ocurrence of selected prog in subsequent groups
+void PlaybackBox::ShowNextGroup()
 {
     ProgramInfo *pginfo = GetCurrentProgram();
-    if (pginfo) {
-        QString title = pginfo->GetTitle().toLower();
-        MythUIButtonListItem* group = m_groupList->GetItemByData(qVariantFromValue(title));
-        if (group)
-        {
-            m_groupList->SetItemCurrent(group);
-            // set focus back to previous item
-            MythUIButtonListItem *previousItem = m_recordingList->GetItemByData(qVariantFromValue(pginfo));
-            m_recordingList->SetItemCurrent(previousItem);
-        }
-    }
-}
 
-void PlaybackBox::ShowAllRecordings(void)
-{
-    ProgramInfo *pginfo = GetCurrentProgram();
-    m_groupList->SetItemCurrent(0);
-    if (pginfo)
+    // only applicable when recording list is focussed and a recording is selected
+    if (pginfo && GetFocusWidget() == m_recordingList)
     {
-        // set focus back to previous item
-        MythUIButtonListItem *previousitem =
-            m_recordingList->GetItemByData(qVariantFromValue(pginfo));
-        m_recordingList->SetItemCurrent(previousitem);
+        // determine the focussed group (m_current_group uses wrong case)
+        MythUIButtonListItem *currentGroup = m_groupList->GetItemCurrent();
+        if (!currentGroup)
+            return; // no groups
+
+        // determine position within group list
+        int ixCurrentGroup = m_titleList.indexOf(currentGroup->GetText("groupname"));
+        if (ixCurrentGroup < 0)
+            return; // no groups
+
+        // search from the subsequent group to the previous group, wrapping at the end
+        QStringList::iterator itCurrentGroup = m_titleList.begin() + ixCurrentGroup;
+        bool found = false;
+
+        for (QStringList::iterator itGroup = itCurrentGroup + 1; !found && itGroup != itCurrentGroup; ++itGroup)
+        {
+            // wrap at end
+            if (itGroup == m_titleList.end())
+                itGroup = m_titleList.begin();
+
+            // get recordings for this group
+            QString groupLabel = (*itGroup).toLower();
+            ProgramList progList = m_progLists[groupLabel];
+
+            // locate the recording within this group
+            for (ProgramList::iterator itProg = progList.begin(); itProg != progList.end(); ++itProg)
+            {
+                if (*itProg == pginfo)
+                {
+                    // focus group
+                    MythUIButtonListItem* group = m_groupList->GetItemByData(qVariantFromValue(groupLabel));
+                    m_groupList->SetItemCurrent(group);
+
+                    // focus recording
+                    MythUIButtonListItem *prog = m_recordingList->GetItemByData(qVariantFromValue(pginfo));
+                    m_recordingList->SetItemCurrent(prog);
+
+                    found = true;
+                    break;
+                }
+            }
+        }
     }
 }
 
@@ -3883,13 +3897,8 @@ bool PlaybackBox::keyPressEvent(QKeyEvent *event)
                 curpos = m_groupList->GetCount() - 1;
             m_groupList->SetItemCurrent(curpos);
         }
-        else if (action == ACTION_LISTRECORDEDEPISODES)
-        {
-            if (m_groupList->GetItemPos(m_groupList->GetItemCurrent()) == 0)
-                ShowRecordedEpisodes();
-            else
-                ShowAllRecordings();
-        }
+        else if (action == ACTION_SHOWNEXTGROUP)
+            ShowNextGroup();
         else if (action == "CHANGERECGROUP")
             showGroupFilter();
         else if (action == "CHANGEGROUPVIEW")
diff --git a/mythtv/programs/mythfrontend/playbackbox.h b/mythtv/programs/mythfrontend/playbackbox.h
index a88439e..0a02cc8 100644
--- a/mythtv/programs/mythfrontend/playbackbox.h
+++ b/mythtv/programs/mythfrontend/playbackbox.h
@@ -185,8 +185,7 @@ class PlaybackBox : public ScheduleCommon
     void DeleteIgnoreAllRemaining(void)
         { Delete((DeleteFlags)((int)kIgnore|(int)kAllRemaining)); }
 
-    void ShowRecordedEpisodes();
-    void ShowAllRecordings();
+    void ShowNextGroup();
 
     void toggleWatched();
     void toggleAutoExpire();
