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/firmware/drivers/lcd-16bit-vert.c b/firmware/drivers/lcd-16bit-vert.c
index a2f47d3..ada2f18 100644
--- a/firmware/drivers/lcd-16bit-vert.c
+++ b/firmware/drivers/lcd-16bit-vert.c
@@ -61,6 +61,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,
@@ -206,6 +207,10 @@ int lcd_getstringsize(const unsigned char *str, int *w, int *h)
 }
 
 /*** low-level drawing functions ***/
+static inline bool lcd_using_backdrop(void)
+{
+    return !current_vp->ignore_bg_image;
+}
 
 #define LCDADDR(x, y) (&lcd_framebuffer[0][0] + LCD_HEIGHT*(x) + (y))
                                                     
@@ -221,7 +226,10 @@ static void ICODE_ATTR clearpixel(fb_data *address)
 
 static void ICODE_ATTR clearimgpixel(fb_data *address)
 {
-    *address = *(fb_data *)((long)address + lcd_backdrop_offset);
+    if (lcd_using_backdrop())
+        *address = *(fb_data *)((long)address + lcd_backdrop_offset);
+    else
+        *address = current_vp->bg_pattern;
 }
 
 static void ICODE_ATTR flippixel(fb_data *address)
@@ -287,7 +295,7 @@ void lcd_clear_viewport(void)
     }
     else
     {
-        if (!lcd_backdrop)
+        if (!lcd_backdrop || !lcd_using_backdrop())
         {
             do
             {
@@ -543,7 +551,7 @@ void lcd_vline(int x, int y1, int y2)
     {
         if (current_vp->drawmode & DRMODE_BG)
         {
-            if (!lcd_backdrop)
+            if (!lcd_backdrop || !lcd_using_backdrop())
             {
                 fillopt = OPT_SET;
                 bits = current_vp->bg_pattern;
@@ -661,7 +669,7 @@ void lcd_fillrect(int x, int y, int width, int height)
     {
         if (current_vp->drawmode & DRMODE_BG)
         {
-            if (!lcd_backdrop)
+            if (!lcd_backdrop || !lcd_using_backdrop())
             {
                 fillopt = OPT_SET;
                 bits = current_vp->bg_pattern;
@@ -831,7 +839,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 && lcd_using_backdrop())
             {
                 bo = lcd_backdrop_offset;
                 do
@@ -874,7 +882,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 && lcd_using_backdrop())
             {
                 bo = lcd_backdrop_offset;
                 do
diff --git a/firmware/drivers/lcd-16bit.c b/firmware/drivers/lcd-16bit.c
index be4f21f..656828f 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,
@@ -199,6 +200,10 @@ int lcd_getstringsize(const unsigned char *str, int *w, int *h)
 }
 
 /*** low-level drawing functions ***/
+static inline bool lcd_using_backdrop(void)
+{
+    return !current_vp->ignore_bg_image;
+}
 
 #define LCDADDR(x, y) (&lcd_framebuffer[(y)][(x)])
 
@@ -214,7 +219,10 @@ static void ICODE_ATTR clearpixel(fb_data *address)
 
 static void ICODE_ATTR clearimgpixel(fb_data *address)
 {
-    *address = *(fb_data *)((long)address + lcd_backdrop_offset);
+    if (lcd_using_backdrop())
+        *address = *(fb_data *)((long)address + lcd_backdrop_offset);
+    else
+        *address = current_vp->bg_pattern;
 }
 
 static void ICODE_ATTR flippixel(fb_data *address)
@@ -280,7 +288,7 @@ void lcd_clear_viewport(void)
     }
     else
     {
-        if (!lcd_backdrop)
+        if (!lcd_backdrop || !lcd_using_backdrop())
         {
             do
             {
@@ -479,7 +487,7 @@ void lcd_hline(int x1, int x2, int y)
     {
         if (current_vp->drawmode & DRMODE_BG)
         {
-            if (!lcd_backdrop)
+            if (!lcd_backdrop || !lcd_using_backdrop())
             {
                 fillopt = OPT_SET;
                 bits = current_vp->bg_pattern;
@@ -654,7 +662,7 @@ void lcd_fillrect(int x, int y, int width, int height)
     {
         if (current_vp->drawmode & DRMODE_BG)
         {
-            if (!lcd_backdrop)
+            if (!lcd_backdrop || !lcd_using_backdrop())
             {
                 fillopt = OPT_SET;
                 bits = current_vp->bg_pattern;
@@ -824,7 +832,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 && lcd_using_backdrop())
             {
                 bo = lcd_backdrop_offset;
                 do
@@ -867,7 +875,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 && lcd_using_backdrop())
             {
                 bo = lcd_backdrop_offset;
                 do
diff --git a/firmware/drivers/lcd-2bit-horz.c b/firmware/drivers/lcd-2bit-horz.c
index b480509..4a2f029 100644
--- a/firmware/drivers/lcd-2bit-horz.c
+++ b/firmware/drivers/lcd-2bit-horz.c
@@ -57,7 +57,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;
@@ -189,6 +190,10 @@ int lcd_getstringsize(const unsigned char *str, int *w, int *h)
 }
 
 /*** low-level drawing functions ***/
+static inline bool lcd_using_backdrop(void)
+{
+    return !current_vp->ignore_bg_image;
+}
 
 static void setpixel(int x, int y)
 {
@@ -213,8 +218,12 @@ static void clearimgpixel(int x, int y)
     unsigned mask = pixmask[x & 3];
     fb_data *address = &lcd_framebuffer[y][x>>2];
     unsigned data = *address;
+    unsigned pattern = *(address + lcd_backdrop_offset);
+    
+    if (!lcd_using_backdrop())
+        pattern = bg_pattern;
 
-    *address = data ^ ((data ^ *(address + lcd_backdrop_offset)) & mask);
+    *address = data ^ ((data ^ pattern) & mask);
 }
 
 static void flippixel(int x, int y)
@@ -263,8 +272,12 @@ static void ICODE_ATTR bgimgblock(fb_data *address, unsigned mask,
                                   unsigned bits)
 {
     unsigned data = *address;
+    unsigned pattern = *(address + lcd_backdrop_offset);
+    
+    if (!lcd_using_backdrop())
+        pattern = bg_pattern;
 
-    *address = data ^ ((data ^ *(address + lcd_backdrop_offset)) & mask & ~bits);
+    *address = data ^ ((data ^ pattern) & mask & ~bits);
 }
 
 static void ICODE_ATTR fgblock(fb_data *address, unsigned mask,
@@ -290,6 +303,9 @@ static void ICODE_ATTR solidimgblock(fb_data *address, unsigned mask,
 {
     unsigned data = *address;
     unsigned bgp  = *(address + lcd_backdrop_offset);
+    
+    if (!lcd_using_backdrop())
+        bgp = bg_pattern;
 
     bits     = bgp  ^ ((bgp ^ fg_pattern) & bits);
     *address = data ^ ((data ^ bits) & mask);
@@ -313,8 +329,12 @@ static void ICODE_ATTR bgimginvblock(fb_data *address, unsigned mask,
                                      unsigned bits)
 {
     unsigned data = *address;
+    unsigned bgp  = *(address + lcd_backdrop_offset);
+    
+    if (!lcd_using_backdrop())
+        bgp = bg_pattern;
 
-    *address = data ^ ((data ^ *(address + lcd_backdrop_offset)) & mask & bits);
+    *address = data ^ ((data ^ bgp) & mask & bits);
 }
 
 static void ICODE_ATTR fginvblock(fb_data *address, unsigned mask,
@@ -340,8 +360,12 @@ static void ICODE_ATTR solidimginvblock(fb_data *address, unsigned mask,
 {
     unsigned data = *address;
     unsigned fgp  = fg_pattern;
+    unsigned bgp  = *(address + lcd_backdrop_offset);
+    
+    if (!lcd_using_backdrop())
+        bgp = bg_pattern;
 
-    bits     = fgp  ^ ((fgp ^ *(address + lcd_backdrop_offset)) & bits);
+    bits     = fgp  ^ ((fgp ^ bgp) & bits);
     *address = data ^ ((data ^ bits) & mask);
 }
 
@@ -400,7 +424,7 @@ void lcd_clear_display(void)
     }
     else
     {
-        if (lcd_backdrop)
+        if (lcd_backdrop && lcd_using_backdrop())
             memcpy(lcd_framebuffer, lcd_backdrop, sizeof lcd_framebuffer);
         else
             memset(lcd_framebuffer, bg_pattern, sizeof lcd_framebuffer);
@@ -877,7 +901,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 && lcd_using_backdrop())
             {
                 bo = lcd_backdrop_offset;
                 do
@@ -927,7 +951,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 && lcd_using_backdrop())
             {
                 bo = lcd_backdrop_offset;
                 do
diff --git a/firmware/drivers/lcd-2bit-vert.c b/firmware/drivers/lcd-2bit-vert.c
index 0269909..441fb37 100644
--- a/firmware/drivers/lcd-2bit-vert.c
+++ b/firmware/drivers/lcd-2bit-vert.c
@@ -59,7 +59,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;
@@ -192,6 +193,10 @@ int lcd_getstringsize(const unsigned char *str, int *w, int *h)
 }
 
 /*** low-level drawing functions ***/
+static inline bool lcd_using_backdrop(void)
+{
+    return !current_vp->ignore_bg_image;
+}
 
 static void setpixel(int x, int y)
 {
@@ -216,8 +221,12 @@ static void clearimgpixel(int x, int y)
     unsigned mask = pixmask[y & 3];
     fb_data *address = &lcd_framebuffer[y>>2][x];
     unsigned data = *address;
+    unsigned bgp = *(address + lcd_backdrop_offset);
+    
+    if (!lcd_using_backdrop())
+        bgp = bg_pattern;
 
-    *address = data ^ ((data ^ *(address + lcd_backdrop_offset)) & mask);
+    *address = data ^ ((data ^ bgp) & mask);
 }
 
 static void flippixel(int x, int y)
@@ -266,8 +275,12 @@ static void ICODE_ATTR bgimgblock(fb_data *address, unsigned mask,
                                   unsigned bits)
 {
     unsigned data = *address;
+    unsigned bgp = *(address + lcd_backdrop_offset);
+    
+    if (!lcd_using_backdrop())
+        bgp = bg_pattern;
 
-    *address = data ^ ((data ^ *(address + lcd_backdrop_offset)) & mask & ~bits);
+    *address = data ^ ((data ^ bgp) & mask & ~bits);
 }
 
 static void ICODE_ATTR fgblock(fb_data *address, unsigned mask,
@@ -294,6 +307,9 @@ static void ICODE_ATTR solidimgblock(fb_data *address, unsigned mask,
     unsigned data = *address;
     unsigned bgp  = *(address + lcd_backdrop_offset);
     
+    if (!lcd_using_backdrop())
+        bgp = bg_pattern;
+    
     bits     = bgp  ^ ((bgp ^ fg_pattern) & bits);
     *address = data ^ ((data ^ bits) & mask);
 }
@@ -316,8 +332,12 @@ static void ICODE_ATTR bgimginvblock(fb_data *address, unsigned mask,
                                      unsigned bits)
 {
     unsigned data = *address;
+    unsigned bgp = *(address + lcd_backdrop_offset);
+    
+    if (!lcd_using_backdrop())
+        bgp = bg_pattern;
 
-    *address = data ^ ((data ^ *(address + lcd_backdrop_offset)) & mask & bits);
+    *address = data ^ ((data ^ bgp) & mask & bits);
 }
 
 static void ICODE_ATTR fginvblock(fb_data *address, unsigned mask,
@@ -343,8 +363,12 @@ static void ICODE_ATTR solidimginvblock(fb_data *address, unsigned mask,
 {
     unsigned data = *address;
     unsigned fgp  = fg_pattern;
+    unsigned bgp = *(address + lcd_backdrop_offset);
+    
+    if (!lcd_using_backdrop())
+        bgp = bg_pattern;
     
-    bits     = fgp  ^ ((fgp ^ *(address + lcd_backdrop_offset)) & bits);
+    bits     = fgp  ^ ((fgp ^ bgp) & bits);
     *address = data ^ ((data ^ bits) & mask);
 }
 
@@ -403,7 +427,7 @@ void lcd_clear_display(void)
     }
     else
     {
-        if (lcd_backdrop)
+        if (lcd_backdrop && lcd_using_backdrop())
             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..460f042 100644
--- a/firmware/drivers/lcd-2bit-vi.c
+++ b/firmware/drivers/lcd-2bit-vi.c
@@ -62,7 +62,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;
@@ -210,6 +211,10 @@ int LCDFN(getstringsize)(const unsigned char *str, int *w, int *h)
 }
 
 /*** low-level drawing functions ***/
+static inline bool lcd_using_backdrop(void)
+{
+    return !current_vp->ignore_bg_image;
+}
 
 static void setpixel(int x, int y)
 {
@@ -234,9 +239,12 @@ static void clearimgpixel(int x, int y)
     unsigned mask = 0x0101 << (y & 7);
     FBFN(data) *address = &LCDFN(framebuffer)[y>>3][x];
     unsigned data = *address;
+    unsigned bgp = *(FBFN(data) *)((long)address + backdrop_offset);
+    
+    if (!lcd_using_backdrop())
+        bgp = bg_pattern;
 
-    *address = data ^ ((data ^ *(FBFN(data) *)((long)address
-               + backdrop_offset)) & mask);
+    *address = data ^ ((data ^ bgp) & mask);
 }
 
 static void flippixel(int x, int y)
@@ -284,9 +292,12 @@ static void ICODE_ATTR bgimgblock(FBFN(data) *address, unsigned mask,
                                   unsigned bits)
 {
     unsigned data = *address;
+    unsigned bgp = *(FBFN(data) *)((long)address + backdrop_offset);
+    
+    if (!lcd_using_backdrop())
+        bgp = bg_pattern;
 
-    *address = data ^ ((data ^ *(FBFN(data) *)((long)address
-               + backdrop_offset)) & mask & ~bits);
+    *address = data ^ ((data ^ bgp) & mask & ~bits);
 }
 
 static void ICODE_ATTR fgblock(FBFN(data) *address, unsigned mask,
@@ -312,6 +323,9 @@ static void ICODE_ATTR solidimgblock(FBFN(data) *address, unsigned mask,
 {
     unsigned data = *address;
     unsigned bgp  = *(FBFN(data) *)((long)address + backdrop_offset);
+    
+    if (!lcd_using_backdrop())
+        bgp = bg_pattern;
 
     bits     = bgp  ^ ((bgp ^ fg_pattern) & bits);
     *address = data ^ ((data ^ bits) & mask);
@@ -335,9 +349,12 @@ static void ICODE_ATTR bgimginvblock(FBFN(data) *address, unsigned mask,
                                      unsigned bits)
 {
     unsigned data = *address;
+    unsigned bgp  = *(FBFN(data) *)((long)address + backdrop_offset);
+    
+    if (!lcd_using_backdrop())
+        bgp = bg_pattern;
 
-    *address = data ^ ((data ^ *(FBFN(data) *)((long)address
-               + backdrop_offset)) & mask & bits);
+    *address = data ^ ((data ^ bgp) & mask & bits);
 }
 
 static void ICODE_ATTR fginvblock(FBFN(data) *address, unsigned mask,
@@ -363,9 +380,12 @@ static void ICODE_ATTR solidimginvblock(FBFN(data) *address, unsigned mask,
 {
     unsigned data = *address;
     unsigned fgp  = fg_pattern;
+    unsigned bgp  = *(FBFN(data) *)((long)address + backdrop_offset);
+    
+    if (!lcd_using_backdrop())
+        bgp = bg_pattern;
 
-    bits     = fgp  ^ ((fgp ^ *(FBFN(data) *)((long)address
-               + backdrop_offset)) & bits);
+    bits     = fgp  ^ ((fgp ^ bgp) & bits);
     *address = data ^ ((data ^ bits) & mask);
 }
 
@@ -424,7 +444,7 @@ void LCDFN(clear_display)(void)
     }
     else
     {
-        if (backdrop)
+        if (backdrop && lcd_using_backdrop())
             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;
