diff --git a/Projects/Incomplete/AVRISP/Lib/V2Protocol.c b/Projects/Incomplete/AVRISP/Lib/V2Protocol.c
index f2089c67a1..08a54e2f13 100644
--- a/Projects/Incomplete/AVRISP/Lib/V2Protocol.c
+++ b/Projects/Incomplete/AVRISP/Lib/V2Protocol.c
@@ -270,35 +270,34 @@ static void V2Protocol_Command_ProgramMemory(uint8_t V2Command)
 		uint8_t  ProgrammingCommands[3];
 		uint8_t  PollValue1;
 		uint8_t  PollValue2;
+		uint8_t  ProgData[256];
 	} Write_Memory_Params;
 	
-	Endpoint_Read_Stream_LE(&Write_Memory_Params, sizeof(Write_Memory_Params));
+	uint8_t* NextWriteByte = Write_Memory_Params.ProgData;
+
+	Endpoint_Read_Stream_LE(&Write_Memory_Params, sizeof(Write_Memory_Params) - sizeof(Write_Memory_Params.ProgData));
 	Write_Memory_Params.BytesToWrite = SwapEndian_16(Write_Memory_Params.BytesToWrite);
-	
+	Endpoint_Read_Stream_LE(&Write_Memory_Params.ProgData, Write_Memory_Params.BytesToWrite);
+
+	Endpoint_ClearOUT();
+	Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN);
+
 	uint8_t  ProgrammingStatus = STATUS_CMD_OK;	
 	uint16_t PollAddress       = 0;
 	uint8_t  PollValue         = (V2Command == CMD_PROGRAM_FLASH_ISP) ? Write_Memory_Params.PollValue1 :
 	                                                                    Write_Memory_Params.PollValue2;
-	
 	if (Write_Memory_Params.ProgrammingMode & PROG_MODE_PAGED_WRITES_MASK)
 	{
 		uint16_t StartAddress = (CurrentAddress & 0xFFFF);
 	
 		/* Paged mode memory programming */
 		for (uint16_t CurrentByte = 0; CurrentByte < Write_Memory_Params.BytesToWrite; CurrentByte++)
-		{				
-			/* Check if the endpoint bank is currently empty */
-			if (!(Endpoint_IsReadWriteAllowed()))
-			{
-				Endpoint_ClearOUT();
-				Endpoint_WaitUntilReady();
-			}	
-
+		{
 			bool    IsOddByte   = (CurrentByte & 0x01);
-			uint8_t ByteToWrite = Endpoint_Read_Byte();
+			uint8_t ByteToWrite = *(NextWriteByte++);
 		
 			if (IsOddByte && (V2Command == CMD_PROGRAM_FLASH_ISP))
-			  Write_Memory_Params.ProgrammingCommands[0] |= READ_WRITE_HIGH_BYTE_MASK;
+			  Write_Memory_Params.ProgrammingCommands[0] |=  READ_WRITE_HIGH_BYTE_MASK;
 			else
 			  Write_Memory_Params.ProgrammingCommands[0] &= ~READ_WRITE_HIGH_BYTE_MASK;
 			  
@@ -331,7 +330,7 @@ static void V2Protocol_Command_ProgramMemory(uint8_t V2Command)
 			if (!(PollAddress))
 			{
 				Write_Memory_Params.ProgrammingMode &= ~PROG_MODE_PAGED_VALUE_MASK;
-				Write_Memory_Params.ProgrammingMode &= ~PROG_MODE_PAGED_TIMEDELAY_MASK;				
+				Write_Memory_Params.ProgrammingMode |=  PROG_MODE_PAGED_TIMEDELAY_MASK;				
 			}
 
 			ProgrammingStatus = V2Protocol_WaitForProgComplete(Write_Memory_Params.ProgrammingMode, PollAddress, PollValue,
@@ -343,18 +342,11 @@ static void V2Protocol_Command_ProgramMemory(uint8_t V2Command)
 		/* Word/byte mode memory programming */
 		for (uint16_t CurrentByte = 0; CurrentByte < Write_Memory_Params.BytesToWrite; CurrentByte++)
 		{
-			/* Check if the endpoint bank is currently empty */
-			if (!(Endpoint_IsReadWriteAllowed()))
-			{
-				Endpoint_ClearOUT();
-				Endpoint_WaitUntilReady();
-			}	
-
 			bool    IsOddByte   = (CurrentByte & 0x01);
-			uint8_t ByteToWrite = Endpoint_Read_Byte();
+			uint8_t ByteToWrite = *(NextWriteByte++);
 		
 			if (IsOddByte && (V2Command == CMD_READ_FLASH_ISP))
-			  Write_Memory_Params.ProgrammingCommands[0] |= READ_WRITE_HIGH_BYTE_MASK;
+			  Write_Memory_Params.ProgrammingCommands[0] |=  READ_WRITE_HIGH_BYTE_MASK;
 			else
 			  Write_Memory_Params.ProgrammingCommands[0] &= ~READ_WRITE_HIGH_BYTE_MASK;			
 			  
@@ -381,9 +373,6 @@ static void V2Protocol_Command_ProgramMemory(uint8_t V2Command)
 			  break;
 		}
 	}
-	
-	Endpoint_ClearOUT();
-	Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN);
 
 	Endpoint_Write_Byte(V2Command);
 	Endpoint_Write_Byte(ProgrammingStatus);
@@ -413,7 +402,7 @@ static void V2Protocol_Command_ReadMemory(uint8_t V2Command)
 		bool IsOddByte = (CurrentByte & 0x01);
 
 		if (IsOddByte && (V2Command == CMD_READ_FLASH_ISP))
-		  Read_Memory_Params.ReadMemoryCommand |= READ_WRITE_HIGH_BYTE_MASK;
+		  Read_Memory_Params.ReadMemoryCommand |=  READ_WRITE_HIGH_BYTE_MASK;
 		else
 		  Read_Memory_Params.ReadMemoryCommand &= ~READ_WRITE_HIGH_BYTE_MASK;
 
@@ -532,8 +521,7 @@ static void V2Protocol_Command_SPIMulti(void)
 		uint8_t TxData[255];
 	} SPI_Multi_Params;
 	
-	Endpoint_Read_Stream_LE(&SPI_Multi_Params, sizeof(SPI_Multi_Params) -
-	                                           sizeof(SPI_Multi_Params.TxData));
+	Endpoint_Read_Stream_LE(&SPI_Multi_Params, sizeof(SPI_Multi_Params) - sizeof(SPI_Multi_Params.TxData));
 	Endpoint_Read_Stream_LE(&SPI_Multi_Params.TxData, SPI_Multi_Params.TxBytes);
 	
 	Endpoint_ClearOUT();