diff --git a/Demos/Device/ClassDriver/MassStorage/makefile b/Demos/Device/ClassDriver/MassStorage/makefile
index a7c1bed823ee8b5ee271540c66f4a7349cea790c..5c9fe05718708982c389a474ab1f80043b75ed5d 100644
--- a/Demos/Device/ClassDriver/MassStorage/makefile
+++ b/Demos/Device/ClassDriver/MassStorage/makefile
@@ -121,6 +121,7 @@ LUFA_OPTS += -D FIXED_CONTROL_ENDPOINT_SIZE=8
 LUFA_OPTS += -D FIXED_NUM_CONFIGURATIONS=1
 LUFA_OPTS += -D USE_FLASH_DESCRIPTORS
 LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
+LUFA_OPTS += -D INTERRUPT_CONTROL_ENDPOINT
 
 
 # Create the LUFA source path variables by including the LUFA root makefile
diff --git a/Demos/Device/ClassDriver/MassStorageKeyboard/makefile b/Demos/Device/ClassDriver/MassStorageKeyboard/makefile
index 9450ee5848deb02033665fdd9dd118169896718c..723dd91d602f20496ca52d39b0c0d606de743f62 100644
--- a/Demos/Device/ClassDriver/MassStorageKeyboard/makefile
+++ b/Demos/Device/ClassDriver/MassStorageKeyboard/makefile
@@ -121,6 +121,7 @@ LUFA_OPTS += -D FIXED_CONTROL_ENDPOINT_SIZE=8
 LUFA_OPTS += -D FIXED_NUM_CONFIGURATIONS=1
 LUFA_OPTS += -D USE_FLASH_DESCRIPTORS
 LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
+LUFA_OPTS += -D INTERRUPT_CONTROL_ENDPOINT
 
 
 # Create the LUFA source path variables by including the LUFA root makefile
diff --git a/Demos/Device/Incomplete/TestAndMeasurement/TestAndMeasurement.c b/Demos/Device/Incomplete/TestAndMeasurement/TestAndMeasurement.c
index c3e54ab3a1d05c0ebab1ea04331c870d409e947b..184e2e23c2ef6c29c5487b1a8ba7a7fb92e57e42 100644
--- a/Demos/Device/Incomplete/TestAndMeasurement/TestAndMeasurement.c
+++ b/Demos/Device/Incomplete/TestAndMeasurement/TestAndMeasurement.c
@@ -61,6 +61,12 @@ bool IsTMCBulkINReset    = false;
 /** Stream callback abort flag for bulk OUT data */
 bool IsTMCBulkOUTReset   = false;
 
+/** Last used tag value for bulk IN transfers */
+uint8_t NextTransferINTag  = 0;
+
+/** Last used tag value for bulk IN transfers */
+uint8_t NextTransferOUTTag  = 0;
+
 
 /** Main program entry point. This routine contains the overall program flow, including initial
  *  setup of all components and the main program loop.
@@ -126,6 +132,8 @@ void EVENT_USB_Device_ConfigurationChanged(void)
 
 void EVENT_USB_Device_UnhandledControlRequest(void)
 {
+	uint8_t TMCRequestStatus = TMC_REQUEST_STATUS_SUCCESS;
+
 	switch (USB_ControlRequest.bRequest)
 	{
 		case Req_InitiateAbortBulkOut:
@@ -133,10 +141,13 @@ void EVENT_USB_Device_UnhandledControlRequest(void)
 			{
 				Endpoint_ClearSETUP();
 				
-				/* Check to see if a split request is already being processed before starting a new one */
 				if (RequestInProgess != 0)
 				{
-					Endpoint_Write_Byte(TMC_REQUEST_STATUS_SPLIT_IN_PROGRESS);				
+					TMCRequestStatus = TMC_REQUEST_STATUS_SPLIT_IN_PROGRESS;
+				}
+				else if (USB_ControlRequest.wValue != NextTransferOUTTag)
+				{
+					TMCRequestStatus = TMC_REQUEST_STATUS_TRANSFER_NOT_IN_PROGRESS;
 				}
 				else
 				{
@@ -145,10 +156,11 @@ void EVENT_USB_Device_UnhandledControlRequest(void)
 					
 					/* Save the split request for later checking when a new request is received */
 					RequestInProgess = Req_InitiateAbortBulkOut;
-
-					Endpoint_Write_Byte(TMC_REQUEST_STATUS_SUCCESS);
 				}
 				
+				/* Write the request response byte */
+				Endpoint_Write_Byte(TMCRequestStatus);
+
 				Endpoint_ClearIN();
 				Endpoint_ClearStatusStage();
 			}
@@ -159,21 +171,18 @@ void EVENT_USB_Device_UnhandledControlRequest(void)
 			{
 				Endpoint_ClearSETUP();
 				
-				/* Check to see the correct split request is in progress before the status can be retrieved */
 				if (RequestInProgess != Req_InitiateAbortBulkOut)
-				{
-					Endpoint_Write_Byte(TMC_REQUEST_STATUS_SPLIT_NOT_IN_PROGRESS);				
-				}
+				  TMCRequestStatus = TMC_REQUEST_STATUS_SPLIT_NOT_IN_PROGRESS;				
+				else if (IsTMCBulkOUTReset)
+				  TMCRequestStatus = TMC_REQUEST_STATUS_PENDING;
 				else
-				{
-					// TODO: CLEAR BULK OUT
+				  RequestInProgess = 0;			
 				
-					/* Clear the pending split request value so that a new request can be made */
-					RequestInProgess = 0;
+				/* Write the request response bytes */
+				Endpoint_Write_Byte(TMCRequestStatus);
+				Endpoint_Write_Word_LE(0);
+				Endpoint_Write_DWord_LE(0); // TODO - Last transfer length
 
-					Endpoint_Write_Byte(TMC_REQUEST_STATUS_SUCCESS);
-				}
-				
 				Endpoint_ClearIN();
 				Endpoint_ClearStatusStage();				
 			}
@@ -184,10 +193,13 @@ void EVENT_USB_Device_UnhandledControlRequest(void)
 			{
 				Endpoint_ClearSETUP();
 				
-				/* Check to see if a split request is already being processed before starting a new one */
 				if (RequestInProgess != 0)
 				{
-					Endpoint_Write_Byte(TMC_REQUEST_STATUS_SPLIT_IN_PROGRESS);				
+					TMCRequestStatus = TMC_REQUEST_STATUS_SPLIT_IN_PROGRESS;				
+				}
+				else if (USB_ControlRequest.wValue != NextTransferINTag)
+				{
+					TMCRequestStatus = TMC_REQUEST_STATUS_TRANSFER_NOT_IN_PROGRESS;
 				}
 				else
 				{
@@ -196,10 +208,12 @@ void EVENT_USB_Device_UnhandledControlRequest(void)
 					
 					/* Save the split request for later checking when a new request is received */
 					RequestInProgess = Req_InitiateAbortBulkIn;
-
-					Endpoint_Write_Byte(TMC_REQUEST_STATUS_SUCCESS);
 				}
 				
+				/* Write the request response bytes */
+				Endpoint_Write_Byte(TMCRequestStatus);
+				Endpoint_Write_Byte(NextTransferINTag);
+
 				Endpoint_ClearIN();
 				Endpoint_ClearStatusStage();
 			}
@@ -210,23 +224,20 @@ void EVENT_USB_Device_UnhandledControlRequest(void)
 			{
 				Endpoint_ClearSETUP();
 				
-				/* Check to see the correct split request is in progress before the status can be retrieved */
 				if (RequestInProgess != Req_InitiateAbortBulkIn)
-				{
-					Endpoint_Write_Byte(TMC_REQUEST_STATUS_SPLIT_NOT_IN_PROGRESS);				
-				}
+				  TMCRequestStatus = TMC_REQUEST_STATUS_SPLIT_NOT_IN_PROGRESS;
+				else if (IsTMCBulkINReset)
+				  TMCRequestStatus = TMC_REQUEST_STATUS_PENDING;
 				else
-				{
-					// TODO: CLEAR BULK IN
+				  RequestInProgess = 0;
 				
-					/* Clear the pending split request value so that a new request can be made */
-					RequestInProgess = 0;
+				/* Write the request response bytes */
+				Endpoint_Write_Byte(TMCRequestStatus);
+				Endpoint_Write_Word_LE(0);
+				Endpoint_Write_DWord_LE(0); // TODO - Last transfer length
 
-					Endpoint_Write_Byte(TMC_REQUEST_STATUS_SUCCESS);
-				}
-				
 				Endpoint_ClearIN();
-				Endpoint_ClearStatusStage();				
+				Endpoint_ClearStatusStage();
 			}
 			
 			break;
@@ -235,7 +246,6 @@ void EVENT_USB_Device_UnhandledControlRequest(void)
 			{
 				Endpoint_ClearSETUP();
 				
-				/* Check to see if a split request is already being processed before starting a new one */
 				if (RequestInProgess != 0)
 				{
 					Endpoint_Write_Byte(TMC_REQUEST_STATUS_SPLIT_IN_PROGRESS);				
@@ -248,10 +258,11 @@ void EVENT_USB_Device_UnhandledControlRequest(void)
 					
 					/* Save the split request for later checking when a new request is received */
 					RequestInProgess = Req_InitiateClear;
-
-					Endpoint_Write_Byte(TMC_REQUEST_STATUS_SUCCESS);
 				}
 				
+				/* Write the request response byte */
+				Endpoint_Write_Byte(TMCRequestStatus);
+
 				Endpoint_ClearIN();
 				Endpoint_ClearStatusStage();
 			}
@@ -262,20 +273,16 @@ void EVENT_USB_Device_UnhandledControlRequest(void)
 			{
 				Endpoint_ClearSETUP();
 				
-				/* Check to see the correct split request is in progress before the status can be retrieved */
 				if (RequestInProgess != Req_InitiateClear)
-				{
-					Endpoint_Write_Byte(TMC_REQUEST_STATUS_SPLIT_NOT_IN_PROGRESS);				
-				}
+				  TMCRequestStatus = TMC_REQUEST_STATUS_SPLIT_NOT_IN_PROGRESS;				
+				else if (IsTMCBulkINReset || IsTMCBulkOUTReset)
+				  TMCRequestStatus = TMC_REQUEST_STATUS_PENDING;
 				else
-				{
-					// TODO: CLEAR STATUS
+				  RequestInProgess = 0;
 				
-					/* Clear the pending split request value so that a new request can be made */
-					RequestInProgess = 0;
-
-					Endpoint_Write_Byte(TMC_REQUEST_STATUS_SUCCESS);
-				}
+				/* Write the request response bytes */
+				Endpoint_Write_Byte(TMCRequestStatus);
+				Endpoint_Write_Byte(0);
 				
 				Endpoint_ClearIN();
 				Endpoint_ClearStatusStage();				
@@ -313,6 +320,10 @@ void TMC_Task(void)
 		LEDs_SetAllLEDs(LEDS_ALL_LEDS);
 		Endpoint_ClearOUT();
 	}
+	
+	/* All pending data has been processed - reset the data abort flags */
+	IsTMCBulkINReset  = false;
+	IsTMCBulkOUTReset = false;
 }
 
 /** Stream callback function for the Endpoint stream write functions. This callback will abort the current stream transfer
diff --git a/Demos/Device/Incomplete/TestAndMeasurement/makefile b/Demos/Device/Incomplete/TestAndMeasurement/makefile
index 43f8b8fbd882c06f0a220b1b8fa75ed1411eea6c..856fc2bcbc01dae3df5d94733d671af315545554 100644
--- a/Demos/Device/Incomplete/TestAndMeasurement/makefile
+++ b/Demos/Device/Incomplete/TestAndMeasurement/makefile
@@ -121,6 +121,7 @@ LUFA_OPTS += -D FIXED_CONTROL_ENDPOINT_SIZE=8
 LUFA_OPTS += -D FIXED_NUM_CONFIGURATIONS=1
 LUFA_OPTS += -D USE_FLASH_DESCRIPTORS
 LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
+LUFA_OPTS += -D INTERRUPT_CONTROL_ENDPOINT
 
 
 # Create the LUFA source path variables by including the LUFA root makefile
diff --git a/Demos/Device/LowLevel/MassStorage/makefile b/Demos/Device/LowLevel/MassStorage/makefile
index 4ae0040ce30f310229565979886fb252dde6ae91..e1447cea2b45dd09c44221fae8efb4edb8e91d28 100644
--- a/Demos/Device/LowLevel/MassStorage/makefile
+++ b/Demos/Device/LowLevel/MassStorage/makefile
@@ -121,6 +121,7 @@ LUFA_OPTS += -D FIXED_CONTROL_ENDPOINT_SIZE=8
 LUFA_OPTS += -D FIXED_NUM_CONFIGURATIONS=1
 LUFA_OPTS += -D USE_FLASH_DESCRIPTORS
 LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
+LUFA_OPTS += -D INTERRUPT_CONTROL_ENDPOINT
 
 
 # Create the LUFA source path variables by including the LUFA root makefile
diff --git a/Projects/TempDataLogger/makefile b/Projects/TempDataLogger/makefile
index de751dd4cc017248a976f0a459857241ac16dd63..06f09546375ef728a965e4b99586c0801fec039c 100644
--- a/Projects/TempDataLogger/makefile
+++ b/Projects/TempDataLogger/makefile
@@ -121,6 +121,7 @@ LUFA_OPTS += -D FIXED_CONTROL_ENDPOINT_SIZE=8
 LUFA_OPTS += -D FIXED_NUM_CONFIGURATIONS=1
 LUFA_OPTS += -D USE_FLASH_DESCRIPTORS
 LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
+LUFA_OPTS += -D INTERRUPT_CONTROL_ENDPOINT
 
 #LUFA_OPTS += -D DUMMY_RTC
 
diff --git a/Projects/Webserver/makefile b/Projects/Webserver/makefile
index 093246e7ceb59082839f3cc55caa5b95c0e9c02d..877b9261f9df5936b371178bc31bc8f82a39808e 100644
--- a/Projects/Webserver/makefile
+++ b/Projects/Webserver/makefile
@@ -121,6 +121,7 @@ LUFA_OPTS += -D FIXED_NUM_CONFIGURATIONS=1
 LUFA_OPTS += -D USE_FLASH_DESCRIPTORS
 LUFA_OPTS += -D FAST_STREAM_TRANSFERS
 LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
+LUFA_OPTS += -D INTERRUPT_CONTROL_ENDPOINT
 
 LUFA_OPTS += -D ENABLE_DHCP_CLIENT
 LUFA_OPTS += -D ENABLE_TELNET_SERVER