diff --git a/Demos/Device/ClassDriver/DualVirtualSerial/DualVirtualSerial.txt b/Demos/Device/ClassDriver/DualVirtualSerial/DualVirtualSerial.txt
index 03a97cee93d9567f43fe1af9f678d3df82c45716..3959f89c43198757e0bf990adc430ef1320bca1d 100644
--- a/Demos/Device/ClassDriver/DualVirtualSerial/DualVirtualSerial.txt
+++ b/Demos/Device/ClassDriver/DualVirtualSerial/DualVirtualSerial.txt
@@ -50,7 +50,7 @@
  *
  *  Dual Communications Device Class demonstration application.
  *  This gives a simple reference application for implementing
- *  a compound device with dual CDC functions acting as a pair
+ *  a composite device with dual CDC functions acting as a pair
  *  of virtual serial ports. This demo uses Interface Association
  *  Descriptors to link together the pair of related CDC
  *  descriptors for each virtual serial port, which may not be
diff --git a/Demos/DualRole/ClassDriver/MouseHostDevice/DeviceFunctions.c b/Demos/DualRole/ClassDriver/MouseHostDevice/DeviceFunctions.c
index e2a2128e9391d3afce4bec14511b1145e6faecb5..8d1cae9adc6b9446e5824c6404eff7447b69b7ff 100644
--- a/Demos/DualRole/ClassDriver/MouseHostDevice/DeviceFunctions.c
+++ b/Demos/DualRole/ClassDriver/MouseHostDevice/DeviceFunctions.c
@@ -62,12 +62,14 @@ USB_ClassInfo_HID_Device_t Mouse_HID_Device_Interface =
 /** Event handler for the library USB WakeUp event. */
 void EVENT_USB_Device_Connect(void)
 {
+	puts_P(PSTR("Device Connected.\r\n"));
 	LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING);
 }
 
 /** Event handler for the library USB Suspend event. */
 void EVENT_USB_Device_Disconnect(void)
 {
+	puts_P(PSTR("Device Disconnected.\r\n"));
 	LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
 }
 
diff --git a/Demos/DualRole/ClassDriver/MouseHostDevice/MouseHostDevice.c b/Demos/DualRole/ClassDriver/MouseHostDevice/MouseHostDevice.c
index cd6bf59ee96863a6713fef413a6a03d1e78db199..1b905b1145877f4681b95d6be534128ab0cec5e6 100644
--- a/Demos/DualRole/ClassDriver/MouseHostDevice/MouseHostDevice.c
+++ b/Demos/DualRole/ClassDriver/MouseHostDevice/MouseHostDevice.c
@@ -82,3 +82,12 @@ void SetupHardware(void)
 	Buttons_Init();
 	USB_Init(USB_MODE_UID);
 }
+
+/** Event handler for the library USB mode change event. */
+void EVENT_USB_UIDChange(void)
+{
+	printf_P(PSTR(ESC_FG_YELLOW "UID Change to %S mode\r\n" ESC_FG_WHITE),
+	         (USB_CurrentMode == USB_MODE_DEVICE) ? PSTR("Device") : PSTR("Host"));
+			 
+	LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
+}
diff --git a/LUFA/Drivers/USB/HighLevel/StdDescriptors.h b/LUFA/Drivers/USB/HighLevel/StdDescriptors.h
index 89c2c97cb2f8d4e105368aea1b8bd12608b4c536..43394799778b57aea9984830da6a49bfaa0f1a11 100644
--- a/LUFA/Drivers/USB/HighLevel/StdDescriptors.h
+++ b/LUFA/Drivers/USB/HighLevel/StdDescriptors.h
@@ -459,7 +459,7 @@
 			 *  to make each element's purpose clearer.
 			 *
 			 *  This descriptor has been added as a supplement to the USB2.0 standard, in the ECN located at
-			 *  <a>http://www.usb.org/developers/docs/InterfaceAssociationDescriptor_ecn.pdf</a>. It allows compound
+			 *  <a>http://www.usb.org/developers/docs/InterfaceAssociationDescriptor_ecn.pdf</a>. It allows composite
 			 *  devices with multiple interfaces related to the same function to have the multiple interfaces bound
 			 *  together at the point of enumeration, loading one generic driver for all the interfaces in the single
 			 *  function. Read the ECN for more information.
@@ -488,7 +488,7 @@
 			 *  element names to ensure compatibility with the standard.
 			 *
 			 *  This descriptor has been added as a supplement to the USB2.0 standard, in the ECN located at
-			 *  <a>http://www.usb.org/developers/docs/InterfaceAssociationDescriptor_ecn.pdf</a>. It allows compound
+			 *  <a>http://www.usb.org/developers/docs/InterfaceAssociationDescriptor_ecn.pdf</a>. It allows composite
 			 *  devices with multiple interfaces related to the same function to have the multiple interfaces bound
 			 *  together at the point of enumeration, loading one generic driver for all the interfaces in the single
 			 *  function. Read the ECN for more information.
diff --git a/LUFA/Drivers/USB/LowLevel/Device.h b/LUFA/Drivers/USB/LowLevel/Device.h
index 300793612576e0350c9203d5d8c7f9cd8f47867d..a37e6d939fbc8a3b60375243fdf3030035caf4c9 100644
--- a/LUFA/Drivers/USB/LowLevel/Device.h
+++ b/LUFA/Drivers/USB/LowLevel/Device.h
@@ -221,7 +221,8 @@
 			static inline void USB_Device_SetDeviceAddress(const uint8_t Address) ATTR_ALWAYS_INLINE;
 			static inline void USB_Device_SetDeviceAddress(const uint8_t Address)
 			{
-				UDADDR = ((1 << ADDEN) | (Address & 0x7F));
+				UDADDR  = ((UDADDR & (1 << ADDEN)) | (Address & 0x7F));
+				UDADDR |= (1 << ADDEN);
 			}			
 	#endif
 
diff --git a/LUFA/Drivers/USB/LowLevel/Host.c b/LUFA/Drivers/USB/LowLevel/Host.c
index 2b66e28b4b7cf783d98622a78aba5bff862907a7..6c66083a8ba419158a737b93a3f120444bbc1d68 100644
--- a/LUFA/Drivers/USB/LowLevel/Host.c
+++ b/LUFA/Drivers/USB/LowLevel/Host.c
@@ -194,19 +194,21 @@ void USB_Host_ProcessNextHostState(void)
 
 uint8_t USB_Host_WaitMS(uint8_t MS)
 {
-	bool     BusSuspended        = USB_Host_IsBusSuspended();
-	uint8_t  ErrorCode           = HOST_WAITERROR_Successful;
-	uint16_t PreviousFrameNumber = USB_Host_GetFrameNumber();
+	bool    BusSuspended = USB_Host_IsBusSuspended();
+	uint8_t ErrorCode    = HOST_WAITERROR_Successful;
 	
 	USB_Host_ResumeBus();
 
+	bool HSOFIEnabled = USB_INT_IsEnabled(USB_INT_HSOFI);
+
+	USB_INT_Disable(USB_INT_HSOFI);
+	USB_INT_Clear(USB_INT_HSOFI);
+
 	while (MS)
 	{
-		uint16_t CurrentFrameNumber = USB_Host_GetFrameNumber();
-
-		if (CurrentFrameNumber != PreviousFrameNumber)
+		if (USB_INT_HasOccurred(USB_INT_HSOFI))
 		{
-			PreviousFrameNumber = CurrentFrameNumber;
+			USB_INT_Clear(USB_INT_HSOFI);
 			MS--;
 		}
 					
@@ -234,6 +236,9 @@ uint8_t USB_Host_WaitMS(uint8_t MS)
 		}
 	}
 
+	if (HSOFIEnabled)
+	  USB_INT_Enable(USB_INT_HSOFI);
+
 	if (BusSuspended)
 	  USB_Host_SuspendBus();
 
diff --git a/LUFA/Drivers/USB/LowLevel/USBInterrupt.c b/LUFA/Drivers/USB/LowLevel/USBInterrupt.c
index a49b8da7b95e732da49df966ad7e73080bafbf58..52951fc39ff1235e8de26a4e257f9ab191a2842a 100644
--- a/LUFA/Drivers/USB/LowLevel/USBInterrupt.c
+++ b/LUFA/Drivers/USB/LowLevel/USBInterrupt.c
@@ -34,14 +34,17 @@
 void USB_INT_DisableAllInterrupts(void)
 {
 	#if defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR)
-	USBCON &= ~((1 << VBUSTE) | (1 << IDTE));				
+	USBCON &= ~((1 << OTGPADE) | (1 << VBUSTE) | (1 << IDTE));				
 	#elif defined(USB_SERIES_4_AVR)
 	USBCON &= ~(1 << VBUSTE);
 	#endif
 	
+	#if defined(USB_CAN_BE_BOTH)
+	OTGIEN  = 0;
+	#endif
+	
 	#if defined(USB_CAN_BE_HOST)
 	UHIEN   = 0;
-	OTGIEN  = 0;
 	#endif
 	
 	#if defined(USB_CAN_BE_DEVICE)
@@ -55,9 +58,12 @@ void USB_INT_ClearAllInterrupts(void)
 	USBINT  = 0;
 	#endif
 	
+	#if defined(USB_CAN_BE_BOTH)
+	OTGINT  = 0;
+	#endif
+	
 	#if defined(USB_CAN_BE_HOST)
 	UHINT   = 0;
-	OTGINT  = 0;
 	#endif
 	
 	#if defined(USB_CAN_BE_DEVICE)
diff --git a/LUFA/ManPages/FutureChanges.txt b/LUFA/ManPages/FutureChanges.txt
index 555971f8ec05ec262513f43666bedd2dfa0c3b6f..6e77effbf53398e27b237d855d73fc674f725eac 100644
--- a/LUFA/ManPages/FutureChanges.txt
+++ b/LUFA/ManPages/FutureChanges.txt
@@ -14,7 +14,7 @@
   *  <b>Targeted for Future Releases:</b>
   *  - Code Features
   *      -# Add hub support when in Host mode for multiple devices
-  *      -# Investigate virtual hubs when in device mode instead of compound devices
+  *      -# Investigate virtual hubs when in device mode instead of composite devices
   *      -# Add ability to get number of bytes not written with pipe/endpoint write routines after an error
   *      -# Change makefiles to allow for absolute LUFA location to be used
   *      -# Re-add interrupt Pipe/Endpoint support