diff --git a/src/jtag/jlink.c b/src/jtag/jlink.c
index 16dac2a01b7f4f908bafb394963c27b7e8d194b3..2cf39cd00301a0b76bfad611ee0447f45ba2840f 100644
--- a/src/jtag/jlink.c
+++ b/src/jtag/jlink.c
@@ -51,19 +51,17 @@
 
 #define JLINK_USB_TIMEOUT		100
 
-#define JLINK_IN_BUFFER_SIZE	2064
-#define JLINK_OUT_BUFFER_SIZE	2064
+#define JLINK_IN_BUFFER_SIZE					2064
+#define JLINK_OUT_BUFFER_SIZE					2064
+#define JLINK_EMU_RESULT_BUFFER_SIZE	64
+
 
 /* Global USB buffers */
 static u8 usb_in_buffer[JLINK_IN_BUFFER_SIZE];
 static u8 usb_out_buffer[JLINK_OUT_BUFFER_SIZE];
+static u8 usb_emu_result_buffer[JLINK_EMU_RESULT_BUFFER_SIZE];
 
 /* Constants for JLink command */
-
-/* The JLINK_TAP_SEQUENCE_COMMAND is obsolete
- * and we should use EMU_CMD_HW_JTAG instead */
-#define JLINK_TAP_SEQUENCE_COMMAND		0xcd
-
 #define EMU_CMD_VERSION     0x01
 #define EMU_CMD_SET_SPEED   0x05
 #define EMU_CMD_GET_STATE   0x07
@@ -115,6 +113,7 @@ void jlink_usb_close(jlink_jtag_t *jlink_jtag);
 int jlink_usb_message(jlink_jtag_t *jlink_jtag, int out_length, int in_length);
 int jlink_usb_write(jlink_jtag_t *jlink_jtag, int out_length);
 int jlink_usb_read(jlink_jtag_t *jlink_jtag);
+int jlink_usb_read_result(jlink_jtag_t *jlink_jtag);
 
 /* helper functions */
 int jlink_get_version_info(void);
@@ -665,11 +664,12 @@ int jlink_tap_execute()
 	
 		byte_length = tap_length / 8;
 	
-		usb_out_buffer[0] = JLINK_TAP_SEQUENCE_COMMAND;
-		usb_out_buffer[1] = (tap_length >> 0) & 0xff;
-		usb_out_buffer[2] = (tap_length >> 8) & 0xff;
+		usb_out_buffer[0] = EMU_CMD_HW_JTAG;
+		usb_out_buffer[1] = 0;
+		usb_out_buffer[2] = (tap_length >> 0) & 0xff;
+		usb_out_buffer[3] = (tap_length >> 8) & 0xff;
 	
-		tms_offset = 3;
+		tms_offset = 4;
 		for (i = 0; i < byte_length; i++)
 		{
 			usb_out_buffer[tms_offset + i] = tms_buffer[i];
@@ -681,7 +681,7 @@ int jlink_tap_execute()
 			usb_out_buffer[tdi_offset + i] = tdi_buffer[i];
 		}
 	
-		result = jlink_usb_message(jlink_jtag_handle, 3 + 2 * byte_length, byte_length);
+		result = jlink_usb_message(jlink_jtag_handle, 4 + 2 * byte_length, byte_length);
 	
 		if (result == byte_length)
 		{
@@ -783,6 +783,7 @@ void jlink_usb_close(jlink_jtag_t *jlink_jtag)
 int jlink_usb_message(jlink_jtag_t *jlink_jtag, int out_length, int in_length)
 {
 	int result;
+	int result2;
 	
 	result = jlink_usb_write(jlink_jtag, out_length);
 	if (result == out_length)
@@ -790,7 +791,26 @@ int jlink_usb_message(jlink_jtag_t *jlink_jtag, int out_length, int in_length)
 		result = jlink_usb_read(jlink_jtag);
 		if (result == in_length)
 		{
-			return result;
+			/* Must read the result from the EMU too */
+			result2 = jlink_usb_read_result(jlink_jtag);
+			if (1 == result2)
+			{
+				/* Check the result itself */
+				if (0 == usb_emu_result_buffer[0])
+				{
+					return result;
+				}
+				else
+				{
+					LOG_ERROR("jlink_usb_read_result len (requested=0, result=%d)", usb_emu_result_buffer[0]);
+					return -1;				
+				}
+			}
+			else
+			{
+				LOG_ERROR("jlink_usb_read_result len (requested=1, result=%d)", result2);
+				return -1;
+			}
 		}
 		else
 		{
@@ -841,6 +861,21 @@ int jlink_usb_read(jlink_jtag_t *jlink_jtag)
 	return result;
 }
 
+/* Read the result from the previous EMU cmd into result_buffer. */
+int jlink_usb_read_result(jlink_jtag_t *jlink_jtag)
+{
+	int result = usb_bulk_read(jlink_jtag->usb_handle, JLINK_READ_ENDPOINT, \
+		usb_emu_result_buffer, JLINK_EMU_RESULT_BUFFER_SIZE, JLINK_USB_TIMEOUT);
+
+	DEBUG_JTAG_IO("jlink_usb_read_result, result = %d", result);
+	
+#ifdef _DEBUG_USB_COMMS_
+	jlink_debug_buffer(usb_emu_result_buffer, result);
+#endif
+	return result;
+}
+
+
 #ifdef _DEBUG_USB_COMMS_
 #define BYTES_PER_LINE  16