diff --git a/avrdude/jtag3.c b/avrdude/jtag3.c
index 4d364c8..618a610 100644
--- a/avrdude/jtag3.c
+++ b/avrdude/jtag3.c
@@ -1034,7 +1034,7 @@ static int jtag3_open(PROGRAMMER * pgm, char * port)
   if (strncmp(port, "usb", 3) == 0) {
 #if defined(HAVE_LIBUSB)
     serdev = &usb_serdev_frame;
-    baud = USB_DEVICE_JTAGICE3;
+/*    baud = USB_DEVICE_JTAGICE3; */ /* work around for multiple firmware versions. See usbdevs.h */
     pgm->fd.usb.max_xfer = USBDEV_MAX_XFER_3;
     pgm->fd.usb.rep = USBDEV_BULK_EP_READ_3;
     pgm->fd.usb.wep = USBDEV_BULK_EP_WRITE_3;
@@ -1046,7 +1046,8 @@ static int jtag3_open(PROGRAMMER * pgm, char * port)
   }
 
   strcpy(pgm->port, port);
-  if (serial_open(port, baud, &pgm->fd)==-1) {
+  if (   serial_open(port, USB_DEVICE_JTAGICE3_2_x, &pgm->fd)==-1 
+      && serial_open(port, USB_DEVICE_JTAGICE3_3_8, &pgm->fd)==-1 ) {
     return -1;
   }
 
@@ -1076,7 +1077,7 @@ static int jtag3_open_dw(PROGRAMMER * pgm, char * port)
   if (strncmp(port, "usb", 3) == 0) {
 #if defined(HAVE_LIBUSB)
     serdev = &usb_serdev_frame;
-    baud = USB_DEVICE_JTAGICE3;
+/*    baud = USB_DEVICE_JTAGICE3; */ /* work around for multiple firmware versions. See usbdevs.h */
     pgm->fd.usb.max_xfer = USBDEV_MAX_XFER_3;
     pgm->fd.usb.rep = USBDEV_BULK_EP_READ_3;
     pgm->fd.usb.wep = USBDEV_BULK_EP_WRITE_3;
@@ -1088,7 +1089,8 @@ static int jtag3_open_dw(PROGRAMMER * pgm, char * port)
   }
 
   strcpy(pgm->port, port);
-  if (serial_open(port, baud, &pgm->fd)==-1) {
+  if (   serial_open(port, USB_DEVICE_JTAGICE3_2_x, &pgm->fd)==-1 
+      && serial_open(port, USB_DEVICE_JTAGICE3_3_8, &pgm->fd)==-1 ) {
     return -1;
   }
 
@@ -1118,7 +1120,7 @@ static int jtag3_open_pdi(PROGRAMMER * pgm, char * port)
   if (strncmp(port, "usb", 3) == 0) {
 #if defined(HAVE_LIBUSB)
     serdev = &usb_serdev_frame;
-    baud = USB_DEVICE_JTAGICE3;
+/*    baud = USB_DEVICE_JTAGICE3; */ /* work around for multiple firmware versions. See usbdevs.h */
     pgm->fd.usb.max_xfer = USBDEV_MAX_XFER_3;
     pgm->fd.usb.rep = USBDEV_BULK_EP_READ_3;
     pgm->fd.usb.wep = USBDEV_BULK_EP_WRITE_3;
@@ -1130,7 +1132,8 @@ static int jtag3_open_pdi(PROGRAMMER * pgm, char * port)
   }
 
   strcpy(pgm->port, port);
-  if (serial_open(port, baud, &pgm->fd)==-1) {
+  if (   serial_open(port, USB_DEVICE_JTAGICE3_2_x, &pgm->fd)==-1 
+      && serial_open(port, USB_DEVICE_JTAGICE3_3_8, &pgm->fd)==-1 ) {
     return -1;
   }
 
diff --git a/avrdude/stk500v2.c b/avrdude/stk500v2.c
index bdae5ef..413d6bd 100644
--- a/avrdude/stk500v2.c
+++ b/avrdude/stk500v2.c
@@ -3667,7 +3667,7 @@ static int stk500v2_jtag3_open(PROGRAMMER * pgm, char * port)
   if (strncmp(port, "usb", 3) == 0) {
 #if defined(HAVE_LIBUSB)
     serdev = &usb_serdev_frame;
-    baud = USB_DEVICE_JTAGICE3;
+/*    baud = USB_DEVICE_JTAGICE3; */ /* work around for multiple firmware versions see usbdevs.h*/
     pgm->fd.usb.max_xfer = USBDEV_MAX_XFER_3;
     pgm->fd.usb.rep = USBDEV_BULK_EP_READ_3;
     pgm->fd.usb.wep = USBDEV_BULK_EP_WRITE_3;
@@ -3679,10 +3679,10 @@ static int stk500v2_jtag3_open(PROGRAMMER * pgm, char * port)
   }
 
   strcpy(pgm->port, port);
-  if (serial_open(port, baud, &pgm->fd)==-1) {
+  if (   serial_open(port, USB_DEVICE_JTAGICE3_2_x, &pgm->fd)==-1 
+      && serial_open(port, USB_DEVICE_JTAGICE3_3_8, &pgm->fd)==-1 ) {
     return -1;
   }
-
   /*
    * drain any extraneous input
    */
diff --git a/avrdude/usb_libusb.c b/avrdude/usb_libusb.c
index 8f3b049..de6c065 100644
--- a/avrdude/usb_libusb.c
+++ b/avrdude/usb_libusb.c
@@ -99,7 +99,7 @@ static int usbdev_open(char * port, long baud, union filedescriptor *fd)
 	  fprintf(stderr,
 		  "%s: usbdev_open(): invalid serial number \"%s\"\n",
 		  progname, serno);
-	  exit(1);
+	  return -1;
 	}
     }
 
@@ -137,7 +137,7 @@ static int usbdev_open(char * port, long baud, union filedescriptor *fd)
 		       * continue anyway.
 		       */
 		      if (serno != NULL)
-			exit(1); /* no chance */
+			return -1; /* no chance */
 		      else
 			strcpy(string, "[unknown]");
 		    }
@@ -183,6 +183,13 @@ static int usbdev_open(char * port, long baud, union filedescriptor *fd)
 		      goto trynext;
 		    }
 
+#ifdef LIBUSB_HAS_DETACH_KERNEL_DRIVER_NP
+		  if (usb_detach_kernel_driver_np(udev, 0) < 0 )
+		    {
+		       fprintf(stderr, "Warning: could not detach kernel driver: %s\n", usb_strerror());
+		    }                                                        
+#endif
+
 		  if (usb_set_configuration(udev, dev->config[0].bConfigurationValue))
 		    {
 		      fprintf(stderr,
@@ -260,7 +267,7 @@ static int usbdev_open(char * port, long baud, union filedescriptor *fd)
 
   fprintf(stderr, "%s: usbdev_open(): did not find any%s USB device \"%s\"\n",
 	  progname, serno? " (matching)": "", port);
-  exit(1);
+  return -1; 
 }
 
 static void usbdev_close(union filedescriptor *fd)
diff --git a/avrdude/usbdevs.h b/avrdude/usbdevs.h
index c546f50..6fb2936 100644
--- a/avrdude/usbdevs.h
+++ b/avrdude/usbdevs.h
@@ -30,7 +30,8 @@
 #define USB_DEVICE_AVRISPMKII  0x2104
 #define USB_DEVICE_STK600      0x2106
 #define USB_DEVICE_AVRDRAGON   0x2107
-#define USB_DEVICE_JTAGICE3    0x2110
+#define USB_DEVICE_JTAGICE3_2_x  0x2110 /* Firmware 2.x JTAGICE3 shows different productId based on firmware */
+#define USB_DEVICE_JTAGICE3_3_8  0x2140 /* Firmware 3.8 */
 
 /* JTAGICEmkII, AVRISPmkII */
 #define USBDEV_BULK_EP_WRITE_MKII 0x02
