diff --git a/apps/gui/skin_engine/skin_parser.c b/apps/gui/skin_engine/skin_parser.c
index 9475e5f..16b5cdc 100644
--- a/apps/gui/skin_engine/skin_parser.c
+++ b/apps/gui/skin_engine/skin_parser.c
@@ -438,6 +438,7 @@ static int parse_viewportcolour(struct skin_element *element,
         }
         else
         {
+            curr_vp->vp.ignore_bg_image = true;
             curr_vp->start_bgcolour = colour->colour;
             curr_vp->vp.bg_pattern = colour->colour;
         }
diff --git a/apps/gui/viewport.c b/apps/gui/viewport.c
index 45094e4..c326afc 100644
--- a/apps/gui/viewport.c
+++ b/apps/gui/viewport.c
@@ -333,6 +333,7 @@ void viewport_set_fullscreen(struct viewport *vp,
     {
         vp->fg_pattern = FG_FALLBACK;
         vp->bg_pattern = BG_FALLBACK;
+        vp->ignore_bg_image = false;
 #ifdef HAVE_LCD_COLOR
         vp->lss_pattern = global_settings.lss_color;
         vp->lse_pattern = global_settings.lse_color;
diff --git a/firmware/drivers/lcd-16bit-vert.c b/firmware/drivers/lcd-16bit-vert.c
index a2f47d3..be75d12 100644
--- a/firmware/drivers/lcd-16bit-vert.c
+++ b/firmware/drivers/lcd-16bit-vert.c
@@ -50,6 +50,7 @@ fb_data lcd_framebuffer[LCD_FBHEIGHT][LCD_FBWIDTH]
 
 static fb_data* lcd_backdrop = NULL;
 static long lcd_backdrop_offset IDATA_ATTR = 0;
+static inline void lcd_fix_functions(void);
 
 static struct viewport default_vp =
 {
@@ -61,6 +62,7 @@ static struct viewport default_vp =
     .drawmode = DRMODE_SOLID,
     .fg_pattern = LCD_DEFAULT_FG,
     .bg_pattern = LCD_DEFAULT_BG,
+    .ignore_bg_image = false,
     .lss_pattern = LCD_DEFAULT_BG,
     .lse_pattern = LCD_DEFAULT_BG,
     .lst_pattern = LCD_DEFAULT_BG,
@@ -92,6 +94,8 @@ void lcd_set_viewport(struct viewport* vp)
     else
         current_vp = vp;
         
+    lcd_fix_functions();
+        
 #if defined(SIMULATOR)
     /* Force the viewport to be within bounds.  If this happens it should
      *  be considered an error - the viewport will not draw as it might be
@@ -252,13 +256,23 @@ void lcd_set_backdrop(fb_data* backdrop)
     if (backdrop)
     {    
         lcd_backdrop_offset = (long)backdrop - (long)&lcd_framebuffer[0][0];
-        lcd_fastpixelfuncs = lcd_fastpixelfuncs_backdrop;
     }
     else
     {
         lcd_backdrop_offset = 0;
+    }
+    lcd_fix_functions();
+}
+static inline void lcd_fix_functions(void)
+{
+    if (!lcd_backdrop || current_vp->ignore_bg_image)
+    {
         lcd_fastpixelfuncs = lcd_fastpixelfuncs_bgcolor;
     }
+    else
+    {
+        lcd_fastpixelfuncs = lcd_fastpixelfuncs_backdrop;
+    }
 }
 
 fb_data* lcd_get_backdrop(void)
@@ -287,7 +301,7 @@ void lcd_clear_viewport(void)
     }
     else
     {
-        if (!lcd_backdrop)
+        if (!lcd_backdrop || current_vp->ignore_bg_image)
         {
             do
             {
@@ -543,7 +557,7 @@ void lcd_vline(int x, int y1, int y2)
     {
         if (current_vp->drawmode & DRMODE_BG)
         {
-            if (!lcd_backdrop)
+            if (!lcd_backdrop || current_vp->ignore_bg_image)
             {
                 fillopt = OPT_SET;
                 bits = current_vp->bg_pattern;
@@ -661,7 +675,7 @@ void lcd_fillrect(int x, int y, int width, int height)
     {
         if (current_vp->drawmode & DRMODE_BG)
         {
-            if (!lcd_backdrop)
+            if (!lcd_backdrop || current_vp->ignore_bg_image)
             {
                 fillopt = OPT_SET;
                 bits = current_vp->bg_pattern;
@@ -831,7 +845,7 @@ void ICODE_ATTR lcd_mono_bitmap_part(const unsigned char *src, int src_x,
             break;
 
           case DRMODE_BG:
-            if (lcd_backdrop)
+            if (lcd_backdrop && !current_vp->ignore_bg_image)
             {
                 bo = lcd_backdrop_offset;
                 do
@@ -874,7 +888,7 @@ void ICODE_ATTR lcd_mono_bitmap_part(const unsigned char *src, int src_x,
 
           case DRMODE_SOLID:
             fg = current_vp->fg_pattern;
-            if (lcd_backdrop)
+            if (lcd_backdrop && !current_vp->ignore_bg_image)
             {
                 bo = lcd_backdrop_offset;
                 do
diff --git a/firmware/drivers/lcd-16bit.c b/firmware/drivers/lcd-16bit.c
index be4f21f..7659e9f 100644
--- a/firmware/drivers/lcd-16bit.c
+++ b/firmware/drivers/lcd-16bit.c
@@ -60,6 +60,7 @@ static struct viewport default_vp =
     .drawmode = DRMODE_SOLID,
     .fg_pattern = LCD_DEFAULT_FG,
     .bg_pattern = LCD_DEFAULT_BG,
+    .ignore_bg_image = false,
     .lss_pattern = LCD_DEFAULT_BG,
     .lse_pattern = LCD_DEFAULT_BG,
     .lst_pattern = LCD_DEFAULT_BG,
@@ -77,6 +78,7 @@ void lcd_init(void)
     scroll_init();
 }
 /*** Viewports ***/
+static inline void lcd_fix_functions(void);
 
 void lcd_set_viewport(struct viewport* vp)
 {
@@ -84,6 +86,7 @@ void lcd_set_viewport(struct viewport* vp)
         current_vp = &default_vp;
     else
         current_vp = vp;
+    lcd_fix_functions();
         
 #if defined(SIMULATOR)
     /* Force the viewport to be within bounds.  If this happens it should
@@ -239,19 +242,30 @@ lcd_fastpixelfunc_type* const lcd_fastpixelfuncs_backdrop[8] = {
 
 lcd_fastpixelfunc_type* const * lcd_fastpixelfuncs = lcd_fastpixelfuncs_bgcolor;
 
+static inline void lcd_fix_functions(void)
+{
+    if (!lcd_backdrop || current_vp->ignore_bg_image)
+    {
+        lcd_fastpixelfuncs = lcd_fastpixelfuncs_bgcolor;
+    }
+    else
+    {
+        lcd_fastpixelfuncs = lcd_fastpixelfuncs_backdrop;
+    }
+}
+
 void lcd_set_backdrop(fb_data* backdrop)
 {
     lcd_backdrop = backdrop;
     if (backdrop)
     {
         lcd_backdrop_offset = (long)backdrop - (long)&lcd_framebuffer[0][0];
-        lcd_fastpixelfuncs = lcd_fastpixelfuncs_backdrop;
     }
     else
     {
         lcd_backdrop_offset = 0;
-        lcd_fastpixelfuncs = lcd_fastpixelfuncs_bgcolor;
     }
+    lcd_fix_functions();
 }
 
 fb_data* lcd_get_backdrop(void)
@@ -280,7 +294,7 @@ void lcd_clear_viewport(void)
     }
     else
     {
-        if (!lcd_backdrop)
+        if (!lcd_backdrop || current_vp->ignore_bg_image)
         {
             do
             {
@@ -479,7 +493,7 @@ void lcd_hline(int x1, int x2, int y)
     {
         if (current_vp->drawmode & DRMODE_BG)
         {
-            if (!lcd_backdrop)
+            if (!lcd_backdrop || current_vp->ignore_bg_image)
             {
                 fillopt = OPT_SET;
                 bits = current_vp->bg_pattern;
@@ -654,7 +668,7 @@ void lcd_fillrect(int x, int y, int width, int height)
     {
         if (current_vp->drawmode & DRMODE_BG)
         {
-            if (!lcd_backdrop)
+            if (!lcd_backdrop || current_vp->ignore_bg_image)
             {
                 fillopt = OPT_SET;
                 bits = current_vp->bg_pattern;
@@ -824,7 +838,7 @@ void ICODE_ATTR lcd_mono_bitmap_part(const unsigned char *src, int src_x,
             break;
 
           case DRMODE_BG:
-            if (lcd_backdrop)
+            if (lcd_backdrop && !current_vp->ignore_bg_image)
             {
                 bo = lcd_backdrop_offset;
                 do
@@ -867,7 +881,7 @@ void ICODE_ATTR lcd_mono_bitmap_part(const unsigned char *src, int src_x,
 
           case DRMODE_SOLID:
             fg = current_vp->fg_pattern;
-            if (lcd_backdrop)
+            if (lcd_backdrop && !current_vp->ignore_bg_image)
             {
                 bo = lcd_backdrop_offset;
                 do
diff --git a/firmware/drivers/lcd-2bit-horz.c b/firmware/drivers/lcd-2bit-horz.c
index b480509..0e4c081 100644
--- a/firmware/drivers/lcd-2bit-horz.c
+++ b/firmware/drivers/lcd-2bit-horz.c
@@ -47,6 +47,7 @@ static const unsigned char pixmask[4] ICONST_ATTR = {
 
 static fb_data* lcd_backdrop = NULL;
 static long lcd_backdrop_offset IDATA_ATTR = 0;
+static inline void lcd_fix_functions(void);
 
 static struct viewport default_vp =
 {
@@ -57,7 +58,8 @@ static struct viewport default_vp =
     .font     = FONT_SYSFIXED,
     .drawmode = DRMODE_SOLID,
     .fg_pattern = LCD_DEFAULT_FG,
-    .bg_pattern = LCD_DEFAULT_BG
+    .bg_pattern = LCD_DEFAULT_BG,
+    .ignore_bg_image = false
 };
 
 static struct viewport* current_vp IBSS_ATTR;
@@ -88,6 +90,8 @@ void lcd_set_viewport(struct viewport* vp)
     fg_pattern = 0x55 * (~current_vp->fg_pattern & 3);
     bg_pattern = 0x55 * (~current_vp->bg_pattern & 3);
     
+    lcd_fix_functions();
+    
 #if defined(SIMULATOR)
     /* Force the viewport to be within bounds.  If this happens it should
      *  be considered an error - the viewport will not draw as it might be
@@ -364,15 +368,25 @@ void lcd_set_backdrop(fb_data* backdrop)
     if (backdrop)
     {
         lcd_backdrop_offset = (long)backdrop - (long)lcd_framebuffer;
-        lcd_pixelfuncs = lcd_pixelfuncs_backdrop;
-        lcd_blockfuncs = lcd_blockfuncs_backdrop;
     }
     else
     {
         lcd_backdrop_offset = 0;
+    }
+    lcd_fix_functions();
+}
+static inline void lcd_fix_functions(void)
+{
+    if (!lcd_backdrop || current_vp->ignore_bg_image)
+    {
         lcd_pixelfuncs = lcd_pixelfuncs_bgcolor;
         lcd_blockfuncs = lcd_blockfuncs_bgcolor;
     }
+    else
+    {
+        lcd_pixelfuncs = lcd_pixelfuncs_backdrop;
+        lcd_blockfuncs = lcd_blockfuncs_backdrop;
+    }
 }
 
 fb_data* lcd_get_backdrop(void)
@@ -400,7 +414,7 @@ void lcd_clear_display(void)
     }
     else
     {
-        if (lcd_backdrop)
+        if (lcd_backdrop && !current_vp->ignore_bg_image)
             memcpy(lcd_framebuffer, lcd_backdrop, sizeof lcd_framebuffer);
         else
             memset(lcd_framebuffer, bg_pattern, sizeof lcd_framebuffer);
@@ -877,7 +891,7 @@ void ICODE_ATTR lcd_mono_bitmap_part(const unsigned char *src, int src_x,
             break;
             
           case DRMODE_BG:
-            if (lcd_backdrop)
+            if (lcd_backdrop && !current_vp->ignore_bg_image)
             {
                 bo = lcd_backdrop_offset;
                 do
@@ -927,7 +941,7 @@ void ICODE_ATTR lcd_mono_bitmap_part(const unsigned char *src, int src_x,
 
           case DRMODE_SOLID:
             fg = fg_pattern;
-            if (lcd_backdrop)
+            if (lcd_backdrop && !current_vp->ignore_bg_image)
             {
                 bo = lcd_backdrop_offset;
                 do
diff --git a/firmware/drivers/lcd-2bit-vert.c b/firmware/drivers/lcd-2bit-vert.c
index 0269909..2be3806 100644
--- a/firmware/drivers/lcd-2bit-vert.c
+++ b/firmware/drivers/lcd-2bit-vert.c
@@ -59,12 +59,14 @@ static struct viewport default_vp =
     .font     = FONT_SYSFIXED,
     .drawmode = DRMODE_SOLID,
     .fg_pattern = LCD_DEFAULT_FG,
-    .bg_pattern = LCD_DEFAULT_BG
+    .bg_pattern = LCD_DEFAULT_BG,
+    .ignore_bg_image = false
 };
 
 static struct viewport* current_vp IBSS_ATTR;
 static unsigned fg_pattern IBSS_ATTR;
 static unsigned bg_pattern IBSS_ATTR;
+static inline void lcd_fix_functions(void);
 
 /* LCD init */
 void lcd_init(void)
@@ -90,6 +92,8 @@ void lcd_set_viewport(struct viewport* vp)
     fg_pattern = 0x55 * (~current_vp->fg_pattern & 3);
     bg_pattern = 0x55 * (~current_vp->bg_pattern & 3);
     
+    lcd_fix_functions();
+    
 #if defined(SIMULATOR)
     /* Force the viewport to be within bounds.  If this happens it should
      *  be considered an error - the viewport will not draw as it might be
@@ -367,15 +371,25 @@ void lcd_set_backdrop(fb_data* backdrop)
     if (backdrop)
     {
         lcd_backdrop_offset = (long)backdrop - (long)lcd_framebuffer;
-        lcd_pixelfuncs = lcd_pixelfuncs_backdrop;
-        lcd_blockfuncs = lcd_blockfuncs_backdrop;
     }
     else 
     {
         lcd_backdrop_offset = 0;
+    }
+    lcd_fix_functions();
+}
+static inline void lcd_fix_functions(void)
+{
+    if (!lcd_backdrop || current_vp->ignore_bg_image)
+    {
         lcd_pixelfuncs = lcd_pixelfuncs_bgcolor;
         lcd_blockfuncs = lcd_blockfuncs_bgcolor;
     }
+    else
+    {
+        lcd_pixelfuncs = lcd_pixelfuncs_backdrop;
+        lcd_blockfuncs = lcd_blockfuncs_backdrop;
+    }
 }
 
 fb_data* lcd_get_backdrop(void)
@@ -403,7 +417,7 @@ void lcd_clear_display(void)
     }
     else
     {
-        if (lcd_backdrop)
+        if (lcd_backdrop && !current_vp->ignore_bg_image)
             memcpy(lcd_framebuffer, lcd_backdrop, sizeof lcd_framebuffer);
         else
             memset(lcd_framebuffer, bg_pattern, sizeof lcd_framebuffer);
diff --git a/firmware/drivers/lcd-2bit-vi.c b/firmware/drivers/lcd-2bit-vi.c
index 697d1a7..21092fe 100644
--- a/firmware/drivers/lcd-2bit-vi.c
+++ b/firmware/drivers/lcd-2bit-vi.c
@@ -52,6 +52,7 @@ static const FBFN(data) patterns[4] = {0xFFFF, 0xFF00, 0x00FF, 0x0000};
 
 static FBFN(data) *backdrop = NULL;
 static long backdrop_offset IDATA_ATTR = 0;
+static inline void lcd_fix_functions(void);
 
 static struct viewport default_vp =
 {
@@ -62,7 +63,8 @@ static struct viewport default_vp =
     .font     = FONT_SYSFIXED,
     .drawmode = DRMODE_SOLID,
     .fg_pattern = LCDM(DEFAULT_FG),
-    .bg_pattern = LCDM(DEFAULT_BG)
+    .bg_pattern = LCDM(DEFAULT_BG),
+    .ignore_bg_image = false
 };
 
 static struct viewport * current_vp IBSS_ATTR;
@@ -82,6 +84,8 @@ void LCDFN(set_viewport)(struct viewport* vp)
     fg_pattern = patterns[current_vp->fg_pattern & 3];
     bg_pattern = patterns[current_vp->bg_pattern & 3];
     
+    lcd_fix_functions();
+    
 #if defined(SIMULATOR)
     /* Force the viewport to be within bounds.  If this happens it should
      *  be considered an error - the viewport will not draw as it might be
@@ -388,15 +392,25 @@ void LCDFN(set_backdrop)(FBFN(data) *bd)
     if (bd)
     {
         backdrop_offset = (long)bd - (long)LCDFN(framebuffer);
-        LCDFN(pixelfuncs) = LCDFN(pixelfuncs_backdrop);
-        LCDFN(blockfuncs) = LCDFN(blockfuncs_backdrop);
     }
     else
     {
         backdrop_offset = 0;
+    }
+    lcd_fix_functions();
+}
+static inline void lcd_fix_functions(void)
+{
+    if (!lcd_backdrop || current_vp->ignore_bg_image)
+    {
         LCDFN(pixelfuncs) = LCDFN(pixelfuncs_bgcolor);
         LCDFN(blockfuncs) = LCDFN(blockfuncs_bgcolor);
     }
+    else
+    {
+        LCDFN(pixelfuncs) = LCDFN(pixelfuncs_backdrop);
+        LCDFN(blockfuncs) = LCDFN(blockfuncs_backdrop);
+    }
 }
 
 FBFN(data)* LCDFN(get_backdrop)(void)
@@ -424,7 +438,7 @@ void LCDFN(clear_display)(void)
     }
     else
     {
-        if (backdrop)
+        if (backdrop && !current_vp->ignore_bg_image)
             memcpy(LCDFN(framebuffer), backdrop, sizeof LCDFN(framebuffer));
         else
             memset(LCDFN(framebuffer), patterns[default_vp.bg_pattern & 3],
diff --git a/firmware/export/lcd.h b/firmware/export/lcd.h
index 79231d1..a3ec33f 100644
--- a/firmware/export/lcd.h
+++ b/firmware/export/lcd.h
@@ -48,6 +48,7 @@ struct viewport {
 #if LCD_DEPTH > 1
     unsigned fg_pattern;
     unsigned bg_pattern;
+    bool ignore_bg_image;
 #ifdef HAVE_LCD_COLOR
     unsigned lss_pattern;
     unsigned lse_pattern;
