diff --git a/src/core/core_system.h b/src/core/core_system.h
index d2909f7..505f0db 100644
--- a/src/core/core_system.h
+++ b/src/core/core_system.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
 
@@ -85,6 +86,13 @@ system_video_memory_virtual( unsigned int offset );
 static unsigned int
 system_videoram_length();
 
+static DFBResult
+system_video_memory_allocate( SurfaceManager *manager, 
+                              SurfaceBuffer *buffer );
+
+static DFBResult
+system_video_memory_deallocate( SurfaceBuffer *buffer );
+
 static unsigned long
 system_aux_memory_physical( unsigned int offset );
 
@@ -119,6 +127,8 @@ static CoreSystemFuncs system_funcs = {
      VideoMemoryPhysical: system_video_memory_physical,
      VideoMemoryVirtual:  system_video_memory_virtual,
      VideoRamLength:      system_videoram_length,
+     VideoMemoryAllocate:   system_video_memory_allocate,
+     VideoMemoryDeallocate: system_video_memory_deallocate,
      AuxMemoryPhysical:   system_aux_memory_physical,
      AuxMemoryVirtual:    system_aux_memory_virtual,
      AuxRamLength:        system_auxram_length,
diff --git a/src/core/surfacemanager.c b/src/core/surfacemanager.c
index 18b9f95..3316910 100644
--- a/src/core/surfacemanager.c
+++ b/src/core/surfacemanager.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
 
@@ -479,6 +480,21 @@ DFBResult dfb_surfacemanager_allocate( SurfaceManager *manager,
      if (manager->suspended)
           return DFB_NOVIDEOMEMORY;
 
+     D_ASSERT( buffer->policy != CSP_SYSTEMONLY );
+
+     DFBResult  result  = DFB_OK;
+
+     result = dfb_system_video_memory_allocate( manager, buffer );
+
+     // If the systems driver supported allocation of non-visible video memory 
+     // surfaces, then return its result.  Otherwise, continue and attempt 
+     // surface allocation by using the standard video memory allocation 
+     // approach.
+     if ( result != DFB_UNIMPLEMENTED )
+     {
+          return result;
+     }
+
      /* calculate the required length depending on limitations */
      pitch = MAX( surface->width, surface->min_width );
 
@@ -630,8 +646,11 @@ DFBResult dfb_surfacemanager_deallocate( SurfaceManager *manager,
           buffer->video.access &= ~(VAF_HARDWARE_READ | VAF_HARDWARE_WRITE);
      }
 
-     if (chunk)
-          free_chunk( manager, chunk );
+     if ( dfb_system_video_memory_deallocate( buffer ) == DFB_UNIMPLEMENTED )
+     {
+          if (chunk)
+               free_chunk( manager, chunk );
+     }
 
      return DFB_OK;
 }
@@ -721,7 +740,7 @@ DFBResult dfb_surfacemanager_assure_video( SurfaceManager *manager,
 
                /* Upload? */
                if (buffer->flags & SBF_WRITTEN && buffer->system.health == CSH_STORED) {
-                    void *video  = (chunk->heap->storage == CSS_VIDEO)
+                    void *video  = ( !chunk || chunk->heap->storage == CSS_VIDEO )
                                    ? dfb_system_video_memory_virtual( buffer->video.offset )
                                    : dfb_system_aux_memory_virtual( buffer->video.offset );
                     bool  locked = D_FLAGS_ARE_SET( buffer->video.access,
@@ -743,7 +762,10 @@ DFBResult dfb_surfacemanager_assure_video( SurfaceManager *manager,
                buffer->video.health = CSH_STORED;
 
                /* Reset tolerations. */
-               chunk->tolerations = 0;
+               if ( buffer->video.chunk )
+               {
+                    chunk->tolerations = 0;
+               }
 
                dfb_surface_notify_listeners( surface, CSNF_VIDEO );
 
@@ -802,7 +824,7 @@ DFBResult dfb_surfacemanager_assure_system( SurfaceManager *manager,
                if (buffer->system.health == CSH_INVALID ||
                    (buffer->flags & SBF_WRITTEN && buffer->video.health == CSH_STORED))
                {
-                    void *video  = (chunk->heap->storage == CSS_VIDEO)
+                    void *video  = ( !chunk || chunk->heap->storage == CSS_VIDEO )
                                    ? dfb_system_video_memory_virtual( buffer->video.offset )
                                    : dfb_system_aux_memory_virtual( buffer->video.offset );
                     bool  locked = D_FLAGS_ARE_SET( buffer->video.access,
diff --git a/src/core/system.c b/src/core/system.c
index 1c32a9e..0b800a7 100644
--- a/src/core/system.c
+++ b/src/core/system.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
 
@@ -317,6 +318,40 @@ dfb_system_videoram_length()
      return system_funcs->VideoRamLength();
 }
 
+DFBResult
+dfb_system_video_memory_allocate( SurfaceManager *manager, 
+                                  SurfaceBuffer  *buffer )
+{
+     D_ASSERT( system_funcs != NULL );
+
+     if ( system_funcs->VideoMemoryAllocate != NULL )
+     {
+          return system_funcs->VideoMemoryAllocate( manager, buffer );
+     }
+
+     // If the driver doesn't support non-visible video memory based 
+     // allocation unimplemented is expected to be returned.  This allows 
+     // unsupported to be used as a meaningful return code that reaches the 
+     // user when unsupported pixel formats are requested.
+     return DFB_UNIMPLEMENTED;
+}
+
+DFBResult
+dfb_system_video_memory_deallocate( SurfaceBuffer *buffer )
+{
+     D_ASSERT( system_funcs != NULL );
+
+     if ( system_funcs->VideoMemoryDeallocate != NULL )
+     {
+          return system_funcs->VideoMemoryDeallocate( buffer );
+     }
+
+     // If the driver doesn't support non-visible video memory based 
+     // deallocation unimplemented is expected to be returned for 
+     // consistency with dfb_system_video_memory_allocate.
+     return DFB_UNIMPLEMENTED;
+}
+
 unsigned long
 dfb_system_aux_memory_physical( unsigned int offset )
 {
diff --git a/src/core/system.h b/src/core/system.h
index c52d297..9adf9f5 100644
--- a/src/core/system.h
+++ b/src/core/system.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>
 
 #include <direct/modules.h>
 
@@ -180,6 +181,10 @@ typedef struct {
 
      unsigned int   (*VideoRamLength)( void );
 
+     DFBResult      (*VideoMemoryAllocate)( SurfaceManager *manager, 
+                                            SurfaceBuffer  *buffer );
+     DFBResult      (*VideoMemoryDeallocate)( SurfaceBuffer *buffer );
+
      unsigned long  (*AuxMemoryPhysical)( unsigned int offset );
      void*          (*AuxMemoryVirtual)( unsigned int offset );
      
@@ -237,6 +242,12 @@ dfb_system_video_memory_virtual( unsigned int offset );
 unsigned int
 dfb_system_videoram_length( void );
 
+DFBResult
+dfb_system_video_memory_allocate( SurfaceManager *manager, 
+                                  SurfaceBuffer  *buffer );
+DFBResult
+dfb_system_video_memory_deallocate( SurfaceBuffer *buffer );
+
 unsigned long
 dfb_system_aux_memory_physical( unsigned int offset );
 
diff --git a/systems/devmem/devmem.c b/systems/devmem/devmem.c
index b70ad26..80429cd 100644
--- a/systems/devmem/devmem.c
+++ b/systems/devmem/devmem.c
@@ -215,6 +215,19 @@ system_videoram_length()
      return dfb_config->video_length;
 }
 
+static DFBResult
+system_video_memory_allocate( SurfaceManager* pCoreSurfaceManager, 
+                              SurfaceBuffer*  pCoreSurfaceBuffer )
+{
+     return DFB_UNIMPLEMENTED;
+}
+
+static DFBResult
+system_video_memory_deallocate( SurfaceBuffer* pCoreSurfaceBuffer )
+{
+     return DFB_UNIMPLEMENTED;
+}
+
 static unsigned long
 system_aux_memory_physical( unsigned int offset )
 {
diff --git a/systems/fbdev/fbdev.c b/systems/fbdev/fbdev.c
index 084cef4..3621748 100644
--- a/systems/fbdev/fbdev.c
+++ b/systems/fbdev/fbdev.c
@@ -893,6 +893,19 @@ system_videoram_length()
      return dfb_fbdev->shared->fix.smem_len;
 }
 
+static DFBResult
+system_video_memory_allocate( SurfaceManager* pCoreSurfaceManager, 
+                              SurfaceBuffer*  pCoreSurfaceBuffer )
+{
+     return DFB_UNIMPLEMENTED;
+}
+
+static DFBResult
+system_video_memory_deallocate( SurfaceBuffer* pCoreSurfaceBuffer )
+{
+     return DFB_UNIMPLEMENTED;
+}
+
 static unsigned long
 system_aux_memory_physical( unsigned int offset )
 {
diff --git a/systems/osx/osx.c b/systems/osx/osx.c
index 5926968..9c6b7a2 100644
--- a/systems/osx/osx.c
+++ b/systems/osx/osx.c
@@ -230,6 +230,19 @@ system_videoram_length()
      return 0;
 }
 
+static DFBResult
+system_video_memory_allocate( SurfaceManager* pCoreSurfaceManager, 
+                              SurfaceBuffer*  pCoreSurfaceBuffer )
+{
+     return DFB_UNIMPLEMENTED;
+}
+
+static DFBResult
+system_video_memory_deallocate( SurfaceBuffer* pCoreSurfaceBuffer )
+{
+     return DFB_UNIMPLEMENTED;
+}
+
 static unsigned long
 system_aux_memory_physical( unsigned int offset )
 {
diff --git a/systems/sdl/sdl.c b/systems/sdl/sdl.c
index 098f959..9c2468b 100644
--- a/systems/sdl/sdl.c
+++ b/systems/sdl/sdl.c
@@ -280,6 +280,19 @@ system_videoram_length()
      return 0;
 }
 
+static DFBResult
+system_video_memory_allocate( SurfaceManager* pCoreSurfaceManager, 
+                              SurfaceBuffer*  pCoreSurfaceBuffer )
+{
+     return DFB_UNIMPLEMENTED;
+}
+
+static DFBResult
+system_video_memory_deallocate( SurfaceBuffer* pCoreSurfaceBuffer )
+{
+     return DFB_UNIMPLEMENTED;
+}
+
 static unsigned long
 system_aux_memory_physical( unsigned int offset )
 {
diff --git a/systems/vnc/vnc.c b/systems/vnc/vnc.c
index e3f354f..f8e9b8a 100644
--- a/systems/vnc/vnc.c
+++ b/systems/vnc/vnc.c
@@ -225,6 +225,19 @@ system_video_memory_virtual( unsigned int offset )
      return NULL;
 }
 
+static DFBResult
+system_video_memory_allocate( SurfaceManager* pCoreSurfaceManager, 
+                              SurfaceBuffer*  pCoreSurfaceBuffer )
+{
+     return DFB_UNIMPLEMENTED;
+}
+
+static DFBResult
+system_video_memory_deallocate( SurfaceBuffer* pCoreSurfaceBuffer )
+{
+     return DFB_UNIMPLEMENTED;
+}
+
 static unsigned int
 system_videoram_length()
 {
diff --git a/systems/x11/x11.c b/systems/x11/x11.c
index 2fd27f5..81189f3 100644
--- a/systems/x11/x11.c
+++ b/systems/x11/x11.c
@@ -246,6 +246,19 @@ system_videoram_length()
      return 0;
 }
 
+static DFBResult
+system_video_memory_allocate( SurfaceManager* pCoreSurfaceManager, 
+                              SurfaceBuffer*  pCoreSurfaceBuffer )
+{
+     return DFB_UNIMPLEMENTED;
+}
+
+static DFBResult
+system_video_memory_deallocate( SurfaceBuffer* pCoreSurfaceBuffer )
+{
+     return DFB_UNIMPLEMENTED;
+}
+
 static unsigned long
 system_aux_memory_physical( unsigned int offset )
 {
