diff --git a/apps/filetree.c b/apps/filetree.c
index 945b9ac..6b56c80 100644
--- a/apps/filetree.c
+++ b/apps/filetree.c
@@ -528,13 +528,9 @@ int ft_enter(struct tree_context* c)
                 splash(0, ID2P(LANG_WAIT));
                 if (!settings_load_config(buf,true))
                     break;
-                /* do both steps seperately so that the redrawing after theme
-                 * changing is independant of whether the theme has a custom ui
-                 * vp or not */
-                send_event(GUI_EVENT_REFRESH, NULL);
-                /* for the statusbar */
-                send_event(GUI_EVENT_ACTIONUPDATE, (void*)true);
-                tree_drawlists();
+
+                /* redraw the UI in case the user setting changed apparence */
+                send_event(GUI_EVENT_REFRESH, tree_drawlists);
                 splash(HZ, ID2P(LANG_SETTINGS_LOADED));
                 break;

diff --git a/apps/gui/skin_engine/skin_display.c b/apps/gui/skin_engine/skin_display.c
index 460101a..4f33910 100644
--- a/apps/gui/skin_engine/skin_display.c
+++ b/apps/gui/skin_engine/skin_display.c
@@ -58,26 +58,6 @@

 static bool skin_redraw(struct gui_wps *gwps, unsigned refresh_mode);

-
-/* TODO: maybe move this whole function into wps.c instead ? */
-bool gui_wps_display(struct gui_wps *gwps)
-{
-    struct screen *display = gwps->display;
-
-    /* Update the values in the first (default) viewport - in case the user
-       has modified the statusbar or colour settings */
-#if LCD_DEPTH > 1
-    if (display->depth > 1)
-    {
-        struct viewport *vp = &find_viewport(VP_DEFAULT_LABEL, gwps->data)->vp;
-        vp->fg_pattern = display->get_foreground();
-        vp->bg_pattern = display->get_background();
-    }
-#endif
-    display->backdrop_show(BACKDROP_SKIN_WPS);
-    return skin_redraw(gwps, WPS_REFRESH_ALL);
-}
-
 /* update a skinned screen, update_type is WPS_REFRESH_* values.
  * Usually it should only be WPS_REFRESH_NON_STATIC
  * A full update will be done if required (state.do_full_update == true)
diff --git a/apps/gui/viewport.c b/apps/gui/viewport.c
index 0a2630c..9a7cfbd 100644
--- a/apps/gui/viewport.c
+++ b/apps/gui/viewport.c
@@ -70,6 +70,7 @@ static struct viewport custom_vp[NB_SCREENS];

 /* callbacks for GUI_EVENT_* events */
 static void viewportmanager_ui_vp_changed(void *param);
+static void viewportmanager_call_draw_func(void *param);
 static void statusbar_toggled(void* param);
 static unsigned viewport_init_ui_vp(void);
 #endif
@@ -215,29 +216,47 @@ void viewportmanager_theme_changed(const int which)
         event_add |= (statusbar_position(i) == STATUSBAR_CUSTOM);
     }

+    /* add one of those to ensure the draw function is called always */
     if (event_add)
+    {
         add_event(GUI_EVENT_REFRESH, false, viewportmanager_ui_vp_changed);
+        remove_event(GUI_EVENT_REFRESH, viewportmanager_call_draw_func);
+    }
     else
+    {
+        add_event(GUI_EVENT_REFRESH, false, viewportmanager_call_draw_func);
         remove_event(GUI_EVENT_REFRESH, viewportmanager_ui_vp_changed);
+    }

     send_event(GUI_EVENT_THEME_CHANGED, NULL);
 }

+/*
+ * simply calls a function that draws stuff, this exists to ensure the
+ * drawing function call in the GUI_EVENT_REFRESH event
+ *
+ * param should be 'void func(void)' */
+static void viewportmanager_call_draw_func(void *param)
+{
+    /* cast param to a function */
+    void (*draw_func)(void) = ((void(*)(void))param);
+    /* call the passed function which will redraw the content of
+     * the current screen */
+    if (draw_func != NULL)
+        draw_func();
+}
+
 static void viewportmanager_ui_vp_changed(void *param)
 {
     /* if the user changed the theme, we need to initiate a full redraw */
     int i;
-    /* cast param to a function */
-    void (*draw_func)(void) = ((void(*)(void))param);
     /* start with clearing the screen */
     FOR_NB_SCREENS(i)
         screens[i].clear_display();
     /* redraw the statusbar if it was enabled */
     send_event(GUI_EVENT_ACTIONUPDATE, (void*)true);
-    /* call the passed function which will redraw the content of
-     * the current screen */
-    if (draw_func != NULL)
-        draw_func();
+    /* call redraw function */
+    viewportmanager_call_draw_func(param);
     FOR_NB_SCREENS(i)
         screens[i].update();
 }
diff --git a/apps/gui/wps.c b/apps/gui/wps.c
index cc6bd60..d7c196f 100644
--- a/apps/gui/wps.c
+++ b/apps/gui/wps.c
@@ -582,6 +582,31 @@ static void gwps_leave_wps(void)
     send_event(GUI_EVENT_REFRESH, NULL);
 }

+/*
+ * display the wps on entering or restoring */
+static void gwps_enter_wps(void)
+{
+    int i;
+    FOR_NB_SCREENS(i)
+    {
+        struct gui_wps *gwps = &gui_wps[i];
+        struct screen *display = gwps->display;
+
+        display->stop_scroll();
+        /* Update the values in the first (default) viewport - in case the user
+           has modified the statusbar or colour settings */
+#if LCD_DEPTH > 1
+        if (display->depth > 1)
+        {
+            struct viewport *vp = &find_viewport(VP_DEFAULT_LABEL, gwps->data)->vp;
+            vp->fg_pattern = display->get_foreground();
+            vp->bg_pattern = display->get_background();
+        }
+#endif
+        skin_update(gwps, WPS_REFRESH_ALL);
+    }
+}
+
 #ifdef HAVE_TOUCHSCREEN
 int wps_get_touchaction(struct wps_data *data)
 {
@@ -1166,10 +1191,8 @@ long gui_wps_show(void)
          * e.g. during volume changing or ffwd/rewind */
             sb_skin_set_update_delay(0);
             FOR_NB_SCREENS(i)
-            {
-                screens[i].stop_scroll();
-                gui_wps_display(&gui_wps[i]);
-            }
+                gui_wps[i].display->backdrop_show(BACKDROP_SKIN_WPS);
+            send_event(GUI_EVENT_REFRESH, gwps_enter_wps);
         }

         if (exit) {