diff --git a/Bootloaders/TeensyHID/TeensyHID.c b/Bootloaders/TeensyHID/TeensyHID.c
index 84ec7aac7236d2a263a2cc3195d641b8186cc995..585cffd4df77f236cbf1e488844f71cc83c1b84a 100644
--- a/Bootloaders/TeensyHID/TeensyHID.c
+++ b/Bootloaders/TeensyHID/TeensyHID.c
@@ -52,12 +52,12 @@ int main(void)
 	while (RunBootloader)
 	  USB_USBTask();
 	
-	/* Turn off the USB interface, disconnect from the host */
-	USB_ShutDown();
+	/* Disconnect from the host - USB interface will be reset later along with the AVR */
+	USB_Detach();
 
 	/* Enable the watchdog and force a timeout to reset the AVR */
 	wdt_enable(WDTO_250MS);
-					
+
 	for (;;);
 }
 
@@ -100,53 +100,50 @@ void EVENT_USB_Device_UnhandledControlRequest(void)
 	switch (USB_ControlRequest.bRequest)
 	{
 		case REQ_SetReport:
-			if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
-			{
-				Endpoint_ClearSETUP();
-				
-				/* Wait until the command has been sent by the host */
-				while (!(Endpoint_IsOUTReceived()));
+			Endpoint_ClearSETUP();
 			
-				/* Read in the write destination address */
-				uint16_t PageAddress = Endpoint_Read_Word_LE();
+			/* Wait until the command has been sent by the host */
+			while (!(Endpoint_IsOUTReceived()));
+		
+			/* Read in the write destination address */
+			uint16_t PageAddress = Endpoint_Read_Word_LE();
+			
+			/* Check if the command is a program page command, or a start application command */
+			if (PageAddress == TEENSY_STARTAPPLICATION)
+			{
+				RunBootloader = false;
+			}
+			else
+			{
+				/* Erase the given FLASH page, ready to be programmed */
+				boot_page_erase(PageAddress);
+				boot_spm_busy_wait();
 				
-				/* Check if the command is a program page command, or a start application command */
-				if (PageAddress == TEENSY_STARTAPPLICATION)
-				{
-					RunBootloader = false;
-				}
-				else
+				/* Write each of the FLASH page's bytes in sequence */
+				for (uint8_t PageByte = 0; PageByte < SPM_PAGESIZE; PageByte += 2)
 				{
-					/* Erase the given FLASH page, ready to be programmed */
-					boot_page_erase(PageAddress);
-					boot_spm_busy_wait();
-					
-					/* Write each of the FLASH page's bytes in sequence */
-					for (uint8_t PageByte = 0; PageByte < SPM_PAGESIZE; PageByte += 2)
+					/* Check if endpoint is empty - if so clear it and wait until ready for next packet */
+					if (!(Endpoint_BytesInEndpoint()))
 					{
-						/* Check if endpoint is empty - if so clear it and wait until ready for next packet */
-						if (!(Endpoint_BytesInEndpoint()))
-						{
-							Endpoint_ClearOUT();
-							while (!(Endpoint_IsOUTReceived()));
-						}
-
-						/* Write the next data word to the FLASH page */
-						boot_page_fill(PageAddress + PageByte, Endpoint_Read_Word_LE());
+						Endpoint_ClearOUT();
+						while (!(Endpoint_IsOUTReceived()));
 					}
 
-					/* Write the filled FLASH page to memory */
-					boot_page_write(PageAddress);
-					boot_spm_busy_wait();
-
-					/* Re-enable RWW section */
-					boot_rww_enable();
+					/* Write the next data word to the FLASH page */
+					boot_page_fill(PageAddress + PageByte, Endpoint_Read_Word_LE());
 				}
 
-				Endpoint_ClearOUT();
+				/* Write the filled FLASH page to memory */
+				boot_page_write(PageAddress);
+				boot_spm_busy_wait();
 
-				Endpoint_ClearStatusStage();
+				/* Re-enable RWW section */
+				boot_rww_enable();
 			}
+
+			Endpoint_ClearOUT();
+
+			Endpoint_ClearStatusStage();
 			
 			break;
 	}
diff --git a/Bootloaders/TeensyHID/TeensyHID.h b/Bootloaders/TeensyHID/TeensyHID.h
index a05729a50a7c0b96a91774fac7b7b3babcaee82b..fe94b11167a7f9d1572174136a44a0e2bd7af77b 100644
--- a/Bootloaders/TeensyHID/TeensyHID.h
+++ b/Bootloaders/TeensyHID/TeensyHID.h
@@ -49,11 +49,6 @@
 
 		#include <LUFA/Drivers/USB/USB.h>
 		
-	/* Preprocessor Checks: */
-		#if !defined(__AVR_AT90USB162__) && !defined(__AVR_AT90USB646__)
-			#error This bootloader is not compatible with the selected AVR model.
-		#endif
-
 	/* Macros: */
 		/** HID Class specific request to send the next HID report to the device. */
 		#define REQ_SetReport             0x09
diff --git a/Bootloaders/TeensyHID/TeensyHID.txt b/Bootloaders/TeensyHID/TeensyHID.txt
index 2f97a3d630c91992a79e402aa9bd5f28f049d121..bc4e15f1c2822f85ee60736c934573297da70bc6 100644
--- a/Bootloaders/TeensyHID/TeensyHID.txt
+++ b/Bootloaders/TeensyHID/TeensyHID.txt
@@ -10,8 +10,10 @@
  *
  *  The following list indicates what microcontrollers are compatible with this demo.
  *
- *  - AT90USB646
  *  - AT90USB162
+ *  - ATMEGA32U4
+ *  - AT90USB646
+ *  - AT90USB1286
  *
  *  \section SSec_Info USB Information:
  *
@@ -47,7 +49,9 @@
  * This bootloader enumerates to the host as a HID Class device, allowing for Teensy compatible programming
  * software to load firmware onto the AVR, such as the official software at <a>http://www.pjrc.com/teensy/</a>.
  *  
- * Out of the box this bootloader builds for the AT90USB162, and will fit into 4KB of bootloader space.
+ * Out of the box this bootloader builds for the ATMEGA32U4, and will fit into 4KB of bootloader space. For other
+ * devices, the makefile will need to be updated to reflect the altered MCU model and bootloader start address. When
+ * calculating the bootloader start address, use (TARGET_FLASH_SIZE_BYTES - 4096).
  *
  * This spoofs (with permission) the official Teensy bootloader's VID and PID, so that the software remains
  * compatible with no changes.
diff --git a/Bootloaders/TeensyHID/makefile b/Bootloaders/TeensyHID/makefile
index 6f45cf543bcc4fe212de8ea55d3622bf68a3bbac..99e3b480436009cd2ec6c1bb5f670b9b4290338f 100644
--- a/Bootloaders/TeensyHID/makefile
+++ b/Bootloaders/TeensyHID/makefile
@@ -60,7 +60,7 @@
 
 
 # MCU name
-MCU = at90usb162
+MCU = atmega32u4
 
 
 # Target board (see library "Board Types" documentation, USER or blank for projects not requiring
@@ -98,7 +98,7 @@ F_CLOCK = $(F_CPU)
 
 
 # Starting byte address of the bootloader
-BOOT_START = 0xC000
+BOOT_START = 0x7000
 
 
 # Output format. (can be srec, ihex, binary)
@@ -121,7 +121,6 @@ LUFA_PATH = ../..
 
 # LUFA library compile-time options
 LUFA_OPTS  = -D USB_DEVICE_ONLY
-LUFA_OPTS += -D CONTROL_ONLY_DEVICE
 LUFA_OPTS += -D DEVICE_STATE_AS_GPIOR=0
 LUFA_OPTS += -D FIXED_CONTROL_ENDPOINT_SIZE=8
 LUFA_OPTS += -D FIXED_NUM_CONFIGURATIONS=1
diff --git a/LUFA/ManPages/ChangeLog.txt b/LUFA/ManPages/ChangeLog.txt
index ef2edbdbe3bd716dd33dff7773dd148bfe6b5ea5..3bb5489f4ae31fb04250ea2b1d0bbfc24c2b4db7 100644
--- a/LUFA/ManPages/ChangeLog.txt
+++ b/LUFA/ManPages/ChangeLog.txt
@@ -66,6 +66,7 @@
   *  - Fixed Still Image Host Class driver truncating the PIMA response code (thanks to Daniel Seibert)
   *  - Fixed USB_CurrentMode not being reset to USB_MODE_NONE when the USB interface is shut down and both Host and Device modes can be
   *    used (thanks to Daniel Levy)
+  *  - Fixed TeensyHID bootloader not enumerating to the host correctly
   *
   *  \section Sec_ChangeLog091122 Version 091122
   *