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

+        public int Disc;
         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;
+            Disc = track.Disc;
             TrackNumber = track.TrackNumber;
             TrackCount = track.TrackCount;
             Year = track.Year;
@@ -94,6 +96,7 @@
             track.AlbumTitle = AlbumTitle;
             track.TrackTitle = TrackTitle;
             track.Genre = Genre;
+            track.Disc = Disc;
             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 DiscSync;
         [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 Disc;
         [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;
+            DiscSync.Clicked += OnDiscSyncClicked;
             YearSync.Clicked += OnYearSyncClicked;
             SyncAll.Clicked += OnSyncAllClicked;
             RatingSync.Clicked += OnRatingSyncClicked;
@@ -191,6 +197,7 @@
             Title.Activated += OnTitleActivated;
             Year.Changed += OnValueEdited;
             Genre.Entry.Changed += OnValueEdited;
+            Disc.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;
+            DiscSync.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(DiscSync, 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;
+            Disc.Text = track.Disc.ToString();
             Year.Text = track.Year.ToString();
             rating_entry.Value = (int)track.Rating;

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

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

             return track;
         }
Index: src/Core/Banshee.Services/Banshee.Collection.Database/LibraryTrackInfo.cs
===================================================================
--- src/Core/Banshee.Services/Banshee.Collection.Database/LibraryTrackInfo.cs	(revision 3107)
+++ src/Core/Banshee.Services/Banshee.Collection.Database/LibraryTrackInfo.cs	(working copy)
@@ -186,6 +186,9 @@
         }

         [DatabaseColumn]
+        public override int Disc {
+            get { return base.Disc; }
+            set { base.Disc = value; }
         }

         [DatabaseColumn("Duration")]
Index: src/Core/Banshee.Services/Banshee.Collection.Database/TrackListDatabaseModel.cs
===================================================================
--- src/Core/Banshee.Services/Banshee.Collection.Database/TrackListDatabaseModel.cs	(revision 3107)
+++ 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.Disc 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,
+                        CoreTracks.Disc 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.Disc ASC,
                         CoreTracks.TrackNumber ASC,
                         CoreTracks.Uri ASC", ascDesc); 
                     break;
@@ -166,6 +168,7 @@
                     break;

                 case "Year":
+                case "Disc":
                 case "Duration":
                 case "Rating":
                 case "PlayCount":
@@ -460,6 +463,12 @@
                 "on", "album", "from", "albumtitle"
             ),
             new QueryField (
+                "disc", Catalog.GetString ("Disc"), "CoreTracks.Disc", typeof(IntegerQueryValue),
+                // Translators: These are unique search fields.  Please, no spaces. Blank ok.
+                Catalog.GetString ("disc"), Catalog.GetString ("cd"), Catalog.GetString ("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.Collection/FileTrackInfo.cs
===================================================================
--- src/Core/Banshee.Core/Banshee.Collection/FileTrackInfo.cs	(revision 3107)
+++ src/Core/Banshee.Core/Banshee.Collection/FileTrackInfo.cs	(working copy)
@@ -54,6 +54,7 @@
             AlbumTitle = Choose(file.Tag.Album, AlbumTitle);
             TrackTitle = Choose(file.Tag.Title, TrackTitle);
             Genre = Choose(file.Tag.FirstGenre, Genre);
+            Disc = file.Tag.Disc == 0 ? (int)Disc : (int)file.Tag.Disc;
             TrackNumber = file.Tag.Track == 0 ? (int)TrackNumber : (int)file.Tag.Track;
             TrackCount = file.Tag.TrackCount == 0 ? (int)TrackCount : (int)file.Tag.TrackCount;
             Duration = file.Properties.Duration;
Index: src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs
===================================================================
--- src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs	(revision 3107)
+++ src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs	(working copy)
@@ -51,6 +51,7 @@

         private int track_number;
         private int track_count;
+        private int disc;
         private int year;
         private int rating;

@@ -176,6 +176,9 @@
             set { track_count = value; }
         }

+        public virtual int Disc {
+            get { return disc; }
+            set { disc = value; }
         }

         public virtual int Year {
@@ -249,6 +249,7 @@
             // Our own
             dict.Add ("track-number", TrackNumber);
             dict.Add ("track-count", TrackCount);
+            dict.Add ("disc", Disc);
             dict.Add ("year", year);
             dict.Add ("rating", rating);

Index: src/Core/Banshee.Core/Banshee.Streaming/StreamTagger.cs
===================================================================
--- src/Core/Banshee.Core/Banshee.Streaming/StreamTagger.cs	(revision 3107)
+++ 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.Disc = file.Tag.Disc == 0 ? track.Disc : (int)file.Tag.Disc;
             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.Disc:
+                        int disc = (int)tag.Value;
+                        track.Disc = disc == 0 ? track.Disc : disc;
+                        break;
                     case CommonTags.Genre:
                         track.Genre = Choose((string)tag.Value, track.Genre);
                         break;
Index: src/Core/Banshee.Core/Banshee.Streaming/CommonTags.cs
===================================================================
--- src/Core/Banshee.Core/Banshee.Streaming/CommonTags.cs	(revision 3107)
+++ src/Core/Banshee.Core/Banshee.Streaming/CommonTags.cs	(working copy)
@@ -37,6 +37,7 @@
         public const string Album             = "album";
         public const string Date              = "date";
         public const string Genre             = "genre";
+        public const string Disc              = "disc";
         public const string Comment           = "comment";
         public const string TrackNumber       = "track-number";
         public const string TrackCount        = "track-count";