diff --git a/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseTrackInfo.cs b/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseTrackInfo.cs
index 8f493d9..1a7b40b 100644
--- a/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseTrackInfo.cs
+++ b/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseTrackInfo.cs
@@ -188,7 +188,15 @@ namespace Banshee.Collection.Database
                 // TODO get rid of unused artists/albums
             }
 
-            if (fields_changed.Length == 0 || !transient_fields.IsSupersetOf (fields_changed)) {
+            // If PlayCountField is not transient we still want to update the file only if it's from the music library
+            var transient = transient_fields;
+            if (!transient.Contains (BansheeQuery.PlayCountField) &&
+                !ServiceManager.SourceManager.MusicLibrary.Equals (PrimarySource)) {
+                transient = new HashSet<QueryField> (transient_fields);
+                transient.Add (BansheeQuery.PlayCountField);
+            }
+
+            if (fields_changed.Length == 0 || !transient.IsSupersetOf (fields_changed)) {
                 DateUpdated = DateTime.Now;
             }
 
diff --git a/src/Core/Banshee.Services/Banshee.Metadata/SaveTrackMetadataJob.cs b/src/Core/Banshee.Services/Banshee.Metadata/SaveTrackMetadataJob.cs
index 217009e..f760d0b 100644
--- a/src/Core/Banshee.Services/Banshee.Metadata/SaveTrackMetadataJob.cs
+++ b/src/Core/Banshee.Services/Banshee.Metadata/SaveTrackMetadataJob.cs
@@ -29,6 +29,7 @@
 //
 
 using System;
+using System.Linq;
 using Mono.Unix;
 
 using Hyena.Jobs;
@@ -46,20 +47,26 @@ namespace Banshee.Metadata
 {
     public class SaveTrackMetadataJob : DbIteratorJob
     {
-        private LibrarySource source = ServiceManager.SourceManager.MusicLibrary;
+        private LibrarySource musicLibrarySource = ServiceManager.SourceManager.MusicLibrary;
 
         public SaveTrackMetadataJob () : base (Catalog.GetString ("Saving Metadata to File"))
         {
             SetResources (Resource.Cpu, Resource.Disk, Resource.Database);
             IsBackground = true;
 
-            CountCommand = new HyenaSqliteCommand (
-                "SELECT COUNT(*) FROM CoreTracks WHERE DateUpdatedStamp > LastSyncedStamp AND PrimarySourceID = ?",
-                source.DbId
+            var db_ids = ServiceManager.Get<SaveTrackMetadataService> ().Sources.
+                Select (s => s.DbId.ToString ()).ToArray ();
+
+            string range = String.Join (",", db_ids);
+
+            CountCommand = new HyenaSqliteCommand ( String.Format (
+                @"SELECT COUNT(*) FROM CoreTracks
+                  WHERE DateUpdatedStamp > LastSyncedStamp
+                  AND PrimarySourceID IN ({0})", range)
             );
 
             SelectCommand = DatabaseTrackInfo.Provider.CreateFetchCommand (String.Format (
-                "DateUpdatedStamp > LastSyncedStamp AND PrimarySourceID = {0}", source.DbId)
+                "DateUpdatedStamp > LastSyncedStamp AND PrimarySourceID IN ({0})", range)
             );
         }
 
@@ -87,7 +94,9 @@ namespace Banshee.Metadata
                     wrote = StreamTagger.SaveToFile (track, WriteMetadataEnabled, WriteRatingsAndPlayCountsEnabled);
                 }
 
-                if (RenameEnabled) {
+                // Rename tracks only from the Music Library
+                if (RenameEnabled &&
+                    track.PrimarySource.Equals (musicLibrarySource)) {
                     Hyena.Log.DebugFormat ("Updating file name for {0}", track);
                     renamed = RenameFile (track);
                     if (renamed && !wrote) {
@@ -115,13 +124,13 @@ namespace Banshee.Metadata
         private bool RenameFile (DatabaseTrackInfo track)
         {
             SafeUri old_uri = track.Uri;
-            bool in_library = old_uri.AbsolutePath.StartsWith (source.BaseDirectoryWithSeparator);
+            bool in_library = old_uri.AbsolutePath.StartsWith (musicLibrarySource.BaseDirectoryWithSeparator);
 
             if (!in_library) {
                 return false;
             }
 
-            string new_filename = track.PathPattern.BuildFull (source.BaseDirectory, track, System.IO.Path.GetExtension (old_uri.ToString ()));
+            string new_filename = track.PathPattern.BuildFull (musicLibrarySource.BaseDirectory, track, System.IO.Path.GetExtension (old_uri.ToString ()));
             SafeUri new_uri = new SafeUri (new_filename);
 
             if (!new_uri.Equals (old_uri) && !Banshee.IO.File.Exists (new_uri)) {
diff --git a/src/Core/Banshee.Services/Banshee.Metadata/SaveTrackMetadataService.cs b/src/Core/Banshee.Services/Banshee.Metadata/SaveTrackMetadataService.cs
index c3aea2d..605d996 100644
--- a/src/Core/Banshee.Services/Banshee.Metadata/SaveTrackMetadataService.cs
+++ b/src/Core/Banshee.Services/Banshee.Metadata/SaveTrackMetadataService.cs
@@ -27,6 +27,7 @@
 //
 
 using System;
+using System.Collections.Generic;
 using Mono.Unix;
 
 using Hyena.Jobs;
@@ -63,6 +64,10 @@ namespace Banshee.Metadata
         private SaveTrackMetadataJob job;
         private object sync = new object ();
         private bool inited = false;
+        private List<PrimarySource> sources = new List<PrimarySource> ();
+        public IEnumerable<PrimarySource> Sources {
+            get { return sources.AsReadOnly (); }
+        }
 
         public SaveTrackMetadataService ()
         {
@@ -70,17 +75,50 @@ namespace Banshee.Metadata
                 WriteMetadataEnabled.ValueChanged += OnEnabledChanged;
                 WriteRatingsAndPlayCountsEnabled.ValueChanged += OnEnabledChanged;
                 RenameEnabled.ValueChanged += OnEnabledChanged;
-                ServiceManager.SourceManager.MusicLibrary.TracksChanged += OnTracksChanged;
+                foreach (var source in ServiceManager.SourceManager.Sources) {
+                    AddPrimarySource (source);
+                }
+                ServiceManager.SourceManager.SourceAdded += (args) => {
+                    AddPrimarySource (args.Source);
+                };
+                ServiceManager.SourceManager.SourceRemoved += (args) => {
+                    RemovePrimarySource(args.Source);
+                };
                 Save ();
                 inited = true;
                 return false;
             });
         }
 
+        private void AddPrimarySource (Source s)
+        {
+            PrimarySource p = s as PrimarySource;
+            if (p != null && p.HasEditableTrackProperties) {
+                sources.Add (p);
+                p.TracksChanged += OnTracksChanged;
+            }
+        }
+
+        private void RemovePrimarySource (Source s)
+        {
+            PrimarySource p = s as PrimarySource;
+            if (p != null && sources.Remove (p)) {
+                p.TracksChanged -= OnTracksChanged;
+            }
+        }
+
+        private void RemovePrimarySources ()
+        {
+            foreach (var source in sources) {
+                source.TracksChanged -= OnTracksChanged;
+            }
+            sources.Clear ();
+        }
+
         public void Dispose ()
         {
             if (inited) {
-                ServiceManager.SourceManager.MusicLibrary.TracksChanged -= OnTracksChanged;
+                RemovePrimarySources ();
 
                 if (job != null) {
                     ServiceManager.JobScheduler.Cancel (job);
@@ -127,7 +165,7 @@ namespace Banshee.Metadata
         }
 
         string IService.ServiceName {
-            get { return "SaveMetadataService"; }
+            get { return "SaveTrackMetadataService"; }
         }
 
         // Reserve strings in preparation for the forthcoming string freeze.
diff --git a/src/Extensions/Banshee.FileSystemQueue/Banshee.FileSystemQueue/FileSystemQueueSource.cs b/src/Extensions/Banshee.FileSystemQueue/Banshee.FileSystemQueue/FileSystemQueueSource.cs
index a5e799c..9185a9b 100644
--- a/src/Extensions/Banshee.FileSystemQueue/Banshee.FileSystemQueue/FileSystemQueueSource.cs
+++ b/src/Extensions/Banshee.FileSystemQueue/Banshee.FileSystemQueue/FileSystemQueueSource.cs
@@ -238,6 +238,12 @@ namespace Banshee.FileSystemQueue
             }
         }
 
+        public override bool HasEditableTrackProperties {
+            get {
+                return true;
+            }
+        }
+
         private void OnTrackModelReloaded (object sender, EventArgs args)
         {
             if (Count > 0 && !visible) {
