Index: apps/settings.c
===================================================================
--- apps/settings.c	(revision 12814)
+++ apps/settings.c	(working copy)
@@ -649,6 +649,7 @@
     sound_set(SOUND_TREBLE, global_settings.treble);
     sound_set(SOUND_BALANCE, global_settings.balance);
     sound_set(SOUND_VOLUME, global_settings.volume);
+    sound_set(SOUND_VLIMIT, global_settings.vlimit);
     sound_set(SOUND_CHANNELS, global_settings.channel_config);
     sound_set(SOUND_STEREO_WIDTH, global_settings.stereo_width);
 #if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
Index: apps/lang/english.lang
===================================================================
--- apps/lang/english.lang	(revision 12814)
+++ apps/lang/english.lang	(working copy)
@@ -10725,3 +10725,17 @@
     *: ""
   </voice>
 </phrase>
+<phrase>
+  id: LANG_VLIMIT
+  desc: sound setting to limit volume.
+  user:
+  <source>
+    *: "Volume Limit"
+  </source>
+  <dest>
+    *: "Volume Limit"
+  </dest>
+  <voice>
+    *: "Volume Limit"
+  </voice>
+</phrase>
Index: apps/gui/gwps.c
===================================================================
--- apps/gui/gwps.c	(revision 12814)
+++ apps/gui/gwps.c	(working copy)
@@ -294,18 +294,20 @@
                 /* volume up */
             case ACTION_WPS_VOLUP:
             {
-                global_settings.volume++;
-                bool res = false;
-                setvol();
-                FOR_NB_SCREENS(i)
-                {
-                    if(update_onvol_change(&gui_wps[i]))
-                        res = true;
+                if(global_settings.vlimit > global_settings.volume) {
+                    global_settings.volume++;
+                    bool res = false;
+                    setvol();
+                    FOR_NB_SCREENS(i)
+                    {
+                        if(update_onvol_change(&gui_wps[i]))
+                            res = true;
+                    }
+                    if (res) {
+                        restore = true;
+                        restoretimer = current_tick + HZ;
+                    }
                 }
-                if (res) {
-                    restore = true;
-                    restoretimer = current_tick + HZ;
-                }
             }
                 break;
 
Index: apps/settings.h
===================================================================
--- apps/settings.h	(revision 12814)
+++ apps/settings.h	(working copy)
@@ -304,6 +304,7 @@
     /* audio settings */
 
     int volume;     /* audio output volume:  0-100 0=off   100=max           */
+    int vlimit;     /* Volume limiter:       Same as volume                  */
     int balance;    /* stereo balance:       0-100 0=left  50=bal 100=right  */
     int bass;       /* bass eq:              0-100 0=off   100=max           */
     int treble;     /* treble eq:            0-100 0=low   100=high          */
Index: apps/menus/sound_menu.c
===================================================================
--- apps/menus/sound_menu.c	(revision 12814)
+++ apps/menus/sound_menu.c	(working copy)
@@ -55,6 +55,7 @@
 #endif
 
 MENUITEM_SETTING(volume, &global_settings.volume, soundmenu_callback);
+MENUITEM_SETTING(vlimit, &global_settings.vlimit, soundmenu_callback);
 MENUITEM_SETTING(bass, &global_settings.bass, soundmenu_callback);
 MENUITEM_SETTING(treble, &global_settings.treble, soundmenu_callback);
 MENUITEM_SETTING(balance, &global_settings.balance, soundmenu_callback);
@@ -95,6 +96,7 @@
 
 MAKE_MENU(sound_settings, ID2P(LANG_SOUND_SETTINGS), NULL, Icon_Audio,
           &volume,
+          &vlimit,
           &bass,&treble,
           &balance,&channel_config,&stereo_width
 #if CONFIG_CODEC == SWCODEC
Index: apps/settings_list.c
===================================================================
--- apps/settings_list.c	(revision 12814)
+++ apps/settings_list.c	(working copy)
@@ -353,6 +353,7 @@
 const struct settings_list settings[] = {
     /* sound settings */
     SOUND_SETTING(0,volume, LANG_VOLUME, "volume", SOUND_VOLUME),
+    SOUND_SETTING(0,vlimit, LANG_VLIMIT, "volume limit", SOUND_VLIMIT),
     SOUND_SETTING(0,balance, LANG_BALANCE, "balance", SOUND_BALANCE),
     SOUND_SETTING(0,bass, LANG_BASS, "bass", SOUND_BASS),
     SOUND_SETTING(0,treble, LANG_TREBLE, "treble", SOUND_TREBLE),
Index: firmware/export/sound.h
===================================================================
--- firmware/export/sound.h	(revision 12814)
+++ firmware/export/sound.h	(working copy)
@@ -38,6 +38,7 @@
 
 enum {
     SOUND_VOLUME = 0,
+    SOUND_VLIMIT,
     SOUND_BASS,
     SOUND_TREBLE,
     SOUND_BALANCE,
@@ -83,6 +84,7 @@
 
 void sound_set_dsp_callback(int (*func)(int, intptr_t));
 void sound_set_volume(int value);
+void sound_set_vlimit(int value);
 void sound_set_balance(int value);
 void sound_set_bass(int value);
 void sound_set_treble(int value);
Index: firmware/sound.c
===================================================================
--- firmware/sound.c	(revision 12814)
+++ firmware/sound.c	(working copy)
@@ -57,30 +57,39 @@
 static const struct sound_settings_info sound_settings_table[] = {
 #if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
     [SOUND_VOLUME]        = {"dB", 0,  1,-100,  12, -25, sound_set_volume},
+    [SOUND_VLIMIT]        = {"dB", 0,  1,-100,  12,  12, sound_set_vlimit},
     [SOUND_BASS]          = {"dB", 0,  1, -12,  12,   6, sound_set_bass},
     [SOUND_TREBLE]        = {"dB", 0,  1, -12,  12,   6, sound_set_treble},
 #elif defined(HAVE_UDA1380)
     [SOUND_VOLUME]        = {"dB", 0,  1, -84,   0, -25, sound_set_volume},
+    [SOUND_VLIMIT]        = {"dB", 0,  1, -84,   0,   0, sound_set_vlimit},
     [SOUND_BASS]          = {"dB", 0,  2,   0,  24,   0, sound_set_bass},
     [SOUND_TREBLE]        = {"dB", 0,  2,   0,   6,   0, sound_set_treble},
 #elif defined(HAVE_TLV320)
     [SOUND_VOLUME]        = {"dB", 0,  1, -73,   6, -20, sound_set_volume},
+    [SOUND_VLIMIT]        = {"dB", 0,  1, -73,   6,   6, sound_set_vlimit},
 #elif defined(HAVE_WM8975) || defined(HAVE_WM8751)
     [SOUND_VOLUME]        = {"dB", 0,  1, -74,   6, -25, sound_set_volume},
+    [SOUND_VLIMIT]        = {"dB", 0,  1, -74,   6,   6, sound_set_vlimit},
     [SOUND_BASS]          = {"dB", 0,  1,  -6,   9,   0, sound_set_bass},
     [SOUND_TREBLE]        = {"dB", 0,  1,  -6,   9,   0, sound_set_treble},
 #elif defined(HAVE_WM8758)
     [SOUND_VOLUME]        = {"dB", 0,  1, -58,   6, -25, sound_set_volume},
+    [SOUND_VLIMIT]        = {"dB", 0,  1, -58,   6,   6, sound_set_vlimit},
     [SOUND_BASS]          = {"dB", 0,  1,  -6,   9,   0, sound_set_bass},
     [SOUND_TREBLE]        = {"dB", 0,  1,  -6,   9,   0, sound_set_treble},
 #elif defined(HAVE_WM8731) || defined(HAVE_WM8721)
     [SOUND_VOLUME]        = {"dB", 0,  1, -74,   6, -25, sound_set_volume},
+    [SOUND_VLIMIT]        = {"dB", 0,  1, -74,   6,   6, sound_set_vlimit},
 #elif (CONFIG_CPU == PNX0101)
     [SOUND_VOLUME]        = {"dB", 0,  1, -48,  15,   0, sound_set_volume},
+    [SOUND_VLIMIT]        = {"dB", 0,  1, -48,  15,  15, sound_set_vlimit},
 #elif defined(HAVE_AS3514)
     [SOUND_VOLUME]        = {"dB", 0,  1, -45,   1, -25, sound_set_volume},
+    [SOUND_VLIMIT]        = {"dB", 0,  1, -45,   1,   1, sound_set_vlimit},
 #else /* MAS3507D */
     [SOUND_VOLUME]        = {"dB", 0,  1, -78,  18, -18, sound_set_volume},
+    [SOUND_VLIMIT]        = {"dB", 0,  1, -78,  18,  18, sound_set_vlimit},
     [SOUND_BASS]          = {"dB", 0,  1, -15,  15,   7, sound_set_bass},
     [SOUND_TREBLE]        = {"dB", 0,  1, -15,  15,   7, sound_set_treble},
 #endif
@@ -481,6 +490,11 @@
 #endif
 }
 
+void sound_set_vlimit(int value)
+{
+    (void)value;
+}
+
 void sound_set_balance(int value)
 {
     if(!audio_is_initialized)
@@ -677,6 +691,11 @@
     (void)value;
 }
 
+void sound_set_vlimit(int value)
+{
+    (void)value;
+}
+
 void sound_set_balance(int value)
 {
     (void)value;
