diff --git a/LUFA/Drivers/USB/Class/Device/CDC.c b/LUFA/Drivers/USB/Class/Device/CDC.c
index e1cb554f9558569dd7c6953d3500c85c01db2c5c..f0c6edb12ba14ae8add5d45fb0697ad30da01cbd 100644
--- a/LUFA/Drivers/USB/Class/Device/CDC.c
+++ b/LUFA/Drivers/USB/Class/Device/CDC.c
@@ -65,9 +65,8 @@ void CDC_Device_ProcessControlRequest(USB_ClassInfo_CDC_Device_t* CDCInterfaceIn
 			{
 				Endpoint_ClearSETUP();
 				Endpoint_Read_Control_Stream_LE(&CDCInterfaceInfo->State.LineEncoding, sizeof(CDCInterfaceInfo->State.LineEncoding));
-				Endpoint_ClearIN();
-
 				EVENT_CDC_Device_LineEncodingChanged(CDCInterfaceInfo);
+				Endpoint_ClearIN();
 			}
 	
 			break;
@@ -77,7 +76,6 @@ void CDC_Device_ProcessControlRequest(USB_ClassInfo_CDC_Device_t* CDCInterfaceIn
 				Endpoint_ClearSETUP();
 				
 				CDCInterfaceInfo->State.ControlLineStates.HostToDevice = USB_ControlRequest.wValue;
-				
 				EVENT_CDC_Device_ControLineStateChanged(CDCInterfaceInfo);
 
 				Endpoint_ClearStatusStage();
diff --git a/LUFA/Drivers/USB/Class/Device/HID.c b/LUFA/Drivers/USB/Class/Device/HID.c
index 7ff32498bcdfa030bd2749af360efb4caeb84a38..6766509765ab23b9dd800986793f575f135ca611 100644
--- a/LUFA/Drivers/USB/Class/Device/HID.c
+++ b/LUFA/Drivers/USB/Class/Device/HID.c
@@ -79,9 +79,8 @@ void HID_Device_ProcessControlRequest(USB_ClassInfo_HID_Device_t* const HIDInter
 				uint8_t  ReportID = (USB_ControlRequest.wValue & 0xFF);
 
 				Endpoint_Read_Control_Stream_LE(ReportOUTData, ReportOUTSize);
-				Endpoint_ClearIN();
-				
 				CALLBACK_HID_Device_ProcessHIDReport(HIDInterfaceInfo, ReportID, ReportOUTData, ReportOUTSize);
+				Endpoint_ClearIN();				
 			}
 			
 			break;
diff --git a/LUFA/Drivers/USB/Class/Device/MIDI.c b/LUFA/Drivers/USB/Class/Device/MIDI.c
index d3f8f55b6037336fd99e19bd91ee7a55abe3567a..1a66dc867da95db0e411f38fc1b59c8fe179df95 100644
--- a/LUFA/Drivers/USB/Class/Device/MIDI.c
+++ b/LUFA/Drivers/USB/Class/Device/MIDI.c
@@ -35,11 +35,6 @@
 #define  __INCLUDE_FROM_MIDI_DRIVER
 #include "MIDI.h"
 
-void MIDI_Device_ProcessControlRequest(USB_ClassInfo_MIDI_Device_t* const MIDIInterfaceInfo)
-{
-
-}
-
 bool MIDI_Device_ConfigureEndpoints(USB_ClassInfo_MIDI_Device_t* const MIDIInterfaceInfo)
 {
 	memset(&MIDIInterfaceInfo->State, 0x00, sizeof(MIDIInterfaceInfo->State));
diff --git a/LUFA/Drivers/USB/Class/Device/MIDI.h b/LUFA/Drivers/USB/Class/Device/MIDI.h
index 11a05bfbb39d59a98fdace1cb21547d8338092d8..00d34e00092c0f88277c33a91ae6951fc4b75811 100644
--- a/LUFA/Drivers/USB/Class/Device/MIDI.h
+++ b/LUFA/Drivers/USB/Class/Device/MIDI.h
@@ -112,13 +112,6 @@
 			 */
 			bool MIDI_Device_ConfigureEndpoints(USB_ClassInfo_MIDI_Device_t* const MIDIInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
 			
-			/** Processes incoming control requests from the host, that are directed to the given MIDI class interface. This should be
-			 *  linked to the library \ref EVENT_USB_Device_UnhandledControlRequest() event.
-			 *
-			 *  \param[in,out] MIDIInterfaceInfo  Pointer to a structure containing a MIDI Class configuration and state
-			 */		
-			void MIDI_Device_ProcessControlRequest(USB_ClassInfo_MIDI_Device_t* const MIDIInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
-
 			/** Sends a MIDI event packet to the host. If no host is connected, the event packet is discarded. Events are queued into the
 			 *  endpoint bank until either the endpoint bank is full, or \ref MIDI_Device_Flush() is called. This allows for multiple
 			 *  MIDI events to be packed into a single endpoint packet, increasing data throughput.
@@ -168,7 +161,18 @@
 			static inline void MIDI_Device_USBTask(USB_ClassInfo_MIDI_Device_t* const MIDIInterfaceInfo)
 			{
 				(void)MIDIInterfaceInfo;
-			}		
+			}
+			
+			/** Processes incoming control requests from the host, that are directed to the given MIDI class interface. This should be
+			 *  linked to the library \ref EVENT_USB_Device_UnhandledControlRequest() event.
+			 *
+			 *  \param[in,out] MIDIInterfaceInfo  Pointer to a structure containing a MIDI Class configuration and state
+			 */		
+			static inline void MIDI_Device_ProcessControlRequest(USB_ClassInfo_MIDI_Device_t* const MIDIInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
+			static inline void MIDI_Device_ProcessControlRequest(USB_ClassInfo_MIDI_Device_t* const MIDIInterfaceInfo)
+			{
+				(void)MIDIInterfaceInfo;
+			}
 
 	/* Disable C linkage for C++ Compilers: */
 		#if defined(__cplusplus)
diff --git a/LUFA/Drivers/USB/Class/Device/RNDIS.c b/LUFA/Drivers/USB/Class/Device/RNDIS.c
index 1961e7e84adf9b8d03fc32da51570692e454d32a..69e8e677d3c7bb7870b1076ca10c7c7ca8539984 100644
--- a/LUFA/Drivers/USB/Class/Device/RNDIS.c
+++ b/LUFA/Drivers/USB/Class/Device/RNDIS.c
@@ -83,9 +83,8 @@ void RNDIS_Device_ProcessControlRequest(USB_ClassInfo_RNDIS_Device_t* const RNDI
 				Endpoint_ClearSETUP();
 
 				Endpoint_Read_Control_Stream_LE(RNDISInterfaceInfo->State.RNDISMessageBuffer, USB_ControlRequest.wLength);
-				Endpoint_ClearIN();
-
 				RNDIS_Device_ProcessRNDISControlMessage(RNDISInterfaceInfo);
+				Endpoint_ClearIN();
 			}
 			
 			break;
diff --git a/LUFA/ManPages/ChangeLog.txt b/LUFA/ManPages/ChangeLog.txt
index 8e6818304392f3defda9d703f6d34d6d22529de5..4de0473a2e9c6455d591e8fa7e0cc10609745c04 100644
--- a/LUFA/ManPages/ChangeLog.txt
+++ b/LUFA/ManPages/ChangeLog.txt
@@ -39,6 +39,8 @@
   *    now be implemented via seperate programming headers
   *  - The CDC class bootloader now uses a watchdog reset rather than a soft-reset when exited to ensure that all hardware is
   *    properly reset to their defaults
+  *  - Device mode class driver callbacks are now fired before the control request status stage is sent to prevent the host from
+  *    timing out if another request is immediately fired and the device has a lengthy callback routine
   *
   *  <b>Fixed:</b>
   *  - Fixed software PDI/TPI programming mode in the AVRISP project not correctly toggling just the clock pin