diff --git a/src/Core/Banshee.Services/Banshee.Library/LibrarySource.cs b/src/Core/Banshee.Services/Banshee.Library/LibrarySource.cs
index 5a76d2e..146bab4 100644
--- a/src/Core/Banshee.Services/Banshee.Library/LibrarySource.cs
+++ b/src/Core/Banshee.Services/Banshee.Library/LibrarySource.cs
@@ -93,6 +93,10 @@ namespace Banshee.Library
             get { return UniqueId; }
         }
 
+        public override bool CanEditMetadata {
+            get { return true; }
+        }
+
         public override string BaseDirectory {
             get {
                 string dir = base_dir_schema.Get ();
diff --git a/src/Core/Banshee.Services/Banshee.Playlist/AbstractPlaylistSource.cs b/src/Core/Banshee.Services/Banshee.Playlist/AbstractPlaylistSource.cs
index 965f0f3..92cff9c 100644
--- a/src/Core/Banshee.Services/Banshee.Playlist/AbstractPlaylistSource.cs
+++ b/src/Core/Banshee.Services/Banshee.Playlist/AbstractPlaylistSource.cs
@@ -103,6 +103,10 @@ namespace Banshee.Playlist
             set { primary_source_id = value.DbId; }
         }
 
+        public override bool CanEditMetadata {
+            get { return PrimarySource == null || PrimarySource.CanEditMetadata; }
+        }
+
         private HyenaSqliteCommand count_updated_command;
         protected HyenaSqliteCommand CountUpdatedCommand {
             get {
diff --git a/src/Core/Banshee.Services/Banshee.Sources/ITrackModelSource.cs b/src/Core/Banshee.Services/Banshee.Sources/ITrackModelSource.cs
index 4bc88a3..a3d13f8 100644
--- a/src/Core/Banshee.Services/Banshee.Sources/ITrackModelSource.cs
+++ b/src/Core/Banshee.Services/Banshee.Sources/ITrackModelSource.cs
@@ -55,5 +55,7 @@ namespace Banshee.Sources
 
         bool ShowBrowser { get; }
         bool Indexable { get; }
+
+        bool CanEditMetadata { get; }
     }
 }
diff --git a/src/Core/Banshee.Services/Banshee.Sources/Source.cs b/src/Core/Banshee.Services/Banshee.Sources/Source.cs
index 6705973..e6312a6 100644
--- a/src/Core/Banshee.Services/Banshee.Sources/Source.cs
+++ b/src/Core/Banshee.Services/Banshee.Sources/Source.cs
@@ -94,6 +94,10 @@ namespace Banshee.Sources
             SourceInitialize ();
         }
 
+        public virtual bool CanEditMetadata {
+            get { return false; }
+        }
+
         private void SourceInitialize ()
         {
             // If this source is not defined in Banshee.Services, set its
diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/AlbumArtistEntry.cs b/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/AlbumArtistEntry.cs
index f96ccb7..988c14a 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/AlbumArtistEntry.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/AlbumArtistEntry.cs
@@ -84,6 +84,12 @@ namespace Banshee.Gui.TrackEditor
             set { entry.Text = value ?? String.Empty; }
         }
 
+        public void SetAsReadOnly ()
+        {
+            entry.IsEditable = false;
+            enable_compilation.Sensitive = false;
+        }
+
         private void OnChanged (object o, EventArgs args)
         {
             UpdateSensitivities ();
diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/EditorMode.cs b/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/EditorMode.cs
index ab4d8fb..355d699 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/EditorMode.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/EditorMode.cs
@@ -33,6 +33,7 @@ namespace Banshee.Gui.TrackEditor
     public enum EditorMode
     {
         Edit,
-        View
+        ReadOnly,
+        ViewProperties
     }
 }
diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/FieldPage.cs b/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/FieldPage.cs
index 37a172f..b481f20 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/FieldPage.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/FieldPage.cs
@@ -134,6 +134,12 @@ namespace Banshee.Gui.TrackEditor
         public FieldSlot AddField (Box parent, Widget label, Widget field, string syncTooltip, FieldLabelClosure labelClosure,
             FieldValueClosure readClosure, FieldValueClosure writeClosure, FieldValueClosure syncClosure, FieldOptions options)
         {
+            var editor_field = field as IEditorField;
+
+            if (editor_field != null && dialog.Mode == EditorMode.ReadOnly) {
+                editor_field.SetAsReadOnly ();
+            }
+
             FieldSlot slot = new FieldSlot ();
 
             slot.Parent = parent;
@@ -168,7 +174,6 @@ namespace Banshee.Gui.TrackEditor
                 AttachOptions.Expand | AttachOptions.Fill,
                 AttachOptions.Fill, 0, 0);
 
-            IEditorField editor_field = field as IEditorField;
             if (editor_field != null) {
                 editor_field.Changed += delegate {
                     if (CurrentTrack != null) {
diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/GenreEntry.cs b/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/GenreEntry.cs
index 1dbfb91..ff086f6 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/GenreEntry.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/GenreEntry.cs
@@ -78,5 +78,10 @@ namespace Banshee.Gui.TrackEditor
             get { return Entry.Text; }
             set { Entry.Text = value ?? String.Empty; }
         }
+
+        public void SetAsReadOnly ()
+        {
+            Sensitive = false;
+        }
     }
 }
diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/IEditorField.cs b/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/IEditorField.cs
index 5f0ade2..552f12f 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/IEditorField.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/IEditorField.cs
@@ -33,5 +33,7 @@ namespace Banshee.Gui.TrackEditor
     public interface IEditorField
     {
         event EventHandler Changed;
+
+        void SetAsReadOnly ();
     }
 }
diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/LicenseEntry.cs b/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/LicenseEntry.cs
index 3efae68..29149aa 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/LicenseEntry.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/LicenseEntry.cs
@@ -79,5 +79,10 @@ namespace Banshee.Gui.TrackEditor
             get { return Entry.Text; }
             set { Entry.Text = value ?? String.Empty; }
         }
+
+        public void SetAsReadOnly ()
+        {
+            Sensitive = false;
+        }
     }
 }
diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/PageNavigationEntry.cs b/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/PageNavigationEntry.cs
index a0d5100..59d77d7 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/PageNavigationEntry.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/PageNavigationEntry.cs
@@ -79,6 +79,11 @@ namespace Banshee.Gui.TrackEditor
             }
         }
 
+        public void SetAsReadOnly ()
+        {
+            entry.IsEditable = false;
+        }
+
         private void EditNextTitle (object o, EventArgs args)
         {
             if (dialog.CanGoForward) {
diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/RangeEntry.cs b/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/RangeEntry.cs
index c2e5071..ad2d3e7 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/RangeEntry.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/RangeEntry.cs
@@ -76,6 +76,12 @@ namespace Banshee.Gui.TrackEditor
             to_entry.ValueChanged += OnChanged;
         }
 
+        public void SetAsReadOnly ()
+        {
+            to_entry.Sensitive = false;
+            from_entry.Sensitive = false;
+        }
+
         protected override bool OnMnemonicActivated (bool group_cycling) {
             return from_entry.MnemonicActivate(group_cycling);
         }
diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/RatingEntry.cs b/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/RatingEntry.cs
index 033008f..144738f 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/RatingEntry.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/RatingEntry.cs
@@ -37,5 +37,10 @@ namespace Banshee.Gui.TrackEditor
         {
             AlwaysShowEmptyStars = true;
         }
+
+        public void SetAsReadOnly ()
+        {
+            Sensitive = false;
+        }
     }
 }
diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/SpinButtonEntry.cs b/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/SpinButtonEntry.cs
index 4b3a7ae..e4a9575 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/SpinButtonEntry.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/SpinButtonEntry.cs
@@ -42,6 +42,13 @@ namespace Banshee.Gui.TrackEditor
         {
         }
 
+        public void SetAsReadOnly ()
+        {
+            IsEditable = false;
+            //FIXME: remove the line below when BGO#611825 is fixed:
+            Sensitive = false;
+        }
+
         // Make sure the value is updated every time the text is changed, not just when the focus leaves
         // this SpinButton, since that may be too late
         protected override void OnChanged ()
diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TextEntry.cs b/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TextEntry.cs
index ce60f28..253b81b 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TextEntry.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TextEntry.cs
@@ -78,5 +78,10 @@ namespace Banshee.Gui.TrackEditor
             get { return base.Text; }
             set { base.Text = value ?? String.Empty; }
         }
+
+        public void SetAsReadOnly ()
+        {
+            IsEditable = false;
+        }
     }
 }
diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TextViewEntry.cs b/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TextViewEntry.cs
index 4ec2f86..9d5d023 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TextViewEntry.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TextViewEntry.cs
@@ -50,6 +50,11 @@ namespace Banshee.Gui.TrackEditor
             set { entry.Buffer.Text = value ?? String.Empty; }
         }
 
+        public void SetAsReadOnly ()
+        {
+            entry.IsEditable = false;
+        }
+
         public TextViewEntry ()
         {
             VscrollbarPolicy = PolicyType.Automatic;
diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TrackEditorDialog.cs b/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TrackEditorDialog.cs
index aeb2c07..a5d7129 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TrackEditorDialog.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Gui.TrackEditor/TrackEditorDialog.cs
@@ -76,6 +76,9 @@ namespace Banshee.Gui.TrackEditor
         private PulsingButton sync_all_button;
 
         private EditorMode mode;
+        internal EditorMode Mode {
+            get { return mode; }
+        }
 
         private List<ITrackEditorPage> pages = new List<ITrackEditorPage> ();
 
@@ -90,15 +93,21 @@ namespace Banshee.Gui.TrackEditor
 
             BorderWidth = 6;
 
-            if (mode == EditorMode.Edit) {
+            if (mode != EditorMode.ViewProperties) {
                 WidthRequest = 525;
-                AddStockButton (Stock.Cancel, ResponseType.Cancel);
-                AddStockButton (Stock.Save, ResponseType.Ok);
+                if (mode == EditorMode.Edit) {
+                    AddStockButton (Stock.Cancel, ResponseType.Cancel);
+                    AddStockButton (Stock.Save, ResponseType.Ok);
+                }
             } else {
-                AddStockButton (Stock.Close, ResponseType.Close, true);
                 SetSizeRequest (400, 500);
             }
 
+            if (mode != EditorMode.Edit) {
+                AddStockButton (Stock.Close, ResponseType.Close, true);
+            }
+
+
             tooltip_host = TooltipSetter.CreateHost ();
 
             AddNavigationButtons ();
@@ -201,8 +210,10 @@ namespace Banshee.Gui.TrackEditor
             foreach (TypeExtensionNode node in AddinManager.GetExtensionNodes ("/Banshee/Gui/TrackEditor/NotebookPage")) {
                 try {
                     ITrackEditorPage page = (ITrackEditorPage)node.CreateInstance ();
-                    if ((mode == EditorMode.Edit && (page.PageType == PageType.Edit || page.PageType == PageType.View)) ||
-                        (mode == EditorMode.View && (page.PageType == PageType.View || page.PageType == PageType.ViewOnly))) {
+                    if ((mode != EditorMode.ViewProperties &&
+                         (page.PageType == PageType.Edit || page.PageType == PageType.View)) ||
+                        (mode == EditorMode.ViewProperties &&
+                         (page.PageType == PageType.View || page.PageType == PageType.ViewOnly))) {
                         pages.Add (page);
                         page.Initialize (this);
                         page.Widget.Show ();
@@ -229,7 +240,7 @@ namespace Banshee.Gui.TrackEditor
 
         private void BuildFooter ()
         {
-            if (mode == EditorMode.View) {
+            if (mode == EditorMode.ViewProperties) {
                 return;
             }
 
@@ -601,9 +612,14 @@ namespace Banshee.Gui.TrackEditor
             Run (model, EditorMode.Edit);
         }
 
+        public static void RunReadOnly (TrackListModel model)
+        {
+            Run (model, EditorMode.ReadOnly);
+        }
+
         public static void RunView (TrackListModel model)
         {
-            Run (model, EditorMode.View);
+            Run (model, EditorMode.ViewProperties);
         }
 
         public static void Run (TrackListModel model, EditorMode mode)
diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs b/src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs
index 0470d0f..45bd32f 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs
@@ -208,9 +208,13 @@ namespace Banshee.Gui
         {
             Source source = ServiceManager.SourceManager.ActiveSource;
             bool in_database = source is DatabaseSource;
+
             PrimarySource primary_source = (source as PrimarySource) ?? (source.Parent as PrimarySource);
 
-            Hyena.Collections.Selection selection = (source is ITrackModelSource) ? (source as ITrackModelSource).TrackModel.Selection : null;
+            var track_source = source as ITrackModelSource;
+            var is_track_source = track_source != null;
+            var can_edit_metadata = source.CanEditMetadata;
+            var selection = is_track_source ? track_source.TrackModel.Selection : null;
 
             if (selection != null) {
                 Sensitive = Visible = true;
@@ -224,8 +228,6 @@ namespace Banshee.Gui
                 this["SelectAllAction"].Sensitive = !selection.AllSelected;
 
                 if (source != null) {
-                    ITrackModelSource track_source = source as ITrackModelSource;
-                    bool is_track_source = track_source != null;
 
                     UpdateActions (is_track_source && source.CanSearch, has_single_selection,
                        "SearchMenuAction", "SearchForSameArtistAction", "SearchForSameAlbumAction"
@@ -239,9 +241,16 @@ namespace Banshee.Gui
 
                     UpdateAction ("RemoveTracksFromLibraryAction", source.Parent is LibrarySource, has_selection, null);
 
-                    UpdateAction ("TrackPropertiesAction", source.HasViewableTrackProperties, has_selection, source);
+                    UpdateAction ("TrackPropertiesAction",
+                                  source.HasViewableTrackProperties && can_edit_metadata,
+                                  has_selection, source);
                     UpdateAction ("TrackEditorAction", source.HasEditableTrackProperties, has_selection, source);
-                    UpdateAction ("RateTracksAction", in_database, has_selection, null);
+                    if (!can_edit_metadata) {
+                        this["TrackEditorAction"].Label = Catalog.GetString ("View Track Information");
+                    }
+
+                    UpdateAction ("RateTracksAction", in_database,
+                                  has_selection && can_edit_metadata, null);
                     UpdateAction ("AddToPlaylistAction", in_database && primary_source != null &&
                             primary_source.SupportsPlaylists && !primary_source.PlaylistsReadOnly, has_selection, null);
 
@@ -319,7 +328,10 @@ namespace Banshee.Gui
         private void OnTrackEditor (object o, EventArgs args)
         {
             if (current_source != null && !RunSourceOverrideHandler ("TrackEditorActionHandler")) {
-                Banshee.Gui.TrackEditor.TrackEditorDialog.RunEdit (current_source.TrackModel);
+                if (current_source.CanEditMetadata)
+                    Banshee.Gui.TrackEditor.TrackEditorDialog.RunEdit (current_source.TrackModel);
+                else
+                    Banshee.Gui.TrackEditor.TrackEditorDialog.RunReadOnly (current_source.TrackModel);
             }
         }
 
diff --git a/src/Extensions/Banshee.Bpm/Banshee.Bpm/BpmEntry.cs b/src/Extensions/Banshee.Bpm/Banshee.Bpm/BpmEntry.cs
index 4260d22..ae57fe7 100644
--- a/src/Extensions/Banshee.Bpm/Banshee.Bpm/BpmEntry.cs
+++ b/src/Extensions/Banshee.Bpm/Banshee.Bpm/BpmEntry.cs
@@ -47,6 +47,8 @@ namespace Banshee.Bpm
     {
         private SpinButton bpm_entry;
         private Button detect_button;
+        private Button tap_button;
+        private Button play_button;
         private BpmTapAdapter tap_adapter;
         private EditorTrackInfo track;
         private IBpmDetector detector;
@@ -71,6 +73,14 @@ namespace Banshee.Bpm
             };
         }
 
+        public void SetAsReadOnly ()
+        {
+            bpm_entry.Sensitive =
+            detect_button.Sensitive =
+            tap_button.Sensitive =
+            play_button.Sensitive = false;
+        }
+
         private void BuildWidgets ()
         {
             Spacing = 6;
@@ -91,11 +101,11 @@ namespace Banshee.Bpm
             Image play = new Image ();
             play.IconName = "media-playback-start";;
             play.IconSize = (int)IconSize.Menu;
-            Button play_button = new Button (play);
+            play_button = new Button (play);
             play_button.Clicked += OnPlayClicked;
             Add (play_button);
 
-            Button tap_button = new Button (Catalog.GetString ("T_ap"));
+            tap_button = new Button (Catalog.GetString ("T_ap"));
             tap_adapter = new BpmTapAdapter (tap_button);
             tap_adapter.BpmChanged += OnTapBpmChanged;
             Add (tap_button);
