Index: apps/lang/deutsch.lang
===================================================================
--- apps/lang/deutsch.lang	(revision 12207)
+++ apps/lang/deutsch.lang	(working copy)
@@ -1344,6 +1344,56 @@
   </voice>
 </phrase>
 <phrase>
+  id: LANG_USB_BUTTON
+  desc: use button for USB power only/connection
+  user:
+  <source>
+    *: "Press button for USB..."
+  </source>
+  <dest>
+    *: "Drücke Knopf für USB..."
+    recorder,fmrecorder,recorderv2: "Drücke F1 für USB..."
+    ondiofm,ondiosp: "Drücke MENU für USB..."
+    h300: "Drücke REC für USB..."
+    ipod4g,ipodcolor,ipodmini,ipodmini2g,ipodnano,ipodvideo: "Drücke MENU für USB..."
+  </dest>
+  <voice>
+    *: "Drücke Knopf für USB..."
+    recorder,fmrecorder,recorderv2: "Drücke F1 für USB..."
+    h300: "Drücke Aufnahme für USB..."
+    ondiofm,ondiosp: "Drücke Menü für USB..."
+    ipod4g,ipodcolor,ipodmini,ipodmini2g,ipodnano,ipodvideo: "Drücke Menü für USB..."
+  </voice>
+</phrase>
+<phrase>
+  id: LANG_USB_BUTTON_POWERONLY
+  desc: use button for USB power only
+  user:
+  <source>
+    *: "power only"
+  </source>
+  <dest>
+    *: "Stromversorgung (ausschließlich)"
+  </dest>
+  <voice>
+    *: "Stromversorgung (ausschließlich)"
+  </voice>
+</phrase>
+<phrase>
+  id: LANG_USB_BUTTON_CONNECTION
+  desc: use button for USB connection
+  user:
+  <source>
+    *: "connection"
+  </source>
+  <dest>
+    *: "Verbindung"
+  </dest>
+  <voice>
+    *: "Verbindung"
+  </voice>
+</phrase>
+<phrase>
   id: LANG_SHUFFLE
   desc: in settings_menu
   user:
Index: apps/lang/english.lang
===================================================================
--- apps/lang/english.lang	(revision 12207)
+++ apps/lang/english.lang	(working copy)
@@ -1382,6 +1382,56 @@
   </voice>
 </phrase>
 <phrase>
+  id: LANG_USB_BUTTON
+  desc: use button for USB power only/connection
+  user:
+  <source>
+    *: "press button for USB..."
+  </source>
+  <dest>
+    *: "Press button for USB..."
+    recorder,fmrecorder,recorderv2: "Press F1 for USB..."
+    h300: "Press REC button for USB..."
+    ondiofm,ondiosp: "Press MENU for USB..."
+    ipod4g,ipodcolor,ipodmini,ipodmini2g,ipodnano,ipodvideo: "Press MENU button for USB..."
+  </dest>
+  <voice>
+    *: "Press button for USB..."
+    recorder,fmrecorder,recorderv2: "Press F1 button for USB..."
+    h300: "Press recording button for USB..."
+    ondiofm,ondiosp: "Press menu button for USB..."
+    ipod4g,ipodcolor,ipodmini,ipodmini2g,ipodnano,ipodvideo: "Press menu button for USB..."
+  </voice>
+</phrase>
+<phrase>
+  id: LANG_USB_BUTTON_POWERONLY
+  desc: use button for USB power only
+  user:
+  <source>
+    *: "power only"
+  </source>
+  <dest>
+    *: "power only"
+  </dest>
+  <voice>
+    *: "power only"
+  </voice>
+</phrase>
+<phrase>
+  id: LANG_USB_BUTTON_CONNECTION
+  desc: use button for USB connection
+  user:
+  <source>
+    *: "connection"
+  </source>
+  <dest>
+    *: "connection"
+  </dest>
+  <voice>
+    *: "connection"
+  </voice>
+</phrase>
+<phrase>
   id: LANG_SHUFFLE
   desc: in settings_menu
   user:
Index: apps/settings.c
===================================================================
--- apps/settings.c	(revision 12207)
+++ apps/settings.c	(working copy)
@@ -658,6 +658,7 @@
 #endif
 
 #ifdef HAVE_USB_POWER
+usb_set_powerbutton_is_connect(global_settings.usb_powerbutton_is_connect);
 #ifdef CONFIG_CHARGING
     usb_charging_enable(global_settings.usb_charging);
 #endif
Index: apps/settings.h
===================================================================
--- apps/settings.h	(revision 12207)
+++ apps/settings.h	(working copy)
@@ -621,6 +621,10 @@
 #endif
 #endif
 
+#ifdef HAVE_USB_POWER
+    bool usb_powerbutton_is_connect;
+#endif
+
 #ifdef HAVE_WM8758
     bool eq_hw_enabled;            /* Enable hardware equalizer */
     
Index: apps/settings_menu.c
===================================================================
--- apps/settings_menu.c	(revision 12207)
+++ apps/settings_menu.c	(working copy)
@@ -84,11 +84,43 @@
 #include "backdrop.h"
 #endif
 
+#ifdef HAVE_USB_POWER
+#include "usb.h"
+#endif /* HAVE_USB_POWER */
+
+#ifdef HAVE_USB_POWER
+/**
+ * Menu to make the USB power button work as either
+ *   "only power" or "connect button"
+ */
+static bool usb_powerbutton_is_connect(void)
+{
+    static const struct opt_items names[] = {
+        { STR(LANG_USB_BUTTON_POWERONLY) },
+        { STR(LANG_USB_BUTTON_CONNECTION) }
+    };
+
+    int val = global_settings.usb_powerbutton_is_connect == false ? 0 : 1;
+    bool rc = set_option(str(LANG_USB_BUTTON), &val, INT, names, 2, NULL);
+    global_settings.usb_powerbutton_is_connect = (val == 0) ? false : true;
+    usb_set_powerbutton_is_connect(global_settings.usb_powerbutton_is_connect);
+    return rc;
+}
+#endif
+
 #ifdef CONFIG_CHARGING
 static bool car_adapter_mode(void)
 {
-    return set_bool( str(LANG_CAR_ADAPTER_MODE),
-                     &global_settings.car_adapter_mode );
+    bool rc = set_bool( str(LANG_CAR_ADAPTER_MODE),
+                        &global_settings.car_adapter_mode );
+#ifdef HAVE_USB_POWER
+    /* set the powerbutton to the configured mode if 
+     * car adapter mode is switched off */
+    if ( !rc )
+        (void)usb_powerbutton_is_connect();
+#endif
+
+    return rc;
 }
 #endif
 
@@ -2106,6 +2138,7 @@
         { ID2P(LANG_BATTERY_TYPE),     battery_type },
 #endif
 #ifdef HAVE_USB_POWER
+	{ ID2P(LANG_USB_BUTTON),       usb_powerbutton_is_connect },
 #ifdef CONFIG_CHARGING
         { ID2P(LANG_USB_CHARGING),    usb_charging },
 #endif
Index: apps/settings_list.c
===================================================================
--- apps/settings_list.c	(revision 12207)
+++ apps/settings_list.c	(working copy)
@@ -149,6 +149,9 @@
          INT(11), "backlight timeout plugged",backlight_times_conf , UNUSED},
 #endif
 #endif /* CONFIG_BACKLIGHT */
+#ifdef HAVE_USB_POWER
+    OFFON_SETTING(0,usb_powerbutton_is_connect,LANG_USB_CHARGING,0,"press button for USB...",NULL),
+#endif
 #ifdef HAVE_LCD_BITMAP
     OFFON_SETTING(0,invert, LANG_INVERT, false,"invert", NULL),
     OFFON_SETTING(0,flip_display, LANG_FLIP_DISPLAY, false,"flip display", NULL),
Index: apps/debug_menu.c
===================================================================
--- apps/debug_menu.c	(revision 12207)
+++ apps/debug_menu.c	(working copy)
@@ -1463,6 +1463,12 @@
 #endif
 #endif /* CONFIG_CHARGING != CHARGING_CONTROL */
 #endif /* CONFIG_CHARGING */
+#ifdef HAVE_USB_POWER
+                snprintf(buf, 30, "USB: press button for %s",
+                         global_settings.usb_powerbutton_is_connect ?
+                           "connection" : "power only");
+                lcd_puts(0, 8, buf);
+#endif /* HAVE_USB_POWER */
                 break;
 
             case 2: /* voltage deltas: */
Index: apps/misc.c
===================================================================
--- apps/misc.c	(revision 12207)
+++ apps/misc.c	(working copy)
@@ -61,6 +61,10 @@
 
 #include "misc.h"
 
+#ifdef HAVE_USB_POWER
+#include "usb.h"
+#endif /* HAVE_USB_POWER */
+
 /* Format a large-range value for output, using the appropriate unit so that
  * the displayed value is in the range 1 <= display < 1000 (1024 for "binary"
  * units) if possible, and 3 significant digits are shown. If a buffer is
@@ -701,6 +705,11 @@
 
 void car_adapter_mode_init(void)
 {
+#ifdef HAVE_USB_POWER
+    /* in car mode you always have to press the
+     * "USB power button" to get an USB connection... */
+    usb_set_powerbutton_is_connect(true);
+#endif
     tick_add_task(car_adapter_tick);
 }
 #endif
Index: firmware/export/usb.h
===================================================================
--- firmware/export/usb.h	(revision 12207)
+++ firmware/export/usb.h	(working copy)
@@ -31,6 +31,7 @@
 bool usb_detect(void); /* return the raw hardware value */
 #ifdef HAVE_USB_POWER
 bool usb_powered(void);
+void usb_set_powerbutton_is_connect(bool on);
 #ifdef CONFIG_CHARGING
 bool usb_charging_enable(bool on);
 bool usb_charging_enabled(void);
Index: firmware/usb.c
===================================================================
--- firmware/usb.c	(revision 12207)
+++ firmware/usb.c	(working copy)
@@ -91,6 +91,11 @@
 #define USBPOWER_BUTTON BUTTON_SELECT
 #define USBPOWER_BTN_IGNORE BUTTON_POWER
 #endif
+
+/* USB_POWER_BUTTON works as 
+   true  = "only power" or
+   false = "usb connect" (normal behaviour) */
+static bool usb_powerbutton_for_connect = false;
 #endif /* HAVE_USB_POWER */
 
 /* The ADC tick reads one channel per tick, and we want to check 3 successive
@@ -228,8 +233,12 @@
                 }
                 else
 #endif
+                {
 #ifdef HAVE_USB_POWER
-                if((button_status() & ~USBPOWER_BTN_IGNORE) == USBPOWER_BUTTON)
+                bool is_usbpwrbtn;
+                is_usbpwrbtn = (button_status() & ~USBPOWER_BTN_IGNORE) == USBPOWER_BUTTON;
+                if ( (is_usbpwrbtn && !usb_powerbutton_for_connect) ||
+                     (!is_usbpwrbtn && usb_powerbutton_for_connect) )
                 {
                     usb_state = USB_POWERED;
                 }
@@ -244,6 +253,7 @@
                     DEBUGF("USB inserted. Waiting for ack from %d threads...\n",
                            num_acks_to_expect);
                 }
+                }
                 break;
 
             case SYS_USB_CONNECTED_ACK:
@@ -492,6 +502,10 @@
     return usb_state == USB_POWERED;
 }
 
+void usb_set_powerbutton_is_connect(bool on)
+{
+    usb_powerbutton_for_connect = on;
+}
 #ifdef CONFIG_CHARGING
 bool usb_charging_enable(bool on)
 {
