Index: src/Clients/Booter/Booter/Entry.cs
===================================================================
--- src/Clients/Booter/Booter/Entry.cs	(revision 4692)
+++ src/Clients/Booter/Booter/Entry.cs	(working copy)
@@ -186,7 +186,8 @@
                     new LayoutOption ("query-track-count", Catalog.GetString ("Track Count")),
                     new LayoutOption ("query-disc", Catalog.GetString ("Disc Number")),
                     new LayoutOption ("query-year", Catalog.GetString ("Year")),
-                    new LayoutOption ("query-rating", Catalog.GetString ("Rating"))
+                    new LayoutOption ("query-rating", Catalog.GetString ("Rating")),
+                    new LayoutOption ("query-score", Catalog.GetString ("Score"))
                 ),
                 
                 new LayoutGroup ("ui", Catalog.GetString ("User Interface Options"),
Index: src/Core/Banshee.ThickClient/Banshee.Collection.Gui/DefaultColumnController.cs
===================================================================
--- src/Core/Banshee.ThickClient/Banshee.Collection.Gui/DefaultColumnController.cs	(revision 4692)
+++ src/Core/Banshee.ThickClient/Banshee.Collection.Gui/DefaultColumnController.cs	(working copy)
@@ -72,6 +72,7 @@
                 AlbumColumn,
                 CommentColumn,
                 RatingColumn,
+                ScoreColumn,
                 DurationColumn,
                 GenreColumn,
                 YearColumn,
@@ -131,6 +132,7 @@
             bitrate_column      = Create (BansheeQuery.BitRateField, 0.10, false, br_cell);
             
             rating_column       = Create (BansheeQuery.RatingField, 0.15, false, new ColumnCellRating (null, true));
+            score_column        = Create (BansheeQuery.ScoreField, 0.15, false, new ColumnCellPositiveInt (null, true, 2, 5));
             composer_column     = CreateText (BansheeQuery.ComposerField, 0.25);
             conductor_column    = CreateText (BansheeQuery.ConductorField, 0.25);
             grouping_column     = CreateText (BansheeQuery.GroupingField, 0.25);
@@ -251,6 +253,11 @@
             get { return rating_column; }
         }
         
+        private SortableColumn score_column;
+        public SortableColumn ScoreColumn {
+            get { return score_column; }
+        }
+
         private SortableColumn last_played_column;
         public SortableColumn LastPlayedColumn {
             get { return last_played_column; }
Index: src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs
===================================================================
--- src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs	(revision 4692)
+++ src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs	(working copy)
@@ -144,6 +144,7 @@
                 ? track.LastSkipped.ToString () : Catalog.GetString ("Unknown"));
             AddItem (Catalog.GetString ("Play Count:"), track.PlayCount);
             AddItem (Catalog.GetString ("Skip Count:"), track.SkipCount);
+            AddItem (Catalog.GetString ("Score:"), track.Score);
         }
         
         private void AddFileSizeItem (long bytes)
Index: src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseTrackInfo.cs
===================================================================
--- src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseTrackInfo.cs	(revision 4692)
+++ src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseTrackInfo.cs	(working copy)
@@ -82,7 +82,7 @@
         {
             if (ProviderRefresh ()) {
                 base.IncrementPlayCount ();
-                Save (true, BansheeQuery.PlayCountField, BansheeQuery.LastPlayedField);
+                Save (true, BansheeQuery.PlayCountField, BansheeQuery.LastPlayedField, BansheeQuery.ScoreField);
             }
         }
 
@@ -90,7 +90,7 @@
         {
             if (ProviderRefresh ()) {
                 base.IncrementSkipCount ();
-                Save (true, BansheeQuery.SkipCountField, BansheeQuery.LastSkippedField);
+                Save (true, BansheeQuery.SkipCountField, BansheeQuery.LastSkippedField, BansheeQuery.ScoreField);
             }
         }
 
@@ -503,6 +503,12 @@
             set { rating = value; }
         }
 
+        [DatabaseColumn]
+        public override int Score {
+            get { return base.Score; }
+            set { base.Score = value; }
+        }
+
         public int SavedRating {
             get { return rating; }
             set {
Index: src/Core/Banshee.Services/Banshee.Database/BansheeDbFormatMigrator.cs
===================================================================
--- src/Core/Banshee.Services/Banshee.Database/BansheeDbFormatMigrator.cs	(revision 4692)
+++ src/Core/Banshee.Services/Banshee.Database/BansheeDbFormatMigrator.cs	(working copy)
@@ -52,7 +52,7 @@
         // NOTE: Whenever there is a change in ANY of the database schema,
         //       this version MUST be incremented and a migration method
         //       MUST be supplied to match the new version number
-        protected const int CURRENT_VERSION = 22;
+        protected const int CURRENT_VERSION = 23;
         protected const int CURRENT_METADATA_VERSION = 4;
         
 #region Migration Driver
@@ -550,6 +550,17 @@
         
 #endregion
 
+#region Version 23
+
+        [DatabaseVersion (23)]
+        private bool Migrate_23 ()
+        {
+            Execute ("ALTER TABLE CoreTracks ADD COLUMN Score INTEGER DEFAULT 0");
+            return true;
+        }
+
+#endregion
+
 #pragma warning restore 0169
         
 #region Fresh database setup
@@ -629,6 +640,7 @@
 
                     Comment             TEXT,
                     Rating              INTEGER,
+                    Score               INTEGER,
                     PlayCount           INTEGER,
                     SkipCount           INTEGER,
                     LastPlayedStamp     INTEGER,
@@ -806,6 +818,7 @@
                         Genre,
                         NULL, NULL, NULL, NULL, NULL, NULL,
                         Rating,
+                        Score,
                         NumberOfPlays,
                         0,
                         LastPlayedStamp,
Index: src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs
===================================================================
--- src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs	(revision 4692)
+++ src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs	(working copy)
@@ -69,6 +69,9 @@
             CreateQueryOrder ("Rating",     desc, Catalog.GetString ("Highest Rating"), RatingField),
             CreateQueryOrder ("Rating",     asc,  Catalog.GetString ("Lowest Rating"), RatingField),
             null,
+            CreateQueryOrder ("Score",      desc, Catalog.GetString ("Highest Score"), ScoreField),
+            CreateQueryOrder ("Score",      asc,  Catalog.GetString ("Lowest Score"), ScoreField),
+            null,
             CreateQueryOrder ("PlayCount",  desc, Catalog.GetString ("Most Often Played"), PlayCountField),
             CreateQueryOrder ("PlayCount",  asc,  Catalog.GetString ("Least Often Played"), PlayCountField),
             null,
@@ -309,6 +312,14 @@
             "CoreTracks.TrackID {2} IN (SELECT TrackID FROM CoreSmartPlaylistEntries WHERE SmartPlaylistID = {1})", typeof(SmartPlaylistQueryValue),
             "smartplaylistid", "smartplaylist"
         );
+
+        public static QueryField ScoreField = new QueryField (
+            "score", "Score", 
+            Catalog.GetString ("Score"), "CoreTracks.Score", typeof(IntegerQueryValue),
+            //Translators: These are unique search fields (and nouns). Please, no spaces. Blank ok.
+            Catalog.GetString ("score"),
+            "score"
+        );
         
 #endregion
 
@@ -316,7 +327,7 @@
             ArtistField, AlbumField, AlbumArtistField, TitleField, TrackNumberField, TrackCountField, DiscNumberField, DiscCountField,
             YearField, GenreField, ComposerField, ConductorField, GroupingField, CommentField, RatingField, PlayCountField,
             SkipCountField, FileSizeField, UriField, DurationField, MimeTypeField, LastPlayedField, LastSkippedField,
-            BpmField, BitRateField, DateAddedField, PlaylistField, SmartPlaylistField
+            BpmField, BitRateField, DateAddedField, PlaylistField, SmartPlaylistField, ScoreField
         );
 
         // Type Initializer
@@ -411,6 +422,7 @@
                 case "genre":
                 case "duration":
                 case "rating":
+                case "score":
                 case "playcount":
                 case "skipcount":
                 case "filesize":
Index: src/Core/Banshee.Services/Banshee.SmartPlaylist/Migrator.cs
===================================================================
--- src/Core/Banshee.Services/Banshee.SmartPlaylist/Migrator.cs	(revision 4692)
+++ src/Core/Banshee.Services/Banshee.SmartPlaylist/Migrator.cs	(working copy)
@@ -92,6 +92,8 @@
             order_hash.Add ("Title",                BansheeQuery.FindOrder ("Title", true));
             order_hash.Add ("Rating DESC",          BansheeQuery.FindOrder ("Rating", false));
             order_hash.Add ("Rating ASC",           BansheeQuery.FindOrder ("Rating", true));
+            order_hash.Add ("Score DESC",           BansheeQuery.FindOrder ("Score", false));
+            order_hash.Add ("Score ASC",            BansheeQuery.FindOrder ("Score", true));
             order_hash.Add ("NumberOfPlays DESC",   BansheeQuery.FindOrder ("PlayCount", false));
             order_hash.Add ("NumberOfPlays ASC",    BansheeQuery.FindOrder ("PlayCount", true));
             order_hash.Add ("DateAddedStamp DESC",  BansheeQuery.FindOrder ("DateAddedStamp", false));
Index: src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs
===================================================================
--- src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs	(revision 4692)
+++ src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs	(working copy)
@@ -87,6 +87,7 @@
         private int disc_count;
         private int year;
         private int rating;
+        private int score;
         private int bpm;
         private int bit_rate;
 
@@ -109,6 +110,12 @@
         public virtual void IncrementPlayCount ()
         {
             LastPlayed = DateTime.Now;
+            int total_plays = PlayCount + SkipCount;
+            if (total_plays <= 0){
+                Score = ((Score + 100) / 2);
+            } else {
+                Score = (int) Math.Ceiling((((double)Score * (double)total_plays) + 100.0) / (double)(total_plays + 1));
+            }
             PlayCount++;
             OnPlaybackFinished (1.0);
         }
@@ -116,6 +123,16 @@
         public virtual void IncrementSkipCount ()
         {
             LastSkipped = DateTime.Now;
+            int total_plays = PlayCount + SkipCount;
+            if (total_plays <= 0) {
+                Score = ((Score + 1) / 2);
+            } else {
+                Score = (int) Math.Floor((((double)Score * (double)total_plays) + 1.0) / (double)(total_plays + 1));
+            }
+
+            if (Score < 1) {
+                Score = 1;
+            }
             SkipCount++;
             OnPlaybackFinished (0.0);
         }
@@ -374,6 +391,12 @@
         }
         
         [Exportable]
+        public virtual int Score {
+            get { return score; }
+            set {score = value; }
+        }
+        
+        [Exportable]
         public virtual int Bpm {
             get { return bpm; }
             set { bpm = value; }
