diff --git a/Demos/Host/ClassDriver/MouseHostWithParser/MouseHostWithParser.c b/Demos/Host/ClassDriver/MouseHostWithParser/MouseHostWithParser.c
index b6411858abf79d44dcaf9575f5eda586c74a0f9b..6339a923982e989a38d6c59807dab835bcf612ea 100644
--- a/Demos/Host/ClassDriver/MouseHostWithParser/MouseHostWithParser.c
+++ b/Demos/Host/ClassDriver/MouseHostWithParser/MouseHostWithParser.c
@@ -147,7 +147,7 @@ int main(void)
 								 (ReportItem->Attributes.Usage.Usage  == USAGE_SCROLL_WHEEL)       &&
 								 (ReportItem->ItemType                == REPORT_ITEM_TYPE_In))
 						{
-							int16_t WheelDelta = (int16_t)(ReportItem->Value << (16 - ReportItem->Attributes.BitSize));
+							int16_t WheelDelta = HID_ALIGN_DATA(ReportItem->Value, int16_t);
 							
 							if (WheelDelta)
 							  LEDMask = (LEDS_LED1 | LEDS_LED2 | ((WheelDelta > 0) ? LEDS_LED3 : LEDS_LED4));
@@ -157,7 +157,7 @@ int main(void)
 								  (ReportItem->Attributes.Usage.Usage == USAGE_Y))                 &&
 								 (ReportItem->ItemType                == REPORT_ITEM_TYPE_In))
 						{
-							int16_t DeltaMovement = (int16_t)(ReportItem->Value << (16 - ReportItem->Attributes.BitSize));
+							int16_t DeltaMovement = HID_ALIGN_DATA(ReportItem->Value, int16_t);
 							
 							if (ReportItem->Attributes.Usage.Usage == USAGE_X)
 							{
diff --git a/LUFA/Drivers/USB/LowLevel/Pipe.c b/LUFA/Drivers/USB/LowLevel/Pipe.c
index 78c82e8c4722830d5c3233d28ae10c8744254b41..8784bea0cae7458a25ac19eb7933c5d5b8a8a2cd 100644
--- a/LUFA/Drivers/USB/LowLevel/Pipe.c
+++ b/LUFA/Drivers/USB/LowLevel/Pipe.c
@@ -80,14 +80,13 @@ bool Pipe_IsEndpointBound(const uint8_t EndpointAddress)
 		Pipe_SelectPipe(PNum);
 		
 		uint8_t PipeToken = Pipe_GetPipeToken();
+		bool    PipeTokenCorrect = true;
 
 		if (PipeToken != PIPE_TOKEN_SETUP)
-		  PipeToken = (PipeToken == ((EndpointAddress & PIPE_EPDIR_MASK) ? PIPE_TOKEN_IN : PIPE_TOKEN_OUT));
+		  PipeTokenCorrect = (PipeToken == ((EndpointAddress & PIPE_EPDIR_MASK) ? PIPE_TOKEN_IN : PIPE_TOKEN_OUT));
 		
-		if (Pipe_IsConfigured() && (Pipe_BoundEndpointNumber() == (EndpointAddress & PIPE_EPNUM_MASK)) && PipeToken)
-		{		
-			return true;
-		}
+		if (Pipe_IsConfigured() && PipeTokenCorrect && (Pipe_BoundEndpointNumber() == (EndpointAddress & PIPE_EPNUM_MASK)))
+		  return true;
 	}
 	
 	Pipe_SelectPipe(PrevPipeNumber);
diff --git a/LUFA/ManPages/ChangeLog.txt b/LUFA/ManPages/ChangeLog.txt
index b776175d66cce51a1620a6cd7d0ba5a150d679df..8ce9f2240ee10bdca86fc7c1e3ec4f642830dc85 100644
--- a/LUFA/ManPages/ChangeLog.txt
+++ b/LUFA/ManPages/ChangeLog.txt
@@ -27,8 +27,6 @@
   *  - Fixed ADC routines not correctly returning the last result when multiple channels were read
   *  - Fixed ADC routines failing to read the extended channels (Channels 8 to 13, Internal Temperature Sensor) on the
   *    U4 series USB AVR parts
-  *  - Fixed PDI programming mode in the AVRISP programmer project not exiting programming mode correctly (clear target
-  *    Reset key twice, possible silicon bug?)
   *
   *  \section Sec_ChangeLog100219 Version 100219
   *
diff --git a/Projects/AVRISP-MKII/Lib/XPROG/TINYNVM.c b/Projects/AVRISP-MKII/Lib/XPROG/TINYNVM.c
index a894793c7b55d688ee80a3b8b6f318226a5f7ba1..c0f04c6bdf0d01db1191792592507fd6898d0244 100644
--- a/Projects/AVRISP-MKII/Lib/XPROG/TINYNVM.c
+++ b/Projects/AVRISP-MKII/Lib/XPROG/TINYNVM.c
@@ -65,7 +65,7 @@ static void TINYNVM_SendReadNVMRegister(const uint8_t Address)
  */
 static void TINYNVM_SendWriteNVMRegister(const uint8_t Address)
 {
-	/* The TPI command for writing to the I/O space uses weird addressing, where the I/O address's upper
+	/* The TPI command for reading from the I/O space uses strange addressing, where the I/O address's upper
 	 * two bits of the 6-bit address are shifted left once */
 	XPROGTarget_SendByte(TPI_CMD_SOUT | ((Address & 0x30) << 1) | (Address & 0x0F));
 }
diff --git a/Projects/AVRISP-MKII/Lib/XPROG/XPROGProtocol.c b/Projects/AVRISP-MKII/Lib/XPROG/XPROGProtocol.c
index 08936a202dfaf399dae9341e52cefc6dff9eb067..07dce50119326725738b7e7e1e09120b00815930 100644
--- a/Projects/AVRISP-MKII/Lib/XPROG/XPROGProtocol.c
+++ b/Projects/AVRISP-MKII/Lib/XPROG/XPROGProtocol.c
@@ -175,10 +175,6 @@ static void XPROGProtocol_LeaveXPROGMode(void)
 		/* Clear the RESET key in the RESET PDI register to allow the XMEGA to run */
 		XPROGTarget_SendByte(PDI_CMD_STCS | PDI_RESET_REG);	
 		XPROGTarget_SendByte(0x00);
-		
-		/* Clear /RESET key twice (for some reason this needs to be done twice to take effect) */
-		XPROGTarget_SendByte(PDI_CMD_STCS | PDI_RESET_REG);	
-		XPROGTarget_SendByte(0x00);
 
 		XPROGTarget_DisableTargetPDI();
 	}
diff --git a/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c b/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c
index 3a74e1531e334dc6ac1bb059b73135237adfd5dc..15467fe84d3b7bc00fe38800a50b14fd2c372107 100644
--- a/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c
+++ b/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.c
@@ -162,7 +162,7 @@ void XPROGTarget_EnableTargetPDI(void)
 	
 	/* Set up the synchronous USART for XMEGA communications - 
 	   8 data bits, even parity, 2 stop bits */
-	UBRR1  = (F_CPU / 500000UL);
+	UBRR1  = (F_CPU / XPROG_HARDWARE_SPEED);
 	UCSR1B = (1 << TXEN1);
 	UCSR1C = (1 << UMSEL10) | (1 << UPM11) | (1 << USBS1) | (1 << UCSZ11) | (1 << UCSZ10) | (1 << UCPOL1);
 #else
@@ -203,7 +203,7 @@ void XPROGTarget_EnableTargetTPI(void)
 		
 	/* Set up the synchronous USART for TINY communications - 
 	   8 data bits, even parity, 2 stop bits */
-	UBRR1  = (F_CPU / 500000UL);
+	UBRR1  = (F_CPU / XPROG_HARDWARE_SPEED);
 	UCSR1B = (1 << TXEN1);
 	UCSR1C = (1 << UMSEL10) | (1 << UPM11) | (1 << USBS1) | (1 << UCSZ11) | (1 << UCSZ10) | (1 << UCPOL1);
 #else
@@ -239,16 +239,18 @@ void XPROGTarget_DisableTargetPDI(void)
 
 	/* Tristate all pins */
 	DDRD  &= ~((1 << 5) | (1 << 3));
-	PORTD &= ~((1 << 3) | (1 << 2));
+	PORTD &= ~((1 << 5) | (1 << 3) | (1 << 2));
 #else
 	/* Turn off software USART management timer */
 	TCCR1B = 0;
 
-	/* Tristate all pins */
+	/* Set DATA and CLOCK lines to inputs */
 	BITBANG_PDIDATA_DDR   &= ~BITBANG_PDIDATA_MASK;
 	BITBANG_PDICLOCK_DDR  &= ~BITBANG_PDICLOCK_MASK;
-	BITBANG_PDICLOCK_PORT &= ~BITBANG_PDICLOCK_MASK;	
+	
+	/* Tristate DATA and CLOCK lines */
 	BITBANG_PDIDATA_PORT  &= ~BITBANG_PDIDATA_MASK;
+	BITBANG_PDICLOCK_PORT &= ~BITBANG_PDICLOCK_MASK;	
 #endif
 }
 
diff --git a/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.h b/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.h
index 0c54ad4cf35533f03a4bf65250d3b201ba9044b0..7166c1023964cfd1a0b51598e2a2b375855583ba 100644
--- a/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.h
+++ b/Projects/AVRISP-MKII/Lib/XPROG/XPROGTarget.h
@@ -58,7 +58,7 @@
 	/* Defines: */
 		#if ((BOARD == BOARD_XPLAIN) || (BOARD == BOARD_XPLAIN_REV1))
 			#define XPROG_VIA_HARDWARE_USART
-		#else
+		#else		
 			#define BITBANG_PDIDATA_PORT     PORTB
 			#define BITBANG_PDIDATA_DDR      DDRB
 			#define BITBANG_PDIDATA_PIN      PINB
@@ -80,8 +80,11 @@
 			#define BITBANG_TPICLOCK_MASK    (1 << 1)
 		#endif
 		
+		/** Serial carrier TPI/PDI speed when hardware TPI/PDI mode is used */
+		#define XPROG_HARDWARE_SPEED       500000
+
 		/** Number of cycles between each clock when software USART mode is used */
-		#define BITS_BETWEEN_USART_CLOCKS  80
+		#define BITS_BETWEEN_USART_CLOCKS  100
 		
 		/** Total number of bits in a single USART frame */
 		#define BITS_IN_USART_FRAME        12
diff --git a/Projects/AVRISP-MKII/makefile b/Projects/AVRISP-MKII/makefile
index b2c139cec8edf4ead20d22a129cc32d75648688c..b0b26c24c1e6a90e5d666f285052dc272c577553 100644
--- a/Projects/AVRISP-MKII/makefile
+++ b/Projects/AVRISP-MKII/makefile
@@ -66,7 +66,7 @@ MCU = at90usb1287
 # Target board (see library "Board Types" documentation, NONE for projects not requiring
 # LUFA board drivers). If USER is selected, put custom board drivers in a directory called 
 # "Board" inside the application directory.
-BOARD = XPLAIN
+BOARD = USBKEY
 
 
 # Processor frequency.