Index: libs/libmythtv/channelutil.cpp
===================================================================
--- libs/libmythtv/channelutil.cpp	(revision 13790)
+++ libs/libmythtv/channelutil.cpp	(working copy)
@@ -1372,12 +1372,14 @@
     int cmp = 0;
 
     bool isIntA, isIntB;
+    bool isQamA = 0, isQamB = 0;
     int a_int = a.channum.toUInt(&isIntA);
     int b_int = b.channum.toUInt(&isIntB);
     int a_major = a.major_chan;
     int b_major = b.major_chan;
     int a_minor = a.minor_chan;
     int b_minor = b.minor_chan;
+    QStringList chanList;
 
     // If ATSC channel has been renumbered, sort by new channel number
     if ((a_minor > 0) && a_int)
@@ -1406,12 +1408,70 @@
             return cmp < 0;
     }
 
-    if (isIntA && isIntB)
+    if (isIntA)
     {
-        // both channels have a numeric channum
-        cmp = a_int - b_int;
-        if (cmp)
+        //Treat integer as if 0 subchannel ex. 9.0
+        a_major = a_int;
+        a_minor = 0;
+    } 
+    else 
+    {
+        //Try to split channum on -, _, or . for QAM channels and order by major/minor
+        chanList = QStringList::split("-",a.channum);
+        if (chanList.size() != 2)
+        {
+            chanList = QStringList::split("_",a.channum);
+            if (chanList.size() != 2) 
+            {
+                chanList = QStringList::split(".",a.channum);
+            }
+        }
+        if (chanList.size() == 2)
+        {
+            a_major = chanList[0].toUInt(&isQamA);
+            if (isQamA)
+            {
+                a_minor = chanList[1].toUInt(&isQamA);
+            }
+        }
+    }
+
+    if (isIntB)
+    {
+        //Treat integer as if 0 subchannel ex. 9.0
+        b_major = b_int;
+        b_minor = 0;
+    } 
+    else 
+    {
+        //Try to split channum on -, _, or . for QAM channels and order by major/minor
+        chanList = QStringList::split("-",b.channum);
+        if (chanList.size() != 2)
+        {
+            chanList = QStringList::split("_",b.channum);
+            if (chanList.size() != 2) 
+            {
+                chanList = QStringList::split(".",b.channum);
+            }
+        }
+        if (chanList.size() == 2)
+        {
+            b_major = chanList[0].toUInt(&isQamB);
+            if (isQamB)
+            {
+                b_minor = chanList[1].toUInt(&isQamB);
+            }
+        }
+    }
+
+    if ((isIntA || isQamA) && (isIntB || isQamB)) 
+    {
+        //Channels are Integer or QAM style (9.1, 9-1, 9_1)
+        if ((cmp = a_major - b_major))
             return cmp < 0;
+        
+        if ((cmp = a_minor - b_minor))
+            return cmp < 0;
     }
     else if (isIntA ^ isIntB)
     {
