diff -p -r -u -N -X /tmp/diff.exclude -x release.21111.0803bare -x release.21111.0803bareb release.21111.0803bare/mythtv/programs/mythfrontend/playbackbox.cpp release.21111.0803bareb/mythtv/programs/mythfrontend/playbackbox.cpp
--- mythtv/programs/mythfrontend/playbackbox.cpp	2009-08-03 09:09:30.000000000 -0500
+++ mythtv/programs/mythfrontend/playbackbox.cpp	2009-08-03 09:48:57.000000000 -0500
@@ -60,6 +60,21 @@ const uint PreviewGenState::minBlockSeco
 
 const uint PlaybackBox::previewGeneratorMaxRunning = 2;
 
+static int comp_title(ProgramInfo *a, ProgramInfo *b)
+{
+    if (a->sortTitle == b->sortTitle)
+    {
+        return (a->recstartts < b->recstartts ? 1 : -1);
+    }
+    else
+        return (a->sortTitle < b->sortTitle ? 1 : -1);
+}
+
+static int comp_title_rev(ProgramInfo *a, ProgramInfo *b)
+{
+    return comp_title(b, a);
+}
+
 static int comp_programid(ProgramInfo *a, ProgramInfo *b)
 {
     if (a->programid == b->programid)
@@ -246,7 +261,7 @@ PlaybackBox::PlaybackBox(BoxType ltype, 
       drawListBounds(0, 0, 0, 0),       drawInfoBounds(0, 0, 0, 0),
       drawGroupBounds(0, 0, 0, 0),      drawUsageBounds(0, 0, 0, 0),
       drawVideoBounds(0, 0, 0, 0),      blackholeBounds(0, 0, 0, 0),
-      drawCurGroupBounds(0, 0, 0, 0),
+      drawCurGroupBounds(0, 0, 0, 0),   drawSortOrderBounds(0, 0, 0, 0),
       // General popup support
       popup(NULL),                      expectingPopup(false),
       // Recording Group popup support
@@ -308,6 +323,8 @@ PlaybackBox::PlaybackBox(BoxType ltype, 
     if (!drawTransPixmap)
         drawTransPixmap = new QPixmap();
 
+    episodeSort = gContext->GetSetting("PlayBoxEpisodeSort", "Date");
+
     bool displayCat  = gContext->GetNumSetting("DisplayRecGroupIsCategory", 0);
     int  initialFilt = gContext->GetNumSetting("QueryInitialFilter", 0);
 
@@ -597,6 +614,8 @@ void PlaybackBox::parseContainer(QDomEle
         drawUsageBounds = area;
     if (name.lower() == "cur_group")
         drawCurGroupBounds = area;
+    if (name.lower() == "sortorder_info")
+        drawSortOrderBounds = area;
 
 }
 
@@ -707,6 +726,11 @@ void PlaybackBox::paintEvent(QPaintEvent
         updateUsage(&p);
     }
 
+    if (r.intersects(drawSortOrderBounds) && !paintSkipUpdate)
+    {
+        updateSortOrder(&p);
+    }
+
     if (r.intersects(drawVideoBounds) && !paintSkipUpdate)
     {
         updateVideo(&p);
@@ -776,6 +800,37 @@ void PlaybackBox::updateCurGroup(QPainte
     }
 }
 
+void PlaybackBox::updateSortOrder(QPainter *p)
+{
+    QRect pr = drawSortOrderBounds;
+    QPixmap pix(pr.size());
+    pix.fill(this, pr.topLeft());
+    QPainter tmp(&pix);
+
+    LayerSet *container = theme->GetSet("sortorder_info");
+    if (container)
+    {
+        UITextType *type = (UITextType *)container->GetType("sortorder");
+        if (type)
+        {
+            QString newtag = "(2) " + episodeSort;
+            type->SetText(tr(newtag));
+        }
+    }
+
+    if (container)
+    {
+        container->Draw(&tmp, 4, 0);
+        container->Draw(&tmp, 5, 0);
+        container->Draw(&tmp, 6, 0);
+        container->Draw(&tmp, 7, 0);
+        container->Draw(&tmp, 8, 0);
+    }
+
+    tmp.end();
+    p->drawPixmap(pr.topLeft(), pix);
+}
+
 
 void PlaybackBox::updateGroupInfo(QPainter *p, QRect& pr,
                                   QPixmap& pix, QString cont_name)
@@ -1852,6 +1907,13 @@ bool PlaybackBox::FillList(bool useCache
             if (p->title == "")
                 p->title = tr("_NO_TITLE_");
 
+            // Set sortTitle
+            QString tmptitle = p->title;
+            QString tmpsubtitle = p->subtitle;
+            tmptitle.remove(QRegExp("^(The |A |An )"));
+            tmpsubtitle.remove(QRegExp("^(The |A |An )"));
+            p->sortTitle = tmptitle + " - " + tmpsubtitle;
+
             if ((((p->recgroup == recGroup) ||
                   ((recGroup == "All Programs") &&
                    (p->recgroup != "Deleted") &&
@@ -1974,8 +2036,6 @@ bool PlaybackBox::FillList(bool useCache
         return 0;
     }
 
-    QString episodeSort = gContext->GetSetting("PlayBoxEpisodeSort", "Date");
-
     if (episodeSort == "OrigAirDate")
     {
         QMap<QString, ProgramList>::Iterator Iprog;
@@ -2018,6 +2078,20 @@ bool PlaybackBox::FillList(bool useCache
             }
         }
     }
+    else if (episodeSort == "Title")
+    {
+        QMap<QString, ProgramList>::Iterator Iprog;
+        for (Iprog = progLists.begin(); Iprog != progLists.end(); ++Iprog)
+        {
+            if (!Iprog.key().isEmpty())
+            {
+                if (listOrder == 0 || type == Delete)
+                    Iprog.data().Sort(comp_title_rev);
+                else
+                    Iprog.data().Sort(comp_title);
+            }
+        }
+    }
 
     if (progLists[watchGroupLabel].count() > 1)
     {
@@ -2278,11 +2352,16 @@ bool PlaybackBox::FillList(bool useCache
                             if (oldprogramid > p->programid)
                                 break;
                         }
-                        else
+                        else if (episodeSort == "Date")
                         {
                             if (oldstartts > p->recstartts)
                                 break;
                         }
+                        else
+                        {
+                            if (oldsTitle > sTitle)
+                                break;
+                        }
                     }
                     else
                     {
@@ -2296,11 +2375,16 @@ bool PlaybackBox::FillList(bool useCache
                             if (oldprogramid < p->programid)
                                 break;
                         }
-                        else
+                        else if (episodeSort == "Date")
                         {
                             if (oldstartts < p->recstartts)
                                 break;
                         }
+                        else
+                        {
+                            if (oldsTitle > sTitle)
+                                break;
+                        }
                     }
                 }
             }
@@ -4269,6 +4353,23 @@ void PlaybackBox::keyPressEvent(QKeyEven
             exitWin();
         else if (action == "1" || action == "HELP")
             showIconHelp();
+        else if (action == "2")
+        {
+            // Update Sort Order
+            if (episodeSort == "OrigAirDate") {
+                episodeSort = "Id";
+            } else if (episodeSort == "Id") {
+                episodeSort = "Title";
+            } else if (episodeSort == "Title") {
+                episodeSort = "Date";
+            } else { /* (episodeSort == "Date") */
+                episodeSort = "OrigAirDate";
+            }
+
+            connected = FillList(true); 
+            paintSkipUpdate = false;
+            update(drawTotalBounds);
+        }
         else if (action == "MENU")
             showMenu();
         else if (action == "NEXTFAV")
diff -p -r -u -N -X /tmp/diff.exclude -x release.21111.0803bare -x release.21111.0803bareb release.21111.0803bare/mythtv/programs/mythfrontend/playbackbox.h release.21111.0803bareb/mythtv/programs/mythfrontend/playbackbox.h
--- mythtv/programs/mythfrontend/playbackbox.h	2009-08-03 09:09:30.000000000 -0500
+++ mythtv/programs/mythfrontend/playbackbox.h	2009-08-03 09:44:25.000000000 -0500
@@ -332,6 +332,7 @@ class PlaybackBox : public MythDialog
     void updateShowTitles(QPainter *);
     void updateInfo(QPainter *);
     void updateUsage(QPainter *);
+    void updateSortOrder(QPainter *);
     void updateProgramInfo(QPainter *p, QRect& pr, QPixmap& pix);
     void updateCurGroup(QPainter *p);
     void updateGroupInfo(QPainter *p, QRect& pr, QPixmap& pix,
@@ -347,6 +348,8 @@ class PlaybackBox : public MythDialog
     QString             formatShortDate;
     QString             formatLongDate;
     QString             formatTime;
+
+    QString             episodeSort;
     /// titleView controls showing titles in group list
     bool                titleView;
     /// useCategories controls showing categories in group list
@@ -401,6 +404,7 @@ class PlaybackBox : public MythDialog
     QRect               drawVideoBounds;
     QRect               blackholeBounds;
     QRect               drawCurGroupBounds;
+    QRect               drawSortOrderBounds;
 
     // Popup support //////////////////////////////////////////////////////////
     // General popup support
