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)
        {
 
        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();
                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
        }
                #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
        }
 
 
                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();
                }
 
   *   - 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