diff --git a/Demos/Host/Incomplete/BluetoothHost/BluetoothHost.c b/Demos/Host/Incomplete/BluetoothHost/BluetoothHost.c
index b8e87cb6038a2841eb0ff80cfc6da54069c68662..3222b770ec68e83e07fcaca24bbb7e93cd141a3c 100644
--- a/Demos/Host/Incomplete/BluetoothHost/BluetoothHost.c
+++ b/Demos/Host/Incomplete/BluetoothHost/BluetoothHost.c
@@ -139,14 +139,11 @@ void Bluetooth_Management_Task(void)
 				LEDs_SetAllLEDs(LEDS_LED1);
 
 				/* Wait until USB device disconnected */
-				while (USB_IsConnected);
+				USB_HostState = HOST_STATE_WaitForDeviceRemoval;
 				break;
 			}
 
 			puts_P(PSTR("Bluetooth Dongle Detected.\r\n"));
-				
-			/* Select the control pipe for the request transfer */
-			Pipe_SelectPipe(PIPE_CONTROLPIPE);
 
 			/* Set the device configuration to the first configuration (rarely do devices use multiple configurations) */
 			if ((ErrorCode = USB_Host_SetDeviceConfiguration(1)) != HOST_SENDCONTROL_Successful)
@@ -158,7 +155,7 @@ void Bluetooth_Management_Task(void)
 				LEDs_SetAllLEDs(LEDS_LED1);
 
 				/* Wait until USB device disconnected */
-				while (USB_IsConnected);
+				USB_HostState = HOST_STATE_WaitForDeviceRemoval;
 				break;
 			}
 				
@@ -181,17 +178,13 @@ void Bluetooth_Management_Task(void)
 				LEDs_SetAllLEDs(LEDS_LED1);
 
 				/* Wait until USB device disconnected */
-				while (USB_IsConnected);
+				USB_HostState = HOST_STATE_WaitForDeviceRemoval;
 				break;
 			}
 
 			puts_P(PSTR("Bluetooth Dongle Enumerated.\r\n"));
 
 			USB_HostState = HOST_STATE_Ready;
-			break;
-		case HOST_STATE_Ready:
-			/* Do nothing, Bluetooth stack will take care of enumeration */
-			
 			break;
 	}
 }
diff --git a/Demos/Host/Incomplete/BluetoothHost/DeviceDescriptor.c b/Demos/Host/Incomplete/BluetoothHost/DeviceDescriptor.c
index e9f575c55ef4e74482f4d3501275edf991589833..f68f957c01e30b149b769f2cd777274e9a7fd141 100644
--- a/Demos/Host/Incomplete/BluetoothHost/DeviceDescriptor.c
+++ b/Demos/Host/Incomplete/BluetoothHost/DeviceDescriptor.c
@@ -34,28 +34,15 @@ uint8_t ProcessDeviceDescriptor(void)
 {
 	USB_Descriptor_Device_t DeviceDescriptor;
 
-	/* Standard request to get the device descriptor */
-	USB_ControlRequest = (USB_Request_Header_t)
-		{
-			bmRequestType: (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE),
-			bRequest:      REQ_GetDescriptor,
-			wValue:        (DTYPE_Device << 8),
-			wIndex:        0,
-			wLength:       sizeof(USB_Descriptor_Device_t),
-		};
-
-	/* Select the control pipe for the request transfer */
-	Pipe_SelectPipe(PIPE_CONTROLPIPE);
-
 	/* Send the request to retrieve the device descriptor */
-	if (USB_Host_SendControlRequest((void*)&DeviceDescriptor) != HOST_SENDCONTROL_Successful)
+	if (USB_Host_GetDeviceDescriptor(&DeviceDescriptor) != HOST_SENDCONTROL_Successful)
 	  return ControlErrorDuringDeviceRead;
 	  
 	/* Validate returned data - ensure the returned data is a device descriptor */
 	if (DeviceDescriptor.Header.Type != DTYPE_Device)
 	  return InvalidDeviceDataReturned;
 	  
-	if ((DeviceDescriptor.Class != BLUETOOTH_DEVICE_CLASS) ||
+	if ((DeviceDescriptor.Class    != BLUETOOTH_DEVICE_CLASS)    ||
 	    (DeviceDescriptor.SubClass != BLUETOOTH_DEVICE_SUBCLASS) ||
 	    (DeviceDescriptor.Protocol != BLUETOOTH_DEVICE_PROTOCOL))
 	{
diff --git a/Demos/Host/Incomplete/PrinterHost/PrinterHost.c b/Demos/Host/Incomplete/PrinterHost/PrinterHost.c
index df80789dd350ea790ddccbf915a36d6d5df6bb55..7b98542d09109abf97c8484c1cb04016e17f3bda 100644
--- a/Demos/Host/Incomplete/PrinterHost/PrinterHost.c
+++ b/Demos/Host/Incomplete/PrinterHost/PrinterHost.c
@@ -133,7 +133,7 @@ void USB_Printer_Host(void)
 				LEDs_SetAllLEDs(LEDS_LED1);
 
 				/* Wait until USB device disconnected */
-				while (USB_IsConnected);
+				USB_HostState = HOST_STATE_WaitForDeviceRemoval;
 				break;
 			}
 				
@@ -147,7 +147,7 @@ void USB_Printer_Host(void)
 				LEDs_SetAllLEDs(LEDS_LED1);
 
 				/* Wait until USB device disconnected */
-				while (USB_IsConnected);
+				USB_HostState = HOST_STATE_WaitForDeviceRemoval;
 				break;
 			}
 
@@ -173,7 +173,7 @@ void USB_Printer_Host(void)
 				LEDs_SetAllLEDs(LEDS_LED1);
 
 				/* Wait until USB device disconnected */
-				while (USB_IsConnected);
+				USB_HostState = HOST_STATE_WaitForDeviceRemoval;
 				break;
 			}
 
@@ -181,10 +181,8 @@ void USB_Printer_Host(void)
 		
 			/* Indicate device no longer busy */
 			LEDs_SetAllLEDs(LEDS_LED4);
-			
-			/* Wait until USB device disconnected */
-			while (USB_IsConnected);
-			
+
+			USB_HostState = HOST_STATE_WaitForDeviceRemoval;
 			break;
 	}
 }
diff --git a/Demos/Host/LowLevel/CDCHost/CDCHost.c b/Demos/Host/LowLevel/CDCHost/CDCHost.c
index b3e0674180426e3a2f97fece8ab7687cbfa004b4..de7ab88c672cadd848804c8821ad00fa2184a0fd 100644
--- a/Demos/Host/LowLevel/CDCHost/CDCHost.c
+++ b/Demos/Host/LowLevel/CDCHost/CDCHost.c
@@ -148,7 +148,7 @@ void CDC_Host_Task(void)
 				LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
 
 				/* Wait until USB device disconnected */
-				while (USB_IsConnected);
+				USB_HostState = HOST_STATE_WaitForDeviceRemoval;
 				break;
 			}
 			
@@ -162,7 +162,7 @@ void CDC_Host_Task(void)
 				LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
 
 				/* Wait until USB device disconnected */
-				while (USB_IsConnected);
+				USB_HostState = HOST_STATE_WaitForDeviceRemoval;
 				break;
 			}
 				
diff --git a/Demos/Host/LowLevel/GenericHIDHost/GenericHIDHost.c b/Demos/Host/LowLevel/GenericHIDHost/GenericHIDHost.c
index 9f7da5998275787a76bce1745abd5407ea2a0b26..a1b62ac62bb49af510795af91edd9a19ea5634a0 100644
--- a/Demos/Host/LowLevel/GenericHIDHost/GenericHIDHost.c
+++ b/Demos/Host/LowLevel/GenericHIDHost/GenericHIDHost.c
@@ -249,7 +249,7 @@ void HID_Host_Task(void)
 				LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
 
 				/* Wait until USB device disconnected */
-				while (USB_IsConnected);
+				USB_HostState = HOST_STATE_WaitForDeviceRemoval;
 				break;
 			}
 
@@ -263,7 +263,7 @@ void HID_Host_Task(void)
 				LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
 				
 				/* Wait until USB device disconnected */
-				while (USB_IsConnected);
+				USB_HostState = HOST_STATE_WaitForDeviceRemoval;
 				break;
 			}
 			
diff --git a/Demos/Host/LowLevel/KeyboardHost/KeyboardHost.c b/Demos/Host/LowLevel/KeyboardHost/KeyboardHost.c
index 734ef2a5724b7bcf1e1e0aa930c0fdb8ed265e6a..2517848b00415384edda33c644235e0608c2cc79 100644
--- a/Demos/Host/LowLevel/KeyboardHost/KeyboardHost.c
+++ b/Demos/Host/LowLevel/KeyboardHost/KeyboardHost.c
@@ -213,7 +213,7 @@ void Keyboard_HID_Task(void)
 				LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
 
 				/* Wait until USB device disconnected */
-				while (USB_IsConnected);
+				USB_HostState = HOST_STATE_WaitForDeviceRemoval;
 				break;
 			}
 		
@@ -227,7 +227,7 @@ void Keyboard_HID_Task(void)
 				LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
 
 				/* Wait until USB device disconnected */
-				while (USB_IsConnected);
+				USB_HostState = HOST_STATE_WaitForDeviceRemoval;
 				break;
 			}
 				
@@ -257,7 +257,7 @@ void Keyboard_HID_Task(void)
 				LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
 				
 				/* Wait until USB device disconnected */
-				while (USB_IsConnected);
+				USB_HostState = HOST_STATE_WaitForDeviceRemoval;
 				break;
 			}
 
diff --git a/Demos/Host/LowLevel/KeyboardHostWithParser/KeyboardHostWithParser.c b/Demos/Host/LowLevel/KeyboardHostWithParser/KeyboardHostWithParser.c
index 4e78b0de9134126a9c3c7ba73b5b75ed1962c263..2ef15e7b81beffd834674180b75b55bcf5d189b0 100644
--- a/Demos/Host/LowLevel/KeyboardHostWithParser/KeyboardHostWithParser.c
+++ b/Demos/Host/LowLevel/KeyboardHostWithParser/KeyboardHostWithParser.c
@@ -148,7 +148,7 @@ void Keyboard_HID_Task(void)
 				LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
 
 				/* Wait until USB device disconnected */
-				while (USB_IsConnected);
+				USB_HostState = HOST_STATE_WaitForDeviceRemoval;
 				break;
 			}
 
@@ -163,7 +163,7 @@ void Keyboard_HID_Task(void)
 				LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
 
 				/* Wait until USB device disconnected */
-				while (USB_IsConnected);
+				USB_HostState = HOST_STATE_WaitForDeviceRemoval;
 				break;
 			}
 				
@@ -182,7 +182,7 @@ void Keyboard_HID_Task(void)
 				LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
 				
 				/* Wait until USB device disconnected */
-				while (USB_IsConnected);
+				USB_HostState = HOST_STATE_WaitForDeviceRemoval;
 				break;	
 			}
 
diff --git a/Demos/Host/LowLevel/MassStorageHost/MassStorageHost.c b/Demos/Host/LowLevel/MassStorageHost/MassStorageHost.c
index 2f84d0fb8307d87d0409fda264f45d0bf95df2e3..1bb94f6c8521f4dce71ec4d2b14fea0d576f3b7e 100644
--- a/Demos/Host/LowLevel/MassStorageHost/MassStorageHost.c
+++ b/Demos/Host/LowLevel/MassStorageHost/MassStorageHost.c
@@ -154,7 +154,7 @@ void MassStorage_Task(void)
 				LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
 
 				/* Wait until USB device disconnected */
-				while (USB_IsConnected);
+				USB_HostState = HOST_STATE_WaitForDeviceRemoval;
 				break;
 			}
 
@@ -168,7 +168,7 @@ void MassStorage_Task(void)
 				LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
 
 				/* Wait until USB device disconnected */
-				while (USB_IsConnected);
+				USB_HostState = HOST_STATE_WaitForDeviceRemoval;
 				break;
 			}
 				
@@ -187,6 +187,8 @@ void MassStorage_Task(void)
 			if ((ErrorCode = MassStore_GetMaxLUN(&MassStore_MaxLUNIndex)) != HOST_SENDCONTROL_Successful)
 			{	
 				ShowDiskReadError(PSTR("Get Max LUN"), false, ErrorCode);
+
+				USB_HostState = HOST_STATE_WaitForDeviceRemoval;
 				break;
 			}
 			
@@ -197,6 +199,8 @@ void MassStorage_Task(void)
 			if ((ErrorCode = MassStore_MassStorageReset()) != HOST_SENDCONTROL_Successful)
 			{
 				ShowDiskReadError(PSTR("Mass Storage Reset"), false, ErrorCode);
+				
+				USB_HostState = HOST_STATE_WaitForDeviceRemoval;
 				break;
 			}
 			
@@ -213,6 +217,8 @@ void MassStorage_Task(void)
 			if (((ErrorCode = MassStore_PreventAllowMediumRemoval(0, true)) != 0) || (SCSICommandStatus.Status != Command_Pass))
 			{
 				ShowDiskReadError(PSTR("Prevent/Allow Medium Removal"), (SCSICommandStatus.Status != Command_Pass), ErrorCode);
+				
+				USB_HostState = HOST_STATE_WaitForDeviceRemoval;
 				break;
 			}
 
@@ -221,6 +227,8 @@ void MassStorage_Task(void)
 			if (((ErrorCode = MassStore_Inquiry(0, &InquiryData)) != 0) || (SCSICommandStatus.Status != Command_Pass))
 			{
 				ShowDiskReadError(PSTR("Inquiry"), (SCSICommandStatus.Status != Command_Pass), ErrorCode);
+				
+				USB_HostState = HOST_STATE_WaitForDeviceRemoval;
 				break;
 			}
 
@@ -237,7 +245,9 @@ void MassStorage_Task(void)
 				if ((ErrorCode = MassStore_TestUnitReady(0)) != 0)
 				{
 					ShowDiskReadError(PSTR("Test Unit Ready"), false, ErrorCode);
-					break;				
+
+					USB_HostState = HOST_STATE_WaitForDeviceRemoval;
+					break;
 				}
 			}
 			while ((SCSICommandStatus.Status != Command_Pass) && USB_IsConnected);
@@ -255,6 +265,8 @@ void MassStorage_Task(void)
 			if (((ErrorCode = MassStore_ReadCapacity(0, &DiskCapacity)) != 0) || (SCSICommandStatus.Status != Command_Pass))
 			{
 				ShowDiskReadError(PSTR("Read Capacity"), (SCSICommandStatus.Status != Command_Pass), ErrorCode);
+				
+				USB_HostState = HOST_STATE_WaitForDeviceRemoval;
 				break;
 			}
 			
@@ -269,6 +281,8 @@ void MassStorage_Task(void)
 			    (SCSICommandStatus.Status != Command_Pass))
 			{
 				ShowDiskReadError(PSTR("Read Device Block"), (SCSICommandStatus.Status != Command_Pass), ErrorCode);
+				
+				USB_HostState = HOST_STATE_WaitForDeviceRemoval;
 				break;
 			}
 			
@@ -319,6 +333,8 @@ void MassStorage_Task(void)
 				    (SCSICommandStatus.Status != Command_Pass))
 				{
 					ShowDiskReadError(PSTR("Read Device Block"), (SCSICommandStatus.Status != Command_Pass), ErrorCode);
+					
+					USB_HostState = HOST_STATE_WaitForDeviceRemoval;
 					break;
 				}
 
@@ -339,8 +355,7 @@ void MassStorage_Task(void)
 			LEDs_SetAllLEDs(LEDMASK_USB_READY);
 			
 			/* Wait until USB device disconnected */
-			while (USB_IsConnected);
-			
+			USB_HostState = HOST_STATE_WaitForDeviceRemoval;
 			break;
 	}
 }
@@ -372,7 +387,4 @@ void ShowDiskReadError(char* CommandString, bool FailedAtSCSILayer, uint8_t Erro
 
 	/* Indicate device error via the status LEDs */
 	LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
-
-	/* Wait until USB device disconnected */
-	while (USB_IsConnected);
 }
diff --git a/Demos/Host/LowLevel/MouseHost/MouseHost.c b/Demos/Host/LowLevel/MouseHost/MouseHost.c
index 2a2e1b99484f005f1127d1b6f5f701ff9c8396be..d5c4bf94108c22f852c6e50a004ae9064914df34 100644
--- a/Demos/Host/LowLevel/MouseHost/MouseHost.c
+++ b/Demos/Host/LowLevel/MouseHost/MouseHost.c
@@ -209,7 +209,7 @@ void Mouse_HID_Task(void)
 				LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
 
 				/* Wait until USB device disconnected */
-				while (USB_IsConnected);
+				USB_HostState = HOST_STATE_WaitForDeviceRemoval;
 				break;
 			}
 
@@ -223,7 +223,7 @@ void Mouse_HID_Task(void)
 				LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
 				
 				/* Wait until USB device disconnected */
-				while (USB_IsConnected);
+				USB_HostState = HOST_STATE_WaitForDeviceRemoval;
 				break;
 			}
 			
@@ -253,7 +253,7 @@ void Mouse_HID_Task(void)
 				LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
 				
 				/* Wait until USB device disconnected */
-				while (USB_IsConnected);
+				USB_HostState = HOST_STATE_WaitForDeviceRemoval;
 				break;
 			}
 
diff --git a/Demos/Host/LowLevel/MouseHostWithParser/MouseHostWithParser.c b/Demos/Host/LowLevel/MouseHostWithParser/MouseHostWithParser.c
index d7a947105c8598c1e7a3d3e112c767b36bc7ad8f..1e931232c8370a54ce8bab7a80d769b0aac7a1ed 100644
--- a/Demos/Host/LowLevel/MouseHostWithParser/MouseHostWithParser.c
+++ b/Demos/Host/LowLevel/MouseHostWithParser/MouseHostWithParser.c
@@ -149,7 +149,7 @@ void Mouse_HID_Task(void)
 				LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
 
 				/* Wait until USB device disconnected */
-				while (USB_IsConnected);
+				USB_HostState = HOST_STATE_WaitForDeviceRemoval;
 				break;
 			}
 		
@@ -163,7 +163,7 @@ void Mouse_HID_Task(void)
 				LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
 				
 				/* Wait until USB device disconnected */
-				while (USB_IsConnected);
+				USB_HostState = HOST_STATE_WaitForDeviceRemoval;
 				break;
 			}
 			
@@ -182,7 +182,7 @@ void Mouse_HID_Task(void)
 				LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
 				
 				/* Wait until USB device disconnected */
-				while (USB_IsConnected);
+				USB_HostState = HOST_STATE_WaitForDeviceRemoval;
 				break;			
 			}
 
diff --git a/Demos/Host/LowLevel/StillImageHost/StillImageHost.c b/Demos/Host/LowLevel/StillImageHost/StillImageHost.c
index 5243871239568f180df0a4f2c57b5037eda31af2..0f511ad7aaf795ca484bf82dd79c41667c0899db 100644
--- a/Demos/Host/LowLevel/StillImageHost/StillImageHost.c
+++ b/Demos/Host/LowLevel/StillImageHost/StillImageHost.c
@@ -149,7 +149,7 @@ void StillImage_Task(void)
 				LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
 
 				/* Wait until USB device disconnected */
-				while (USB_IsConnected);
+				USB_HostState = HOST_STATE_WaitForDeviceRemoval;
 				break;
 			}
 
@@ -162,7 +162,7 @@ void StillImage_Task(void)
 				LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
 
 				/* Wait until USB device disconnected */
-				while (USB_IsConnected);
+				USB_HostState = HOST_STATE_WaitForDeviceRemoval;
 				break;
 			}
 				
@@ -195,6 +195,8 @@ void StillImage_Task(void)
 			if ((ErrorCode = SImage_RecieveBlockHeader()) != PIPE_RWSTREAM_NoError)
 			{
 				ShowCommandError(ErrorCode, false);
+				
+				USB_HostState = HOST_STATE_WaitForDeviceRemoval;
 				break;
 			}
 			
@@ -246,6 +248,8 @@ void StillImage_Task(void)
 			if ((ErrorCode = SImage_RecieveBlockHeader()) != PIPE_RWSTREAM_NoError)
 			{
 				ShowCommandError(ErrorCode, false);
+				
+				USB_HostState = HOST_STATE_WaitForDeviceRemoval;
 				break;
 			}
 			
@@ -253,6 +257,8 @@ void StillImage_Task(void)
 			if ((PIMA_ReceivedBlock.Type != CType_ResponseBlock) || (PIMA_ReceivedBlock.Code != PIMA_RESPONSE_OK))
 			{
 				ShowCommandError(PIMA_ReceivedBlock.Code, true);
+				
+				USB_HostState = HOST_STATE_WaitForDeviceRemoval;
 				break;
 			}
 			
@@ -274,6 +280,8 @@ void StillImage_Task(void)
 			if ((ErrorCode = SImage_RecieveBlockHeader()) != PIPE_RWSTREAM_NoError)
 			{
 				ShowCommandError(ErrorCode, false);
+				
+				USB_HostState = HOST_STATE_WaitForDeviceRemoval;
 				break;
 			}
 			
@@ -281,6 +289,8 @@ void StillImage_Task(void)
 			if ((PIMA_ReceivedBlock.Type != CType_ResponseBlock) || (PIMA_ReceivedBlock.Code != PIMA_RESPONSE_OK))
 			{
 				ShowCommandError(PIMA_ReceivedBlock.Code, true);
+				
+				USB_HostState = HOST_STATE_WaitForDeviceRemoval;
 				break;
 			}
 
@@ -302,6 +312,8 @@ void StillImage_Task(void)
 			if ((ErrorCode = SImage_RecieveBlockHeader()) != PIPE_RWSTREAM_NoError)
 			{
 				ShowCommandError(ErrorCode, false);
+				
+				USB_HostState = HOST_STATE_WaitForDeviceRemoval;
 				break;
 			}
 
@@ -309,6 +321,8 @@ void StillImage_Task(void)
 			if ((PIMA_ReceivedBlock.Type != CType_ResponseBlock) || (PIMA_ReceivedBlock.Code != PIMA_RESPONSE_OK))
 			{
 				ShowCommandError(PIMA_ReceivedBlock.Code, true);
+				
+				USB_HostState = HOST_STATE_WaitForDeviceRemoval;
 				break;
 			}
 
@@ -363,7 +377,4 @@ void ShowCommandError(uint8_t ErrorCode, bool ResponseCodeError)
 			
 	/* Indicate error via status LEDs */
 	LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
-				
-	/* Wait until USB device disconnected */
-	while (USB_IsConnected);
 }
diff --git a/LUFA/Drivers/USB/Class/Host/CDC.c b/LUFA/Drivers/USB/Class/Host/CDC.c
index 943cb73630d64daff19e07dd0ca0471ccb1668b9..688143c08c5035d30f2b7548a565323a8089bd91 100644
--- a/LUFA/Drivers/USB/Class/Host/CDC.c
+++ b/LUFA/Drivers/USB/Class/Host/CDC.c
@@ -203,12 +203,12 @@ void CDC_Host_USBTask(USB_ClassInfo_CDC_Host_t* CDCInterfaceInfo)
 		case HOST_STATE_Addressed:
 			if ((ErrorCode = CDC_Host_ProcessConfigDescriptor(CDCInterfaceInfo)) != CDC_ENUMERROR_NoError)
 			{
-				USB_HostState = HOST_STATE_Unattached;
+				USB_HostState = HOST_STATE_WaitForDeviceRemoval;
 			}
 
 			if ((ErrorCode = USB_Host_SetDeviceConfiguration(1)) != HOST_SENDCONTROL_Successful)
 			{
-				USB_HostState = HOST_STATE_Unattached;
+				USB_HostState = HOST_STATE_WaitForDeviceRemoval;
 			}
 				
 			USB_HostState = HOST_STATE_Configured;
diff --git a/LUFA/Drivers/USB/LowLevel/Host.c b/LUFA/Drivers/USB/LowLevel/Host.c
index 037e6d80a8f63463dafb7c5add5fcf1c44c7aa0a..78a9ca8fbd65961b59abd09ec6aa755bef0dd4db 100644
--- a/LUFA/Drivers/USB/LowLevel/Host.c
+++ b/LUFA/Drivers/USB/LowLevel/Host.c
@@ -66,6 +66,7 @@ void USB_Host_ProcessNextHostState(void)
 			USB_HostState = HOST_STATE_Attached_WaitForDeviceSettle;
 			break;
 		case HOST_STATE_Attached_WaitForDeviceSettle:
+			#if HOST_DEVICE_SETTLE_DELAY_MS > 0
 			_delay_ms(1);
 
 			if (!(WaitMSRemaining--))
@@ -78,6 +79,9 @@ void USB_Host_ProcessNextHostState(void)
 				
 				USB_HostState = HOST_STATE_Attached_WaitForConnect;
 			}
+			#else
+			USB_HostState = HOST_STATE_Attached_WaitForConnect;			
+			#endif
 			
 			break;
 		case HOST_STATE_Attached_WaitForConnect:		
diff --git a/LUFA/Drivers/USB/LowLevel/Host.h b/LUFA/Drivers/USB/LowLevel/Host.h
index 08b21f688f9580bf1f39d0bf3ad033f0dc4bb34d..d91c1d82d5d2c3fd0f7a437d38dfee018718d43b 100644
--- a/LUFA/Drivers/USB/LowLevel/Host.h
+++ b/LUFA/Drivers/USB/LowLevel/Host.h
@@ -221,20 +221,103 @@
 			 */
 			enum USB_Host_States_t
 			{
-				HOST_STATE_WaitForDevice                = 0,  /**< Internally implemented by the library. */
-				HOST_STATE_Unattached                   = 1,  /**< Internally implemented by the library. */
-				HOST_STATE_Attached                     = 2,  /**< Internally implemented by the library. */
-				HOST_STATE_Attached_WaitForDeviceSettle = 3,  /**< Internally implemented by the library. */
-				HOST_STATE_Attached_WaitForConnect      = 4,  /**< Internally implemented by the library. */
-				HOST_STATE_Attached_DoReset             = 5,  /**< Internally implemented by the library. */
-				HOST_STATE_Powered                      = 6,  /**< Internally implemented by the library. */
-				HOST_STATE_Default                      = 7,  /**< Internally implemented by the library. */
-				HOST_STATE_Default_PostReset            = 8,  /**< Internally implemented by the library. */
-				HOST_STATE_Default_PostAddressSet       = 9,  /**< Internally implemented by the library. */
-				HOST_STATE_Addressed                    = 10, /**< May be implemented by the user project. */
-				HOST_STATE_Configured                   = 11, /**< May be implemented by the user project. */
-				HOST_STATE_Ready                        = 12, /**< May be implemented by the user project. */
-				HOST_STATE_Suspended                    = 13, /**< May be implemented by the user project. */
+				HOST_STATE_WaitForDeviceRemoval         = 0,  /**< Internally implemented by the library. This state can be
+				                                               *   used by the library to wait until the attached device is
+				                                               *   removed by the user - useful for when an error occurs or
+				                                               *   further communication with the device is not needed. This
+				                                               *   allows for other code to run while the state machine is
+				                                               *   effectively disabled.
+				                                               */
+				HOST_STATE_WaitForDevice                = 1,  /**< Internally implemented by the library. This state indicates
+				                                               *   that the stack is waiting for an interval to elapse before
+				                                               *   continuing with the next step of the device enumeration
+				                                               *   process.
+				                                               *
+				                                               *   \note Do not manually change to this state in the user code.
+				                                               */
+				HOST_STATE_Unattached                   = 2,  /**< Internally implemented by the library. This state indicates
+				                                               *   that the host state machine is waiting for a device to be
+				                                               *   attached so that it can start the enumeration process.
+				                                               *   
+				                                               *   \note Do not manually change to this state in the user code.
+				                                               */
+				HOST_STATE_Attached                     = 3,  /**< Internally implemented by the library. This state indicates
+				                                               *   that a device has been attached, and the library's internals
+				                                               *   are being configured to begin the enumeration process.
+				                                               *   
+				                                               *   \note Do not manually change to this state in the user code.
+				                                               */
+				HOST_STATE_Attached_WaitForDeviceSettle = 4,  /**< Internally implemented by the library. This state indicates
+				                                               *   that the stack is waiting for the initial settling period to
+				                                               *   elapse before beginning the enumeration process.
+				                                               *   
+				                                               *   \note Do not manually change to this state in the user code.
+				                                               */
+				HOST_STATE_Attached_WaitForConnect      = 5,  /**< Internally implemented by the library. This state indicates
+				                                               *   that the stack is waiting for a connection event from the USB
+				                                               *   controller to indicate a valid USB device has been attached to
+				                                               *   the bus and is ready to be enumerated.
+				                                               *   
+				                                               *   \note Do not manually change to this state in the user code.
+				                                               */
+				HOST_STATE_Attached_DoReset             = 6,  /**< Internally implemented by the library. This state indicates
+				                                               *   that a valid USB device has been attached, and that it is
+				                                               *   will now be reset to ensure it is ready for enumeration.
+				                                               *   
+				                                               *   \note Do not manually change to this state in the user code.
+				                                               */
+				HOST_STATE_Powered                      = 7,  /**< Internally implemented by the library. This state indicates
+				                                               *   that the attached device is currently powered and reset, and
+				                                               *   that the control pipe is now being configured by the stack.
+				                                               *   
+				                                               *   \note Do not manually change to this state in the user code.
+				                                               */
+				HOST_STATE_Default                      = 8,  /**< Internally implemented by the library. This state indicates
+				                                               *   that the stack is currently retrieving the control endpoint's
+				                                               *   size from the device, so that the control pipe can be altered
+				                                               *   to match.
+				                                               *   
+				                                               *   \note Do not manually change to this state in the user code.
+				                                               */
+				HOST_STATE_Default_PostReset            = 9,  /**< Internally implemented by the library. This state indicates that
+				                                               *   the control pipe is being reconfigured to match the retrieved
+				                                               *   control endpoint size from the device, and the device's USB bus
+				                                               *   address is being set.
+				                                               *   
+				                                               *   \note Do not manually change to this state in the user code.
+				                                               */
+				HOST_STATE_Default_PostAddressSet       = 10, /**< Internally implemented by the library. This state indicates that
+				                                               *   the device's address has now been set, and the stack is has now
+				                                               *   completed the device enumeration process. This state causes the
+				                                               *   stack to change the current USB device address to that set for
+				                                               *   the connected device, before progressing to the user-implemented
+				                                               *   HOST_STATE_Addressed state for further communications.
+				                                               *   
+				                                               *   \note Do not manually change to this state in the user code.
+				                                               */
+				HOST_STATE_Addressed                    = 11, /**< May be implemented by the user project. This state should
+				                                               *   set the device configuration before progressing to the
+				                                               *   HOST_STATE_Configured state. Other processing (such as the
+				                                               *   retrieval and processing of the device descriptor) should also
+				                                               *   be placed in this state.
+				                                               */
+				HOST_STATE_Configured                   = 12, /**< May be implemented by the user project. This state should
+				                                               *   implement any extra device configuration (such as the setting of
+				                                               *   class-specific parameters) before normal communication is begun
+				                                               *   in the HOST_STATE_Ready state.
+				                                               */
+				HOST_STATE_Ready                        = 13, /**< May be implemented by the user project. This state should
+				                                               *   contain the main communications with the attached device. From this
+				                                               *   this state the host state machine should be changed to either
+				                                               *   HOST_STATE_Suspended (after the bus is manually suspended using the
+				                                               *   USB_Host_SuspendBus() macro) or HOST_STATE_WaitForDeviceRemoval as
+				                                               *   needed.
+				                                               */
+				HOST_STATE_Suspended                    = 15, /**< May be implemented by the user project. This state should be maintained
+				                                               *   while the bus is suspended, and changed to either the HOST_STATE_Ready
+				                                               *   (after resuming the bus with the USB_Host_ResumeBus() macro) or the
+				                                               *   HOST_STATE_WaitForDeviceRemoval states as needed.
+				                                               */
 			};
 			
 			/** Enum for the error codes for the \ref EVENT_USB_HostError() event.
diff --git a/LUFA/ManPages/ChangeLog.txt b/LUFA/ManPages/ChangeLog.txt
index 0f582a657903505d5ff4f907ebbad757f5494f07..f22a9ff04fa88fb9a8ab2b548519087a7d214f3c 100644
--- a/LUFA/ManPages/ChangeLog.txt
+++ b/LUFA/ManPages/ChangeLog.txt
@@ -21,6 +21,8 @@
   *    added NO_INTERNAL_SERIAL compile time option to turn off new serial number reading code
   *  - Added new DATAFLASH_CHIP_MASK() macro to the Dataflash driver, which returns the Dataflash select mask for the given chip index
   *  - Updated MassStorage device block write routines to use ping-pong Dataflash buffering to increase throughput by around 30%
+  *  - Added new HOST_STATE_WaitForDeviceRemoval host state machine state for non-blocking disabling of device communications until the
+  *    device has been removed (for use when an error occurs or communications with the device have completed)
   *  
   *  <b>Changed:</b>
   *  - Deprecated psuedo-scheduler and removed dynamic memory allocator from the library (first no longer needed and second unused)
diff --git a/LUFA/ManPages/CompileTimeTokens.txt b/LUFA/ManPages/CompileTimeTokens.txt
index bc49ba2cc9c01a10f205fec0b7c82cea34d72409..796ee84848422422e62ae85a555e88909777a55a 100644
--- a/LUFA/ManPages/CompileTimeTokens.txt
+++ b/LUFA/ManPages/CompileTimeTokens.txt
@@ -120,8 +120,8 @@
  *  <b>HOST_DEVICE_SETTLE_DELAY_MS</b> - ( \ref Group_Host ) \n
  *  Some devices require a delay of up to 5 seconds after they are connected to VBUS before the enumeration process can be started, or
  *  they will fail to enumerate correctly. By placing a delay before the enumeration process, it can be ensured that the bus has settled
- *  back to a known idle state before communications occur with the device. This token may be defined to a non-zero 16-bit value to set
- *  the device settle period, specified in milliseconds. If not defined, the default value specified in Host.h is used instead.
+ *  back to a known idle state before communications occur with the device. This token may be defined to a 16-bit value to set the device
+ *  settle period, specified in milliseconds. If not defined, the default value specified in Host.h is used instead.
  *
  *  <b>USE_STATIC_OPTIONS</b> - ( \ref Group_USBManagement ) \n
  *  By default, the USB_Init() function accepts dynamic options at runtime to alter the library behaviour, including whether the USB pad
diff --git a/LUFA/ManPages/FutureChanges.txt b/LUFA/ManPages/FutureChanges.txt
index 59a2790723faba86b605ca120b1212c30f07e047..2e348d53ec6960b90f53d8ad805010d07325cd5c 100644
--- a/LUFA/ManPages/FutureChanges.txt
+++ b/LUFA/ManPages/FutureChanges.txt
@@ -19,9 +19,9 @@
   *     -# Re-enable Host mode Class driver builds after completion
   *     -# Update Host mode Class Driver demo .txt files
   *  - Add standardized descriptor names to device and host class driver structures
-  *  - Remove USE_NONSTANDARD_DESCRIPTOR_NAMES, make all typedefs unions to allow either naming scheme to be used
   *  - Add in INTERRUPT_CONTROL_PIPE to use HSOFI to trigger calls to the host state machine
   *  - Make Suspend host state suspend USB bus frames
+  *  - Split StillImageHost demo into lib directory
   *  - Add in Stream functions for PROGMEM, EEPROM -- move to templated system
   *  - Debug mode for pipe/endpoint calls
   *  - Test and document new FAST_STREAM_TRANSFERS compile time option
diff --git a/Projects/MissileLauncher/MissileLauncher.c b/Projects/MissileLauncher/MissileLauncher.c
index 192ca3340ab1ce33d1b350c6c361b3ce8b3ff84c..046c132f062241d0c0140539a61c12ced9203001 100644
--- a/Projects/MissileLauncher/MissileLauncher.c
+++ b/Projects/MissileLauncher/MissileLauncher.c
@@ -318,7 +318,7 @@ void HID_Host_Task(void)
 				LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
 
 				/* Wait until USB device disconnected */
-				while (USB_IsConnected);
+				USB_HostState = HOST_STATE_WaitForDeviceRemoval;
 				break;
 			}
 
@@ -329,7 +329,7 @@ void HID_Host_Task(void)
 				LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
 				
 				/* Wait until USB device disconnected */
-				while (USB_IsConnected);
+				USB_HostState = HOST_STATE_WaitForDeviceRemoval;
 				break;
 			}