diff --git a/libgnome-desktop/gnome-bg.c b/libgnome-desktop/gnome-bg.c
index 1df349c..9caee61 100644
--- a/libgnome-desktop/gnome-bg.c
+++ b/libgnome-desktop/gnome-bg.c
@@ -38,6 +38,8 @@ Author: Soren Sandmann <sandmann@redhat.com>
 #include <X11/Xlib.h>
 #include <X11/Xatom.h>
 
+#include <gdk/gdkdrawable.h>
+
 #include <cairo.h>
 
 #include <gconf/gconf-client.h>
@@ -683,13 +685,14 @@ get_scaled_pixbuf (GnomeBGPlacement placement,
 	return new;
 }
 
-static void
-draw_image (GnomeBGPlacement  placement,
-	    GdkPixbuf        *pixbuf,
-	    GdkPixbuf        *dest)
+void
+draw_image_region (GnomeBGPlacement  placement,
+		   GdkPixbuf        *pixbuf,
+		   GdkPixbuf        *dest,
+		   GdkRectangle     *region)
 {
-	int dest_width = gdk_pixbuf_get_width (dest);
-	int dest_height = gdk_pixbuf_get_height (dest);
+	int dest_width = region->width;
+	int dest_height = region->height;
 	int x, y, w, h;
 	GdkPixbuf *scaled;
 	
@@ -707,7 +710,7 @@ draw_image (GnomeBGPlacement  placement,
 	case GNOME_BG_PLACEMENT_CENTERED:
 	case GNOME_BG_PLACEMENT_FILL_SCREEN:
 	case GNOME_BG_PLACEMENT_SCALED:
-		pixbuf_blend (scaled, dest, 0, 0, w, h, x, y, 1.0);
+		pixbuf_blend (scaled, dest, 0, , w, h, x + region->x, y + region->y, 1.0);
 		break;
 	default:
 		g_assert_not_reached ();
@@ -717,15 +720,62 @@ draw_image (GnomeBGPlacement  placement,
 	g_object_unref (scaled);
 }
 
+
+static void
+draw_image (GnomeBGPlacement  placement,
+	    GdkPixbuf        *pixbuf,
+	    GdkPixbuf        *dest)
+{
+	int dest_width = gdk_pixbuf_get_width (dest);
+	int dest_height = gdk_pixbuf_get_height (dest);
+	GdkRectangle rect;
+
+	rect.x = 0;
+	rect.y = 0;
+	rect.width = dest_width;
+	rect.height = dest_height;
+
+	draw_image_region (placement, pixbuf, dest, &rect);
+}
+
+void
+draw_on_monitor (GnomeBG* bg, GdkPixbuf *dest, GdkRectangle *region)
+{
+	draw_image_region (bg->placement, get_pixbuf (bg), dest, region);
+}
+
+void
+draw_each_monitor (GnomeBG *bg, GdkPixbuf *dest, GdkScreen *screen)
+{
+	gint num_monitors;
+	GdkRectangle rect;
+	int monitor;
+
+	// tile: don't worry about aligning on every monitor
+	if (bg->placement == GNOME_BG_PLACEMENT_TILED)
+		draw_image (bg->placement, get_pixbuf (bg), dest);
+
+	num_monitors = gdk_screen_get_n_monitors (screen);
+
+	for (monitor = 0; monitor < num_monitors; monitor++) {
+		gdk_screen_get_monitor_geometry (screen, monitor, &rect);
+		draw_on_monitor (bg, dest, &rect);
+	}
+}
+
 void
-gnome_bg_draw (GnomeBG *bg, GdkPixbuf *dest)
+gnome_bg_draw (GnomeBG *bg, GdkPixbuf *dest, GdkScreen *screen)
 {
 	if (!bg)
 		return;
 	
 	draw_color (bg, dest);
 	
+#if GNOME_BG_EMULATE_SINGLE_MONITOR
 	draw_image (bg->placement, get_pixbuf (bg), dest);
+#else
+	draw_each_monitor (bg, dest, screen);
+#endif
 }
 
 gboolean
@@ -882,7 +932,7 @@ gnome_bg_create_pixmap (GnomeBG	    *bg,
 		
 		pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, FALSE, 8,
 					 width, height);
-		gnome_bg_draw (bg, pixbuf);
+		gnome_bg_draw (bg, pixbuf, gdk_drawable_get_screen (GDK_DRAWABLE (window)));
 		gdk_draw_pixbuf (pixmap, NULL, pixbuf,
 				 0, 0,
 				 0, 0, width, height,
diff --git a/libgnome-desktop/libgnomeui/gnome-bg.h b/libgnome-desktop/libgnomeui/gnome-bg.h
index aa7c21c..f14be94 100644
--- a/libgnome-desktop/libgnomeui/gnome-bg.h
+++ b/libgnome-desktop/libgnomeui/gnome-bg.h
@@ -87,7 +87,8 @@ const gchar *    gnome_bg_get_filename          (GnomeBG               *bg);
 
 /* Drawing and thumbnailing */
 void             gnome_bg_draw                  (GnomeBG               *bg,
-						 GdkPixbuf             *dest);
+						 GdkPixbuf             *dest,
+						 GdkScreen	       *screen);
 GdkPixmap *      gnome_bg_create_pixmap         (GnomeBG               *bg,
 						 GdkWindow             *window,
 						 int                    width,
-- 
1.6.0.4

