diff --git a/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseTrackInfo.cs b/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseTrackInfo.cs
index f513ff3..9761fcb 100644
--- a/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseTrackInfo.cs
+++ b/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseTrackInfo.cs
@@ -177,6 +177,8 @@ namespace Banshee.Collection.Database
 
         public void Save (bool notify, params QueryField [] fields_changed)
         {
+            PrimarySource.UpdateMetadata (this);
+
             // If either the artist or album changed,
             if (ArtistId == 0 || AlbumId == 0 || artist_changed == true || album_changed == true) {
                 DatabaseArtistInfo artist = Artist;
diff --git a/src/Core/Banshee.Services/Banshee.Playlist/AbstractPlaylistSource.cs b/src/Core/Banshee.Services/Banshee.Playlist/AbstractPlaylistSource.cs
index 5ed6749..d88d4b9 100644
--- a/src/Core/Banshee.Services/Banshee.Playlist/AbstractPlaylistSource.cs
+++ b/src/Core/Banshee.Services/Banshee.Playlist/AbstractPlaylistSource.cs
@@ -103,8 +103,15 @@ namespace Banshee.Playlist
             set { primary_source_id = value.DbId; }
         }
 
+        private bool? has_editable_properties = null;
         public override bool HasEditableTrackProperties {
-            get { return PrimarySource == null || PrimarySource.HasEditableTrackProperties; }
+            get {
+                if (!has_editable_properties.HasValue) {
+                    return PrimarySource == null || PrimarySource.HasEditableTrackProperties;
+                }
+                return has_editable_properties.Value;
+            }
+            set { has_editable_properties = value; }
         }
 
         private HyenaSqliteCommand count_updated_command;
diff --git a/src/Core/Banshee.Services/Banshee.Sources/PrimarySource.cs b/src/Core/Banshee.Services/Banshee.Sources/PrimarySource.cs
index 3ae0f0c..a7336dd 100644
--- a/src/Core/Banshee.Services/Banshee.Sources/PrimarySource.cs
+++ b/src/Core/Banshee.Services/Banshee.Sources/PrimarySource.cs
@@ -313,6 +313,10 @@ namespace Banshee.Sources
             );
         }
 
+        public virtual void UpdateMetadata (DatabaseTrackInfo track)
+        {
+        }
+
         public virtual void CopyTrackTo (DatabaseTrackInfo track, SafeUri uri, BatchUserJob job)
         {
             Log.WarningFormat ("CopyTrackTo not implemented for source {0}", this);
diff --git a/src/Core/Banshee.Services/Banshee.Sources/Source.cs b/src/Core/Banshee.Services/Banshee.Sources/Source.cs
index 15d8b4e..06479ad 100644
--- a/src/Core/Banshee.Services/Banshee.Sources/Source.cs
+++ b/src/Core/Banshee.Services/Banshee.Sources/Source.cs
@@ -576,6 +576,7 @@ namespace Banshee.Sources
 
         public virtual bool HasEditableTrackProperties {
             get { return false; }
+            set { }
         }
 
         public virtual string Name {
diff --git a/src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs b/src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs
index be602a5..b39b528 100644
--- a/src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs
+++ b/src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs
@@ -111,10 +111,29 @@ namespace Banshee.Dap.Ipod
             AddDapProperty (Catalog.GetString ("Capabilities"), String.Join (", ", capabilities));
             AddYesNoDapProperty (Catalog.GetString ("Supports cover art"), ipod_device.ModelInfo.AlbumArtSupported);
             AddYesNoDapProperty (Catalog.GetString ("Supports photos"), ipod_device.ModelInfo.PhotosSupported);
+
+            sync.LibrarySettingsChanged += OnLibrarySyncSettingsChanged;
+            sync.LibraryAdded += OnLibrarySyncSettingsChanged;
+            foreach (var lib_sync in sync.Libraries) {
+                OnLibrarySyncSettingsChanged (lib_sync);
+            }
+        }
+
+        private void OnLibrarySyncSettingsChanged (DapLibrarySync lib_sync)
+        {
+            if (lib_sync.Library.Equals (ServiceManager.SourceManager.MusicLibrary)) {
+                MusicGroupSource.HasEditableTrackProperties = !lib_sync.Enabled;
+            }
+        }
+
+        public override bool HasEditableTrackProperties {
+            get { return true; }
         }
 
         public override void Dispose ()
         {
+            sync.LibrarySettingsChanged -= OnLibrarySyncSettingsChanged;
+            sync.LibraryAdded -= OnLibrarySyncSettingsChanged;
             ThreadAssist.ProxyToMain (DestroyUnsupportedView);
             CancelSyncThread ();
             base.Dispose ();
@@ -401,6 +420,19 @@ namespace Banshee.Dap.Ipod
 
 #region Syncing
 
+        public override void UpdateMetadata (DatabaseTrackInfo track)
+        {
+            lock (sync_mutex) {
+                IpodTrackInfo ipod_track;
+                if (!tracks_map.TryGetValue (track.TrackId, out ipod_track)) {
+                    return;
+                }
+
+                ipod_track.UpdateInfo (track);
+                ipod_track.CommitToIpod (IpodDevice);
+            }
+        }
+
         protected override void OnTracksAdded ()
         {
             if (!IsAdding && tracks_to_add.Count > 0 && !Sync.Syncing) {
diff --git a/src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodTrackInfo.cs b/src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodTrackInfo.cs
index e35521a..f4bcd2c 100644
--- a/src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodTrackInfo.cs
+++ b/src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodTrackInfo.cs
@@ -61,10 +61,19 @@ namespace Banshee.Dap.Ipod
 
         public IpodTrackInfo (TrackInfo track)
         {
+            CanSaveToDatabase = true;
+
             if (track is IpodTrackInfo) {
                 this.track = ((IpodTrackInfo)track).IpodTrack;
                 LoadFromIpodTrack ();
             } else {
+                UpdateInfo (track);
+            }
+        }
+
+        public void UpdateInfo (TrackInfo track)
+        {
+            if (!(track is IpodTrackInfo)) {
                 AlbumArtist = track.AlbumArtist;
                 AlbumTitle = track.AlbumTitle;
                 ArtistName = track.ArtistName;
@@ -87,6 +96,7 @@ namespace Banshee.Dap.Ipod
                 LastSkipped = track.LastSkipped;
                 PlayCount = track.PlayCount;
                 Rating = track.Rating;
+
                 ReleaseDate = track.ReleaseDate;
                 SkipCount = track.SkipCount;
                 TrackCount = track.TrackCount;
@@ -100,9 +110,9 @@ namespace Banshee.Dap.Ipod
                     description = podcast_info.Description;
                     ReleaseDate = podcast_info.ReleaseDate;
                 }
+            } else {
+                throw new ArgumentException ("Shouldn't update an IpodTrackInfo from an IpodTrackInfo");
             }
-
-            CanSaveToDatabase = true;
         }
 
         private void LoadFromIpodTrack ()
diff --git a/src/Dap/Banshee.Dap/Banshee.Dap/DapLibrarySync.cs b/src/Dap/Banshee.Dap/Banshee.Dap/DapLibrarySync.cs
index 2930cfc..d8ba0d1 100644
--- a/src/Dap/Banshee.Dap/Banshee.Dap/DapLibrarySync.cs
+++ b/src/Dap/Banshee.Dap/Banshee.Dap/DapLibrarySync.cs
@@ -84,7 +84,7 @@ namespace Banshee.Dap
 
         public void MaybeTriggerAutoSync ()
         {
-            sync.MaybeTriggerAutoSync ();
+            sync.MaybeTriggerAutoSync (this);
         }
 
         private IList<AbstractPlaylistSource> GetSyncPlaylists ()
diff --git a/src/Dap/Banshee.Dap/Banshee.Dap/DapSource.cs b/src/Dap/Banshee.Dap/Banshee.Dap/DapSource.cs
index fa93b70..0619313 100644
--- a/src/Dap/Banshee.Dap/Banshee.Dap/DapSource.cs
+++ b/src/Dap/Banshee.Dap/Banshee.Dap/DapSource.cs
@@ -53,7 +53,7 @@ namespace Banshee.Dap
 {
     public abstract class DapSource : RemovableSource, IDisposable
     {
-        private DapSync sync;
+        protected DapSync sync;
         private DapInfoBar dap_info_bar;
         private Page page;
         // private DapPropertiesDisplay dap_properties_display;
diff --git a/src/Dap/Banshee.Dap/Banshee.Dap/DapSync.cs b/src/Dap/Banshee.Dap/Banshee.Dap/DapSync.cs
index 6e38d30..1ccfce6 100644
--- a/src/Dap/Banshee.Dap/Banshee.Dap/DapSync.cs
+++ b/src/Dap/Banshee.Dap/Banshee.Dap/DapSync.cs
@@ -67,6 +67,7 @@ namespace Banshee.Dap
         public event Action<DapSync> Updated;
         public event Action<DapLibrarySync> LibraryAdded;
         public event Action<DapLibrarySync> LibraryRemoved;
+        public event Action<DapLibrarySync> LibrarySettingsChanged;
 
         internal string ConfigurationNamespace {
             get { return conf_ns; }
@@ -223,7 +224,7 @@ namespace Banshee.Dap
 
         private void OnAutoSyncChanged (Root preference)
         {
-            MaybeTriggerAutoSync ();
+            MaybeTriggerAutoSync (null);
         }
 
         private void OnDapChanged (Source sender, TrackEventArgs args)
@@ -297,8 +298,11 @@ namespace Banshee.Dap
             OnUpdated ();
         }
 
-        internal void MaybeTriggerAutoSync ()
+        internal void MaybeTriggerAutoSync (DapLibrarySync lib_sync)
         {
+            if (lib_sync != null) {
+                LibrarySettingsChanged.SafeInvoke (lib_sync);
+            }
             UpdateSensitivities ();
             OnUpdated ();
             if (Enabled && AutoSync) {
