Index: apps/gui/gwps.h
===================================================================
--- apps/gui/gwps.h.orig
+++ apps/gui/gwps.h
@@ -52,6 +52,11 @@
 #define WPS_ALBUMART_INCREASE       8                   /* increase if smaller */
 #define WPS_ALBUMART_DECREASE       16                  /* decrease if larger  */
 
+/* progressbar types */
+#define NORMAL 0
+#define BITMAP 1
+#define SLIDER 2
+
 /* wps_data*/
 
 #ifdef HAVE_LCD_BITMAP
@@ -69,7 +74,7 @@ struct gui_img{
 
 struct prog_img{ /*progressbar image*/
     struct bitmap bm;
-    bool have_bitmap_pb;
+    short pb_type;
 };
 #endif
 
@@ -198,6 +203,7 @@ enum wps_token_type {
     /* Image */
     WPS_TOKEN_IMAGE_BACKDROP,
     WPS_TOKEN_IMAGE_PROGRESS_BAR,
+    WPS_TOKEN_SLIDER_PROGRESS_BAR,
     WPS_TOKEN_IMAGE_PRELOAD,
     WPS_TOKEN_IMAGE_PRELOAD_DISPLAY,
     WPS_TOKEN_IMAGE_DISPLAY,
Index: apps/gui/wps_parser.c
===================================================================
--- apps/gui/wps_parser.c.orig
+++ apps/gui/wps_parser.c
@@ -266,6 +266,7 @@ static const struct wps_tag all_tags[] =
 
     { WPS_TOKEN_IMAGE_DISPLAY,            "x",   0,       parse_image_load },
     { WPS_TOKEN_IMAGE_PROGRESS_BAR,       "P",   0,    parse_image_special },
+    { WPS_TOKEN_SLIDER_PROGRESS_BAR,      "S",   0,    parse_image_special },
 #if (LCD_DEPTH > 1) || (defined(HAVE_LCD_REMOTE) && (LCD_REMOTE_DEPTH > 1))
     { WPS_TOKEN_IMAGE_BACKDROP,           "X",   0,    parse_image_special },
 #endif
@@ -474,7 +475,15 @@ static int parse_image_special(const cha
     {
         /* format: %P|filename.bmp| */
         pb_bmp_name = wps_bufptr + 1;
+        wps_data->progressbar.pb_type=BITMAP;
+    } 
+    else if (token->type == WPS_TOKEN_SLIDER_PROGRESS_BAR)
+    {
+        /* format: %S|filename.bmp| */
+        pb_bmp_name = wps_bufptr + 1;
+        wps_data->progressbar.pb_type=SLIDER;
     }
+
 #if LCD_DEPTH > 1
     else if (token->type == WPS_TOKEN_IMAGE_BACKDROP)
     {
@@ -1064,7 +1073,7 @@ static void wps_images_clear(struct wps_
        data->img[i].display = false;
        data->img[i].always_display = false;
     }
-    data->progressbar.have_bitmap_pb = false;
+    data->progressbar.pb_type = NORMAL;
 }
 #endif
 
@@ -1147,10 +1156,11 @@ static void load_wps_bitmaps(struct wps_
 
         /* load the image */
         wps_data->progressbar.bm.data = wps_data->img_buf_ptr;
-        if (load_bitmap(wps_data, img_path, &wps_data->progressbar.bm)
-            && wps_data->progressbar.bm.width <= LCD_WIDTH)
+        if (!load_bitmap(wps_data, img_path, &wps_data->progressbar.bm)
+            || wps_data->progressbar.bm.width > LCD_WIDTH)
         {
-            wps_data->progressbar.have_bitmap_pb = true;
+        	// fallback
+            wps_data->progressbar.pb_type=NORMAL;
         }
     }
 
Index: apps/gui/wps_debug.c
===================================================================
--- apps/gui/wps_debug.c.orig
+++ apps/gui/wps_debug.c
@@ -217,6 +217,10 @@ static void dump_wps_tokens(struct wps_d
                 snprintf(buf, sizeof(buf), "progressbar bitmap");
                 break;
 
+            case WPS_TOKEN_SLIDER_PROGRESS_BAR:
+                snprintf(buf, sizeof(buf), "progressbar slider");
+                break;
+
             case WPS_TOKEN_PEAKMETER:
                 snprintf(buf, sizeof(buf), "peakmeter");
                 break;
Index: apps/gui/gwps-common.c
===================================================================
--- apps/gui/gwps-common.c.orig
+++ apps/gui/gwps-common.c
@@ -469,6 +469,28 @@ void display_keylock_text(bool locked)
 
 #ifdef HAVE_LCD_BITMAP
 
+void slider_progressbar_draw(struct screen * screen, struct bitmap bm,
+                             int pb_x, int pb_y, int pb_width,
+                             long total_length, long progress)
+{
+    int slider_x = pb_x + (pb_width - bm.width) * progress / total_length;
+
+    screen->set_drawmode(DRMODE_SOLID|DRMODE_INVERSEVID);
+    screen->fillrect(pb_x, pb_y, pb_width, bm.height);
+
+    screen->set_drawmode(DRMODE_FG);
+#if LCD_DEPTH > 1
+    if(bm.format == FORMAT_MONO) {
+#endif
+        screen->mono_bitmap(bm.data, slider_x, pb_y, bm.width, bm.height);
+#if LCD_DEPTH > 1
+    } else {
+        screen->transparent_bitmap((fb_data *)bm.data, slider_x,
+                                    pb_y, bm.width, bm.height);
+    }
+#endif
+}
+
 static void draw_progressbar(struct gui_wps *gwps, int line)
 {
     struct wps_data *data = gwps->data;
@@ -487,7 +509,7 @@ static void draw_progressbar(struct gui_
     if (!data->progress_end)
         data->progress_end=display->width;
 
-    if (gwps->data->progressbar.have_bitmap_pb)
+    if (gwps->data->progressbar.pb_type==BITMAP)
         gui_bitmap_scrollbar_draw(display, data->progressbar.bm,
                                   data->progress_start, sb_y,
                                   data->progress_end-data->progress_start,
@@ -496,6 +518,14 @@ static void draw_progressbar(struct gui_
                                   state->id3->length ? state->id3->elapsed
                                                        + state->ff_rewind_count : 0,
                                   HORIZONTAL);
+    else if (gwps->data->progressbar.pb_type==SLIDER){
+    	DEBUGF("slider progress\n");
+        slider_progressbar_draw(display, data->progressbar.bm,
+                                  data->progress_start, sb_y,
+                                  data->progress_end-data->progress_start,
+                                  state->id3->length?state->id3->length:1,
+                                  state->id3->length?state->id3->elapsed + state->ff_rewind_count:0);
+    }
     else
         gui_scrollbar_draw(display, data->progress_start, sb_y,
                            data->progress_end-data->progress_start,
