diff --git a/Projects/AVRISP-MKII/Lib/XPROG/XPROGProtocol.c b/Projects/AVRISP-MKII/Lib/XPROG/XPROGProtocol.c
index 5275cca8d7022d54ddb7fedee65cddf06978e95e..1633fb24de367304291b5667425994ad371eef34 100644
--- a/Projects/AVRISP-MKII/Lib/XPROG/XPROGProtocol.c
+++ b/Projects/AVRISP-MKII/Lib/XPROG/XPROGProtocol.c
@@ -124,6 +124,10 @@ static void XPROGProtocol_EnterXPROGMode(void)
 		XPROGTarget_SendByte(PDI_CMD_STCS | PDI_RESET_REG);	
 		XPROGTarget_SendByte(PDI_RESET_KEY);
 
+		/* Lower direction change guard time to 8 USART bits */
+		XPROGTarget_SendByte(PDI_CMD_STCS | PDI_CTRL_REG);	
+		XPROGTarget_SendByte(0x04);
+
 		/* Enable access to the XPROG NVM bus by sending the documented NVM access key to the device */
 		XPROGTarget_SendByte(PDI_CMD_KEY);	
 		for (uint8_t i = sizeof(PDI_NVMENABLE_KEY); i > 0; i--)
@@ -134,10 +138,13 @@ static void XPROGProtocol_EnterXPROGMode(void)
 	}
 	else
 	{
-	#if 0
 		/* Enable TPI programming mode with the attached target */
 		XPROGTarget_EnableTargetTPI();
 		
+		/* Lower direction change guard time to 8 USART bits */
+		XPROGTarget_SendByte(TPI_CMD_SSTCS | TPI_CTRL_REG);
+		XPROGTarget_SendByte(0x04);		
+		
 		/* Enable access to the XPROG NVM bus by sending the documented NVM access key to the device */
 		XPROGTarget_SendByte(TPI_CMD_SKEY);	
 		for (uint8_t i = sizeof(TPI_NVMENABLE_KEY); i > 0; i--)
@@ -145,8 +152,6 @@ static void XPROGProtocol_EnterXPROGMode(void)
 
 		/* Wait until the NVM bus becomes active */
 		NVMBusEnabled = TINYNVM_WaitWhileNVMBusBusy();
-	#endif
-		NVMBusEnabled = true;
 	}
 	
 	Endpoint_Write_Byte(CMD_XPROG);
diff --git a/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c b/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c
index c1f1a631619de5d6d48eaf5ee87f47e82bd7ba0c..a8c798efba580e3826d392ed95badb26c98331b7 100644
--- a/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c
+++ b/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c
@@ -420,7 +420,7 @@ static void XPROGTarget_SetRxMode(void)
 	}
 	
 	/* Wait until DATA line has been pulled up to idle by the target */
-	while (!(BITBANG_PDIDATA_PIN & BITBANG_PDIDATA_MASK));
+	while (!(BITBANG_PDIDATA_PIN & BITBANG_PDIDATA_MASK) && TimeoutMSRemaining);
 #endif
 
 	IsSending = false;
diff --git a/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.h b/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.h
index dab41f316cdc7275d705b6434230744328e72392..33a5827db6556a6c6b6cffce59004f6c87cb7ec1 100644
--- a/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.h
+++ b/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.h
@@ -81,7 +81,7 @@
 		#endif
 		
 		/** Number of cycles between each clock when software USART mode is used */
-		#define BITS_BETWEEN_USART_CLOCKS  100
+		#define BITS_BETWEEN_USART_CLOCKS  200
 		
 		/** Total number of bits in a single USART frame */
 		#define BITS_IN_USART_FRAME        12