diff --git a/LUFA/ManPages/ChangeLog.txt b/LUFA/ManPages/ChangeLog.txt
index 52c78f0015a6280e2367e06f0ec0038467fa54bc..c206ad04d414a0dc111804396eaf25c7bcb5f4cf 100644
--- a/LUFA/ManPages/ChangeLog.txt
+++ b/LUFA/ManPages/ChangeLog.txt
@@ -16,9 +16,12 @@
   *  <b>Changed:</b>
   *  - Slowed down bit-banged PDI programming in the AVRISP project slightly to prevent transmission errors
   *  - Renamed the AVRISP project folder to AVRISP-MKII to reduce confusion
+  *  - Renamed the RESET_LINE_* makefile tokens in the AVRISP MKII Project to AUX_LINE_*, as they are not always used for target
+  *    reset
   *
   *  <b>Fixed:</b>
   *  - Fixed AVRISP project not able to enter programming mode when ISP protocol is used
+  *  - Fixed AVRISP PDI race condition where the guard time between direction changes could be interpreted as a start bit
   *
   *  \section Sec_ChangeLog091223 Version 091223
   *
diff --git a/Projects/AVRISP-MKII/Lib/XPROG/XMEGANVM.h b/Projects/AVRISP-MKII/Lib/XPROG/XMEGANVM.h
index 608f5ab794c1e7f0b89814f958b9f7fe819908f7..d2e2a25169c656bb1acfb7e482dbe93e612037cb 100644
--- a/Projects/AVRISP-MKII/Lib/XPROG/XMEGANVM.h
+++ b/Projects/AVRISP-MKII/Lib/XPROG/XMEGANVM.h
@@ -33,7 +33,7 @@
  *  Header file for XMEGANVM.c.
  */
 
-#ifndef _XMEGA_NVM__
+#ifndef _XMEGA_NVM_
 #define _XMEGA_NVM_
 
 	/* Includes: */
diff --git a/Projects/AVRISP-MKII/Lib/XPROG/XPROGProtocol.h b/Projects/AVRISP-MKII/Lib/XPROG/XPROGProtocol.h
index 4bb600910fea7e87a29727666c707b09b0aa3da6..7dc6af53853419ca63e2b7bd7011d4d7a6655610 100644
--- a/Projects/AVRISP-MKII/Lib/XPROG/XPROGProtocol.h
+++ b/Projects/AVRISP-MKII/Lib/XPROG/XPROGProtocol.h
@@ -113,6 +113,7 @@
 		extern uint16_t XPROG_Param_EEPageSize;
 		extern uint8_t  XPROG_Param_NVMCSRRegAddr;
 		extern uint8_t  XPROG_Param_NVMCMDRegAddr;
+		extern uint8_t  XPROG_SelectedProtocol;
 		
 	/* Function Prototypes: */
 		void XPROGProtocol_SetMode(void);
diff --git a/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c b/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c
index 856b4890391e3884bdb89db00275382993659223..c1f1a631619de5d6d48eaf5ee87f47e82bd7ba0c 100644
--- a/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c
+++ b/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c
@@ -279,33 +279,16 @@ void XPROGTarget_DisableTargetTPI(void)
  */
 void XPROGTarget_SendByte(const uint8_t Byte)
 {
-#if defined(XPROG_VIA_HARDWARE_USART)
 	/* Switch to Tx mode if currently in Rx mode */
 	if (!(IsSending))
-	{
-		PORTD  |=  (1 << 3);
-		DDRD   |=  (1 << 3);
-
-		UCSR1B |=  (1 << TXEN1);
-		UCSR1B &= ~(1 << RXEN1);
-		
-		IsSending = true;
-	}
-	
+	  XPROGTarget_SetTxMode();
+	  
+#if defined(XPROG_VIA_HARDWARE_USART)
 	/* Wait until there is space in the hardware Tx buffer before writing */
 	while (!(UCSR1A & (1 << UDRE1)));
 	UCSR1A |= (1 << TXC1);
 	UDR1    = Byte;
 #else
-	/* Switch to Tx mode if currently in Rx mode */
-	if (!(IsSending))
-	{
-		BITBANG_PDIDATA_PORT |= BITBANG_PDIDATA_MASK;
-		BITBANG_PDIDATA_DDR  |= BITBANG_PDIDATA_MASK;
-
-		IsSending = true;
-	}
-
 	/* Calculate the new USART frame data here while while we wait for a previous byte (if any) to finish sending */
 	uint16_t NewUSARTData = ((1 << 11) | (1 << 10) | (0 << 9) | ((uint16_t)Byte << 1) | (0 << 0));
 
@@ -332,37 +315,15 @@ void XPROGTarget_SendByte(const uint8_t Byte)
  */
 uint8_t XPROGTarget_ReceiveByte(void)
 {
-#if defined(XPROG_VIA_HARDWARE_USART)
 	/* Switch to Rx mode if currently in Tx mode */
 	if (IsSending)
-	{
-		while (!(UCSR1A & (1 << TXC1)));
-		UCSR1A |=  (1 << TXC1);
-
-		UCSR1B &= ~(1 << TXEN1);
-		UCSR1B |=  (1 << RXEN1);
-
-		DDRD   &= ~(1 << 3);
-		PORTD  &= ~(1 << 3);
-		
-		IsSending = false;
-	}
+	  XPROGTarget_SetRxMode();
 
+#if defined(XPROG_VIA_HARDWARE_USART)
 	/* Wait until a byte has been received before reading */
 	while (!(UCSR1A & (1 << RXC1)) && TimeoutMSRemaining);
 	return UDR1;
 #else
-	/* Switch to Rx mode if currently in Tx mode */
-	if (IsSending)
-	{
-		while (SoftUSART_BitCount);
-
-		BITBANG_PDIDATA_DDR  &= ~BITBANG_PDIDATA_MASK;
-		BITBANG_PDIDATA_PORT &= ~BITBANG_PDIDATA_MASK;
-
-		IsSending = false;
-	}
-
 	/* Wait until a byte has been received before reading */
 	SoftUSART_BitCount = BITS_IN_USART_FRAME;
 	while (SoftUSART_BitCount && TimeoutMSRemaining);
@@ -375,19 +336,11 @@ uint8_t XPROGTarget_ReceiveByte(void)
 /** Sends a BREAK via the USART to the attached target, consisting of a full frame of idle bits. */
 void XPROGTarget_SendBreak(void)
 {
-#if defined(XPROG_VIA_HARDWARE_USART)
 	/* Switch to Tx mode if currently in Rx mode */
 	if (!(IsSending))
-	{
-		PORTD  |=  (1 << 3);
-		DDRD   |=  (1 << 3);
-
-		UCSR1B &= ~(1 << RXEN1);
-		UCSR1B |=  (1 << TXEN1);
-		
-		IsSending = true;
-	}
+	  XPROGTarget_SetTxMode();
 
+#if defined(XPROG_VIA_HARDWARE_USART)
 	/* Need to do nothing for a full frame to send a BREAK */
 	for (uint8_t i = 0; i < BITS_IN_USART_FRAME; i++)
 	{
@@ -396,21 +349,81 @@ void XPROGTarget_SendBreak(void)
 		while (!(PIND & (1 << 5)));
 	}
 #else
-	/* Switch to Tx mode if currently in Rx mode */
-	if (!(IsSending))
+	while (SoftUSART_BitCount);
+
+	/* Need to do nothing for a full frame to send a BREAK */
+	SoftUSART_Data     = 0x0FFF;
+	SoftUSART_BitCount = BITS_IN_USART_FRAME;
+#endif
+}
+
+static void XPROGTarget_SetTxMode(void)
+{
+#if defined(XPROG_VIA_HARDWARE_USART)
+	/* Wait for a full cycle of the clock */
+	while (PIND & (1 << 5));
+	while (!(PIND & (1 << 5)));
+
+	PORTD  |=  (1 << 3);
+	DDRD   |=  (1 << 3);
+
+	UCSR1B &= ~(1 << RXEN1);
+	UCSR1B |=  (1 << TXEN1);
+		
+	IsSending = true;
+#else
+	while (SoftUSART_BitCount);
+
+	/* Wait for a full cycle of the clock */
+	SoftUSART_Data     = 0x0001;
+	SoftUSART_BitCount = 1;
+	while (SoftUSART_BitCount);
+
+	if (XPROG_SelectedProtocol == XPRG_PROTOCOL_PDI)
 	{
 		BITBANG_PDIDATA_PORT |= BITBANG_PDIDATA_MASK;
 		BITBANG_PDIDATA_DDR  |= BITBANG_PDIDATA_MASK;
-
-		IsSending = true;
 	}
-	
+	else
+	{
+		BITBANG_TPIDATA_PORT |= BITBANG_TPIDATA_MASK;
+		BITBANG_TPIDATA_DDR  |= BITBANG_TPIDATA_MASK;	
+	}
+#endif
+
+	IsSending = true;
+}
+
+static void XPROGTarget_SetRxMode(void)
+{
+#if defined(XPROG_VIA_HARDWARE_USART)
+	while (!(UCSR1A & (1 << TXC1)));
+	UCSR1A |=  (1 << TXC1);
+
+	UCSR1B &= ~(1 << TXEN1);
+	UCSR1B |=  (1 << RXEN1);
+
+	DDRD   &= ~(1 << 3);
+	PORTD  &= ~(1 << 3);
+#else
 	while (SoftUSART_BitCount);
 
-	/* Need to do nothing for a full frame to send a BREAK */
-	SoftUSART_Data     = 0x0FFF;
-	SoftUSART_BitCount = BITS_IN_USART_FRAME;
+	if (XPROG_SelectedProtocol == XPRG_PROTOCOL_PDI)
+	{
+		BITBANG_PDIDATA_DDR  &= ~BITBANG_PDIDATA_MASK;
+		BITBANG_PDIDATA_PORT &= ~BITBANG_PDIDATA_MASK;
+	}
+	else
+	{
+		BITBANG_TPIDATA_DDR  &= ~BITBANG_TPIDATA_MASK;
+		BITBANG_TPIDATA_PORT &= ~BITBANG_TPIDATA_MASK;	
+	}
+	
+	/* Wait until DATA line has been pulled up to idle by the target */
+	while (!(BITBANG_PDIDATA_PIN & BITBANG_PDIDATA_MASK));
 #endif
+
+	IsSending = false;
 }
 
 #endif
diff --git a/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.h b/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.h
index 3bbf454befc1f89ef815edc43ffc9df14cd39c6e..dab41f316cdc7275d705b6434230744328e72392 100644
--- a/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.h
+++ b/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.h
@@ -44,6 +44,7 @@
 		#include <LUFA/Common/Common.h>
 		
 		#include "../V2Protocol.h"
+		#include "XPROGProtocol.h"
 	
 	/* Preprocessor Checks: */
 		#if ((BOARD == BOARD_XPLAIN) || (BOARD == BOARD_XPLAIN_REV1))
@@ -141,5 +142,10 @@
 		uint8_t XPROGTarget_ReceiveByte(void);
 		void    XPROGTarget_SendBreak(void);
 		bool    XPROGTarget_WaitWhileNVMBusBusy(void);
+		
+		#if defined(INCLUDE_FROM_XPROGTARGET_C)
+			static void XPROGTarget_SetTxMode(void);
+			static void XPROGTarget_SetRxMode(void);
+		#endif
 
 #endif