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,
+                  set_wheel_speed),
+#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)
@@ -66,6 +66,7 @@
 #define WHEEL_SENSITIVITY 4 /* default sensitivity */
 #endif
 
+static int wheelspeed = WHEEL_SENSITIVITY;
 int  old_wheel_value  = -1;
 int  new_wheel_value  = 0;
 int  repeat           = 0;
@@ -97,6 +98,14 @@
 }
 #endif
 
+void set_wheel_speed(int wheel_speed)
+{
+    wheelspeed = wheel_speed;
+    old_wheel_value         = -1;
+    wheel_velocity          = 0;
+    accumulated_wheel_delta = 0;
+    wheel_repeat            = BUTTON_NONE;
+}
 static inline int ipod_4g_button_read(void)
 {
     int whl = -1;
@@ -163,9 +172,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 >=  wheelspeed)
                         wheel_keycode = BUTTON_SCROLL_FWD;
-                    else if (wheel_delta <= -WHEEL_SENSITIVITY)
+                    else if (wheel_delta <= -wheelspeed)
                         wheel_keycode = BUTTON_SCROLL_BACK;
                     else 
                         wheel_keycode = BUTTON_NONE;
@@ -217,8 +226,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 wheelspeed clicks = scrolling 1 item */
+                            accumulated_wheel_delta /= wheelspeed;
 #ifdef HAVE_SCROLLWHEEL
                             /* use data-format for HAVE_SCROLLWHEEL */
                             /* always use acceleration mode (1<<31) */
