diff --git a/gdk/gdkoffscreenwindow.c b/gdk/gdkoffscreenwindow.c
index 23d92af..190b673 100644
--- a/gdk/gdkoffscreenwindow.c
+++ b/gdk/gdkoffscreenwindow.c
@@ -254,45 +254,6 @@ gdk_offscreen_window_get_visual (GdkDrawable    *drawable)
   return gdk_drawable_get_visual (offscreen->wrapper);
 }
 
-static void
-add_damage (GdkOffscreenWindow *offscreen,
-	    int x, int y,
-	    int w, int h,
-	    gboolean is_line)
-{
-  GdkRectangle rect;
-  GdkRegion *damage;
-
-  rect.x = x;
-  rect.y = y;
-  rect.width = w;
-  rect.height = h;
-
-  if (is_line)
-    {
-      /* This should really take into account line width, line
-       * joins (and miter) and line caps. But these are hard
-       * to compute, rarely used and generally a pain. And in
-       * the end a snug damage rectangle is not that important
-       * as multiple damages are generally created anyway.
-       *
-       * So, we just add some padding around the rect.
-       * We use a padding of 3 pixels, plus an extra row
-       * below and on the right for the normal line size. I.E.
-       * line from (0,0) to (2,0) gets h=0 but is really
-       * at least one pixel tall.
-       */
-      rect.x -= 3;
-      rect.y -= 3;
-      rect.width += 7;
-      rect.height += 7;
-    }
-
-  damage = gdk_region_rectangle (&rect);
-  _gdk_window_add_damage (offscreen->wrapper, damage);
-  gdk_region_destroy (damage);
-}
-
 static GdkDrawable *
 get_real_drawable (GdkOffscreenWindow *offscreen)
 {
@@ -320,8 +281,6 @@ gdk_offscreen_window_draw_drawable (GdkDrawable *drawable,
 		     src, xsrc, ysrc,
 		     xdest, ydest,
 		     width, height);
-
-  add_damage (offscreen, xdest, ydest, width, height, FALSE);
 }
 
 static void
@@ -338,9 +297,6 @@ gdk_offscreen_window_draw_rectangle (GdkDrawable  *drawable,
 
   gdk_draw_rectangle (real_drawable,
 		      gc, filled, x, y, width, height);
-
-  add_damage (offscreen, x, y, width, height, !filled);
-
 }
 
 static void
@@ -366,7 +322,6 @@ gdk_offscreen_window_draw_arc (GdkDrawable  *drawable,
 		height,
 		angle1,
 		angle2);
-  add_damage (offscreen, x, y, width, height, !filled);
 }
 
 static void
@@ -399,10 +354,6 @@ gdk_offscreen_window_draw_polygon (GdkDrawable  *drawable,
 	    min_y = MIN (min_y, points[i].y);
 	    max_y = MAX (max_y, points[i].y);
 	  }
-
-	add_damage (offscreen, min_x, min_y,
-		    max_x - min_x,
-		    max_y - min_y, !filled);
     }
 }
 
@@ -417,7 +368,6 @@ gdk_offscreen_window_draw_text (GdkDrawable  *drawable,
 {
   GdkOffscreenWindow *offscreen = GDK_OFFSCREEN_WINDOW (drawable);
   GdkDrawable *real_drawable = get_real_drawable (offscreen);
-  GdkWindowObject *private = GDK_WINDOW_OBJECT (offscreen->wrapper);
 
   gdk_draw_text (real_drawable,
 		 font,
@@ -426,9 +376,6 @@ gdk_offscreen_window_draw_text (GdkDrawable  *drawable,
 		 y,
 		 text,
 		 text_length);
-
-  /* Hard to compute the minimal size, not that often used anyway. */
-  add_damage (offscreen, 0, 0, private->width, private->height, FALSE);
 }
 
 static void
@@ -442,7 +389,6 @@ gdk_offscreen_window_draw_text_wc (GdkDrawable	 *drawable,
 {
   GdkOffscreenWindow *offscreen = GDK_OFFSCREEN_WINDOW (drawable);
   GdkDrawable *real_drawable = get_real_drawable (offscreen);
-  GdkWindowObject *private = GDK_WINDOW_OBJECT (offscreen->wrapper);
 
   gdk_draw_text_wc (real_drawable,
 		    font,
@@ -451,9 +397,6 @@ gdk_offscreen_window_draw_text_wc (GdkDrawable	 *drawable,
 		    y,
 		    text,
 		    text_length);
-
-  /* Hard to compute the minimal size, not that often used anyway. */
-  add_damage (offscreen, 0, 0, private->width, private->height, FALSE);
 }
 
 static void
@@ -485,11 +428,6 @@ gdk_offscreen_window_draw_points (GdkDrawable  *drawable,
 	    min_y = MIN (min_y, points[i].y);
 	    max_y = MAX (max_y, points[i].y);
 	  }
-
-	add_damage (offscreen, min_x, min_y,
-		    max_x - min_x + 1,
-		    max_y - min_y + 1,
-		    FALSE);
     }
 }
 
@@ -525,10 +463,6 @@ gdk_offscreen_window_draw_segments (GdkDrawable  *drawable,
 	    min_y = MIN (min_y, segs[i].y2);
 	    max_y = MAX (max_y, segs[i].y2);
 	  }
-
-	add_damage (offscreen, min_x, min_y,
-		    max_x - min_x,
-		    max_y - min_y, TRUE);
     }
 
 }
@@ -541,17 +475,11 @@ gdk_offscreen_window_draw_lines (GdkDrawable  *drawable,
 {
   GdkOffscreenWindow *offscreen = GDK_OFFSCREEN_WINDOW (drawable);
   GdkDrawable *real_drawable = get_real_drawable (offscreen);
-  GdkWindowObject *private = GDK_WINDOW_OBJECT (offscreen->wrapper);
 
   gdk_draw_lines (real_drawable,
 		  gc,
 		  points,
 		  npoints);
-
-  /* Hard to compute the minimal size, as we don't know the line
-     width, and since joins are hard to calculate.
-     Its not that often used anyway, damage it all */
-  add_damage (offscreen, 0, 0, private->width, private->height, TRUE);
 }
 
 static void
@@ -577,8 +505,6 @@ gdk_offscreen_window_draw_image (GdkDrawable *drawable,
 		  ydest,
 		  width,
 		  height);
-
-  add_damage (offscreen, xdest, ydest, width, height, FALSE);
 }
 
 
@@ -611,9 +537,6 @@ gdk_offscreen_window_draw_pixbuf (GdkDrawable *drawable,
 		   dither,
 		   x_dither,
 		   y_dither);
-
-  add_damage (offscreen, dest_x, dest_y, width, height, FALSE);
-
 }
 
 void
diff --git a/gdk/gdkwindow.c b/gdk/gdkwindow.c
index 00811f3..aed26eb 100644
--- a/gdk/gdkwindow.c
+++ b/gdk/gdkwindow.c
@@ -5206,6 +5206,13 @@ _gdk_window_process_updates_recurse (GdkWindow *window,
   if (gdk_region_empty (expose_region))
     return;
 
+  if (gdk_window_is_offscreen (private->impl_window) &&
+      private == private->impl_window)
+    {
+      _gdk_window_add_damage ((GdkWindow *) private->impl_window,
+                              expose_region);
+    }
+
   /* Make this reentrancy safe for expose handlers freeing windows */
   children = g_list_copy (private->children);
   g_list_foreach (children, (GFunc)g_object_ref, NULL);
