diff --git a/LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.c b/LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.c
index 18fa48a236eb2d3b972e077611f729d39c99c894..8b41711388ceb6a65d33fc268cea64a9056a2fcd 100644
--- a/LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.c
+++ b/LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.c
@@ -65,6 +65,13 @@ void USB_Init(
 	else
 	  USB_REG_Off();
 
+	if (!(USB_Options & USB_OPT_MANUAL_PLL))
+	{
+		#if defined(USB_SERIES_4_AVR)
+		PLLFRQ = ((1 << PLLUSB) | (1 << PDIV3) | (1 << PDIV1));
+		#endif
+	}
+
 	#if defined(USB_CAN_BE_BOTH)
 	if (Mode == USB_MODE_UID)
 	{
@@ -118,22 +125,9 @@ void USB_ResetInterface(void)
 
 	USB_Controller_Reset();
 
-	if (!(USB_Options & USB_OPT_MANUAL_PLL))
-	{
-		#if defined(USB_SERIES_4_AVR)
-		PLLFRQ = ((1 << PLLUSB) | (1 << PDIV3) | (1 << PDIV1));
-		#endif
-
-		USB_PLL_On();
-		while (!(USB_PLL_IsReady()));
-	}
-
 	#if defined(USB_CAN_BE_BOTH)
 	if (UIDModeSelectEnabled)
-	{
-		UHWCON |= (1 << UIDE);
-		USB_INT_Enable(USB_INT_IDTI);
-	}
+	  USB_INT_Enable(USB_INT_IDTI);
 	#endif
 
 	USB_CLK_Unfreeze();
@@ -145,6 +139,16 @@ void USB_ResetInterface(void)
 		UHWCON |=  (1 << UIMOD);
 		#endif
 
+		if (!(USB_Options & USB_OPT_MANUAL_PLL))
+		{
+			#if defined(USB_SERIES_2_AVR)
+			USB_PLL_On();
+			while (!(USB_PLL_IsReady()));
+			#else
+			USB_PLL_Off();
+			#endif
+		}
+
 		USB_Init_Device();
 		#endif
 	}
@@ -153,6 +157,14 @@ void USB_ResetInterface(void)
 		#if defined(USB_CAN_BE_HOST)
 		UHWCON &= ~(1 << UIMOD);
 
+		if (!(USB_Options & USB_OPT_MANUAL_PLL))
+		{
+			#if defined(USB_CAN_BE_HOST)
+			USB_PLL_On();
+			while (!(USB_PLL_IsReady()));		
+			#endif
+		}
+
 		USB_Init_Host();
 		#endif
 	}
diff --git a/LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.c b/LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.c
index e983cde83eb43a1d4b6404c272b30a47dbd1a674..856ccd6267969cbec072371ca3b1906aaec755fe 100644
--- a/LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.c
+++ b/LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.c
@@ -90,11 +90,20 @@ ISR(USB_GEN_vect, ISR_BLOCK)
 
 		if (USB_VBUS_GetStatus())
 		{
+			if (!(USB_Options & USB_OPT_MANUAL_PLL))
+			{
+				USB_PLL_On();
+				while (!(USB_PLL_IsReady()));
+			}
+
 			USB_DeviceState = DEVICE_STATE_Powered;
 			EVENT_USB_Device_Connect();
 		}
 		else
 		{
+			if (!(USB_Options & USB_OPT_MANUAL_PLL))
+			  USB_PLL_Off();
+
 			USB_DeviceState = DEVICE_STATE_Unattached;
 			EVENT_USB_Device_Disconnect();
 		}
diff --git a/LUFA/ManPages/ChangeLog.txt b/LUFA/ManPages/ChangeLog.txt
index 231920e8f1220ee3107f47eeb1746de3ac36805f..ea3efcdb2eb3749c5a7503414ecb18e941998e92 100644
--- a/LUFA/ManPages/ChangeLog.txt
+++ b/LUFA/ManPages/ChangeLog.txt
@@ -58,6 +58,7 @@
   *   - Reduced latency for executing the Start-Of-Frame events (if enabled in the user application)
   *   - Removed Pipe_ClearErrorFlags(), pipe error flags are now automatically cleared when Pipe_ClearError() is called
   *   - Endpoint_ResetFIFO() renamed to Endpoint_ResetEndpoint(), to be consistent with the Pipe_ResetPipe() function name
+  *   - Implemented on-demand PLL clock generation for the U4, U6 and U7 series USB AVRs when automatic PLL mode is specified
   *  - Library Applications:
   *   - Changed the XPLAINBridge software UART to use the regular timer CTC mode instead of the alternative CTC mode
   *     via the Input Capture register, to reduce user confusion