Index: src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/TrackEditor.cs
===================================================================
--- src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/TrackEditor.cs	(revision 3103)
+++ src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/TrackEditor.cs	(working copy)
@@ -53,6 +53,7 @@
         public string Genre;
         public SafeUri Uri;

+        public int DiscNumber;
         public int TrackNumber;
         public int TrackCount;
         public int Year;
@@ -81,6 +82,7 @@
             AlbumTitle = track.AlbumTitle == null ? String.Empty : track.AlbumTitle;
             TrackTitle = track.TrackTitle == null ? String.Empty : track.TrackTitle;
             Genre = track.Genre == null ? String.Empty : track.Genre;
+            DiscNumber = track.DiscNumber;
             TrackNumber = track.TrackNumber;
             TrackCount = track.TrackCount;
             Year = track.Year;
@@ -94,6 +96,7 @@
             track.AlbumTitle = AlbumTitle;
             track.TrackTitle = TrackTitle;
             track.Genre = Genre;
+            track.DiscNumber = DiscNumber;
             track.TrackNumber = TrackNumber;
             track.TrackCount = TrackCount;
             track.Uri = Uri;
@@ -118,6 +121,7 @@
         [Widget] private Button AlbumSync;
         [Widget] private Button YearSync;
         [Widget] private Button GenreSync;
+        [Widget] private Button DiscNumberSync;
         [Widget] private Button RatingSync;
         [Widget] private Button EnterNextTitle;
         [Widget] private SpinButton TrackCount;
@@ -127,6 +131,7 @@
         [Widget] private Entry Album;
         [Widget] private Entry Title;
         [Widget] private ComboBoxEntry Genre;
+        [Widget] private Entry DiscNumber;
         [Widget] private Entry Uri;
         [Widget] private Entry Location;
         [Widget] private Label BitRate;
@@ -179,6 +184,7 @@
             ArtistSync.Clicked += OnArtistSyncClicked;
             AlbumSync.Clicked += OnAlbumSyncClicked;
             GenreSync.Clicked += OnGenreSyncClicked;
+            DiscNumberSync.Clicked += OnDiscNumberSyncClicked;
             YearSync.Clicked += OnYearSyncClicked;
             SyncAll.Clicked += OnSyncAllClicked;
             RatingSync.Clicked += OnRatingSyncClicked;
@@ -191,6 +197,7 @@
             Title.Activated += OnTitleActivated;
             Year.Changed += OnValueEdited;
             Genre.Entry.Changed += OnValueEdited;
+            DiscNumber.Entry.Changed += OnValueEdited;
             rating_entry.Changed += OnValueEdited;

             ListStore genre_model = new ListStore(typeof(string));
@@ -211,6 +218,7 @@
             ArtistSync.Visible = TrackSet.Count > 1;
             AlbumSync.Visible = TrackSet.Count > 1;
             GenreSync.Visible = TrackSet.Count > 1;
+            DiscNumberSync.Visible = TrackSet.Count > 1;
             YearSync.Visible = TrackSet.Count > 1;
             RatingSync.Visible = TrackSet.Count > 1;
             EnterNextTitle.Visible = TrackSet.Count > 1;
@@ -223,6 +231,7 @@
             tips.SetTip(ArtistSync, Catalog.GetString("Set all artists to this value"), "artists");
             tips.SetTip(AlbumSync, Catalog.GetString("Set all albums to this value"), "albums");
             tips.SetTip(GenreSync, Catalog.GetString("Set all genres to this value"), "genres"); 
+            tips.SetTip(DiscNumberSync, Catalog.GetString("Set all disc numbers to this value"), "disc numbers");
             tips.SetTip(YearSync, Catalog.GetString("Set all years to this value"), "years");
             tips.SetTip(SyncAll, Catalog.GetString("Apply the values of this track set for the Artist, Album Title, Genre, Track count, Year, and Rating fields to the rest of the selected tracks in this editor."), "all");
             tips.SetTip(RatingSync, Catalog.GetString("Set all ratings to this value"), "ratings");
@@ -274,6 +283,7 @@

             TrackNumber.Value = track.TrackNumber;
             TrackCount.Value = track.TrackCount;
+            DiscNumber.Text = track.DiscNumber.ToString();
             Year.Text = track.Year.ToString();
             rating_entry.Value = (int)track.Rating;

@@ -449,6 +459,17 @@
                 }
             }
         }
+
+        private void OnDiscNumberSyncClicked(object o, EventArgs args)
+        {
+            foreach(EditorTrack track in TrackSet) {
+                try {
+                    track.DiscNumber = Convert.ToInt32(DiscNumber.Text);
+                } catch {
+                    track.DiscNumber = 1;
+                }
+            }
+        }

         private void OnArtistSyncClicked(object o, EventArgs args)
         {
@@ -468,6 +489,7 @@
         {
             OnTrackCountSyncClicked(o, args);
             OnGenreSyncClicked(o, args);
+            OnDiscNumberSyncClicked(o, args);
             OnAlbumSyncClicked(o, args);
             OnArtistSyncClicked(o, args);
             OnYearSyncClicked(o, args);
@@ -554,6 +576,12 @@
             } catch {
                 track.Year = 0;
             }
+
+            try {
+                track.DiscNumber = Convert.ToInt32(DiscNumber.Text);
+            } catch {
+                track.DiscNumber = 0;
+            }

             return track;
         }
Index: src/Core/Banshee.Services/Banshee.Collection.Database/TrackListDatabaseModel.cs
===================================================================
--- src/Core/Banshee.Services/Banshee.Collection.Database/TrackListDatabaseModel.cs	(revision 3103)
+++ src/Core/Banshee.Services/Banshee.Collection.Database/TrackListDatabaseModel.cs	(working copy)
@@ -126,7 +126,7 @@
             sort_query = GetSort (sort_column.SortKey, AscDesc ());
         }

-        private const string default_sort = "lower(CoreArtists.Name) ASC, lower(CoreAlbums.Title) ASC, CoreTracks.TrackNumber ASC, CoreTracks.Uri ASC";
+        private const string default_sort = "lower(CoreArtists.Name) ASC, lower(CoreAlbums.Title) ASC, CoreTracks.DiscNumber ASC, CoreTracks.TrackNumber ASC, CoreTracks.Uri ASC";
         public static string GetSort (string key, string ascDesc)
         {
             string sort_query = null;
@@ -141,7 +141,8 @@
                 case "Artist":
                     sort_query = String.Format (@"
                         lower(CoreArtists.Name) {0}, 
-                        lower(CoreAlbums.Title) ASC, 
+                        lower(CoreAlbums.Title) ASC,
+                        CoreTracks.DiscNumber ASC,
                         CoreTracks.TrackNumber ASC,
                         CoreTracks.Uri ASC", ascDesc); 
                     break;
@@ -150,6 +151,7 @@
                     sort_query = String.Format (@"
                         lower(CoreAlbums.Title) {0},
                         lower(CoreArtists.Name) ASC,
+                        CoreTracks.DiscNumber ASC,
                         CoreTracks.TrackNumber ASC,
                         CoreTracks.Uri ASC", ascDesc); 
                     break;
@@ -460,6 +462,12 @@
                 "on", "album", "from", "albumtitle"
             ),
             new QueryField (
+                "disc", Catalog.GetString ("Disc"), "CoreTracks.DiscNumber", true,
+                // Translators: These are unique search fields.  Please, no spaces. Blank ok.
+                Catalog.GetString ("disc"), Catalog.GetString ("cd"), CatalogGetString ("discnum"),
+                "disc", "cd", "discnum"
+            ),
+            new QueryField (
                 "title", Catalog.GetString ("Track Title"), "CoreTracks.Title", true,
                 // Translators: These are unique search fields.  Please, no spaces. Blank ok.
                 Catalog.GetString ("title"), Catalog.GetString ("titled"), Catalog.GetString ("name"), Catalog.GetString ("named"),
Index: src/Core/Banshee.Core/Banshee.Streaming/StreamTagger.cs
===================================================================
--- src/Core/Banshee.Core/Banshee.Streaming/StreamTagger.cs	(revision 3103)
+++ src/Core/Banshee.Core/Banshee.Streaming/StreamTagger.cs	(working copy)
@@ -58,6 +58,7 @@
             track.MimeType = file.MimeType;
             track.ArtistName = Choose(file.Tag.JoinedPerformers, track.ArtistName);
             track.AlbumTitle = Choose(file.Tag.Album, track.AlbumTitle);
+            track.DiscNumber = file.Tag.DiscNumber == 0 ? track.DiscNumber : (int)file.Tag.DiscNumber;
             track.TrackTitle = Choose(file.Tag.Title, track.TrackTitle);
             track.Genre = Choose(file.Tag.FirstGenre, track.Genre);
             track.TrackNumber = file.Tag.Track == 0 ? track.TrackNumber : (int)file.Tag.Track;
@@ -80,6 +81,10 @@
                     case CommonTags.Album:
                         track.AlbumTitle = Choose((string)tag.Value, track.AlbumTitle);
                         break;
+                    case CommonTags.DiscNumer:
+                      int disc_number = (int)tag.Value;
+                      track.DiscNumber = track_number == 0 ? track.DiscNumber : disc_number;
+                      break;
                     case CommonTags.Genre:
                         track.Genre = Choose((string)tag.Value, track.Genre);
                         break;