diff --git a/src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs b/src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs
index f549c27..281bb21 100644
--- a/src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs
+++ b/src/Core/Banshee.Services/Banshee.Library/MusicLibrarySource.cs
@@ -90,6 +90,10 @@ namespace Banshee.Library
             return Hyena.XdgBaseDirectorySpec.GetXdgDirectoryUnderHome ("XDG_MUSIC_DIR", "Music");
         }
 
+        public override bool CanEditMetadata {
+            get { return true; }
+        }
+
         public override string DefaultBaseDirectory {
             get { return GetDefaultBaseDirectory (); }
         }
diff --git a/src/Core/Banshee.Services/Banshee.Library/VideoLibrarySource.cs b/src/Core/Banshee.Services/Banshee.Library/VideoLibrarySource.cs
index 0df8de3..7558dcf 100644
--- a/src/Core/Banshee.Services/Banshee.Library/VideoLibrarySource.cs
+++ b/src/Core/Banshee.Services/Banshee.Library/VideoLibrarySource.cs
@@ -72,6 +72,10 @@ namespace Banshee.Library
             get { return false; }
         }
 
+        public override bool CanEditMetadata {
+            get { return true; }
+        }
+
         public override string DefaultBaseDirectory {
             get { return Hyena.XdgBaseDirectorySpec.GetXdgDirectoryUnderHome ("XDG_VIDEOS_DIR", "Videos"); }
         }
diff --git a/src/Core/Banshee.Services/Banshee.Metadata/SaveTrackMetadataJob.cs b/src/Core/Banshee.Services/Banshee.Metadata/SaveTrackMetadataJob.cs
index 1984cc7..7265937 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.Collections.Generic;
 using Mono.Unix;
 
 using Hyena.Jobs;
@@ -46,20 +47,36 @@ 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;
 
+            var db_ids = new List<int> ();
+            foreach (var source in ServiceManager.Get <SaveTrackMetadataService> ().Sources) {
+                db_ids.Add (source.DbId);
+            }
+
+            string [] range_items = new string [db_ids.Count];
+            for (int i = 0; i < db_ids.Count; i++)
+                range_items [i] = "?";
+            string range = "(" + string.Join (",", range_items) + ")";
+
             CountCommand = new HyenaSqliteCommand (
-                "SELECT COUNT(*) FROM CoreTracks WHERE DateUpdatedStamp > LastSyncedStamp AND PrimarySourceID = ?",
-                source.DbId
+                "SELECT COUNT(*) FROM CoreTracks " +
+                "WHERE DateUpdatedStamp > LastSyncedStamp " +
+                "AND PrimarySourceID IN " + range,
+                db_ids.ToArray ()
             );
 
+            for (int i = 0; i < db_ids.Count; i++)
+                range_items [i] = db_ids [i].ToString ();
+            range = "(" + string.Join (",", range_items) + ")";
+
             SelectCommand = DatabaseTrackInfo.Provider.CreateFetchCommand (String.Format (
-                "DateUpdatedStamp > LastSyncedStamp AND PrimarySourceID = {0}", source.DbId)
+                "DateUpdatedStamp > LastSyncedStamp AND PrimarySourceID IN {0}", range)
             );
         }
 
@@ -81,7 +98,9 @@ namespace Banshee.Metadata
                     wrote = StreamTagger.SaveToFile (track, WriteMetadataEnabled, WriteRatingsAndPlayCountsEnabled);
                 }
 
-                if (RenameEnabled) {
+                if (RenameEnabled &&
+                    //not valid for tracks in FSQ:
+                    track.PrimarySource.Equals (musicLibrarySource)) {
                     Hyena.Log.DebugFormat ("Updating file name for {0}", track);
                     renamed = RenameFile (track);
                     if (renamed && !wrote) {
@@ -109,13 +128,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..fce5f6e 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 PrimarySource [] Sources {
+            get { return sources.ToArray (); }
+        }
 
         public SaveTrackMetadataService ()
         {
@@ -70,7 +75,13 @@ namespace Banshee.Metadata
                 WriteMetadataEnabled.ValueChanged += OnEnabledChanged;
                 WriteRatingsAndPlayCountsEnabled.ValueChanged += OnEnabledChanged;
                 RenameEnabled.ValueChanged += OnEnabledChanged;
-                ServiceManager.SourceManager.MusicLibrary.TracksChanged += OnTracksChanged;
+                foreach (var source in ServiceManager.SourceManager.Sources) {
+                    PrimarySource p = source as PrimarySource;
+                    if (p != null && p.CanEditMetadata) {
+                        sources.Add (p);
+                        p.TracksChanged += OnTracksChanged;
+                    }
+                }
                 Save ();
                 inited = true;
                 return false;
@@ -80,7 +91,9 @@ namespace Banshee.Metadata
         public void Dispose ()
         {
             if (inited) {
-                ServiceManager.SourceManager.MusicLibrary.TracksChanged -= OnTracksChanged;
+                foreach (var source in sources) {
+                    source.TracksChanged -= OnTracksChanged;
+                }
 
                 if (job != null) {
                     ServiceManager.JobScheduler.Cancel (job);
diff --git a/src/Core/Banshee.Services/Banshee.ServiceStack/ServiceManager.cs b/src/Core/Banshee.Services/Banshee.ServiceStack/ServiceManager.cs
index 0a77406..028d885 100644
--- a/src/Core/Banshee.Services/Banshee.ServiceStack/ServiceManager.cs
+++ b/src/Core/Banshee.Services/Banshee.ServiceStack/ServiceManager.cs
@@ -227,7 +227,7 @@ namespace Banshee.ServiceStack
                 } else if (args.Change == ExtensionChange.Remove && extension_services.ContainsKey (node.Path)) {
                     IExtensionService service = extension_services[node.Path];
                     extension_services.Remove (node.Path);
-                    services.Remove (service.ServiceName);
+                    Remove (service);
                     ((IDisposable)service).Dispose ();
 
                     Log.DebugFormat ("Extension service disposed ({0})", service.ServiceName);
@@ -293,7 +293,7 @@ namespace Banshee.ServiceStack
         public static void RegisterService (IService service)
         {
             lock (self_mutex) {
-                services.Add (service.ServiceName, service);
+                Add (service);
 
                 if(service is IDBusExportable) {
                     DBusServiceManager.RegisterObject ((IDBusExportable)service);
@@ -301,6 +301,22 @@ namespace Banshee.ServiceStack
             }
         }
 
+        private static void Add (IService service)
+        {
+            services.Add (service.ServiceName, service);
+            //because Get<T> works this way:
+            var type_name = service.GetType ().Name;
+            if (type_name != service.ServiceName)
+                services.Add (type_name, service);
+        }
+
+        private static void Remove (IService service)
+        {
+            services.Remove (service.ServiceName);
+            //because Add () works this way:
+            services.Remove (service.GetType ().Name);
+        }
+
         public static void RegisterService<T> () where T : IService
         {
             lock (self_mutex) {
diff --git a/src/Core/Banshee.Services/Banshee.Sources/PrimarySource.cs b/src/Core/Banshee.Services/Banshee.Sources/PrimarySource.cs
index 604d4e5..9ec6b01 100644
--- a/src/Core/Banshee.Services/Banshee.Sources/PrimarySource.cs
+++ b/src/Core/Banshee.Services/Banshee.Sources/PrimarySource.cs
@@ -203,6 +203,10 @@ namespace Banshee.Sources
             return (primary_sources.ContainsKey (id)) ? primary_sources[id] : null;
         }
 
+        public virtual bool CanEditMetadata {
+            get { return false; }
+        }
+
         public virtual string BaseDirectory {
             get { return null; }
             protected set { base_dir_with_sep = null; }
diff --git a/src/Extensions/Banshee.FileSystemQueue/Banshee.FileSystemQueue/FileSystemQueueSource.cs b/src/Extensions/Banshee.FileSystemQueue/Banshee.FileSystemQueue/FileSystemQueueSource.cs
index a5e799c..11214b1 100644
--- a/src/Extensions/Banshee.FileSystemQueue/Banshee.FileSystemQueue/FileSystemQueueSource.cs
+++ b/src/Extensions/Banshee.FileSystemQueue/Banshee.FileSystemQueue/FileSystemQueueSource.cs
@@ -238,6 +238,10 @@ namespace Banshee.FileSystemQueue
             }
         }
 
+        public override bool CanEditMetadata {
+            get { return true; }
+        }
+
         private void OnTrackModelReloaded (object sender, EventArgs args)
         {
             if (Count > 0 && !visible) {
diff --git a/src/Libraries/Hyena/Hyena.Data.Sqlite/HyenaSqliteCommand.cs b/src/Libraries/Hyena/Hyena.Data.Sqlite/HyenaSqliteCommand.cs
index b80ecbd..74cbaca 100644
--- a/src/Libraries/Hyena/Hyena.Data.Sqlite/HyenaSqliteCommand.cs
+++ b/src/Libraries/Hyena/Hyena.Data.Sqlite/HyenaSqliteCommand.cs
@@ -176,6 +176,15 @@ namespace Hyena.Data.Sqlite
 
         internal HyenaSqliteCommand ApplyValues (params object [] param_values)
         {
+            if (param_values != null &&
+                param_values.Length == 1 &&
+                param_values [0] is Array) {
+                // it turns out "param_values = (object[])param_values[0];" throws InvalidCastException
+                var vals = (Array)param_values [0];
+                param_values = new object [vals.Length];
+                Array.Copy (vals, param_values, vals.Length);
+            }
+
             if (command_format == null) {
                 CreateParameters ();
             }
