Index: libs/libmythui/mythdialogbox.h
===================================================================
--- libs/libmythui/mythdialogbox.h	(revision 23063)
+++ libs/libmythui/mythdialogbox.h	(working copy)
@@ -85,7 +85,7 @@
 
   signals:
     void Selected();
-    void Closed();
+    void Closed(QString, int);
 
   protected:
     void SendEvent(int res, QString text = "", QVariant data = 0);
Index: libs/libmythui/mythdialogbox.cpp
===================================================================
--- libs/libmythui/mythdialogbox.cpp	(revision 23063)
+++ libs/libmythui/mythdialogbox.cpp	(working copy)
@@ -144,11 +144,16 @@
         QString action = actions[i];
         handled = true;
 
-        if (action == "ESCAPE" || action == "LEFT" || action == "MENU")
+        if (action == "ESCAPE" || action == "LEFT")
         {
             SendEvent(-1);
             Close();
         }
+        else if (action == "MENU")
+        {
+            SendEvent(-2);
+            Close();
+        }
         else if (action == "RIGHT")
         {
             MythUIButtonListItem *item = m_buttonList->GetItemCurrent();
@@ -189,6 +194,8 @@
 
 void MythDialogBox::SendEvent(int res, QString text, QVariant data)
 {
+    emit Closed(m_id, res);
+
     if (!m_retObject)
         return;
 
Index: programs/mythfrontend/playbackbox.cpp
===================================================================
--- programs/mythfrontend/playbackbox.cpp	(revision 23064)
+++ programs/mythfrontend/playbackbox.cpp	(working copy)
@@ -361,6 +361,7 @@
 
       // General m_popupMenu support
       m_popupMenu(NULL),
+      m_doToggleMenu(true),
       // Main Recording List support
       m_progsInDB(0),
       // Other state
@@ -988,8 +989,8 @@
 
     if (usedProgress)
     {
-        usedProgress->SetTotal(freeSpaceTotal);
-        usedProgress->SetUsed(freeSpaceUsed);
+        usedProgress->SetTotal((int)freeSpaceTotal);
+        usedProgress->SetUsed((int)freeSpaceUsed);
     }
 }
 
@@ -1856,23 +1857,59 @@
     }
 }
 
-void PlaybackBox::popupClosed()
+void PlaybackBox::popupClosed(QString which, int result)
 {
     m_popupMenu = NULL;
+
+    if (result == -2)
+    {
+        if (!m_doToggleMenu)
+        {
+            m_doToggleMenu = true;
+            return;
+        }
+
+        if (which == "groupmenu")
+        {
+            ProgramInfo *pginfo = CurrentItem();
+            if (pginfo)
+            {
+                m_helper.CheckAvailability(*pginfo, kCheckForMenuAction);
+
+                if ((asPendingDelete == pginfo->availableStatus) ||
+                    (asPendingDelete == pginfo->availableStatus))
+                {
+                    ShowAvailabilityPopup(*pginfo);
+                }
+                else
+                {
+                    ShowActionPopup(*pginfo);
+                    m_doToggleMenu = false;
+                }
+            }
+        }
+        else if (which == "actionmenu")
+        {
+            ShowGroupPopup();
+            m_doToggleMenu = false;
+        }
+    }
+    else
+        m_doToggleMenu = true;
 }
 
-void PlaybackBox::ShowMenu()
+void PlaybackBox::ShowGroupPopup()
 {
     if (m_popupMenu)
         return;
 
-    QString label = tr("Recording List Menu");
+    QString label = tr("Group List Menu");
 
     ProgramInfo *pginfo = CurrentItem();
 
     m_popupMenu = new MythDialogBox(label, m_popupStack, "pbbmainmenupopup");
 
-    connect(m_popupMenu, SIGNAL(Exiting()), SLOT(popupClosed()));
+    connect(m_popupMenu, SIGNAL(Closed(QString, int)), SLOT(popupClosed(QString, int)));
 
     if (m_popupMenu->Create())
         m_popupStack->AddScreen(m_popupMenu);
@@ -1880,9 +1917,10 @@
     {
         delete m_popupMenu;
         m_popupMenu = NULL;
+        return;
     }
 
-    m_popupMenu->SetReturnEvent(this, "slotmenu");
+    m_popupMenu->SetReturnEvent(this, "groupmenu");
 
     m_popupMenu->AddButton(tr("Change Group Filter"),
                                  SLOT(showGroupFilter()));
@@ -1914,6 +1952,14 @@
     }
 
     m_popupMenu->AddButton(tr("Help (Status Icons)"), SLOT(showIconHelp()));
+
+#if 0
+    if (GetFocusWidget() != m_groupList)
+    {
+        m_popupMenu->AddButton(tr("Recording Options Menu"),
+            SLOT(showActionsSelected()));
+    }
+#endif
 }
 
 bool PlaybackBox::Play(const ProgramInfo &rec, bool inPlaylist)
@@ -2233,7 +2279,7 @@
 
     m_popupMenu = new MythDialogBox(label, m_popupStack, "pbbmainmenupopup");
 
-    connect(m_popupMenu, SIGNAL(Exiting()), SLOT(popupClosed()));
+    connect(m_popupMenu, SIGNAL(Closed(QString, int)), SLOT(popupClosed(QString, int)));
 
     if (m_popupMenu->Create())
         m_popupStack->AddScreen(m_popupMenu);
@@ -2241,9 +2287,10 @@
     {
         delete m_popupMenu;
         m_popupMenu = NULL;
+        return;
     }
 
-    m_popupMenu->SetReturnEvent(this, "slotmenu");
+    m_popupMenu->SetReturnEvent(this, "deletemenu");
 
     QString tmpmessage;
     const char *tmpslot = NULL;
@@ -2529,7 +2576,7 @@
     if (!m_popupMenu)
         return false;
 
-    connect(m_popupMenu, SIGNAL(Exiting()), SLOT(popupClosed()));
+    connect(m_popupMenu, SIGNAL(Closed(QString, int)), SLOT(popupClosed(QString, int)));
 
     if (m_popupMenu->Create())
     {
@@ -2543,7 +2590,7 @@
         return false;
     }
 
-    return m_popupMenu;
+    return true;
 }
 
 bool PlaybackBox::CreatePopupMenuPlaylist(void)
@@ -2734,6 +2781,8 @@
     if (!CreatePopupMenu(label, pginfo))
         return;
 
+    m_popupMenu->SetReturnEvent(this, "actionmenu");
+
     if ((asFileNotFound  == pginfo.availableStatus) ||
         (asZeroByte      == pginfo.availableStatus))
     {
@@ -2778,13 +2827,18 @@
                                         SLOT(showPlayFromPopup()), true);
         else
             m_popupMenu->AddButton(tr("Play"), SLOT(playSelected()));
-
+                     
         if (m_playList.filter(pginfo.MakeUniqueKey()).size())
             m_popupMenu->AddButton(tr("Remove from Playlist"),
                                         SLOT(togglePlayListItem()));
         else
             m_popupMenu->AddButton(tr("Add to Playlist"),
                                         SLOT(togglePlayListItem()));
+        if (m_playList.size())
+        {
+            m_popupMenu->AddButton(tr("Playlist options"),
+                         SLOT(showPlaylistPopup()), true);
+        }
     }
 
     if (pginfo.recstatus == rsRecording &&
@@ -2821,6 +2875,10 @@
             m_popupMenu->AddButton(tr("Delete"), SLOT(askDelete()));
         }
     }
+#if 0
+    m_popupMenu->AddButton(tr("Group List Menu"),
+                                SLOT(ShowGroupPopup()));
+#endif
 }
 
 QString PlaybackBox::CreateProgramInfoString(const ProgramInfo &pginfo) const
@@ -3444,6 +3502,30 @@
 
         if (action == "1" || action == "HELP")
             showIconHelp();
+        else if (action == "MENU")
+        {
+             if (GetFocusWidget() == m_groupList)
+                 ShowGroupPopup();
+             else
+             {
+                 ProgramInfo *pginfo = CurrentItem();
+                 if (pginfo)
+                 {
+                     m_helper.CheckAvailability(
+                         *pginfo, kCheckForMenuAction);
+
+                     if ((asPendingDelete == pginfo->availableStatus) ||
+                         (asPendingDelete == pginfo->availableStatus))
+                     {
+                         ShowAvailabilityPopup(*pginfo);
+                     }
+                     else
+                     {
+                         ShowActionPopup(*pginfo);
+                     }
+                 }
+             }
+        }
         else if (action == "NEXTFAV")
         {
             if (GetFocusWidget() == m_groupList)
@@ -3503,29 +3585,7 @@
                 deleteSelected(m_recordingList->GetItemCurrent());
             else if (action == "PLAYBACK")
                 playSelected(m_recordingList->GetItemCurrent());
-            else if (action == "INFO")
-            {
-                if (GetFocusWidget() != m_groupList)
-                {
-                    ProgramInfo *pginfo = CurrentItem();
-                    if (pginfo)
-                    {
-                        m_helper.CheckAvailability(
-                            *pginfo, kCheckForMenuAction);
-
-                        if ((asPendingDelete == pginfo->availableStatus) ||
-                            (asPendingDelete == pginfo->availableStatus))
-                        {
-                            ShowAvailabilityPopup(*pginfo);
-                        }
-                        else
-                        {
-                            ShowActionPopup(*pginfo);
-                        }
-                    }
-                }
-            }
-            else if (action == "DETAILS")
+            else if (action == "DETAILS" || action == "INFO")
                 details();
             else if (action == "CUSTOMEDIT")
                 customEdit();
Index: programs/mythfrontend/playbackbox.h
===================================================================
--- programs/mythfrontend/playbackbox.h	(revision 23064)
+++ programs/mythfrontend/playbackbox.h	(working copy)
@@ -138,6 +138,7 @@
 
     void SwitchList(void);
 
+    void ShowGroupPopup(void);
     void customEdit();
     void upcoming();
     void details();
@@ -169,7 +170,7 @@
     void ShowRecGroupChanger(bool use_playlist = false);
     void ShowPlayGroupChanger(bool use_playlist = false);
 
-    void popupClosed();
+    void popupClosed(QString which, int reason);
 
     void doPlayFromBeg();
     void doPlayListRandom();
@@ -316,8 +317,6 @@
 
     void ScheduleUpdateUIList(void);
 
-    void ShowMenu(void);
-
     bool CreatePopupMenu(const QString &title);
     bool CreatePopupMenu(const QString &title, const ProgramInfo &pginfo)
         { return CreatePopupMenu(title + CreateProgramInfoString(pginfo)); }
@@ -385,7 +384,7 @@
     MythDialogBox      *m_popupMenu;
     MythScreenStack    *m_popupStack;
 
-    bool m_expectingPopup;
+    bool m_doToggleMenu;
 
     // Recording Group popup support
     QMap<QString,QString> m_recGroupType;
