diff -up eel-2.24.1/eel/eel-background.c.fade eel-2.24.1/eel/eel-background.c
--- eel-2.24.1/eel/eel-background.c.fade	2008-10-06 13:20:45.000000000 -0400
+++ eel-2.24.1/eel/eel-background.c	2008-10-22 15:44:09.000000000 -0400
@@ -43,6 +43,9 @@
 #include <stdio.h>
 #define GNOME_DESKTOP_USE_UNSTABLE_API
 #include <libgnomeui/gnome-bg.h>
+#include <gdk/gdkx.h>
+
+#include <cairo-xlib.h>
 
 static void       eel_background_class_init                (gpointer       klass);
 static void       eel_background_init                      (gpointer       object,
@@ -78,6 +81,7 @@ struct EelBackgroundDetails {
 	/* Realized data: */
 	gboolean background_changes_with_size;
 	GdkPixmap *background_pixmap;
+	GnomeBGCrossfade *fade;
 	int background_entire_width;
 	int background_entire_height;
 	GdkColor default_color;
@@ -189,6 +193,12 @@ eel_background_finalize (GObject *object
 		background->details->background_pixmap = NULL;
 	}
 
+	if (background->details->fade != NULL) {
+		gnome_bg_crossfade_stop (background->details->fade);
+		g_object_unref (background->details->fade);
+		background->details->fade = NULL;
+	}
+
 	g_free (background->details);
 
 	EEL_CALL_PARENT (G_OBJECT_CLASS, finalize, (object));
@@ -611,25 +621,66 @@ eel_background_reset (EelBackground *bac
 }
 
 static void
+set_root_pixmap (EelBackground *background,
+                 GdkWindow     *window)
+{
+	GdkPixmap *pixmap;
+	GdkScreen *screen;
+	GdkColor color;
+	gboolean changes_with_size;
+
+	pixmap = eel_background_get_pixmap_and_color (background,
+						      window,
+						      &color,
+						      &changes_with_size);
+	screen = gdk_drawable_get_screen (window);
+
+	gnome_bg_set_pixmap_as_root (screen, pixmap);
+	g_object_unref (pixmap);
+}
+
+static gboolean
+fade_to_pixmap (EelBackground *background,
+		 GdkWindow     *window,
+		 GdkPixmap     *pixmap)
+{
+	if (background->details->fade == NULL) {
+		return FALSE;
+	}
+
+	if (!gnome_bg_crossfade_set_end_pixmap (background->details->fade,
+				                pixmap)) {
+		return FALSE;
+	}
+
+	if (!gnome_bg_crossfade_is_started (background->details->fade)) {
+		gnome_bg_crossfade_start (background->details->fade, window, NULL);
+		if (background->details->is_desktop) {
+			g_signal_connect_swapped (background->details->fade,
+					          "finished",
+						  G_CALLBACK (set_root_pixmap), background);
+		}
+	}
+
+	return gnome_bg_crossfade_is_started (background->details->fade);
+}
+
+static void
 eel_background_set_up_widget (EelBackground *background, GtkWidget *widget)
 {
 	GtkStyle *style;
 	GdkPixmap *pixmap;
-	GdkPixmap *root_pixmap;
 	GdkColor color;
 	
-	int window_width;
-	int window_height;
-	
 	GdkWindow *window;
 	gboolean changes_with_size;
+	gboolean in_fade;
+	gboolean was_started;
 
 	if (!GTK_WIDGET_REALIZED (widget)) {
 		return;
 	}
 
-	drawable_get_adjusted_size (background, widget->window, &window_width, &window_height);
-	
 	pixmap = eel_background_get_pixmap_and_color (background,
 						      widget->window,
 						      &color, 
@@ -645,30 +696,26 @@ eel_background_set_up_widget (EelBackgro
 		window = widget->window;
 	}
 
+	if (background->details->fade != NULL) {
+		in_fade = fade_to_pixmap (background, window, pixmap);
+	} else {
+		in_fade = FALSE;
+	}
+
+	if (!in_fade) {
 	if (!changes_with_size || background->details->is_desktop) {
 		gdk_window_set_back_pixmap (window, pixmap, FALSE);
 	} else {
 		gdk_window_set_back_pixmap (window, NULL, FALSE);
 		gdk_window_set_background (window, &color);
 	}
-	
+	}
 
 	background->details->background_changes_with_size =
 		gnome_bg_changes_with_size (background->details->bg);
 	
-	if (background->details->is_desktop) {
-
-		root_pixmap = NULL;
-
-		if (background->details->use_common_pixmap) {
-			root_pixmap = g_object_ref (pixmap);
-		} else {
-			root_pixmap = gnome_bg_create_pixmap (background->details->bg, window,
-							      window_width, window_height, TRUE);
-		}
-
-		gnome_bg_set_pixmap_as_root (gdk_drawable_get_screen (window), root_pixmap);
-		g_object_unref (root_pixmap);
+	if (background->details->is_desktop && !in_fade) {
+		set_root_pixmap (background, window);
 	}
 	
 	if (pixmap) {
@@ -677,8 +724,32 @@ eel_background_set_up_widget (EelBackgro
 }
 
 static void
+free_fade (EelBackground    *background)
+{
+	g_object_unref (background->details->fade);
+	background->details->fade = NULL;
+}
+
+static void
 eel_widget_background_changed (GtkWidget *widget, EelBackground *background)
 {
+	if (GTK_WIDGET_REALIZED (widget)) {
+		if (background->details->fade == NULL) {
+			int width, height;
+			gdk_drawable_get_size (widget->window, &width, &height);
+			background->details->fade = gnome_bg_crossfade_new (width, height);
+			g_signal_connect_swapped (background->details->fade,
+						"finished",
+						G_CALLBACK (free_fade),
+						background);
+		}
+
+		if (!gnome_bg_crossfade_is_started (background->details->fade)) {
+			gnome_bg_crossfade_set_start_pixmap (background->details->fade,
+							     background->details->background_pixmap);
+		}
+	}
+
 	eel_background_unrealize (background);
 	eel_background_set_up_widget (background, widget);
 
@@ -701,10 +772,13 @@ widget_style_set_cb (GtkWidget *widget, 
 static void
 screen_size_changed (GdkScreen *screen, EelBackground *background)
 {
+	if (background->details->fade != NULL) {
+		g_object_unref (background->details->fade);
+		background->details->fade = NULL;
+	}
 	g_signal_emit (background, signals[APPEARANCE_CHANGED], 0);
 }
 
-
 static void
 widget_realized_setup (GtkWidget *widget, gpointer data)
 {
@@ -715,6 +789,8 @@ widget_realized_setup (GtkWidget *widget
         if (background->details->is_desktop) {
 		GdkWindow *root_window;	
 		GdkScreen *screen;
+		GdkPixmap *start_pixmap;
+		int width, height;
 		
 		screen = gtk_widget_get_screen (widget);
 
@@ -734,6 +810,18 @@ widget_realized_setup (GtkWidget *widget
 		} else {
 			background->details->use_common_pixmap = FALSE;
 		}
+
+		gdk_drawable_get_size (widget->window, &width, &height);
+		background->details->fade = gnome_bg_crossfade_new (width, height);
+		g_signal_connect_swapped (background->details->fade,
+					"finished",
+					G_CALLBACK (free_fade),
+					background);
+
+		start_pixmap = gnome_bg_get_pixmap_from_root (screen);
+		gnome_bg_crossfade_set_start_pixmap (background->details->fade, start_pixmap);
+		g_object_unref (start_pixmap);
+
 	}
 }
 
