diff --git a/apps/lang/english.lang b/apps/lang/english.lang
index 37f673b..2fa5c76 100644
--- a/apps/lang/english.lang
+++ b/apps/lang/english.lang
@@ -4427,7 +4427,7 @@
 </phrase>
 <phrase>
   id: LANG_SLEEP_TIMER
-  desc: sleep timer setting
+  desc: sleep timer menu item
   user: core
   <source>
     *: "Sleep Timer"
@@ -12813,3 +12813,59 @@
     *: "Save Changes?"
   </voice>
 </phrase>
+<phrase>
+  id: LANG_SLEEP_TIMER_START
+  desc: start sleep timer
+  user: core
+  <source>
+    *: "Start Sleep Timer (%d:%02d)"
+  </source>
+  <dest>
+    *: "Start Sleep Timer (%d:%02d)"
+  </dest>
+  <voice>
+    *: "Start Sleep Timer"
+  </voice>
+</phrase>
+<phrase>
+  id: LANG_SLEEP_TIMER_STOP
+  desc: stop sleep timer
+  user: core
+  <source>
+    *: "Stop Sleep Timer (%d:%02d)"
+  </source>
+  <dest>
+    *: "Stop Sleep Timer (%d:%02d)"
+  </dest>
+  <voice>
+    *: "Stop Sleep Timer"
+  </voice>
+</phrase>
+<phrase>
+  id: LANG_SLEEP_TIMER_DURATION
+  desc: sleep timer duration in minutes
+  user: core
+  <source>
+    *: "Sleep Timer Duration"
+  </source>
+  <dest>
+    *: "Sleep Timer Duration"
+  </dest>
+  <voice>
+    *: "Sleep Timer Duration"
+  </voice>
+</phrase>
+<phrase>
+  id: LANG_SLEEP_TIMER_ON_POWER_UP
+  desc: whether sleep timer starts on power up
+  user: core
+  <source>
+    *: "Start Sleep Timer On Boot"
+  </source>
+  <dest>
+    *: "Start Sleep Timer On Boot"
+  </dest>
+  <voice>
+    *: "Start Sleep Timer On Boot"
+  </voice>
+</phrase>
diff --git a/apps/menu.h b/apps/menu.h
index b5bab90..8071b6b 100644
--- a/apps/menu.h
+++ b/apps/menu.h
@@ -197,9 +197,9 @@ int do_menu(const struct menu_item_ex *menu, int *start_selected,
                                   text_cb_data, callback, icon)             \
     static const struct menu_get_name_and_icon name##_                      \
         = {callback,text_callback,voice_callback,text_cb_data,icon};        \
-    static const struct menu_func name##__ = {{(void*)func}, param};           \
-    static const struct menu_item_ex name   =                                  \
-        { MT_FUNCTION_CALL|MENU_DYNAMIC_DESC|flags,                            \
+    static const struct menu_func name##__ = {{(void*)func}, param};        \
+    const struct menu_item_ex name   =                                      \
+        { MT_FUNCTION_CALL|MENU_DYNAMIC_DESC|flags,                         \
          { .function = & name##__}, {.menu_get_name_and_icon = & name##_}};
 
 /*  Use this to actually create a menu. the ... argument is a list of pointers 
diff --git a/apps/menus/main_menu.c b/apps/menus/main_menu.c
index 6ee7ba4..ee35767 100644
--- a/apps/menus/main_menu.c
+++ b/apps/menus/main_menu.c
@@ -392,46 +392,48 @@ static bool show_info(void)
 MENUITEM_FUNCTION(show_info_item, 0, ID2P(LANG_ROCKBOX_INFO),
                    (menu_function)show_info, NULL, NULL, Icon_NOICON);
 
+#if CONFIG_RTC
+int time_screen(void* ignored);
+MENUITEM_FUNCTION(timedate_item, MENU_FUNC_CHECK_RETVAL, ID2P(LANG_TIME_MENU),
+                    time_screen, NULL,  NULL, Icon_Menu_setting );
+#endif
 
-/* sleep Menu */
-static const char* sleep_timer_formatter(char* buffer, size_t buffer_size,
-                                         int value, const char* unit)
+static char* get_current_sleeptimer_status(int selected_item, void * data, char *buffer)
 {
-    (void) unit;
-    int minutes, hours;
-
-    if (value) {
-        hours = value / 60;
-        minutes = value - (hours * 60);
-        snprintf(buffer, buffer_size, "%d:%02d", hours, minutes);
-        return buffer;
-    } else {
-        return str(LANG_OFF);
+    (void)selected_item;
+    (void)data;
+    int remain = get_sleep_timer();
+    if (remain)
+    {
+        remain += 59; /* round up minutes */
+        snprintf(buffer, MAX_PATH, str(LANG_SLEEP_TIMER_STOP),
+            remain / 3600,
+            ( remain % 3600 ) / 60
+        );
     }
+    else
+    {
+        remain = global_settings.sleeptimer_duration;
+        snprintf(buffer, MAX_PATH, str(LANG_SLEEP_TIMER_START),
+            remain / 60,
+            remain % 60
+        );
+    }
+    return buffer;
 }
 
-static void sleep_timer_set(int minutes)
-{
-    set_sleep_timer(minutes * 60);
-}
-
-static int sleep_timer(void)
+static int toggle_sleep_timer(void)
 {
-    int minutes = (get_sleep_timer() + 59) / 60; /* round up */
-    return (int)set_int(str(LANG_SLEEP_TIMER), "", UNIT_MIN, &minutes,
-                   &sleep_timer_set, 5, 0, 300, sleep_timer_formatter);
+    if (get_sleep_timer())
+        set_sleep_timer(0);
+    else
+        set_sleep_timer(global_settings.sleeptimer_duration * 60);
+    return 0;
 }
 
-
-#if CONFIG_RTC
-int time_screen(void* ignored);
-MENUITEM_FUNCTION(timedate_item, MENU_FUNC_CHECK_RETVAL, ID2P(LANG_TIME_MENU),
-                    time_screen, NULL,  NULL, Icon_Menu_setting );
-#endif
 /* This item is in the time/date screen if there is a RTC */
-MENUITEM_FUNCTION(sleep_timer_call, 0, ID2P(LANG_SLEEP_TIMER), sleep_timer,
-                    NULL, NULL, Icon_Menu_setting); /* make it look like a 
-                                                       setting to the user */
+MENUITEM_FUNCTION_DYNTEXT(sleep_timer_call, 0, toggle_sleep_timer, NULL,
+                    get_current_sleeptimer_status, NULL, NULL, NULL, Icon_NOICON);
 
 MENUITEM_FUNCTION(show_credits_item, 0, ID2P(LANG_CREDITS),
                    (menu_function)show_credits, NULL, NULL, Icon_NOICON);
diff --git a/apps/menus/settings_menu.c b/apps/menus/settings_menu.c
index b3003bf..4b7bac4 100644
--- a/apps/menus/settings_menu.c
+++ b/apps/menus/settings_menu.c
@@ -220,6 +220,33 @@ MAKE_MENU(disk_menu, ID2P(LANG_DISK_MENU), 0, Icon_NOICON,
 /* System menu */
 MENUITEM_SETTING(poweroff, &global_settings.poweroff, NULL);
 
+/* Sleep timer menu */
+static int initial_duration;
+static int sleeptimer_duration_cb(int action,
+                                  const struct menu_item_ex *this_item)
+{
+    (void)this_item;
+    switch (action)
+    {
+        case ACTION_ENTER_MENUITEM:
+            initial_duration = global_settings.sleeptimer_duration;
+            break;
+        case ACTION_EXIT_MENUITEM:
+            if (initial_duration != global_settings.sleeptimer_duration && get_sleep_timer())
+                set_sleep_timer(global_settings.sleeptimer_duration * 60);
+    }
+    return action;
+}
+
+MENUITEM_SETTING(menu_sleeptimer_duration, &global_settings.sleeptimer_duration,
+                 sleeptimer_duration_cb);
+
+MENUITEM_SETTING(menu_sleeptimer_on_startup,
+                 &global_settings.sleeptimer_on_startup, NULL);
+
+MAKE_MENU(sleeptimer_menu, ID2P(LANG_SLEEP_TIMER), NULL, Icon_NOICON,
+          &menu_sleeptimer_duration, &menu_sleeptimer_on_startup);
+
 /* Limits menu */
 MENUITEM_SETTING(max_files_in_dir, &global_settings.max_files_in_dir, NULL);
 MENUITEM_SETTING(max_files_in_playlist, &global_settings.max_files_in_playlist, NULL);
@@ -297,6 +324,7 @@ MAKE_MENU(system_menu, ID2P(LANG_SYSTEM),
             &disk_menu,
 #endif
             &poweroff,
+            &sleeptimer_menu,
             &limits_menu,
 #ifdef HAVE_MORSE_INPUT
             &morse_input,
diff --git a/apps/root_menu.c b/apps/root_menu.c
index 472c1db..0084e23 100644
--- a/apps/root_menu.c
+++ b/apps/root_menu.c
@@ -661,6 +661,9 @@ void root_menu(void)
             next_screen = GO_TO_ROOT;
 #endif
 
+    if (global_settings.sleeptimer_on_startup)
+        set_sleep_timer(global_settings.sleeptimer_duration * 60);
+
     while (true)
     {
         switch (next_screen)
diff --git a/apps/settings.h b/apps/settings.h
index 05965b3..adcbc5e 100644
--- a/apps/settings.h
+++ b/apps/settings.h
@@ -786,6 +786,9 @@ struct user_settings
     int compressor_release_time;
 #endif
 
+    int sleeptimer_duration;
+    bool sleeptimer_on_startup;
+
 #ifdef HAVE_MORSE_INPUT
     bool morse_input; /* text input method setting */
 #endif
diff --git a/apps/settings_list.c b/apps/settings_list.c
index 292749b..defbcf1 100644
--- a/apps/settings_list.c
+++ b/apps/settings_list.c
@@ -519,6 +519,13 @@ static void tsc_set_default(void* setting, void* defaultval)
     memcpy(setting, defaultval, sizeof(struct touchscreen_parameter));
 }
 #endif
+static const char* sleeptimer_formatter(char* buffer, size_t buffer_size,
+                                         int value, const char* unit)
+{
+    (void) unit;
+    snprintf(buffer, buffer_size, "%d:%02d", value / 60, value % 60);
+    return buffer;
+}
 #ifdef HAVE_HOTKEY
 static const char* hotkey_formatter(char* buffer, size_t buffer_size, int value,
                               const char* unit)
@@ -1723,6 +1730,11 @@ const struct settings_list settings[] = {
 #endif /* CONFIG_CODEC == SWCODEC */
     TEXT_SETTING(0, playlist_catalog_dir, "playlist catalog directory",
                      PLAYLIST_CATALOG_DEFAULT_DIR, NULL, NULL),
+    INT_SETTING(0, sleeptimer_duration, LANG_SLEEP_TIMER_DURATION, 30,
+                "sleeptimer duration",
+                UNIT_MIN, 5, 300, 5, sleeptimer_formatter, NULL, NULL),
+    OFFON_SETTING(0, sleeptimer_on_startup, LANG_SLEEP_TIMER_ON_POWER_UP, false,
+                  "sleeptimer on startup", NULL),
 #ifdef HAVE_TOUCHPAD_SENSITIVITY_SETTING
     CHOICE_SETTING(0, touchpad_sensitivity, LANG_TOUCHPAD_SENSITIVITY, 0,
                    "touchpad sensitivity", "normal,high", touchpad_set_sensitivity, 2,
diff --git a/manual/appendix/config_file_options.tex b/manual/appendix/config_file_options.tex
index 520adbb..2da9b76 100644
--- a/manual/appendix/config_file_options.tex
+++ b/manual/appendix/config_file_options.tex
@@ -100,6 +100,9 @@
     }
     idle poweroff   & off, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 15, 30, 45, 60
                                         & min\\
+    sleeptimer duration   & 5 to 300 (in steps of 5)
+                                        & min\\
+    sleeptimer on startup & off, on     & N/A\\
     max files in playlist & 1000 - 32000 & N/A\\
     max files in dir & 50 - 10000       & N/A\\
     lang            & /path/filename.lng & N/A\\
diff --git a/manual/configure_rockbox/system_options.tex b/manual/configure_rockbox/system_options.tex
index f53fa50..60631ae 100644
--- a/manual/configure_rockbox/system_options.tex
+++ b/manual/configure_rockbox/system_options.tex
@@ -120,6 +120,21 @@ paused. It is not idle while the USB or charger is connected
 Settings are either \setting{Off} or 1 to 10 minutes in 1 minute steps. Then 
 15, 30, 45 or 60 minutes are available.
 
+\subsection{\label{ref:sleep_timer_submenu}Sleep Timer}
+\setting{Sleep Timer} related menu options.
+The \setting{Sleep Timer} powers off your \dap{} after a given time
+and is triggered from \setting{System 
+  \opt{rtc}{ $\rightarrow$ \setting{Time and Date} }%\opt{rtc}
+} (See \reference{ref:Info}). 
+  \begin{description}
+    \item[Sleep Timer Duration.]
+      The number of minutes from when new timers are initiated to
+      their completion. The values range from 5 minutes to 5 hours in
+      5 minute steps. If a timer is currently active, the timer's
+      duration will be set to the newly entered value.
+    \item[Start Sleep Timer On Boot.]  If set, a timer will be
+      initiated when the device starts.
+  \end{description}
 
 \subsection{Limits}
 This sub menu relates to limits in the Rockbox operating system.
diff --git a/manual/main_menu/main.tex b/manual/main_menu/main.tex
index 76063e8..18962d5 100644
--- a/manual/main_menu/main.tex
+++ b/manual/main_menu/main.tex
@@ -200,10 +200,13 @@ pages of information.}
     Time related menu options. Pressing \ActionStdContext{} will voice the current time if voice support is enabled
     \begin{description}
       \item[Set Time/Date:] Set current time and date.
-      \item[Sleep Timer:]
-        The \setting{Sleep Timer} powers off your \dap{} after playing for a given
-        time. It can be set from \setting{Off} to 5 hours in 5 minute steps.
-        The \setting{Sleep Timer} is reset on boot.
+      \item[Start Sleep Timer (\emph{duration}):]
+        Shown when the \setting{Sleep Timer} is inactive, this option will initiate the \setting{Sleep Timer}.
+        The \setting{Sleep Timer} powers off your \dap{} after playing for the duration shown in brackets.
+        The duration (in minutes) is set from \setting{Timer Duration} within \reference{ref:sleep_timer_submenu}).
+      \item[Stop Sleep Timer (\emph{remaining}):]
+        Shown when the \setting{Sleep Timer} is active, this option will disable the current \setting{Sleep Timer}.
+        The minutes remaining before completion is shown in brackets.
       \opt{alarm}{
         \item[Wake-Up Alarm:]
             This option will make the \dap{} start up at the specified time.
@@ -238,10 +241,13 @@ pages of information.}
   Display the list of contributors.
 
 \nopt{rtc}{
-  \item[Sleep Timer:]
-    The \setting{Sleep Timer} powers off your \dap{} after playing for a given
-    time. It can be set from \setting{Off} to 5 hours in 5 minute steps.
-    The \setting{Sleep Timer} is reset on boot.
+  \item[Start Sleep Timer (\emph{duration}):]
+    Shown when the \setting{Sleep Timer} is inactive, this option will initiate the \setting{Sleep Timer}.
+    The \setting{Sleep Timer} powers off your \dap{} after playing for the duration shown in brackets.
+    The duration (in minutes) is set from \setting{Timer Duration} within \reference{ref:sleep_timer_submenu}).
+  \item[Stop Sleep Timer (\emph{remaining}):]
+    Shown when the \setting{Sleep Timer} is active, this option will disable the current \setting{Sleep Timer}.
+    The minutes remaining before completion is shown in brackets.
 }
 
 \item[Running Time:]
