Index: mythplugins/mythmusic/mythmusic/metadata.cpp
===================================================================
--- mythplugins/mythmusic/mythmusic/metadata.cpp	(revision 7499)
+++ mythplugins/mythmusic/mythmusic/metadata.cpp	(working copy)
@@ -809,42 +809,9 @@
 {
     root_node->sort();
 
-    bool something_changed;
-    QString Title1;
-    QString Title2;
-    
     //  sort top level nodes
     
-    something_changed = false;
-    if(top_nodes.count() > 1)
-    {
-        something_changed = true;
-    }
-    while(something_changed)
-    {
-        something_changed = false;
-        for(uint i = 0; i < top_nodes.count() - 1;)
-        {
-            Title1 = top_nodes.at(i)->getTitle().lower();
-            Title2 = top_nodes.at(i+1)->getTitle().lower();
-
-            if (Title1.left(4) == thePrefix)
-                Title1 = Title1.mid(4);
-            if (Title2.left(4) == thePrefix)
-                Title2 = Title2.mid(4);
-           
-            if(qstrcmp(Title1, Title2) > 0)
-            {
-                something_changed = true;
-                MusicNode *temp = top_nodes.take(i + 1);
-                top_nodes.insert(i, temp);
-            }
-            else
-            {
-                ++i;
-            }
-        }
-    }
+    top_nodes.sort ();
     
     //  tell top level nodes to sort from themselves 
     //  downwards
@@ -1400,66 +1367,13 @@
 
 void MusicNode::sort()
 {
-    bool something_changed;
-    QString Title1, Title2;
-
     //  Sort any tracks
     
-    something_changed = false;
-    if(my_tracks.count() > 1)
-    {
-        something_changed = true;
-    }
-    while(something_changed)
-    {
-        something_changed = false;
-        for(uint i = 0; i < my_tracks.count() - 1;)
-        {
-            if(my_tracks.at(i)->Track() > my_tracks.at(i+1)->Track())
-            {
-                something_changed = true;
-                Metadata *temp = my_tracks.take(i + 1);
-                my_tracks.insert(i, temp);
-            }
-            else
-            {
-                ++i;
-            }
-        }
-    }
+    my_tracks.sort ();
 
     //  Sort any subnodes
-    
-    something_changed = false;
-    if(my_subnodes.count() > 1)
-    {
-        something_changed = true;
-    }
-    while(something_changed)
-    {
-        something_changed = false;
-        for(uint i = 0; i < my_subnodes.count() - 1;)
-        {
-            Title1 = my_subnodes.at(i)->getTitle().lower();
-            Title2 = my_subnodes.at(i+1)->getTitle().lower();
 
-            if (Title1.left(4) == thePrefix)
-                Title1 = Title1.mid(4);
-            if (Title2.left(4) == thePrefix)
-                Title2 = Title2.mid(4);
-
-            if(qstrcmp(Title1, Title2) > 0)
-            {
-                something_changed = true;
-                MusicNode *temp = my_subnodes.take(i + 1);
-                my_subnodes.insert(i, temp);
-            }
-            else
-            {
-                ++i;
-            }
-        }
-    }
+    my_subnodes.sort ();
     
     //  Tell any subnodes to sort themselves
 
@@ -1503,3 +1417,51 @@
     }
 }
 
+/*********************************************************************************/
+
+MetadataPtrList::MetadataPtrList () {
+}
+
+MetadataPtrList::~MetadataPtrList () {
+}
+
+int MetadataPtrList::compareItems (QPtrCollection::Item item1, 
+                                   QPtrCollection::Item item2) {
+    Metadata *itemA = (Metadata*)item1;
+    Metadata *itemB = (Metadata*)item2;
+
+    int trackA = itemA->Track ();
+    int trackB = itemB->Track ();
+
+    if (trackA > trackB)
+        return 1;
+
+    if (trackA < trackB)
+        return -1;
+
+    return 0;
+}
+
+/*********************************************************************************/
+
+MusicNodePtrList::MusicNodePtrList () {
+}
+
+MusicNodePtrList::~MusicNodePtrList () {
+}
+
+int MusicNodePtrList::compareItems (QPtrCollection::Item item1, 
+                                    QPtrCollection::Item item2) {
+    MusicNode *itemA = (MusicNode*)item1;
+    MusicNode *itemB = (MusicNode*)item2;
+
+    QString title1 = itemA->getTitle().lower();
+    QString title2 = itemB->getTitle().lower();
+    
+    if (title1.left(4) == thePrefix)
+        title1 = title1.mid(4);
+    if (title2.left(4) == thePrefix)
+        title2 = title2.mid(4);
+
+    return qstrcmp(title1, title2);
+}
Index: mythplugins/mythmusic/mythmusic/metadata.h
===================================================================
--- mythplugins/mythmusic/mythmusic/metadata.h	(revision 7499)
+++ mythplugins/mythmusic/mythmusic/metadata.h	(working copy)
@@ -170,6 +170,23 @@
 bool operator==(const Metadata& a, const Metadata& b);
 bool operator!=(const Metadata& a, const Metadata& b);
 
+class MetadataPtrList : public QPtrList<Metadata> {
+  public:
+    MetadataPtrList ();
+    virtual ~MetadataPtrList ();
+  protected:
+    virtual int compareItems (QPtrCollection::Item item1, QPtrCollection::Item item2);
+};
+
+class MusicNode;
+class MusicNodePtrList : public QPtrList<MusicNode> {
+  public:
+    MusicNodePtrList ();
+    virtual ~MusicNodePtrList ();
+  protected:
+    virtual int compareItems (QPtrCollection::Item item1, QPtrCollection::Item item2);
+};
+
 class MusicNode
 {
     //  Not a root of the music tree, and
@@ -199,8 +216,8 @@
  
   private:
   
-    QPtrList<Metadata>  my_tracks;
-    QPtrList<MusicNode> my_subnodes;
+    MetadataPtrList     my_tracks;
+    MusicNodePtrList    my_subnodes;
     QString             my_title;
     QString             my_level;
 
@@ -267,8 +284,8 @@
     
   private:
   
-    QPtrList<Metadata>  all_music;
-    QPtrList<MusicNode> top_nodes;
+    MetadataPtrList     all_music;
+    MusicNodePtrList    top_nodes;
     MusicNode           *root_node;
     
     
