Index: apps/lang/english.lang
===================================================================
--- apps/lang/english.lang	(revision 27325)
+++ apps/lang/english.lang	(working copy)
@@ -12619,3 +12619,17 @@
     *: "Update on Stop"
   </voice>
 </phrase>
+<phrase>
+  id: LANG_WHEEL_SPEED
+  desc: Display for setting IPOD wheel spped
+  user: core
+  <source>
+    *: "Thumb Wheel Speed"
+  </source>
+  <dest>
+    *: "Thumb Wheel Speed"
+  </dest>
+  <voice>
+    *: "Thumb Wheel Speed"
+  </voice>
+</phrase>
Index: apps/settings.h
===================================================================
--- apps/settings.h	(revision 27325)
+++ apps/settings.h	(working copy)
@@ -818,6 +818,10 @@
     bool morse_input; /* text input method setting */
 #endif
 
+#ifdef IPOD_ARCH
+    int wheel_speed;
+#endif
+
 #ifdef HAVE_HOTKEY
     /* hotkey assignments - acceptable values are in
        hotkey_action enum in onplay.h */
Index: apps/menus/settings_menu.c
===================================================================
--- apps/menus/settings_menu.c	(revision 27325)
+++ apps/menus/settings_menu.c	(working copy)
@@ -263,6 +263,10 @@
 MENUITEM_SETTING(morse_input, &global_settings.morse_input, NULL);
 #endif
 
+#ifdef IPOD_ARCH
+MENUITEM_SETTING(wheel_speed, &global_settings.wheel_speed, NULL);
+#endif
+
 #ifdef HAVE_BUTTON_LIGHT
 MENUITEM_SETTING(buttonlight_timeout, &global_settings.buttonlight_timeout, NULL);
 #endif
@@ -313,6 +317,9 @@
 #if CONFIG_CODEC == SWCODEC
             &keyclick_menu,
 #endif
+#ifdef IPOD_ARCH
+            &wheel_speed,
+#endif
 #ifdef HAVE_TOUCHPAD_SENSITIVITY_SETTING
             &touchpad_sensitivity,
 #endif
Index: apps/settings_list.c
===================================================================
--- apps/settings_list.c	(revision 27325)
+++ apps/settings_list.c	(working copy)
@@ -931,6 +931,11 @@
                    "seek acceleration", "very fast,fast,normal,slow,very slow", NULL, 5,
                    ID2P(LANG_VERY_FAST), ID2P(LANG_FAST), ID2P(LANG_NORMAL),
                    ID2P(LANG_SLOW) , ID2P(LANG_VERY_SLOW)),
+#ifdef IPOD_ARCH
+    INT_SETTING(0, wheel_speed, LANG_WHEEL_SPEED, 8,
+                  "wheel_speed", UNIT_INT, 3, 20, 1, NULL, NULL,
+                  NULL),
+#endif
 #if (CONFIG_CODEC == SWCODEC) && defined(HAVE_DISK_STORAGE)
     STRINGCHOICE_SETTING(0, buffer_margin, LANG_MP3BUFFER_MARGIN, 0,"antiskip",
                          "5s,15s,30s,1min,2min,3min,5min,10min", NULL, 8,
Index: firmware/export/button.h
===================================================================
--- firmware/export/button.h	(revision 27325)
+++ firmware/export/button.h	(working copy)
@@ -63,6 +63,10 @@
 int button_apply_acceleration(const unsigned int data);
 #endif
 
+#ifdef IPOD_ARCH
+void set_wheel_speed(int wheel_speed);
+#endif
+
 #define BUTTON_NONE        0x00000000
 
 /* Button modifiers */
Index: firmware/target/arm/ipod/button-clickwheel.c
===================================================================
--- firmware/target/arm/ipod/button-clickwheel.c	(revision 27325)
+++ firmware/target/arm/ipod/button-clickwheel.c	(working copy)
@@ -35,6 +35,9 @@
 #include "system.h"
 #include "button.h"
 #include "kernel.h"
+#ifndef BOOTLOADER
+#include "settings.h"
+#endif
 #include "backlight.h"
 #include "serial.h"
 #include "power.h"
@@ -57,15 +60,7 @@
 
 #define WHEELCLICKS_PER_ROTATION     96 /* wheelclicks per full rotation */
 
-/* This amount of clicks is needed for at least scrolling 1 item. Choose small values 
- * to have high sensitivity but few precision, choose large values to have less 
- * sensitivity and good precision. */
-#if defined(IPOD_NANO) || defined(IPOD_NANO2G)
-#define WHEEL_SENSITIVITY 6 /* iPod nano has smaller wheel, lower sensitivity needed */
-#else
-#define WHEEL_SENSITIVITY 4 /* default sensitivity */
-#endif
-
+int  wheel_sensitivity;
 int  old_wheel_value  = -1;
 int  new_wheel_value  = 0;
 int  repeat           = 0;
@@ -97,6 +92,7 @@
 }
 #endif
 
+
 static inline int ipod_4g_button_read(void)
 {
     int whl = -1;
@@ -153,6 +149,11 @@
                     /* This is for later = BUTTON_SCROLL_TOUCH;*/
                     wheel_delta = new_wheel_value - old_wheel_value;
                     unsigned int wheel_keycode = BUTTON_NONE;
+#ifdef BOOTLOADER
+                    wheel_sensitivity = 6;
+#else
+                    wheel_sensitivity = global_settings.wheel_speed;
+#endif
 
                     /* Taking into account wrapping during transition from highest 
                      * to lowest wheel position and back */
@@ -163,9 +164,9 @@
     
                     /* Getting direction and wheel_keycode from wheel_delta.
                      * Need at least some clicks to be sure to avoid haptic fuzziness */
-                    if      (wheel_delta >=  WHEEL_SENSITIVITY)
+                    if      (wheel_delta >=  wheel_sensitivity)
                         wheel_keycode = BUTTON_SCROLL_FWD;
-                    else if (wheel_delta <= -WHEEL_SENSITIVITY)
+                    else if (wheel_delta <= -wheel_sensitivity)
                         wheel_keycode = BUTTON_SCROLL_BACK;
                     else 
                         wheel_keycode = BUTTON_NONE;
@@ -217,8 +218,8 @@
                         /* The queue should have no other events when scrolling */
                         if (queue_empty(&button_queue))
                         {
-                            /* each WHEEL_SENSITIVITY clicks = scrolling 1 item */
-                            accumulated_wheel_delta /= WHEEL_SENSITIVITY;
+                            /* each wheel_sensitivity clicks = scrolling 1 item */
+                            accumulated_wheel_delta /= wheel_sensitivity;
 #ifdef HAVE_SCROLLWHEEL
                             /* use data-format for HAVE_SCROLLWHEEL */
                             /* always use acceleration mode (1<<31) */
