diff --git a/src/jtag/drivers/usb_blaster.c b/src/jtag/drivers/usb_blaster.c
index 8330493..0164afe 100644
--- a/src/jtag/drivers/usb_blaster.c
+++ b/src/jtag/drivers/usb_blaster.c
@@ -2,6 +2,9 @@
  *   Driver for USB-JTAG, Altera USB-Blaster and compatibles               *
  *   Original code from Kolja Waschk's USB-JTAG project                    *
  *     (http://www.ixo.de/info/usb_jtag/).                                 *
+ *                                                                         *
+ *   More updates by Ali Lown (2010)                                       *
+ *                                                                         *
  *   Some updates by Anthony Liu (2006).                                   *
  *   Minor updates and cleanup by Catalin Patulea (2009).                  *
  *                                                                         *
@@ -106,6 +109,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 //Up to 64
+static uint8_t out_buffer[BUF_LEN];
+static uint8_t out_count = 0;
 
 #if BUILD_USB_BLASTER_FTD2XX == 1
 static FT_HANDLE ftdih;
@@ -128,7 +134,7 @@ static int usb_blaster_buf_write(
 	{
 		*bytes_written = dw_bytes_written;
 		LOG_ERROR("FT_Write returned: %lu", status);
-		return ERROR_JTAG_DEVICE_ERROR;
+		return ERROR_JTAG_DEVILCE_ERROR;
 	}
 	*bytes_written = dw_bytes_written;
 	return ERROR_OK;
@@ -241,10 +247,17 @@ 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,uint32_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;
+	LOG_DEBUG("---- WROTE %d",bytes_written);
+}
+
+static void usb_blaster_write_data(void)
+{
+	usb_blaster_write_databuffer(&out_value,1);
 }
 
 static int usb_blaster_read_data(void)
@@ -253,17 +266,37 @@ static int usb_blaster_read_data(void)
 	uint8_t buf[1];
 	uint32_t bytes_read;
 
+	if(out_count > 0)
+	{
+		LOG_DEBUG("---- READ FORCED WRITE");
+		usb_blaster_write_databuffer(out_buffer,out_count);
+	}
+
 	out_value |= READ;
 	usb_blaster_write_data();
 	out_value &= ~READ;
 
 	status = usb_blaster_buf_read(buf, 1, &bytes_read);
+	LOG_DEBUG("---- READ 0x%x, status 0d",buf[0],status);
 	if (status < 0)
 		return 0;
 
+
 	return !!(buf[0] & READ_TDO);
 }
 
+static void usb_blaster_addtowritebuffer(uint8_t value, bool forcewrite)
+{
+	out_buffer[out_count] = value;
+	out_count += 1;
+	LOG_DEBUG("---- STORE %d: 0x%x",out_count,out_value);
+	if(out_count == BUF_LEN || forcewrite)
+	{
+		usb_blaster_write_databuffer(out_buffer,out_count);
+	}
+
+}
+
 static void usb_blaster_write(int tck, int tms, int tdi)
 {
 #ifdef _DEBUG_JTAG_IO_
@@ -277,7 +310,18 @@ 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);
+
+//usb_blaster_write_data();
+}
+
+static void usb_blaster_blink(int state)
+{
+	out_value = 0x00;
+	if(state)
+		out_value |= LED;
+	LOG_DEBUG("---- SET LED %d",state);
+	usb_blaster_addtowritebuffer(out_value,true);
 }
 
 static int usb_blaster_speed(int speed)
@@ -311,6 +355,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 +514,12 @@ static int usb_blaster_init(void)
 
 static int usb_blaster_quit(void)
 {
+	if(out_count > 0)
+	{
+		LOG_DEBUG("---- QUIT WRITE NEEDED");
+		usb_blaster_write_databuffer(out_buffer,out_count);
+	}
+
 #if BUILD_USB_BLASTER_FTD2XX == 1
 	FT_STATUS status;
 
