diff --git a/apps/gui/skin_engine/skin_backdrops.c b/apps/gui/skin_engine/skin_backdrops.c
index 3a000b2..793dc70 100644
--- a/apps/gui/skin_engine/skin_backdrops.c
+++ b/apps/gui/skin_engine/skin_backdrops.c
@@ -27,6 +27,8 @@
 #include "wps_internals.h"
 #include "skin_engine.h"
 #include "skin_buffer.h"
+#include "buffer.h"
+#include "playback.h"
 
 #if (LCD_DEPTH > 1) || (defined(HAVE_REMOTE_LCD) && (LCD_REMOTE_DEPTH > 1))
 
@@ -37,16 +39,25 @@ static struct skin_backdrop {
     enum screen_type screen;
 } backdrops[NB_BDROPS];
 
-#define NB_BDROPS SKINNABLE_SCREENS_COUNT*NB_SCREENS
+static struct audio_alloced_buffers {
+    char *buffer;
+    enum screen_type screen;
+    bool inuse;
+} buffers[NB_BDROPS];
+static bool first_init = true;
 
 void skin_backdrop_init(void)
 {
     int i;
     for (i=0; i<NB_BDROPS; i++)
     {
+        if (first_init)
+            buffers[i].buffer = NULL;
+        buffers[i].inuse = false;
         backdrops[i].name[0] = '\0';
         backdrops[i].buffer = NULL;
     }
+    first_init = false;
 }
 
 int skin_backdrop_assign(char* backdrop, char *bmpdir,
@@ -91,6 +102,52 @@ int skin_backdrop_assign(char* backdrop, char *bmpdir,
     return -1;
 }
 
+static char* get_buffer(enum screen_type screen)
+{
+    size_t buf_size;
+    int i, found = -1, free = -1;
+#if defined(HAVE_REMOTE_LCD) && (LCD_REMOTE_DEPTH > 1)
+    if (screen == SCREEN_REMOTE)
+        buf_size = REMOTE_LCD_BACKDROP_BYTES;
+    else
+#endif
+        buf_size = LCD_BACKDROP_BYTES;
+    for (i=0; found == -1 && i<NB_BDROPS; i++)
+    {
+        if (!buffers[i].inuse && buffers[i].screen == screen)
+        {
+            free = i;
+            if (buffers[i].buffer)
+                found = i;
+        }
+    }
+    if (found != -1)
+    {
+        buffers[found].inuse = true;
+        return buffers[found].buffer;
+    }
+    else if (free > -1 && !audio_status())
+    {
+        size_t temp;
+        char *buf =  audio_get_buffer(true, &temp);
+        if (temp > buf_size)
+        {
+            buf = buffer_alloc(buf_size);
+            buffers[free].buffer = buf;
+            buffers[free].inuse = true;
+            buffers[free].screen = screen;
+        }
+        /* We may need a call here to allow playback to resume,
+         * testing says we dont though */
+        return buffers[free].buffer;
+    }
+    else
+    {
+        return (char*)skin_buffer_alloc(buf_size);
+    }
+}
+        
+        
 bool skin_backdrops_preload(void)
 {
     bool retval = true;
@@ -100,16 +157,8 @@ bool skin_backdrops_preload(void)
     {
         if (backdrops[i].name[0] && !backdrops[i].buffer)
         {
-            size_t buf_size;
             bool loaded = false;
             enum screen_type screen = backdrops[i].screen;
-#if defined(HAVE_REMOTE_LCD) && (LCD_REMOTE_DEPTH > 1)
-            if (screen == SCREEN_REMOTE)
-                buf_size = REMOTE_LCD_BACKDROP_BYTES;
-            else
-#endif
-                buf_size = LCD_BACKDROP_BYTES;
-
             filename = backdrops[i].name;
             if (screen == SCREEN_MAIN && global_settings.backdrop_file[0] &&
                 global_settings.backdrop_file[0] != '-' && filename[0] == '-')
@@ -124,7 +173,7 @@ bool skin_backdrops_preload(void)
             }
             if (*filename && *filename != '-')
             {
-                backdrops[i].buffer = (char*)skin_buffer_alloc(buf_size);
+                backdrops[i].buffer = get_buffer(screen);
                 loaded = backdrops[i].buffer && 
                          screens[screen].backdrop_load(filename, backdrops[i].buffer);
                 if (!loaded)
