diff --git a/gfxdrivers/ati128/ati128_overlay.c b/gfxdrivers/ati128/ati128_overlay.c
index c7c74cb..f56d128 100644
--- a/gfxdrivers/ati128/ati128_overlay.c
+++ b/gfxdrivers/ati128/ati128_overlay.c
@@ -213,10 +213,11 @@ ov0SetRegion( CoreLayer                  *layer,
 }
 
 static DFBResult
-ov0RemoveRegion( CoreLayer *layer,
-                 void      *driver_data,
-                 void      *layer_data,
-                 void      *region_data )
+ov0RemoveRegion( CoreLayer   *layer,
+                 void        *driver_data,
+                 void        *layer_data,
+                 void        *region_data,
+                 CoreSurface *surface )
 {
      ATI128DriverData    *adrv = (ATI128DriverData*) driver_data;
      ATIOverlayLayerData *aov0 = (ATIOverlayLayerData*) layer_data;
diff --git a/gfxdrivers/cle266/uc_overlay.c b/gfxdrivers/cle266/uc_overlay.c
index 29feb0d..f5dcfca 100644
--- a/gfxdrivers/cle266/uc_overlay.c
+++ b/gfxdrivers/cle266/uc_overlay.c
@@ -22,10 +22,11 @@
 
 // Forward declaration
 static DFBResult
-uc_ovl_remove(CoreLayer *layer,
-              void      *driver_data,
-              void      *layer_data,
-              void      *region_data);
+uc_ovl_remove(CoreLayer   *layer,
+              void        *driver_data,
+              void        *layer_data,
+              void        *region_data,
+              CoreSurface *surface);
 
 
 static int uc_ovl_datasize()
@@ -90,7 +91,7 @@ uc_ovl_init_layer( CoreLayer                   *layer,
     adjustment->hue = 0x8000;
     ucovl->v1.adj = *adjustment;
 
-    uc_ovl_remove(layer, driver_data, layer_data, NULL);
+    uc_ovl_remove(layer, driver_data, layer_data, NULL, NULL);
 
     return DFB_OK;
 }
@@ -133,10 +134,11 @@ uc_ovl_set_region( CoreLayer                  *layer,
 
 
 static DFBResult
-uc_ovl_remove(CoreLayer *layer,
-              void      *driver_data,
-              void      *layer_data,
-              void      *region_data)
+uc_ovl_remove(CoreLayer   *layer,
+              void        *driver_data,
+              void        *layer_data,
+              void        *region_data,
+              CoreSurface *surface)
 {
     UcDriverData*  ucdrv = (UcDriverData*) driver_data;
     UcOverlayData* ucovl = (UcOverlayData*) layer_data;
diff --git a/gfxdrivers/cyber5k/cyber5k_underlay.c b/gfxdrivers/cyber5k/cyber5k_underlay.c
index 61864d5..c9eba6c 100644
--- a/gfxdrivers/cyber5k/cyber5k_underlay.c
+++ b/gfxdrivers/cyber5k/cyber5k_underlay.c
@@ -171,10 +171,11 @@ udlSetRegion( CoreLayer                  *layer,
 }
 
 static DFBResult
-udlRemoveRegion( CoreLayer *layer,
-                 void      *driver_data,
-                 void      *layer_data,
-                 void      *region_data )
+udlRemoveRegion( CoreLayer   *layer,
+                 void        *driver_data,
+                 void        *layer_data,
+                 void        *region_data,
+                 CoreSurface *surface )
 {
      /* disable and clean up */
      cyber_enable_overlay(0);
diff --git a/gfxdrivers/i810/i810_overlay.c b/gfxdrivers/i810/i810_overlay.c
index c6c41f7..3ac7c61 100644
--- a/gfxdrivers/i810/i810_overlay.c
+++ b/gfxdrivers/i810/i810_overlay.c
@@ -290,10 +290,11 @@ ovlSetRegion( CoreLayer                  *layer,
 }
 
 static DFBResult
-ovlRemoveRegion( CoreLayer *layer,
-                 void      *driver_data,
-                 void      *layer_data,
-                 void      *region_data )
+ovlRemoveRegion( CoreLayer   *layer,
+                 void        *driver_data,
+                 void        *layer_data,
+                 void        *region_data,
+                 CoreSurface *surface )
 {
 	I810DriverData *i810drv = (I810DriverData *) driver_data;
 
diff --git a/gfxdrivers/i830/i830_overlay.c b/gfxdrivers/i830/i830_overlay.c
index 4725a76..08c4804 100644
--- a/gfxdrivers/i830/i830_overlay.c
+++ b/gfxdrivers/i830/i830_overlay.c
@@ -277,10 +277,11 @@ ovlSetRegion( CoreLayer                  *layer,
 }
 
 static DFBResult
-ovlRemoveRegion( CoreLayer *layer,
-                 void      *driver_data,
-                 void      *layer_data,
-                 void      *region_data )
+ovlRemoveRegion( CoreLayer   *layer,
+                 void        *driver_data,
+                 void        *layer_data,
+                 void        *region_data,
+                 CoreSurface *surface )
 {
      I830DriverData *idrv = driver_data;
      I830DeviceData *idev = idrv->idev;
diff --git a/gfxdrivers/mach64/mach64_overlay.c b/gfxdrivers/mach64/mach64_overlay.c
index b1f6d71..d5d4f6b 100644
--- a/gfxdrivers/mach64/mach64_overlay.c
+++ b/gfxdrivers/mach64/mach64_overlay.c
@@ -289,10 +289,11 @@ ovSetRegion( CoreLayer                  *layer,
 }
 
 static DFBResult
-ovRemoveRegion( CoreLayer *layer,
-                void      *driver_data,
-                void      *layer_data,
-                void      *region_data )
+ovRemoveRegion( CoreLayer   *layer,
+                void        *driver_data,
+                void        *layer_data,
+                void        *region_data,
+                CoreSurface *surface )
 {
      Mach64DriverData *mdrv = (Mach64DriverData*) driver_data;
      Mach64DeviceData *mdev = mdrv->device_data;
diff --git a/gfxdrivers/matrox/matrox_bes.c b/gfxdrivers/matrox/matrox_bes.c
index a279920..2f4529e 100644
--- a/gfxdrivers/matrox/matrox_bes.c
+++ b/gfxdrivers/matrox/matrox_bes.c
@@ -304,10 +304,11 @@ besSetRegion( CoreLayer                  *layer,
 }
 
 static DFBResult
-besRemoveRegion( CoreLayer *layer,
-                 void      *driver_data,
-                 void      *layer_data,
-                 void      *region_data )
+besRemoveRegion( CoreLayer   *layer,
+                 void        *driver_data,
+                 void        *layer_data,
+                 void        *region_data,
+                 CoreSurface *surface )
 {
      MatroxDriverData   *mdrv = (MatroxDriverData*) driver_data;
 
diff --git a/gfxdrivers/matrox/matrox_crtc2.c b/gfxdrivers/matrox/matrox_crtc2.c
index 2e8879d..34b3be4 100644
--- a/gfxdrivers/matrox/matrox_crtc2.c
+++ b/gfxdrivers/matrox/matrox_crtc2.c
@@ -287,10 +287,11 @@ crtc2SetRegion( CoreLayer                  *layer,
 }
 
 static DFBResult
-crtc2RemoveRegion( CoreLayer *layer,
-                   void      *driver_data,
-                   void      *layer_data,
-                   void      *region_data )
+crtc2RemoveRegion( CoreLayer   *layer,
+                   void        *driver_data,
+                   void        *layer_data,
+                   void        *region_data,
+                   CoreSurface *surface )
 {
      MatroxDriverData     *mdrv   = (MatroxDriverData*) driver_data;
      MatroxCrtc2LayerData *mcrtc2 = (MatroxCrtc2LayerData*) layer_data;
diff --git a/gfxdrivers/matrox/matrox_spic.c b/gfxdrivers/matrox/matrox_spic.c
index 54b9706..f6bff00 100644
--- a/gfxdrivers/matrox/matrox_spic.c
+++ b/gfxdrivers/matrox/matrox_spic.c
@@ -234,10 +234,11 @@ spicSetRegion( CoreLayer                  *layer,
 }
 
 static DFBResult
-spicRemoveRegion( CoreLayer *layer,
-                  void      *driver_data,
-                  void      *layer_data,
-                  void      *region_data )
+spicRemoveRegion( CoreLayer   *layer,
+                  void        *driver_data,
+                  void        *layer_data,
+                  void        *region_data,
+                  CoreSurface *surface )
 {
      MatroxDriverData    *mdrv  = (MatroxDriverData*) driver_data;
      MatroxSpicLayerData *mspic = (MatroxSpicLayerData*) layer_data;
diff --git a/gfxdrivers/neomagic/neo_overlay.c b/gfxdrivers/neomagic/neo_overlay.c
index 4cbb8cd..996086e 100644
--- a/gfxdrivers/neomagic/neo_overlay.c
+++ b/gfxdrivers/neomagic/neo_overlay.c
@@ -218,10 +218,11 @@ ovlSetRegion( CoreLayer                  *layer,
 }
 
 static DFBResult
-ovlRemoveRegion( CoreLayer *layer,
-                 void      *driver_data,
-                 void      *layer_data,
-                 void      *region_data )
+ovlRemoveRegion( CoreLayer   *layer,
+                 void        *driver_data,
+                 void        *layer_data,
+                 void        *region_data,
+                 CoreSurface *surface )
 {
      NeoDriverData       *ndrv = (NeoDriverData*) driver_data;
      NeoOverlayLayerData *novl = (NeoOverlayLayerData*) layer_data;
diff --git a/gfxdrivers/nvidia/nvidia_overlay.c b/gfxdrivers/nvidia/nvidia_overlay.c
index 2ffb956..5371851 100644
--- a/gfxdrivers/nvidia/nvidia_overlay.c
+++ b/gfxdrivers/nvidia/nvidia_overlay.c
@@ -159,10 +159,11 @@ ov0InitLayer( CoreLayer                  *layer,
 }
 
 static DFBResult
-ov0Remove( CoreLayer *layer,
-           void      *driver_data,
-           void      *layer_data,
-           void      *region_data )
+ov0Remove( CoreLayer   *layer,
+           void        *driver_data,
+           void        *layer_data,
+           void        *region_data,
+           CoreSurface *surface )
 {
      NVidiaDriverData *nvdrv = (NVidiaDriverData*) driver_data;
      volatile u8      *mmio  = nvdrv->mmio_base;
diff --git a/gfxdrivers/radeon/radeon_crtc2.c b/gfxdrivers/radeon/radeon_crtc2.c
index 25edc32..3ca59f0 100644
--- a/gfxdrivers/radeon/radeon_crtc2.c
+++ b/gfxdrivers/radeon/radeon_crtc2.c
@@ -434,10 +434,11 @@ crtc2SetRegion( CoreLayer                  *layer,
 }
 
 static DFBResult
-crtc2RemoveRegion( CoreLayer *layer,
-                   void      *driver_data,
-                   void      *layer_data,
-                   void      *region_data )
+crtc2RemoveRegion( CoreLayer   *layer,
+                   void        *driver_data,
+                   void        *layer_data,
+                   void        *region_data,
+                   CoreSurface *surface )
 {
      RadeonDriverData     *rdrv   = (RadeonDriverData*) driver_data;
      RadeonCrtc2LayerData *rcrtc2 = (RadeonCrtc2LayerData*) layer_data;
diff --git a/gfxdrivers/radeon/radeon_overlay.c b/gfxdrivers/radeon/radeon_overlay.c
index 83ac4bb..03569f2 100644
--- a/gfxdrivers/radeon/radeon_overlay.c
+++ b/gfxdrivers/radeon/radeon_overlay.c
@@ -432,10 +432,11 @@ ovlSetLevel( CoreLayer *layer,
 }
 
 static DFBResult
-ovlRemoveRegion( CoreLayer *layer,
-                 void      *driver_data,
-                 void      *layer_data,
-                 void      *region_data )
+ovlRemoveRegion( CoreLayer   *layer,
+                 void        *driver_data,
+                 void        *layer_data,
+                 void        *region_data,
+                 CoreSurface *surface )
 {
      RadeonDriverData *rdrv = (RadeonDriverData*) driver_data;
      RadeonDeviceData *rdev = rdrv->device_data;
diff --git a/gfxdrivers/unichrome/uc_overlay.c b/gfxdrivers/unichrome/uc_overlay.c
index 1582006..d3070d5 100755
--- a/gfxdrivers/unichrome/uc_overlay.c
+++ b/gfxdrivers/unichrome/uc_overlay.c
@@ -28,10 +28,11 @@
 
 // Forward declaration
 static DFBResult
-uc_ovl_remove(CoreLayer *layer,
-              void      *driver_data,
-              void      *layer_data,
-              void      *region_data);
+uc_ovl_remove(CoreLayer   *layer,
+              void        *driver_data,
+              void        *layer_data,
+              void        *region_data,
+              CoreSurface *surface);
 
 
 static int uc_ovl_datasize()
@@ -108,7 +109,7 @@ uc_ovl_init_layer( CoreLayer                   *layer,
     adjustment->hue = 0x8000;
     ucovl->v1.adj = *adjustment;
 
-    uc_ovl_remove(layer, driver_data, layer_data, NULL);
+    uc_ovl_remove(layer, driver_data, layer_data, NULL, NULL);
 
     return DFB_OK;
 }
@@ -171,10 +172,11 @@ uc_ovl_set_region( CoreLayer                  *layer,
 
 
 static DFBResult
-uc_ovl_remove(CoreLayer *layer,
-              void      *driver_data,
-              void      *layer_data,
-              void      *region_data)
+uc_ovl_remove(CoreLayer   *layer,
+              void        *driver_data,
+              void        *layer_data,
+              void        *region_data,
+              CoreSurface *surface)
 {
     UcDriverData*  ucdrv = (UcDriverData*) driver_data;
     UcOverlayData* ucovl = (UcOverlayData*) layer_data;
diff --git a/gfxdrivers/unichrome/uc_spic.c b/gfxdrivers/unichrome/uc_spic.c
index bfdb767..b0f2d38 100755
--- a/gfxdrivers/unichrome/uc_spic.c
+++ b/gfxdrivers/unichrome/uc_spic.c
@@ -154,10 +154,11 @@ uc_spic_set_region( CoreLayer                  *layer,
 }
 
 static DFBResult
-uc_spic_remove( CoreLayer *layer,
-                void      *driver_data,
-                void      *layer_data,
-                void      *region_data )
+uc_spic_remove( CoreLayer   *layer,
+                void        *driver_data,
+                void        *layer_data,
+                void        *region_data,
+                CoreSurface *surface )
 {
     UcDriverData*  ucdrv = (UcDriverData*) driver_data;
 
diff --git a/src/core/layer_region.c b/src/core/layer_region.c
index 5d913f3..18cb96a 100644
--- a/src/core/layer_region.c
+++ b/src/core/layer_region.c
@@ -1,4 +1,5 @@
 /*
+   (c) Copyright 2007-2009  Intel Corporation.
    (c) Copyright 2001-2007  The DirectFB Organization (directfb.org)
    (c) Copyright 2000-2004  Convergence (integrated media) GmbH
 
@@ -930,8 +931,16 @@ unrealize_region( CoreLayerRegion *region )
 
      /* Remove the region from hardware and driver. */
      if (funcs->RemoveRegion) {
-          ret = funcs->RemoveRegion( layer, layer->driver_data,
-                                     layer->layer_data, region->region_data );
+          // It is necessary to provide the CoreSurface to the driver so it 
+          // can fully perform region removal and reverse the actions 
+          // performed by funcs->SetRegion.  Note:  It also previously 
+          // received a CorePalette but does not need that at this point.
+          ret = funcs->RemoveRegion( 
+                            layer, 
+                            layer->driver_data, 
+                            layer->layer_data, 
+                            region->region_data, 
+                            region->surface );
           if (ret) {
                D_DERROR( ret, "Core/Layers: Could not remove region!\n" );
                return ret;
diff --git a/src/core/layers.c b/src/core/layers.c
index 8d7cf1f..9950e89 100644
--- a/src/core/layers.c
+++ b/src/core/layers.c
@@ -1,4 +1,5 @@
 /*
+   (c) Copyright 2007-2009  Intel Corporation.
    (c) Copyright 2001-2007  The DirectFB Organization (directfb.org)
    (c) Copyright 2000-2004  Convergence (integrated media) GmbH
 
@@ -260,8 +261,18 @@ dfb_layers_shutdown( CoreDFB *core, bool emergency )
                                DFB_RECTANGLE_VALS( &region->config.dest ),
                                shared->description.name );
 
-                   ret = funcs->RemoveRegion( layer, layer->driver_data,
-                                              layer->layer_data, region->region_data );
+                   // It is necessary to provide the CoreSurface to the driver 
+                   // so it can fully perform region removal and reverse the 
+                   // actions performed by funcs->SetRegion.  Note:  It also 
+                   // previously received a CorePalette but does not need that 
+                   // at this point.
+                   ret = funcs->RemoveRegion( 
+                                    layer, 
+                                    layer->driver_data, 
+                                    layer->layer_data, 
+                                    region->region_data, 
+                                    region->surface );
+
                    if (ret)
                         D_DERROR( ret, "Core/Layers: Could not remove region!\n" );
                }
diff --git a/src/core/layers.h b/src/core/layers.h
index 0312c7b..8f348d9 100644
--- a/src/core/layers.h
+++ b/src/core/layers.h
@@ -1,4 +1,5 @@
 /*
+   (c) Copyright 2007-2009  Intel Corporation.
    (c) Copyright 2001-2007  The DirectFB Organization (directfb.org)
    (c) Copyright 2000-2004  Convergence (integrated media) GmbH
 
@@ -31,7 +32,7 @@
 
 #include <directfb.h>
 
-#include <core/coretypes.h>
+#include <src/core/coretypes.h>
 
 struct __DFB_CoreLayerRegionConfig {
      int                        width;            /* width of the source in pixels */
@@ -203,7 +204,8 @@ typedef struct {
      DFBResult (*RemoveRegion) ( CoreLayer                  *layer,
                                  void                       *driver_data,
                                  void                       *layer_data,
-                                 void                       *region_data );
+                                 void                       *region_data,
+                                 CoreSurface                *surface );
 
      /*
       * Flip the surface of the region.
diff --git a/systems/fbdev/fbdev.c b/systems/fbdev/fbdev.c
index 3621748..98dd907 100644
--- a/systems/fbdev/fbdev.c
+++ b/systems/fbdev/fbdev.c
@@ -147,7 +147,8 @@ static DFBResult primarySetRegion     ( CoreLayer                  *layer,
 static DFBResult primaryRemoveRegion  ( CoreLayer                  *layer,
                                         void                       *driver_data,
                                         void                       *layer_data,
-                                        void                       *region_data );
+                                        void                       *region_data,
+                                        CoreSurface                *surface );
 
 static DFBResult primaryFlipRegion    ( CoreLayer                  *layer,
                                         void                       *driver_data,
@@ -1364,10 +1365,11 @@ primarySetRegion( CoreLayer                  *layer,
 }
 
 static DFBResult
-primaryRemoveRegion( CoreLayer             *layer,
-                     void                  *driver_data,
-                     void                  *layer_data,
-                     void                  *region_data )
+primaryRemoveRegion( CoreLayer   *layer,
+                     void        *driver_data,
+                     void        *layer_data,
+                     void        *region_data,
+                     CoreSurface *surface )
 {
      return DFB_OK;
 }
diff --git a/systems/osx/primary.c b/systems/osx/primary.c
index be00d03..2e0dd7e 100644
--- a/systems/osx/primary.c
+++ b/systems/osx/primary.c
@@ -244,10 +244,11 @@ primarySetRegion( CoreLayer                  *layer,
 }
 
 static DFBResult
-primaryRemoveRegion( CoreLayer             *layer,
-                     void                  *driver_data,
-                     void                  *layer_data,
-                     void                  *region_data )
+primaryRemoveRegion( CoreLayer   *layer,
+                     void        *driver_data,
+                     void        *layer_data,
+                     void        *region_data,
+                     CoreSurface *surface )
 {
      dfb_osx->primary = NULL;
 
diff --git a/systems/sdl/primary.c b/systems/sdl/primary.c
index 7db50ad..5b4606e 100644
--- a/systems/sdl/primary.c
+++ b/systems/sdl/primary.c
@@ -266,10 +266,11 @@ primarySetRegion( CoreLayer                  *layer,
 }
 
 static DFBResult
-primaryRemoveRegion( CoreLayer             *layer,
-                     void                  *driver_data,
-                     void                  *layer_data,
-                     void                  *region_data )
+primaryRemoveRegion( CoreLayer   *layer,
+                     void        *driver_data,
+                     void        *layer_data,
+                     void        *region_data,
+                     CoreSurface *surface )
 {
      D_DEBUG_AT( SDL_Updates, "%s( %p )\n", __FUNCTION__, layer );
 
diff --git a/systems/vnc/primary.c b/systems/vnc/primary.c
index 36547db..56b5d1e 100644
--- a/systems/vnc/primary.c
+++ b/systems/vnc/primary.c
@@ -276,10 +276,11 @@ primarySetRegion( CoreLayer                  *layer,
 }
 
 static DFBResult
-primaryRemoveRegion( CoreLayer             *layer,
-                     void                  *driver_data,
-                     void                  *layer_data,
-                     void                  *region_data )
+primaryRemoveRegion( CoreLayer   *layer,
+                     void        *driver_data,
+                     void        *layer_data,
+                     void        *region_data,
+                     CoreSurface *surface )
 {
      dfb_vnc->primary = NULL;
 
diff --git a/systems/x11/primary.c b/systems/x11/primary.c
index 0f9d2f2..6a7ba71 100644
--- a/systems/x11/primary.c
+++ b/systems/x11/primary.c
@@ -267,10 +267,11 @@ primarySetRegion( CoreLayer                  *layer,
 }
 
 static DFBResult
-primaryRemoveRegion( CoreLayer             *layer,
-                     void                  *driver_data,
-                     void                  *layer_data,
-                     void                  *region_data )
+primaryRemoveRegion( CoreLayer   *layer,
+                     void        *driver_data,
+                     void        *layer_data,
+                     void        *region_data,
+                     CoreSurface *surface )
 {
      dfb_x11->primary = NULL;
 
