diff --git a/src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs b/src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs
index 0b0acdd..61dd4d8 100644
--- a/src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs
+++ b/src/Core/Banshee.Core/Banshee.Collection/TrackInfo.cs
@@ -478,6 +478,12 @@ namespace Banshee.Collection
             get { return can_play; }
             set { can_play = value; }
         }
+
+        private bool enabled = true;
+        public bool Enabled {
+            get { return enabled && can_play; }
+            set { enabled = value; }
+        }
         
         public virtual string MetadataHash {
             get {
diff --git a/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/BaseTrackListView.cs b/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/BaseTrackListView.cs
index 50b5690..193bac9 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/BaseTrackListView.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/BaseTrackListView.cs
@@ -48,7 +48,7 @@ namespace Banshee.Collection.Gui
         public BaseTrackListView () : base ()
         {
             RulesHint = true;
-            RowSensitivePropertyName = "CanPlay";
+            RowOpaquePropertyName = "Enabled";
             RowBoldPropertyName = "IsPlaying";
             
             ServiceManager.PlayerEngine.ConnectEvent (OnPlayerEvent, PlayerEvent.StateChange);
diff --git a/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellCreativeCommons.cs b/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellCreativeCommons.cs
index 6912b74..170e473 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellCreativeCommons.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellCreativeCommons.cs
@@ -86,14 +86,14 @@ namespace Banshee.Collection.Gui
                     Cairo.Rectangle pixbuf_area = new Cairo.Rectangle (draw_x,
                         (cellHeight - render_pixbuf.Height) / 2, render_pixbuf.Width, render_pixbuf.Height);
                     
-                    if (!context.Sensitive) {
+                    if (!context.Opaque) {
                         context.Context.Save ();
                     }
                     
                     Gdk.CairoHelper.SetSourcePixbuf (context.Context, render_pixbuf, pixbuf_area.X, pixbuf_area.Y);
                     context.Context.Rectangle (pixbuf_area);
                     
-                    if (!context.Sensitive) {
+                    if (!context.Opaque) {
                         context.Context.Clip ();
                         context.Context.PaintWithAlpha (0.5);
                         context.Context.Restore ();
diff --git a/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellStatusIndicator.cs b/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellStatusIndicator.cs
index aeac5b3..07ed06b 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellStatusIndicator.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellStatusIndicator.cs
@@ -142,14 +142,14 @@ namespace Banshee.Collection.Gui
             Cairo.Rectangle pixbuf_area = new Cairo.Rectangle ((cellWidth - render_pixbuf.Width) / 2, 
                 (cellHeight - render_pixbuf.Height) / 2, render_pixbuf.Width, render_pixbuf.Height);
             
-            if (!context.Sensitive) {
+            if (!context.Opaque) {
                 context.Context.Save ();
             }
             
             Gdk.CairoHelper.SetSourcePixbuf (context.Context, render_pixbuf, pixbuf_area.X, pixbuf_area.Y);
             context.Context.Rectangle (pixbuf_area);
             
-            if (!context.Sensitive) {
+            if (!context.Opaque) {
                 context.Context.Clip ();
                 context.Context.PaintWithAlpha (0.5);
                 context.Context.Restore ();
diff --git a/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellTrack.cs b/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellTrack.cs
index 226f55f..31783cf 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellTrack.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/ColumnCellTrack.cs
@@ -81,7 +81,7 @@ namespace Banshee.Collection.Gui
             context.Context.MoveTo (4, ((int)cellHeight - text_height) / 2);
             Cairo.Color color = context.Theme.Colors.GetWidgetColor (
                 context.TextAsForeground ? GtkColorClass.Foreground : GtkColorClass.Text, state);
-            color.A = (!context.Sensitive) ? 0.3 : 1.0;
+            color.A = (!context.Opaque) ? 0.3 : 1.0;
             context.Context.Color = color;
             
             PangoCairoHelper.ShowLayout (context.Context, context.Layout);
diff --git a/src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue.csproj b/src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue.csproj
index f9905d3..6dd6773 100644
--- a/src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue.csproj
+++ b/src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue.csproj
@@ -47,6 +47,7 @@
     <Compile Include="Banshee.PlayQueue\PlayQueueSource.cs" />
     <Compile Include="Banshee.PlayQueue\PlayQueueActions.cs" />
     <Compile Include="Banshee.PlayQueue\IPlayQueue.cs" />
+    <Compile Include="Banshee.PlayQueue\ConfigurationPane.cs" />
   </ItemGroup>
   <ItemGroup>
     <EmbeddedResource Include="Resources\ActiveSourceUI.xml">
diff --git a/src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/ConfigurationPane.cs b/src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/ConfigurationPane.cs
new file mode 100644
index 0000000..79a0344
--- /dev/null
+++ b/src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/ConfigurationPane.cs
@@ -0,0 +1,63 @@
+//
+// ConfigurationPane.cs
+//
+// Author:
+//   Alexander Kojevnikov <alexander@kojevnikov.com>
+//
+// Copyright (C) 2009 Alexander Kojevnikov
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using Gtk;
+using Mono.Unix;
+
+namespace Banshee.PlayQueue
+{
+    public class ConfigurationPane : Hyena.Widgets.RoundedFrame
+    {
+        private HBox main_box;
+
+        public ConfigurationPane () : base ()
+        {
+            main_box = new HBox ();
+            main_box.BorderWidth = 5;
+
+            // Translators: this label will be part of the following sentense: "Display: X recently played songs"
+            Label display_label = new Label (Catalog.GetString ("Display:"));
+
+            SpinButton played_songs_spin_button = new SpinButton (0, 100, 1);
+            played_songs_spin_button.Value = PlayQueueSource.PlayedSongsNumber;
+            played_songs_spin_button.ValueChanged += delegate {
+                PlayQueueSource.PlayedSongsNumber = (int) played_songs_spin_button.Value;
+            };
+
+            // Translators: this label will be part of the following sentense: "Display: X recently played songs"
+            Label played_songs_label = new Label (Catalog.GetString ("_recently played songs"));
+            played_songs_label.MnemonicWidget = played_songs_spin_button;
+
+            main_box.PackStart (display_label, false, false, 0);
+            main_box.PackStart (played_songs_spin_button, false, false, 5);
+            main_box.PackStart (played_songs_label, false, false, 0);
+
+            Add (main_box);
+        }
+    }
+}
diff --git a/src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs b/src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs
index d2e1dc9..94f5f05 100644
--- a/src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs
+++ b/src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs
@@ -1,10 +1,11 @@
 //
 // PlayQueueSource.cs
 //
-// Author:
+// Authors:
 //   Aaron Bockover <abockover@novell.com>
+//   Alexander Kojevnikov <alexander@kojevnikov.com>
 //
-// Copyright (C) 2008 Novell, Inc.
+// Copyright (C) 2008-2009 Novell, Inc.
 //
 // Permission is hereby granted, free of charge, to any person obtaining
 // a copy of this software and associated documentation files (the
@@ -30,6 +31,7 @@ using System;
 
 using Mono.Unix;
 
+using Hyena.Collections;
 using Hyena.Data.Sqlite;
 
 using Banshee.ServiceStack;
@@ -48,13 +50,14 @@ namespace Banshee.PlayQueue
 {
     public class PlayQueueSource : PlaylistSource, IBasicPlaybackController, IPlayQueue, IDBusExportable, IDisposable
     {
-        private static string special_playlist_name = "Play Queue";//typeof (PlayQueueSource).ToString ();
+        private static string special_playlist_name = "Play Queue";
 
         private ITrackModelSource prior_playback_source;
-        private DatabaseTrackInfo playing_track;
+        private DatabaseTrackInfo current_track;
         private TrackInfo prior_playback_track;
         private PlayQueueActions actions;
         private bool was_playing = false;
+        private ConfigurationPane pane;
         
         protected override bool HasArtistAlbum {
             get { return false; }
@@ -70,12 +73,15 @@ namespace Banshee.PlayQueue
             Order = 20;
             Properties.SetString ("Icon.Name", "source-playlist");
             Properties.SetString ("RemoveTracksActionLabel", Catalog.GetString ("Remove From Play Queue"));
-            
+
             DatabaseTrackModel.ForcedSortQuery = "CorePlaylistEntries.ViewOrder ASC, CorePlaylistEntries.EntryID ASC";
             DatabaseTrackModel.CanReorder = true;
-            
+
             ServiceManager.PlayerEngine.ConnectEvent (OnPlayerEvent);
-            ServiceManager.PlaybackController.Transition += OnCanonicalPlaybackControllerTransition;
+            ServiceManager.SourceManager.ActiveSourceChanged += OnActiveSourceChanged;
+            ServiceManager.PlaybackController.TrackStarted += delegate {
+                SetAsPlaybackSourceUnlessPlaying ();
+            };
 
             ServiceManager.SourceManager.AddSource (this);
             
@@ -92,18 +98,28 @@ namespace Banshee.PlayQueue
             ServiceManager.SourceManager.VideoLibrary.TracksChanged += HandleTracksChanged;
             ServiceManager.SourceManager.VideoLibrary.TracksDeleted += HandleTracksDeleted;
             
-            TrackModel.Reloaded += delegate {
-                if (Count == 0) {
-                    if (this == ServiceManager.PlaybackController.Source || this == ServiceManager.PlaybackController.NextSource) {
-                        ServiceManager.PlaybackController.NextSource = ServiceManager.PlaybackController.Source = PriorSource;
-                    }
-                }
-            };
+            TrackModel.Reloaded += OnReloaded;
             
             Reload ();
+            int track_index = CurrentTrackSchema.Get ();
+            if (track_index < Count) {
+                current_track = TrackModel[track_index] as DatabaseTrackInfo;
+            }
+            UpdateEnabledStatus ();
             SetAsPlaybackSourceUnlessPlaying ();
         }
-        
+
+        protected override void Initialize ()
+        {
+            base.Initialize ();
+
+            pane = new ConfigurationPane ();
+            BaseClientWindow nereid = ServiceManager.Get<IService> ("NereidPlayerInterface") as Banshee.Gui.BaseClientWindow;
+            if (nereid != null) {
+                nereid.ViewContainer.PackEnd (pane, false, false, 0);
+            }
+        }
+
 #region IPlayQueue, IDBusExportable
 
         public void EnqueueUri (string uri)
@@ -131,15 +147,36 @@ namespace Banshee.PlayQueue
             if (trackId <= 0) {
                 return;
             }
-            
-            if (prepend) {
-                ServiceManager.DbConnection.Execute ("UPDATE CorePlaylistEntries SET ViewOrder = ViewOrder + 1 WHERE PlaylistID = ?", DbId);
+
+            long view_order;
+            if (prepend && current_track != null) {
+                // We are going to prepend the track to the play queue, which means
+                // adding it after the current_track. Now find the corresponding view_order.
+                view_order = ServiceManager.DbConnection.Query<long> (@"
+                    SELECT ViewOrder + 1
+                    FROM CorePlaylistEntries
+                    WHERE PlaylistID = ? AND EntryID = ?",
+                    DbId, Convert.ToInt64 (current_track.CacheEntryId)
+                );
+                // Increment the order of all tracks after the current_track.
+                ServiceManager.DbConnection.Execute (@"
+                    UPDATE CorePlaylistEntries
+                    SET ViewOrder = ViewOrder + 1
+                    WHERE PlaylistID = ? AND ViewOrder >= ?",
+                    DbId, view_order
+                );
+            } else {
+                // view_order will point after the last track in the queue.
+                view_order = MaxViewOrder;
             }
 
-            HyenaSqliteCommand insert_command = new HyenaSqliteCommand (String.Format (
-                @"INSERT INTO CorePlaylistEntries (PlaylistID, TrackID, ViewOrder) VALUES ({0}, ?, {1})", 
-                    DbId, prepend ? 0 : MaxViewOrder));
-            ServiceManager.DbConnection.Execute (insert_command, trackId);
+            // Add the track to the queue using the view order calculated above.
+            ServiceManager.DbConnection.Execute (@"
+                INSERT INTO CorePlaylistEntries
+                (PlaylistID, TrackID, ViewOrder)
+                VALUES (?, ?, ?)",
+                DbId, trackId, view_order
+            );
 
             Reload ();
             NotifyUser ();
@@ -154,10 +191,10 @@ namespace Banshee.PlayQueue
         }
 
 #endregion
-        
+
         private void SetAsPlaybackSourceUnlessPlaying ()
         {
-            if (Count > 0 && ServiceManager.PlaybackController.Source != this) {
+            if (current_track != null && ServiceManager.PlaybackController.Source != this) {
                 PriorSource = ServiceManager.PlaybackController.Source;
                 ServiceManager.PlaybackController.NextSource = this;
             }
@@ -165,19 +202,26 @@ namespace Banshee.PlayQueue
 
         public void Clear ()
         {
-            playing_track = null;
-            RemoveTrackRange (DatabaseTrackModel, new Hyena.Collections.RangeCollection.Range (0, Count));
-            Reload ();
+            RemoveTrackRange (DatabaseTrackModel, new RangeCollection.Range (0, Count - 1));
+            OnTracksRemoved ();
         }
 
         public void Dispose ()
         {
+            int track_index = current_track == null ? Count : Math.Max (0, TrackModel.IndexOf (current_track));
+            CurrentTrackSchema.Set (track_index);
+
             ServiceManager.PlayerEngine.DisconnectEvent (OnPlayerEvent);
 
             if (actions != null) {
                 actions.Dispose ();
             }
 
+            if (pane != null) {
+                pane.Destroy ();
+                pane = null;
+            }
+
             if (ClearOnQuitSchema.Get ()) {
                 Clear ();
             }
@@ -201,22 +245,50 @@ namespace Banshee.PlayQueue
 
         protected override void OnTracksAdded ()
         {
+            int old_count = Count;
+
             base.OnTracksAdded ();
+
+            if (current_track == null && old_count < Count) {
+                current_track = TrackModel[old_count] as DatabaseTrackInfo;
+                UpdateEnabledStatus ();
+
+            }
+
             SetAsPlaybackSourceUnlessPlaying ();
         }
-        
-        private void OnCanonicalPlaybackControllerTransition (object o, EventArgs args)
+
+        protected override void OnTracksRemoved ()
         {
-            if (Count > 0) {
-                PriorSource = ServiceManager.PlaybackController.Source;
-                ServiceManager.PlaybackController.Source = this;
+            base.OnTracksRemoved ();
+            if (this == ServiceManager.PlaybackController.Source &&
+                ServiceManager.PlayerEngine.IsPlaying () &&
+                TrackModel.IndexOf (ServiceManager.PlayerEngine.CurrentTrack) == -1) {
+                if (ServiceManager.PlayerEngine.CurrentState == PlayerState.Paused || current_track == null) {
+                    ServiceManager.PlayerEngine.Close();
+                } else {
+                    ServiceManager.PlayerEngine.OpenPlay (current_track);
+                }
             }
         }
-        
+
+        protected override void RemoveTrackRange (DatabaseTrackListModel model, RangeCollection.Range range)
+        {
+            base.RemoveTrackRange (model, range);
+
+            int index = TrackModel.IndexOf (current_track);
+            if (range.Start <= index && index <= range.End) {
+                current_track = range.End + 1 < Count ? TrackModel[range.End + 1] as DatabaseTrackInfo : null;
+            }
+        }
+
         private void OnPlayerEvent (PlayerEventArgs args)
         {
             if (args.Event == PlayerEvent.EndOfStream) {
-                if (RemovePlayingTrack () && Count == 0) {
+                if (this == ServiceManager.PlaybackController.Source &&
+                    TrackModel.IndexOf (current_track) == Count - 1) {
+                    current_track = null;
+                    UpdatePlayQueue ();
                     if (was_playing) {
                         ServiceManager.PlaybackController.PriorTrack = prior_playback_track;
                     } else {
@@ -224,15 +296,28 @@ namespace Banshee.PlayQueue
                     }
                 }
             } else if (args.Event == PlayerEvent.StartOfStream) {
-                if (this == ServiceManager.PlaybackController.Source) {
-                    playing_track = ServiceManager.PlayerEngine.CurrentTrack as DatabaseTrackInfo;
+                if (TrackModel.IndexOf (ServiceManager.PlayerEngine.CurrentTrack) != -1) {
+                    current_track = ServiceManager.PlayerEngine.CurrentTrack as DatabaseTrackInfo;
+                    SetAsPlaybackSourceUnlessPlaying ();
+                    UpdatePlayQueue ();
                 } else {
-                    playing_track = null;
                     prior_playback_track = ServiceManager.PlayerEngine.CurrentTrack;
                 }
             }
         }
 
+        void OnReloaded(object sender, EventArgs e)
+        {
+            if (current_track == null) {
+                if (this == ServiceManager.PlaybackController.Source ||
+                    this == ServiceManager.PlaybackController.NextSource) {
+                    ServiceManager.PlaybackController.NextSource = PriorSource;
+                }
+            }
+
+            UpdateEnabledStatus ();
+        }
+
         bool IBasicPlaybackController.First ()
         {
             return ((IBasicPlaybackController)this).Next (false);
@@ -240,9 +325,12 @@ namespace Banshee.PlayQueue
         
         bool IBasicPlaybackController.Next (bool restart)
         {
-            RemovePlayingTrack ();
-            
-            if (Count == 0) {
+            if (current_track != null && ServiceManager.PlayerEngine.CurrentTrack == current_track) {
+                int index = TrackModel.IndexOf (current_track) + 1;
+                current_track = index < Count ? TrackModel[index] as DatabaseTrackInfo : null;
+            }
+            if (current_track == null) {
+                UpdatePlayQueue ();
                 ServiceManager.PlaybackController.Source = PriorSource;
                 if (was_playing) {
                     ServiceManager.PlaybackController.PriorTrack = prior_playback_track;
@@ -252,26 +340,53 @@ namespace Banshee.PlayQueue
                 }
                 return true;
             }
-            
-            ServiceManager.PlayerEngine.OpenPlay ((DatabaseTrackInfo)TrackModel[0]);
+
+            ServiceManager.PlayerEngine.OpenPlay (current_track);
             return true;
         }
         
         bool IBasicPlaybackController.Previous (bool restart)
         {
+            if (current_track != null && ServiceManager.PlayerEngine.CurrentTrack == current_track) {
+                int index = TrackModel.IndexOf (current_track);
+                if (index > 0) {
+                    current_track = TrackModel[index - 1] as DatabaseTrackInfo;
+                }
+                ServiceManager.PlayerEngine.OpenPlay (current_track);
+            }
             return true;
         }
         
-        private bool RemovePlayingTrack ()
+        private void UpdatePlayQueue ()
         {
-            if (playing_track != null) {
-                RemoveTrack (playing_track);
-                playing_track = null;
-                return true;
+            int index = current_track == null ? Count : TrackModel.IndexOf (current_track);
+            if (index > PlayedSongsNumber) {
+                RemoveTrackRange (DatabaseTrackModel, new RangeCollection.Range (0, index - PlayedSongsNumber - 1));
+                OnTracksRemoved ();
             }
-            return false;
+            UpdateEnabledStatus ();
         }
-        
+
+        private void UpdateEnabledStatus ()
+        {
+            int index = current_track == null ? Count : TrackModel.IndexOf (current_track);
+            for (int i = 0; i < Count; i++) {
+                TrackModel[i].Enabled = i >= index;
+            }
+        }
+
+        private void OnActiveSourceChanged (SourceEventArgs args)
+        {
+            Banshee.Base.ThreadAssist.ProxyToMain (delegate {
+                if (args.Source == this) {
+                    pane.ShowAll ();
+                    UpdateEnabledStatus ();
+                } else {
+                    pane.Hide ();
+                }
+            });
+        }
+
         private ITrackModelSource PriorSource {
             get {
                 if (prior_playback_source == null || prior_playback_source == this) {
@@ -287,11 +402,29 @@ namespace Banshee.PlayQueue
                 was_playing = ServiceManager.PlayerEngine.IsPlaying ();
             }
         }
+
+        private static int played_songs_number = -1;
+        public static int PlayedSongsNumber {
+            get {
+                if (played_songs_number == -1) {
+                    played_songs_number = PlayedSongsNumberSchema.Get ();
+                }
+                return played_songs_number;
+            }
+            set {
+                played_songs_number = value;
+                PlayedSongsNumberSchema.Set (value);
+            }
+        }
         
         public override bool CanRename {
             get { return false; }
         }
         
+        public override bool CanSearch {
+            get { return false; }
+        }
+
         public override bool ShowBrowser {
             get { return false; }
         }
@@ -303,12 +436,26 @@ namespace Banshee.PlayQueue
         public override bool CanUnmap {
             get { return false; }
         }
-        
+
         public static readonly SchemaEntry<bool> ClearOnQuitSchema = new SchemaEntry<bool> (
             "plugins.play_queue", "clear_on_quit",
             false,
             "Clear on Quit",
             "Clear the play queue when quitting"
         );
+
+        public static readonly SchemaEntry<int> CurrentTrackSchema = new SchemaEntry<int> (
+            "plugins.play_queue", "current_track",
+            0,
+            "Current Track",
+            "Current track in the Play Queue"
+        );
+
+        public static readonly SchemaEntry<int> PlayedSongsNumberSchema = new SchemaEntry<int> (
+            "plugins.play_queue", "played_songs_number",
+            10,
+            "Played Songs Number",
+            "Number of played songs to show in the Play Queue"
+        );
     }
 }
diff --git a/src/Extensions/Banshee.PlayQueue/Makefile.am b/src/Extensions/Banshee.PlayQueue/Makefile.am
index 68ca5cc..47d985a 100644
--- a/src/Extensions/Banshee.PlayQueue/Makefile.am
+++ b/src/Extensions/Banshee.PlayQueue/Makefile.am
@@ -4,6 +4,7 @@ LINK = $(REF_EXTENSION_PLAYQUEUE)
 INSTALL_DIR = $(EXTENSIONS_INSTALL_DIR)
 
 SOURCES =  \
+	Banshee.PlayQueue/ConfigurationPane.cs \
 	Banshee.PlayQueue/IPlayQueue.cs \
 	Banshee.PlayQueue/PlayQueueActions.cs \
 	Banshee.PlayQueue/PlayQueueSource.cs 
diff --git a/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs b/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs
index b1e663b..9863da6 100644
--- a/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs
+++ b/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastSource.cs
@@ -98,6 +98,7 @@ namespace Banshee.Podcasting.Gui
             MediaTypes = TrackMediaAttributes.Podcast;
             NotMediaTypes = TrackMediaAttributes.AudioBook;
             SyncCondition = "(substr(CoreTracks.Uri, 0, 4) != 'http' AND CoreTracks.PlayCount = 0)";
+            TrackModel.Reloaded += OnReloaded;
 
             Properties.SetString ("Icon.Name", "podcast");
             
@@ -197,7 +198,14 @@ namespace Banshee.Podcasting.Gui
                 AfterInitialized ();
             }
         }
-        
+
+        void OnReloaded(object sender, EventArgs e)
+        {
+            for (int i=0; i < TrackModel.Count; i++) {
+                PodcastTrackInfo.From (TrackModel[i]);
+            }
+        }
+
         // Probably don't want this -- do we want to allow actually removing the item?  It will be
         // repopulated the next time we update the podcast feed...
         /*protected override void DeleteTrack (DatabaseTrackInfo track)
diff --git a/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastTrackInfo.cs b/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastTrackInfo.cs
index 410c804..ad92b35 100644
--- a/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastTrackInfo.cs
+++ b/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastTrackInfo.cs
@@ -64,6 +64,7 @@ namespace Banshee.Podcasting.Data
                 PodcastTrackInfo pi = track.ExternalObject as PodcastTrackInfo;
                 if (pi != null) {
                     track.ReleaseDate = pi.PublishedDate;
+                    track.Enabled = !pi.Item.IsRead;
                 }
                 return pi;
             }
diff --git a/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/ColumnCellPodcastStatusIndicator.cs b/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/ColumnCellPodcastStatusIndicator.cs
index a724134..6e849de 100644
--- a/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/ColumnCellPodcastStatusIndicator.cs
+++ b/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/ColumnCellPodcastStatusIndicator.cs
@@ -84,7 +84,7 @@ namespace Banshee.Podcasting.Gui
             PodcastTrackInfo podcast = PodcastTrackInfo.From (BoundTrack);
             if (podcast != null) {
                 if (podcast.Activity == PodcastItemActivity.DownloadPending) {
-                    context.Sensitive = false;
+                    context.Opaque = false;
                 }
             }
             
diff --git a/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastItemView.cs b/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastItemView.cs
index 312d2aa..6825962 100644
--- a/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastItemView.cs
+++ b/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastItemView.cs
@@ -47,27 +47,6 @@ using Banshee.Podcasting.Data;
 
 namespace Banshee.Podcasting.Gui
 {
-    public class PodcastItemView : TrackListView
-    {
-        public PodcastItemView () : base ()
-        {
-        }
-        
-        protected override void ColumnCellDataProvider (ColumnCell cell, object boundItem)
-        {
-            ColumnCellText text_cell = cell as ColumnCellText;
-            if (text_cell == null) {
-                return;
-            }
-            
-            PodcastTrackInfo podcast = PodcastTrackInfo.From (boundItem as TrackInfo);
-            if (podcast == null) {
-                return;
-            }
-            
-            text_cell.Opacity = podcast.IsNew ? 1.0 : 0.5;
-        }
-    }
     /*public class PodcastItemView : ListView<TrackInfo>
     {
         private PersistentColumnController columnController;
diff --git a/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastSourceContents.cs b/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastSourceContents.cs
index b1e408b..66a6a60 100644
--- a/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastSourceContents.cs
+++ b/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Gui/PodcastSourceContents.cs
@@ -53,7 +53,7 @@ namespace Banshee.Podcasting.Gui
 {
     public class PodcastSourceContents : FilteredListSourceContents, ITrackModelSourceContents
     {
-        private PodcastItemView track_view;
+        private TrackListView track_view;
         private PodcastFeedView feed_view;
         private PodcastUnheardFilterView unheard_view;
         private DownloadStatusFilterView download_view;
@@ -64,7 +64,7 @@ namespace Banshee.Podcasting.Gui
 
         protected override void InitializeViews ()
         {
-            SetupMainView (track_view = new PodcastItemView ());
+            SetupMainView (track_view = new TrackListView ());
             SetupFilterView (unheard_view = new PodcastUnheardFilterView ());
             SetupFilterView (download_view = new DownloadStatusFilterView ());
             SetupFilterView (feed_view = new PodcastFeedView ());
diff --git a/src/Libraries/Hyena.Gui/Hyena.Data.Gui/CellContext.cs b/src/Libraries/Hyena.Gui/Hyena.Data.Gui/CellContext.cs
index 603ab61..ca84c18 100644
--- a/src/Libraries/Hyena.Gui/Hyena.Data.Gui/CellContext.cs
+++ b/src/Libraries/Hyena.Gui/Hyena.Data.Gui/CellContext.cs
@@ -42,7 +42,7 @@ namespace Hyena.Data.Gui
         private Gdk.Rectangle area;
         private Gdk.Rectangle clip;
         private bool text_as_foreground = false;
-        private bool sensitive = true;
+        private bool opaque = true;
         
         public Cairo.Context Context {
             get { return context; }
@@ -84,9 +84,9 @@ namespace Hyena.Data.Gui
             set { text_as_foreground = value; }
         }
         
-        public bool Sensitive {
-            get { return sensitive; }
-            set { sensitive = value; }
+        public bool Opaque {
+            get { return opaque; }
+            set { opaque = value; }
         }
     }
 }
diff --git a/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ColumnCellText.cs b/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ColumnCellText.cs
index 43e4ce0..3cda1e8 100644
--- a/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ColumnCellText.cs
+++ b/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ColumnCellText.cs
@@ -44,7 +44,6 @@ namespace Hyena.Data.Gui
         private Pango.Weight font_weight = Pango.Weight.Normal;
         private Pango.EllipsizeMode ellipsize_mode = Pango.EllipsizeMode.End;
         private Pango.Alignment alignment = Pango.Alignment.Left;
-        private double opacity = 1.0;
         private int text_width;
         private int text_height;
         private string text_format = null;
@@ -80,7 +79,7 @@ namespace Hyena.Data.Gui
             context.Context.MoveTo (Spacing, ((int)cellHeight - text_height) / 2);
             Cairo.Color color = context.Theme.Colors.GetWidgetColor (
                 context.TextAsForeground ? GtkColorClass.Foreground : GtkColorClass.Text, state);
-            color.A = (!context.Sensitive) ? 0.3 : opacity;
+            color.A = context.Opaque ? 1.0 : 0.5;
             context.Context.Color = color;
 
             PangoCairoHelper.ShowLayout (context.Context, context.Layout);
@@ -154,11 +153,6 @@ namespace Hyena.Data.Gui
             set { ellipsize_mode = value; }
         }
         
-        public virtual double Opacity {
-            get { return opacity; }
-            set { opacity = value; }
-        }
-        
         internal static int ComputeRowHeight (Widget widget)
         {
             int w_width, row_height;
diff --git a/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Model.cs b/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Model.cs
index b28793d..7d5e129 100644
--- a/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Model.cs
+++ b/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Model.cs
@@ -143,42 +143,42 @@ namespace Hyena.Data.Gui
         public virtual IListModel<T> Model {
             get { return model; }
         }
-        
-        private string row_sensitive_property_name = "Sensitive";
-        private PropertyInfo row_sensitive_property_info;
-        bool row_sensitive_property_invalid = false;
-        
-        public string RowSensitivePropertyName {
-            get { return row_sensitive_property_name; }
-            set { 
-                if (value == row_sensitive_property_name) {
+
+        private string row_opaque_property_name = "Sensitive";
+        private PropertyInfo row_opaque_property_info;
+        bool row_opaque_property_invalid = false;
+
+        public string RowOpaquePropertyName {
+            get { return row_opaque_property_name; }
+            set {
+                if (value == row_opaque_property_name) {
                     return;
                 }
-                
-                row_sensitive_property_name = value;
-                row_sensitive_property_info = null;
-                row_sensitive_property_invalid = false;
-                
+
+                row_opaque_property_name = value;
+                row_opaque_property_info = null;
+                row_opaque_property_invalid = false;
+
                 InvalidateList ();
             }
         }
-        
-        private bool IsRowSensitive (object item)
+
+        private bool IsRowOpaque (object item)
         {
-            if (item == null || row_sensitive_property_invalid) {
+            if (item == null || row_opaque_property_invalid) {
                 return true;
             }
-         
-            if (row_sensitive_property_info == null || row_sensitive_property_info.ReflectedType != item.GetType ()) {
-                row_sensitive_property_info = item.GetType ().GetProperty (row_sensitive_property_name);
-                if (row_sensitive_property_info == null || row_sensitive_property_info.PropertyType != typeof (bool)) {
-                    row_sensitive_property_info = null;
-                    row_sensitive_property_invalid = true;
+
+            if (row_opaque_property_info == null || row_opaque_property_info.ReflectedType != item.GetType ()) {
+                row_opaque_property_info = item.GetType ().GetProperty (row_opaque_property_name);
+                if (row_opaque_property_info == null || row_opaque_property_info.PropertyType != typeof (bool)) {
+                    row_opaque_property_info = null;
+                    row_opaque_property_invalid = true;
                     return true;
                 }
             }
-            
-            return (bool)row_sensitive_property_info.GetValue (item, null);
+
+            return (bool)row_opaque_property_info.GetValue (item, null);
         }
         
         private string row_bold_property_name = "IsBold";
@@ -217,14 +217,5 @@ namespace Hyena.Data.Gui
             
             return (bool)row_bold_property_info.GetValue (item, null);
         }
-        
-        #pragma warning disable 0169
-        
-        private bool IsRowSensitive (int index)
-        {
-            return IsRowSensitive (model[index]);
-        }
-        
-        #pragma warning restore 0169
     }
 }
diff --git a/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Rendering.cs b/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Rendering.cs
index 386102c..eaba8ed 100644
--- a/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Rendering.cs
+++ b/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Rendering.cs
@@ -131,7 +131,7 @@ namespace Hyena.Data.Gui
             cell_area.Height = header_rendering_alloc.Height;
             
             cell_context.Clip = clip;
-            cell_context.Sensitive = true;
+            cell_context.Opaque = true;
             cell_context.TextAsForeground = true;
 
             bool have_drawn_separator = false;
@@ -320,7 +320,7 @@ namespace Hyena.Data.Gui
             }
             
             object item = model[row_index];
-            bool sensitive = IsRowSensitive (item);
+            bool opaque = IsRowOpaque (item);
             bool bold = IsRowBold (item);
             
             Rectangle cell_area = new Rectangle ();
@@ -334,18 +334,18 @@ namespace Hyena.Data.Gui
                 
                 cell_area.Width = column_cache[ci].Width;
                 cell_area.X = column_cache[ci].X1 + area.X;
-                PaintCell (item, ci, row_index, cell_area, sensitive, bold, state, false);
+                PaintCell (item, ci, row_index, cell_area, opaque, bold, state, false);
             }
             
             if (pressed_column_is_dragging && pressed_column_index >= 0) {
                 cell_area.Width = column_cache[pressed_column_index].Width;
                 cell_area.X = pressed_column_x_drag + list_rendering_alloc.X -
                     list_interaction_alloc.X - HadjustmentValue;
-                PaintCell (item, pressed_column_index, row_index, cell_area, sensitive, bold, state, true);
+                PaintCell (item, pressed_column_index, row_index, cell_area, opaque, bold, state, true);
             }
         }
         
-        private void PaintCell (object item, int column_index, int row_index, Rectangle area, bool sensitive, bool bold,
+        private void PaintCell (object item, int column_index, int row_index, Rectangle area, bool opaque, bool bold,
             StateType state, bool dragging)
         {
             ColumnCell cell = column_cache[column_index].Column.GetCell (0);
@@ -368,7 +368,7 @@ namespace Hyena.Data.Gui
             cairo_context.Save ();
             cairo_context.Translate (area.X, area.Y);
             cell_context.Area = area;
-            cell_context.Sensitive = sensitive;
+            cell_context.Opaque = opaque;
             cell.Render (cell_context, dragging ? StateType.Normal : state, area.Width, area.Height);
             cairo_context.Restore ();
         }
