diff --git a/src/jtag/drivers/usb_blaster.c b/src/jtag/drivers/usb_blaster.c
index 8330493..f292f77 100644
--- a/src/jtag/drivers/usb_blaster.c
+++ b/src/jtag/drivers/usb_blaster.c
@@ -4,6 +4,10 @@
  *     (http://www.ixo.de/info/usb_jtag/).                                 *
  *   Some updates by Anthony Liu (2006).                                   *
  *   Minor updates and cleanup by Catalin Patulea (2009).                  *
+ *   Speed updates by Ali Lown (2011).
+ *
+ *   Copyright (C) 2011 Ali Lown
+ *   ali@lown.me.uk
  *                                                                         *
  *   Copyright (C) 2009 Catalin Patulea                                    *
  *   cat@vv.carleton.ca                                                    *
@@ -106,6 +110,9 @@ static uint16_t usb_blaster_pid = 0x6001; /* USB-Blaster */
 
 /* last output byte in simple bit banging mode */
 static uint8_t out_value;
+#define BUF_LEN 64
+static uint8_t out_buffer[BUF_LEN];
+static uint16_t out_count = 0;
 
 #if BUILD_USB_BLASTER_FTD2XX == 1
 static FT_HANDLE ftdih;
@@ -241,10 +248,22 @@ usb_blaster_buf_read(uint8_t *buf, unsigned size, uint32_t *bytes_read)
 
 #define READ_TDO	(1 << 0)
 
-static void usb_blaster_write_data(void)
+static void usb_blaster_write_databuffer(uint8_t* buf, uint16_t len)
 {
 	uint32_t bytes_written;
-	usb_blaster_buf_write(&out_value, 1, &bytes_written);
+	usb_blaster_buf_write(buf, len, &bytes_written);
+	out_count = 0;
+#ifdef _DEBUG_JTAG_IO_
+	LOG_DEBUG("---- WROTE %d",bytes_written);
+#endif
+}
+
+static void usb_blaster_addtowritebuffer(uint8_t value, bool forcewrite)
+{
+	out_buffer[out_count] = value;
+	out_count += 1;
+	if(out_count == BUF_LEN || forcewrite)
+			usb_blaster_write_databuffer(out_buffer, out_count);
 }
 
 static int usb_blaster_read_data(void)
@@ -253,8 +272,11 @@ static int usb_blaster_read_data(void)
 	uint8_t buf[1];
 	uint32_t bytes_read;
 
+	if(out_count > 0)
+		usb_blaster_write_databuffer(out_buffer, out_count);
+
 	out_value |= READ;
-	usb_blaster_write_data();
+	usb_blaster_addtowritebuffer(out_value, true);
 	out_value &= ~READ;
 
 	status = usb_blaster_buf_read(buf, 1, &bytes_read);
@@ -277,7 +299,15 @@ static void usb_blaster_write(int tck, int tms, int tdi)
 	if (tdi)
 		out_value |= TDI;
 
-	usb_blaster_write_data();
+	usb_blaster_addtowritebuffer(out_value, false);
+}
+
+static void usb_blaster_blink(int state)
+{
+	out_value = 0x00;
+	if(state)
+		out_value |= LED;
+	usb_blaster_addtowritebuffer(out_value,true);
 }
 
 static int usb_blaster_speed(int speed)
@@ -311,6 +341,7 @@ static struct bitbang_interface usb_blaster_bitbang = {
 	.read = usb_blaster_read_data,
 	.write = usb_blaster_write,
 	.reset = usb_blaster_reset,
+	.blink = usb_blaster_blink,
 };
 
 static int usb_blaster_init(void)
@@ -469,6 +500,9 @@ static int usb_blaster_init(void)
 
 static int usb_blaster_quit(void)
 {
+	if(out_count > 0)
+		usb_blaster_write_databuffer(out_buffer, out_count);
+
 #if BUILD_USB_BLASTER_FTD2XX == 1
 	FT_STATUS status;
 
@@ -534,12 +568,12 @@ COMMAND_HANDLER(usb_blaster_handle_pin_command)
 		if (state == 0)
 		{
 			out_value &= ~mask;
-			usb_blaster_write_data();
+			usb_blaster_addtowritebuffer(out_value, true);
 		}
 		else if (state == 1)
 		{
 			out_value |= mask;
-			usb_blaster_write_data();
+			usb_blaster_addtowritebuffer(out_value, true);
 		}
 		else
 		{
