diff --git a/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseTrackInfo.cs b/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseTrackInfo.cs
index bec4165..a30c0bc 100644
--- a/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseTrackInfo.cs
+++ b/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseTrackInfo.cs
@@ -150,7 +150,7 @@ namespace Banshee.Collection.Database
                 if (is_new) {
                     PrimarySource.NotifyTracksAdded ();
                 } else {
-                    PrimarySource.NotifyTracksChanged (fields_changed);
+                    PrimarySource.NotifyTracksChanged (this, fields_changed);
                 }
             }
         }
diff --git a/src/Core/Banshee.Services/Banshee.Sources/DatabaseSource.cs b/src/Core/Banshee.Services/Banshee.Sources/DatabaseSource.cs
index d18906c..3feae0a 100644
--- a/src/Core/Banshee.Services/Banshee.Sources/DatabaseSource.cs
+++ b/src/Core/Banshee.Services/Banshee.Sources/DatabaseSource.cs
@@ -534,16 +534,16 @@ namespace Banshee.Sources
             Reload ();
         }
 
-        protected void OnTracksChanged ()
+        protected virtual void OnTracksChanged (params QueryField [] fields)
         {
-            OnTracksChanged (null);
+            OnTracksChanged (null, fields);
         }
 
-        protected virtual void OnTracksChanged (params QueryField [] fields)
+        protected virtual void OnTracksChanged (TrackInfo track, params QueryField [] fields)
         {
-            HandleTracksChanged (this, new TrackEventArgs (fields));
+            HandleTracksChanged (this, new TrackEventArgs (track, fields));
             foreach (PrimarySource psource in PrimarySources) {
-                psource.NotifyTracksChanged (fields);
+                psource.NotifyTracksChanged (track, fields);
             }
         }
 
diff --git a/src/Core/Banshee.Services/Banshee.Sources/PrimarySource.cs b/src/Core/Banshee.Services/Banshee.Sources/PrimarySource.cs
index f19049f..00d5cb7 100644
--- a/src/Core/Banshee.Services/Banshee.Sources/PrimarySource.cs
+++ b/src/Core/Banshee.Services/Banshee.Sources/PrimarySource.cs
@@ -61,14 +61,20 @@ namespace Banshee.Sources
             get { return changed_fields; }
         }
 
+        private TrackInfo track;
+        public TrackInfo Track {
+            get { return track; }
+        }
+
         public TrackEventArgs ()
         {
             when = DateTime.Now;
         }
 
-        public TrackEventArgs (params QueryField [] fields) : this ()
+        public TrackEventArgs (TrackInfo track, params QueryField [] fields) : this ()
         {
             changed_fields = fields;
+            this.track = track;
         }
     }
 
@@ -324,9 +330,9 @@ namespace Banshee.Sources
             OnTracksAdded ();
         }
 
-        internal void NotifyTracksChanged (params QueryField [] fields)
+        internal void NotifyTracksChanged (TrackInfo track, params QueryField [] fields)
         {
-            OnTracksChanged (fields);
+            OnTracksChanged (track, fields);
         }
 
         // TODO replace this public method with a 'transaction'-like system
@@ -396,7 +402,7 @@ namespace Banshee.Sources
             });
         }
 
-        protected override void OnTracksChanged (params QueryField [] fields)
+        protected override void OnTracksChanged (TrackInfo track, params QueryField [] fields)
         {
             ThreadAssist.SpawnFromMain (delegate {
                 if (NeedsReloadWhenFieldsChanged (fields)) {
@@ -409,7 +415,7 @@ namespace Banshee.Sources
 
                 TrackEventHandler handler = TracksChanged;
                 if (handler != null) {
-                    handler (this, new TrackEventArgs (fields));
+                    handler (this, new TrackEventArgs (track, fields));
                 }
             });
         }
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 797c053..665b814 100644
--- a/src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs
+++ b/src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs
@@ -30,12 +30,15 @@ using System;
 using System.IO;
 using System.Threading;
 using System.Collections.Generic;
+using System.Linq;
 using Mono.Unix;
 
 using IPod;
 
 using Hyena;
+using Hyena.Query;
 using Banshee.Base;
+using Banshee.Collection;
 using Banshee.ServiceStack;
 using Banshee.Sources;
 using Banshee.Dap;
@@ -43,6 +46,7 @@ using Banshee.Hardware;
 using Banshee.Collection.Database;
 using Banshee.Library;
 using Banshee.Playlist;
+using Banshee.Query;
 
 using Banshee.Dap.Gui;
 
@@ -50,6 +54,11 @@ namespace Banshee.Dap.Ipod
 {
     public class IpodSource : DapSource
     {
+        public IpodSource ()
+        {
+            TracksChanged += OnTracksChanged;
+        }
+
         private PodSleuthDevice ipod_device;
         internal PodSleuthDevice IpodDevice {
             get { return ipod_device; }
@@ -112,6 +121,7 @@ namespace Banshee.Dap.Ipod
 
         public override void Dispose ()
         {
+            TracksChanged -= OnTracksChanged;
             ThreadAssist.ProxyToMain (DestroyUnsupportedView);
             CancelSyncThread ();
             base.Dispose ();
@@ -399,6 +409,15 @@ namespace Banshee.Dap.Ipod
 
 #region Syncing
 
+        private void OnTracksChanged (Source sender, TrackEventArgs args)
+        {
+            if (args.Track == null || !args.ChangedFields.Contains <QueryField> (BansheeQuery.RatingField))
+                return;
+
+            if (args.Track is DatabaseTrackInfo)
+                UpdateTrack ((DatabaseTrackInfo)args.Track);
+        }
+
         protected override void OnTracksAdded ()
         {
             if (!IsAdding && tracks_to_add.Count > 0 && !Sync.Syncing) {
@@ -439,6 +458,22 @@ namespace Banshee.Dap.Ipod
             throw new Exception ("Copy to Library is not implemented for iPods yet");
         }*/
 
+        protected bool UpdateTrack (DatabaseTrackInfo track)
+        {
+            lock (sync_mutex) {
+                if (!tracks_map.ContainsKey (track.TrackId)) {
+                    return false;
+                }
+                IpodTrackInfo ipod_track = tracks_map [track.TrackId];
+                if (ipod_track != null) {
+                    ipod_track.Rating = track.Rating;
+                    ipod_track.CommitToIpod (IpodDevice);
+                }
+                
+                return true;
+            }
+        }
+
         protected override bool DeleteTrack (DatabaseTrackInfo track)
         {
             lock (sync_mutex) {
