Index: mythmusic/mythmusic/playbackbox.cpp
===================================================================
--- mythmusic/mythmusic/playbackbox.cpp	(revision 9697)
+++ mythmusic/mythmusic/playbackbox.cpp	(working copy)
@@ -107,6 +107,8 @@
         setShuffleMode(SHUFFLE_RANDOM);
     else if (playmode.lower() == "intelligent")
         setShuffleMode(SHUFFLE_INTELLIGENT);
+    else if (playmode.lower() == "album")
+        setShuffleMode(SHUFFLE_ALBUM);
     else
         setShuffleMode(SHUFFLE_OFF);
 
@@ -233,6 +235,8 @@
         gContext->SaveSetting("PlayMode", "intelligent");
     else if (shufflemode == SHUFFLE_RANDOM)
         gContext->SaveSetting("PlayMode", "random");
+    else if (shufflemode == SHUFFLE_ALBUM)
+        gContext->SaveSetting("PlayMode", "album");
     else
         gContext->SaveSetting("PlayMode", "none");
 
@@ -1417,6 +1421,19 @@
             if (class LCD *lcd = LCD::Get())
                 lcd->setMusicShuffle(LCD::MUSIC_SHUFFLE_RAND);
             break;
+        case SHUFFLE_ALBUM:
+            if(shuffle_button)
+            {
+                if (keyboard_accelerators)
+                    shuffle_button->setText(tr("1 Shuffle: Album"));
+                else
+                    shuffle_button->setText(tr("Shuffle: Album"));
+            }
+            music_tree_list->scrambleParents(true);
+
+            if (class LCD *lcd = LCD::Get())
+                lcd->setMusicShuffle(LCD::MUSIC_SHUFFLE_ALBUM);
+            break;
         default:
             if(shuffle_button)
             {
@@ -1534,7 +1551,7 @@
     // We ask the playlist object to write out the whole tree (all playlists 
     // and all music). It will set attributes for nodes in the tree, such as 
     // whether a node is selectable, how it can be ordered (normal, random, 
-    // intelligent), etc. 
+    // intelligent, album), etc. 
 
     all_playlists->writeTree(playlist_tree);
     music_tree_list->assignTreeData(playlist_tree);
Index: mythmusic/mythmusic/playlist.cpp
===================================================================
--- mythmusic/mythmusic/playlist.cpp	(revision 9697)
+++ mythmusic/mythmusic/playlist.cpp	(working copy)
@@ -1,4 +1,5 @@
 #include <unistd.h>
+#include <inttypes.h>
 #include <iostream>
 using namespace std;
 #include "playlist.h"
@@ -883,6 +884,13 @@
     int playcountMax = 0;
     double lastplayMin = 0.0;
     double lastplayMax = 0.0;
+
+    typedef map<QString, uint32_t> AlbumMap;
+    AlbumMap                       album_map;
+    AlbumMap::iterator             Ialbum;
+    QString                        album;
+
+
     for(it = songs.first(); it; it = songs.next())
     {
         if(!it->getCDFlag())
@@ -957,9 +965,28 @@
                     double rating_value =  (RatingWeight * ratingValue + PlayCountWeight * playcountValue + 
                                             LastPlayWeight * lastplayValue + RandomWeight * (double)rand() / 
                                             (RAND_MAX + 1.0));
-                    int integer_rating = (int) (4000001 - rating_value * 10000);
+                    uint32_t integer_rating = (int) (4000001 - rating_value * 10000);
                     added_node->setAttribute(3, integer_rating); //  "intelligent" order
-					 }
+
+                    // "intellegent/album" order
+                    album = tmpdata->Artist() + "~" + tmpdata->Album();
+                    if ((Ialbum = album_map.find(album)) == album_map.end()) {
+                      // Add room for 100 albums with 100 tracks.
+                      integer_rating *= 10000;
+                      integer_rating += (a_counter * 100);
+
+                      album_map.insert(AlbumMap::value_type(album,
+                                                            integer_rating));
+
+                      integer_rating += tmpdata->Track();
+                      added_node->setAttribute(4, integer_rating);
+                    }
+                    else {
+                      integer_rating = Ialbum->second;
+                      integer_rating += tmpdata->Track();
+                      added_node->setAttribute(4, integer_rating);
+                    }
+                }
             }
             if(it->getValue() < 0)
             {
Index: mythmusic/mythmusic/playbackbox.h
===================================================================
--- mythmusic/mythmusic/playbackbox.h	(revision 9697)
+++ mythmusic/mythmusic/playbackbox.h	(working copy)
@@ -129,6 +129,7 @@
     { SHUFFLE_OFF = 0, 
       SHUFFLE_RANDOM, 
       SHUFFLE_INTELLIGENT,
+      SHUFFLE_ALBUM,
       MAX_SHUFFLE_MODES 
     };
 
