diff --git a/src/Clients/Booter/Booter/Entry.cs b/src/Clients/Booter/Booter/Entry.cs
index 04f26f5..e2bc6e8 100644
--- a/src/Clients/Booter/Booter/Entry.cs
+++ b/src/Clients/Booter/Booter/Entry.cs
@@ -187,7 +187,8 @@ namespace Booter
                     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"),
diff --git a/src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs b/src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs
index e464b72..fe56afb 100644
--- a/src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs
+++ b/src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs
@@ -57,7 +57,7 @@ namespace Banshee.Collection
         public delegate bool IsPlayingHandler (TrackInfo track);
         public static IsPlayingHandler IsPlayingMethod;
 
-        public delegate void PlaybackFinishedHandler (TrackInfo track, double percentComplete);
+        public delegate void PlaybackFinishedHandler (TrackInfo track, double percentCompleted);
         public static event PlaybackFinishedHandler PlaybackFinished;
             
         private SafeUri uri;
@@ -90,6 +90,7 @@ namespace Banshee.Collection
         private int disc_count;
         private int year;
         private int rating;
+        private int score;
         private int bpm;
         private int bit_rate;
 
@@ -109,25 +110,25 @@ namespace Banshee.Collection
         {
         }
 
-        public virtual void IncrementPlayCount ()
+        public virtual void OnPlaybackFinished (double percentCompleted)
         {
-            LastPlayed = DateTime.Now;
-            PlayCount++;
-            OnPlaybackFinished (1.0);
-        }
-
-        public virtual void IncrementSkipCount ()
-        {
-            LastSkipped = DateTime.Now;
-            SkipCount++;
-            OnPlaybackFinished (0.0);
-        }
+            double total_plays = PlayCount + SkipCount;
+            if (total_plays <= 0) {
+                Score = (int) Math.Floor ((Score + (percentCompleted * 100)) / 2);
+            } else {
+                Score = (int) Math.Floor ((((double)Score * total_plays) + (percentCompleted * 100)) / (total_plays + 1));
+            }
+            if (percentCompleted <= 0.5) {
+                LastSkipped = DateTime.Now;
+                SkipCount++;
+            } else {
+                LastPlayed = DateTime.Now;
+                PlayCount++;
+            }
 
-        private void OnPlaybackFinished (double percentComplete)
-        {
             PlaybackFinishedHandler handler = PlaybackFinished;
             if (handler != null) {
-                handler (this, percentComplete);
+                handler (this, percentCompleted);
             }
         }
 
@@ -411,6 +412,12 @@ namespace Banshee.Collection
         }
         
         [Exportable]
+        public virtual int Score {
+            get { return score; }
+            set {score = value; }
+        }
+
+        [Exportable]
         public virtual int Bpm {
             get { return bpm; }
             set { bpm = value; }
diff --git a/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseTrackInfo.cs b/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseTrackInfo.cs
index f1abeea..c9bb9d0 100644
--- a/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseTrackInfo.cs
+++ b/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseTrackInfo.cs
@@ -78,19 +78,12 @@ namespace Banshee.Collection.Database
             Provider.Copy (original, this);
         }
 
-        public override void IncrementPlayCount ()
+        public override void OnPlaybackFinished (double percentCompleted)
         {
-            if (ProviderRefresh ()) {
-                base.IncrementPlayCount ();
-                Save (true, BansheeQuery.PlayCountField, BansheeQuery.LastPlayedField);
-            }
-        }
-
-        public override void IncrementSkipCount ()
-        {
-            if (ProviderRefresh ()) {
-                base.IncrementSkipCount ();
-                Save (true, BansheeQuery.SkipCountField, BansheeQuery.LastSkippedField);
+            if (ProviderRefresh()) {
+                base.OnPlaybackFinished (percentCompleted);
+                Save (true, BansheeQuery.ScoreField, BansheeQuery.SkipCountField, BansheeQuery.LastSkippedField, 
+                    BansheeQuery.PlayCountField, BansheeQuery.LastPlayedField);
             }
         }
 
@@ -568,6 +561,12 @@ namespace Banshee.Collection.Database
             set { rating = value; }
         }
 
+        [DatabaseColumn]
+        public override int Score {
+            get { return base.Score; }
+            set { base.Score = value; }
+        }
+
         public int SavedRating {
             get { return rating; }
             set {
diff --git a/src/Core/Banshee.Services/Banshee.Database/BansheeDbFormatMigrator.cs b/src/Core/Banshee.Services/Banshee.Database/BansheeDbFormatMigrator.cs
index 9144763..62fe17f 100644
--- a/src/Core/Banshee.Services/Banshee.Database/BansheeDbFormatMigrator.cs
+++ b/src/Core/Banshee.Services/Banshee.Database/BansheeDbFormatMigrator.cs
@@ -52,7 +52,7 @@ namespace Banshee.Database
         // 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 = 25;
+        protected const int CURRENT_VERSION = 26;
         protected const int CURRENT_METADATA_VERSION = 5;
         
 #region Migration Driver
@@ -592,6 +592,17 @@ namespace Banshee.Database
         
 #endregion
 
+#region Version 26
+
+        [DatabaseVersion (26)]
+        private bool Migrate_26 ()
+        {
+            Execute ("ALTER TABLE CoreTracks ADD COLUMN Score INTEGER DEFAULT 0");
+            return true;
+        }
+
+#endregion
+
 #pragma warning restore 0169
         
 #region Fresh database setup
@@ -673,6 +684,7 @@ namespace Banshee.Database
 
                     Comment             TEXT,
                     Rating              INTEGER,
+                    Score               INTEGER,
                     PlayCount           INTEGER,
                     SkipCount           INTEGER,
                     LastPlayedStamp     INTEGER,
@@ -856,6 +868,7 @@ namespace Banshee.Database
                         Genre,
                         NULL, NULL, NULL, NULL, NULL, NULL,
                         Rating,
+                        0,
                         NumberOfPlays,
                         0,
                         LastPlayedStamp,
diff --git a/src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngineService.cs b/src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngineService.cs
index d7517cf..b8a2a12 100644
--- a/src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngineService.cs
+++ b/src/Core/Banshee.Services/Banshee.MediaEngine/PlayerEngineService.cs
@@ -337,12 +337,11 @@ namespace Banshee.MediaEngine
         public void IncrementLastPlayed ()
         {
             if (!incremented_last_played && CurrentTrack != null && CurrentTrack.PlaybackError == StreamPlaybackError.None) {
-                // If we're at least 50% done playing a song, mark it as played, otherwise as skipped
-                // If the Length <= 0, assume the song was finished and increment its play count
-                if (active_engine.Length <= 0 || active_engine.Position >= active_engine.Length / 2) {
-                    CurrentTrack.IncrementPlayCount ();
+                //if Length <= 0 assume 100% completion:
+                if (active_engine.Length <= 0) {
+                    CurrentTrack.OnPlaybackFinished (1);
                 } else {
-                    CurrentTrack.IncrementSkipCount ();
+                    CurrentTrack.OnPlaybackFinished ((double)active_engine.Position / (double)active_engine.Length);
                 }
                 incremented_last_played = true;
             }
diff --git a/src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs b/src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs
index d47c2cb..0c7ec95 100644
--- a/src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs
+++ b/src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs
@@ -69,6 +69,9 @@ namespace Banshee.Query
             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,
@@ -318,6 +321,14 @@ namespace Banshee.Query
             "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
 
@@ -325,7 +336,7 @@ namespace Banshee.Query
             ArtistField, AlbumField, AlbumArtistField, TitleField, TrackNumberField, TrackCountField, DiscNumberField, DiscCountField,
             YearField, GenreField, ComposerField, ConductorField, GroupingField, CommentField, LicenseUriField, RatingField, PlayCountField,
             SkipCountField, FileSizeField, UriField, DurationField, MimeTypeField, LastPlayedField, LastSkippedField,
-            BpmField, BitRateField, DateAddedField, PlaylistField, SmartPlaylistField
+            BpmField, BitRateField, DateAddedField, PlaylistField, SmartPlaylistField, ScoreField
         );
 
         // Type Initializer
@@ -428,6 +439,7 @@ namespace Banshee.Query
                 case "disccount":
                 case "duration":
                 case "rating":
+                case "score":
                 case "playcount":
                 case "skipcount":
                 case "filesize":
diff --git a/src/Core/Banshee.Services/Banshee.SmartPlaylist/Migrator.cs b/src/Core/Banshee.Services/Banshee.SmartPlaylist/Migrator.cs
index 7ba0785..7a208f9 100644
--- a/src/Core/Banshee.Services/Banshee.SmartPlaylist/Migrator.cs
+++ b/src/Core/Banshee.Services/Banshee.SmartPlaylist/Migrator.cs
@@ -92,6 +92,8 @@ namespace Banshee.SmartPlaylist
             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));
diff --git a/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/DefaultColumnController.cs b/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/DefaultColumnController.cs
index 324bc9e..4688905 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/DefaultColumnController.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/DefaultColumnController.cs
@@ -72,6 +72,7 @@ namespace Banshee.Collection.Gui
                 AlbumColumn,
                 CommentColumn,
                 RatingColumn,
+                ScoreColumn,
                 DurationColumn,
                 GenreColumn,
                 YearColumn,
@@ -132,6 +133,7 @@ namespace Banshee.Collection.Gui
             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);
@@ -253,6 +255,11 @@ namespace Banshee.Collection.Gui
             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; }
diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs b/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs
index 481501b..21cb7d5 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/StatisticsPage.cs
@@ -158,6 +158,7 @@ namespace Banshee.Gui.TrackEditor
                 ? 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)
diff --git a/src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmTrackInfo.cs b/src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmTrackInfo.cs
index 885958a..44e22e7 100644
--- a/src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmTrackInfo.cs
+++ b/src/Extensions/Banshee.Lastfm/Banshee.Lastfm.Radio/LastfmTrackInfo.cs
@@ -80,16 +80,16 @@ namespace Banshee.Lastfm.Radio
             CanSaveToDatabase = false;
         }
 
-        public override void IncrementPlayCount ()
+        public override void OnPlaybackFinished (double percentCompleted)
         {
-            base.IncrementPlayCount ();
+            base.OnPlaybackFinished (percentCompleted);
 
             station.PlayCount++;
             station.Save ();
         }
 
-		public void Love () 
-		{
+        public void Love ()
+        {
             loved = true; hated = false;
             ThreadAssist.Spawn (delegate {
                 try {
@@ -98,10 +98,10 @@ namespace Banshee.Lastfm.Radio
                     Hyena.Log.Warning ("Got Exception Trying to Love Song", e.ToString (), false);
                 }
             });
-		}
+        }
 
-		public void Ban () 
-		{
+        public void Ban ()
+        {
             loved = false; hated = true;
             ThreadAssist.Spawn (delegate {
                 try {
@@ -110,6 +110,6 @@ namespace Banshee.Lastfm.Radio
                     Hyena.Log.Warning ("Got Exception Trying to Ban Song", e.ToString (), false);
                 }
             });
-		}
+        }
     }
 }
diff --git a/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastTrackInfo.cs b/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastTrackInfo.cs
index bd527bd..410c804 100644
--- a/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastTrackInfo.cs
+++ b/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastTrackInfo.cs
@@ -179,9 +179,9 @@ namespace Banshee.Podcasting.Data
             TrackInfo.PlaybackFinished += OnPlaybackFinished;
         }
 
-        private static void OnPlaybackFinished (TrackInfo track, double percentComplete)
+        private static void OnPlaybackFinished (TrackInfo track, double percentCompleted)
         {
-            if (percentComplete > 0.5 && track.PlayCount > 0) {
+            if (percentCompleted > 0.5 && track.PlayCount > 0) {
                 PodcastTrackInfo pi = PodcastTrackInfo.From (track);
                 if (pi != null && !pi.Item.IsRead) {
                     pi.Item.IsRead = true;
