diff --git a/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseTrackListModel.cs b/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseTrackListModel.cs
index e2c948b..c27e074 100644
--- a/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseTrackListModel.cs
+++ b/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseTrackListModel.cs
@@ -159,6 +159,13 @@ namespace Banshee.Collection.Database
             return true;
         }
 
+        public void Resort ()
+        {
+            var column = sort_column;
+            sort_column = null;
+            Sort (column);
+        }
+
         private void HandleCacheAggregatesUpdated (IDataReader reader)
         {
             filtered_duration = TimeSpan.FromMilliseconds (reader.IsDBNull (1) ? 0 : Convert.ToInt64 (reader[1]));
diff --git a/src/Core/Banshee.Services/Banshee.Library/LibrarySchema.cs b/src/Core/Banshee.Services/Banshee.Library/LibrarySchema.cs
index a95ee1a..22b540a 100644
--- a/src/Core/Banshee.Services/Banshee.Library/LibrarySchema.cs
+++ b/src/Core/Banshee.Services/Banshee.Library/LibrarySchema.cs
@@ -85,5 +85,12 @@ namespace Banshee.Configuration.Schema
             "Store ratings within supported files",
             "If enabled, rating and playcount metadata will be written back to audio files."
         );
+
+        public static readonly SchemaEntry<bool> SortByAlbumYear = new SchemaEntry<bool>(
+            "library", "sort_albums_by_year",
+            false,
+            "Sort tracks by album year",
+            "If set the tracks will be sorted by album year instead of by album name"
+        );
     }
 }
diff --git a/src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs b/src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs
index 9c39611..053c854 100644
--- a/src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs
+++ b/src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs
@@ -72,7 +72,16 @@ namespace Banshee.Library
 
             SetFileNamePattern (MusicFileNamePattern);
 
-            PreferencesPage.Add (new Section ("misc", Catalog.GetString ("Miscellaneous"), 10));
+            Section misc = PreferencesPage.Add (new Section ("misc",
+                Catalog.GetString ("Miscellaneous"), 10));
+
+            misc.Add (new SchemaPreference<bool> (LibrarySchema.SortByAlbumYear,
+                Catalog.GetString ("_Sort an artist's albums by year, not title"), null,
+                delegate {
+                    DatabaseTrackModel.Resort ();
+                    DatabaseTrackModel.Reload ();
+                }
+            ));
         }
 
         public static string GetDefaultBaseDirectory ()
diff --git a/src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs b/src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs
index a4c8485..11ead10 100644
--- a/src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs
+++ b/src/Core/Banshee.Services/Banshee.Query/BansheeQuery.cs
@@ -356,7 +356,24 @@ namespace Banshee.Query
             PlayCountField.ShortLabel   = Catalog.GetString ("Plays");
         }
 
-        private const string default_sort = @"CoreAlbums.ArtistNameSortKey ASC, CoreAlbums.TitleSortKey ASC, CoreTracks.Disc ASC, CoreTracks.TrackNumber ASC";
+        private const string default_sort_template = @"CoreAlbums.ArtistNameSortKey ASC, {0}CoreAlbums.TitleSortKey ASC, CoreTracks.Disc ASC, CoreTracks.TrackNumber ASC";
+        private static string default_sort;
+        private static string default_sort_by_year;
+        private static string GetDefaultSort (bool sort_by_year)
+        {
+            if (sort_by_year) {
+                if (default_sort_by_year == null) {
+                    default_sort_by_year = String.Format (default_sort_template, "CoreTracks.Year ASC, ");
+                }
+                return default_sort_by_year;
+            }
+
+            if (default_sort == null) {
+                default_sort = String.Format (default_sort_template, "");
+            }
+            return default_sort;
+        }
+
         public static string GetSort (string key)
         {
             return GetSort (key, false);
@@ -364,6 +381,10 @@ namespace Banshee.Query
 
         public static string GetSort (string key, bool asc)
         {
+            bool sort_by_year = Banshee.Configuration.Schema.LibrarySchema.SortByAlbumYear.Get ();
+            string sort_by_year_part = sort_by_year ? "CoreTracks.Year ASC," : "";
+            string sort = GetDefaultSort (sort_by_year);
+
             string ascDesc = asc ? "ASC" : "DESC";
             string sort_query = null;
             // TODO use the QueryFields here instead of matching on a string key
@@ -373,39 +394,44 @@ namespace Banshee.Query
                 case "grouping":
                     sort_query = String.Format (@"
                         CoreAlbums.ArtistNameSortKey ASC,
+                        {1}
                         CoreAlbums.TitleSortKey ASC,
                         CoreTracks.Disc ASC,
-                        CoreTracks.TrackNumber {0}", ascDesc);
+                        CoreTracks.TrackNumber {0}", ascDesc, sort_by_year_part);
                     break;
 
                 case "albumartist":
                     sort_query = String.Format (@"
                         CoreAlbums.ArtistNameSortKey {0},
+                        {1}
                         CoreAlbums.TitleSortKey ASC,
                         CoreTracks.Disc ASC,
-                        CoreTracks.TrackNumber ASC", ascDesc);
+                        CoreTracks.TrackNumber ASC", ascDesc, sort_by_year_part);
                     break;
 
                 case "artist":
                     sort_query = String.Format (@"
                         CoreArtists.NameSortKey {0},
+                        {1}
                         CoreAlbums.TitleSortKey ASC,
                         CoreTracks.Disc ASC,
-                        CoreTracks.TrackNumber ASC", ascDesc);
+                        CoreTracks.TrackNumber ASC", ascDesc, sort_by_year_part);
                     break;
 
                 case "album":
                     sort_query = String.Format (@"
                         CoreAlbums.TitleSortKey {0},
+                        {1}
                         CoreTracks.Disc ASC,
-                        CoreTracks.TrackNumber ASC", ascDesc);
+                        CoreTracks.TrackNumber ASC", ascDesc, sort_by_year_part);
                     break;
 
                 case "title":
                     sort_query = String.Format (@"
                         CoreTracks.TitleSortKey {0},
                         CoreAlbums.ArtistNameSortKey ASC,
-                        CoreAlbums.TitleSortKey ASC", ascDesc);
+                        {1}
+                        CoreAlbums.TitleSortKey ASC", ascDesc, sort_by_year_part);
                     break;
 
                 case "random":
@@ -415,9 +441,10 @@ namespace Banshee.Query
                 case "disc":
                     sort_query = String.Format (@"
                         CoreAlbums.ArtistNameSortKey ASC,
+                        {1}
                         CoreAlbums.TitleSortKey ASC,
                         CoreTracks.Disc {0},
-                        CoreTracks.TrackNumber ASC", ascDesc);
+                        CoreTracks.TrackNumber ASC", ascDesc, sort_by_year_part);
                     break;
 
                 // FIXME hacks to aid in migration of these sort keys to actually
@@ -436,14 +463,14 @@ namespace Banshee.Query
                 case "comment":
                     sort_query = String.Format (
                         "HYENA_COLLATION_KEY(CoreTracks.{0}) {1}, {2}",
-                        column ?? key, ascDesc, default_sort
+                        column ?? key, ascDesc, sort
                     );
                     break;
 
                 case "score":
                     sort_query = String.Format (@"
                         CoreTracks.Score {0},
-                        CoreTracks.Playcount {0}, {1}", ascDesc, default_sort);
+                        CoreTracks.Playcount {0}, {1}", ascDesc, sort);
                     break;
 
                 case "year":
@@ -464,7 +491,7 @@ namespace Banshee.Query
                 case "licenseuri":
                     sort_query = String.Format (
                         "CoreTracks.{0} {1}, {2}",
-                        column ?? key, ascDesc, default_sort
+                        column ?? key, ascDesc, sort
                     );
                     break;
                 default:
