diff -up gnome-settings-daemon-2.24.0/plugins/background/gsd-background-manager.c.fade gnome-settings-daemon-2.24.0/plugins/background/gsd-background-manager.c
--- gnome-settings-daemon-2.24.0/plugins/background/gsd-background-manager.c.fade	2008-08-04 10:25:52.000000000 -0400
+++ gnome-settings-daemon-2.24.0/plugins/background/gsd-background-manager.c	2008-10-14 15:50:08.000000000 -0400
@@ -155,7 +155,8 @@ nautilus_is_running (void)
 }
 
 static void
-draw_background (GsdBackgroundManager *manager)
+draw_background (GsdBackgroundManager *manager,
+                 gboolean              use_crossfade)
 {
         GdkDisplay *display;
         int         n_screens;
@@ -185,7 +186,15 @@ draw_background (GsdBackgroundManager *m
                                                  gdk_screen_get_height (screen),
                                                  TRUE);
 
-                gnome_bg_set_pixmap_as_root (screen, pixmap);
+                if (use_crossfade) {
+                        GnomeBGCrossfade *fade;
+
+                        fade = gnome_bg_set_pixmap_as_root_with_crossfade (screen, pixmap, NULL);
+                        g_signal_connect (fade, "finished",
+                                          G_CALLBACK (g_object_unref), NULL);
+                } else {
+                        gnome_bg_set_pixmap_as_root (screen, pixmap);
+                }
 
                 g_object_unref (pixmap);
         }
@@ -197,7 +206,7 @@ static gboolean
 queue_draw_background (GsdBackgroundManager *manager)
 {
         manager->priv->timeout_id = 0;
-        draw_background (manager);
+        draw_background (manager, TRUE);
         return FALSE;
 }
 
@@ -205,7 +214,14 @@ static void
 on_bg_changed (GnomeBG              *bg,
                GsdBackgroundManager *manager)
 {
-        draw_background (manager);
+        draw_background (manager, TRUE);
+}
+
+static void
+on_bg_transitioned (GnomeBG              *bg,
+                    GsdBackgroundManager *manager)
+{
+        draw_background (manager, FALSE);
 }
 
 static void
@@ -252,9 +268,12 @@ gsd_background_manager_start (GsdBackgro
                           G_CALLBACK (on_bg_changed),
                           manager);
 
+        g_signal_connect (manager->priv->bg,
+                          "transitioned",
+                          G_CALLBACK (on_bg_transitioned),
+                          manager);
+
         watch_bg_preferences (manager);
-        gnome_bg_load_from_preferences (manager->priv->bg,
-                                        manager->priv->client);
 
         /* If this is set, nautilus will draw the background and is
 	 * almost definitely in our session.  however, it may not be
@@ -266,14 +285,22 @@ gsd_background_manager_start (GsdBackgro
         nautilus_show_desktop = gconf_client_get_bool (manager->priv->client,
                                                        "/apps/nautilus/preferences/show_desktop",
                                                        NULL);
+        if (nautilus_show_desktop) {
+
+                gnome_bg_ignore_changes (manager->priv->bg, TRUE);
+
+                gnome_bg_load_from_preferences (manager->priv->bg,
+                                                manager->priv->client);
+
+                gnome_bg_ignore_changes (manager->priv->bg, FALSE);
 
-        if (!nautilus_show_desktop) {
-                draw_background (manager);
-        } else {
                 /* even when nautilus is supposedly handling the
                  * background, apply the settings eventually to make
                  * people running a nautilus-less session happy */
                 manager->priv->timeout_id = g_timeout_add_seconds (8, (GSourceFunc)queue_draw_background, manager);
+        } else {
+                gnome_bg_load_from_preferences (manager->priv->bg,
+                                                manager->priv->client);
         }
 
         gnome_settings_profile_end (NULL);
