diff --git a/ChangeLog b/ChangeLog
index d9a3e243..f357537c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2005-09-16  Joerg Wunsch <j@uriah.heep.sax.de>
+
+	* usb_libusb.c (usbdev_drain): actually implement draining to aid
+	synchronizing against a JTAG ICE in weird state.
+
 2005-09-16  Joerg Wunsch <j@uriah.heep.sax.de>
 
 	* butterfly.c: improve the butterfly initialization so it is more likely
diff --git a/usb_libusb.c b/usb_libusb.c
index e801e727..8ffb1ef4 100644
--- a/usb_libusb.c
+++ b/usb_libusb.c
@@ -259,6 +259,16 @@ static int usbdev_recv(int fd, unsigned char *buf, size_t nbytes)
 
 static int usbdev_drain(int fd, int display)
 {
+  usb_dev_handle *udev = (usb_dev_handle *)fd;
+  int rv;
+
+  do {
+    rv = usb_bulk_read(udev, JTAGICE_BULK_EP, usbbuf, JTAGICE_MAX_XFER, 100);
+    if (rv > 0 && verbose >= 4)
+      fprintf(stderr, "%s: usbdev_drain(): flushed %d characters\n",
+	      progname, rv);
+  } while (rv > 0);
+
   return 0;
 }