summary refs log tree commit diff
path: root/lib/lufa/LUFA/Drivers
diff options
context:
space:
mode:
authorFabian Topfstedt <topfstedt@schneevonmorgen.com>2017-07-20 08:22:44 +0200
committerFabian Topfstedt <topfstedt@schneevonmorgen.com>2017-07-20 08:22:44 +0200
commitee43856ff7ba37ea89d1a8a4700efba4e4f69571 (patch)
treeb0ed5b538396b0b2b027e69ad8ceac443c067c79 /lib/lufa/LUFA/Drivers
parent99b6e918eab31d4f53cabc04a995da945335ac7f (diff)
parent14c5160b1a94d5dc416002791b3c207ba0dca789 (diff)
Merge https://github.com/qmk/qmk_firmware
Diffstat (limited to 'lib/lufa/LUFA/Drivers')
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/ADAFRUITU4/Board.h78
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/ADAFRUITU4/LEDs.h135
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/ATAVRUSBRF01/Board.h82
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/ATAVRUSBRF01/Buttons.h103
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/ATAVRUSBRF01/LEDs.h139
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/BENITO/Board.h82
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/BENITO/Buttons.h103
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/BENITO/LEDs.h139
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/BIGMULTIO/Board.h78
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/BIGMULTIO/LEDs.h161
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/BLACKCAT/Board.h78
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/BLACKCAT/LEDs.h139
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/BUI/Board.h78
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/BUI/LEDs.h143
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/BUMBLEB/Board.h86
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/BUMBLEB/Buttons.h105
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/BUMBLEB/Joystick.h123
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/BUMBLEB/LEDs.h149
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/CULV3/Board.h82
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/CULV3/Buttons.h103
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/CULV3/LEDs.h135
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/DUCE/Board.h78
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/DUCE/LEDs.h147
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/EVK527/Board.h90
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/EVK527/Buttons.h103
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/EVK527/Dataflash.h222
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/EVK527/Joystick.h130
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/EVK527/LEDs.h143
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/JMDBU2/Board.h82
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/JMDBU2/Buttons.h103
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/JMDBU2/LEDs.h135
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/LEONARDO/Board.h78
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/LEONARDO/LEDs.h169
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/MAXIMUS/Board.h78
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/MAXIMUS/LEDs.h139
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/MICRO/Board.h78
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/MICRO/LEDs.h169
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/MICROPENDOUS/Board.h149
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/MICROPENDOUS/Buttons.h205
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/MICROPENDOUS/LEDs.h174
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/MICROSIN162/Board.h82
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/MICROSIN162/Buttons.h103
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/MICROSIN162/LEDs.h135
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/MINIMUS/Board.h82
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/MINIMUS/Buttons.h103
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/MINIMUS/LEDs.h139
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/MULTIO/Board.h78
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/MULTIO/LEDs.h161
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/OLIMEX162/Board.h82
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/OLIMEX162/Buttons.h103
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/OLIMEX162/LEDs.h135
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/OLIMEX32U4/Board.h82
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/OLIMEX32U4/Buttons.h103
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/OLIMEX32U4/LEDs.h179
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/OLIMEXISPMK2/Board.h82
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/OLIMEXISPMK2/Buttons.h103
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/OLIMEXISPMK2/LEDs.h143
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/OLIMEXT32U4/Board.h82
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/OLIMEXT32U4/Buttons.h103
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/OLIMEXT32U4/LEDs.h169
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/POLOLUMICRO/Board.h79
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/POLOLUMICRO/LEDs.h154
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/QMK/Board.h65
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/QMK/LEDs.h194
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/RZUSBSTICK/Board.h78
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/RZUSBSTICK/LEDs.h175
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/SPARKFUN8U2/Board.h78
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/SPARKFUN8U2/LEDs.h135
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/STANGE_ISP/Board.h82
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/STANGE_ISP/Buttons.h103
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/STANGE_ISP/LEDs.h138
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/STK525/Board.h90
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/STK525/Buttons.h103
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/STK525/Dataflash.h222
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/STK525/Joystick.h130
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/STK525/LEDs.h147
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/STK526/Board.h90
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/STK526/Buttons.h103
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/STK526/Dataflash.h222
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/STK526/Joystick.h123
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/STK526/LEDs.h147
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/TEENSY/Board.h85
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/TEENSY/LEDs.h176
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/TUL/Board.h82
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/TUL/Buttons.h103
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/TUL/LEDs.h135
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/U2S/Board.h82
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/U2S/Buttons.h103
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/U2S/LEDs.h135
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/UDIP/Board.h82
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/UDIP/Buttons.h103
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/UDIP/LEDs.h163
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/UNO/Board.h84
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/UNO/LEDs.h145
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/USB2AX/Board.h105
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/USB2AX/Buttons.h120
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/USB2AX/LEDs.h218
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/USBFOO/Board.h82
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/USBFOO/Buttons.h103
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/USBFOO/LEDs.h135
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/USBKEY/Board.h90
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/USBKEY/Buttons.h103
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/USBKEY/Dataflash.h237
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/USBKEY/Joystick.h130
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/USBKEY/LEDs.h147
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/USBTINYMKII/Board.h82
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/USBTINYMKII/Buttons.h103
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/USBTINYMKII/LEDs.h143
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/XPLAIN/Board.h89
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/XPLAIN/Dataflash.h245
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/XPLAIN/LEDs.h142
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/XPLAINED_MINI/Board.h78
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/XPLAINED_MINI/LEDs.h135
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/YUN/Board.h78
-rw-r--r--lib/lufa/LUFA/Drivers/Board/AVR8/YUN/LEDs.h169
-rw-r--r--lib/lufa/LUFA/Drivers/Board/Board.h173
-rw-r--r--lib/lufa/LUFA/Drivers/Board/Buttons.h189
-rw-r--r--lib/lufa/LUFA/Drivers/Board/Dataflash.h264
-rw-r--r--lib/lufa/LUFA/Drivers/Board/Joystick.h152
-rw-r--r--lib/lufa/LUFA/Drivers/Board/LEDs.h304
-rw-r--r--lib/lufa/LUFA/Drivers/Board/Temperature.c66
-rw-r--r--lib/lufa/LUFA/Drivers/Board/Temperature.h147
-rw-r--r--lib/lufa/LUFA/Drivers/Board/UC3/EVK1100/Board.h86
-rw-r--r--lib/lufa/LUFA/Drivers/Board/UC3/EVK1100/Buttons.h117
-rw-r--r--lib/lufa/LUFA/Drivers/Board/UC3/EVK1100/Joystick.h122
-rw-r--r--lib/lufa/LUFA/Drivers/Board/UC3/EVK1100/LEDs.h173
-rw-r--r--lib/lufa/LUFA/Drivers/Board/UC3/EVK1101/Board.h86
-rw-r--r--lib/lufa/LUFA/Drivers/Board/UC3/EVK1101/Buttons.h113
-rw-r--r--lib/lufa/LUFA/Drivers/Board/UC3/EVK1101/Joystick.h131
-rw-r--r--lib/lufa/LUFA/Drivers/Board/UC3/EVK1101/LEDs.h156
-rw-r--r--lib/lufa/LUFA/Drivers/Board/UC3/EVK1104/Board.h82
-rw-r--r--lib/lufa/LUFA/Drivers/Board/UC3/EVK1104/Buttons.h109
-rw-r--r--lib/lufa/LUFA/Drivers/Board/UC3/EVK1104/LEDs.h174
-rw-r--r--lib/lufa/LUFA/Drivers/Board/UC3/UC3A3_XPLAINED/Board.h82
-rw-r--r--lib/lufa/LUFA/Drivers/Board/UC3/UC3A3_XPLAINED/Buttons.h109
-rw-r--r--lib/lufa/LUFA/Drivers/Board/UC3/UC3A3_XPLAINED/LEDs.h182
-rw-r--r--lib/lufa/LUFA/Drivers/Board/XMEGA/A3BU_XPLAINED/Board.h86
-rw-r--r--lib/lufa/LUFA/Drivers/Board/XMEGA/A3BU_XPLAINED/Buttons.h119
-rw-r--r--lib/lufa/LUFA/Drivers/Board/XMEGA/A3BU_XPLAINED/Dataflash.h228
-rw-r--r--lib/lufa/LUFA/Drivers/Board/XMEGA/A3BU_XPLAINED/LEDs.h181
-rw-r--r--lib/lufa/LUFA/Drivers/Board/XMEGA/B1_XPLAINED/Board.h86
-rw-r--r--lib/lufa/LUFA/Drivers/Board/XMEGA/B1_XPLAINED/Buttons.h119
-rw-r--r--lib/lufa/LUFA/Drivers/Board/XMEGA/B1_XPLAINED/Dataflash.h229
-rw-r--r--lib/lufa/LUFA/Drivers/Board/XMEGA/B1_XPLAINED/LEDs.h183
-rw-r--r--lib/lufa/LUFA/Drivers/Board/XMEGA/C3_XPLAINED/Board.h83
-rw-r--r--lib/lufa/LUFA/Drivers/Board/XMEGA/C3_XPLAINED/Buttons.h109
-rw-r--r--lib/lufa/LUFA/Drivers/Board/XMEGA/C3_XPLAINED/LEDs.h181
-rw-r--r--lib/lufa/LUFA/Drivers/Misc/AT45DB321C.h100
-rw-r--r--lib/lufa/LUFA/Drivers/Misc/AT45DB642D.h116
-rw-r--r--lib/lufa/LUFA/Drivers/Misc/RingBuffer.h308
-rw-r--r--lib/lufa/LUFA/Drivers/Misc/TerminalCodes.h231
-rw-r--r--lib/lufa/LUFA/Drivers/Peripheral/ADC.h75
-rw-r--r--lib/lufa/LUFA/Drivers/Peripheral/AVR8/ADC_AVR8.h446
-rw-r--r--lib/lufa/LUFA/Drivers/Peripheral/AVR8/SPI_AVR8.h258
-rw-r--r--lib/lufa/LUFA/Drivers/Peripheral/AVR8/SerialSPI_AVR8.h208
-rw-r--r--lib/lufa/LUFA/Drivers/Peripheral/AVR8/Serial_AVR8.c121
-rw-r--r--lib/lufa/LUFA/Drivers/Peripheral/AVR8/Serial_AVR8.h271
-rw-r--r--lib/lufa/LUFA/Drivers/Peripheral/AVR8/TWI_AVR8.c209
-rw-r--r--lib/lufa/LUFA/Drivers/Peripheral/AVR8/TWI_AVR8.h305
-rw-r--r--lib/lufa/LUFA/Drivers/Peripheral/SPI.h76
-rw-r--r--lib/lufa/LUFA/Drivers/Peripheral/Serial.h76
-rw-r--r--lib/lufa/LUFA/Drivers/Peripheral/SerialSPI.h76
-rw-r--r--lib/lufa/LUFA/Drivers/Peripheral/TWI.h76
-rw-r--r--lib/lufa/LUFA/Drivers/Peripheral/XMEGA/SPI_XMEGA.h251
-rw-r--r--lib/lufa/LUFA/Drivers/Peripheral/XMEGA/SerialSPI_XMEGA.h212
-rw-r--r--lib/lufa/LUFA/Drivers/Peripheral/XMEGA/Serial_XMEGA.c126
-rw-r--r--lib/lufa/LUFA/Drivers/Peripheral/XMEGA/Serial_XMEGA.h289
-rw-r--r--lib/lufa/LUFA/Drivers/Peripheral/XMEGA/TWI_XMEGA.c185
-rw-r--r--lib/lufa/LUFA/Drivers/Peripheral/XMEGA/TWI_XMEGA.h302
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Class/AndroidAccessoryClass.h77
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Class/AudioClass.h81
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Class/CDCClass.h81
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Class/Common/AndroidAccessoryClassCommon.h129
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Class/Common/AudioClassCommon.h780
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Class/Common/CDCClassCommon.h391
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Class/Common/HIDClassCommon.h681
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Class/Common/HIDParser.c389
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Class/Common/HIDParser.h364
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Class/Common/HIDReportData.h126
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Class/Common/MIDIClassCommon.h363
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Class/Common/MassStorageClassCommon.h368
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Class/Common/PrinterClassCommon.h119
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Class/Common/RNDISClassCommon.h411
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Class/Common/StillImageClassCommon.h161
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Class/Device/AudioClassDevice.c197
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Class/Device/AudioClassDevice.h396
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Class/Device/CDCClassDevice.c362
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Class/Device/CDCClassDevice.h386
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Class/Device/HIDClassDevice.c211
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Class/Device/HIDClassDevice.h210
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Class/Device/MIDIClassDevice.c131
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Class/Device/MIDIClassDevice.h175
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.c215
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.h161
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Class/Device/PrinterClassDevice.c314
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Class/Device/PrinterClassDevice.h293
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Class/Device/RNDISClassDevice.c508
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Class/Device/RNDISClassDevice.h207
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Class/HIDClass.h82
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Class/Host/AndroidAccessoryClassHost.c422
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Class/Host/AndroidAccessoryClassHost.h314
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Class/Host/AudioClassHost.c223
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Class/Host/AudioClassHost.h411
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Class/Host/CDCClassHost.c512
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Class/Host/CDCClassHost.h385
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Class/Host/HIDClassHost.c399
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Class/Host/HIDClassHost.h313
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Class/Host/MIDIClassHost.c231
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Class/Host/MIDIClassHost.h190
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Class/Host/MassStorageClassHost.c579
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Class/Host/MassStorageClassHost.h335
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Class/Host/PrinterClassHost.c400
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Class/Host/PrinterClassHost.h285
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Class/Host/RNDISClassHost.c476
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Class/Host/RNDISClassHost.h270
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Class/Host/StillImageClassHost.c436
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Class/Host/StillImageClassHost.h317
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Class/MIDIClass.h84
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Class/MassStorageClass.h81
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Class/PrinterClass.h83
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Class/RNDISClass.h81
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Class/StillImageClass.h76
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Core/AVR8/Device_AVR8.c57
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Core/AVR8/Device_AVR8.h269
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.c275
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.h658
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.c201
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.h819
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Core/AVR8/Host_AVR8.c297
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Core/AVR8/Host_AVR8.h372
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Core/AVR8/OTG_AVR8.h159
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.c221
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.h442
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.c210
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.h922
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Core/AVR8/Template/Template_Endpoint_Control_R.c84
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Core/AVR8/Template/Template_Endpoint_Control_W.c95
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Core/AVR8/Template/Template_Endpoint_RW.c89
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Core/AVR8/Template/Template_Pipe_RW.c88
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.c273
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.h432
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.c279
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.h375
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Core/ConfigDescriptors.c146
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Core/ConfigDescriptors.h287
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Core/Device.h159
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Core/DeviceStandardReq.c393
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Core/DeviceStandardReq.h158
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Core/Endpoint.h130
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Core/EndpointStream.h124
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Core/Events.c39
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Core/Events.h372
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Core/Host.h139
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Core/HostStandardReq.c322
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Core/HostStandardReq.h292
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Core/OTG.h80
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Core/Pipe.h144
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Core/PipeStream.h100
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Core/StdDescriptors.h765
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Core/StdRequestType.h258
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Core/UC3/Device_UC3.c51
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Core/UC3/Device_UC3.h267
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Core/UC3/EndpointStream_UC3.c235
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Core/UC3/EndpointStream_UC3.h438
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Core/UC3/Endpoint_UC3.c196
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Core/UC3/Endpoint_UC3.h794
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Core/UC3/Host_UC3.c297
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Core/UC3/Host_UC3.h363
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Core/UC3/PipeStream_UC3.c166
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Core/UC3/PipeStream_UC3.h352
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Core/UC3/Pipe_UC3.c209
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Core/UC3/Pipe_UC3.h924
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Core/UC3/Template/Template_Endpoint_Control_R.c84
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Core/UC3/Template/Template_Endpoint_Control_W.c95
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Core/UC3/Template/Template_Endpoint_RW.c89
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Core/UC3/Template/Template_Pipe_RW.c88
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Core/UC3/USBController_UC3.c222
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Core/UC3/USBController_UC3.h353
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Core/UC3/USBInterrupt_UC3.c228
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Core/UC3/USBInterrupt_UC3.h376
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Core/USBController.h165
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Core/USBInterrupt.h73
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Core/USBMode.h283
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Core/USBTask.c89
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Core/USBTask.h200
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Core/XMEGA/Device_XMEGA.c49
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Core/XMEGA/Device_XMEGA.h266
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Core/XMEGA/EndpointStream_XMEGA.c275
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Core/XMEGA/EndpointStream_XMEGA.h658
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Core/XMEGA/Endpoint_XMEGA.c268
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Core/XMEGA/Endpoint_XMEGA.h689
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Core/XMEGA/Host_XMEGA.c41
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Core/XMEGA/PipeStream_XMEGA.c41
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Core/XMEGA/Pipe_XMEGA.c37
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Core/XMEGA/Template/Template_Endpoint_Control_R.c86
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Core/XMEGA/Template/Template_Endpoint_Control_W.c97
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Core/XMEGA/Template/Template_Endpoint_RW.c89
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Core/XMEGA/USBController_XMEGA.c204
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Core/XMEGA/USBController_XMEGA.h313
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Core/XMEGA/USBInterrupt_XMEGA.c106
-rw-r--r--lib/lufa/LUFA/Drivers/USB/Core/XMEGA/USBInterrupt_XMEGA.h172
-rw-r--r--lib/lufa/LUFA/Drivers/USB/USB.h422
302 files changed, 59097 insertions, 0 deletions
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/ADAFRUITU4/Board.h b/lib/lufa/LUFA/Drivers/Board/AVR8/ADAFRUITU4/Board.h
new file mode 100644
index 0000000000..a640ddcc2f
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/ADAFRUITU4/Board.h
@@ -0,0 +1,78 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific information header for the Adafruit U4 Breakout board.
+ *  \copydetails Group_BoardInfo_ADAFRUITU4
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the Board driver
+ *        dispatch header located in LUFA/Drivers/Board/Board.h.
+ */
+
+/** \ingroup Group_BoardInfo
+ *  \defgroup Group_BoardInfo_ADAFRUITU4 ADAFRUITU4
+ *  \brief Board specific information header for the Adafruit U4 Breakout board.
+ *
+ *  Board specific information header for the Adafruit U4 Breakout board (http://ladyada.net/products/atmega32u4breakout).
+ *
+ *  @{
+ */
+
+#ifndef __BOARD_ADAFRUITU4_H__
+#define __BOARD_ADAFRUITU4_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+		#include "../../LEDs.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_BOARD_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Indicates the board has hardware LEDs mounted. */
+			#define BOARD_HAS_LEDS
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/ADAFRUITU4/LEDs.h b/lib/lufa/LUFA/Drivers/Board/AVR8/ADAFRUITU4/LEDs.h
new file mode 100644
index 0000000000..be7180c052
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/ADAFRUITU4/LEDs.h
@@ -0,0 +1,135 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific LED driver header for the Adafruit U4 Breakout board.
+ *  \copydetails Group_LEDs_ADAFRUITU4
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the LEDs driver
+ *        dispatch header located in LUFA/Drivers/Board/LEDs.h.
+ */
+
+/** \ingroup Group_LEDs
+ *  \defgroup Group_LEDs_ADAFRUITU4 ADAFRUITU4
+ *  \brief Board specific LED driver header for the Adafruit U4 Breakout board.
+ *
+ *  Board specific LED driver header for the Adafruit U4 Breakout board (http://ladyada.net/products/atmega32u4breakout).
+ *
+ *  <table>
+ *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr>
+ *    <tr><td>LEDS_LED1</td><td>Green</td><td>General Indicator</td><td>High</td><td>PORTE.6</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __LEDS_ADAFRUITU4_H__
+#define __LEDS_ADAFRUITU4_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_LEDS_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/LEDS.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** LED mask for the first LED on the board. */
+			#define LEDS_LED1        (1 << 6)
+
+			/** LED mask for all the LEDs on the board. */
+			#define LEDS_ALL_LEDS    LEDS_LED1
+
+			/** LED mask for the none of the board LEDs. */
+			#define LEDS_NO_LEDS     0
+
+		/* Inline Functions: */
+		#if !defined(__DOXYGEN__)
+			static inline void LEDs_Init(void)
+			{
+				DDRE  |=  LEDS_ALL_LEDS;
+				PORTE &= ~LEDS_ALL_LEDS;
+         	}
+
+			static inline void LEDs_Disable(void)
+			{
+				DDRE  &= ~LEDS_ALL_LEDS;
+				PORTE &= ~LEDS_ALL_LEDS;
+         	}
+
+			static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask)
+			{
+				PORTE |= LEDMask;
+			}
+
+			static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask)
+			{
+				PORTE &= ~LEDMask;
+			}
+
+			static inline void LEDs_SetAllLEDs(const uint8_t LEDMask)
+			{
+				PORTE  = ((PORTE & ~LEDS_ALL_LEDS) | LEDMask);
+			}
+
+			static inline void LEDs_ChangeLEDs(const uint8_t LEDMask,
+			                                   const uint8_t ActiveMask)
+			{
+				PORTE  = ((PORTE & ~LEDMask) | ActiveMask);
+			}
+
+			static inline void LEDs_ToggleLEDs(const uint8_t LEDMask)
+			{
+				PINE   = LEDMask;
+			}
+
+			static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t LEDs_GetLEDs(void)
+			{
+				return (PORTE & LEDS_ALL_LEDS);
+			}
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/ATAVRUSBRF01/Board.h b/lib/lufa/LUFA/Drivers/Board/AVR8/ATAVRUSBRF01/Board.h
new file mode 100644
index 0000000000..11e6e0e676
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/ATAVRUSBRF01/Board.h
@@ -0,0 +1,82 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific information header for the Atmel ATAVRUSBRF01.
+ *  \copydetails Group_BoardInfo_ATAVRUSBRF01
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the Board driver
+ *        dispatch header located in LUFA/Drivers/Board/Board.h.
+ */
+
+/** \ingroup Group_BoardInfo
+ *  \defgroup Group_BoardInfo_ATAVRUSBRF01 ATAVRUSBRF01
+ *  \brief Board specific information header for the Atmel ATAVRUSBRF01.
+ *
+ *  Board specific information header for the Atmel ATAVRUSBRF01.
+ *
+ *  @{
+ */
+
+#ifndef __BOARD_ATAVRUSBRF01_H__
+#define __BOARD_ATAVRUSBRF01_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+		#include "../../Buttons.h"
+		#include "../../LEDs.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_BOARD_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Indicates the board has hardware Buttons mounted. */
+			#define BOARD_HAS_BUTTONS
+
+			/** Indicates the board has hardware LEDs mounted. */
+			#define BOARD_HAS_LEDS
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/ATAVRUSBRF01/Buttons.h b/lib/lufa/LUFA/Drivers/Board/AVR8/ATAVRUSBRF01/Buttons.h
new file mode 100644
index 0000000000..7d5a48bb9a
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/ATAVRUSBRF01/Buttons.h
@@ -0,0 +1,103 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific Buttons driver header for the Atmel ATAVRUSBRF01.
+ *  \copydetails Group_Buttons_ATAVRUSBRF01
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the Buttons driver
+ *        dispatch header located in LUFA/Drivers/Board/Buttons.h.
+ */
+
+/** \ingroup Group_Buttons
+ *  \defgroup Group_Buttons_ATAVRUSBRF01 ATAVRUSBRF01
+ *  \brief Board specific Buttons driver header for the Atmel ATAVRUSBRF01.
+ *
+ *  Board specific Buttons driver header for the Atmel ATAVRUSBRF01.
+ *
+ *  <table>
+ *    <tr><th>Name</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr>
+ *    <tr><td>BUTTONS_BUTTON1</td><td>HWB Button</td><td>Low</td><td>PORTD.7</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __BUTTONS_ATAVRUSBRF01_H__
+#define __BUTTONS_ATAVRUSBRF01_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_BUTTONS_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Buttons.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Button mask for the first button on the board. */
+			#define BUTTONS_BUTTON1      (1 << 7)
+
+		/* Inline Functions: */
+		#if !defined(__DOXYGEN__)
+			static inline void Buttons_Init(void)
+			{
+				DDRD  &= ~BUTTONS_BUTTON1;
+				PORTD |=  BUTTONS_BUTTON1;
+			}
+
+			static inline void Buttons_Disable(void)
+			{
+				DDRD  &= ~BUTTONS_BUTTON1;
+				PORTD &= ~BUTTONS_BUTTON1;
+			}
+
+			static inline uint8_t Buttons_GetStatus(void) ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t Buttons_GetStatus(void)
+			{
+				return ((PIND & BUTTONS_BUTTON1) ^ BUTTONS_BUTTON1);
+			}
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/ATAVRUSBRF01/LEDs.h b/lib/lufa/LUFA/Drivers/Board/AVR8/ATAVRUSBRF01/LEDs.h
new file mode 100644
index 0000000000..cd7bff7885
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/ATAVRUSBRF01/LEDs.h
@@ -0,0 +1,139 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific LED driver header for the Atmel ATAVRUSBRF01.
+ *  \copydetails Group_LEDs_ATAVRUSBRF01
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the LEDs driver
+ *        dispatch header located in LUFA/Drivers/Board/LEDs.h.
+ */
+
+/** \ingroup Group_LEDs
+ *  \defgroup Group_LEDs_ATAVRUSBRF01 ATAVRUSBRF01
+ *  \brief Board specific LED driver header for the Atmel ATAVRUSBRF01.
+ *
+ *  Board specific LED driver header for the Atmel ATAVRUSBRF01.
+ *
+ *  <table>
+ *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr>
+ *    <tr><td>LEDS_LED1</td><td>Green</td><td>RX LED</td><td>High</td><td>PORTD.0</td></tr>
+ *    <tr><td>LEDS_LED2</td><td>Red</td><td>TX LED</td><td>High</td><td>PORTD.1</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __LEDS_ATAVRUSBRF01_H__
+#define __LEDS_ATAVRUSBRF01_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_LEDS_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/LEDS.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** LED mask for the first LED on the board. */
+			#define LEDS_LED1        (1 << 0)
+
+			/** LED mask for the second LED on the board. */
+			#define LEDS_LED2        (1 << 1)
+
+			/** LED mask for all the LEDs on the board. */
+			#define LEDS_ALL_LEDS    (LEDS_LED1 | LEDS_LED2)
+
+			/** LED mask for none of the board LEDs. */
+			#define LEDS_NO_LEDS     0
+
+		/* Inline Functions: */
+		#if !defined(__DOXYGEN__)
+			static inline void LEDs_Init(void)
+			{
+				DDRD  |=  LEDS_ALL_LEDS;
+				PORTD &= ~LEDS_ALL_LEDS;
+			}
+
+			static inline void LEDs_Disable(void)
+			{
+				DDRD  &= ~LEDS_ALL_LEDS;
+				PORTD &= ~LEDS_ALL_LEDS;
+			}
+
+			static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask)
+			{
+				PORTD |= (LEDMask & LEDS_ALL_LEDS);
+			}
+
+			static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask)
+			{
+				PORTD &= ~(LEDMask & LEDS_ALL_LEDS);
+			}
+
+			static inline void LEDs_SetAllLEDs(const uint8_t LEDMask)
+			{
+				PORTD = (PORTD & ~LEDS_ALL_LEDS) | (LEDMask & LEDS_ALL_LEDS);
+			}
+
+			static inline void LEDs_ChangeLEDs(const uint8_t LEDMask,
+			                                   const uint8_t ActiveMask)
+			{
+				PORTD = ((PORTD & ~LEDMask) | ActiveMask);
+			}
+
+			static inline void LEDs_ToggleLEDs(const uint8_t LEDMask)
+			{
+				PIND  = LEDMask;
+			}
+
+			static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t LEDs_GetLEDs(void)
+			{
+				return (PORTD & LEDS_ALL_LEDS);
+			}
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/BENITO/Board.h b/lib/lufa/LUFA/Drivers/Board/AVR8/BENITO/Board.h
new file mode 100644
index 0000000000..9f5b291aa3
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/BENITO/Board.h
@@ -0,0 +1,82 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific information header for the Tempusdictum Benito.
+ *  \copydetails Group_BoardInfo_BENITO
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the Board driver
+ *        dispatch header located in LUFA/Drivers/Board/Board.h.
+ */
+
+/** \ingroup Group_BoardInfo
+ *  \defgroup Group_BoardInfo_BENITO BENITO
+ *  \brief Board specific information header for the Tempusdictum Benito.
+ *
+ *  Board specific information header for the Tempusdictum Benito (http://dorkbotpdx.org/wiki/benito).
+ *
+ *  @{
+ */
+
+#ifndef __BOARD_BENITO_H__
+#define __BOARD_BENITO_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+		#include "../../Buttons.h"
+		#include "../../LEDs.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_BOARD_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Indicates the board has hardware Buttons mounted. */
+			#define BOARD_HAS_BUTTONS
+
+			/** Indicates the board has hardware LEDs mounted. */
+			#define BOARD_HAS_LEDS
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/BENITO/Buttons.h b/lib/lufa/LUFA/Drivers/Board/AVR8/BENITO/Buttons.h
new file mode 100644
index 0000000000..5e9128eb34
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/BENITO/Buttons.h
@@ -0,0 +1,103 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific Buttons driver header for the Tempusdictum Benito.
+ *  \copydetails Group_Buttons_BENITO
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the Buttons driver
+ *        dispatch header located in LUFA/Drivers/Board/Buttons.h.
+ */
+
+/** \ingroup Group_Buttons
+ *  \defgroup Group_Buttons_BENITO BENITO
+ *  \brief Board specific Buttons driver header for the Tempusdictum Benito.
+ *
+ *  Board specific Buttons driver header for the Tempusdictum Benito (http://dorkbotpdx.org/wiki/benito).
+ *
+ *  <table>
+ *    <tr><th>Name</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr>
+ *    <tr><td>BUTTONS_BUTTON1</td><td>HWB Button</td><td>Low</td><td>PORTD.7</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __BUTTONS_BENITO_H__
+#define __BUTTONS_BENITO_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_BUTTONS_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Buttons.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Button mask for the first button on the board. */
+			#define BUTTONS_BUTTON1      (1 << 7)
+
+		/* Inline Functions: */
+		#if !defined(__DOXYGEN__)
+			static inline void Buttons_Init(void)
+			{
+				DDRD  &= ~BUTTONS_BUTTON1;
+				PORTD |=  BUTTONS_BUTTON1;
+			}
+
+			static inline void Buttons_Disable(void)
+			{
+				DDRD  &= ~BUTTONS_BUTTON1;
+				PORTD &= ~BUTTONS_BUTTON1;
+			}
+
+			static inline uint8_t Buttons_GetStatus(void) ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t Buttons_GetStatus(void)
+			{
+				return ((PIND & BUTTONS_BUTTON1) ^ BUTTONS_BUTTON1);
+			}
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/BENITO/LEDs.h b/lib/lufa/LUFA/Drivers/Board/AVR8/BENITO/LEDs.h
new file mode 100644
index 0000000000..f968d7ce89
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/BENITO/LEDs.h
@@ -0,0 +1,139 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific LED driver header for the Tempusdictum Benito.
+ *  \copydetails Group_LEDs_BENITO
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the LEDs driver
+ *        dispatch header located in LUFA/Drivers/Board/LEDs.h.
+ */
+
+/** \ingroup Group_LEDs
+ *  \defgroup Group_LEDs_BENITO BENITO
+ *  \brief Board specific LED driver header for the Tempusdictum Benito.
+ *
+ *  Board specific LED driver header for the Tempusdictum Benito (http://dorkbotpdx.org/wiki/benito).
+ *
+ *  <table>
+ *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr>
+ *    <tr><td>LEDS_LED1</td><td>Green</td><td>TX LED</td><td>Low</td><td>PORTC.7</td></tr>
+ *    <tr><td>LEDS_LED2</td><td>Red</td><td>RX LED</td><td>Low</td><td>PORTC.6</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __LEDS_BENITO_H__
+#define __LEDS_BENITO_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_LEDS_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/LEDS.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** LED mask for the first LED on the board. */
+			#define LEDS_LED1        (1 << 7)
+
+			/** LED mask for the second LED on the board. */
+			#define LEDS_LED2        (1 << 6)
+
+			/** LED mask for all the LEDs on the board. */
+			#define LEDS_ALL_LEDS    (LEDS_LED1 | LEDS_LED2)
+
+			/** LED mask for none of the board LEDs. */
+			#define LEDS_NO_LEDS     0
+
+		/* Inline Functions: */
+		#if !defined(__DOXYGEN__)
+			static inline void LEDs_Init(void)
+			{
+				DDRC  |= LEDS_ALL_LEDS;
+				PORTC |= LEDS_ALL_LEDS;
+			}
+
+			static inline void LEDs_Disable(void)
+			{
+				DDRC  &= ~LEDS_ALL_LEDS;
+				PORTC &= ~LEDS_ALL_LEDS;
+			}
+
+			static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask)
+			{
+				PORTC &= ~LEDMask;
+			}
+
+			static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask)
+			{
+				PORTC |= LEDMask;
+			}
+
+			static inline void LEDs_SetAllLEDs(const uint8_t LEDMask)
+			{
+				PORTC = ((PORTC | LEDS_ALL_LEDS) & ~LEDMask);
+			}
+
+			static inline void LEDs_ChangeLEDs(const uint8_t LEDMask,
+			                                   const uint8_t ActiveMask)
+			{
+				PORTC = ((PORTC | LEDMask) & ~ActiveMask);
+			}
+
+			static inline void LEDs_ToggleLEDs(const uint8_t LEDMask)
+			{
+				PINC  = LEDMask;
+			}
+
+			static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t LEDs_GetLEDs(void)
+			{
+				return (~PORTC & LEDS_ALL_LEDS);
+			}
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/BIGMULTIO/Board.h b/lib/lufa/LUFA/Drivers/Board/AVR8/BIGMULTIO/Board.h
new file mode 100644
index 0000000000..02ebe0941c
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/BIGMULTIO/Board.h
@@ -0,0 +1,78 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific information header for the Bitwizard Big-Multio.
+ *  \copydetails Group_BoardInfo_BIGMULTIO
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the Board driver
+ *        dispatch header located in LUFA/Drivers/Board/Board.h.
+ */
+
+/** \ingroup Group_BoardInfo
+ *  \defgroup Group_BoardInfo_BIGMULTIO BIGMULTIO
+ *  \brief Board specific information header for the Bitwizard Big-Multio.
+ *
+ *  Board specific information header for the Bitwizard Big-Multio (http://www.bitwizard.nl/wiki/index.php/Usbbigmultio).
+ *
+ *  @{
+ */
+
+#ifndef __BOARD_BIGMULTIO_H__
+#define __BOARD_BIGMULTIO_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+		#include "../../LEDs.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_BOARD_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Indicates the board has hardware LEDs mounted. */
+			#define BOARD_HAS_LEDS
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/BIGMULTIO/LEDs.h b/lib/lufa/LUFA/Drivers/Board/AVR8/BIGMULTIO/LEDs.h
new file mode 100644
index 0000000000..93048f5640
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/BIGMULTIO/LEDs.h
@@ -0,0 +1,161 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific LED driver header for the Bitwizard Big-Multio.
+ *  \copydetails Group_LEDs_BIGMULTIO
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the LEDs driver
+ *        dispatch header located in LUFA/Drivers/Board/LEDs.h.
+ */
+
+/** \ingroup Group_LEDs
+ *  \defgroup Group_LEDs_BIGMULTIO BIGMULTIO
+ *  \brief Board specific LED driver header for the Bitwizard Big-Multio.
+ *
+ *  Board specific LED driver header for the Bitwizard Big-Multio (http://www.bitwizard.nl/wiki/index.php/Usbbigmultio).
+ *
+ *  <table>
+ *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr>
+ *    <tr><td>LEDS_LED1</td><td>Unknown</td><td>LED0</td><td>High</td><td>PORTF.6</td></tr>
+ *    <tr><td>LEDS_LED2</td><td>Unknown</td><td>LED1</td><td>High</td><td>PORTF.7</td></tr>
+ *    <tr><td>LEDS_LED3</td><td>Unknown</td><td>LED2</td><td>High</td><td>PORTE.2</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __LEDS_BIGMULTIO_H__
+#define __LEDS_BIGMULTIO_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_LEDS_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/LEDS.h instead.
+		#endif
+
+	/* Private Interface - For use in library only: */
+	#if !defined(__DOXYGEN__)
+		/* Macros: */
+			#define LEDS_PORTF_LEDS       (LEDS_LED1 | LEDS_LED2)
+			#define LEDS_PORTE_LEDS       LEDS_LED3
+	#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** LED mask for the first LED on the board. */
+			#define LEDS_LED1        (1 << 6)
+
+			/** LED mask for the second LED on the board. */
+			#define LEDS_LED2        (1 << 7)
+
+			/** LED mask for the second LED on the board. */
+			#define LEDS_LED3        (1 << 2)
+
+			/** LED mask for all the LEDs on the board. */
+			#define LEDS_ALL_LEDS    (LEDS_LED1 | LEDS_LED2 | LEDS_LED3)
+
+			/** LED mask for none of the board LEDs. */
+			#define LEDS_NO_LEDS     0
+
+		/* Inline Functions: */
+		#if !defined(__DOXYGEN__)
+			static inline void LEDs_Init(void)
+			{
+				DDRF  |=  LEDS_PORTF_LEDS;
+				DDRE  |=  LEDS_PORTE_LEDS;
+
+				PORTF &= ~LEDS_PORTF_LEDS;
+				PORTE &= ~LEDS_PORTE_LEDS;
+			}
+
+			static inline void LEDs_Disable(void)
+			{
+				DDRF  &= ~LEDS_PORTF_LEDS;
+				DDRE  &= ~LEDS_PORTE_LEDS;
+
+				PORTF &= ~LEDS_PORTF_LEDS;
+				PORTE &= ~LEDS_PORTE_LEDS;
+			}
+
+			static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask)
+			{
+				PORTF |= (LEDMask & LEDS_PORTF_LEDS);
+				PORTE |= (LEDMask & LEDS_PORTE_LEDS);
+			}
+
+			static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask)
+			{
+				PORTF &= ~(LEDMask & LEDS_PORTF_LEDS);
+				PORTE &= ~(LEDMask & LEDS_PORTE_LEDS);
+			}
+
+			static inline void LEDs_SetAllLEDs(const uint8_t LEDMask)
+			{
+				PORTF = (PORTF & ~LEDS_PORTF_LEDS) | (LEDMask & LEDS_PORTF_LEDS);
+				PORTE = (PORTE & ~LEDS_PORTE_LEDS) | (LEDMask & LEDS_PORTE_LEDS);
+			}
+
+			static inline void LEDs_ChangeLEDs(const uint8_t LEDMask,
+			                                   const uint8_t ActiveMask)
+			{
+				PORTF = (PORTF & ~(LEDMask & LEDS_PORTF_LEDS)) | (ActiveMask & LEDS_PORTF_LEDS);
+				PORTE = (PORTE & ~(LEDMask & LEDS_PORTE_LEDS)) | (ActiveMask & LEDS_PORTE_LEDS);
+			}
+
+			static inline void LEDs_ToggleLEDs(const uint8_t LEDMask)
+			{
+				PINF  = (LEDMask & LEDS_PORTF_LEDS);
+				PINE  = (LEDMask & LEDS_PORTE_LEDS);
+			}
+
+			static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t LEDs_GetLEDs(void)
+			{
+				return ((PORTF & LEDS_PORTF_LEDS) | (PORTE & LEDS_PORTE_LEDS));
+			}
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/BLACKCAT/Board.h b/lib/lufa/LUFA/Drivers/Board/AVR8/BLACKCAT/Board.h
new file mode 100644
index 0000000000..a9aef6e9eb
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/BLACKCAT/Board.h
@@ -0,0 +1,78 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific information header for the BLACKCAT USB JTAG.
+ *  \copydetails Group_BoardInfo_BLACKCAT
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the Board driver
+ *        dispatch header located in LUFA/Drivers/Board/Board.h.
+ */
+
+/** \ingroup Group_BoardInfo
+ *  \defgroup Group_BoardInfo_BLACKCAT BLACKCAT
+ *  \brief Board specific information header for the BLACKCAT USB JTAG.
+ *
+ *  Board specific information header for the TCNISO Blackcat USB JTAG (http://www.embeddedcomputers.net/products/BlackcatUSB).
+ *
+ *  @{
+ */
+
+#ifndef __BOARD_BLACKCAT_H__
+#define __BOARD_BLACKCAT_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+		#include "../../LEDs.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_BOARD_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Indicates the board has hardware LEDs mounted. */
+			#define BOARD_HAS_LEDS
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/BLACKCAT/LEDs.h b/lib/lufa/LUFA/Drivers/Board/AVR8/BLACKCAT/LEDs.h
new file mode 100644
index 0000000000..5a7c4f2332
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/BLACKCAT/LEDs.h
@@ -0,0 +1,139 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific LED driver header for the BLACKCAT USB JTAG.
+ *  \copydetails Group_LEDs_BLACKCAT
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the LEDs driver
+ *        dispatch header located in LUFA/Drivers/Board/LEDs.h.
+ */
+
+/** \ingroup Group_LEDs
+ *  \defgroup Group_LEDs_BLACKCAT BLACKCAT
+ *  \brief Board specific LED driver header for the BLACKCAT USB JTAG.
+ *
+ *  Board specific LED driver header for the TCNISO Blackcat USB JTAG (http://www.embeddedcomputers.net/products/BlackcatUSB).
+ *
+ *  <table>
+ *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr>
+ *    <tr><td>LEDS_LED1</td><td>Unknown</td><td>LED0</td><td>High</td><td>PORTD.6</td></tr>
+ *    <tr><td>LEDS_LED2</td><td>Unknown</td><td>LED1</td><td>High</td><td>PORTD.3</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __LEDS_BLACKCAT_H__
+#define __LEDS_BLACKCAT_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_LEDS_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/LEDS.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** LED mask for the first LED on the board. */
+			#define LEDS_LED1        (1 << 6)
+
+			/** LED mask for the second LED on the board. */
+			#define LEDS_LED2        (1 << 3)
+
+			/** LED mask for all the LEDs on the board. */
+			#define LEDS_ALL_LEDS    (LEDS_LED1 | LEDS_LED2)
+
+			/** LED mask for none of the board LEDs. */
+			#define LEDS_NO_LEDS     0
+
+		/* Inline Functions: */
+		#if !defined(__DOXYGEN__)
+			static inline void LEDs_Init(void)
+			{
+				DDRD  |=  LEDS_ALL_LEDS;
+				PORTD &= ~LEDS_ALL_LEDS;
+			}
+
+			static inline void LEDs_Disable(void)
+			{
+				DDRD  &= ~LEDS_ALL_LEDS;
+				PORTD &= ~LEDS_ALL_LEDS;
+			}
+
+			static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask)
+			{
+				PORTD |= LEDMask;
+			}
+
+			static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask)
+			{
+				PORTD &= ~LEDMask;
+			}
+
+			static inline void LEDs_SetAllLEDs(const uint8_t LEDMask)
+			{
+				PORTD = ((PORTD & ~LEDS_ALL_LEDS) | LEDMask);
+			}
+
+			static inline void LEDs_ChangeLEDs(const uint8_t LEDMask,
+			                                   const uint8_t ActiveMask)
+			{
+				PORTD = ((PORTD & ~LEDMask) | ActiveMask);
+			}
+
+			static inline void LEDs_ToggleLEDs(const uint8_t LEDMask)
+			{
+				PIND  = LEDMask;
+			}
+
+			static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t LEDs_GetLEDs(void)
+			{
+				return (PORTD & LEDS_ALL_LEDS);
+			}
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/BUI/Board.h b/lib/lufa/LUFA/Drivers/Board/AVR8/BUI/Board.h
new file mode 100644
index 0000000000..87102b60f7
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/BUI/Board.h
@@ -0,0 +1,78 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific information header for the Busware BUI.
+ *  \copydetails Group_BoardInfo_BUI
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the Board driver
+ *        dispatch header located in LUFA/Drivers/Board/Board.h.
+ */
+
+/** \ingroup Group_BoardInfo
+ *  \defgroup Group_BoardInfo_BUI BUI
+ *  \brief Board specific information header for the Busware BUI.
+ *
+ *  Board specific information header for the Busware BUI (http://www.busware.de/tiki-index.php?page=BUI).
+ *
+ *  @{
+ */
+
+#ifndef __BOARD_BUI_H__
+#define __BOARD_BUI_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+		#include "../../LEDs.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_BOARD_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Indicates the board has hardware LEDs mounted. */
+			#define BOARD_HAS_LEDS
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/BUI/LEDs.h b/lib/lufa/LUFA/Drivers/Board/AVR8/BUI/LEDs.h
new file mode 100644
index 0000000000..d982bcd67d
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/BUI/LEDs.h
@@ -0,0 +1,143 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific LED driver header for the Busware BUI.
+ *  \copydetails Group_LEDs_BUI
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the LEDs driver
+ *        dispatch header located in LUFA/Drivers/Board/LEDs.h.
+ */
+
+/** \ingroup Group_LEDs
+ *  \defgroup Group_LEDs_BUI BUI
+ *  \brief Board specific LED driver header for the Busware BUI.
+ *
+ *  Board specific LED driver header for the Busware BUI (http://www.busware.de/tiki-index.php?page=BUI).
+ *
+ *  <table>
+ *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr>
+ *    <tr><td>LEDS_LED1</td><td>Red</td><td>RGB LED</td><td>High</td><td>PORTC.2</td></tr>
+ *    <tr><td>LEDS_LED2</td><td>Green</td><td>RGB LED</td><td>High</td><td>PORTC.3</td></tr>
+ *    <tr><td>LEDS_LED3</td><td>Blue</td><td>RGB LED</td><td>High</td><td>PORTC.4</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __LEDS_BUI_H__
+#define __LEDS_BUI_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+
+/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_LEDS_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/LEDS.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** LED mask for the first LED on the board. */
+			#define LEDS_LED1        (1 << 2)
+
+			/** LED mask for the second LED on the board. */
+			#define LEDS_LED2        (1 << 3)
+
+			/** LED mask for the third LED on the board. */
+			#define LEDS_LED3        (1 << 4)
+
+			/** LED mask for all the LEDs on the board. */
+			#define LEDS_ALL_LEDS    (LEDS_LED1 | LEDS_LED2 | LEDS_LED3)
+
+			/** LED mask for none of the board LEDs. */
+			#define LEDS_NO_LEDS     0
+
+		/* Inline Functions: */
+		#if !defined(__DOXYGEN__)
+			static inline void LEDs_Init(void)
+			{
+				DDRC  |=  LEDS_ALL_LEDS;
+				PORTC &= ~LEDS_ALL_LEDS;
+			}
+
+			static inline void LEDs_Disable(void)
+			{
+				DDRC  &= ~LEDS_ALL_LEDS;
+				PORTC &= ~LEDS_ALL_LEDS;
+			}
+
+			static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask)
+			{
+				PORTC |= LEDMask;
+			}
+
+			static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask)
+			{
+				PORTC &= ~LEDMask;
+			}
+
+			static inline void LEDs_SetAllLEDs(const uint8_t LEDMask)
+			{
+				PORTC = (PORTC & ~LEDS_ALL_LEDS) | LEDMask;
+			}
+
+			static inline void LEDs_ChangeLEDs(const uint8_t LEDMask,
+			                                   const uint8_t ActiveMask)
+			{
+				PORTC = (PORTC & ~LEDMask) | ActiveMask;
+			}
+
+			static inline void LEDs_ToggleLEDs(const uint8_t LEDMask)
+			{
+				PINC  = LEDMask;
+			}
+
+			static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t LEDs_GetLEDs(void)
+			{
+				return (PORTC & LEDS_ALL_LEDS);
+			}
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/BUMBLEB/Board.h b/lib/lufa/LUFA/Drivers/Board/AVR8/BUMBLEB/Board.h
new file mode 100644
index 0000000000..5af60abe1b
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/BUMBLEB/Board.h
@@ -0,0 +1,86 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific information header for the Fletchtronics BUMBLEB.
+ *  \copydetails Group_BoardInfo_BUMBLEB
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the Board driver
+ *        dispatch header located in LUFA/Drivers/Board/Board.h.
+ */
+
+/** \ingroup Group_BoardInfo
+ *  \defgroup Group_BoardInfo_BUMBLEB BUMBLEB
+ *  \brief Board specific information header for the Fletchtronics BUMBLEB.
+ *
+ *  Board specific information header for the Fletchtronics BUMBLEB (http://fletchtronics.net/bumble-b).
+ *
+ *  @{
+ */
+
+#ifndef __BOARD_BUMBLEB_H__
+#define __BOARD_BUMBLEB_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+		#include "../../Buttons.h"
+		#include "../../Joystick.h"
+		#include "../../LEDs.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_BOARD_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Indicates the board has hardware Buttons mounted. */
+			#define BOARD_HAS_BUTTONS
+
+			/** Indicates the board has a hardware Joystick mounted. */
+			#define BOARD_HAS_JOYSTICK
+
+			/** Indicates the board has hardware LEDs mounted. */
+			#define BOARD_HAS_LEDS
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/BUMBLEB/Buttons.h b/lib/lufa/LUFA/Drivers/Board/AVR8/BUMBLEB/Buttons.h
new file mode 100644
index 0000000000..812cf79246
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/BUMBLEB/Buttons.h
@@ -0,0 +1,105 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific Buttons driver header for the Fletchtronics BUMBLEB.
+ *  \copydetails Group_Buttons_BUMBLEB
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the Buttons driver
+ *        dispatch header located in LUFA/Drivers/Board/Buttons.h.
+ */
+
+/** \ingroup Group_Buttons
+ *  \defgroup Group_Buttons_BUMBLEB BUMBLEB
+ *  \brief Board specific Buttons driver header for the Fletchtronics BUMBLEB.
+ *
+ *  Board specific buttons driver header for the Fletchtronics BUMBLEB (http://fletchtronics.net/bumble-b). The BUMBLEB
+ *  third-party board does not include any on-board peripherals, but does have an officially recommended external peripheral
+ *  layout for buttons, LEDs and a Joystick.
+ *
+ *  <table>
+ *    <tr><th>Name</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr>
+ *    <tr><td>BUTTONS_BUTTON1</td><td>HWB Button</td><td>Low</td><td>PORTD.7</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __BUTTONS_BUMBLEB_H__
+#define __BUTTONS_BUMBLEB_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_BUTTONS_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Buttons.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Button mask for the first button on the board. */
+			#define BUTTONS_BUTTON1      (1 << 7)
+
+		/* Inline Functions: */
+		#if !defined(__DOXYGEN__)
+			static inline void Buttons_Init(void)
+			{
+				DDRD  &= ~BUTTONS_BUTTON1;
+				PORTD |=  BUTTONS_BUTTON1;
+			}
+
+			static inline void Buttons_Disable(void)
+			{
+				DDRD  &= ~BUTTONS_BUTTON1;
+				PORTD &= ~BUTTONS_BUTTON1;
+			}
+
+			static inline uint8_t Buttons_GetStatus(void) ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t Buttons_GetStatus(void)
+			{
+				return ((PIND & BUTTONS_BUTTON1) ^ BUTTONS_BUTTON1);
+			}
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/BUMBLEB/Joystick.h b/lib/lufa/LUFA/Drivers/Board/AVR8/BUMBLEB/Joystick.h
new file mode 100644
index 0000000000..259c674d6e
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/BUMBLEB/Joystick.h
@@ -0,0 +1,123 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific joystick driver header for the Fletchtronics BUMBLEB.
+ *  \copydetails Group_Joystick_BUMBLEB
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the joystick driver
+ *        dispatch header located in LUFA/Drivers/Board/Joystick.h.
+ */
+
+/** \ingroup Group_Joystick
+ *  \defgroup Group_Joystick_BUMBLEB BUMBLEB
+ *  \brief Board specific joystick driver header for the Fletchtronics BUMBLEB.
+ *
+ *  Board specific joystick driver header for the Fletchtronics BUMBLEB (http://fletchtronics.net/bumble-b). The BUMBLEB
+ *  third-party board does not include any on-board peripherals, but does have an officially recommended external peripheral
+ *  layout for buttons, LEDs and a Joystick.
+ *
+ *  <table>
+ *    <tr><th>Left Port Pin</th><th>Up Port Pin</th><th>Right Port Pin</th><th>Down Port Pin</th><th>Press Port Pin</th></tr>
+ *    <tr><td>PORTD.2</td><td>PORTD.3</td><td>PORTD.0</td><td>PORTD.1</td><td>PORTD.4</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __JOYSTICK_BUMBLEB_H__
+#define __JOYSTICK_BUMBLEB_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_JOYSTICK_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Joystick.h instead.
+		#endif
+
+	/* Private Interface - For use in library only: */
+	#if !defined(__DOXYGEN__)
+		/* Macros: */
+			#define JOY_MASK                 ((1 << 0) | (1 << 1) | (1 << 2) | (1 << 3) | (1 << 4))
+	#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Mask for the joystick being pushed in the left direction. */
+			#define JOY_LEFT                  (1 << 2)
+
+			/** Mask for the joystick being pushed in the upward direction. */
+			#define JOY_UP                    (1 << 3)
+
+			/** Mask for the joystick being pushed in the right direction. */
+			#define JOY_RIGHT                 (1 << 0)
+
+			/** Mask for the joystick being pushed in the downward direction. */
+			#define JOY_DOWN                  (1 << 1)
+
+			/** Mask for the joystick being pushed inward. */
+			#define JOY_PRESS                 (1 << 4)
+
+		/* Inline Functions: */
+		#if !defined(__DOXYGEN__)
+			static inline void Joystick_Init(void)
+			{
+				DDRD  &= ~JOY_MASK;
+				PORTD |=  JOY_MASK;
+			}
+
+			static inline void Joystick_Disable(void)
+			{
+				DDRD  &= ~JOY_MASK;
+				PORTD &= ~JOY_MASK;
+			}
+
+			static inline uint8_t Joystick_GetStatus(void) ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t Joystick_GetStatus(void)
+			{
+				return (uint8_t)(~PIND & JOY_MASK);
+			}
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/BUMBLEB/LEDs.h b/lib/lufa/LUFA/Drivers/Board/AVR8/BUMBLEB/LEDs.h
new file mode 100644
index 0000000000..bb070db970
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/BUMBLEB/LEDs.h
@@ -0,0 +1,149 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific LED driver header for the Fletchtronics BUMBLEB.
+ *  \copydetails Group_LEDs_BUMBLEB
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the LEDs driver
+ *        dispatch header located in LUFA/Drivers/Board/LEDs.h.
+ */
+
+/** \ingroup Group_LEDs
+ *  \defgroup Group_LEDs_BUMBLEB BUMBLEB
+ *  \brief Board specific LED driver header for the Fletchtronics BUMBLEB.
+ *
+ *  Board specific LED driver header for the Fletchtronics BUMBLEB (http://fletchtronics.net/bumble-b). The BUMBLEB
+ *  third-party board does not include any on-board peripherals, but does have an officially recommended external
+ *  peripheral layout for buttons, LEDs and a Joystick.
+ *
+ *  <table>
+ *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr>
+ *    <tr><td>LEDS_LED1</td><td>N/A</td><td>User Supplied</td><td>High</td><td>PORTB.4</td></tr>
+ *    <tr><td>LEDS_LED2</td><td>N/A</td><td>User Supplied</td><td>High</td><td>PORTB.5</td></tr>
+ *    <tr><td>LEDS_LED3</td><td>N/A</td><td>User Supplied</td><td>High</td><td>PORTB.6</td></tr>
+ *    <tr><td>LEDS_LED4</td><td>N/A</td><td>User Supplied</td><td>High</td><td>PORTB.7</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __LEDS_BUMBLEB_H__
+#define __LEDS_BUMBLEB_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_LEDS_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/LEDS.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** LED mask for the first LED on the board. */
+			#define LEDS_LED1        (1 << 4)
+
+			/** LED mask for the second LED on the board. */
+			#define LEDS_LED2        (1 << 5)
+
+			/** LED mask for the third LED on the board. */
+			#define LEDS_LED3        (1 << 6)
+
+			/** LED mask for the fourth LED on the board. */
+			#define LEDS_LED4        (1 << 7)
+
+			/** LED mask for all the LEDs on the board. */
+			#define LEDS_ALL_LEDS    (LEDS_LED1 | LEDS_LED2 | LEDS_LED3 | LEDS_LED4)
+
+			/** LED mask for none of the board LEDs. */
+			#define LEDS_NO_LEDS     0
+
+		/* Inline Functions: */
+		#if !defined(__DOXYGEN__)
+			static inline void LEDs_Init(void)
+			{
+				DDRB  |=  LEDS_ALL_LEDS;
+				PORTB &= ~LEDS_ALL_LEDS;
+			}
+
+			static inline void LEDs_Disable(void)
+			{
+				DDRB  &= ~LEDS_ALL_LEDS;
+				PORTB &= ~LEDS_ALL_LEDS;
+			}
+
+			static inline void LEDs_TurnOnLEDs(const uint8_t LedMask)
+			{
+				PORTB |= LedMask;
+			}
+
+			static inline void LEDs_TurnOffLEDs(const uint8_t LedMask)
+			{
+				PORTB &= ~LedMask;
+			}
+
+			static inline void LEDs_SetAllLEDs(const uint8_t LedMask)
+			{
+				PORTB = ((PORTB & ~LEDS_ALL_LEDS) | LedMask);
+			}
+
+			static inline void LEDs_ChangeLEDs(const uint8_t LedMask,
+			                                   const uint8_t ActiveMask)
+			{
+				PORTB = ((PORTB & ~LedMask) | ActiveMask);
+			}
+
+			static inline void LEDs_ToggleLEDs(const uint8_t LEDMask)
+			{
+				PINB  = LEDMask;
+			}
+
+			static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t LEDs_GetLEDs(void)
+			{
+				return (PORTB & LEDS_ALL_LEDS);
+			}
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/CULV3/Board.h b/lib/lufa/LUFA/Drivers/Board/AVR8/CULV3/Board.h
new file mode 100644
index 0000000000..88679d1b84
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/CULV3/Board.h
@@ -0,0 +1,82 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific information header for the Busware CUL V3.
+ *  \copydetails Group_BoardInfo_CULV3
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the Board driver
+ *        dispatch header located in LUFA/Drivers/Board/Board.h.
+ */
+
+/** \ingroup Group_BoardInfo
+ *  \defgroup Group_BoardInfo_CULV3 CULV3
+ *  \brief Board specific information header for the Busware CUL V3.
+ *
+ *  Board specific information header for the Busware CUL V3 (http://busware.de/tiki-index.php?page=CUL).
+ *
+ *  @{
+ */
+
+#ifndef __BOARD_CULV3_H__
+#define __BOARD_CULV3_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+		#include "../../Buttons.h"
+		#include "../../LEDs.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_BOARD_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Indicates the board has hardware Buttons mounted. */
+			#define BOARD_HAS_BUTTONS
+
+			/** Indicates the board has hardware LEDs mounted. */
+			#define BOARD_HAS_LEDS
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/CULV3/Buttons.h b/lib/lufa/LUFA/Drivers/Board/AVR8/CULV3/Buttons.h
new file mode 100644
index 0000000000..21b6e1c08b
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/CULV3/Buttons.h
@@ -0,0 +1,103 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific LED driver header for the Busware CULV3.
+ *  \copydetails Group_LEDs_CULV3
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the Buttons driver
+ *        dispatch header located in LUFA/Drivers/Board/LEDs.h.
+ */
+
+/** \ingroup Group_Buttons
+ *  \defgroup Group_Buttons_CULV3 CULV3
+ *  \brief Board specific Buttons driver header for the Busware CULV3.
+ *
+ *  Board specific Buttons driver header for the Busware CUL V3 (http://busware.de/tiki-index.php?page=CUL).
+ *
+ *  <table>
+ *    <tr><th>Name</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr>
+ *    <tr><td>BUTTONS_BUTTON1</td><td>HWB Button</td><td>Low</td><td>PORTE.2</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __BUTTONS_CULV3_H__
+#define __BUTTONS_CULV3_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_BUTTONS_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Buttons.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Button mask for the first button on the board. */
+			#define BUTTONS_BUTTON1      (1 << 2)
+
+		/* Inline Functions: */
+		#if !defined(__DOXYGEN__)
+			static inline void Buttons_Init(void)
+			{
+				DDRE  &= ~BUTTONS_BUTTON1;
+				PORTE |=  BUTTONS_BUTTON1;
+			}
+
+			static inline void Buttons_Disable(void)
+			{
+				DDRE  &= ~BUTTONS_BUTTON1;
+				PORTE &= ~BUTTONS_BUTTON1;
+			}
+
+			static inline uint8_t Buttons_GetStatus(void) ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t Buttons_GetStatus(void)
+			{
+				return ((PINE & BUTTONS_BUTTON1) ^ BUTTONS_BUTTON1);
+			}
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/CULV3/LEDs.h b/lib/lufa/LUFA/Drivers/Board/AVR8/CULV3/LEDs.h
new file mode 100644
index 0000000000..da3ebf85f9
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/CULV3/LEDs.h
@@ -0,0 +1,135 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific LED driver header for the Busware CUL V3.
+ *  \copydetails Group_LEDs_CULV3
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the LEDs driver
+ *        dispatch header located in LUFA/Drivers/Board/LEDs.h.
+ */
+
+/** \ingroup Group_LEDs
+ *  \defgroup Group_LEDs_CULV3 CULV3
+ *  \brief Board specific LED driver header for the Busware CUL V3.
+ *
+ *  Board specific LED driver header for the Busware CUL V3 (http://busware.de/tiki-index.php?page=CUL).
+ *
+ *  <table>
+ *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr>
+ *    <tr><td>LEDS_LED1</td><td>Yellow</td><td>General Indicator</td><td>High</td><td>PORTE.6</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __LEDS_CULV3_H__
+#define __LEDS_CULV3_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_LEDS_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/LEDS.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** LED mask for the first LED on the board. */
+			#define LEDS_LED1        (1 << 6)
+
+			/** LED mask for all the LEDs on the board. */
+			#define LEDS_ALL_LEDS    LEDS_LED1
+
+			/** LED mask for the none of the board LEDs. */
+			#define LEDS_NO_LEDS     0
+
+		/* Inline Functions: */
+		#if !defined(__DOXYGEN__)
+			static inline void LEDs_Init(void)
+			{
+				DDRE  |=  LEDS_ALL_LEDS;
+				PORTE &= ~LEDS_ALL_LEDS;
+         	}
+
+			static inline void LEDs_Disable(void)
+			{
+				DDRE  &= ~LEDS_ALL_LEDS;
+				PORTE &= ~LEDS_ALL_LEDS;
+         	}
+
+			static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask)
+			{
+				PORTE |= LEDMask;
+			}
+
+			static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask)
+			{
+				PORTE &= ~LEDMask;
+			}
+
+			static inline void LEDs_SetAllLEDs(const uint8_t LEDMask)
+			{
+				PORTE = ((PORTE & ~LEDS_ALL_LEDS) | LEDMask);
+			}
+
+			static inline void LEDs_ChangeLEDs(const uint8_t LEDMask,
+			                                   const uint8_t ActiveMask)
+			{
+				PORTE = ((PORTE & ~LEDMask) | ActiveMask);
+			}
+
+			static inline void LEDs_ToggleLEDs(const uint8_t LEDMask)
+			{
+				PINE  = LEDMask;
+			}
+
+			static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t LEDs_GetLEDs(void)
+			{
+				return (PORTE & LEDS_ALL_LEDS);
+			}
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/DUCE/Board.h b/lib/lufa/LUFA/Drivers/Board/AVR8/DUCE/Board.h
new file mode 100644
index 0000000000..8521ec9bd6
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/DUCE/Board.h
@@ -0,0 +1,78 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific information header for the DorkbotPDX Duce.
+ *  \copydetails Group_BoardInfo_DUCE
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the Board driver
+ *        dispatch header located in LUFA/Drivers/Board/Board.h.
+ */
+
+/** \ingroup Group_BoardInfo
+ *  \defgroup Group_BoardInfo_DUCE DUCE
+ *  \brief Board specific information header for the DorkbotPDX Duce.
+ *
+ *  Board specific information header for the DorkbotPDX Duce (http://dorkbotpdx.org/wiki/duce).
+ *
+ *  @{
+ */
+
+#ifndef __BOARD_DUCE_H__
+#define __BOARD_DUCE_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+		#include "../../LEDs.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_BOARD_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Indicates the board has hardware LEDs mounted. */
+			#define BOARD_HAS_LEDS
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/DUCE/LEDs.h b/lib/lufa/LUFA/Drivers/Board/AVR8/DUCE/LEDs.h
new file mode 100644
index 0000000000..ad866b96d8
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/DUCE/LEDs.h
@@ -0,0 +1,147 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific LED driver header for the DorkbotPDX Duce.
+ *  \copydetails Group_LEDs_DUCE
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the LEDs driver
+ *        dispatch header located in LUFA/Drivers/Board/LEDs.h.
+ */
+
+/** \ingroup Group_LEDs
+ *  \defgroup Group_LEDs_DUCE DUCE
+ *  \brief Board specific LED driver header for the DorkbotPDX Duce.
+ *
+ *  Board specific LED driver header for the DorkbotPDX Duce (http://dorkbotpdx.org/wiki/duce).
+ *
+ *  <table>
+ *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr>
+ *    <tr><td>LEDS_LED1</td><td>Red</td><td>Bicolor Indicator 1</td><td>High</td><td>PORTC.4</td></tr>
+ *    <tr><td>LEDS_LED2</td><td>Green</td><td>Bicolor Indicator 1</td><td>High</td><td>PORTC.5</td></tr>
+ *    <tr><td>LEDS_LED3</td><td>Red</td><td>Bicolor Indicator 2</td><td>High</td><td>PORTC.6</td></tr>
+ *    <tr><td>LEDS_LED4</td><td>Green</td><td>Bicolor Indicator 2</td><td>High</td><td>PORTC.7</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __LEDS_DUCE_H__
+#define __LEDS_DUCE_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_LEDS_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/LEDS.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** LED mask for the first LED on the board. */
+			#define LEDS_LED1        (1 << 4)
+
+			/** LED mask for the second LED on the board. */
+			#define LEDS_LED2        (1 << 5)
+
+			/** LED mask for the third LED on the board. */
+			#define LEDS_LED3        (1 << 6)
+
+			/** LED mask for the fourth LED on the board. */
+			#define LEDS_LED4        (1 << 7)
+
+			/** LED mask for all the LEDs on the board. */
+			#define LEDS_ALL_LEDS    (LEDS_LED1 | LEDS_LED2 | LEDS_LED3 | LEDS_LED4)
+
+			/** LED mask for none of the board LEDs. */
+			#define LEDS_NO_LEDS     0
+
+		/* Inline Functions: */
+		#if !defined(__DOXYGEN__)
+			static inline void LEDs_Init(void)
+			{
+				DDRC  |=  LEDS_ALL_LEDS;
+				PORTC &= ~LEDS_ALL_LEDS;
+			}
+
+			static inline void LEDs_Disable(void)
+			{
+				DDRC  &= ~LEDS_ALL_LEDS;
+				PORTC &= ~LEDS_ALL_LEDS;
+			}
+
+			static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask)
+			{
+				PORTC |= LEDMask;
+			}
+
+			static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask)
+			{
+				PORTC &= ~LEDMask;
+			}
+
+			static inline void LEDs_SetAllLEDs(const uint8_t LEDMask)
+			{
+				PORTC = ((PORTC & ~LEDS_ALL_LEDS) | LEDMask);
+			}
+
+			static inline void LEDs_ChangeLEDs(const uint8_t LEDMask,
+			                                   const uint8_t ActiveMask)
+			{
+				PORTC = ((PORTC & ~LEDMask) | ActiveMask);
+			}
+
+			static inline void LEDs_ToggleLEDs(const uint8_t LEDMask)
+			{
+				PINC  = LEDMask;
+			}
+
+			static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t LEDs_GetLEDs(void)
+			{
+				return (PORTC & LEDS_ALL_LEDS);
+			}
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/EVK527/Board.h b/lib/lufa/LUFA/Drivers/Board/AVR8/EVK527/Board.h
new file mode 100644
index 0000000000..01b6b93ff0
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/EVK527/Board.h
@@ -0,0 +1,90 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific information header for the Atmel EVK527.
+ *  \copydetails Group_BoardInfo_EVK527
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the Board driver
+ *        dispatch header located in LUFA/Drivers/Board/Board.h.
+ */
+
+/** \ingroup Group_BoardInfo
+ *  \defgroup Group_BoardInfo_EVK527 EVK527
+ *  \brief Board specific information header for the Atmel EVK527.
+ *
+ *  Board specific information header for the Atmel EVK527.
+ *
+ *  @{
+ */
+
+#ifndef __BOARD_EVK527_H__
+#define __BOARD_EVK527_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+		#include "../../Buttons.h"
+		#include "../../Dataflash.h"
+		#include "../../Joystick.h"
+		#include "../../LEDs.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_BOARD_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Indicates the board has hardware Buttons mounted. */
+			#define BOARD_HAS_BUTTONS
+
+			/** Indicates the board has a hardware Dataflash mounted. */
+			#define BOARD_HAS_DATAFLASH
+
+			/** Indicates the board has a hardware Joystick mounted. */
+			#define BOARD_HAS_JOYSTICK
+
+			/** Indicates the board has hardware LEDs mounted. */
+			#define BOARD_HAS_LEDS
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/EVK527/Buttons.h b/lib/lufa/LUFA/Drivers/Board/AVR8/EVK527/Buttons.h
new file mode 100644
index 0000000000..3094fbe0e0
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/EVK527/Buttons.h
@@ -0,0 +1,103 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific Buttons driver header for the Atmel EVK527.
+ *  \copydetails Group_Buttons_EVK527
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the Buttons driver
+ *        dispatch header located in LUFA/Drivers/Board/Buttons.h.
+ */
+
+/** \ingroup Group_Buttons
+ *  \defgroup Group_Buttons_EVK527 EVK527
+ *  \brief Board specific Buttons driver header for the Atmel EVK527.
+ *
+ *  Board specific Buttons driver header for the Atmel EVK527.
+ *
+ *  <table>
+ *    <tr><th>Name</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr>
+ *    <tr><td>BUTTONS_BUTTON1</td><td>HWB Button</td><td>Low</td><td>PORTE.2</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __BUTTONS_EVK527_H__
+#define __BUTTONS_EVK527_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_BUTTONS_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Buttons.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Button mask for the first button on the board. */
+			#define BUTTONS_BUTTON1      (1 << 2)
+
+		/* Inline Functions: */
+		#if !defined(__DOXYGEN__)
+			static inline void Buttons_Init(void)
+			{
+				DDRE  &= ~BUTTONS_BUTTON1;
+				PORTE |=  BUTTONS_BUTTON1;
+			}
+
+			static inline void Buttons_Disable(void)
+			{
+				DDRE  &= ~BUTTONS_BUTTON1;
+				PORTE &= ~BUTTONS_BUTTON1;
+			}
+
+			static inline uint8_t Buttons_GetStatus(void) ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t Buttons_GetStatus(void)
+			{
+				return ((PINE & BUTTONS_BUTTON1) ^ BUTTONS_BUTTON1);
+			}
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/EVK527/Dataflash.h b/lib/lufa/LUFA/Drivers/Board/AVR8/EVK527/Dataflash.h
new file mode 100644
index 0000000000..2ec973e233
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/EVK527/Dataflash.h
@@ -0,0 +1,222 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific Dataflash driver header for the Atmel EVK527.
+ *  \copydetails Group_Dataflash_EVK527
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the dataflash driver
+ *        dispatch header located in LUFA/Drivers/Board/Dataflash.h.
+ */
+
+/** \ingroup Group_Dataflash
+ *  \defgroup Group_Dataflash_EVK527 EVK527
+ *  \brief Board specific Dataflash driver header for the Atmel EVK527.
+ *
+ *  Board specific Dataflash driver header for the Atmel EVK527.
+ *
+ *  <table>
+ *    <tr><th>Name</th><th>Info</th><th>Select Pin</th><th>SPI Port</th></tr>
+ *    <tr><td>DATAFLASH_CHIP1</td><td>AT45DB321C (4MB)</td><td>PORTE.6</td><td>SPI0</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __DATAFLASH_EVK527_H__
+#define __DATAFLASH_EVK527_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+		#include "../../../Misc/AT45DB321C.h"
+		#include "../../../Peripheral/SPI.h"
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_DATAFLASH_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Dataflash.h instead.
+		#endif
+
+	/* Private Interface - For use in library only: */
+	#if !defined(__DOXYGEN__)
+		/* Macros: */
+			#define DATAFLASH_CHIPCS_MASK                DATAFLASH_CHIP1
+			#define DATAFLASH_CHIPCS_DDR                 DDRE
+			#define DATAFLASH_CHIPCS_PORT                PORTE
+	#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Constant indicating the total number of dataflash ICs mounted on the selected board. */
+			#define DATAFLASH_TOTALCHIPS                 1
+
+			/** Mask for no dataflash chip selected. */
+			#define DATAFLASH_NO_CHIP                    0
+
+			/** Mask for the first dataflash chip selected. */
+			#define DATAFLASH_CHIP1                      (1 << 6)
+
+			/** Internal main memory page size for the board's dataflash IC. */
+			#define DATAFLASH_PAGE_SIZE                  512
+
+			/** Total number of pages inside the board's dataflash IC. */
+			#define DATAFLASH_PAGES                      8192
+
+		/* Inline Functions: */
+			/** Initializes the dataflash driver so that commands and data may be sent to an attached dataflash IC.
+			 *  The appropriate SPI interface will be automatically configured.
+			 */
+			static inline void Dataflash_Init(void)
+			{
+				DATAFLASH_CHIPCS_DDR  |= DATAFLASH_CHIPCS_MASK;
+				DATAFLASH_CHIPCS_PORT |= DATAFLASH_CHIPCS_MASK;
+
+				SPI_Init(SPI_SPEED_FCPU_DIV_2 | SPI_ORDER_MSB_FIRST | SPI_SCK_LEAD_FALLING | SPI_SAMPLE_TRAILING | SPI_MODE_MASTER);
+			}
+
+			/** Sends a byte to the currently selected dataflash IC, and returns a byte from the dataflash.
+			 *
+			 *  \param[in] Byte  Byte of data to send to the dataflash
+			 *
+			 *  \return Last response byte from the dataflash
+			 */
+			static inline uint8_t Dataflash_TransferByte(const uint8_t Byte) ATTR_ALWAYS_INLINE;
+			static inline uint8_t Dataflash_TransferByte(const uint8_t Byte)
+			{
+				return SPI_TransferByte(Byte);
+			}
+
+			/** Sends a byte to the currently selected dataflash IC, and ignores the next byte from the dataflash.
+			 *
+			 *  \param[in] Byte  Byte of data to send to the dataflash
+			 */
+			static inline void Dataflash_SendByte(const uint8_t Byte) ATTR_ALWAYS_INLINE;
+			static inline void Dataflash_SendByte(const uint8_t Byte)
+			{
+				SPI_SendByte(Byte);
+			}
+
+			/** Sends a dummy byte to the currently selected dataflash IC, and returns the next byte from the dataflash.
+			 *
+			 *  \return Last response byte from the dataflash
+			 */
+			static inline uint8_t Dataflash_ReceiveByte(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t Dataflash_ReceiveByte(void)
+			{
+				return SPI_ReceiveByte();
+			}
+
+			/** Determines the currently selected dataflash chip.
+			 *
+			 *  \return Mask of the currently selected Dataflash chip, either \ref DATAFLASH_NO_CHIP if no chip is selected
+			 *          or a DATAFLASH_CHIPn mask (where n is the chip number).
+			 */
+			static inline uint8_t Dataflash_GetSelectedChip(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t Dataflash_GetSelectedChip(void)
+			{
+				return (~DATAFLASH_CHIPCS_PORT & DATAFLASH_CHIPCS_MASK);
+			}
+
+			/** Selects the given dataflash chip.
+			 *
+			 *  \param[in]  ChipMask  Mask of the Dataflash IC to select, in the form of a \c DATAFLASH_CHIPn mask (where n is
+			 *              the chip number).
+			 */
+			static inline void Dataflash_SelectChip(const uint8_t ChipMask) ATTR_ALWAYS_INLINE;
+			static inline void Dataflash_SelectChip(const uint8_t ChipMask)
+			{
+				DATAFLASH_CHIPCS_PORT = ((DATAFLASH_CHIPCS_PORT | DATAFLASH_CHIPCS_MASK) & ~ChipMask);
+			}
+
+			/** Deselects the current dataflash chip, so that no dataflash is selected. */
+			static inline void Dataflash_DeselectChip(void) ATTR_ALWAYS_INLINE;
+			static inline void Dataflash_DeselectChip(void)
+			{
+				Dataflash_SelectChip(DATAFLASH_NO_CHIP);
+			}
+
+			/** Selects a dataflash IC from the given page number, which should range from 0 to
+			 *  ((DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS) - 1). For boards containing only one
+			 *  dataflash IC, this will select DATAFLASH_CHIP1. If the given page number is outside
+			 *  the total number of pages contained in the boards dataflash ICs, all dataflash ICs
+			 *  are deselected.
+			 *
+			 *  \param[in] PageAddress  Address of the page to manipulate, ranging from
+			 *                          0 to ((DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS) - 1).
+			 */
+			static inline void Dataflash_SelectChipFromPage(const uint16_t PageAddress)
+			{
+				Dataflash_DeselectChip();
+
+				if (PageAddress >= DATAFLASH_PAGES)
+				  return;
+
+				Dataflash_SelectChip(DATAFLASH_CHIP1);
+			}
+
+			/** Toggles the select line of the currently selected dataflash IC, so that it is ready to receive
+			 *  a new command.
+			 */
+			static inline void Dataflash_ToggleSelectedChipCS(void)
+			{
+				uint8_t SelectedChipMask = Dataflash_GetSelectedChip();
+
+				Dataflash_DeselectChip();
+				Dataflash_SelectChip(SelectedChipMask);
+			}
+
+			/** Spin-loops while the currently selected dataflash is busy executing a command, such as a main
+			 *  memory page program or main memory to buffer transfer.
+			 */
+			static inline void Dataflash_WaitWhileBusy(void)
+			{
+				Dataflash_ToggleSelectedChipCS();
+				Dataflash_SendByte(DF_CMD_GETSTATUS);
+				while (!(Dataflash_ReceiveByte() & DF_STATUS_READY));
+				Dataflash_ToggleSelectedChipCS();
+			}
+
+			/** Sends a set of page and buffer address bytes to the currently selected dataflash IC, for use with
+			 *  dataflash commands which require a complete 24-bit address.
+			 *
+			 *  \param[in] PageAddress  Page address within the selected dataflash IC
+			 *  \param[in] BufferByte   Address within the dataflash's buffer
+			 */
+			static inline void Dataflash_SendAddressBytes(uint16_t PageAddress,
+			                                              const uint16_t BufferByte)
+			{
+				Dataflash_SendByte(PageAddress >> 5);
+				Dataflash_SendByte((PageAddress << 3) | (BufferByte >> 8));
+				Dataflash_SendByte(BufferByte);
+			}
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/EVK527/Joystick.h b/lib/lufa/LUFA/Drivers/Board/AVR8/EVK527/Joystick.h
new file mode 100644
index 0000000000..909fa02c58
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/EVK527/Joystick.h
@@ -0,0 +1,130 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific joystick driver header for the Atmel EVK527.
+ *  \copydetails Group_Joystick_EVK527
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the joystick driver
+ *        dispatch header located in LUFA/Drivers/Board/Joystick.h.
+ */
+
+/** \ingroup Group_Joystick
+ *  \defgroup Group_Joystick_EVK527 EVK527
+ *  \brief Board specific joystick driver header for the Atmel EVK527.
+ *
+ *  Board specific joystick driver header for the Atmel EVK527.
+ *
+ *  <table>
+ *    <tr><th>Left Port Pin</th><th>Up Port Pin</th><th>Right Port Pin</th><th>Down Port Pin</th><th>Press Port Pin</th></tr>
+ *    <tr><td>PORTF.4</td><td>PORTF.5</td><td>PORTF.7</td><td>PORTC.6</td><td>PORTF.6</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __JOYSTICK_EVK527_H__
+#define __JOYSTICK_EVK527_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_JOYSTICK_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Joystick.h instead.
+		#endif
+
+	/* Private Interface - For use in library only: */
+	#if !defined(__DOXYGEN__)
+		/* Macros: */
+			#define JOY_FMASK                 ((1 << 4) | (1 << 5) | (1 << 6) | (1 << 7))
+			#define JOY_CMASK                 (1 << 6)
+
+			#define JOY_PORTC_MASK_SHIFT      3
+	#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Mask for the joystick being pushed in the left direction. */
+			#define JOY_LEFT                  (1 << 4)
+
+			/** Mask for the joystick being pushed in the right direction. */
+			#define JOY_RIGHT                 (1 << 7)
+
+			/** Mask for the joystick being pushed in the upward direction. */
+			#define JOY_UP                    (1 << 5)
+
+			/** Mask for the joystick being pushed in the downward direction. */
+			#define JOY_DOWN                 ((1 << 6) >> JOY_PORTC_MASK_SHIFT)
+
+			/** Mask for the joystick being pushed inward. */
+			#define JOY_PRESS                 (1 << 6)
+
+		/* Inline Functions: */
+		#if !defined(__DOXYGEN__)
+			static inline void Joystick_Init(void)
+			{
+				DDRF  &= ~JOY_FMASK;
+				DDRC  &= ~JOY_CMASK;
+
+				PORTF |=  JOY_FMASK;
+				PORTC |=  JOY_CMASK;
+			}
+
+			static inline void Joystick_Disable(void)
+			{
+				DDRF  &= ~JOY_FMASK;
+				DDRC  &= ~JOY_CMASK;
+
+				PORTF &= ~JOY_FMASK;
+				PORTC &= ~JOY_CMASK;
+			}
+
+			static inline uint8_t Joystick_GetStatus(void) ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t Joystick_GetStatus(void)
+			{
+				return (((uint8_t)~PINF & JOY_FMASK) | (((uint8_t)~PINC & JOY_CMASK) >> JOY_PORTC_MASK_SHIFT));
+			}
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/EVK527/LEDs.h b/lib/lufa/LUFA/Drivers/Board/AVR8/EVK527/LEDs.h
new file mode 100644
index 0000000000..a10b8229e0
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/EVK527/LEDs.h
@@ -0,0 +1,143 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific LED driver header for the Atmel EVK527.
+ *  \copydetails Group_LEDs_EVK527
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the LEDs driver
+ *        dispatch header located in LUFA/Drivers/Board/LEDs.h.
+ */
+
+/** \ingroup Group_LEDs
+ *  \defgroup Group_LEDs_EVK527 EVK527
+ *  \brief Board specific LED driver header for the Atmel EVK527.
+ *
+ *  Board specific LED driver header for the Atmel EVK527.
+ *
+ *  <table>
+ *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr>
+ *    <tr><td>LEDS_LED1</td><td>Green</td><td>General Indicator</td><td>High</td><td>PORTD.5</td></tr>
+ *    <tr><td>LEDS_LED2</td><td>Green</td><td>General Indicator</td><td>High</td><td>PORTD.6</td></tr>
+ *    <tr><td>LEDS_LED3</td><td>Green</td><td>General Indicator</td><td>High</td><td>PORTD.7</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __LEDS_EVK527_H__
+#define __LEDS_EVK527_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_LEDS_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/LEDS.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** LED mask for the first LED on the board. */
+			#define LEDS_LED1        (1 << 5)
+
+			/** LED mask for the second LED on the board. */
+			#define LEDS_LED2        (1 << 6)
+
+			/** LED mask for the third LED on the board. */
+			#define LEDS_LED3        (1 << 7)
+
+			/** LED mask for all the LEDs on the board. */
+			#define LEDS_ALL_LEDS    (LEDS_LED1 | LEDS_LED2 | LEDS_LED3)
+
+			/** LED mask for none of the board LEDs. */
+			#define LEDS_NO_LEDS     0
+
+		/* Inline Functions: */
+		#if !defined(__DOXYGEN__)
+			static inline void LEDs_Init(void)
+			{
+				DDRD  |=  LEDS_ALL_LEDS;
+				PORTD &= ~LEDS_ALL_LEDS;
+			}
+
+			static inline void LEDs_Disable(void)
+			{
+				DDRD  &= ~LEDS_ALL_LEDS;
+				PORTD &= ~LEDS_ALL_LEDS;
+			}
+
+			static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask)
+			{
+				PORTD |= LEDMask;
+			}
+
+			static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask)
+			{
+				PORTD &= ~LEDMask;
+			}
+
+			static inline void LEDs_SetAllLEDs(const uint8_t LEDMask)
+			{
+				PORTD = ((PORTD & ~LEDS_ALL_LEDS) | LEDMask);
+			}
+
+			static inline void LEDs_ChangeLEDs(const uint8_t LEDMask,
+			                                   const uint8_t ActiveMask)
+			{
+				PORTD = ((PORTD & ~LEDMask) | ActiveMask);
+			}
+
+			static inline void LEDs_ToggleLEDs(const uint8_t LEDMask)
+			{
+				PIND  = LEDMask;
+			}
+
+			static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t LEDs_GetLEDs(void)
+			{
+				return (PORTD & LEDS_ALL_LEDS);
+			}
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/JMDBU2/Board.h b/lib/lufa/LUFA/Drivers/Board/AVR8/JMDBU2/Board.h
new file mode 100644
index 0000000000..0e46a578b8
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/JMDBU2/Board.h
@@ -0,0 +1,82 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific information header for the Mattairtech JM-DB-U2.
+ *  \copydetails Group_BoardInfo_JMDBU2
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the Board driver
+ *        dispatch header located in LUFA/Drivers/Board/Board.h.
+ */
+
+/** \ingroup Group_BoardInfo
+ *  \defgroup Group_BoardInfo_JMDBU2 JMDBU2
+ *  \brief Board specific information header for the Mattairtech JM-DB-U2.
+ *
+ *  Board specific information header for the Mattairtech JM-DB-U2 (http://u2.mattair.net/index.html).
+ *
+ *  @{
+ */
+
+#ifndef __BOARD_JMDBU2_H__
+#define __BOARD_JMDBU2_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+		#include "../../Buttons.h"
+		#include "../../LEDs.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_BOARD_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Indicates the board has hardware Buttons mounted. */
+			#define BOARD_HAS_BUTTONS
+
+			/** Indicates the board has hardware LEDs mounted. */
+			#define BOARD_HAS_LEDS
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/JMDBU2/Buttons.h b/lib/lufa/LUFA/Drivers/Board/AVR8/JMDBU2/Buttons.h
new file mode 100644
index 0000000000..8da45e402e
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/JMDBU2/Buttons.h
@@ -0,0 +1,103 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific Buttons driver header for the Mattairtech JM-DB-U2.
+ *  \copydetails Group_Buttons_JMDBU2
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the Buttons driver
+ *        dispatch header located in LUFA/Drivers/Board/Buttons.h.
+ */
+
+/** \ingroup Group_Buttons
+ *  \defgroup Group_Buttons_JMDBU2 JMDBU2
+ *  \brief Board specific Buttons driver header for the Mattairtech JM-DB-U2.
+ *
+ *  Board specific Buttons driver header for the Mattairtech JM-DB-U2 (http://u2.mattair.net/index.html).
+ *
+ *  <table>
+ *    <tr><th>Name</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr>
+ *    <tr><td>BUTTONS_BUTTON1</td><td>HWB Button</td><td>Low</td><td>PORTD.7</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __BUTTONS_JMDBU2_H__
+#define __BUTTONS_JMDBU2_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_BUTTONS_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Buttons.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Button mask for the first button on the board. */
+			#define BUTTONS_BUTTON1      (1 << 7)
+
+		/* Inline Functions: */
+		#if !defined(__DOXYGEN__)
+			static inline void Buttons_Init(void)
+			{
+				DDRD  &= ~BUTTONS_BUTTON1;
+				PORTD |=  BUTTONS_BUTTON1;
+			}
+
+			static inline void Buttons_Disable(void)
+			{
+				DDRD  &= ~BUTTONS_BUTTON1;
+				PORTD &= ~BUTTONS_BUTTON1;
+			}
+
+			static inline uint8_t Buttons_GetStatus(void) ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t Buttons_GetStatus(void)
+			{
+				return ((PIND & BUTTONS_BUTTON1) ^ BUTTONS_BUTTON1);
+			}
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/JMDBU2/LEDs.h b/lib/lufa/LUFA/Drivers/Board/AVR8/JMDBU2/LEDs.h
new file mode 100644
index 0000000000..bd2c191a5a
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/JMDBU2/LEDs.h
@@ -0,0 +1,135 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific LED driver header for the Mattairtech JM-DB-U2.
+ *  \copydetails Group_LEDs_JMDBU2
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the LEDs driver
+ *        dispatch header located in LUFA/Drivers/Board/LEDs.h.
+ */
+
+/** \ingroup Group_LEDs
+ *  \defgroup Group_LEDs_JMDBU2 JMDBU2
+ *  \brief Board specific LED driver header for the Mattairtech JM-DB-U2.
+ *
+ *  Board specific LED driver header for the Mattairtech JM-DB-U2 (http://u2.mattair.net/index.html).
+ *
+ *  <table>
+ *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr>
+ *    <tr><td>LEDS_LED1</td><td>Green</td><td>General Indicator</td><td>High</td><td>PORTD.4</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __LEDS_JMDBU2_H__
+#define __LEDS_JMDBU2_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_LEDS_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/LEDS.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** LED mask for the first LED on the board. */
+			#define LEDS_LED1        (1 << 4)
+
+			/** LED mask for all the LEDs on the board. */
+			#define LEDS_ALL_LEDS    LEDS_LED1
+
+			/** LED mask for none of the board LEDs. */
+			#define LEDS_NO_LEDS     0
+
+		/* Inline Functions: */
+		#if !defined(__DOXYGEN__)
+			static inline void LEDs_Init(void)
+			{
+				DDRD  |=  LEDS_ALL_LEDS;
+				PORTD &= ~LEDS_ALL_LEDS;
+			}
+
+			static inline void LEDs_Disable(void)
+			{
+				DDRD  &= ~LEDS_ALL_LEDS;
+				PORTD &= ~LEDS_ALL_LEDS;
+			}
+
+			static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask)
+			{
+				PORTD |= LEDMask;
+			}
+
+			static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask)
+			{
+				PORTD &= ~LEDMask;
+			}
+
+			static inline void LEDs_SetAllLEDs(const uint8_t LEDMask)
+			{
+				PORTD = ((PORTD & ~LEDS_ALL_LEDS) | LEDMask);
+			}
+
+			static inline void LEDs_ChangeLEDs(const uint8_t LEDMask,
+			                                   const uint8_t ActiveMask)
+			{
+				PORTD = ((PORTD & ~LEDMask) | ActiveMask);
+			}
+
+			static inline void LEDs_ToggleLEDs(const uint8_t LEDMask)
+			{
+				PIND  = LEDMask;
+			}
+
+			static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t LEDs_GetLEDs(void)
+			{
+				return (PORTD & LEDS_ALL_LEDS);
+			}
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/LEONARDO/Board.h b/lib/lufa/LUFA/Drivers/Board/AVR8/LEONARDO/Board.h
new file mode 100644
index 0000000000..400bb11c4a
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/LEONARDO/Board.h
@@ -0,0 +1,78 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific information header for the Arduino Leonardo board.
+ *  \copydetails Group_BoardInfo_LEONARDO
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the Board driver
+ *        dispatch header located in LUFA/Drivers/Board/Board.h.
+ */
+
+/** \ingroup Group_BoardInfo
+ *  \defgroup Group_BoardInfo_LEONARDO LEONARDO
+ *  \brief Board specific information header for the Arduino Leonardo board.
+ *
+ *  Board specific information header for the Arduino Leonardo board (http://arduino.cc/en/Main/arduinoBoardLeonardo).
+ *
+ *  @{
+ */
+
+#ifndef __BOARD_LEONARDO_H__
+#define __BOARD_LEONARDO_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+		#include "../../LEDs.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_BOARD_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Indicates the board has hardware LEDs mounted. */
+			#define BOARD_HAS_LEDS
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/LEONARDO/LEDs.h b/lib/lufa/LUFA/Drivers/Board/AVR8/LEONARDO/LEDs.h
new file mode 100644
index 0000000000..6f26cc1820
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/LEONARDO/LEDs.h
@@ -0,0 +1,169 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific LED driver header for the Arduino Leonardo board.
+ *  \copydetails Group_LEDs_LEONARDO
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the LEDs driver
+ *        dispatch header located in LUFA/Drivers/Board/LEDs.h.
+ */
+
+/** \ingroup Group_LEDs
+ *  \defgroup Group_LEDs_LEONARDO LEONARDO
+ *  \brief Board specific LED driver header for the Arduino Leonardo board.
+ *
+ *  Board specific LED driver header for the Arduino Leonardo board (http://arduino.cc/en/Main/arduinoBoardLeonardo).
+ *
+ *  <table>
+ *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr>
+ *    <tr><td>LEDS_LED1</td><td>Yellow</td><td>RX</td><td>Low</td><td>PORTB.0</td></tr>
+ *    <tr><td>LEDS_LED2</td><td>Yellow</td><td>TX</td><td>Low</td><td>PORTD.5</td></tr>
+ *    <tr><td>LEDS_LED3</td><td>Yellow</td><td>General Indicator</td><td>High</td><td>PORTC.7</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __LEDS_LEONARDO_H__
+#define __LEDS_LEONARDO_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_LEDS_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/LEDS.h instead.
+		#endif
+
+	/* Private Interface - For use in library only: */
+	#if !defined(__DOXYGEN__)
+		/* Macros: */
+			#define LEDS_PORTB_LEDS       (LEDS_LED1)
+			#define LEDS_PORTD_LEDS       (LEDS_LED2)
+			#define LEDS_PORTC_LEDS       (LEDS_LED3)
+	#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** LED mask for the first LED on the board. */
+			#define LEDS_LED1        (1 << 0)
+
+			/** LED mask for the second LED on the board. */
+			#define LEDS_LED2        (1 << 5)
+
+			/** LED mask for the third LED on the board. */
+			#define LEDS_LED3        (1 << 7)
+
+			/** LED mask for all the LEDs on the board. */
+			#define LEDS_ALL_LEDS    (LEDS_LED1 | LEDS_LED2 | LEDS_LED3)
+
+			/** LED mask for none of the board LEDs. */
+			#define LEDS_NO_LEDS     0
+
+		/* Inline Functions: */
+		#if !defined(__DOXYGEN__)
+			static inline void LEDs_Init(void)
+			{
+				DDRB  |=  LEDS_PORTB_LEDS;
+				PORTB |=  LEDS_PORTB_LEDS;
+				DDRD  |=  LEDS_PORTD_LEDS;
+				PORTD |=  LEDS_PORTD_LEDS;
+				DDRC  |=  LEDS_PORTC_LEDS;
+				PORTC &= ~LEDS_PORTC_LEDS;
+			}
+
+			static inline void LEDs_Disable(void)
+			{
+				DDRB  &= ~LEDS_PORTB_LEDS;
+				PORTB &= ~LEDS_PORTB_LEDS;
+				DDRD  &= ~LEDS_PORTD_LEDS;
+				PORTD &= ~LEDS_PORTD_LEDS;
+				DDRC  &= ~LEDS_PORTC_LEDS;
+				PORTC &= ~LEDS_PORTC_LEDS;
+			}
+
+			static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask)
+			{
+				PORTB &= ~(LEDMask & LEDS_PORTB_LEDS);
+				PORTD &= ~(LEDMask & LEDS_PORTD_LEDS);
+				PORTC |=  (LEDMask & LEDS_PORTC_LEDS);
+			}
+
+			static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask)
+			{
+				PORTB |=  (LEDMask & LEDS_PORTB_LEDS);
+				PORTD |=  (LEDMask & LEDS_PORTD_LEDS);
+				PORTC &= ~(LEDMask & LEDS_PORTC_LEDS);
+			}
+
+			static inline void LEDs_SetAllLEDs(const uint8_t LEDMask)
+			{
+				PORTB = ((PORTB |  LEDS_PORTB_LEDS) & ~(LEDMask & LEDS_PORTB_LEDS));
+				PORTD = ((PORTD |  LEDS_PORTD_LEDS) & ~(LEDMask & LEDS_PORTD_LEDS));
+				PORTC = ((PORTC & ~LEDS_PORTC_LEDS) |  (LEDMask & LEDS_PORTC_LEDS));
+			}
+
+			static inline void LEDs_ChangeLEDs(const uint8_t LEDMask,
+			                                   const uint8_t ActiveMask)
+			{
+				PORTB = ((PORTB |  (LEDMask & LEDS_PORTB_LEDS)) & ~(ActiveMask & LEDS_PORTB_LEDS));
+				PORTD = ((PORTD |  (LEDMask & LEDS_PORTD_LEDS)) & ~(ActiveMask & LEDS_PORTD_LEDS));
+				PORTC = ((PORTC & ~(LEDMask & LEDS_PORTC_LEDS)) |  (ActiveMask & LEDS_PORTC_LEDS));
+			}
+
+			static inline void LEDs_ToggleLEDs(const uint8_t LEDMask)
+			{
+				PINB  = (LEDMask & LEDS_PORTB_LEDS);
+				PIND  = (LEDMask & LEDS_PORTD_LEDS);
+				PINC  = (LEDMask & LEDS_PORTC_LEDS);
+			}
+
+			static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t LEDs_GetLEDs(void)
+			{
+				return ((~PORTB & LEDS_PORTB_LEDS) | (~PORTD & LEDS_PORTD_LEDS) | (PORTC & LEDS_PORTC_LEDS));
+			}
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/MAXIMUS/Board.h b/lib/lufa/LUFA/Drivers/Board/AVR8/MAXIMUS/Board.h
new file mode 100644
index 0000000000..7de7501e43
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/MAXIMUS/Board.h
@@ -0,0 +1,78 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific information header for the Maximus board.
+ *  \copydetails Group_BoardInfo_MAXIMUS
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the Board driver
+ *        dispatch header located in LUFA/Drivers/Board/Board.h.
+ */
+
+/** \ingroup Group_BoardInfo
+ *  \defgroup Group_BoardInfo_MAXIMUS MAXIMUS
+ *  \brief Board specific information header for the Maximus board.
+ *
+ *  Board specific information header for the Maximus (http://www.avrusb.com/).
+ *
+ *  @{
+ */
+
+#ifndef __BOARD_MAXIMUS_H__
+#define __BOARD_MAXIMUS_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+		#include "../../LEDs.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_BOARD_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Indicates the board has hardware LEDs mounted. */
+			#define BOARD_HAS_LEDS
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/MAXIMUS/LEDs.h b/lib/lufa/LUFA/Drivers/Board/AVR8/MAXIMUS/LEDs.h
new file mode 100644
index 0000000000..aba85abd46
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/MAXIMUS/LEDs.h
@@ -0,0 +1,139 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific LED driver header for the Maximus.
+ *  \copydetails Group_LEDs_MAXIMUS
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the LEDs driver
+ *        dispatch header located in LUFA/Drivers/Board/LEDs.h.
+ */
+
+/** \ingroup Group_LEDs
+ *  \defgroup Group_LEDs_MAXIMUS MAXIMUS
+ *  \brief Board specific LED driver header for the Maximus.
+ *
+ *  Board specific LED driver header for the Maximus (http://www.avrusb.com/).
+ *
+ *  <table>
+ *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr>
+ *    <tr><td>LEDS_LED1</td><td>Green</td><td>LG</td><td>High</td><td>PORTB.6</td></tr>
+ *    <tr><td>LEDS_LED2</td><td>Red</td><td>LR</td><td>High</td><td>PORTB.7</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __LEDS_MAXIMUS_H__
+#define __LEDS_MAXIMUS_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_LEDS_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/LEDS.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** LED mask for the first LED on the board. */
+			#define LEDS_LED1        (1 << 6)
+
+			/** LED mask for the second LED on the board. */
+			#define LEDS_LED2        (1 << 7)
+
+			/** LED mask for all the LEDs on the board. */
+			#define LEDS_ALL_LEDS    (LEDS_LED1 | LEDS_LED2)
+
+			/** LED mask for the none of the board LEDs. */
+			#define LEDS_NO_LEDS     0
+
+		/* Inline Functions: */
+		#if !defined(__DOXYGEN__)
+			static inline void LEDs_Init(void)
+			{
+				DDRB  |=  LEDS_ALL_LEDS;
+				PORTB &= ~LEDS_ALL_LEDS;
+			}
+
+			static inline void LEDs_Disable(void)
+			{
+				DDRB  &= ~LEDS_ALL_LEDS;
+				PORTB &= ~LEDS_ALL_LEDS;
+			}
+
+			static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask)
+			{
+				PORTB |= LEDMask;
+			}
+
+			static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask)
+			{
+				PORTB &= ~LEDMask;
+			}
+
+			static inline void LEDs_SetAllLEDs(const uint8_t LEDMask)
+			{
+				PORTB = ((PORTB & ~LEDS_ALL_LEDS) | LEDMask);
+			}
+
+			static inline void LEDs_ChangeLEDs(const uint8_t LEDMask,
+			                                   const uint8_t ActiveMask)
+			{
+				PORTB = ((PORTB & ~LEDMask) | ActiveMask);
+			}
+
+			static inline void LEDs_ToggleLEDs(const uint8_t LEDMask)
+			{
+				PINB  = LEDMask;
+			}
+
+			static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t LEDs_GetLEDs(void)
+			{
+				return (PORTB & LEDS_ALL_LEDS);
+			}
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/MICRO/Board.h b/lib/lufa/LUFA/Drivers/Board/AVR8/MICRO/Board.h
new file mode 100644
index 0000000000..279dc3aafe
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/MICRO/Board.h
@@ -0,0 +1,78 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific information header for the Arduino Micro board.
+ *  \copydetails Group_BoardInfo_MICRO
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the Board driver
+ *        dispatch header located in LUFA/Drivers/Board/Board.h.
+ */
+
+/** \ingroup Group_BoardInfo
+ *  \defgroup Group_BoardInfo_MICRO MICRO
+ *  \brief Board specific information header for the Arduino Micro board.
+ *
+ *  Board specific information header for the Arduino Micro board (http://arduino.cc/en/Main/arduinoBoardMicro).
+ *
+ *  @{
+ */
+
+#ifndef __BOARD_MICRO_H__
+#define __BOARD_MICRO_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+		#include "../../LEDs.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_BOARD_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Indicates the board has hardware LEDs mounted. */
+			#define BOARD_HAS_LEDS
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/MICRO/LEDs.h b/lib/lufa/LUFA/Drivers/Board/AVR8/MICRO/LEDs.h
new file mode 100644
index 0000000000..445e1a3347
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/MICRO/LEDs.h
@@ -0,0 +1,169 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific LED driver header for the Arduino Micro board.
+ *  \copydetails Group_LEDs_MICRO
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the LEDs driver
+ *        dispatch header located in LUFA/Drivers/Board/LEDs.h.
+ */
+
+/** \ingroup Group_LEDs
+ *  \defgroup Group_LEDs_MICRO MICRO
+ *  \brief Board specific LED driver header for the Arduino Micro board.
+ *
+ *  Board specific LED driver header for the Arduino Micro board (http://arduino.cc/en/Main/arduinoBoardMicro).
+ *
+ *  <table>
+ *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr>
+ *    <tr><td>LEDS_LED1</td><td>Yellow</td><td>RX</td><td>High</td><td>PORTB.0</td></tr>
+ *    <tr><td>LEDS_LED2</td><td>Yellow</td><td>TX</td><td>High</td><td>PORTD.5</td></tr>
+ *    <tr><td>LEDS_LED3</td><td>Green</td><td>General Indicator</td><td>High</td><td>PORTC.7</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __LEDS_MICRO_H__
+#define __LEDS_MICRO_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_LEDS_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/LEDS.h instead.
+		#endif
+
+	/* Private Interface - For use in library only: */
+	#if !defined(__DOXYGEN__)
+		/* Macros: */
+			#define LEDS_PORTB_LEDS       (LEDS_LED1)
+			#define LEDS_PORTD_LEDS       (LEDS_LED2)
+			#define LEDS_PORTC_LEDS       (LEDS_LED3)
+	#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** LED mask for the first LED on the board. */
+			#define LEDS_LED1        (1 << 0)
+
+			/** LED mask for the second LED on the board. */
+			#define LEDS_LED2        (1 << 5)
+
+			/** LED mask for the third LED on the board. */
+			#define LEDS_LED3        (1 << 7)
+
+			/** LED mask for all the LEDs on the board. */
+			#define LEDS_ALL_LEDS    (LEDS_LED1 | LEDS_LED2 | LEDS_LED3)
+
+			/** LED mask for none of the board LEDs. */
+			#define LEDS_NO_LEDS     0
+
+		/* Inline Functions: */
+		#if !defined(__DOXYGEN__)
+			static inline void LEDs_Init(void)
+			{
+				DDRB  |=  LEDS_PORTB_LEDS;
+				PORTB &= ~LEDS_PORTB_LEDS;
+				DDRD  |=  LEDS_PORTD_LEDS;
+				PORTD &= ~LEDS_PORTD_LEDS;
+				DDRC  |=  LEDS_PORTC_LEDS;
+				PORTC &= ~LEDS_PORTC_LEDS;
+			}
+
+			static inline void LEDs_Disable(void)
+			{
+				DDRB  &= ~LEDS_PORTB_LEDS;
+				PORTB &= ~LEDS_PORTB_LEDS;
+				DDRD  &= ~LEDS_PORTD_LEDS;
+				PORTD &= ~LEDS_PORTD_LEDS;
+				DDRC  &= ~LEDS_PORTC_LEDS;
+				PORTC &= ~LEDS_PORTC_LEDS;
+			}
+
+			static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask)
+			{
+				PORTB |=  (LEDMask & LEDS_PORTB_LEDS);
+				PORTD |=  (LEDMask & LEDS_PORTD_LEDS);
+				PORTC |=  (LEDMask & LEDS_PORTC_LEDS);
+			}
+
+			static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask)
+			{
+				PORTB &= ~(LEDMask & LEDS_PORTB_LEDS);
+				PORTD &= ~(LEDMask & LEDS_PORTD_LEDS);
+				PORTC &= ~(LEDMask & LEDS_PORTC_LEDS);
+			}
+
+			static inline void LEDs_SetAllLEDs(const uint8_t LEDMask)
+			{
+				PORTB = ((PORTB & ~LEDS_PORTB_LEDS) | (LEDMask & LEDS_PORTB_LEDS));
+				PORTD = ((PORTD & ~LEDS_PORTD_LEDS) | (LEDMask & LEDS_PORTD_LEDS));
+				PORTC = ((PORTC & ~LEDS_PORTC_LEDS) | (LEDMask & LEDS_PORTC_LEDS));
+			}
+
+			static inline void LEDs_ChangeLEDs(const uint8_t LEDMask,
+			                                   const uint8_t ActiveMask)
+			{
+				PORTB = ((PORTB & ~(LEDMask & LEDS_PORTB_LEDS)) | (ActiveMask & LEDS_PORTB_LEDS));
+				PORTD = ((PORTD & ~(LEDMask & LEDS_PORTD_LEDS)) | (ActiveMask & LEDS_PORTD_LEDS));
+				PORTC = ((PORTC & ~(LEDMask & LEDS_PORTC_LEDS)) | (ActiveMask & LEDS_PORTC_LEDS));
+			}
+
+			static inline void LEDs_ToggleLEDs(const uint8_t LEDMask)
+			{
+				PORTB ^= (LEDMask & LEDS_PORTB_LEDS);
+				PORTD ^= (LEDMask & LEDS_PORTD_LEDS);
+				PORTC ^= (LEDMask & LEDS_PORTC_LEDS);
+			}
+
+			static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t LEDs_GetLEDs(void)
+			{
+				return ((PORTB & LEDS_PORTB_LEDS) | (PORTD & LEDS_PORTD_LEDS) | (PORTC & LEDS_PORTC_LEDS));
+			}
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/MICROPENDOUS/Board.h b/lib/lufa/LUFA/Drivers/Board/AVR8/MICROPENDOUS/Board.h
new file mode 100644
index 0000000000..1ae3d6f200
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/MICROPENDOUS/Board.h
@@ -0,0 +1,149 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific information header for the Micropendous series boards.
+ *  \copydetails Group_BoardInfo_MICROPENDOUS_32U2
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the Board driver
+ *        dispatch header located in LUFA/Drivers/Board/Board.h.
+ */
+
+/** \ingroup Group_BoardInfo
+ *  \defgroup Group_BoardInfo_MICROPENDOUS_A MICROPENDOUS_A
+ *  \brief Board specific information header for the Micropendous A (https://code.google.com/p/micropendous/wiki/MicropendousA).
+ *
+ *  See \ref Group_BoardInfo_MICROPENDOUS_32U2 for more details.
+ */
+
+/** \ingroup Group_BoardInfo
+ *  \defgroup Group_BoardInfo_MICROPENDOUS_1 MICROPENDOUS_1
+ *  \brief Board specific information header for the Micropendous 1 (https://code.google.com/p/micropendous/wiki/Micropendous1).
+ *
+ *  See \ref Group_BoardInfo_MICROPENDOUS_32U2 for more details.
+ */
+
+/** \ingroup Group_BoardInfo
+ *  \defgroup Group_BoardInfo_MICROPENDOUS_2 MICROPENDOUS_2
+ *  \brief Board specific information header for the Micropendous 2 (https://code.google.com/p/micropendous/wiki/Micropendous2).
+ *
+ *  See \ref Group_BoardInfo_MICROPENDOUS_32U2 for more details.
+ */
+
+/** \ingroup Group_BoardInfo
+ *  \defgroup Group_BoardInfo_MICROPENDOUS_3 MICROPENDOUS_3
+ *  \brief Board specific information header for the Micropendous 3 (https://code.google.com/p/micropendous/wiki/Micropendous3).
+ *
+ *  See \ref Group_BoardInfo_MICROPENDOUS_32U2 for more details.
+ */
+
+/** \ingroup Group_BoardInfo
+ *  \defgroup Group_BoardInfo_MICROPENDOUS_4 MICROPENDOUS_4
+ *  \brief Board specific information header for the Micropendous 4 (https://code.google.com/p/micropendous/wiki/Micropendous4).
+ *
+ *  See \ref Group_BoardInfo_MICROPENDOUS_32U2 for more details.
+ */
+
+/** \ingroup Group_BoardInfo
+ *  \defgroup Group_BoardInfo_MICROPENDOUS_DIP MICROPENDOUS_DIP
+ *  \brief Board specific information header for the Micropendous DIP (https://code.google.com/p/micropendous/wiki/MicropendousDIP).
+ *
+ *  See \ref Group_BoardInfo_MICROPENDOUS_32U2 for more details.
+ */
+
+/** \ingroup Group_BoardInfo
+ *  \defgroup Group_BoardInfo_MICROPENDOUS_REV1 MICROPENDOUS_REV1
+ *  \brief Board specific information header for the Micropendous Arduino-like Revision 1 (https://code.google.com/p/micropendous/wiki/Micropendous).
+ *
+ *  See \ref Group_BoardInfo_MICROPENDOUS_32U2 for more details.
+ */
+
+/** \ingroup Group_BoardInfo
+ *  \defgroup Group_BoardInfo_MICROPENDOUS_REV2 MICROPENDOUS_REV2
+ *  \brief Board specific information header for the Micropendous Arduino-like Revision 2 (https://code.google.com/p/micropendous/wiki/Micropendous).
+ *
+ *  See \ref Group_BoardInfo_MICROPENDOUS_32U2 for more details.
+ */
+
+/** \ingroup Group_BoardInfo
+ *  \defgroup Group_BoardInfo_MICROPENDOUS_32U2 MICROPENDOUS_32U2
+ *  \brief Board specific information header for the Micropendous series boards.
+ *
+ *  Board specific information header for the Micropendous series boards (https://code.google.com/p/micropendous).
+ *
+ *  @{
+ */
+
+#ifndef __BOARD_MICROPENDOUS_H__
+#define __BOARD_MICROPENDOUS_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_BOARD_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			#if ((BOARD == BOARD_MICROPENDOUS_32U2) || (BOARD == BOARD_MICROPENDOUS_A) || \
+			     (BOARD == BOARD_MICROPENDOUS_1)    || (BOARD == BOARD_MICROPENDOUS_2) || \
+			     (BOARD == BOARD_MICROPENDOUS_3)    || (BOARD == BOARD_MICROPENDOUS_4) || \
+			     (BOARD == BOARD_MICROPENDOUS_REV1) || (BOARD == BOARD_MICROPENDOUS_REV2) || \
+			     (BOARD == BOARD_MICROPENDOUS_DIP) || defined(__DOXYGEN__))
+				#include "../../Buttons.h"
+
+				/** Indicates the board has hardware Buttons mounted. */
+				#define BOARD_HAS_BUTTONS
+			#endif
+
+			#if ((BOARD == BOARD_MICROPENDOUS_REV1) || (BOARD == BOARD_MICROPENDOUS_REV2) || \
+			     (BOARD == BOARD_MICROPENDOUS_32U2) || defined(__DOXYGEN__))
+				#include "../../LEDs.h"
+
+				/** Indicates the board has hardware LEDs mounted. */
+				#define BOARD_HAS_LEDS
+			#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/MICROPENDOUS/Buttons.h b/lib/lufa/LUFA/Drivers/Board/AVR8/MICROPENDOUS/Buttons.h
new file mode 100644
index 0000000000..c40ac1fe7c
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/MICROPENDOUS/Buttons.h
@@ -0,0 +1,205 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific Buttons driver header for the Micropendous series boards.
+ *  \copydetails Group_Buttons_MICROPENDOUS_32U2
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the Buttons driver
+ *        dispatch header located in LUFA/Drivers/Board/Buttons.h.
+ */
+
+/** \ingroup Group_Buttons
+ *  \defgroup Group_Buttons_MICROPENDOUS_A MICROPENDOUS_A
+ *  \brief Board specific Button driver header for the Micropendous A (https://code.google.com/p/micropendous/wiki/MicropendousA).
+ *
+ *  See \ref Group_Buttons_MICROPENDOUS_32U2 for more details.
+ */
+
+/** \ingroup Group_Buttons
+ *  \defgroup Group_Buttons_MICROPENDOUS_1 MICROPENDOUS_1
+ *  \brief Board specific Button driver header for the Micropendous 1 (https://code.google.com/p/micropendous/wiki/Micropendous1).
+ *
+ *  See \ref Group_Buttons_MICROPENDOUS_32U2 for more details.
+ */
+
+/** \ingroup Group_Buttons
+ *  \defgroup Group_Buttons_MICROPENDOUS_2 MICROPENDOUS_2
+ *  \brief Board specific Button driver header for the Micropendous 2 (https://code.google.com/p/micropendous/wiki/Micropendous2).
+ *
+ *  See \ref Group_Buttons_MICROPENDOUS_32U2 for more details.
+ */
+
+/** \ingroup Group_Buttons
+ *  \defgroup Group_Buttons_MICROPENDOUS_3 MICROPENDOUS_3
+ *  \brief Board specific Button driver header for the Micropendous 3 (https://code.google.com/p/micropendous/wiki/Micropendous3).
+ *
+ *  See \ref Group_Buttons_MICROPENDOUS_32U2 for more details.
+ */
+
+/** \ingroup Group_Buttons
+ *  \defgroup Group_Buttons_MICROPENDOUS_4 MICROPENDOUS_4
+ *  \brief Board specific Button driver header for the Micropendous 4 (https://code.google.com/p/micropendous/wiki/Micropendous4).
+ *
+ *  See \ref Group_Buttons_MICROPENDOUS_32U2 for more details.
+ */
+
+/** \ingroup Group_Buttons
+ *  \defgroup Group_Buttons_MICROPENDOUS_DIP MICROPENDOUS_DIP
+ *  \brief Board specific Button driver header for the Micropendous DIP (https://code.google.com/p/micropendous/wiki/MicropendousDIP).
+ *
+ *  See \ref Group_Buttons_MICROPENDOUS_32U2 for more details.
+ */
+
+/** \ingroup Group_Buttons
+ *  \defgroup Group_Buttons_MICROPENDOUS_REV1 MICROPENDOUS_REV1
+ *  \brief Board specific Button driver header for the Micropendous Arduino-like Revision 1 (https://code.google.com/p/micropendous/wiki/Micropendous).
+ *
+ *  See \ref Group_Buttons_MICROPENDOUS_32U2 for more details.
+ */
+
+/** \ingroup Group_Buttons
+ *  \defgroup Group_Buttons_MICROPENDOUS_REV2 MICROPENDOUS_REV2
+ *  \brief Board specific Button driver header for the Micropendous Arduino-like Revision 2 (https://code.google.com/p/micropendous/wiki/Micropendous).
+ *
+ *  See \ref Group_Buttons_MICROPENDOUS_32U2 for more details.
+ */
+
+/** \ingroup Group_Buttons
+ *  \defgroup Group_Buttons_MICROPENDOUS_32U2 MICROPENDOUS_32U2
+ *  \brief Board specific Buttons driver header for the Micropendous 32U2.
+ *
+ *  \note There are multiple supported Micropendous boards, compile with <code>BOARD = MICROPENDOUS_{VERSION}</code>.
+ *
+ *  Board specific Buttons driver header for the Micropendous 32U2 (https://code.google.com/p/micropendous/wiki/Micropendous_32U2).
+ *
+ *  <b>BOARD_MICROPENDOUS_1 and BOARD_MICROPENDOUS_32U2</b>:
+ *  <table>
+ *    <tr><th>Name</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr>
+ *    <tr><td>BUTTONS_BUTTON1</td><td>HWB Button</td><td>Low</td><td>PORTD.7</td></tr>
+ *  </table>
+ *
+ *  <b>Other Revisions</b>:
+ *  <table>
+ *    <tr><th>Name</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr>
+ *    <tr><td>BUTTONS_BUTTON1</td><td>HWB Button</td><td>Low</td><td>PORTE.2</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __BUTTONS_MICROPENDOUS_H__
+#define __BUTTONS_MICROPENDOUS_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_BUTTONS_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Buttons.h instead.
+		#endif
+
+	/* Private Interface - For use in library only: */
+	#if !defined(__DOXYGEN__)
+		#if (BOARD == BOARD_MICROPENDOUS_32U2)
+			#define _BOARD_BUTTON1_MASK             (1 << 7)
+			#define _BOARD_BUTTON_PORTLETTER        D
+		#elif (BOARD == BOARD_MICROPENDOUS_A)
+			#define _BOARD_BUTTON1_MASK             (1 << 2)
+			#define _BOARD_BUTTON_PORTLETTER        E
+		#elif (BOARD == BOARD_MICROPENDOUS_1)
+			#define _BOARD_BUTTON1_MASK             (1 << 7)
+			#define _BOARD_BUTTON_PORTLETTER        D
+		#elif (BOARD == BOARD_MICROPENDOUS_2)
+			#define _BOARD_BUTTON1_MASK             (1 << 2)
+			#define _BOARD_BUTTON_PORTLETTER        E
+		#elif (BOARD == BOARD_MICROPENDOUS_3)
+			#define _BOARD_BUTTON1_MASK             (1 << 2)
+			#define _BOARD_BUTTON_PORTLETTER        E
+		#elif (BOARD == BOARD_MICROPENDOUS_4)
+			#define _BOARD_BUTTON1_MASK             (1 << 2)
+			#define _BOARD_BUTTON_PORTLETTER        E
+		#elif (BOARD == BOARD_MICROPENDOUS_DIP)
+			#define _BOARD_BUTTON1_MASK             (1 << 2)
+			#define _BOARD_BUTTON_PORTLETTER        E
+		#elif (BOARD == BOARD_MICROPENDOUS_REV1)
+			#define _BOARD_BUTTON1_MASK             (1 << 2)
+			#define _BOARD_BUTTON_PORTLETTER        E
+		#elif (BOARD == BOARD_MICROPENDOUS_REV2)
+			#define _BOARD_BUTTON1_MASK             (1 << 2)
+			#define _BOARD_BUTTON_PORTLETTER        E
+		#endif
+
+		#define _BOARD_BUTTON_PORT                  CONCAT_EXPANDED(PORT, _BOARD_BUTTON_PORTLETTER)
+		#define _BOARD_BUTTON_PIN                   CONCAT_EXPANDED(PIN,  _BOARD_BUTTON_PORTLETTER)
+		#define _BOARD_BUTTON_DDR                   CONCAT_EXPANDED(DDR,  _BOARD_BUTTON_PORTLETTER)
+	#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Button mask for the first button on the board. */
+			#define BUTTONS_BUTTON1     _BOARD_BUTTON1_MASK
+
+		/* Inline Functions: */
+		#if !defined(__DOXYGEN__)
+			static inline void Buttons_Init(void)
+			{
+				_BOARD_BUTTON_DDR  &= ~BUTTONS_BUTTON1;
+				_BOARD_BUTTON_PORT |=  BUTTONS_BUTTON1;
+			}
+
+			static inline void Buttons_Disable(void)
+			{
+				_BOARD_BUTTON_DDR  &= ~BUTTONS_BUTTON1;
+				_BOARD_BUTTON_PORT &= ~BUTTONS_BUTTON1;
+			}
+
+			static inline uint8_t Buttons_GetStatus(void) ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t Buttons_GetStatus(void)
+			{
+				return ((_BOARD_BUTTON_PIN & BUTTONS_BUTTON1) ^ BUTTONS_BUTTON1);
+			}
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/MICROPENDOUS/LEDs.h b/lib/lufa/LUFA/Drivers/Board/AVR8/MICROPENDOUS/LEDs.h
new file mode 100644
index 0000000000..2ab89eb5b1
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/MICROPENDOUS/LEDs.h
@@ -0,0 +1,174 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific LED driver header for the Micropendous series boards.
+ *  \copydetails Group_LEDs_MICROPENDOUS_32U2
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the LEDs driver
+ *        dispatch header located in LUFA/Drivers/Board/LEDs.h.
+ */
+
+/** \ingroup Group_LEDs
+ *  \defgroup Group_LEDs_MICROPENDOUS_REV1 MICROPENDOUS_REV1
+ *  \brief Board specific LED driver header for the Micropendous Arduino-like Revision 1 (https://code.google.com/p/micropendous/wiki/Micropendous).
+ *
+ *  See \ref Group_LEDs_MICROPENDOUS_32U2 for more details.
+ */
+
+/** \ingroup Group_LEDs
+ *  \defgroup Group_LEDs_MICROPENDOUS_REV2 MICROPENDOUS_REV2
+ *  \brief Board specific LED driver header for the Micropendous Arduino-like Revision 2 (https://code.google.com/p/micropendous/wiki/Micropendous).
+ *
+ *  See \ref Group_LEDs_MICROPENDOUS_32U2 for more details.
+ */
+
+/** \ingroup Group_LEDs
+ *  \defgroup Group_LEDs_MICROPENDOUS_32U2 MICROPENDOUS_32U2
+ *  \brief Board specific LED driver header for the Micropendous-32U2.
+ *
+ *  Board specific LED driver header for the Micropendous 32U2 (https://code.google.com/p/micropendous/wiki/Micropendous_32U2).
+ *
+ *  <b>BOARD_MICROPENDOUS_32U2</b>:
+ *  <table>
+ *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr>
+ *    <tr><td>LEDS_LED1</td><td>Green</td><td>General Indicator</td><td>High</td><td>PORTD.6</td></tr>
+ *  </table>
+ *
+ *  <b>Other Revisions</b>:
+ *  <table>
+ *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr>
+ *    <tr><td>LEDS_LED1</td><td>Green</td><td>General Indicator</td><td>High</td><td>PORTB.1</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __LEDS_MICROPENDOUS_H__
+#define __LEDS_MICROPENDOUS_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_LEDS_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/LEDS.h instead.
+		#endif
+
+	/* Private Interface - For use in library only: */
+	#if !defined(__DOXYGEN__)
+		#if (BOARD == BOARD_MICROPENDOUS_32U2)
+			#define _BOARD_LED1_MASK                (1 << 6)
+			#define _BOARD_LED_PORTLETTER           D
+		#elif (BOARD == BOARD_MICROPENDOUS_REV1)
+			#define _BOARD_LED1_MASK                (1 << 1)
+			#define _BOARD_LED_PORTLETTER           B
+		#elif (BOARD == BOARD_MICROPENDOUS_REV2)
+			#define _BOARD_LED1_MASK                (1 << 1)
+			#define _BOARD_LED_PORTLETTER           B
+		#endif
+
+		#define _BOARD_LED_PORT                     CONCAT_EXPANDED(PORT, _BOARD_LED_PORTLETTER)
+		#define _BOARD_LED_PIN                      CONCAT_EXPANDED(PIN,  _BOARD_LED_PORTLETTER)
+		#define _BOARD_LED_DDR                      CONCAT_EXPANDED(DDR,  _BOARD_LED_PORTLETTER)
+	#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** LED mask for the first LED on the board. */
+			#define LEDS_LED1        _BOARD_LED1_MASK
+
+			/** LED mask for all the LEDs on the board. */
+			#define LEDS_ALL_LEDS    LEDS_LED1
+
+			/** LED mask for the none of the board LEDs. */
+			#define LEDS_NO_LEDS     0
+
+		/* Inline Functions: */
+		#if !defined(__DOXYGEN__)
+			static inline void LEDs_Init(void)
+			{
+				_BOARD_LED_DDR  |=  LEDS_ALL_LEDS;
+				_BOARD_LED_PORT &= ~LEDS_ALL_LEDS;
+			}
+
+			static inline void LEDs_Disable(void)
+			{
+				_BOARD_LED_DDR  &= ~LEDS_ALL_LEDS;
+				_BOARD_LED_PORT &= ~LEDS_ALL_LEDS;
+			}
+
+			static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask)
+			{
+				_BOARD_LED_PORT |= LEDMask;
+			}
+
+			static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask)
+			{
+				_BOARD_LED_PORT &= ~LEDMask;
+			}
+
+			static inline void LEDs_SetAllLEDs(const uint8_t LEDMask)
+			{
+				_BOARD_LED_PORT = ((_BOARD_LED_PORT & ~LEDS_ALL_LEDS) | LEDMask);
+			}
+
+			static inline void LEDs_ChangeLEDs(const uint8_t LEDMask,
+			                                   const uint8_t ActiveMask)
+			{
+				_BOARD_LED_PORT = ((_BOARD_LED_PORT & ~LEDMask) | ActiveMask);
+			}
+
+			static inline void LEDs_ToggleLEDs(const uint8_t LEDMask)
+			{
+				_BOARD_LED_PIN  = LEDMask;
+			}
+
+			static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t LEDs_GetLEDs(void)
+			{
+				return (_BOARD_LED_PORT & LEDS_ALL_LEDS);
+			}
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/MICROSIN162/Board.h b/lib/lufa/LUFA/Drivers/Board/AVR8/MICROSIN162/Board.h
new file mode 100644
index 0000000000..1e503c3c8a
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/MICROSIN162/Board.h
@@ -0,0 +1,82 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific information header for the Microsin AVR-USB162 board.
+ *  \copydetails Group_BoardInfo_MICROSIN162
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the Board driver
+ *        dispatch header located in LUFA/Drivers/Board/Board.h.
+ */
+
+/** \ingroup Group_BoardInfo
+ *  \defgroup Group_BoardInfo_MICROSIN162 MICROSIN162
+ *  \brief Board specific information header for the Microsin AVR-USB162 board.
+ *
+ *  Board specific information header for the Microsin AVR-USB162 board (http://microsin.ru/content/view/685/44/).
+ *
+ *  @{
+ */
+
+#ifndef __BOARD_MICROSIN162_H__
+#define __BOARD_MICROSIN162_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+		#include "../../Buttons.h"
+		#include "../../LEDs.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_BOARD_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Indicates the board has hardware Buttons mounted. */
+			#define BOARD_HAS_BUTTONS
+
+			/** Indicates the board has hardware LEDs mounted. */
+			#define BOARD_HAS_LEDS
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/MICROSIN162/Buttons.h b/lib/lufa/LUFA/Drivers/Board/AVR8/MICROSIN162/Buttons.h
new file mode 100644
index 0000000000..1c90fab1e9
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/MICROSIN162/Buttons.h
@@ -0,0 +1,103 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific Buttons driver header for the Microsin AVR-USB162 board.
+ *  \copydetails Group_Buttons_MICROSIN162
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the Buttons driver
+ *        dispatch header located in LUFA/Drivers/Board/Buttons.h.
+ */
+
+/** \ingroup Group_Buttons
+ *  \defgroup Group_Buttons_MICROSIN162 MICROSIN162
+ *  \brief Board specific Buttons driver header for the Microsin AVR-USB162 board.
+ *
+ *  Board specific Buttons driver header for the Microsin AVR-USB162 board (http://microsin.ru/content/view/685/44/).
+ *
+ *  <table>
+ *    <tr><th>Name</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr>
+ *    <tr><td>BUTTONS_BUTTON1</td><td>HWB Button</td><td>Low</td><td>PORTD.7</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __BUTTONS_MICROSIN162_H__
+#define __BUTTONS_MICROSIN162_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_BUTTONS_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Buttons.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Button mask for the first button on the board. */
+			#define BUTTONS_BUTTON1      (1 << 7)
+
+		/* Inline Functions: */
+		#if !defined(__DOXYGEN__)
+			static inline void Buttons_Init(void)
+			{
+				DDRD  &= ~BUTTONS_BUTTON1;
+				PORTD |=  BUTTONS_BUTTON1;
+			}
+
+			static inline void Buttons_Disable(void)
+			{
+				DDRD  &= ~BUTTONS_BUTTON1;
+				PORTD &= ~BUTTONS_BUTTON1;
+			}
+
+			static inline uint8_t Buttons_GetStatus(void) ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t Buttons_GetStatus(void)
+			{
+				return ((PIND & BUTTONS_BUTTON1) ^ BUTTONS_BUTTON1);
+			}
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/MICROSIN162/LEDs.h b/lib/lufa/LUFA/Drivers/Board/AVR8/MICROSIN162/LEDs.h
new file mode 100644
index 0000000000..690ce7df8d
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/MICROSIN162/LEDs.h
@@ -0,0 +1,135 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific LED driver header for the Microsin AVR-USB162 board.
+ *  \copydetails Group_LEDs_MICROSIN162
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the LEDs driver
+ *        dispatch header located in LUFA/Drivers/Board/LEDs.h.
+ */
+
+/** \ingroup Group_LEDs
+ *  \defgroup Group_LEDs_MICROSIN162 MICROSIN162
+ *  \brief Board specific LED driver header for the Microsin AVR-USB162 board.
+ *
+ *  Board specific LED driver header for the Microsin AVR-USB162 board (http://microsin.ru/content/view/685/44/).
+ *
+ *  <table>
+ *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr>
+ *    <tr><td>LEDS_LED1</td><td>Green</td><td>General Indicator</td><td>Low</td><td>PORTD.4</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __LEDS_MICROSIN162_H__
+#define __LEDS_MICROSIN162_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_LEDS_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/LEDS.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** LED mask for the first LED on the board. */
+			#define LEDS_LED1        (1 << 4)
+
+			/** LED mask for all the LEDs on the board. */
+			#define LEDS_ALL_LEDS    LEDS_LED1
+
+			/** LED mask for none of the board LEDs. */
+			#define LEDS_NO_LEDS     0
+
+		/* Inline Functions: */
+		#if !defined(__DOXYGEN__)
+			static inline void LEDs_Init(void)
+			{
+				DDRD  |= LEDS_ALL_LEDS;
+				PORTD |= LEDS_ALL_LEDS;
+			}
+
+			static inline void LEDs_Disable(void)
+			{
+				DDRD  &= ~LEDS_ALL_LEDS;
+				PORTD &= ~LEDS_ALL_LEDS;
+			}
+
+			static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask)
+			{
+				PORTD &= ~LEDMask;
+			}
+
+			static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask)
+			{
+				PORTD |= LEDMask;
+			}
+
+			static inline void LEDs_SetAllLEDs(const uint8_t LEDMask)
+			{
+				PORTD = ((PORTD | LEDS_ALL_LEDS) & ~LEDMask);
+			}
+
+			static inline void LEDs_ChangeLEDs(const uint8_t LEDMask,
+			                                   const uint8_t ActiveMask)
+			{
+				PORTD = ((PORTD | LEDMask) & ~ActiveMask);
+			}
+
+			static inline void LEDs_ToggleLEDs(const uint8_t LEDMask)
+			{
+				PIND  = LEDMask;
+			}
+
+			static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t LEDs_GetLEDs(void)
+			{
+				return (~PORTD & LEDS_ALL_LEDS);
+			}
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/MINIMUS/Board.h b/lib/lufa/LUFA/Drivers/Board/AVR8/MINIMUS/Board.h
new file mode 100644
index 0000000000..53bc2daf57
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/MINIMUS/Board.h
@@ -0,0 +1,82 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific information header for the MINIMUS.
+ *  \copydetails Group_BoardInfo_MINIMUS
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the Board driver
+ *        dispatch header located in LUFA/Drivers/Board/Board.h.
+ */
+
+/** \ingroup Group_BoardInfo
+ *  \defgroup Group_BoardInfo_MINIMUS MINIMUS
+ *  \brief Board specific information header for the MINIMUS.
+ *
+ *  Board specific information header for the MINIMUS.
+ *
+ *  @{
+ */
+
+#ifndef __BOARD_MINIMUS_H__
+#define __BOARD_MINIMUS_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+		#include "../../Buttons.h"
+		#include "../../LEDs.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_BOARD_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Indicates the board has hardware Buttons mounted. */
+			#define BOARD_HAS_BUTTONS
+
+			/** Indicates the board has hardware LEDs mounted. */
+			#define BOARD_HAS_LEDS
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/MINIMUS/Buttons.h b/lib/lufa/LUFA/Drivers/Board/AVR8/MINIMUS/Buttons.h
new file mode 100644
index 0000000000..f83924c52e
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/MINIMUS/Buttons.h
@@ -0,0 +1,103 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific Buttons driver header for the MINIMUS.
+ *  \copydetails Group_Buttons_MINIMUS
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the Buttons driver
+ *        dispatch header located in LUFA/Drivers/Board/Buttons.h.
+ */
+
+/** \ingroup Group_Buttons
+ *  \defgroup Group_Buttons_MINIMUS MINIMUS
+ *  \brief Board specific Buttons driver header for the MINIMUS.
+ *
+ *  Board specific Buttons driver header for the MINIMUS.
+ *
+ *  <table>
+ *    <tr><th>Name</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr>
+ *    <tr><td>BUTTONS_BUTTON1</td><td>HWB Button</td><td>Low</td><td>PORTD.7</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __BUTTONS_MINIMUS_H__
+#define __BUTTONS_MINIMUS_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_BUTTONS_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Buttons.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Button mask for the first button on the board. */
+			#define BUTTONS_BUTTON1      (1 << 7)
+
+		/* Inline Functions: */
+		#if !defined(__DOXYGEN__)
+			static inline void Buttons_Init(void)
+			{
+				DDRD  &= ~BUTTONS_BUTTON1;
+				PORTD |=  BUTTONS_BUTTON1;
+			}
+
+			static inline void Buttons_Disable(void)
+			{
+				DDRD  &= ~BUTTONS_BUTTON1;
+				PORTD &= ~BUTTONS_BUTTON1;
+			}
+
+			static inline uint8_t Buttons_GetStatus(void) ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t Buttons_GetStatus(void)
+			{
+				return ((PIND & BUTTONS_BUTTON1) ^ BUTTONS_BUTTON1);
+			}
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/MINIMUS/LEDs.h b/lib/lufa/LUFA/Drivers/Board/AVR8/MINIMUS/LEDs.h
new file mode 100644
index 0000000000..5569323081
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/MINIMUS/LEDs.h
@@ -0,0 +1,139 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific LED driver header for the MINIMUS.
+ *  \copydetails Group_LEDs_MINIMUS
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the LEDs driver
+ *        dispatch header located in LUFA/Drivers/Board/LEDs.h.
+ */
+
+/** \ingroup Group_LEDs
+ *  \defgroup Group_LEDs_MINIMUS MINIMUS
+ *  \brief Board specific LED driver header for the MINIMUS.
+ *
+ *  Board specific LED driver header for the Minimus USB (http://www.minimususb.com/).
+ *
+ *  <table>
+ *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr>
+ *    <tr><td>LEDS_LED1</td><td>Blue</td><td>General Indicator</td><td>Low</td><td>PORTD.5</td></tr>
+ *    <tr><td>LEDS_LED2</td><td>Red</td><td>General Indicator</td><td>Low</td><td>PORTD.6</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __LEDS_MINIMUS_H__
+#define __LEDS_MINIMUS_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_LEDS_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/LEDS.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** LED mask for the first LED on the board. */
+			#define LEDS_LED1        (1 << 5)
+
+			/** LED mask for the second LED on the board. */
+			#define LEDS_LED2        (1 << 6)
+
+			/** LED mask for all the LEDs on the board. */
+			#define LEDS_ALL_LEDS    (LEDS_LED1 | LEDS_LED2)
+
+			/** LED mask for the none of the board LEDs. */
+			#define LEDS_NO_LEDS     0
+
+		/* Inline Functions: */
+		#if !defined(__DOXYGEN__)
+			static inline void LEDs_Init(void)
+			{
+				DDRD  |= LEDS_ALL_LEDS;
+				PORTD |= LEDS_ALL_LEDS;
+			}
+
+			static inline void LEDs_Disable(void)
+			{
+				DDRD  &= ~LEDS_ALL_LEDS;
+				PORTD &= ~LEDS_ALL_LEDS;
+			}
+
+			static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask)
+			{
+				PORTD &= ~LEDMask;
+			}
+
+			static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask)
+			{
+				PORTD |=  LEDMask;
+			}
+
+			static inline void LEDs_SetAllLEDs(const uint8_t LEDMask)
+			{
+				PORTD = ((PORTD | LEDS_ALL_LEDS) & ~LEDMask);
+			}
+
+			static inline void LEDs_ChangeLEDs(const uint8_t LEDMask,
+			                                   const uint8_t ActiveMask)
+			{
+				PORTD = ((PORTD & ~LEDMask) | ActiveMask);
+			}
+
+			static inline void LEDs_ToggleLEDs(const uint8_t LEDMask)
+			{
+				PIND  = LEDMask;
+			}
+
+			static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t LEDs_GetLEDs(void)
+			{
+				return (~PORTD & LEDS_ALL_LEDS);
+			}
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/MULTIO/Board.h b/lib/lufa/LUFA/Drivers/Board/AVR8/MULTIO/Board.h
new file mode 100644
index 0000000000..d701dc31b2
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/MULTIO/Board.h
@@ -0,0 +1,78 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific information header for the Bitwizard Multio.
+ *  \copydetails Group_BoardInfo_MULTIO
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the Board driver
+ *        dispatch header located in LUFA/Drivers/Board/Board.h.
+ */
+
+/** \ingroup Group_BoardInfo
+ *  \defgroup Group_BoardInfo_MULTIO MULTIO
+ *  \brief Board specific information header for the Bitwizard Multio.
+ *
+ *  Board specific information header for the Bitwizard Multio (http://www.bitwizard.nl/wiki/index.php/USB-multio).
+ *
+ *  @{
+ */
+
+#ifndef __BOARD_MULTIO_H__
+#define __BOARD_MULTIO_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+		#include "../../LEDs.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_BOARD_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Indicates the board has hardware LEDs mounted. */
+			#define BOARD_HAS_LEDS
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/MULTIO/LEDs.h b/lib/lufa/LUFA/Drivers/Board/AVR8/MULTIO/LEDs.h
new file mode 100644
index 0000000000..9d3bf6a49f
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/MULTIO/LEDs.h
@@ -0,0 +1,161 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific LED driver header for the Bitwizard Multio.
+ *  \copydetails Group_LEDs_MULTIO
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the LEDs driver
+ *        dispatch header located in LUFA/Drivers/Board/LEDs.h.
+ */
+
+/** \ingroup Group_LEDs
+ *  \defgroup Group_LEDs_MULTIO MULTIO
+ *  \brief Board specific LED driver header for the Bitwizard Multio.
+ *
+ *  Board specific LED driver header for the Bitwizard Multio (http://www.bitwizard.nl/wiki/index.php/USB-multio).
+ *
+ *  <table>
+ *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr>
+ *    <tr><td>LEDS_LED1</td><td>Green</td><td>General Indicator</td><td>High</td><td>PORTD.0</td></tr>
+ *    <tr><td>LEDS_LED2</td><td>Green</td><td>General Indicator</td><td>High</td><td>PORTC.2</td></tr>
+ *    <tr><td>LEDS_LED3</td><td>Green</td><td>General Indicator</td><td>High</td><td>PORTD.7</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __LEDS_MULTIO_H__
+#define __LEDS_MULTIO_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_LEDS_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/LEDS.h instead.
+		#endif
+
+	/* Private Interface - For use in library only: */
+	#if !defined(__DOXYGEN__)
+		/* Macros: */
+			#define LEDS_PORTD_LEDS       (LEDS_LED1 | LEDS_LED3)
+			#define LEDS_PORTC_LEDS       LEDS_LED2
+	#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** LED mask for the first LED on the board. */
+			#define LEDS_LED1        (1 << 0)
+
+			/** LED mask for the second LED on the board. */
+			#define LEDS_LED2        (1 << 2)
+
+			/** LED mask for the second LED on the board. */
+			#define LEDS_LED3        (1 << 7)
+
+			/** LED mask for all the LEDs on the board. */
+			#define LEDS_ALL_LEDS    (LEDS_LED1 | LEDS_LED2 | LEDS_LED3)
+
+			/** LED mask for none of the board LEDs. */
+			#define LEDS_NO_LEDS     0
+
+		/* Inline Functions: */
+		#if !defined(__DOXYGEN__)
+			static inline void LEDs_Init(void)
+			{
+				DDRD  |=  LEDS_PORTD_LEDS;
+				DDRC  |=  LEDS_PORTC_LEDS;
+
+				PORTD &= ~LEDS_PORTD_LEDS;
+				PORTC &= ~LEDS_PORTC_LEDS;
+			}
+
+			static inline void LEDs_Disable(void)
+			{
+				DDRD  &= ~LEDS_PORTD_LEDS;
+				DDRC  &= ~LEDS_PORTC_LEDS;
+
+				PORTD &= ~LEDS_PORTD_LEDS;
+				PORTC &= ~LEDS_PORTC_LEDS;
+			}
+
+			static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask)
+			{
+				PORTD |= (LEDMask & LEDS_PORTD_LEDS);
+				PORTC |= (LEDMask & LEDS_PORTC_LEDS);
+			}
+
+			static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask)
+			{
+				PORTD &= ~(LEDMask & LEDS_PORTD_LEDS);
+				PORTC &= ~(LEDMask & LEDS_PORTC_LEDS);
+			}
+
+			static inline void LEDs_SetAllLEDs(const uint8_t LEDMask)
+			{
+				PORTD = (PORTD & ~LEDS_PORTD_LEDS) | (LEDMask & LEDS_PORTD_LEDS);
+				PORTC = (PORTC & ~LEDS_PORTC_LEDS) | (LEDMask & LEDS_PORTC_LEDS);
+			}
+
+			static inline void LEDs_ChangeLEDs(const uint8_t LEDMask,
+			                                   const uint8_t ActiveMask)
+			{
+				PORTD = (PORTD & ~(LEDMask & LEDS_PORTD_LEDS)) | (ActiveMask & LEDS_PORTD_LEDS);
+				PORTC = (PORTC & ~(LEDMask & LEDS_PORTC_LEDS)) | (ActiveMask & LEDS_PORTC_LEDS);
+			}
+
+			static inline void LEDs_ToggleLEDs(const uint8_t LEDMask)
+			{
+				PIND  = (LEDMask & LEDS_PORTD_LEDS);
+				PINC  = (LEDMask & LEDS_PORTC_LEDS);
+			}
+
+			static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t LEDs_GetLEDs(void)
+			{
+				return ((PORTD & LEDS_PORTD_LEDS) | (PORTC & LEDS_PORTC_LEDS));
+			}
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/OLIMEX162/Board.h b/lib/lufa/LUFA/Drivers/Board/AVR8/OLIMEX162/Board.h
new file mode 100644
index 0000000000..64c657758a
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/OLIMEX162/Board.h
@@ -0,0 +1,82 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific information header for the Olimex AVR-USB-162 Development Board.
+ *  \copydetails Group_BoardInfo_OLIMEX162
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the Board driver
+ *        dispatch header located in LUFA/Drivers/Board/Board.h.
+ */
+
+/** \ingroup Group_BoardInfo
+ *  \defgroup Group_BoardInfo_OLIMEX162 OLIMEX162
+ *  \brief Board specific information header for the Olimex AVR-USB-162 Development Board.
+ *
+ *  Board specific information header for the Olimex AVR-USB-162 Development Board (http://www.olimex.com/dev/avr-usb-162.html).
+ *
+ *  @{
+ */
+
+#ifndef __BOARD_OLIMEX162_H__
+#define __BOARD_OLIMEX162_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+		#include "../../Buttons.h"
+		#include "../../LEDs.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_BOARD_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Indicates the board has hardware Buttons mounted. */
+			#define BOARD_HAS_BUTTONS
+
+			/** Indicates the board has hardware LEDs mounted. */
+			#define BOARD_HAS_LEDS
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/OLIMEX162/Buttons.h b/lib/lufa/LUFA/Drivers/Board/AVR8/OLIMEX162/Buttons.h
new file mode 100644
index 0000000000..f8ed8714d5
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/OLIMEX162/Buttons.h
@@ -0,0 +1,103 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific Buttons driver header for the Olimex AVR-USB-162 Development Board.
+ *  \copydetails Group_Buttons_OLIMEX162
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the Buttons driver
+ *        dispatch header located in LUFA/Drivers/Board/Buttons.h.
+ */
+
+/** \ingroup Group_Buttons
+ *  \defgroup Group_Buttons_OLIMEX162 OLIMEX162
+ *  \brief Board specific Buttons driver header for the Olimex AVR-USB-162 Development Board.
+ *
+ *  Board specific Buttons driver header for the Olimex AVR-USB-162 Development Board (http://www.olimex.com/dev/avr-usb-162.html).
+ *
+ *  <table>
+ *    <tr><th>Name</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr>
+ *    <tr><td>BUTTONS_BUTTON1</td><td>HWB Button</td><td>Low</td><td>PORTD.7</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __BUTTONS_OLIMEX162_H__
+#define __BUTTONS_OLIMEX162_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_BUTTONS_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Buttons.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Button mask for the first button on the board. */
+			#define BUTTONS_BUTTON1      (1 << 7)
+
+		/* Inline Functions: */
+		#if !defined(__DOXYGEN__)
+			static inline void Buttons_Init(void)
+			{
+				DDRD  &= ~BUTTONS_BUTTON1;
+				PORTD |=  BUTTONS_BUTTON1;
+			}
+
+			static inline void Buttons_Disable(void)
+			{
+				DDRD  &= ~BUTTONS_BUTTON1;
+				PORTD &= ~BUTTONS_BUTTON1;
+			}
+
+			static inline uint8_t Buttons_GetStatus(void) ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t Buttons_GetStatus(void)
+			{
+				return ((PIND & BUTTONS_BUTTON1) ^ BUTTONS_BUTTON1);
+			}
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/OLIMEX162/LEDs.h b/lib/lufa/LUFA/Drivers/Board/AVR8/OLIMEX162/LEDs.h
new file mode 100644
index 0000000000..52d82ef96a
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/OLIMEX162/LEDs.h
@@ -0,0 +1,135 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific LED driver header for the Olimex AVR-USB-162.
+ *  \copydetails Group_LEDs_OLIMEX162
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the LEDs driver
+ *        dispatch header located in LUFA/Drivers/Board/LEDs.h.
+ */
+
+/** \ingroup Group_LEDs
+ *  \defgroup Group_LEDs_OLIMEX162 OLIMEX162
+ *  \brief Board specific LED driver header for the Olimex AVR-USB-162.
+ *
+ *  Board specific LED driver header for the Olimex AVR-USB-162 (http://www.olimex.com/dev/avr-usb-162.html).
+ *
+ *  <table>
+ *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr>
+ *    <tr><td>LEDS_LED1</td><td>Yellow</td><td>General Indicator</td><td>High</td><td>PORTD.4</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __LEDS_OLIMEX162_H__
+#define __LEDS_OLIMEX162_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_LEDS_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/LEDS.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** LED mask for the first LED on the board. */
+			#define LEDS_LED1        (1 << 4)
+
+			/** LED mask for all the LEDs on the board. */
+			#define LEDS_ALL_LEDS    LEDS_LED1
+
+			/** LED mask for none of the board LEDs. */
+			#define LEDS_NO_LEDS     0
+
+		/* Inline Functions: */
+		#if !defined(__DOXYGEN__)
+			static inline void LEDs_Init(void)
+			{
+				DDRD  |=  LEDS_ALL_LEDS;
+				PORTD &= ~LEDS_ALL_LEDS;
+			}
+
+			static inline void LEDs_Disable(void)
+			{
+				DDRD  &= ~LEDS_ALL_LEDS;
+				PORTD &= ~LEDS_ALL_LEDS;
+			}
+
+			static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask)
+			{
+				PORTD |= LEDMask;
+			}
+
+			static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask)
+			{
+				PORTD &= ~LEDMask;
+			}
+
+			static inline void LEDs_SetAllLEDs(const uint8_t LEDMask)
+			{
+				PORTD = ((PORTD & ~LEDS_ALL_LEDS) | LEDMask);
+			}
+
+			static inline void LEDs_ChangeLEDs(const uint8_t LEDMask,
+			                                   const uint8_t ActiveMask)
+			{
+				PORTD = ((PORTD & ~LEDMask) | ActiveMask);
+			}
+
+			static inline void LEDs_ToggleLEDs(const uint8_t LEDMask)
+			{
+				PIND  = LEDMask;
+			}
+
+			static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t LEDs_GetLEDs(void)
+			{
+				return (PORTD & LEDS_ALL_LEDS);
+			}
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/OLIMEX32U4/Board.h b/lib/lufa/LUFA/Drivers/Board/AVR8/OLIMEX32U4/Board.h
new file mode 100644
index 0000000000..f063b9f9e7
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/OLIMEX32U4/Board.h
@@ -0,0 +1,82 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific information header for the Olimex AVR-USB-32U4 Development Board.
+ *  \copydetails Group_BoardInfo_OLIMEX32U4
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the Board driver
+ *        dispatch header located in LUFA/Drivers/Board/Board.h.
+ */
+
+/** \ingroup Group_BoardInfo
+ *  \defgroup Group_BoardInfo_OLIMEX32U4 OLIMEX32U4
+ *  \brief Board specific information header for the Olimex AVR-USB-32U4 Development Board.
+ *
+ *  Board specific information header for the Olimex AVR-USB-32U4 Development Board (http://www.olimex.com/dev/olimexino-32u4.html).
+ *
+ *  @{
+ */
+
+#ifndef __BOARD_OLIMEX32U4_H__
+#define __BOARD_OLIMEX32U4_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+		#include "../../Buttons.h"
+		#include "../../LEDs.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_BOARD_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Indicates the board has hardware Buttons mounted. */
+			#define BOARD_HAS_BUTTONS
+
+			/** Indicates the board has hardware LEDs mounted. */
+			#define BOARD_HAS_LEDS
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/OLIMEX32U4/Buttons.h b/lib/lufa/LUFA/Drivers/Board/AVR8/OLIMEX32U4/Buttons.h
new file mode 100644
index 0000000000..fecc637043
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/OLIMEX32U4/Buttons.h
@@ -0,0 +1,103 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific Buttons driver header for the Olimex AVR-USB-32U4 Development Board.
+ *  \copydetails Group_Buttons_OLIMEX32U4
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the Buttons driver
+ *        dispatch header located in LUFA/Drivers/Board/Buttons.h.
+ */
+
+/** \ingroup Group_Buttons
+ *  \defgroup Group_Buttons_OLIMEX32U4 OLIMEX32U4
+ *  \brief Board specific Buttons driver header for the Olimex AVR-USB-32U4 Development Board.
+ *
+ *  Board specific Buttons driver header for the Olimex AVR-USB-32U4 Development Board (http://www.olimex.com/dev/olimexino-32u4.html).
+ *
+ *  <table>
+ *    <tr><th>Name</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr>
+ *    <tr><td>BUTTONS_BUTTON1</td><td>HWB Button</td><td>Low</td><td>PORTE.2</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __BUTTONS_OLIMEX32U4_H__
+#define __BUTTONS_OLIMEX32U4_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_BUTTONS_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Buttons.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Button mask for the first button on the board. */
+			#define BUTTONS_BUTTON1      (1 << 2)
+
+		/* Inline Functions: */
+		#if !defined(__DOXYGEN__)
+			static inline void Buttons_Init(void)
+			{
+				DDRE  &= ~BUTTONS_BUTTON1;
+				PORTE |=  BUTTONS_BUTTON1;
+			}
+
+			static inline void Buttons_Disable(void)
+			{
+				DDRE  &= ~BUTTONS_BUTTON1;
+				PORTE &= ~BUTTONS_BUTTON1;
+			}
+
+			static inline uint8_t Buttons_GetStatus(void) ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t Buttons_GetStatus(void)
+			{
+				return ((PINE & BUTTONS_BUTTON1) ^ BUTTONS_BUTTON1);
+			}
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/OLIMEX32U4/LEDs.h b/lib/lufa/LUFA/Drivers/Board/AVR8/OLIMEX32U4/LEDs.h
new file mode 100644
index 0000000000..51eeaceab5
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/OLIMEX32U4/LEDs.h
@@ -0,0 +1,179 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific LED driver header for the Olimex AVR-USB-32U4.
+ *  \copydetails Group_LEDs_OLIMEX32U4
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the LEDs driver
+ *        dispatch header located in LUFA/Drivers/Board/LEDs.h.
+ */
+
+/** \ingroup Group_LEDs
+ *  \defgroup Group_LEDs_OLIMEX32U4 OLIMEX32U4
+ *  \brief Board specific LED driver header for the Olimex AVR-USB-32U4.
+ *
+ *  Board specific LED driver header for the Olimex AVR-USB-32U4 (http://www.olimex.com/dev/olimexino-32u4.html).
+ *
+ *  <table>
+ *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr>
+ *    <tr><td>LEDS_LED1</td><td>Green</td><td>TX</td><td>High</td><td>PORTD.5</td></tr>
+ *    <tr><td>LEDS_LED2</td><td>Yellow</td><td>RX</td><td>High</td><td>PORTB.0</td></tr>
+ *    <tr><td>LEDS_LED3</td><td>Green</td><td>General Indicator (Default Unconnected)</td><td>High</td><td>PORTE.6</td></tr>
+ *    <tr><td>LEDS_LED4</td><td>Yellow</td><td>General Indicator (Default Unconnected)</td><td>High</td><td>PORTB.5</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __LEDS_OLIMEX32U4_H__
+#define __LEDS_OLIMEX32U4_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_LEDS_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/LEDS.h instead.
+		#endif
+
+	/* Private Interface - For use in library only: */
+	#if !defined(__DOXYGEN__)
+		/* Macros: */
+			#define LEDS_PORTB_LEDS       (LEDS_LED2 | LEDS_LED4)
+			#define LEDS_PORTD_LEDS       (LEDS_LED1)
+			#define LEDS_PORTE_LEDS       (LEDS_LED3)
+
+			#define LEDS_PORTD_MASK_SHIFT 1
+	#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** LED mask for the first LED on the board. */
+			#define LEDS_LED1        ((1 << 5) >> LEDS_PORTD_MASK_SHIFT)
+
+			/** LED mask for the second LED on the board. */
+			#define LEDS_LED2        (1 << 0)
+
+			/** LED mask for the third LED on the board. */
+			#define LEDS_LED3        (1 << 6)
+
+			/** LED mask for the fourth LED on the board. */
+			#define LEDS_LED4        (1 << 5)
+
+			/** LED mask for all the LEDs on the board. */
+			#define LEDS_ALL_LEDS    (LEDS_LED1 | LEDS_LED2 | LEDS_LED3 | LEDS_LED4)
+
+			/** LED mask for none of the board LEDs. */
+			#define LEDS_NO_LEDS     0
+
+		/* Inline Functions: */
+		#if !defined(__DOXYGEN__)
+			static inline void LEDs_Init(void)
+			{
+				DDRB  |=  LEDS_PORTB_LEDS;
+				PORTB &= ~LEDS_PORTB_LEDS;
+				DDRD  |=  (LEDS_PORTD_LEDS << LEDS_PORTD_MASK_SHIFT);
+				PORTD &= ~(LEDS_PORTD_LEDS << LEDS_PORTD_MASK_SHIFT);
+				DDRE  |=  LEDS_PORTE_LEDS;
+				PORTE &= ~LEDS_PORTE_LEDS;
+			}
+
+			static inline void LEDs_Disable(void)
+			{
+				DDRB  &= ~LEDS_PORTB_LEDS;
+				PORTB &= ~LEDS_PORTB_LEDS;
+				DDRD  &= ~(LEDS_PORTD_LEDS << LEDS_PORTD_MASK_SHIFT);
+				PORTD &= ~(LEDS_PORTD_LEDS << LEDS_PORTD_MASK_SHIFT);
+				DDRE  &= ~LEDS_PORTE_LEDS;
+				PORTE &= ~LEDS_PORTE_LEDS;
+			}
+
+			static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask)
+			{
+				PORTB |= (LEDMask & LEDS_PORTB_LEDS);
+				PORTD |= ((LEDMask & LEDS_PORTD_LEDS) << LEDS_PORTD_MASK_SHIFT);
+				PORTE |= (LEDMask & LEDS_PORTE_LEDS);
+			}
+
+			static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask)
+			{
+				PORTB &= ~(LEDMask & LEDS_PORTB_LEDS);
+				PORTD &= ~((LEDMask & LEDS_PORTD_LEDS) << LEDS_PORTD_MASK_SHIFT);
+				PORTE &= ~(LEDMask & LEDS_PORTE_LEDS);
+			}
+
+			static inline void LEDs_SetAllLEDs(const uint8_t LEDMask)
+			{
+				PORTB = ((PORTB & ~LEDS_PORTB_LEDS) | (LEDMask & LEDS_PORTB_LEDS));
+				PORTD = ((PORTD & ~(LEDS_PORTD_LEDS << LEDS_PORTD_MASK_SHIFT)) |
+				         ((LEDMask & LEDS_PORTD_LEDS) << LEDS_PORTD_MASK_SHIFT));
+				PORTE = ((PORTE & ~LEDS_PORTE_LEDS) | (LEDMask & LEDS_PORTE_LEDS));
+			}
+
+			static inline void LEDs_ChangeLEDs(const uint8_t LEDMask,
+			                                   const uint8_t ActiveMask)
+			{
+				PORTB = ((PORTB & ~(LEDMask & LEDS_PORTB_LEDS)) | (ActiveMask & LEDS_PORTB_LEDS));
+				PORTD = ((PORTD & ~((LEDMask & LEDS_PORTD_LEDS) << LEDS_PORTD_MASK_SHIFT)) |
+				         ((ActiveMask & LEDS_PORTD_LEDS) << LEDS_PORTD_MASK_SHIFT));
+				PORTE = ((PORTE & ~(LEDMask & LEDS_PORTE_LEDS)) | (ActiveMask & LEDS_PORTE_LEDS));
+			}
+
+			static inline void LEDs_ToggleLEDs(const uint8_t LEDMask)
+			{
+				PINB  = (LEDMask & LEDS_PORTB_LEDS);
+				PIND  = ((LEDMask & LEDS_PORTD_LEDS) << LEDS_PORTD_MASK_SHIFT);
+				PINE  = (LEDMask & LEDS_PORTE_LEDS);
+			}
+
+			static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t LEDs_GetLEDs(void)
+			{
+				return ((PORTB & LEDS_PORTB_LEDS) |
+				        ((PORTD & (LEDS_PORTD_LEDS << LEDS_PORTD_MASK_SHIFT)) >> LEDS_PORTD_MASK_SHIFT) |
+				        (PORTE & LEDS_PORTE_LEDS));
+			}
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/OLIMEXISPMK2/Board.h b/lib/lufa/LUFA/Drivers/Board/AVR8/OLIMEXISPMK2/Board.h
new file mode 100644
index 0000000000..52129fb739
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/OLIMEXISPMK2/Board.h
@@ -0,0 +1,82 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific information header for the Olimex AVR-ISP-MK2 Development Board.
+ *  \copydetails Group_BoardInfo_OLIMEXISPMK2
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the Board driver
+ *        dispatch header located in LUFA/Drivers/Board/Board.h.
+ */
+
+/** \ingroup Group_BoardInfo
+ *  \defgroup Group_BoardInfo_OLIMEXISPMK2 OLIMEXISPMK2
+ *  \brief Board specific information header for the Olimex AVR-ISP-MK2 Development Board.
+ *
+ *  Board specific information header for the Olimex AVR-ISP-MK2 Development Board (https://www.olimex.com/dev/avr-isp-mk2.html).
+ *
+ *  @{
+ */
+
+#ifndef __BOARD_OLIMEXISPMK2_H__
+#define __BOARD_OLIMEXISPMK2_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+		#include "../../Buttons.h"
+		#include "../../LEDs.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_BOARD_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Indicates the board has hardware Buttons mounted. */
+			#define BOARD_HAS_BUTTONS
+
+			/** Indicates the board has hardware LEDs mounted. */
+			#define BOARD_HAS_LEDS
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/OLIMEXISPMK2/Buttons.h b/lib/lufa/LUFA/Drivers/Board/AVR8/OLIMEXISPMK2/Buttons.h
new file mode 100644
index 0000000000..3240dda075
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/OLIMEXISPMK2/Buttons.h
@@ -0,0 +1,103 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific Buttons driver header for the Olimex AVR-ISP-MK2 Development Board.
+ *  \copydetails Group_Buttons_OLIMEXISPMK2
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the Buttons driver
+ *        dispatch header located in LUFA/Drivers/Board/Buttons.h.
+ */
+
+/** \ingroup Group_Buttons
+ *  \defgroup Group_Buttons_OLIMEXISPMK2 OLIMEXISPMK2
+ *  \brief Board specific Buttons driver header for the Olimex AVR-ISP-MK2.
+ *
+ *  Board specific Buttons driver header for the Olimex AVR-ISP-MK2 Development Board (https://www.olimex.com/dev/avr-isp-mk2.html).
+ *
+ *  <table>
+ *    <tr><th>Name</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr>
+ *    <tr><td>BUTTONS_BUTTON1</td><td>HWB Button</td><td>Low</td><td>PORTD.7</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __BUTTONS_OLIMEXISPMK2_H__
+#define __BUTTONS_OLIMEXISPMK2_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_BUTTONS_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Buttons.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Button mask for the first button on the board. */
+			#define BUTTONS_BUTTON1      (1 << 7)
+
+		/* Inline Functions: */
+		#if !defined(__DOXYGEN__)
+			static inline void Buttons_Init(void)
+			{
+				DDRD  &= ~BUTTONS_BUTTON1;
+				PORTD |=  BUTTONS_BUTTON1;
+			}
+
+			static inline void Buttons_Disable(void)
+			{
+				DDRD  &= ~BUTTONS_BUTTON1;
+				PORTD &= ~BUTTONS_BUTTON1;
+			}
+
+			static inline uint8_t Buttons_GetStatus(void) ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t Buttons_GetStatus(void)
+			{
+				return ((PIND & BUTTONS_BUTTON1) ^ BUTTONS_BUTTON1);
+			}
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/OLIMEXISPMK2/LEDs.h b/lib/lufa/LUFA/Drivers/Board/AVR8/OLIMEXISPMK2/LEDs.h
new file mode 100644
index 0000000000..6bf924d36f
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/OLIMEXISPMK2/LEDs.h
@@ -0,0 +1,143 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific LED driver header for the Olimex AVR-ISP-MK2 Development Board.
+ *  \copydetails Group_LEDs_OLIMEXISPMK2
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the LEDs driver
+ *        dispatch header located in LUFA/Drivers/Board/LEDs.h.
+ */
+
+/** \ingroup Group_LEDs
+ *  \defgroup Group_LEDs_OLIMEXISPMK2 OLIMEXISPMK2
+ *  \brief Board specific LED driver header for the Olimex AVR-ISP-MK2.
+ *
+ *  Board specific LED driver header for the Olimex AVR-ISP-MK2 Development Board (https://www.olimex.com/dev/avr-isp-mk2.html).
+ *
+ *  <table>
+ *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr>
+ *    <tr><td>LEDS_LED1</td><td>Yellow</td><td>Target Power</td><td>High</td><td>PORTB.5</td></tr>
+ *    <tr><td>LEDS_LED2</td><td>Red</td><td>Activity</td><td>High</td><td>PORTB.6</td></tr>
+ *    <tr><td>LEDS_LED3</td><td>Green</td><td>Ready</td><td>High</td><td>PORTB.7</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __LEDS_OLIMEXISPMK2_H__
+#define __LEDS_OLIMEXISPMK2_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_LEDS_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/LEDS.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** LED mask for the first LED on the board. */
+			#define LEDS_LED1        (1 << 5)
+
+			/** LED mask for the second LED on the board. */
+			#define LEDS_LED2        (1 << 6)
+
+			/** LED mask for the third LED on the board. */
+			#define LEDS_LED3        (1 << 7)
+
+			/** LED mask for all the LEDs on the board. */
+			#define LEDS_ALL_LEDS    (LEDS_LED1 | LEDS_LED2 | LEDS_LED3)
+
+			/** LED mask for none of the board LEDs. */
+			#define LEDS_NO_LEDS     0
+
+		/* Inline Functions: */
+		#if !defined(__DOXYGEN__)
+			static inline void LEDs_Init(void)
+			{
+				DDRB  |=  LEDS_ALL_LEDS;
+				PORTB &= ~LEDS_ALL_LEDS;
+			}
+
+			static inline void LEDs_Disable(void)
+			{
+				DDRB  &= ~LEDS_ALL_LEDS;
+				PORTB &= ~LEDS_ALL_LEDS;
+			}
+
+			static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask)
+			{
+				PORTB |= LEDMask;
+			}
+
+			static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask)
+			{
+				PORTB &= ~LEDMask;
+			}
+
+			static inline void LEDs_SetAllLEDs(const uint8_t LEDMask)
+			{
+				PORTB = ((PORTB & ~LEDS_ALL_LEDS) | LEDMask);
+			}
+
+			static inline void LEDs_ChangeLEDs(const uint8_t LEDMask,
+			                                   const uint8_t ActiveMask)
+			{
+				PORTB = ((PORTB & ~LEDMask) | ActiveMask);
+			}
+
+			static inline void LEDs_ToggleLEDs(const uint8_t LEDMask)
+			{
+				PINB  = LEDMask;
+			}
+
+			static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t LEDs_GetLEDs(void)
+			{
+				return (PORTB & LEDS_ALL_LEDS);
+			}
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/OLIMEXT32U4/Board.h b/lib/lufa/LUFA/Drivers/Board/AVR8/OLIMEXT32U4/Board.h
new file mode 100644
index 0000000000..9b0b28cca2
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/OLIMEXT32U4/Board.h
@@ -0,0 +1,82 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific information header for the Olimex AVR-USB-T32U4 Development Board.
+ *  \copydetails Group_BoardInfo_OLIMEXT32U4
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the Board driver
+ *        dispatch header located in LUFA/Drivers/Board/Board.h.
+ */
+
+/** \ingroup Group_BoardInfo
+ *  \defgroup Group_BoardInfo_OLIMEXT32U4 OLIMEXT32U4
+ *  \brief Board specific information header for the Olimex AVR-USB-T32U4 Development Board.
+ *
+ *  Board specific information header for the Olimex AVR-USB-T32U4 Development Board (http://www.olimex.com/dev/avr-t32u4.html).
+ *
+ *  @{
+ */
+
+#ifndef __BOARD_OLIMEXT32U4_H__
+#define __BOARD_OLIMEXT32U4_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+		#include "../../Buttons.h"
+		#include "../../LEDs.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_BOARD_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Indicates the board has hardware Buttons mounted. */
+			#define BOARD_HAS_BUTTONS
+
+			/** Indicates the board has hardware LEDs mounted. */
+			#define BOARD_HAS_LEDS
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/OLIMEXT32U4/Buttons.h b/lib/lufa/LUFA/Drivers/Board/AVR8/OLIMEXT32U4/Buttons.h
new file mode 100644
index 0000000000..5db1c59b28
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/OLIMEXT32U4/Buttons.h
@@ -0,0 +1,103 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific Buttons driver header for the Olimex AVR-USB-T32U4 Development Board.
+ *  \copydetails Group_Buttons_OLIMEXT32U4
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the Buttons driver
+ *        dispatch header located in LUFA/Drivers/Board/Buttons.h.
+ */
+
+/** \ingroup Group_Buttons
+ *  \defgroup Group_Buttons_OLIMEXT32U4 OLIMEXT32U4
+ *  \brief Board specific Buttons driver header for the Olimex AVR-USB-32U4 Development Board.
+ *
+ *  Board specific Buttons driver header for the Olimex AVR-USB-T32U4 Development Board (http://www.olimex.com/dev/avr-t32u4.html).
+ *
+ *  <table>
+ *    <tr><th>Name</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr>
+ *    <tr><td>BUTTONS_BUTTON1</td><td>HWB Button</td><td>Low</td><td>PORTE.2</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __BUTTONS_OLIMEXT32U4_H__
+#define __BUTTONS_OLIMEXT32U4_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_BUTTONS_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Buttons.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Button mask for the first button on the board. */
+			#define BUTTONS_BUTTON1      (1 << 2)
+
+		/* Inline Functions: */
+		#if !defined(__DOXYGEN__)
+			static inline void Buttons_Init(void)
+			{
+				DDRE  &= ~BUTTONS_BUTTON1;
+				PORTE |=  BUTTONS_BUTTON1;
+			}
+
+			static inline void Buttons_Disable(void)
+			{
+				DDRE  &= ~BUTTONS_BUTTON1;
+				PORTE &= ~BUTTONS_BUTTON1;
+			}
+
+			static inline uint8_t Buttons_GetStatus(void) ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t Buttons_GetStatus(void)
+			{
+				return ((PINE & BUTTONS_BUTTON1) ^ BUTTONS_BUTTON1);
+			}
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/OLIMEXT32U4/LEDs.h b/lib/lufa/LUFA/Drivers/Board/AVR8/OLIMEXT32U4/LEDs.h
new file mode 100644
index 0000000000..96cf3ed692
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/OLIMEXT32U4/LEDs.h
@@ -0,0 +1,169 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific LED driver header for the Olimex AVR-USB-T32U4.
+ *  \copydetails Group_LEDs_OLIMEXT32U4
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the LEDs driver
+ *        dispatch header located in LUFA/Drivers/Board/LEDs.h.
+ */
+
+/** \ingroup Group_LEDs
+ *  \defgroup Group_LEDs_OLIMEXT32U4 OLIMEXT32U4
+ *  \brief Board specific LED driver header for the Olimex AVR-USB-T32U4.
+ *
+ *  Board specific LED driver header for the Olimex AVR-USB-T32U4 (http://www.olimex.com/dev/avr-t32u4.html).
+ *
+ *  <table>
+ *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr>
+ *    <tr><td>LEDS_LED1</td><td>Yellow</td><td>RX</td><td>High</td><td>PORTB.0</td></tr>
+ *    <tr><td>LEDS_LED2</td><td>Green</td><td>TX</td><td>High</td><td>PORTD.5</td></tr>
+ *    <tr><td>LEDS_LED3</td><td>N/A</td><td>General Indicator (Not Mounted)</td><td>High</td><td>PORTE.6</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __LEDS_OLIMEXT32U4_H__
+#define __LEDS_OLIMEXT32U4_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_LEDS_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/LEDS.h instead.
+		#endif
+
+	/* Private Interface - For use in library only: */
+	#if !defined(__DOXYGEN__)
+		/* Macros: */
+			#define LEDS_PORTB_LEDS       (LEDS_LED1)
+			#define LEDS_PORTD_LEDS       (LEDS_LED2)
+			#define LEDS_PORTE_LEDS       (LEDS_LED3)
+	#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** LED mask for the first LED on the board. */
+			#define LEDS_LED1        (1 << 0)
+
+			/** LED mask for the second LED on the board. */
+			#define LEDS_LED2        (1 << 5)
+
+			/** LED mask for the third LED on the board. */
+			#define LEDS_LED3        (1 << 6)
+
+			/** LED mask for all the LEDs on the board. */
+			#define LEDS_ALL_LEDS    (LEDS_LED1 | LEDS_LED2 | LEDS_LED3)
+
+			/** LED mask for none of the board LEDs. */
+			#define LEDS_NO_LEDS     0
+
+		/* Inline Functions: */
+		#if !defined(__DOXYGEN__)
+			static inline void LEDs_Init(void)
+			{
+				DDRB  |=  LEDS_PORTB_LEDS;
+				PORTB &= ~LEDS_PORTB_LEDS;
+				DDRD  |=  LEDS_PORTD_LEDS;
+				PORTD &= ~LEDS_PORTD_LEDS;
+				DDRE  |=  LEDS_PORTE_LEDS;
+				PORTE &= ~LEDS_PORTE_LEDS;
+			}
+
+			static inline void LEDs_Disable(void)
+			{
+				DDRB  &= ~LEDS_PORTB_LEDS;
+				PORTB &= ~LEDS_PORTB_LEDS;
+				DDRD  &= ~LEDS_PORTD_LEDS;
+				PORTD &= ~LEDS_PORTD_LEDS;
+				DDRE  &= ~LEDS_PORTE_LEDS;
+				PORTE &= ~LEDS_PORTE_LEDS;
+			}
+
+			static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask)
+			{
+				PORTB |= (LEDMask & LEDS_PORTB_LEDS);
+				PORTD |= (LEDMask & LEDS_PORTD_LEDS);
+				PORTE |= (LEDMask & LEDS_PORTE_LEDS);
+			}
+
+			static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask)
+			{
+				PORTB &= ~(LEDMask & LEDS_PORTB_LEDS);
+				PORTD &= ~(LEDMask & LEDS_PORTD_LEDS);
+				PORTE &= ~(LEDMask & LEDS_PORTE_LEDS);
+			}
+
+			static inline void LEDs_SetAllLEDs(const uint8_t LEDMask)
+			{
+				PORTB = ((PORTB & ~LEDS_PORTB_LEDS) | (LEDMask & LEDS_PORTB_LEDS));
+				PORTD = ((PORTD & ~LEDS_PORTD_LEDS) | (LEDMask & LEDS_PORTD_LEDS));
+				PORTE = ((PORTE & ~LEDS_PORTE_LEDS) | (LEDMask & LEDS_PORTE_LEDS));
+			}
+
+			static inline void LEDs_ChangeLEDs(const uint8_t LEDMask,
+			                                   const uint8_t ActiveMask)
+			{
+				PORTB = ((PORTB & ~(LEDMask & LEDS_PORTB_LEDS)) | (ActiveMask & LEDS_PORTB_LEDS));
+				PORTD = ((PORTD & ~(LEDMask & LEDS_PORTD_LEDS)) | (ActiveMask & LEDS_PORTD_LEDS));
+				PORTE = ((PORTE & ~(LEDMask & LEDS_PORTE_LEDS)) | (ActiveMask & LEDS_PORTE_LEDS));
+			}
+
+			static inline void LEDs_ToggleLEDs(const uint8_t LEDMask)
+			{
+				PINB  = (LEDMask & LEDS_PORTB_LEDS);
+				PIND  = (LEDMask & LEDS_PORTD_LEDS);
+				PINE  = (LEDMask & LEDS_PORTE_LEDS);
+			}
+
+			static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t LEDs_GetLEDs(void)
+			{
+				return ((PORTB & LEDS_PORTB_LEDS) | (PORTD & LEDS_PORTD_LEDS) | (PORTE & LEDS_PORTE_LEDS));
+			}
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/POLOLUMICRO/Board.h b/lib/lufa/LUFA/Drivers/Board/AVR8/POLOLUMICRO/Board.h
new file mode 100644
index 0000000000..bf68e392cd
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/POLOLUMICRO/Board.h
@@ -0,0 +1,79 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific information header for the "Pololu A-Star Micro" board.
+ *  \copydetails Group_BoardInfo_POLOLUMICRO
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the Board driver
+ *        dispatch header located in LUFA/Drivers/Board/Board.h.
+ */
+
+/** \ingroup Group_BoardInfo
+ *  \defgroup Group_BoardInfo_POLOLUMICRO POLOLUMICRO
+ *  \brief Board specific information header for the "Pololu A-Star Micro" board.
+ *
+ *  Board specific information header:
+ * https://www.pololu.com/docs/0J61 -> https://www.pololu.com/docs/0J61/3.1
+ *
+ *  @{
+ */
+
+#ifndef __BOARD_POLOLUMICRO_H__
+#define __BOARD_POLOLUMICRO_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+		#include "../../LEDs.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_BOARD_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Indicates the board has hardware LEDs mounted. */
+			#define BOARD_HAS_LEDS
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/POLOLUMICRO/LEDs.h b/lib/lufa/LUFA/Drivers/Board/AVR8/POLOLUMICRO/LEDs.h
new file mode 100644
index 0000000000..454a9e2b01
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/POLOLUMICRO/LEDs.h
@@ -0,0 +1,154 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific LED driver header for the Pololu A-Star Micro board.
+ *  \copydetails Group_LEDs_MICRO
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the LEDs driver
+ *        dispatch header located in LUFA/Drivers/Board/LEDs.h.
+ */
+
+/** \ingroup Group_LEDs
+ *  \defgroup Group_LEDs_MICRO MICRO
+ *  \brief Board specific LED driver header for the Pololu A-Star Micro board.
+ *
+ *  Board specific LED driver header for the Pololu A-Star Micro board https://www.pololu.com/docs/0J61/3.1
+ *
+ *  <table>
+ *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr>
+ *    <tr><td>LEDS_LED1</td><td>Yellow</td><td>General Indicator</td><td>High</td><td>PORTC.7</td></tr>
+ *    <tr><td>LEDS_LED2</td><td>Green</td><td>Bootloader, USB-activity</td><td>Low</td><td>PORTD.5</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __LEDS_MICRO_H__
+#define __LEDS_MICRO_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_LEDS_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/LEDS.h instead.
+		#endif
+
+	/* Private Interface - For use in library only: */
+	#if !defined(__DOXYGEN__)
+		/* Macros: */
+			#define LEDS_PORTC_LEDS       (LEDS_LED1)
+			#define LEDS_PORTD_LEDS       (LEDS_LED2)
+	#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** LED mask for the first LED on the board. */
+			#define LEDS_LED1        (1 << 7)
+
+			/** LED mask for the second LED on the board. */
+			#define LEDS_LED2        (1 << 5)
+
+			/** LED mask for all the LEDs on the board. */
+			#define LEDS_ALL_LEDS    (LEDS_LED1 | LEDS_LED2)
+
+			/** LED mask for none of the board LEDs. */
+			#define LEDS_NO_LEDS     0
+
+		/* Inline Functions: */
+		#if !defined(__DOXYGEN__)
+			static inline void LEDs_Init(void)
+			{
+				DDRD  |=  LEDS_PORTD_LEDS;
+				PORTD &= ~LEDS_PORTD_LEDS;
+				DDRC  |=  LEDS_PORTC_LEDS;
+				PORTC &= ~LEDS_PORTC_LEDS;
+			}
+
+			static inline void LEDs_Disable(void)
+			{
+				DDRD  &= ~LEDS_PORTD_LEDS;
+				PORTD &= ~LEDS_PORTD_LEDS;
+				DDRC  &= ~LEDS_PORTC_LEDS;
+				PORTC &= ~LEDS_PORTC_LEDS;
+			}
+
+			static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask)
+			{
+				PORTD |=  (LEDMask & LEDS_PORTD_LEDS);
+				PORTC |=  (LEDMask & LEDS_PORTC_LEDS);
+			}
+
+			static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask)
+			{
+				PORTD &= ~(LEDMask & LEDS_PORTD_LEDS);
+				PORTC &= ~(LEDMask & LEDS_PORTC_LEDS);
+			}
+
+			static inline void LEDs_SetAllLEDs(const uint8_t LEDMask)
+			{
+				PORTD = ((PORTD & ~LEDS_PORTD_LEDS) | (LEDMask & LEDS_PORTD_LEDS));
+				PORTC = ((PORTC & ~LEDS_PORTC_LEDS) | (LEDMask & LEDS_PORTC_LEDS));
+			}
+
+			static inline void LEDs_ChangeLEDs(const uint8_t LEDMask,
+			                                   const uint8_t ActiveMask)
+			{
+				PORTD = ((PORTD & ~(LEDMask & LEDS_PORTD_LEDS)) | (ActiveMask & LEDS_PORTD_LEDS));
+				PORTC = ((PORTC & ~(LEDMask & LEDS_PORTC_LEDS)) | (ActiveMask & LEDS_PORTC_LEDS));
+			}
+
+			static inline void LEDs_ToggleLEDs(const uint8_t LEDMask)
+			{
+				PORTD ^= (LEDMask & LEDS_PORTD_LEDS);
+				PORTC ^= (LEDMask & LEDS_PORTC_LEDS);
+			}
+
+			static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t LEDs_GetLEDs(void)
+			{
+				return ((PORTD & LEDS_PORTD_LEDS) | (PORTC & LEDS_PORTC_LEDS));
+			}
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/QMK/Board.h b/lib/lufa/LUFA/Drivers/Board/AVR8/QMK/Board.h
new file mode 100644
index 0000000000..b0d5ac447d
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/QMK/Board.h
@@ -0,0 +1,65 @@
+/*
+Copyright 2017 Jack Humbert
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+/** \file
+ *  \brief General driver header for QMK-powered keyboards.
+ *  \copydetails Group_BoardInfo_QMK
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the Board driver
+ *        dispatch header located in LUFA/Drivers/Board/Board.h.
+ */
+
+/** \ingroup Group_BoardInfo
+ *  \defgroup Group_BoardInfo_QMK QMK
+ *  \brief General driver header for QMK-powered keyboards.
+ *
+ *  General driver header for QMK-powered keyboards (http://qmk.fm).
+ *
+ *  @{
+ */
+
+#ifndef __BOARD_QMK_H__
+#define __BOARD_QMK_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+		#include "../../LEDs.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_BOARD_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Indicates the board has hardware LEDs mounted. */
+			#define BOARD_HAS_LEDS
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/QMK/LEDs.h b/lib/lufa/LUFA/Drivers/Board/AVR8/QMK/LEDs.h
new file mode 100644
index 0000000000..9fc696be97
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/QMK/LEDs.h
@@ -0,0 +1,194 @@
+/*
+Copyright 2017 Jack Humbert
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+/** \file
+ *  \brief General driver header for QMK-powered keyboards.
+ *  \copydetails Group_LEDs_QMK
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the LEDs driver
+ *        dispatch header located in LUFA/Drivers/Board/LEDs.h.
+ */
+
+/** \ingroup Group_LEDs
+ *  \defgroup Group_LEDs_QMK QMK
+ *  \brief General driver header for QMK-powered keyboards.
+ *
+ *  General driver header for QMK-powered keyboards (http://qmk.fm).
+ *
+ *  <b>QMK</b>:
+ *  <table>
+ *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr>
+ *    <tr><td>LEDS_LED1</td><td>Green</td><td>General Indicator</td><td>High</td><td>PORT(QMK_LED).6</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __LEDS_QMK_H__
+#define __LEDS_QMK_H__
+
+    /* Includes: */
+        #include "../../../../Common/Common.h"
+
+    /* Enable C linkage for C++ Compilers: */
+        #if defined(__cplusplus)
+            extern "C" {
+        #endif
+
+    /* Preprocessor Checks: */
+        #if !defined(__INCLUDE_FROM_LEDS_H)
+            #error Do not include this file directly. Include LUFA/Drivers/Board/LEDS.h instead.
+        #endif
+
+        #define B0 0x30
+        #define B1 0x31
+        #define B2 0x32
+        #define B3 0x33
+        #define B4 0x34
+        #define B5 0x35
+        #define B6 0x36
+        #define B7 0x37
+        #define C0 0x60
+        #define C1 0x61
+        #define C2 0x62
+        #define C3 0x63
+        #define C4 0x64
+        #define C5 0x65
+        #define C6 0x66
+        #define C7 0x67
+        #define D0 0x90
+        #define D1 0x91
+        #define D2 0x92
+        #define D3 0x93
+        #define D4 0x94
+        #define D5 0x95
+        #define D6 0x96
+        #define D7 0x97
+        #define E0 0xC0
+        #define E1 0xC1
+        #define E2 0xC2
+        #define E3 0xC3
+        #define E4 0xC4
+        #define E5 0xC5
+        #define E6 0xC6
+        #define E7 0xC7
+        #define F0 0xF0
+        #define F1 0xF1
+        #define F2 0xF2
+        #define F3 0xF3
+        #define F4 0xF4
+        #define F5 0xF5
+        #define F6 0xF6
+        #define F7 0xF7
+        #define A0 0x00
+        #define A1 0x01
+        #define A2 0x02
+        #define A3 0x03
+        #define A4 0x04
+        #define A5 0x05
+        #define A6 0x06
+        #define A7 0x07
+
+        #define QMK_ESC_COL F1
+        #define QMK_ESC_ROW D5
+        #define QMK_LED     E6
+        #define QMK_SPEAKER C6
+
+        #define DDR(pin) _SFR_IO8(((pin) >> 4) + 1)
+        #define PORT(pin) _SFR_IO8(((pin) >> 4) + 2)
+        #define PIN(pin) _SFR_IO8((pin) >> 4)
+        #define NUM(pin) _BV((pin) & 0xF)
+
+    /* Public Interface - May be used in end-application: */
+        /* Macros: */
+            /** LED mask for the first LED on the board. */
+            #define LEDS_LED1        NUM(QMK_LED)
+            #define LEDS_LED2        NUM(QMK_SPEAKER)
+
+            /** LED mask for all the LEDs on the board. */
+            #define LEDS_ALL_LEDS    LEDS_LED1 | LEDS_LED2
+
+            /** LED mask for none of the board LEDs. */
+            #define LEDS_NO_LEDS     0
+
+        /* Inline Functions: */
+        #if !defined(__DOXYGEN__)
+            static inline void LEDs_Init(void)
+            {
+                DDR(QMK_LED)  |= LEDS_LED1;
+                PORT(QMK_LED) |= LEDS_LED1;
+
+                DDR(QMK_SPEAKER)  |= LEDS_LED2;
+                PORT(QMK_SPEAKER) |= LEDS_LED2;
+            }
+
+            static inline void LEDs_Disable(void)
+            {
+                DDR(QMK_LED)  &= ~LEDS_LED1;
+                PORT(QMK_LED) &= ~LEDS_LED2;
+
+                DDR(QMK_SPEAKER)  &= ~LEDS_LED1;
+                PORT(QMK_SPEAKER) &= ~LEDS_LED2;
+            }
+
+            static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask)
+            {
+                PORT(QMK_LED) &= (LEDS_LED1 & ~LEDMask);
+                PORT(QMK_SPEAKER) &= (LEDS_LED2 & ~LEDMask);
+            }
+
+            static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask)
+            {
+                PORT(QMK_LED) |=  (LEDS_LED1 & LEDMask);
+                PORT(QMK_SPEAKER) |=  (LEDS_LED2 & LEDMask);
+            }
+
+            static inline void LEDs_SetAllLEDs(const uint8_t LEDMask)
+            {
+                PORT(QMK_LED) = ((PORT(QMK_LED) | LEDS_LED1) & ~LEDMask);
+                PORT(QMK_SPEAKER) = ((PORT(QMK_SPEAKER) | LEDS_LED2) & ~LEDMask);
+            }
+
+            static inline void LEDs_ChangeLEDs(const uint8_t LEDMask,
+                                               const uint8_t ActiveMask)
+            {
+                PORT(QMK_LED) = ((PORT(QMK_LED) | (LEDS_LED1 & LEDMask)) & ~ActiveMask);
+                PORT(QMK_SPEAKER) = ((PORT(QMK_SPEAKER) | (LEDS_LED1 & LEDMask)) & ~ActiveMask);
+            }
+
+            static inline void LEDs_ToggleLEDs(const uint8_t LEDMask)
+            {
+                PIN(QMK_LED)  = (LEDS_LED1 & LEDMask);
+                PIN(QMK_SPEAKER)  = (LEDS_LED2 & LEDMask);
+            }
+
+            static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT;
+            static inline uint8_t LEDs_GetLEDs(void)
+            {
+                return (~PORT(QMK_LED) & LEDS_LED1) | (~(PORT(QMK_SPEAKER) & LEDS_LED2));
+            }
+        #endif
+
+    /* Disable C linkage for C++ Compilers: */
+        #if defined(__cplusplus)
+            }
+        #endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/RZUSBSTICK/Board.h b/lib/lufa/LUFA/Drivers/Board/AVR8/RZUSBSTICK/Board.h
new file mode 100644
index 0000000000..83219b9420
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/RZUSBSTICK/Board.h
@@ -0,0 +1,78 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific information header for the Atmel RZUSBSTICK.
+ *  \copydetails Group_BoardInfo_RZUSBSTICK
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the Board driver
+ *        dispatch header located in LUFA/Drivers/Board/Board.h.
+ */
+
+/** \ingroup Group_BoardInfo
+ *  \defgroup Group_BoardInfo_RZUSBSTICK RZUSBSTICK
+ *  \brief Board specific information header for the Atmel RZUSBSTICK.
+ *
+ *  Board specific information header for the Atmel RZUSBSTICK.
+ *
+ *  @{
+ */
+
+#ifndef __BOARD_RZUSBSTICK_H__
+#define __BOARD_RZUSBSTICK_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+		#include "../../LEDs.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_BOARD_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Indicates the board has hardware LEDs mounted. */
+			#define BOARD_HAS_LEDS
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/RZUSBSTICK/LEDs.h b/lib/lufa/LUFA/Drivers/Board/AVR8/RZUSBSTICK/LEDs.h
new file mode 100644
index 0000000000..25bdae1ae8
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/RZUSBSTICK/LEDs.h
@@ -0,0 +1,175 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific LED driver header for the Atmel RZUSBSTICK.
+ *  \copydetails Group_LEDs_RZUSBSTICK
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the LEDs driver
+ *        dispatch header located in LUFA/Drivers/Board/LEDs.h.
+ */
+
+/** \ingroup Group_LEDs
+ *  \defgroup Group_LEDs_RZUSBSTICK RZUSBSTICK
+ *  \brief Board specific LED driver header for the Atmel RZUSBSTICK.
+ *
+ *  Board specific LED driver header for the Atmel RZUSBSTICK.
+ *
+ *  <table>
+ *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr>
+ *    <tr><td>LEDS_LED1</td><td>Blue</td><td>General Indicator</td><td>High</td><td>PORTD.7</td></tr>
+ *    <tr><td>LEDS_LED1</td><td>Red</td><td>General Indicator</td><td>Low</td><td>PORTD.5</td></tr>
+ *    <tr><td>LEDS_LED1</td><td>Green</td><td>General Indicator</td><td>Low</td><td>PORTE.6</td></tr>
+ *    <tr><td>LEDS_LED1</td><td>Yellow</td><td>General Indicator</td><td>Low</td><td>PORTE.7</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __LEDS_RZUSBSTICK_H__
+#define __LEDS_RZUSBSTICK_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_LEDS_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/LEDS.h instead.
+		#endif
+
+	/* Private Interface - For use in library only: */
+	#if !defined(__DOXYGEN__)
+		/* Macros: */
+			#define LEDS_PORTD_LEDS       (LEDS_LED1 | LEDS_LED2)
+			#define LEDS_PORTE_LEDS       (LEDS_LED3 | LEDS_LED4)
+
+			#define LEDS_PORTE_MASK_SHIFT 4
+	#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** LED mask for the first LED on the board. */
+			#define LEDS_LED1        (1 << 7)
+
+			/** LED mask for the second LED on the board. */
+			#define LEDS_LED2        (1 << 5)
+
+			/** LED mask for the third LED on the board. */
+			#define LEDS_LED3        ((1 << 6) >> LEDS_PORTE_MASK_SHIFT)
+
+			/** LED mask for the fourth LED on the board. */
+			#define LEDS_LED4        ((1 << 7) >> LEDS_PORTE_MASK_SHIFT)
+
+			/** LED mask for all the LEDs on the board. */
+			#define LEDS_ALL_LEDS    (LEDS_LED1 | LEDS_LED2 | LEDS_LED3 | LEDS_LED4)
+
+			/** LED mask for none of the board LEDs. */
+			#define LEDS_NO_LEDS     0
+
+		/* Inline Functions: */
+		#if !defined(__DOXYGEN__)
+			static inline void LEDs_Init(void)
+			{
+				DDRD  |=  LEDS_PORTD_LEDS;
+				PORTD &= ~LEDS_LED1;
+				PORTD |=  LEDS_LED2;
+
+				DDRE  |=  (LEDS_PORTE_LEDS << LEDS_PORTE_MASK_SHIFT);
+				PORTE |=  (LEDS_PORTE_LEDS << LEDS_PORTE_MASK_SHIFT);
+			}
+
+			static inline void LEDs_Disable(void)
+			{
+				DDRD  &= ~LEDS_PORTD_LEDS;
+				PORTD &= ~LEDS_PORTD_LEDS;
+
+				DDRE  &= ~(LEDS_PORTE_LEDS << LEDS_PORTE_MASK_SHIFT);
+				PORTE &= ~(LEDS_PORTE_LEDS << LEDS_PORTE_MASK_SHIFT);
+			}
+
+			static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask)
+			{
+				PORTD |=  (LEDMask & LEDS_LED1);
+				PORTD &= ~(LEDMask & LEDS_LED2);
+				PORTE &= ~((LEDMask & LEDS_PORTE_LEDS) << LEDS_PORTE_MASK_SHIFT);
+			}
+
+			static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask)
+			{
+				PORTD &= ~(LEDMask & LEDS_LED1);
+				PORTD |=  (LEDMask & LEDS_LED2);
+				PORTE |=  ((LEDMask & LEDS_PORTE_LEDS) << LEDS_PORTE_MASK_SHIFT);
+			}
+
+			static inline void LEDs_SetAllLEDs(const uint8_t LEDMask)
+			{
+				PORTD = (((PORTD & ~LEDS_LED1) |  (LEDMask & LEDS_LED1)) |
+				         ((PORTD |  LEDS_LED2) & ~(LEDMask & LEDS_LED2)));
+				PORTE = ((PORTE | (LEDS_PORTE_LEDS << LEDS_PORTE_MASK_SHIFT)) &
+				        ~((LEDMask & LEDS_PORTE_LEDS) << LEDS_PORTE_MASK_SHIFT));
+			}
+
+			static inline void LEDs_ChangeLEDs(const uint8_t LEDMask,
+			                                   const uint8_t ActiveMask)
+			{
+				PORTD = (((PORTD & ~(LEDMask & LEDS_LED1)) |  (ActiveMask & LEDS_LED1)) |
+				         ((PORTD |  (LEDMask & LEDS_LED2)) & ~(ActiveMask & LEDS_LED2)));
+				PORTE = ((PORTE | ((LEDMask & LEDS_PORTE_LEDS) << LEDS_PORTE_MASK_SHIFT)) &
+				        ~((ActiveMask & LEDS_PORTE_LEDS) << LEDS_PORTE_MASK_SHIFT));
+			}
+
+			static inline void LEDs_ToggleLEDs(const uint8_t LEDMask)
+			{
+				PIND  = (LEDMask & LEDS_PORTD_LEDS);
+				PINE  = ((LEDMask & LEDS_PORTE_LEDS) << LEDS_PORTE_MASK_SHIFT);
+			}
+
+			static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t LEDs_GetLEDs(void)
+			{
+				return (((PORTD & LEDS_LED1) | (~PORTD & LEDS_LED2)) |
+				        ((~PORTE & (LEDS_PORTE_LEDS << LEDS_PORTE_MASK_SHIFT)) >> LEDS_PORTE_MASK_SHIFT));
+			}
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/SPARKFUN8U2/Board.h b/lib/lufa/LUFA/Drivers/Board/AVR8/SPARKFUN8U2/Board.h
new file mode 100644
index 0000000000..7803ecdef4
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/SPARKFUN8U2/Board.h
@@ -0,0 +1,78 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific information header for the Sparkfun ATMEGA8U2 breakout board.
+ *  \copydetails Group_BoardInfo_SPARKFUN8U2
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the Board driver
+ *        dispatch header located in LUFA/Drivers/Board/Board.h.
+ */
+
+/** \ingroup Group_BoardInfo
+ *  \defgroup Group_BoardInfo_SPARKFUN8U2 SPARKFUN8U2
+ *  \brief Board specific information header for the Sparkfun ATMEGA8U2 breakout board.
+ *
+ *  Board specific information header for the Sparkfun ATMEGA8U2 breakout board (http://www.sparkfun.com/products/10277).
+ *
+ *  @{
+ */
+
+#ifndef __BOARD_SPARKFUN8U2_H__
+#define __BOARD_SPARKFUN8U2_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+		#include "../../LEDs.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_BOARD_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Indicates the board has hardware LEDs mounted. */
+			#define BOARD_HAS_LEDS
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/SPARKFUN8U2/LEDs.h b/lib/lufa/LUFA/Drivers/Board/AVR8/SPARKFUN8U2/LEDs.h
new file mode 100644
index 0000000000..70ca608240
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/SPARKFUN8U2/LEDs.h
@@ -0,0 +1,135 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific LED driver header for the Sparkfun ATMEGA8U2 breakout board.
+ *  \copydetails Group_LEDs_SPARKFUN8U2
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the LEDs driver
+ *        dispatch header located in LUFA/Drivers/Board/LEDs.h.
+ */
+
+/** \ingroup Group_LEDs
+ *  \defgroup Group_LEDs_SPARKFUN8U2 SPARKFUN8U2
+ *  \brief Board specific LED driver header for the Sparkfun ATMEGA8U2 breakout board.
+ *
+ *  Board specific LED driver header for the Sparkfun ATMEGA8U2 breakout board (http://www.sparkfun.com/products/10277).
+ *
+ *  <table>
+ *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr>
+ *    <tr><td>LEDS_LED1</td><td>Green</td><td>General Indicator</td><td>Low</td><td>PORTB.4</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __LEDS_SPARKFUN8U2_H__
+#define __LEDS_SPARKFUN8U2_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_LEDS_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/LEDS.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** LED mask for the first LED on the board. */
+			#define LEDS_LED1        (1 << 4)
+
+			/** LED mask for all the LEDs on the board. */
+			#define LEDS_ALL_LEDS    LEDS_LED1
+
+			/** LED mask for none of the board LEDs. */
+			#define LEDS_NO_LEDS     0
+
+		/* Inline Functions: */
+		#if !defined(__DOXYGEN__)
+			static inline void LEDs_Init(void)
+			{
+				DDRB  |= LEDS_ALL_LEDS;
+				PORTB |= LEDS_ALL_LEDS;
+			}
+
+			static inline void LEDs_Disable(void)
+			{
+				DDRB  &= ~LEDS_ALL_LEDS;
+				PORTB &= ~LEDS_ALL_LEDS;
+			}
+
+			static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask)
+			{
+				PORTB &= ~LEDMask;
+			}
+
+			static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask)
+			{
+				PORTB |= LEDMask;
+			}
+
+			static inline void LEDs_SetAllLEDs(const uint8_t LEDMask)
+			{
+				PORTB = ((PORTB | LEDS_ALL_LEDS) & ~LEDMask);
+			}
+
+			static inline void LEDs_ChangeLEDs(const uint8_t LEDMask,
+			                                   const uint8_t ActiveMask)
+			{
+				PORTB = ((PORTB | LEDMask) & ~ActiveMask);
+			}
+
+			static inline void LEDs_ToggleLEDs(const uint8_t LEDMask)
+			{
+				PINB  = LEDMask;
+			}
+
+			static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t LEDs_GetLEDs(void)
+			{
+				return (~PORTB & LEDS_ALL_LEDS);
+			}
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/STANGE_ISP/Board.h b/lib/lufa/LUFA/Drivers/Board/AVR8/STANGE_ISP/Board.h
new file mode 100644
index 0000000000..45472f139f
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/STANGE_ISP/Board.h
@@ -0,0 +1,82 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific information header for the Dimex Stange-ISP board.
+ *  \copydetails Group_BoardInfo_STANGE_ISP
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the Board driver
+ *        dispatch header located in LUFA/Drivers/Board/Board.h.
+ */
+
+/** \ingroup Group_BoardInfo
+ *  \defgroup Group_BoardInfo_STANGE_ISP STANGE_ISP
+ *  \brief Board specific information header for the Dimex Stange-ISP board.
+ *
+ *  Board specific information header for the Dimex Stange-ISP board (http://www.diamex.de/dxshop/USB-ISP-Programmer-fuer-Atmel-AVR).
+ *
+ *  @{
+ */
+
+#ifndef __BOARD_STANGE_ISP_H__
+#define __BOARD_STANGE_ISP_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+		#include "../../Buttons.h"
+		#include "../../LEDs.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_BOARD_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Indicates the board has hardware Buttons mounted. */
+			#define BOARD_HAS_BUTTONS
+
+			/** Indicates the board has hardware LEDs mounted. */
+			#define BOARD_HAS_LEDS
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/STANGE_ISP/Buttons.h b/lib/lufa/LUFA/Drivers/Board/AVR8/STANGE_ISP/Buttons.h
new file mode 100644
index 0000000000..2607622bd1
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/STANGE_ISP/Buttons.h
@@ -0,0 +1,103 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaim all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific button driver header for the Dimex Stange-ISP board.
+ *  \copydetails Group_Buttons_STANGE_ISP
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the Buttons driver
+ *        dispatch header located in LUFA/Drivers/Board/Buttons.h.
+ */
+
+/** \ingroup Group_Buttons
+ *  \defgroup Group_Buttons_STANGE_ISP STANGE_ISP
+ *  \brief Board specific Buttons driver header for the Dimex Stange-ISP.
+ *
+ *  Board specific Buttons driver header for the Dimex Stange-ISP board (http://www.diamex.de/dxshop/USB-ISP-Programmer-fuer-Atmel-AVR).
+ *
+ *  <table>
+ *    <tr><th>Name</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr>
+ *    <tr><td>BUTTONS_BUTTON1</td><td>HWB Button</td><td>Low</td><td>PORTD.7</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __BUTTONS_STANGE_ISP_H__
+#define __BUTTONS_STANGE_ISP_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_BUTTONS_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Buttons.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Button mask for the first button on the board. */
+			#define BUTTONS_BUTTON1      (1 << 7)
+
+		/* Inline Functions: */
+		#if !defined(__DOXYGEN__)
+			static inline void Buttons_Init(void)
+			{
+				DDRD  &= ~BUTTONS_BUTTON1;
+				PORTD |=  BUTTONS_BUTTON1;
+			}
+
+			static inline void Buttons_Disable(void)
+			{
+				DDRD  &= ~BUTTONS_BUTTON1;
+				PORTD &= ~BUTTONS_BUTTON1;
+			}
+
+			static inline uint8_t Buttons_GetStatus(void) ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t Buttons_GetStatus(void)
+			{
+				return ((PIND & BUTTONS_BUTTON1) ^ BUTTONS_BUTTON1);
+			}
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/STANGE_ISP/LEDs.h b/lib/lufa/LUFA/Drivers/Board/AVR8/STANGE_ISP/LEDs.h
new file mode 100644
index 0000000000..97a7e37220
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/STANGE_ISP/LEDs.h
@@ -0,0 +1,138 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaim all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific LED driver header for the Dimex Stange-ISP board.
+ *  \copydetails Group_LEDs_STANGE_ISP
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the LEDs driver
+ *        dispatch header located in LUFA/Drivers/Board/LEDs.h.
+ */
+
+/** \ingroup Group_LEDs
+ *  \defgroup Group_LEDs_STANGE_ISP STANGE_ISP
+ *  \brief Board specific LED driver header for the Dimex Stange-ISP board.
+ *
+ *  Board specific LED driver header for the Dimex Stange-ISP board (http://www.diamex.de/dxshop/USB-ISP-Programmer-fuer-Atmel-AVR).
+ *
+ *  <table>
+ *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr>
+ *    <tr><td>LEDS_LED1</td><td>Green</td><td>General Indicator</td><td>Low</td><td>PORTD.0</td></tr>
+ *    <tr><td>LEDS_LED2</td><td>Red</td><td>General Indicator</td><td>Low</td><td>PORTD.1</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __LEDS_STANGE_ISP_LEDS_H__
+#define __LEDS_STANGE_ISP_LEDS_H__
+
+	/* Includes: */
+	#include "../../../../Common/Common.h"
+
+	/* Enable C linkage for C++ Compilers: */
+	#if defined(__cplusplus)
+	extern "C" {
+	#endif
+
+	/* Preprocessor Checks: */
+	#if !defined(__INCLUDE_FROM_LEDS_H)
+		#error Do not include this file directly. Include LUFA/Drivers/Board/LEDS.h instead.
+	#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** LED mask for the first LED on the board. */
+			#define LEDS_LED1        (1 << 0)
+
+			/** LED mask for the second LED on the board. */
+			#define LEDS_LED2        (1 << 1)
+
+			/** LED mask for all the LEDs on the board. */
+			#define LEDS_ALL_LEDS    (LEDS_LED1 | LEDS_LED2)
+
+			/** LED mask for none of the board LEDs. */
+			#define LEDS_NO_LEDS     0
+
+		/* Inline Functions: */
+		#if !defined(__DOXYGEN__)
+			static inline void LEDs_Init(void)
+			{
+				DDRD  |= LEDS_ALL_LEDS;
+				PORTD |= LEDS_ALL_LEDS;
+			}
+
+			static inline void LEDs_Disable(void)
+			{
+				DDRD  &= ~LEDS_ALL_LEDS;
+				PORTD &= ~LEDS_ALL_LEDS;
+			}
+
+			static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask)
+			{
+				PORTD &= ~LEDMask;
+			}
+
+			static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask)
+			{
+				PORTD |= LEDMask;
+			}
+
+			static inline void LEDs_SetAllLEDs (const uint8_t LEDMask)
+			{
+				PORTD = ((PORTD | LEDS_ALL_LEDS) & ~LEDMask);
+			}
+
+			static inline void LEDs_ChangeLEDs ( const uint8_t LEDMask, const uint8_t ActiveMask)
+			{
+				PORTD = ((PORTD | LEDMask) & ~ActiveMask);
+			}
+
+			static inline void LEDs_ToggleLEDs(const uint8_t LEDMask)
+			{
+				PIND  = LEDMask;
+			}
+
+			static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t LEDs_GetLEDs(void)
+			{
+				return (~PORTD & LEDS_ALL_LEDS);
+			}
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+	#if defined(__cplusplus)
+	}
+	#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/STK525/Board.h b/lib/lufa/LUFA/Drivers/Board/AVR8/STK525/Board.h
new file mode 100644
index 0000000000..a6831a7bbd
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/STK525/Board.h
@@ -0,0 +1,90 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific information header for the Atmel STK525.
+ *  \copydetails Group_BoardInfo_STK525
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the Board driver
+ *        dispatch header located in LUFA/Drivers/Board/Board.h.
+ */
+
+/** \ingroup Group_BoardInfo
+ *  \defgroup Group_BoardInfo_STK525 STK525
+ *  \brief Board specific information header for the Atmel STK525.
+ *
+ *  Board specific information header for the Atmel STK525.
+ *
+ *  @{
+ */
+
+#ifndef __BOARD_STK525_H__
+#define __BOARD_STK525_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+		#include "../../Buttons.h"
+		#include "../../Dataflash.h"
+		#include "../../Joystick.h"
+		#include "../../LEDs.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_BOARD_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Indicates the board has hardware Buttons mounted. */
+			#define BOARD_HAS_BUTTONS
+
+			/** Indicates the board has a hardware Dataflash mounted. */
+			#define BOARD_HAS_DATAFLASH
+
+			/** Indicates the board has a hardware Joystick mounted. */
+			#define BOARD_HAS_JOYSTICK
+
+			/** Indicates the board has hardware LEDs mounted. */
+			#define BOARD_HAS_LEDS
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/STK525/Buttons.h b/lib/lufa/LUFA/Drivers/Board/AVR8/STK525/Buttons.h
new file mode 100644
index 0000000000..5770d070d0
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/STK525/Buttons.h
@@ -0,0 +1,103 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific Buttons driver header for the Atmel STK525.
+ *  \copydetails Group_Buttons_STK525
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the Buttons driver
+ *        dispatch header located in LUFA/Drivers/Board/Buttons.h.
+ */
+
+/** \ingroup Group_Buttons
+ *  \defgroup Group_Buttons_STK525 STK525
+ *  \brief Board specific Buttons driver header for the Atmel STK525.
+ *
+ *  Board specific Buttons driver header for the Atmel STK525.
+ *
+ *  <table>
+ *    <tr><th>Name</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr>
+ *    <tr><td>BUTTONS_BUTTON1</td><td>HWB Button</td><td>Low</td><td>PORTE.2</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __BUTTONS_STK525_H__
+#define __BUTTONS_STK525_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_BUTTONS_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Buttons.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Button mask for the first button on the board. */
+			#define BUTTONS_BUTTON1      (1 << 2)
+
+		/* Inline Functions: */
+		#if !defined(__DOXYGEN__)
+			static inline void Buttons_Init(void)
+			{
+				DDRE  &= ~BUTTONS_BUTTON1;
+				PORTE |=  BUTTONS_BUTTON1;
+			}
+
+			static inline void Buttons_Disable(void)
+			{
+				DDRE  &= ~BUTTONS_BUTTON1;
+				PORTE &= ~BUTTONS_BUTTON1;
+			}
+
+			static inline uint8_t Buttons_GetStatus(void) ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t Buttons_GetStatus(void)
+			{
+				return ((PINE & BUTTONS_BUTTON1) ^ BUTTONS_BUTTON1);
+			}
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/STK525/Dataflash.h b/lib/lufa/LUFA/Drivers/Board/AVR8/STK525/Dataflash.h
new file mode 100644
index 0000000000..b0b2855f6c
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/STK525/Dataflash.h
@@ -0,0 +1,222 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific Dataflash driver header for the Atmel STK525.
+ *  \copydetails Group_Dataflash_STK525
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the dataflash driver
+ *        dispatch header located in LUFA/Drivers/Board/Dataflash.h.
+ */
+
+/** \ingroup Group_Dataflash
+ *  \defgroup Group_Dataflash_STK525 STK525
+ *  \brief Board specific Dataflash driver header for the Atmel STK525.
+ *
+ *  Board specific Dataflash driver header for the Atmel STK525.
+ *
+ *  <table>
+ *    <tr><th>Name</th><th>Info</th><th>Select Pin</th><th>SPI Port</th></tr>
+ *    <tr><td>DATAFLASH_CHIP1</td><td>AT45DB321C (4MB)</td><td>PORTB.4</td><td>SPI0</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __DATAFLASH_STK525_H__
+#define __DATAFLASH_STK525_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+		#include "../../../Misc/AT45DB321C.h"
+		#include "../../../Peripheral/SPI.h"
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_DATAFLASH_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Dataflash.h instead.
+		#endif
+
+	/* Private Interface - For use in library only: */
+	#if !defined(__DOXYGEN__)
+		/* Macros: */
+			#define DATAFLASH_CHIPCS_MASK                DATAFLASH_CHIP1
+			#define DATAFLASH_CHIPCS_DDR                 DDRB
+			#define DATAFLASH_CHIPCS_PORT                PORTB
+	#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Constant indicating the total number of dataflash ICs mounted on the selected board. */
+			#define DATAFLASH_TOTALCHIPS                 1
+
+			/** Mask for no dataflash chip selected. */
+			#define DATAFLASH_NO_CHIP                    0
+
+			/** Mask for the first dataflash chip selected. */
+			#define DATAFLASH_CHIP1                      (1 << 4)
+
+			/** Internal main memory page size for the board's dataflash IC. */
+			#define DATAFLASH_PAGE_SIZE                  512
+
+			/** Total number of pages inside the board's dataflash IC. */
+			#define DATAFLASH_PAGES                      8192
+
+		/* Inline Functions: */
+			/** Initializes the dataflash driver so that commands and data may be sent to an attached dataflash IC.
+			 *  The appropriate SPI interface will be automatically configured.
+			 */
+			static inline void Dataflash_Init(void)
+			{
+				DATAFLASH_CHIPCS_DDR  |= DATAFLASH_CHIPCS_MASK;
+				DATAFLASH_CHIPCS_PORT |= DATAFLASH_CHIPCS_MASK;
+
+				SPI_Init(SPI_SPEED_FCPU_DIV_2 | SPI_ORDER_MSB_FIRST | SPI_SCK_LEAD_FALLING | SPI_SAMPLE_TRAILING | SPI_MODE_MASTER);
+			}
+
+			/** Sends a byte to the currently selected dataflash IC, and returns a byte from the dataflash.
+			 *
+			 *  \param[in] Byte  Byte of data to send to the dataflash
+			 *
+			 *  \return Last response byte from the dataflash
+			 */
+			static inline uint8_t Dataflash_TransferByte(const uint8_t Byte) ATTR_ALWAYS_INLINE;
+			static inline uint8_t Dataflash_TransferByte(const uint8_t Byte)
+			{
+				return SPI_TransferByte(Byte);
+			}
+
+			/** Sends a byte to the currently selected dataflash IC, and ignores the next byte from the dataflash.
+			 *
+			 *  \param[in] Byte  Byte of data to send to the dataflash
+			 */
+			static inline void Dataflash_SendByte(const uint8_t Byte) ATTR_ALWAYS_INLINE;
+			static inline void Dataflash_SendByte(const uint8_t Byte)
+			{
+				SPI_SendByte(Byte);
+			}
+
+			/** Sends a dummy byte to the currently selected dataflash IC, and returns the next byte from the dataflash.
+			 *
+			 *  \return Last response byte from the dataflash
+			 */
+			static inline uint8_t Dataflash_ReceiveByte(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t Dataflash_ReceiveByte(void)
+			{
+				return SPI_ReceiveByte();
+			}
+
+			/** Determines the currently selected dataflash chip.
+			 *
+			 *  \return Mask of the currently selected Dataflash chip, either \ref DATAFLASH_NO_CHIP if no chip is selected
+			 *          or a DATAFLASH_CHIPn mask (where n is the chip number).
+			 */
+			static inline uint8_t Dataflash_GetSelectedChip(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t Dataflash_GetSelectedChip(void)
+			{
+				return (~DATAFLASH_CHIPCS_PORT & DATAFLASH_CHIPCS_MASK);
+			}
+
+			/** Selects the given dataflash chip.
+			 *
+			 *  \param[in]  ChipMask  Mask of the Dataflash IC to select, in the form of a \c DATAFLASH_CHIPn mask (where n is
+			 *              the chip number).
+			 */
+			static inline void Dataflash_SelectChip(const uint8_t ChipMask) ATTR_ALWAYS_INLINE;
+			static inline void Dataflash_SelectChip(const uint8_t ChipMask)
+			{
+				DATAFLASH_CHIPCS_PORT = ((DATAFLASH_CHIPCS_PORT | DATAFLASH_CHIPCS_MASK) & ~ChipMask);
+			}
+
+			/** Deselects the current dataflash chip, so that no dataflash is selected. */
+			static inline void Dataflash_DeselectChip(void) ATTR_ALWAYS_INLINE;
+			static inline void Dataflash_DeselectChip(void)
+			{
+				Dataflash_SelectChip(DATAFLASH_NO_CHIP);
+			}
+
+			/** Selects a dataflash IC from the given page number, which should range from 0 to
+			 *  ((DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS) - 1). For boards containing only one
+			 *  dataflash IC, this will select DATAFLASH_CHIP1. If the given page number is outside
+			 *  the total number of pages contained in the boards dataflash ICs, all dataflash ICs
+			 *  are deselected.
+			 *
+			 *  \param[in] PageAddress  Address of the page to manipulate, ranging from
+			 *                          0 to ((DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS) - 1).
+			 */
+			static inline void Dataflash_SelectChipFromPage(const uint16_t PageAddress)
+			{
+				Dataflash_DeselectChip();
+
+				if (PageAddress >= DATAFLASH_PAGES)
+				  return;
+
+				Dataflash_SelectChip(DATAFLASH_CHIP1);
+			}
+
+			/** Toggles the select line of the currently selected dataflash IC, so that it is ready to receive
+			 *  a new command.
+			 */
+			static inline void Dataflash_ToggleSelectedChipCS(void)
+			{
+				uint8_t SelectedChipMask = Dataflash_GetSelectedChip();
+
+				Dataflash_DeselectChip();
+				Dataflash_SelectChip(SelectedChipMask);
+			}
+
+			/** Spin-loops while the currently selected dataflash is busy executing a command, such as a main
+			 *  memory page program or main memory to buffer transfer.
+			 */
+			static inline void Dataflash_WaitWhileBusy(void)
+			{
+				Dataflash_ToggleSelectedChipCS();
+				Dataflash_SendByte(DF_CMD_GETSTATUS);
+				while (!(Dataflash_ReceiveByte() & DF_STATUS_READY));
+				Dataflash_ToggleSelectedChipCS();
+			}
+
+			/** Sends a set of page and buffer address bytes to the currently selected dataflash IC, for use with
+			 *  dataflash commands which require a complete 24-bit address.
+			 *
+			 *  \param[in] PageAddress  Page address within the selected dataflash IC
+			 *  \param[in] BufferByte   Address within the dataflash's buffer
+			 */
+			static inline void Dataflash_SendAddressBytes(uint16_t PageAddress,
+			                                              const uint16_t BufferByte)
+			{
+				Dataflash_SendByte(PageAddress >> 6);
+				Dataflash_SendByte((PageAddress << 2) | (BufferByte >> 8));
+				Dataflash_SendByte(BufferByte);
+			}
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/STK525/Joystick.h b/lib/lufa/LUFA/Drivers/Board/AVR8/STK525/Joystick.h
new file mode 100644
index 0000000000..0224a723e7
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/STK525/Joystick.h
@@ -0,0 +1,130 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific joystick driver header for the Atmel STK525.
+ *  \copydetails Group_Joystick_STK525
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the joystick driver
+ *        dispatch header located in LUFA/Drivers/Board/Joystick.h.
+ */
+
+/** \ingroup Group_Joystick
+ *  \defgroup Group_Joystick_STK525 STK525
+ *  \brief Board specific joystick driver header for the Atmel STK525.
+ *
+ *  Board specific joystick driver header for the Atmel STK525.
+ *
+ *  <table>
+ *    <tr><th>Left Port Pin</th><th>Up Port Pin</th><th>Right Port Pin</th><th>Down Port Pin</th><th>Press Port Pin</th></tr>
+ *    <tr><td>PORTB.6</td><td>PORTB.7</td><td>PORTE.4</td><td>PORTE.5</td><td>PORTB.5</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __JOYSTICK_STK525_H__
+#define __JOYSTICK_STK525_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_JOYSTICK_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Joystick.h instead.
+		#endif
+
+	/* Private Interface - For use in library only: */
+	#if !defined(__DOXYGEN__)
+		/* Macros: */
+			#define JOY_BMASK                 ((1 << 5) | (1 << 6) | (1 << 7))
+			#define JOY_EMASK                 ((1 << 4) | (1 << 5))
+
+			#define JOY_PORTE_MASK_SHIFT      1
+	#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Mask for the joystick being pushed in the left direction. */
+			#define JOY_LEFT                  (1 << 6)
+
+			/** Mask for the joystick being pushed in the right direction. */
+			#define JOY_RIGHT                ((1 << 4) >> JOY_PORTE_MASK_SHIFT)
+
+			/** Mask for the joystick being pushed in the upward direction. */
+			#define JOY_UP                    (1 << 7)
+
+			/** Mask for the joystick being pushed in the downward direction. */
+			#define JOY_DOWN                 ((1 << 5) >> JOY_PORTE_MASK_SHIFT)
+
+			/** Mask for the joystick being pushed inward. */
+			#define JOY_PRESS                 (1 << 5)
+
+		/* Inline Functions: */
+		#if !defined(__DOXYGEN__)
+			static inline void Joystick_Init(void)
+			{
+				DDRB  &= ~JOY_BMASK;
+				DDRE  &= ~JOY_EMASK;
+
+				PORTB |=  JOY_BMASK;
+				PORTE |=  JOY_EMASK;
+			}
+
+			static inline void Joystick_Disable(void)
+			{
+				DDRB  &= ~JOY_BMASK;
+				DDRE  &= ~JOY_EMASK;
+
+				PORTB &= ~JOY_BMASK;
+				PORTE &= ~JOY_EMASK;
+			}
+
+			static inline uint8_t Joystick_GetStatus(void) ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t Joystick_GetStatus(void)
+			{
+				return (((uint8_t)~PINB & JOY_BMASK) | (((uint8_t)~PINE & JOY_EMASK) >> JOY_PORTE_MASK_SHIFT));
+			}
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/STK525/LEDs.h b/lib/lufa/LUFA/Drivers/Board/AVR8/STK525/LEDs.h
new file mode 100644
index 0000000000..e4138166d2
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/STK525/LEDs.h
@@ -0,0 +1,147 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific LED driver header for the Atmel STK525.
+ *  \copydetails Group_LEDs_STK525
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the LEDs driver
+ *        dispatch header located in LUFA/Drivers/Board/LEDs.h.
+ */
+
+/** \ingroup Group_LEDs
+ *  \defgroup Group_LEDs_STK525 STK525
+ *  \brief Board specific LED driver header for the Atmel STK525.
+ *
+ *  Board specific LED driver header for the Atmel STK525.
+ *
+ *  <table>
+ *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr>
+ *    <tr><td>LEDS_LED1</td><td>Green</td><td>General Indicator</td><td>High</td><td>PORTD.4</td></tr>
+ *    <tr><td>LEDS_LED2</td><td>Green</td><td>General Indicator</td><td>High</td><td>PORTD.5</td></tr>
+ *    <tr><td>LEDS_LED3</td><td>Green</td><td>General Indicator</td><td>High</td><td>PORTD.6</td></tr>
+ *    <tr><td>LEDS_LED4</td><td>Green</td><td>General Indicator</td><td>High</td><td>PORTD.7</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __LEDS_STK525_H__
+#define __LEDS_STK525_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_LEDS_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/LEDS.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** LED mask for the first LED on the board. */
+			#define LEDS_LED1        (1 << 4)
+
+			/** LED mask for the second LED on the board. */
+			#define LEDS_LED2        (1 << 5)
+
+			/** LED mask for the third LED on the board. */
+			#define LEDS_LED3        (1 << 7)
+
+			/** LED mask for the fourth LED on the board. */
+			#define LEDS_LED4        (1 << 6)
+
+			/** LED mask for all the LEDs on the board. */
+			#define LEDS_ALL_LEDS    (LEDS_LED1 | LEDS_LED2 | LEDS_LED3 | LEDS_LED4)
+
+			/** LED mask for none of the board LEDs. */
+			#define LEDS_NO_LEDS     0
+
+		/* Inline Functions: */
+		#if !defined(__DOXYGEN__)
+			static inline void LEDs_Init(void)
+			{
+				DDRD  |=  LEDS_ALL_LEDS;
+				PORTD &= ~LEDS_ALL_LEDS;
+			}
+
+			static inline void LEDs_Disable(void)
+			{
+				DDRD  &= ~LEDS_ALL_LEDS;
+				PORTD &= ~LEDS_ALL_LEDS;
+			}
+
+			static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask)
+			{
+				PORTD |= LEDMask;
+			}
+
+			static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask)
+			{
+				PORTD &= ~LEDMask;
+			}
+
+			static inline void LEDs_SetAllLEDs(const uint8_t LEDMask)
+			{
+				PORTD = ((PORTD & ~LEDS_ALL_LEDS) | LEDMask);
+			}
+
+			static inline void LEDs_ChangeLEDs(const uint8_t LEDMask,
+			                                   const uint8_t ActiveMask)
+			{
+				PORTD = ((PORTD & ~LEDMask) | ActiveMask);
+			}
+
+			static inline void LEDs_ToggleLEDs(const uint8_t LEDMask)
+			{
+				PIND  = LEDMask;
+			}
+
+			static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t LEDs_GetLEDs(void)
+			{
+				return (PORTD & LEDS_ALL_LEDS);
+			}
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/STK526/Board.h b/lib/lufa/LUFA/Drivers/Board/AVR8/STK526/Board.h
new file mode 100644
index 0000000000..1c4ee85c15
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/STK526/Board.h
@@ -0,0 +1,90 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific information header for the Atmel STK526.
+ *  \copydetails Group_BoardInfo_STK526
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the Board driver
+ *        dispatch header located in LUFA/Drivers/Board/Board.h.
+ */
+
+/** \ingroup Group_BoardInfo
+ *  \defgroup Group_BoardInfo_STK526 STK526
+ *  \brief Board specific information header for the Atmel STK526.
+ *
+ *  Board specific information header for the Atmel STK526.
+ *
+ *  @{
+ */
+
+#ifndef __BOARD_STK526_H__
+#define __BOARD_STK526_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+		#include "../../Buttons.h"
+		#include "../../Dataflash.h"
+		#include "../../Joystick.h"
+		#include "../../LEDs.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_BOARD_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Indicates the board has hardware Buttons mounted. */
+			#define BOARD_HAS_BUTTONS
+
+			/** Indicates the board has a hardware Dataflash mounted. */
+			#define BOARD_HAS_DATAFLASH
+
+			/** Indicates the board has a hardware Joystick mounted. */
+			#define BOARD_HAS_JOYSTICK
+
+			/** Indicates the board has hardware LEDs mounted. */
+			#define BOARD_HAS_LEDS
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/STK526/Buttons.h b/lib/lufa/LUFA/Drivers/Board/AVR8/STK526/Buttons.h
new file mode 100644
index 0000000000..168adaa9bf
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/STK526/Buttons.h
@@ -0,0 +1,103 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific Buttons driver header for the Atmel STK526.
+ *  \copydetails Group_Buttons_STK526
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the Buttons driver
+ *        dispatch header located in LUFA/Drivers/Board/Buttons.h.
+ */
+
+/** \ingroup Group_Buttons
+ *  \defgroup Group_Buttons_STK526 STK526
+ *  \brief Board specific Buttons driver header for the Atmel STK526.
+ *
+ *  Board specific Buttons driver header for the Atmel STK526.
+ *
+ *  <table>
+ *    <tr><th>Name</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr>
+ *    <tr><td>BUTTONS_BUTTON1</td><td>HWB Button</td><td>Low</td><td>PORTD.7</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __BUTTONS_STK526_H__
+#define __BUTTONS_STK526_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_BUTTONS_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Buttons.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Button mask for the first button on the board. */
+			#define BUTTONS_BUTTON1      (1 << 7)
+
+		/* Inline Functions: */
+		#if !defined(__DOXYGEN__)
+			static inline void Buttons_Init(void)
+			{
+				DDRD  &= ~BUTTONS_BUTTON1;
+				PORTD |=  BUTTONS_BUTTON1;
+			}
+
+			static inline void Buttons_Disable(void)
+			{
+				DDRD  &= ~BUTTONS_BUTTON1;
+				PORTD &= ~BUTTONS_BUTTON1;
+			}
+
+			static inline uint8_t Buttons_GetStatus(void) ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t Buttons_GetStatus(void)
+			{
+				return ((PIND & BUTTONS_BUTTON1) ^ BUTTONS_BUTTON1);
+			}
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/STK526/Dataflash.h b/lib/lufa/LUFA/Drivers/Board/AVR8/STK526/Dataflash.h
new file mode 100644
index 0000000000..82b311bbc2
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/STK526/Dataflash.h
@@ -0,0 +1,222 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific Dataflash driver header for the Atmel STK525.
+ *  \copydetails Group_Dataflash_STK526
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the dataflash driver
+ *        dispatch header located in LUFA/Drivers/Board/Dataflash.h.
+ */
+
+/** \ingroup Group_Dataflash
+ *  \defgroup Group_Dataflash_STK526 STK526
+ *  \brief Board specific Dataflash driver header for the Atmel STK525.
+ *
+ *  Board specific Dataflash driver header for the Atmel STK525.
+ *
+ *  <table>
+ *    <tr><th>Name</th><th>Info</th><th>Select Pin</th><th>SPI Port</th></tr>
+ *    <tr><td>DATAFLASH_CHIP1</td><td>AT45DB642D (8MB)</td><td>PORTC.2</td><td>SPI0</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __DATAFLASH_STK526_H__
+#define __DATAFLASH_STK526_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+		#include "../../../Misc/AT45DB642D.h"
+		#include "../../../Peripheral/SPI.h"
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_DATAFLASH_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Dataflash.h instead.
+		#endif
+
+	/* Private Interface - For use in library only: */
+	#if !defined(__DOXYGEN__)
+		/* Macros: */
+			#define DATAFLASH_CHIPCS_MASK                DATAFLASH_CHIP1
+			#define DATAFLASH_CHIPCS_DDR                 DDRC
+			#define DATAFLASH_CHIPCS_PORT                PORTC
+	#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Constant indicating the total number of dataflash ICs mounted on the selected board. */
+			#define DATAFLASH_TOTALCHIPS                 1
+
+			/** Mask for no dataflash chip selected. */
+			#define DATAFLASH_NO_CHIP                    0
+
+			/** Mask for the first dataflash chip selected. */
+			#define DATAFLASH_CHIP1                      (1 << 2)
+
+			/** Internal main memory page size for the board's dataflash IC. */
+			#define DATAFLASH_PAGE_SIZE                  1024
+
+			/** Total number of pages inside the board's dataflash IC. */
+			#define DATAFLASH_PAGES                      8192
+
+		/* Inline Functions: */
+			/** Initializes the dataflash driver so that commands and data may be sent to an attached dataflash IC.
+			 *  The appropriate SPI interface will be automatically configured.
+			 */
+			static inline void Dataflash_Init(void)
+			{
+				DATAFLASH_CHIPCS_DDR  |= DATAFLASH_CHIPCS_MASK;
+				DATAFLASH_CHIPCS_PORT |= DATAFLASH_CHIPCS_MASK;
+
+				SPI_Init(SPI_SPEED_FCPU_DIV_2 | SPI_ORDER_MSB_FIRST | SPI_SCK_LEAD_FALLING | SPI_SAMPLE_TRAILING | SPI_MODE_MASTER);
+			}
+
+			/** Sends a byte to the currently selected dataflash IC, and returns a byte from the dataflash.
+			 *
+			 *  \param[in] Byte  Byte of data to send to the dataflash
+			 *
+			 *  \return Last response byte from the dataflash
+			 */
+			static inline uint8_t Dataflash_TransferByte(const uint8_t Byte) ATTR_ALWAYS_INLINE;
+			static inline uint8_t Dataflash_TransferByte(const uint8_t Byte)
+			{
+				return SPI_TransferByte(Byte);
+			}
+
+			/** Sends a byte to the currently selected dataflash IC, and ignores the next byte from the dataflash.
+			 *
+			 *  \param[in] Byte  Byte of data to send to the dataflash
+			 */
+			static inline void Dataflash_SendByte(const uint8_t Byte) ATTR_ALWAYS_INLINE;
+			static inline void Dataflash_SendByte(const uint8_t Byte)
+			{
+				SPI_SendByte(Byte);
+			}
+
+			/** Sends a dummy byte to the currently selected dataflash IC, and returns the next byte from the dataflash.
+			 *
+			 *  \return Last response byte from the dataflash
+			 */
+			static inline uint8_t Dataflash_ReceiveByte(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t Dataflash_ReceiveByte(void)
+			{
+				return SPI_ReceiveByte();
+			}
+
+			/** Determines the currently selected dataflash chip.
+			 *
+			 *  \return Mask of the currently selected Dataflash chip, either \ref DATAFLASH_NO_CHIP if no chip is selected
+			 *          or a DATAFLASH_CHIPn mask (where n is the chip number).
+			 */
+			static inline uint8_t Dataflash_GetSelectedChip(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t Dataflash_GetSelectedChip(void)
+			{
+				return (~DATAFLASH_CHIPCS_PORT & DATAFLASH_CHIPCS_MASK);
+			}
+
+			/** Selects the given dataflash chip.
+			 *
+			 *  \param[in]  ChipMask  Mask of the Dataflash IC to select, in the form of a \c DATAFLASH_CHIPn mask (where n is
+			 *              the chip number).
+			 */
+			static inline void Dataflash_SelectChip(const uint8_t ChipMask) ATTR_ALWAYS_INLINE;
+			static inline void Dataflash_SelectChip(const uint8_t ChipMask)
+			{
+				DATAFLASH_CHIPCS_PORT = ((DATAFLASH_CHIPCS_PORT | DATAFLASH_CHIPCS_MASK) & ~ChipMask);
+			}
+
+			/** Deselects the current dataflash chip, so that no dataflash is selected. */
+			static inline void Dataflash_DeselectChip(void) ATTR_ALWAYS_INLINE;
+			static inline void Dataflash_DeselectChip(void)
+			{
+				Dataflash_SelectChip(DATAFLASH_NO_CHIP);
+			}
+
+			/** Selects a dataflash IC from the given page number, which should range from 0 to
+			 *  ((DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS) - 1). For boards containing only one
+			 *  dataflash IC, this will select DATAFLASH_CHIP1. If the given page number is outside
+			 *  the total number of pages contained in the boards dataflash ICs, all dataflash ICs
+			 *  are deselected.
+			 *
+			 *  \param[in] PageAddress  Address of the page to manipulate, ranging from
+			 *                          0 to ((DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS) - 1).
+			 */
+			static inline void Dataflash_SelectChipFromPage(const uint16_t PageAddress)
+			{
+				Dataflash_DeselectChip();
+
+				if (PageAddress >= DATAFLASH_PAGES)
+				  return;
+
+				Dataflash_SelectChip(DATAFLASH_CHIP1);
+			}
+
+			/** Toggles the select line of the currently selected dataflash IC, so that it is ready to receive
+			 *  a new command.
+			 */
+			static inline void Dataflash_ToggleSelectedChipCS(void)
+			{
+				uint8_t SelectedChipMask = Dataflash_GetSelectedChip();
+
+				Dataflash_DeselectChip();
+				Dataflash_SelectChip(SelectedChipMask);
+			}
+
+			/** Spin-loops while the currently selected dataflash is busy executing a command, such as a main
+			 *  memory page program or main memory to buffer transfer.
+			 */
+			static inline void Dataflash_WaitWhileBusy(void)
+			{
+				Dataflash_ToggleSelectedChipCS();
+				Dataflash_SendByte(DF_CMD_GETSTATUS);
+				while (!(Dataflash_ReceiveByte() & DF_STATUS_READY));
+				Dataflash_ToggleSelectedChipCS();
+			}
+
+			/** Sends a set of page and buffer address bytes to the currently selected dataflash IC, for use with
+			 *  dataflash commands which require a complete 24-bit address.
+			 *
+			 *  \param[in] PageAddress  Page address within the selected dataflash IC
+			 *  \param[in] BufferByte   Address within the dataflash's buffer
+			 */
+			static inline void Dataflash_SendAddressBytes(uint16_t PageAddress,
+			                                              const uint16_t BufferByte)
+			{
+				Dataflash_SendByte(PageAddress >> 5);
+				Dataflash_SendByte((PageAddress << 3) | (BufferByte >> 8));
+				Dataflash_SendByte(BufferByte);
+			}
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/STK526/Joystick.h b/lib/lufa/LUFA/Drivers/Board/AVR8/STK526/Joystick.h
new file mode 100644
index 0000000000..c7d816c83d
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/STK526/Joystick.h
@@ -0,0 +1,123 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific joystick driver header for the Atmel STK526.
+ *  \copydetails Group_Joystick_STK526
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the joystick driver
+ *        dispatch header located in LUFA/Drivers/Board/Joystick.h.
+ */
+
+/** \ingroup Group_Joystick
+ *  \defgroup Group_Joystick_STK526 STK526
+ *  \brief Board specific joystick driver header for the Atmel STK526.
+ *
+ *  Board specific joystick driver header for the Atmel STK526.
+ *
+ *  <table>
+ *    <tr><th>Left Port Pin</th><th>Up Port Pin</th><th>Right Port Pin</th><th>Down Port Pin</th><th>Press Port Pin</th></tr>
+ *    <tr><td>PORTB.4</td><td>PORTB.5</td><td>PORTB.6</td><td>PORTB.7</td><td>PORTB.0</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __JOYSTICK_STK526_H__
+#define __JOYSTICK_STK526_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_JOYSTICK_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Joystick.h instead.
+		#endif
+
+	/* Private Interface - For use in library only: */
+	#if !defined(__DOXYGEN__)
+		/* Macros: */
+			#define JOY_BMASK                 ((1 << 0) | (1 << 4) | (1 << 5) | (1 << 6) | (1 << 7))
+	#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Mask for the joystick being pushed in the left direction. */
+			#define JOY_LEFT                  (1 << 4)
+
+			/** Mask for the joystick being pushed in the right direction. */
+			#define JOY_RIGHT                 (1 << 6)
+
+			/** Mask for the joystick being pushed in the upward direction. */
+			#define JOY_UP                    (1 << 5)
+
+			/** Mask for the joystick being pushed in the downward direction. */
+			#define JOY_DOWN                  (1 << 7)
+
+			/** Mask for the joystick being pushed inward. */
+			#define JOY_PRESS                 (1 << 0)
+
+		/* Inline Functions: */
+		#if !defined(__DOXYGEN__)
+			static inline void Joystick_Init(void)
+			{
+				DDRB  &= ~JOY_BMASK;
+
+				PORTB |=  JOY_BMASK;
+			}
+
+			static inline void Joystick_Disable(void)
+			{
+				DDRB  &= ~JOY_BMASK;
+
+				PORTB &= ~JOY_BMASK;
+			}
+
+			static inline uint8_t Joystick_GetStatus(void) ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t Joystick_GetStatus(void)
+			{
+				return ((uint8_t)~PINB & JOY_BMASK);
+			}
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/STK526/LEDs.h b/lib/lufa/LUFA/Drivers/Board/AVR8/STK526/LEDs.h
new file mode 100644
index 0000000000..fc561e7336
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/STK526/LEDs.h
@@ -0,0 +1,147 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific LED driver header for the Atmel STK526.
+ *  \copydetails Group_LEDs_STK526
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the LEDs driver
+ *        dispatch header located in LUFA/Drivers/Board/LEDs.h.
+ */
+
+/** \ingroup Group_LEDs
+ *  \defgroup Group_LEDs_STK526 STK526
+ *  \brief Board specific LED driver header for the Atmel STK526.
+ *
+ *  Board specific LED driver header for the Atmel STK526.
+ *
+ *  <table>
+ *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr>
+ *    <tr><td>LEDS_LED1</td><td>Green</td><td>General Indicator</td><td>High</td><td>PORTD.1</td></tr>
+ *    <tr><td>LEDS_LED2</td><td>Green</td><td>General Indicator</td><td>High</td><td>PORTD.0</td></tr>
+ *    <tr><td>LEDS_LED3</td><td>Green</td><td>General Indicator</td><td>High</td><td>PORTD.5</td></tr>
+ *    <tr><td>LEDS_LED4</td><td>Green</td><td>General Indicator</td><td>High</td><td>PORTD.4</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __LEDS_STK526_H__
+#define __LEDS_STK526_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_LEDS_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/LEDS.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** LED mask for the first LED on the board. */
+			#define LEDS_LED1        (1 << 1)
+
+			/** LED mask for the second LED on the board. */
+			#define LEDS_LED2        (1 << 0)
+
+			/** LED mask for the third LED on the board. */
+			#define LEDS_LED3        (1 << 5)
+
+			/** LED mask for the fourth LED on the board. */
+			#define LEDS_LED4        (1 << 4)
+
+			/** LED mask for all the LEDs on the board. */
+			#define LEDS_ALL_LEDS    (LEDS_LED1 | LEDS_LED2 | LEDS_LED3 | LEDS_LED4)
+
+			/** LED mask for none of the board LEDs. */
+			#define LEDS_NO_LEDS     0
+
+		/* Inline Functions: */
+		#if !defined(__DOXYGEN__)
+			static inline void LEDs_Init(void)
+			{
+				DDRD  |=  LEDS_ALL_LEDS;
+				PORTD &= ~LEDS_ALL_LEDS;
+			}
+
+			static inline void LEDs_Disable(void)
+			{
+				DDRD  &= ~LEDS_ALL_LEDS;
+				PORTD &= ~LEDS_ALL_LEDS;
+			}
+
+			static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask)
+			{
+				PORTD |= LEDMask;
+			}
+
+			static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask)
+			{
+				PORTD &= ~LEDMask;
+			}
+
+			static inline void LEDs_SetAllLEDs(const uint8_t LEDMask)
+			{
+				PORTD = ((PORTD & ~LEDS_ALL_LEDS) | LEDMask);
+			}
+
+			static inline void LEDs_ChangeLEDs(const uint8_t LEDMask,
+			                                   const uint8_t ActiveMask)
+			{
+				PORTD = ((PORTD & ~LEDMask) | ActiveMask);
+			}
+
+			static inline void LEDs_ToggleLEDs(const uint8_t LEDMask)
+			{
+				PIND  = LEDMask;
+			}
+
+			static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t LEDs_GetLEDs(void)
+			{
+				return (PORTD & LEDS_ALL_LEDS);
+			}
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/TEENSY/Board.h b/lib/lufa/LUFA/Drivers/Board/AVR8/TEENSY/Board.h
new file mode 100644
index 0000000000..15237b625a
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/TEENSY/Board.h
@@ -0,0 +1,85 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific information header for the PJRC Teensy 1.x/2.x boards.
+ *  \copydetails Group_BoardInfo_TEENSY
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the Board driver
+ *        dispatch header located in LUFA/Drivers/Board/Board.h.
+ */
+
+/** \ingroup Group_BoardInfo
+ *  \defgroup Group_BoardInfo_TEENSY2 TEENSY2
+ *  \brief Board specific information header for the PJRC Teensy 2 boards.
+ *
+ *  See \ref Group_BoardInfo_TEENSY for more details.
+ */
+
+/** \ingroup Group_BoardInfo
+ *  \defgroup Group_BoardInfo_TEENSY TEENSY
+ *  \brief Board specific information header for the PJRC Teensy 1.x/2.x boards.
+ *
+ *  Board specific information header for the PJRC Teensy boards (http://www.pjrc.com/teensy/index.html).
+ *
+ *  @{
+ */
+
+#ifndef __BOARD_TEENSY_H__
+#define __BOARD_TEENSY_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+		#include "../../LEDs.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_BOARD_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Indicates the board has hardware LEDs mounted. */
+			#define BOARD_HAS_LEDS
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/TEENSY/LEDs.h b/lib/lufa/LUFA/Drivers/Board/AVR8/TEENSY/LEDs.h
new file mode 100644
index 0000000000..ed7fbf0946
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/TEENSY/LEDs.h
@@ -0,0 +1,176 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific LED driver header for the PJRC Teensy 1.x/2.x boards.
+ *  \copydetails Group_LEDs_TEENSY
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the LEDs driver
+ *        dispatch header located in LUFA/Drivers/Board/LEDs.h.
+ */
+
+/** \ingroup Group_LEDs
+ *  \defgroup Group_LEDs_TEENSY2 TEENSY2
+ *  \brief Board specific LED driver header for the PJRC Teensy 2 boards.
+ *
+ *  See \ref Group_LEDs_TEENSY for more details.
+ */
+
+/** \ingroup Group_LEDs
+ *  \defgroup Group_LEDs_TEENSY TEENSY
+ *  \brief Board specific LED driver header for the PJRC Teensy 1.x/2.x boards.
+ *
+ *  \note For version 2 Teensy boards, compile with <code>BOARD = TEENSY2</code>.
+ *
+ *  Board specific LED driver header for the PJRC Teensy boards (http://www.pjrc.com/teensy/index.html).
+ *
+ *  <b>TEENSY</b>:
+ *  <table>
+ *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr>
+ *    <tr><td>LEDS_LED1</td><td>Green</td><td>General Indicator</td><td>High</td><td>PORTD.6</td></tr>
+ *  </table>
+ *
+ *  <b>TEENSY2</b>:
+ *  <table>
+ *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr>
+ *    <tr><td>LEDS_LED1</td><td>Green</td><td>General Indicator</td><td>Low</td><td>PORTD.6</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __LEDS_TEENSY_H__
+#define __LEDS_TEENSY_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_LEDS_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/LEDS.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** LED mask for the first LED on the board. */
+			#define LEDS_LED1        (1 << 6)
+
+			/** LED mask for all the LEDs on the board. */
+			#define LEDS_ALL_LEDS    LEDS_LED1
+
+			/** LED mask for none of the board LEDs. */
+			#define LEDS_NO_LEDS     0
+
+		/* Inline Functions: */
+		#if !defined(__DOXYGEN__)
+			static inline void LEDs_Init(void)
+			{
+				DDRD  |= LEDS_ALL_LEDS;
+
+				#if (BOARD == BOARD_TEENSY2)
+				PORTD &= ~LEDS_ALL_LEDS;
+				#else
+				PORTD |=  LEDS_ALL_LEDS;
+				#endif
+			}
+
+			static inline void LEDs_Disable(void)
+			{
+				DDRD  &= ~LEDS_ALL_LEDS;
+				PORTD &= ~LEDS_ALL_LEDS;
+			}
+
+			static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask)
+			{
+				#if (BOARD == BOARD_TEENSY2)
+				PORTD |=  LEDMask;
+				#else
+				PORTD &= ~LEDMask;
+				#endif
+			}
+
+			static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask)
+			{
+				#if (BOARD == BOARD_TEENSY2)
+				PORTD &= ~LEDMask;
+				#else
+				PORTD |=  LEDMask;
+				#endif
+			}
+
+			static inline void LEDs_SetAllLEDs(const uint8_t LEDMask)
+			{
+				#if (BOARD == BOARD_TEENSY2)
+				PORTD = ((PORTD & ~LEDS_ALL_LEDS) | LEDMask);
+				#else
+				PORTD = ((PORTD | LEDS_ALL_LEDS) & ~LEDMask);
+				#endif
+			}
+
+			static inline void LEDs_ChangeLEDs(const uint8_t LEDMask,
+			                                   const uint8_t ActiveMask)
+			{
+				#if (BOARD == BOARD_TEENSY2)
+				PORTD = ((PORTD & ~LEDMask) | ActiveMask);
+				#else
+				PORTD = ((PORTD | LEDMask) & ~ActiveMask);
+				#endif
+			}
+
+			static inline void LEDs_ToggleLEDs(const uint8_t LEDMask)
+			{
+				PIND  = LEDMask;
+			}
+
+			static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t LEDs_GetLEDs(void)
+			{
+				#if (BOARD == BOARD_TEENSY2)
+				return (PORTD & LEDS_ALL_LEDS);
+				#else
+				return (~PORTD & LEDS_ALL_LEDS);
+				#endif
+			}
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/TUL/Board.h b/lib/lufa/LUFA/Drivers/Board/AVR8/TUL/Board.h
new file mode 100644
index 0000000000..066e6c3ed7
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/TUL/Board.h
@@ -0,0 +1,82 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific information header for the TUL.
+ *  \copydetails Group_BoardInfo_TUL
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the Board driver
+ *        dispatch header located in LUFA/Drivers/Board/Board.h.
+ */
+
+/** \ingroup Group_BoardInfo
+ *  \defgroup Group_BoardInfo_TUL TUL
+ *  \brief Board specific information header for the TUL.
+ *
+ *  Board specific information header for the Busware TUL (http://www.busware.de/tiki-index.php?page=TUL).
+ *
+ *  @{
+ */
+
+#ifndef __BOARD_TUL_H__
+#define __BOARD_TUL_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+		#include "../../Buttons.h"
+		#include "../../LEDs.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_BOARD_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Indicates the board has hardware Buttons mounted. */
+			#define BOARD_HAS_BUTTONS
+
+			/** Indicates the board has hardware LEDs mounted. */
+			#define BOARD_HAS_LEDS
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/TUL/Buttons.h b/lib/lufa/LUFA/Drivers/Board/AVR8/TUL/Buttons.h
new file mode 100644
index 0000000000..af6b2ae611
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/TUL/Buttons.h
@@ -0,0 +1,103 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific Buttons driver header for the TUL.
+ *  \copydetails Group_Buttons_TUL
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the Buttons driver
+ *        dispatch header located in LUFA/Drivers/Board/Buttons.h.
+ */
+
+/** \ingroup Group_Buttons
+ *  \defgroup Group_Buttons_TUL TUL
+ *  \brief Board specific Buttons driver header for the TUL.
+ *
+ *  Board specific Buttons driver header for the Busware TUL (http://www.busware.de/tiki-index.php?page=TUL).
+ *
+ *  <table>
+ *    <tr><th>Name</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr>
+ *    <tr><td>BUTTONS_BUTTON1</td><td>HWB Button</td><td>Low</td><td>PORTE.2</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __BUTTONS_TUL_H__
+#define __BUTTONS_TUL_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_BUTTONS_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Buttons.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Button mask for the first button on the board. */
+			#define BUTTONS_BUTTON1      (1 << 2)
+
+		/* Inline Functions: */
+		#if !defined(__DOXYGEN__)
+			static inline void Buttons_Init(void)
+			{
+				DDRE  &= ~BUTTONS_BUTTON1;
+				PORTE |=  BUTTONS_BUTTON1;
+			}
+
+			static inline void Buttons_Disable(void)
+			{
+				DDRE  &= ~BUTTONS_BUTTON1;
+				PORTE &= ~BUTTONS_BUTTON1;
+			}
+
+			static inline uint8_t Buttons_GetStatus(void) ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t Buttons_GetStatus(void)
+			{
+				return ((PINE & BUTTONS_BUTTON1) ^ BUTTONS_BUTTON1);
+			}
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/TUL/LEDs.h b/lib/lufa/LUFA/Drivers/Board/AVR8/TUL/LEDs.h
new file mode 100644
index 0000000000..9417b67638
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/TUL/LEDs.h
@@ -0,0 +1,135 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific LED driver header for the Busware TUL.
+ *  \copydetails Group_LEDs_TUL
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the LEDs driver
+ *        dispatch header located in LUFA/Drivers/Board/LEDs.h.
+ */
+
+/** \ingroup Group_LEDs
+ *  \defgroup Group_LEDs_TUL TUL
+ *  \brief Board specific LED driver header for the Busware TUL.
+ *
+ *  Board specific LED driver header for the Busware TUL (http://www.busware.de/tiki-index.php?page=TUL).
+ *
+ *  <table>
+ *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr>
+ *    <tr><td>LEDS_LED1</td><td>Green</td><td>General Indicator</td><td>High</td><td>PORTF.0</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __LEDS_TUL_H__
+#define __LEDS_TUL_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_LEDS_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/LEDS.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** LED mask for the first LED on the board. */
+			#define LEDS_LED1        (1 << 0)
+
+			/** LED mask for all the LEDs on the board. */
+			#define LEDS_ALL_LEDS    LEDS_LED1
+
+			/** LED mask for the none of the board LEDs. */
+			#define LEDS_NO_LEDS     0
+
+		/* Inline Functions: */
+		#if !defined(__DOXYGEN__)
+			static inline void LEDs_Init(void)
+			{
+				DDRF  |=  LEDS_ALL_LEDS;
+				PORTF &= ~LEDS_ALL_LEDS;
+			}
+
+			static inline void LEDs_Disable(void)
+			{
+				DDRF  &= ~LEDS_ALL_LEDS;
+				PORTF &= ~LEDS_ALL_LEDS;
+			}
+
+			static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask)
+			{
+				PORTF |= LEDMask;
+			}
+
+			static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask)
+			{
+				PORTF &= ~LEDMask;
+			}
+
+			static inline void LEDs_SetAllLEDs(const uint8_t LEDMask)
+			{
+				PORTF = ((PORTF & ~LEDS_ALL_LEDS) | LEDMask);
+			}
+
+			static inline void LEDs_ChangeLEDs(const uint8_t LEDMask,
+			                                   const uint8_t ActiveMask)
+			{
+				PORTF = ((PORTF & ~LEDMask) | ActiveMask);
+			}
+
+			static inline void LEDs_ToggleLEDs(const uint8_t LEDMask)
+			{
+				PINF  = LEDMask;
+			}
+
+			static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t LEDs_GetLEDs(void)
+			{
+				return (PORTF & LEDS_ALL_LEDS);
+			}
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/U2S/Board.h b/lib/lufa/LUFA/Drivers/Board/AVR8/U2S/Board.h
new file mode 100644
index 0000000000..6ea238028c
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/U2S/Board.h
@@ -0,0 +1,82 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific information header for the U2S.
+ *  \copydetails Group_BoardInfo_U2S
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the Board driver
+ *        dispatch header located in LUFA/Drivers/Board/Board.h.
+ */
+
+/** \ingroup Group_BoardInfo
+ *  \defgroup Group_BoardInfo_U2S U2S
+ *  \brief Board specific information header for the U2S.
+ *
+ *  Board specific information header for the U2S (http://sites.google.com/site/megau2s/).
+ *
+ *  @{
+ */
+
+#ifndef __BOARD_U2S__
+#define __BOARD_U2S__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+		#include "../../Buttons.h"
+		#include "../../LEDs.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_BOARD_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Indicates the board has a hardware Buttons mounted. */
+			#define BOARD_HAS_BUTTONS
+
+			/** Indicates the board has a hardware LEDs mounted. */
+			#define BOARD_HAS_LEDS
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/U2S/Buttons.h b/lib/lufa/LUFA/Drivers/Board/AVR8/U2S/Buttons.h
new file mode 100644
index 0000000000..ea5c1af4fd
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/U2S/Buttons.h
@@ -0,0 +1,103 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific Buttons driver header for the U2S.
+ *  \copydetails Group_Buttons_U2S
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the Buttons driver
+ *        dispatch header located in LUFA/Drivers/Board/Buttons.h.
+ */
+
+/** \ingroup Group_Buttons
+ *  \defgroup Group_Buttons_U2S U2S
+ *  \brief Board specific Buttons driver header for the U2S.
+ *
+ *  Board specific Buttons driver header for the U2S (http://sites.google.com/site/megau2s/).
+ *
+ *  <table>
+ *    <tr><th>Name</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr>
+ *    <tr><td>BUTTONS_BUTTON1</td><td>HWB Button</td><td>Low</td><td>PORTC.4</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __BUTTONS_U2S__
+#define __BUTTONS_U2S__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_BUTTONS_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Buttons.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Button mask for the first button on the board. */
+			#define BUTTONS_BUTTON1      (1 << 4)
+
+		/* Inline Functions: */
+		#if !defined(__DOXYGEN__)
+			static inline void Buttons_Init(void)
+			{
+				DDRC  &= ~BUTTONS_BUTTON1;
+				PORTC |=  BUTTONS_BUTTON1;
+			}
+
+			static inline void Buttons_Disable(void)
+			{
+				DDRC  &= ~BUTTONS_BUTTON1;
+				PORTC &= ~BUTTONS_BUTTON1;
+			}
+
+			static inline uint8_t Buttons_GetStatus(void) ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t Buttons_GetStatus(void)
+			{
+				return ((PINC & BUTTONS_BUTTON1) ^ BUTTONS_BUTTON1);
+			}
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/U2S/LEDs.h b/lib/lufa/LUFA/Drivers/Board/AVR8/U2S/LEDs.h
new file mode 100644
index 0000000000..942fdc0e6c
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/U2S/LEDs.h
@@ -0,0 +1,135 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific LED driver header for the U2S.
+ *  \copydetails Group_LEDs_U2S
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the LEDs driver
+ *        dispatch header located in LUFA/Drivers/Board/LEDs.h.
+ */
+
+/** \ingroup Group_LEDs
+ *  \defgroup Group_LEDs_U2S U2S
+ *  \brief Board specific LED driver header for the U2S.
+ *
+ *  Board specific LED driver header for the U2S (http://sites.google.com/site/megau2s/).
+ *
+ *  <table>
+ *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr>
+ *    <tr><td>LEDS_LED1</td><td>Red</td><td>General Indicator</td><td>Low</td><td>PORTC.2</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __LEDS_U2S__
+#define __LEDS_U2S__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_LEDS_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/LEDS.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** LED mask for the first LED on the board. */
+			#define LEDS_LED1        (1 << 2)
+
+			/** LED mask for all the LEDs on the board. */
+			#define LEDS_ALL_LEDS    LEDS_LED1
+
+			/** LED mask for none of the board LEDs. */
+			#define LEDS_NO_LEDS     0
+
+		/* Inline Functions: */
+		#if !defined(__DOXYGEN__)
+			static inline void LEDs_Init(void)
+			{
+				DDRC  |= LEDS_ALL_LEDS;
+				PORTC |= LEDS_ALL_LEDS;
+			}
+
+			static inline void LEDs_Disable(void)
+			{
+				DDRC  &= ~LEDS_ALL_LEDS;
+				PORTC &= ~LEDS_ALL_LEDS;
+			}
+
+			static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask)
+			{
+				PORTC &= ~LEDMask;
+			}
+
+			static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask)
+			{
+				PORTC |= LEDMask;
+			}
+
+			static inline void LEDs_SetAllLEDs(const uint8_t LEDMask)
+			{
+				PORTC = ((PORTC | LEDS_ALL_LEDS) & ~LEDMask);
+			}
+
+			static inline void LEDs_ChangeLEDs(const uint8_t LEDMask,
+			                                   const uint8_t ActiveMask)
+			{
+				PORTC = ((PORTC | LEDMask) & ~ActiveMask);
+			}
+
+			static inline void LEDs_ToggleLEDs(const uint8_t LEDMask)
+			{
+				PINC  = LEDMask;
+			}
+
+			static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t LEDs_GetLEDs(void)
+			{
+				return (~PORTC & LEDS_ALL_LEDS);
+			}
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/UDIP/Board.h b/lib/lufa/LUFA/Drivers/Board/AVR8/UDIP/Board.h
new file mode 100644
index 0000000000..c8b6e77656
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/UDIP/Board.h
@@ -0,0 +1,82 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific information header for the UDIP.
+ *  \copydetails Group_BoardInfo_UDIP
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the Board driver
+ *        dispatch header located in LUFA/Drivers/Board/Board.h.
+ */
+
+/** \ingroup Group_BoardInfo
+ *  \defgroup Group_BoardInfo_UDIP UDIP
+ *  \brief Board specific information header for the UDIP.
+ *
+ *  Board specific information header for the Linnix UDIP (http://linnix.com/udip/).
+ *
+ *  @{
+ */
+
+#ifndef __BOARD_UDIP_H__
+#define __BOARD_UDIP_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+		#include "../../Buttons.h"
+		#include "../../LEDs.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_BOARD_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Indicates the board has hardware Buttons mounted. */
+			#define BOARD_HAS_BUTTONS
+
+			/** Indicates the board has hardware LEDs mounted. */
+			#define BOARD_HAS_LEDS
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/UDIP/Buttons.h b/lib/lufa/LUFA/Drivers/Board/AVR8/UDIP/Buttons.h
new file mode 100644
index 0000000000..f579b29b75
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/UDIP/Buttons.h
@@ -0,0 +1,103 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific Buttons driver header for the UDIP.
+ *  \copydetails Group_Buttons_UDIP
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the Buttons driver
+ *        dispatch header located in LUFA/Drivers/Board/Buttons.h.
+ */
+
+/** \ingroup Group_Buttons
+ *  \defgroup Group_Buttons_UDIP UDIP
+ *  \brief Board specific Buttons driver header for the UDIP.
+ *
+ *  Board specific Buttons driver header for the Linnix UDIP (http://linnix.com/udip/).
+ *
+ *  <table>
+ *    <tr><th>Name</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr>
+ *    <tr><td>BUTTONS_BUTTON1</td><td>HWB Button</td><td>Low</td><td>PORTD.7</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __BUTTONS_UDIP_H__
+#define __BUTTONS_UDIP_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_BUTTONS_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Buttons.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Button mask for the first button on the board. */
+			#define BUTTONS_BUTTON1      (1 << 7)
+
+		/* Inline Functions: */
+		#if !defined(__DOXYGEN__)
+			static inline void Buttons_Init(void)
+			{
+				DDRD  &= ~BUTTONS_BUTTON1;
+				PORTD |=  BUTTONS_BUTTON1;
+			}
+
+			static inline void Buttons_Disable(void)
+			{
+				DDRD  &= ~BUTTONS_BUTTON1;
+				PORTD &= ~BUTTONS_BUTTON1;
+			}
+
+			static inline uint8_t Buttons_GetStatus(void) ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t Buttons_GetStatus(void)
+			{
+				return ((PIND & BUTTONS_BUTTON1) ^ BUTTONS_BUTTON1);
+			}
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/UDIP/LEDs.h b/lib/lufa/LUFA/Drivers/Board/AVR8/UDIP/LEDs.h
new file mode 100644
index 0000000000..1bf839823a
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/UDIP/LEDs.h
@@ -0,0 +1,163 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific LED driver header for the Linnix UDIP.
+ *  \copydetails Group_LEDs_UDIP
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the LEDs driver
+ *        dispatch header located in LUFA/Drivers/Board/LEDs.h.
+ */
+
+/** \ingroup Group_LEDs
+ *  \defgroup Group_LEDs_UDIP UDIP
+ *  \brief Board specific LED driver header for the Linnix UDIP.
+ *
+ *  Board specific LED driver header for the Linnix UDIP (http://linnix.com/udip/).
+ *
+ *  <table>
+ *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr>
+ *    <tr><td>LEDS_LED1</td><td>Green</td><td>Bicolor Indicator 1</td><td>High</td><td>PORTB.6</td></tr>
+ *    <tr><td>LEDS_LED2</td><td>Red</td><td>Bicolor Indicator 1</td><td>High</td><td>PORTB.5</td></tr>
+ *    <tr><td>LEDS_LED3</td><td>Green</td><td>Bicolor Indicator 2</td><td>High</td><td>PORTD.5</td></tr>
+ *    <tr><td>LEDS_LED4</td><td>Red</td><td>Bicolor Indicator 2</td><td>High</td><td>PORTD.4</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __LEDS_UDIP_H__
+#define __LEDS_UDIP_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_LEDS_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/LEDS.h instead.
+		#endif
+
+	/* Private Interface - For use in library only: */
+	#if !defined(__DOXYGEN__)
+		/* Macros: */
+			#define LEDS_PORTB_LEDS       (LEDS_LED1 | LEDS_LED2)
+			#define LEDS_PORTD_LEDS       (LEDS_LED3 | LEDS_LED4)
+
+			#define LEDS_PORTD_MASK_SHIFT 1
+	#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** LED mask for the first LED on the board. */
+			#define LEDS_LED1        (1 << 6)
+
+			/** LED mask for the second LED on the board. */
+			#define LEDS_LED2        (1 << 5)
+
+			/** LED mask for the third LED on the board. */
+			#define LEDS_LED3        ((1 << 5) >> LEDS_PORTD_MASK_SHIFT)
+
+			/** LED mask for the fourth LED on the board. */
+			#define LEDS_LED4        ((1 << 4) >> LEDS_PORTD_MASK_SHIFT)
+
+			/** LED mask for all the LEDs on the board. */
+			#define LEDS_ALL_LEDS    (LEDS_LED1 | LEDS_LED2 | LEDS_LED3 | LEDS_LED4)
+
+			/** LED mask for none of the board LEDs. */
+			#define LEDS_NO_LEDS     0
+
+		/* Inline Functions: */
+		#if !defined(__DOXYGEN__)
+			static inline void LEDs_Init(void)
+			{
+				DDRB |= LEDS_PORTB_LEDS;
+				DDRD |= (LEDS_PORTD_LEDS << LEDS_PORTD_MASK_SHIFT);
+			}
+
+			static inline void LEDs_Disable(void)
+			{
+				DDRB &= ~LEDS_PORTB_LEDS;
+				DDRD &= ~(LEDS_PORTD_LEDS << LEDS_PORTD_MASK_SHIFT);
+			}
+
+			static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask)
+			{
+				PORTB |= (LEDMask & LEDS_PORTB_LEDS);
+				PORTD |= ((LEDMask & LEDS_PORTD_LEDS) << LEDS_PORTD_MASK_SHIFT);
+			}
+
+			static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask)
+			{
+				PORTB &= ~(LEDMask & LEDS_PORTB_LEDS);
+				PORTD &= ~((LEDMask & LEDS_PORTD_LEDS) << LEDS_PORTD_MASK_SHIFT);
+			}
+
+			static inline void LEDs_SetAllLEDs(const uint8_t LEDMask)
+			{
+				PORTB = (PORTB & ~LEDS_PORTB_LEDS) | (LEDMask & LEDS_PORTB_LEDS);
+				PORTD = (PORTD & ~(LEDS_PORTD_LEDS << LEDS_PORTD_MASK_SHIFT)) |
+				        ((LEDMask & LEDS_PORTD_LEDS) << LEDS_PORTD_MASK_SHIFT);
+			}
+
+			static inline void LEDs_ChangeLEDs(const uint8_t LEDMask,
+			                                   const uint8_t ActiveMask)
+			{
+				PORTB = (PORTB & ~(LEDMask & LEDS_PORTB_LEDS)) | (ActiveMask & LEDS_PORTB_LEDS);
+				PORTD = (PORTD & ~((LEDMask & LEDS_PORTD_LEDS) << LEDS_PORTD_MASK_SHIFT)) |
+				        ((ActiveMask & LEDS_PORTD_LEDS) << LEDS_PORTD_MASK_SHIFT);
+			}
+
+			static inline void LEDs_ToggleLEDs(const uint8_t LEDMask)
+			{
+				PINB  = (LEDMask & LEDS_PORTB_LEDS);
+				PIND  = ((LEDMask & LEDS_PORTD_LEDS) << LEDS_PORTD_MASK_SHIFT);
+			}
+
+			static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t LEDs_GetLEDs(void)
+			{
+				return ((PORTB & LEDS_PORTB_LEDS) | ((PORTD & LEDS_PORTD_LEDS) >> LEDS_PORTD_MASK_SHIFT));
+			}
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/UNO/Board.h b/lib/lufa/LUFA/Drivers/Board/AVR8/UNO/Board.h
new file mode 100644
index 0000000000..9277a3824c
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/UNO/Board.h
@@ -0,0 +1,84 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific information header for the Arduino Uno.
+ *  \copydetails Group_BoardInfo_UNO
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the Board driver
+ *        dispatch header located in LUFA/Drivers/Board/Board.h.
+ */
+
+/** \ingroup Group_BoardInfo
+ *  \defgroup Group_BoardInfo_UNO UNO
+ *  \brief Board specific information header for the Arduino Uno.
+ *
+ *  Board specific information header for the Arduino Uno (http://arduino.cc/en/Main/ArduinoBoardUno).
+ *
+ *  @{
+ */
+
+#ifndef __BOARD_UNO_H__
+#define __BOARD_UNO_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+		#include "../../LEDs.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_BOARD_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Indicates the board has hardware LEDs mounted. */
+			#define BOARD_HAS_LEDS
+
+			/** Pin that can reset the main MCU. */
+			#define AVR_RESET_LINE_PORT  PORTD
+			#define AVR_RESET_LINE_DDR   DDRD
+			#define AVR_RESET_LINE_PIN   PIND
+			#define AVR_RESET_LINE_MASK  (1 << PD7)
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/UNO/LEDs.h b/lib/lufa/LUFA/Drivers/Board/AVR8/UNO/LEDs.h
new file mode 100644
index 0000000000..17526f3c56
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/UNO/LEDs.h
@@ -0,0 +1,145 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific LED driver header for the Arduino Uno.
+ *  \copydetails Group_LEDs_UNO
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the LEDs driver
+ *        dispatch header located in LUFA/Drivers/Board/LEDs.h.
+ */
+
+/** \ingroup Group_LEDs
+ *  \defgroup Group_LEDs_UNO UNO
+ *  \brief Board specific LED driver header for the Arduino Uno.
+ *
+ *  Board specific LED driver header for the Arduino Uno (http://arduino.cc/en/Main/ArduinoBoardUno).
+ *
+ *  <table>
+ *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr>
+ *    <tr><td>LEDS_LED1</td><td>Yellow</td><td>RX</td><td>Low</td><td>PORTD.5</td></tr>
+ *    <tr><td>LEDS_LED2</td><td>Yellow</td><td>TX</td><td>Low</td><td>PORTD.4</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __LEDS_UNO_H__
+#define __LEDS_UNO_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_LEDS_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/LEDS.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** LED mask for the first LED on the board. */
+			#define LEDS_LED1        (1 << 5)
+
+			/** LED mask for the second LED on the board. */
+			#define LEDS_LED2        (1 << 4)
+
+			/** LED mask for all the LEDs on the board. */
+			#define LEDS_ALL_LEDS    (LEDS_LED1 | LEDS_LED2)
+
+			/** LED mask for none of the board LEDs. */
+			#define LEDS_NO_LEDS     0
+
+			/** LED mask for the library LED driver, to indicate TX activity. */
+			#define LEDMASK_TX       LEDS_LED1
+
+			/** LED mask for the library LED driver, to indicate RX activity. */
+			#define LEDMASK_RX       LEDS_LED2
+
+		/* Inline Functions: */
+		#if !defined(__DOXYGEN__)
+			static inline void LEDs_Init(void)
+			{
+				DDRD  |= LEDS_ALL_LEDS;
+				PORTD |= LEDS_ALL_LEDS;
+			}
+
+			static inline void LEDs_Disable(void)
+			{
+				DDRD  &= ~LEDS_ALL_LEDS;
+				PORTD |= LEDS_ALL_LEDS;
+			}
+
+			static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask)
+			{
+				PORTD &= ~LEDMask;
+			}
+
+			static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask)
+			{
+				PORTD |= LEDMask;
+			}
+
+			static inline void LEDs_SetAllLEDs(const uint8_t LEDMask)
+			{
+				PORTD = ((PORTD | LEDS_ALL_LEDS) & ~LEDMask);
+			}
+
+			static inline void LEDs_ChangeLEDs(const uint8_t LEDMask,
+			                                   const uint8_t ActiveMask)
+			{
+				PORTD = ((PORTD | LEDMask) & ~ActiveMask);
+			}
+
+			static inline void LEDs_ToggleLEDs(const uint8_t LEDMask)
+			{
+				PIND  = LEDMask;
+			}
+
+			static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t LEDs_GetLEDs(void)
+			{
+				return (~PORTD & LEDS_ALL_LEDS);
+			}
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/USB2AX/Board.h b/lib/lufa/LUFA/Drivers/Board/AVR8/USB2AX/Board.h
new file mode 100644
index 0000000000..c6fcd43ff5
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/USB2AX/Board.h
@@ -0,0 +1,105 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific LED driver header for the Xevelabs USB2AX.
+ *  \copydetails Group_BoardInfo_USB2AX
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the Board driver
+ *        dispatch header located in LUFA/Drivers/Board/Board.h.
+ */
+
+/** \ingroup Group_BoardInfo
+ *  \defgroup Group_BoardInfo_USB2AX_V31 USB2AX_V31
+ *  \brief Board specific information header for the Xevelabs USB2AX revision 3.1.
+ *
+ *  See \ref Group_BoardInfo_USB2AX for more details.
+ */
+
+/** \ingroup Group_BoardInfo
+ *  \defgroup Group_BoardInfo_USB2AX_V3 USB2AX_V3
+ *  \brief Board specific information header for the Xevelabs USB2AX revision 3.
+ *
+ *  See \ref Group_BoardInfo_USB2AX for more details.
+ */
+
+/** \ingroup Group_BoardInfo
+ *  \defgroup Group_BoardInfo_USB2AX USB2AX
+ *  \brief Board specific information header for the Xevelabs USB2AX.
+ *
+ *  Board specific information header for the Xevelabs USB2AX (http://paranoidstudio.assembla.com/wiki/show/paranoidstudio/USB2AX).
+ *
+ *  @{
+ */
+
+#ifndef __BOARD_USB2AX_H__
+#define __BOARD_USB2AX_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+		#include "../../Buttons.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_BOARD_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			#if (BOARD == BOARD_USB2AX) || (BOARD == BOARD_USB2AX_V3) || \
+			    defined(__DOXYGEN__)
+				#include "../../Buttons.h"
+
+				/** Indicates the board has hardware Buttons mounted. */
+				#define BOARD_HAS_BUTTONS
+			#endif
+
+			#if ((BOARD == BOARD_USB2AX) || (BOARD == BOARD_USB2AX_V3) || \
+			     (BOARD == BOARD_USB2AX_V31) || defined(__DOXYGEN__))
+				#include "../../LEDs.h"
+
+				/** Indicates the board has hardware LEDs mounted. */
+				#define BOARD_HAS_LEDS
+			#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/USB2AX/Buttons.h b/lib/lufa/LUFA/Drivers/Board/AVR8/USB2AX/Buttons.h
new file mode 100644
index 0000000000..df6ef64ba3
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/USB2AX/Buttons.h
@@ -0,0 +1,120 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific Buttons driver header for the Xevelabs USB2AX.
+ *  \copydetails Group_Buttons_USB2AX
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the Buttons driver
+ *        dispatch header located in LUFA/Drivers/Board/Buttons.h.
+ */
+
+/** \ingroup Group_Buttons
+ *  \defgroup Group_Buttons_USB2AX_V31 USB2AX_V31
+ *  \brief Board specific Button driver header for the Xevelabs USB2AX revision 3.1.
+ *
+ *  See \ref Group_Buttons_USB2AX for more details.
+ */
+
+/** \ingroup Group_Buttons
+ *  \defgroup Group_Buttons_USB2AX_V3 USB2AX_V3
+ *  \brief Board specific Button driver header for the Xevelabs USB2AX revision 3.
+ *
+ *  See \ref Group_Buttons_USB2AX for more details.
+ */
+
+/** \ingroup Group_Buttons
+ *  \defgroup Group_Buttons_USB2AX USB2AX
+ *  \brief Board specific Buttons driver header for the Xevelabs USB2AX revisions 1 and 2.
+ *
+ *  \note For version 3 USB2AX boards, compile with <code>BOARD = USB2AX_V3</code> and for version 3.1, with <code>BOARD = USB2AX_V31</code>.
+ *
+ *  Board specific Buttons driver header for the Paranoid Studio USB2AX (http://paranoidstudio.assembla.com/wiki/show/paranoidstudio/USB2AX).
+ *
+ *  <table>
+ *    <tr><th>Name</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr>
+ *    <tr><td>BUTTONS_BUTTON1</td><td>HWB Button</td><td>Low</td><td>PORTD.7</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __BUTTONS_USB2AX_H__
+#define __BUTTONS_USB2AX_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_BUTTONS_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Buttons.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Button mask for the first button on the board. */
+			#define BUTTONS_BUTTON1      (1 << 7)
+
+		/* Inline Functions: */
+		#if !defined(__DOXYGEN__)
+			static inline void Buttons_Init(void)
+			{
+				DDRD  &= ~BUTTONS_BUTTON1;
+				PORTD |=  BUTTONS_BUTTON1;
+			}
+
+			static inline void Buttons_Disable(void)
+			{
+				DDRD  &= ~BUTTONS_BUTTON1;
+				PORTD &= ~BUTTONS_BUTTON1;
+			}
+
+			static inline uint8_t Buttons_GetStatus(void) ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t Buttons_GetStatus(void)
+			{
+				return ((PIND & BUTTONS_BUTTON1) ^ BUTTONS_BUTTON1);
+			}
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/USB2AX/LEDs.h b/lib/lufa/LUFA/Drivers/Board/AVR8/USB2AX/LEDs.h
new file mode 100644
index 0000000000..b4ed1ca09c
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/USB2AX/LEDs.h
@@ -0,0 +1,218 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific LED driver header for the Xevelabs USB2AX.
+ *  \copydetails Group_LEDs_USB2AX
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the LEDs driver
+ *        dispatch header located in LUFA/Drivers/Board/LEDs.h.
+ */
+
+/** \ingroup Group_LEDs
+ *  \defgroup Group_LEDs_USB2AX_V31 USB2AX_V31
+ *  \brief Board specific LED driver header for the Xevelabs USB2AX revision 3.1.
+ *
+ *  See \ref Group_LEDs_USB2AX for more details.
+ */
+
+/** \ingroup Group_LEDs
+ *  \defgroup Group_LEDs_USB2AX_V3 USB2AX_V3
+ *  \brief Board specific LED driver header for the Xevelabs USB2AX revision 3.
+ *
+ *  See \ref Group_LEDs_USB2AX for more details.
+ */
+
+/** \ingroup Group_LEDs
+ *  \defgroup Group_LEDs_USB2AX USB2AX
+ *  \brief Board specific LED driver header for the Xevelabs USB2AX revisions 1 and 2.
+ *
+ *  \note For version 3 USB2AX boards, compile with <code>BOARD = USB2AX_V3</code> and for version 3.1, with <code>BOARD = USB2AX_V31</code>.
+ *
+ *  Board specific LED driver header for the Xevelabs USB2AX (http://paranoidstudio.assembla.com/wiki/show/paranoidstudio/USB2AX).
+ *
+ *  <b>USB2AX</b>:
+ *  <table>
+ *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr>
+ *    <tr><td>LEDS_LED1</td><td>Green</td><td>General Indicator</td><td>High</td><td>PORTC.6</td></tr>
+ *  </table>
+ *
+ *  <b>USB2AX_V3</b>:
+ *  <table>
+ *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr>
+ *    <tr><td>LEDS_LED1</td><td>Green</td><td>General Indicator</td><td>High</td><td>PORTD.1</td></tr>
+ *  </table>
+ *
+ *  <b>USB2AX_V31</b>:
+ *  <table>
+ *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr>
+ *    <tr><td>LEDS_LED1</td><td>Green</td><td>General Indicator</td><td>High</td><td>PORTD.5</td></tr>
+ *    <tr><td>LEDS_LED2</td><td>Red</td><td>General Indicator</td><td>High</td><td>PORTD.6</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __LEDS_USB2AX_H__
+#define __LEDS_USB2AX_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_LEDS_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/LEDS.h instead.
+		#endif
+
+	/* Private Interface - For use in library only: */
+	#if !defined(__DOXYGEN__)
+		/* Macros: */
+			#if (BOARD == BOARD_USB2AX_V31)
+                #define USB2AX_LEDS_LED1   (1 << 5)
+                #define USB2AX_LEDS_LED2   (1 << 6)
+            #elif (BOARD == BOARD_USB2AX_V3)
+				#define USB2AX_LEDS_LED1   (1 << 1)
+                #define USB2AX_LEDS_LED2   0
+			#else
+				#define USB2AX_LEDS_LED1   (1 << 6)
+                #define USB2AX_LEDS_LED2   0
+			#endif
+	#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** LED mask for the first LED on the board. */
+			#define LEDS_LED1        USB2AX_LEDS_LED1
+
+			/** LED mask for the second LED on the board. */
+			#define LEDS_LED2        USB2AX_LEDS_LED2
+
+			/** LED mask for all the LEDs on the board. */
+			#define LEDS_ALL_LEDS    (LEDS_LED1 | LEDS_LED2)
+
+			/** LED mask for none of the board LEDs. */
+			#define LEDS_NO_LEDS     0
+
+		/* Inline Functions: */
+		#if !defined(__DOXYGEN__)
+			static inline void LEDs_Init(void)
+			{
+				#if (BOARD == BOARD_USB2AX)
+				DDRC  |=  LEDS_ALL_LEDS;
+				PORTC &= ~LEDS_ALL_LEDS;
+				#else
+				DDRD  |=  LEDS_ALL_LEDS;
+				PORTD &= ~LEDS_ALL_LEDS;
+				#endif
+			}
+
+			static inline void LEDs_Disable(void)
+			{
+				#if (BOARD == BOARD_USB2AX)
+				DDRC  &= ~LEDS_ALL_LEDS;
+				PORTC &= ~LEDS_ALL_LEDS;
+				#else
+				DDRD  &= ~LEDS_ALL_LEDS;
+				PORTD &= ~LEDS_ALL_LEDS;
+				#endif
+			}
+
+			static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask)
+			{
+				#if (BOARD == BOARD_USB2AX)
+				PORTC |= LEDMask;
+				#else
+				PORTD |= LEDMask;
+				#endif
+			}
+
+			static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask)
+			{
+				#if (BOARD == BOARD_USB2AX)
+				PORTC &= ~LEDMask;
+				#else
+				PORTD &= ~LEDMask;
+				#endif
+			}
+
+			static inline void LEDs_SetAllLEDs(const uint8_t LEDMask)
+			{
+				#if (BOARD == BOARD_USB2AX)
+				PORTC = ((PORTC & ~LEDS_ALL_LEDS) | LEDMask);
+				#else
+				PORTD = ((PORTD & ~LEDS_ALL_LEDS) | LEDMask);
+				#endif
+			}
+
+			static inline void LEDs_ChangeLEDs(const uint8_t LEDMask,
+			                                   const uint8_t ActiveMask)
+			{
+				#if (BOARD == BOARD_USB2AX)
+				PORTC = ((PORTC & ~LEDMask) | ActiveMask);
+				#else
+				PORTD = ((PORTD & ~LEDMask) | ActiveMask);
+				#endif
+			}
+
+			static inline void LEDs_ToggleLEDs(const uint8_t LEDMask)
+			{
+				#if (BOARD == BOARD_USB2AX)
+				PINC  = LEDMask;
+				#else
+				PIND  = LEDMask;
+				#endif
+			}
+
+			static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t LEDs_GetLEDs(void)
+			{
+				#if (BOARD == BOARD_USB2AX)
+				return (PORTC & LEDS_ALL_LEDS);
+				#else
+				return (PORTD & LEDS_ALL_LEDS);
+				#endif
+			}
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/USBFOO/Board.h b/lib/lufa/LUFA/Drivers/Board/AVR8/USBFOO/Board.h
new file mode 100644
index 0000000000..fa01b5bab0
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/USBFOO/Board.h
@@ -0,0 +1,82 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific information header for the Kernel Concepts USBFOO.
+ *  \copydetails Group_BoardInfo_USBFOO
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the Board driver
+ *        dispatch header located in LUFA/Drivers/Board/Board.h.
+ */
+
+/** \ingroup Group_BoardInfo
+ *  \defgroup Group_BoardInfo_USBFOO USBFOO
+ *  \brief Board specific information header for the Kernel Concepts USBFOO.
+ *
+ *  Board specific information header for the Kernel Concepts USBFOO (http://shop.kernelconcepts.de/product_info.php?products_id=102).
+ *
+ *  @{
+ */
+
+#ifndef __BOARD_USBFOO_H__
+#define __BOARD_USBFOO_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+		#include "../../Buttons.h"
+		#include "../../LEDs.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_BOARD_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Indicates the board has hardware Buttons mounted. */
+			#define BOARD_HAS_BUTTONS
+
+			/** Indicates the board has hardware LEDs mounted. */
+			#define BOARD_HAS_LEDS
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/USBFOO/Buttons.h b/lib/lufa/LUFA/Drivers/Board/AVR8/USBFOO/Buttons.h
new file mode 100644
index 0000000000..9c2476cc29
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/USBFOO/Buttons.h
@@ -0,0 +1,103 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific Buttons driver header for the Kernel Concepts USBFOO.
+ *  \copydetails Group_Buttons_USBFOO
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the Buttons driver
+ *        dispatch header located in LUFA/Drivers/Board/Buttons.h.
+ */
+
+/** \ingroup Group_Buttons
+ *  \defgroup Group_Buttons_USBFOO USBFOO
+ *  \brief Board specific Buttons driver header for the Kernel Concepts USBFOO.
+ *
+ *  Board specific Buttons driver header for the Kernel Concepts USBFOO (http://shop.kernelconcepts.de/product_info.php?products_id=102).
+ *
+ *  <table>
+ *    <tr><th>Name</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr>
+ *    <tr><td>BUTTONS_BUTTON1</td><td>HWB Button</td><td>Low</td><td>PORTD.7</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __BUTTONS_USBFOO_H__
+#define __BUTTONS_USBFOO_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_BUTTONS_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Buttons.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Button mask for the first button on the board. */
+			#define BUTTONS_BUTTON1      (1 << 7)
+
+		/* Inline Functions: */
+		#if !defined(__DOXYGEN__)
+			static inline void Buttons_Init(void)
+			{
+				DDRD  &= ~BUTTONS_BUTTON1;
+				PORTD |=  BUTTONS_BUTTON1;
+			}
+
+			static inline void Buttons_Disable(void)
+			{
+				DDRD  &= ~BUTTONS_BUTTON1;
+				PORTD &= ~BUTTONS_BUTTON1;
+			}
+
+			static inline uint8_t Buttons_GetStatus(void) ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t Buttons_GetStatus(void)
+			{
+				return ((PIND & BUTTONS_BUTTON1) ^ BUTTONS_BUTTON1);
+			}
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/USBFOO/LEDs.h b/lib/lufa/LUFA/Drivers/Board/AVR8/USBFOO/LEDs.h
new file mode 100644
index 0000000000..9c5b8bc353
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/USBFOO/LEDs.h
@@ -0,0 +1,135 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific LED driver header for the Kernel Concepts USBFOO.
+ *  \copydetails Group_LEDs_USBFOO
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the LEDs driver
+ *        dispatch header located in LUFA/Drivers/Board/LEDs.h.
+ */
+
+/** \ingroup Group_LEDs
+ *  \defgroup Group_LEDs_USBFOO USBFOO
+ *  \brief Board specific LED driver header for the Kernel Concepts USBFOO.
+ *
+ *  Board specific LED driver header for the Kernel Concepts USBFOO (http://shop.kernelconcepts.de/product_info.php?products_id=102).
+ *
+ *  <table>
+ *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr>
+ *    <tr><td>LEDS_LED1</td><td>Green</td><td>General Indicator</td><td>Low</td><td>PORTD.4</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __LEDS_USBFOO_H__
+#define __LEDS_USBFOO_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_LEDS_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/LEDS.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** LED mask for the first LED on the board. */
+			#define LEDS_LED1        (1 << 4)
+
+			/** LED mask for all the LEDs on the board. */
+			#define LEDS_ALL_LEDS    LEDS_LED1
+
+			/** LED mask for none of the board LEDs. */
+			#define LEDS_NO_LEDS     0
+
+		/* Inline Functions: */
+		#if !defined(__DOXYGEN__)
+			static inline void LEDs_Init(void)
+			{
+				DDRD  |= LEDS_ALL_LEDS;
+				PORTD |= LEDS_ALL_LEDS;
+			}
+
+			static inline void LEDs_Disable(void)
+			{
+				DDRD  &= ~LEDS_ALL_LEDS;
+				PORTD &= ~LEDS_ALL_LEDS;
+			}
+
+			static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask)
+			{
+				PORTD &= ~LEDMask;
+			}
+
+			static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask)
+			{
+				PORTD |= LEDMask;
+			}
+
+			static inline void LEDs_SetAllLEDs(const uint8_t LEDMask)
+			{
+				PORTD = ((PORTD | LEDS_ALL_LEDS) & ~LEDMask);
+			}
+
+			static inline void LEDs_ChangeLEDs(const uint8_t LEDMask,
+			                                   const uint8_t ActiveMask)
+			{
+				PORTD = ((PORTD | LEDMask) & ~ActiveMask);
+			}
+
+			static inline void LEDs_ToggleLEDs(const uint8_t LEDMask)
+			{
+				PIND  = LEDMask;
+			}
+
+			static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t LEDs_GetLEDs(void)
+			{
+				return (~PORTD & LEDS_ALL_LEDS);
+			}
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/USBKEY/Board.h b/lib/lufa/LUFA/Drivers/Board/AVR8/USBKEY/Board.h
new file mode 100644
index 0000000000..920681d036
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/USBKEY/Board.h
@@ -0,0 +1,90 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific information header for the Atmel USBKEY.
+ *  \copydetails Group_BoardInfo_USBKEY
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the Board driver
+ *        dispatch header located in LUFA/Drivers/Board/Board.h.
+ */
+
+/** \ingroup Group_BoardInfo
+ *  \defgroup Group_BoardInfo_USBKEY USBKEY
+ *  \brief Board specific information header for the Atmel USBKEY.
+ *
+ *  Board specific information header for the Atmel USBKEY.
+ *
+ *  @{
+ */
+
+#ifndef __BOARD_USBKEY_H__
+#define __BOARD_USBKEY_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+		#include "../../Buttons.h"
+		#include "../../Dataflash.h"
+		#include "../../Joystick.h"
+		#include "../../LEDs.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_BOARD_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Indicates the board has hardware Buttons mounted. */
+			#define BOARD_HAS_BUTTONS
+
+			/** Indicates the board has a hardware Dataflash mounted. */
+			#define BOARD_HAS_DATAFLASH
+
+			/** Indicates the board has a hardware Joystick mounted. */
+			#define BOARD_HAS_JOYSTICK
+
+			/** Indicates the board has hardware LEDs mounted. */
+			#define BOARD_HAS_LEDS
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/USBKEY/Buttons.h b/lib/lufa/LUFA/Drivers/Board/AVR8/USBKEY/Buttons.h
new file mode 100644
index 0000000000..068fd0b723
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/USBKEY/Buttons.h
@@ -0,0 +1,103 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific Buttons driver header for the Atmel USBKEY.
+ *  \copydetails Group_Buttons_USBKEY
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the Buttons driver
+ *        dispatch header located in LUFA/Drivers/Board/Buttons.h.
+ */
+
+/** \ingroup Group_Buttons
+ *  \defgroup Group_Buttons_USBKEY USBKEY
+ *  \brief Board specific Buttons driver header for the Atmel USBKEY.
+ *
+ *  Board specific Buttons driver header for the Atmel USBKEY.
+ *
+ *  <table>
+ *    <tr><th>Name</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr>
+ *    <tr><td>BUTTONS_BUTTON1</td><td>HWB Button</td><td>Low</td><td>PORTE.2</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __BUTTONS_USBKEY_H__
+#define __BUTTONS_USBKEY_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_BUTTONS_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Buttons.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Button mask for the first button on the board. */
+			#define BUTTONS_BUTTON1      (1 << 2)
+
+		/* Inline Functions: */
+		#if !defined(__DOXYGEN__)
+			static inline void Buttons_Init(void)
+			{
+				DDRE  &= ~BUTTONS_BUTTON1;
+				PORTE |=  BUTTONS_BUTTON1;
+			}
+
+			static inline void Buttons_Disable(void)
+			{
+				DDRE  &= ~BUTTONS_BUTTON1;
+				PORTE &= ~BUTTONS_BUTTON1;
+			}
+
+			static inline uint8_t Buttons_GetStatus(void) ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t Buttons_GetStatus(void)
+			{
+				return ((PINE & BUTTONS_BUTTON1) ^ BUTTONS_BUTTON1);
+			}
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/USBKEY/Dataflash.h b/lib/lufa/LUFA/Drivers/Board/AVR8/USBKEY/Dataflash.h
new file mode 100644
index 0000000000..77be220118
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/USBKEY/Dataflash.h
@@ -0,0 +1,237 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific Dataflash driver header for the Atmel USBKEY.
+ *  \copydetails Group_Dataflash_USBKEY
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the dataflash driver
+ *        dispatch header located in LUFA/Drivers/Board/Dataflash.h.
+ */
+
+/** \ingroup Group_Dataflash
+ *  \defgroup Group_Dataflash_USBKEY USBKEY
+ *  \brief Board specific Dataflash driver header for the Atmel USBKEY.
+ *
+ *  Board specific Dataflash driver header for the Atmel USBKEY board.
+ *
+ *  <table>
+ *    <tr><th>Name</th><th>Info</th><th>Select Pin</th><th>SPI Port</th></tr>
+ *    <tr><td>DATAFLASH_CHIP1</td><td>AT45DB642D (8MB)</td><td>PORTE.0</td><td>SPI0</td></tr>
+ *    <tr><td>DATAFLASH_CHIP2</td><td>AT45DB642D (8MB)</td><td>PORTE.1</td><td>SPI0</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __DATAFLASH_USBKEY_H__
+#define __DATAFLASH_USBKEY_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+		#include "../../../Misc/AT45DB642D.h"
+		#include "../../../Peripheral/SPI.h"
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_DATAFLASH_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Dataflash.h instead.
+		#endif
+
+	/* Private Interface - For use in library only: */
+	#if !defined(__DOXYGEN__)
+		/* Macros: */
+			#define DATAFLASH_CHIPCS_MASK                (DATAFLASH_CHIP1 | DATAFLASH_CHIP2)
+			#define DATAFLASH_CHIPCS_DDR                 DDRE
+			#define DATAFLASH_CHIPCS_PORT                PORTE
+	#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Constant indicating the total number of dataflash ICs mounted on the selected board. */
+			#define DATAFLASH_TOTALCHIPS                 2
+
+			/** Mask for no dataflash chip selected. */
+			#define DATAFLASH_NO_CHIP                    0
+
+			/** Mask for the first dataflash chip selected. */
+			#define DATAFLASH_CHIP1                      (1 << 0)
+
+			/** Mask for the second dataflash chip selected. */
+			#define DATAFLASH_CHIP2                      (1 << 1)
+
+			/** Internal main memory page size for the board's dataflash ICs. */
+			#define DATAFLASH_PAGE_SIZE                  1024
+
+			/** Total number of pages inside each of the board's dataflash ICs. */
+			#define DATAFLASH_PAGES                      8192
+
+		/* Inline Functions: */
+			/** Initializes the dataflash driver so that commands and data may be sent to an attached dataflash IC.
+			 *  The appropriate SPI interface will be automatically configured.
+			 */
+			static inline void Dataflash_Init(void)
+			{
+				DATAFLASH_CHIPCS_DDR  |= DATAFLASH_CHIPCS_MASK;
+				DATAFLASH_CHIPCS_PORT |= DATAFLASH_CHIPCS_MASK;
+
+				SPI_Init(SPI_SPEED_FCPU_DIV_2 | SPI_ORDER_MSB_FIRST | SPI_SCK_LEAD_FALLING | SPI_SAMPLE_TRAILING | SPI_MODE_MASTER);
+			}
+
+			/** Sends a byte to the currently selected dataflash IC, and returns a byte from the dataflash.
+			 *
+			 *  \param[in] Byte  Byte of data to send to the dataflash
+			 *
+			 *  \return Last response byte from the dataflash
+			 */
+			static inline uint8_t Dataflash_TransferByte(const uint8_t Byte) ATTR_ALWAYS_INLINE;
+			static inline uint8_t Dataflash_TransferByte(const uint8_t Byte)
+			{
+				return SPI_TransferByte(Byte);
+			}
+
+			/** Sends a byte to the currently selected dataflash IC, and ignores the next byte from the dataflash.
+			 *
+			 *  \param[in] Byte  Byte of data to send to the dataflash
+			 */
+			static inline void Dataflash_SendByte(const uint8_t Byte) ATTR_ALWAYS_INLINE;
+			static inline void Dataflash_SendByte(const uint8_t Byte)
+			{
+				SPI_SendByte(Byte);
+			}
+
+			/** Sends a dummy byte to the currently selected dataflash IC, and returns the next byte from the dataflash.
+			 *
+			 *  \return Last response byte from the dataflash
+			 */
+			static inline uint8_t Dataflash_ReceiveByte(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t Dataflash_ReceiveByte(void)
+			{
+				return SPI_ReceiveByte();
+			}
+
+			/** Determines the currently selected dataflash chip.
+			 *
+			 *  \return Mask of the currently selected Dataflash chip, either \ref DATAFLASH_NO_CHIP if no chip is selected
+			 *          or a DATAFLASH_CHIPn mask (where n is the chip number).
+			 */
+			static inline uint8_t Dataflash_GetSelectedChip(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t Dataflash_GetSelectedChip(void)
+			{
+				return (~DATAFLASH_CHIPCS_PORT & DATAFLASH_CHIPCS_MASK);
+			}
+
+			/** Selects the given dataflash chip.
+			 *
+			 *  \param[in]  ChipMask  Mask of the Dataflash IC to select, in the form of a \c DATAFLASH_CHIPn mask (where n is
+			 *              the chip number).
+			 */
+			static inline void Dataflash_SelectChip(const uint8_t ChipMask) ATTR_ALWAYS_INLINE;
+			static inline void Dataflash_SelectChip(const uint8_t ChipMask)
+			{
+				DATAFLASH_CHIPCS_PORT = ((DATAFLASH_CHIPCS_PORT | DATAFLASH_CHIPCS_MASK) & ~ChipMask);
+			}
+
+			/** Deselects the current dataflash chip, so that no dataflash is selected. */
+			static inline void Dataflash_DeselectChip(void) ATTR_ALWAYS_INLINE;
+			static inline void Dataflash_DeselectChip(void)
+			{
+				Dataflash_SelectChip(DATAFLASH_NO_CHIP);
+			}
+
+			/** Selects a dataflash IC from the given page number, which should range from 0 to
+			 *  ((DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS) - 1). For boards containing only one
+			 *  dataflash IC, this will select DATAFLASH_CHIP1. If the given page number is outside
+			 *  the total number of pages contained in the boards dataflash ICs, all dataflash ICs
+			 *  are deselected.
+			 *
+			 *  \param[in] PageAddress  Address of the page to manipulate, ranging from
+			 *                          0 to ((DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS) - 1).
+			 */
+			static inline void Dataflash_SelectChipFromPage(const uint16_t PageAddress)
+			{
+				Dataflash_DeselectChip();
+
+				if (PageAddress >= (DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS))
+				  return;
+
+				#if (DATAFLASH_TOTALCHIPS == 2)
+					if (PageAddress & 0x01)
+					  Dataflash_SelectChip(DATAFLASH_CHIP2);
+					else
+					  Dataflash_SelectChip(DATAFLASH_CHIP1);
+				#else
+					Dataflash_SelectChip(DATAFLASH_CHIP1);
+				#endif
+			}
+
+			/** Toggles the select line of the currently selected dataflash IC, so that it is ready to receive
+			 *  a new command.
+			 */
+			static inline void Dataflash_ToggleSelectedChipCS(void)
+			{
+				uint8_t SelectedChipMask = Dataflash_GetSelectedChip();
+
+				Dataflash_DeselectChip();
+				Dataflash_SelectChip(SelectedChipMask);
+			}
+
+			/** Spin-loops while the currently selected dataflash is busy executing a command, such as a main
+			 *  memory page program or main memory to buffer transfer.
+			 */
+			static inline void Dataflash_WaitWhileBusy(void)
+			{
+				Dataflash_ToggleSelectedChipCS();
+				Dataflash_SendByte(DF_CMD_GETSTATUS);
+				while (!(Dataflash_ReceiveByte() & DF_STATUS_READY));
+				Dataflash_ToggleSelectedChipCS();
+			}
+
+			/** Sends a set of page and buffer address bytes to the currently selected dataflash IC, for use with
+			 *  dataflash commands which require a complete 24-bit address.
+			 *
+			 *  \param[in] PageAddress  Page address within the selected dataflash IC
+			 *  \param[in] BufferByte   Address within the dataflash's buffer
+			 */
+			static inline void Dataflash_SendAddressBytes(uint16_t PageAddress,
+			                                              const uint16_t BufferByte)
+			{
+				#if (DATAFLASH_TOTALCHIPS == 2)
+					PageAddress >>= 1;
+				#endif
+
+				Dataflash_SendByte(PageAddress >> 5);
+				Dataflash_SendByte((PageAddress << 3) | (BufferByte >> 8));
+				Dataflash_SendByte(BufferByte);
+			}
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/USBKEY/Joystick.h b/lib/lufa/LUFA/Drivers/Board/AVR8/USBKEY/Joystick.h
new file mode 100644
index 0000000000..7410364445
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/USBKEY/Joystick.h
@@ -0,0 +1,130 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific joystick driver header for the Atmel USBKEY.
+ *  \copydetails Group_Joystick_USBKEY
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the joystick driver
+ *        dispatch header located in LUFA/Drivers/Board/Joystick.h.
+ */
+
+/** \ingroup Group_Joystick
+ *  \defgroup Group_Joystick_USBKEY USBKEY
+ *  \brief Board specific joystick driver header for the Atmel USBKEY.
+ *
+ *  Board specific joystick driver header for the Atmel USBKEY.
+ *
+ *  <table>
+ *    <tr><th>Left Port Pin</th><th>Up Port Pin</th><th>Right Port Pin</th><th>Down Port Pin</th><th>Press Port Pin</th></tr>
+ *    <tr><td>PORTB.6</td><td>PORTB.7</td><td>PORTE.4</td><td>PORTE.5</td><td>PORTB.5</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __JOYSTICK_USBKEY_H__
+#define __JOYSTICK_USBKEY_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_JOYSTICK_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Joystick.h instead.
+		#endif
+
+	/* Private Interface - For use in library only: */
+	#if !defined(__DOXYGEN__)
+		/* Macros: */
+			#define JOY_BMASK                 ((1 << 5) | (1 << 6) | (1 << 7))
+			#define JOY_EMASK                 ((1 << 4) | (1 << 5))
+
+			#define JOY_PORTE_MASK_SHIFT      1
+	#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Mask for the joystick being pushed in the left direction. */
+			#define JOY_LEFT                  (1 << 6)
+
+			/** Mask for the joystick being pushed in the right direction. */
+			#define JOY_RIGHT                ((1 << 4) >> JOY_PORTE_MASK_SHIFT)
+
+			/** Mask for the joystick being pushed in the upward direction. */
+			#define JOY_UP                    (1 << 7)
+
+			/** Mask for the joystick being pushed in the downward direction. */
+			#define JOY_DOWN                 ((1 << 5) >> JOY_PORTE_MASK_SHIFT)
+
+			/** Mask for the joystick being pushed inward. */
+			#define JOY_PRESS                 (1 << 5)
+
+		/* Inline Functions: */
+		#if !defined(__DOXYGEN__)
+			static inline void Joystick_Init(void)
+			{
+				DDRB  &= ~JOY_BMASK;
+				DDRE  &= ~JOY_EMASK;
+
+				PORTB |=  JOY_BMASK;
+				PORTE |=  JOY_EMASK;
+			}
+
+			static inline void Joystick_Disable(void)
+			{
+				DDRB  &= ~JOY_BMASK;
+				DDRE  &= ~JOY_EMASK;
+
+				PORTB &= ~JOY_BMASK;
+				PORTE &= ~JOY_EMASK;
+			}
+
+			static inline uint8_t Joystick_GetStatus(void) ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t Joystick_GetStatus(void)
+			{
+				return (((uint8_t)~PINB & JOY_BMASK) | (((uint8_t)~PINE & JOY_EMASK) >> JOY_PORTE_MASK_SHIFT));
+			}
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/USBKEY/LEDs.h b/lib/lufa/LUFA/Drivers/Board/AVR8/USBKEY/LEDs.h
new file mode 100644
index 0000000000..18ff756c8a
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/USBKEY/LEDs.h
@@ -0,0 +1,147 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific LED driver header for the Atmel USBKEY.
+ *  \copydetails Group_LEDs_USBKEY
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the LEDs driver
+ *        dispatch header located in LUFA/Drivers/Board/LEDs.h.
+ */
+
+/** \ingroup Group_LEDs
+ *  \defgroup Group_LEDs_USBKEY USBKEY
+ *  \brief Board specific LED driver header for the Atmel USBKEY.
+ *
+ *  Board specific LED driver header for the Atmel USBKEY.
+ *
+ *  <table>
+ *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr>
+ *    <tr><td>LEDS_LED1</td><td>Red</td><td>Bicolor Indicator 1</td><td>High</td><td>PORTD.4</td></tr>
+ *    <tr><td>LEDS_LED2</td><td>Green</td><td>Bicolor Indicator 1</td><td>High</td><td>PORTD.5</td></tr>
+ *    <tr><td>LEDS_LED3</td><td>Red</td><td>Bicolor Indicator 2</td><td>High</td><td>PORTD.6</td></tr>
+ *    <tr><td>LEDS_LED4</td><td>Green</td><td>Bicolor Indicator 2</td><td>High</td><td>PORTD.7</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __LEDS_USBKEY_H__
+#define __LEDS_USBKEY_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_LEDS_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/LEDS.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** LED mask for the first LED on the board. */
+			#define LEDS_LED1        (1 << 4)
+
+			/** LED mask for the second LED on the board. */
+			#define LEDS_LED2        (1 << 5)
+
+			/** LED mask for the third LED on the board. */
+			#define LEDS_LED3        (1 << 7)
+
+			/** LED mask for the fourth LED on the board. */
+			#define LEDS_LED4        (1 << 6)
+
+			/** LED mask for all the LEDs on the board. */
+			#define LEDS_ALL_LEDS    (LEDS_LED1 | LEDS_LED2 | LEDS_LED3 | LEDS_LED4)
+
+			/** LED mask for none of the board LEDs. */
+			#define LEDS_NO_LEDS     0
+
+		/* Inline Functions: */
+		#if !defined(__DOXYGEN__)
+			static inline void LEDs_Init(void)
+			{
+				DDRD  |=  LEDS_ALL_LEDS;
+				PORTD &= ~LEDS_ALL_LEDS;
+			}
+
+			static inline void LEDs_Disable(void)
+			{
+				DDRD  &= ~LEDS_ALL_LEDS;
+				PORTD &= ~LEDS_ALL_LEDS;
+			}
+
+			static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask)
+			{
+				PORTD |= LEDMask;
+			}
+
+			static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask)
+			{
+				PORTD &= ~LEDMask;
+			}
+
+			static inline void LEDs_SetAllLEDs(const uint8_t LEDMask)
+			{
+				PORTD = ((PORTD & ~LEDS_ALL_LEDS) | LEDMask);
+			}
+
+			static inline void LEDs_ChangeLEDs(const uint8_t LEDMask,
+			                                   const uint8_t ActiveMask)
+			{
+				PORTD = ((PORTD & ~LEDMask) | ActiveMask);
+			}
+
+			static inline void LEDs_ToggleLEDs(const uint8_t LEDMask)
+			{
+				PIND  = LEDMask;
+			}
+
+			static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t LEDs_GetLEDs(void)
+			{
+				return (PORTD & LEDS_ALL_LEDS);
+			}
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/USBTINYMKII/Board.h b/lib/lufa/LUFA/Drivers/Board/AVR8/USBTINYMKII/Board.h
new file mode 100644
index 0000000000..5501bf6be7
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/USBTINYMKII/Board.h
@@ -0,0 +1,82 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific information header for Tom's USBTINY MKII.
+ *  \copydetails Group_BoardInfo_USBTINYMKII
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the Board driver
+ *        dispatch header located in LUFA/Drivers/Board/Board.h.
+ */
+
+/** \ingroup Group_BoardInfo
+ *  \defgroup Group_BoardInfo_USBTINYMKII USBTINYMKII
+ *  \brief Board specific information header for Tom's USBTINY MKII.
+ *
+ *  Board specific information header for Tom's USBTINY MKII (http://tom-itx.dyndns.org:81/~webpage/).
+ *
+ *  @{
+ */
+
+#ifndef __BOARD_USBTINYMKII_H__
+#define __BOARD_USBTINYMKII_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+		#include "../../Buttons.h"
+		#include "../../LEDs.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_BOARD_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Indicates the board has hardware Buttons mounted. */
+			#define BOARD_HAS_BUTTONS
+
+			/** Indicates the board has hardware LEDs mounted. */
+			#define BOARD_HAS_LEDS
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/USBTINYMKII/Buttons.h b/lib/lufa/LUFA/Drivers/Board/AVR8/USBTINYMKII/Buttons.h
new file mode 100644
index 0000000000..e87f611d5c
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/USBTINYMKII/Buttons.h
@@ -0,0 +1,103 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific Buttons driver header for Tom's USBTINY MKII.
+ *  \copydetails Group_Buttons_USBTINYMKII
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the Buttons driver
+ *        dispatch header located in LUFA/Drivers/Board/Buttons.h.
+ */
+
+/** \ingroup Group_Buttons
+ *  \defgroup Group_Buttons_USBTINYMKII USBTINYMKII
+ *  \brief Board specific Buttons driver header for Tom's USBTINY MKII.
+ *
+ *  Board specific Buttons driver header for Tom's USBTINY MKII (http://tom-itx.dyndns.org:81/~webpage/).
+ *
+ *  <table>
+ *    <tr><th>Name</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr>
+ *    <tr><td>BUTTONS_BUTTON1</td><td>HWB Button</td><td>Low</td><td>PORTD.7</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __BUTTONS_USBTINYMKII_H__
+#define __BUTTONS_USBTINYMKII_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_BUTTONS_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Buttons.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Button mask for the first button on the board. */
+			#define BUTTONS_BUTTON1      (1 << 7)
+
+		/* Inline Functions: */
+		#if !defined(__DOXYGEN__)
+			static inline void Buttons_Init(void)
+			{
+				DDRD  &= ~BUTTONS_BUTTON1;
+				PORTD |=  BUTTONS_BUTTON1;
+			}
+
+			static inline void Buttons_Disable(void)
+			{
+				DDRD  &= ~BUTTONS_BUTTON1;
+				PORTD &= ~BUTTONS_BUTTON1;
+			}
+
+			static inline uint8_t Buttons_GetStatus(void) ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t Buttons_GetStatus(void)
+			{
+				return ((PIND & BUTTONS_BUTTON1) ^ BUTTONS_BUTTON1);
+			}
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/USBTINYMKII/LEDs.h b/lib/lufa/LUFA/Drivers/Board/AVR8/USBTINYMKII/LEDs.h
new file mode 100644
index 0000000000..288f5505fa
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/USBTINYMKII/LEDs.h
@@ -0,0 +1,143 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific LED driver header for Tom's USBTINY MKII.
+ *  \copydetails Group_LEDs_USBTINYMKII
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the LEDs driver
+ *        dispatch header located in LUFA/Drivers/Board/LEDs.h.
+ */
+
+/** \ingroup Group_LEDs
+ *  \defgroup Group_LEDs_USBTINYMKII USBTINYMKII
+ *  \brief Board specific LED driver header for Tom's USBTINY MKII.
+ *
+ *  Board specific LED driver header for Tom's USBTINY MKII (http://tom-itx.dyndns.org:81/~webpage/).
+ *
+ *  <table>
+ *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr>
+ *    <tr><td>LEDS_LED1</td><td>Red</td><td>Bicolor Indicator 1</td><td>High</td><td>PORTB.6</td></tr>
+ *    <tr><td>LEDS_LED2</td><td>Green</td><td>Bicolor Indicator 1</td><td>High</td><td>PORTB.7</td></tr>
+ *    <tr><td>LEDS_LED3</td><td>Red</td><td>Target Power</td><td>High</td><td>PORTB.5</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __LEDS_USBTINYMKII_H__
+#define __LEDS_USBTINYMKII_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_LEDS_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/LEDS.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** LED mask for the first LED on the board. */
+			#define LEDS_LED1        (1 << 6)
+
+			/** LED mask for the second LED on the board. */
+			#define LEDS_LED2        (1 << 7)
+
+			/** LED mask for the third LED on the board. */
+			#define LEDS_LED3        (1 << 5)
+
+			/** LED mask for all the LEDs on the board. */
+			#define LEDS_ALL_LEDS    (LEDS_LED1 | LEDS_LED2 | LEDS_LED3)
+
+			/** LED mask for none of the board LEDs. */
+			#define LEDS_NO_LEDS     0
+
+		/* Inline Functions: */
+		#if !defined(__DOXYGEN__)
+			static inline void LEDs_Init(void)
+			{
+				DDRB  |=  LEDS_ALL_LEDS;
+				PORTB &= ~LEDS_ALL_LEDS;
+			}
+
+			static inline void LEDs_Disable(void)
+			{
+				DDRB  &= ~LEDS_ALL_LEDS;
+				PORTB &= ~LEDS_ALL_LEDS;
+			}
+
+			static inline void LEDs_TurnOnLEDs(const uint8_t LedMask)
+			{
+				PORTB |= LedMask;
+			}
+
+			static inline void LEDs_TurnOffLEDs(const uint8_t LedMask)
+			{
+				PORTB &= ~LedMask;
+			}
+
+			static inline void LEDs_SetAllLEDs(const uint8_t LedMask)
+			{
+				PORTB = ((PORTB & ~LEDS_ALL_LEDS) | LedMask);
+			}
+
+			static inline void LEDs_ChangeLEDs(const uint8_t LedMask,
+			                                   const uint8_t ActiveMask)
+			{
+				PORTB = ((PORTB & ~LedMask) | ActiveMask);
+			}
+
+			static inline void LEDs_ToggleLEDs(const uint8_t LEDMask)
+			{
+				PINB  = LEDMask;
+			}
+
+			static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t LEDs_GetLEDs(void)
+			{
+				return (PORTB & LEDS_ALL_LEDS);
+			}
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/XPLAIN/Board.h b/lib/lufa/LUFA/Drivers/Board/AVR8/XPLAIN/Board.h
new file mode 100644
index 0000000000..713e065697
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/XPLAIN/Board.h
@@ -0,0 +1,89 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific information header for the original Atmel XPLAIN.
+ *  \copydetails Group_BoardInfo_XPLAIN
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the Board driver
+ *        dispatch header located in LUFA/Drivers/Board/Board.h.
+ */
+
+/** \ingroup Group_BoardInfo
+ *  \defgroup Group_BoardInfo_XPLAIN_REV1 XPLAIN_REV1
+ *  \brief Board specific information header for the original Atmel XPLAIN, revision 1.
+ *
+ *  See \ref Group_BoardInfo_XPLAIN for more details.
+ */
+
+/** \ingroup Group_BoardInfo
+ *  \defgroup Group_BoardInfo_XPLAIN XPLAIN
+ *  \brief Board specific information header for the original Atmel XPLAIN.
+ *
+ *  Board specific information header for the original Atmel XPLAIN.
+ *
+ *  @{
+ */
+
+#ifndef __BOARD_XPLAIN_H__
+#define __BOARD_XPLAIN_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+		#include "../../Dataflash.h"
+		#include "../../LEDs.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_BOARD_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Indicates the board has a hardware Dataflash mounted. */
+			#define BOARD_HAS_DATAFLASH
+
+			/** Indicates the board has hardware LEDs mounted. */
+			#define BOARD_HAS_LEDS
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/XPLAIN/Dataflash.h b/lib/lufa/LUFA/Drivers/Board/AVR8/XPLAIN/Dataflash.h
new file mode 100644
index 0000000000..ed6a48c6a9
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/XPLAIN/Dataflash.h
@@ -0,0 +1,245 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific Dataflash driver header for the original Atmel XPLAIN.
+ *  \copydetails Group_Dataflash_XPLAIN
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the dataflash driver
+ *        dispatch header located in LUFA/Drivers/Board/Dataflash.h.
+ */
+
+/** \ingroup Group_Dataflash
+ *  \defgroup Group_Dataflash_XPLAIN_REV1 XPLAIN_REV1
+ *  \brief Board specific Dataflash driver header for the original Atmel XPLAIN, revision 1.
+ *
+ *  See \ref Group_Dataflash_XPLAIN for more details.
+ */
+
+/** \ingroup Group_Dataflash
+ *  \defgroup Group_Dataflash_XPLAIN XPLAIN
+ *  \brief Board specific Dataflash driver header for the original Atmel XPLAIN.
+ *
+ *  \note For the first revision XPLAIN board, compile with <code>BOARD = BOARD_XPLAIN_REV1</code>.
+ *
+ *  Board specific Dataflash driver header for the Atmel XPLAIN.
+ *
+ *  <b>Revision 1 Boards</b>:
+ *  <table>
+ *    <tr><th>Name</th><th>Info</th><th>Select Pin</th><th>SPI Port</th></tr>
+ *    <tr><td>DATAFLASH_CHIP1</td><td>AT45DB041D (512KB)</td><td>PORTB.5</td><td>SPI0</td></tr>
+ *  </table>
+ *
+ *  <b>Other Board Revisions</b>:
+ *  <table>
+ *    <tr><th>Name</th><th>Info</th><th>Select Pin</th><th>SPI Port</th></tr>
+ *    <tr><td>DATAFLASH_CHIP1</td><td>AT45DB642D (8MB)</td><td>PORTB.5</td><td>SPI0</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __DATAFLASH_XPLAIN_H__
+#define __DATAFLASH_XPLAIN_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+
+		#include "../../../Misc/AT45DB642D.h"
+		#include "../../../Peripheral/SPI.h"
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_DATAFLASH_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Dataflash.h instead.
+		#endif
+
+	/* Private Interface - For use in library only: */
+	#if !defined(__DOXYGEN__)
+		/* Macros: */
+			#define DATAFLASH_CHIPCS_MASK                DATAFLASH_CHIP1
+			#define DATAFLASH_CHIPCS_DDR                 DDRB
+			#define DATAFLASH_CHIPCS_PORT                PORTB
+	#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Constant indicating the total number of dataflash ICs mounted on the selected board. */
+			#define DATAFLASH_TOTALCHIPS                 1
+
+			/** Mask for no dataflash chip selected. */
+			#define DATAFLASH_NO_CHIP                    0
+
+			/** Mask for the first dataflash chip selected. */
+			#define DATAFLASH_CHIP1                      (1 << 5)
+
+			#if ((BOARD != BOARD_XPLAIN_REV1) || defined(__DOXYGEN__))
+				/** Internal main memory page size for the board's dataflash ICs. */
+				#define DATAFLASH_PAGE_SIZE              1024
+
+				/** Total number of pages inside each of the board's dataflash ICs. */
+				#define DATAFLASH_PAGES                  8192
+			#else
+				#define DATAFLASH_PAGE_SIZE              256
+
+				#define DATAFLASH_PAGES                  2048
+			#endif
+
+		/* Inline Functions: */
+			/** Initializes the dataflash driver so that commands and data may be sent to an attached dataflash IC.
+			 *  The appropriate SPI interface will be automatically configured.
+			 */
+			static inline void Dataflash_Init(void)
+			{
+				DATAFLASH_CHIPCS_DDR  |= DATAFLASH_CHIPCS_MASK;
+				DATAFLASH_CHIPCS_PORT |= DATAFLASH_CHIPCS_MASK;
+
+				SPI_Init(SPI_SPEED_FCPU_DIV_2 | SPI_ORDER_MSB_FIRST | SPI_SCK_LEAD_FALLING | SPI_SAMPLE_TRAILING | SPI_MODE_MASTER);
+			}
+
+			/** Sends a byte to the currently selected dataflash IC, and returns a byte from the dataflash.
+			 *
+			 *  \param[in] Byte  Byte of data to send to the dataflash
+			 *
+			 *  \return Last response byte from the dataflash
+			 */
+			static inline uint8_t Dataflash_TransferByte(const uint8_t Byte) ATTR_ALWAYS_INLINE;
+			static inline uint8_t Dataflash_TransferByte(const uint8_t Byte)
+			{
+				return SPI_TransferByte(Byte);
+			}
+
+			/** Sends a byte to the currently selected dataflash IC, and ignores the next byte from the dataflash.
+			 *
+			 *  \param[in] Byte  Byte of data to send to the dataflash
+			 */
+			static inline void Dataflash_SendByte(const uint8_t Byte) ATTR_ALWAYS_INLINE;
+			static inline void Dataflash_SendByte(const uint8_t Byte)
+			{
+				SPI_SendByte(Byte);
+			}
+
+			/** Sends a dummy byte to the currently selected dataflash IC, and returns the next byte from the dataflash.
+			 *
+			 *  \return Last response byte from the dataflash
+			 */
+			static inline uint8_t Dataflash_ReceiveByte(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t Dataflash_ReceiveByte(void)
+			{
+				return SPI_ReceiveByte();
+			}
+
+			/** Determines the currently selected dataflash chip.
+			 *
+			 *  \return Mask of the currently selected Dataflash chip, either \ref DATAFLASH_NO_CHIP if no chip is selected
+			 *          or a DATAFLASH_CHIPn mask (where n is the chip number).
+			 */
+			static inline uint8_t Dataflash_GetSelectedChip(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t Dataflash_GetSelectedChip(void)
+			{
+				return (~DATAFLASH_CHIPCS_PORT & DATAFLASH_CHIPCS_MASK);
+			}
+
+			/** Selects the given dataflash chip.
+			 *
+			 *  \param[in]  ChipMask  Mask of the Dataflash IC to select, in the form of a \c DATAFLASH_CHIPn mask (where n is
+			 *              the chip number).
+			 */
+			static inline void Dataflash_SelectChip(const uint8_t ChipMask) ATTR_ALWAYS_INLINE;
+			static inline void Dataflash_SelectChip(const uint8_t ChipMask)
+			{
+				DATAFLASH_CHIPCS_PORT = ((DATAFLASH_CHIPCS_PORT | DATAFLASH_CHIPCS_MASK) & ~ChipMask);
+			}
+
+			/** Deselects the current dataflash chip, so that no dataflash is selected. */
+			static inline void Dataflash_DeselectChip(void) ATTR_ALWAYS_INLINE;
+			static inline void Dataflash_DeselectChip(void)
+			{
+				Dataflash_SelectChip(DATAFLASH_NO_CHIP);
+			}
+
+			/** Selects a dataflash IC from the given page number, which should range from 0 to
+			 *  ((DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS) - 1). For boards containing only one
+			 *  dataflash IC, this will select DATAFLASH_CHIP1. If the given page number is outside
+			 *  the total number of pages contained in the boards dataflash ICs, all dataflash ICs
+			 *  are deselected.
+			 *
+			 *  \param[in] PageAddress  Address of the page to manipulate, ranging from
+			 *                          0 to ((DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS) - 1).
+			 */
+			static inline void Dataflash_SelectChipFromPage(const uint16_t PageAddress)
+			{
+				Dataflash_DeselectChip();
+
+				if (PageAddress >= DATAFLASH_PAGES)
+				  return;
+
+				Dataflash_SelectChip(DATAFLASH_CHIP1);
+			}
+
+			/** Toggles the select line of the currently selected dataflash IC, so that it is ready to receive
+			 *  a new command.
+			 */
+			static inline void Dataflash_ToggleSelectedChipCS(void)
+			{
+				uint8_t SelectedChipMask = Dataflash_GetSelectedChip();
+
+				Dataflash_DeselectChip();
+				Dataflash_SelectChip(SelectedChipMask);
+			}
+
+			/** Spin-loops while the currently selected dataflash is busy executing a command, such as a main
+			 *  memory page program or main memory to buffer transfer.
+			 */
+			static inline void Dataflash_WaitWhileBusy(void)
+			{
+				Dataflash_ToggleSelectedChipCS();
+				Dataflash_SendByte(DF_CMD_GETSTATUS);
+				while (!(Dataflash_ReceiveByte() & DF_STATUS_READY));
+				Dataflash_ToggleSelectedChipCS();
+			}
+
+			/** Sends a set of page and buffer address bytes to the currently selected dataflash IC, for use with
+			 *  dataflash commands which require a complete 24-bit address.
+			 *
+			 *  \param[in] PageAddress  Page address within the selected dataflash IC
+			 *  \param[in] BufferByte   Address within the dataflash's buffer
+			 */
+			static inline void Dataflash_SendAddressBytes(uint16_t PageAddress,
+			                                              const uint16_t BufferByte)
+			{
+				Dataflash_SendByte(PageAddress >> 5);
+				Dataflash_SendByte((PageAddress << 3) | (BufferByte >> 8));
+				Dataflash_SendByte(BufferByte);
+			}
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/XPLAIN/LEDs.h b/lib/lufa/LUFA/Drivers/Board/AVR8/XPLAIN/LEDs.h
new file mode 100644
index 0000000000..9da3fade53
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/XPLAIN/LEDs.h
@@ -0,0 +1,142 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific LED driver header for the original Atmel XPLAIN.
+ *  \copydetails Group_LEDs_XPLAIN
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the LEDs driver
+ *        dispatch header located in LUFA/Drivers/Board/LEDs.h.
+ */
+
+/** \ingroup Group_LEDs
+ *  \defgroup Group_LEDs_XPLAIN_REV1 XPLAIN_REV1
+ *  \brief Board specific LED driver header for the original Atmel XPLAIN, revision 1.
+ *
+ *  See \ref Group_LEDs_XPLAIN for more details.
+ */
+
+/** \ingroup Group_LEDs
+ *  \defgroup Group_LEDs_XPLAIN XPLAIN
+ *  \brief Board specific LED driver header for the original Atmel XPLAIN.
+ *
+ *  Board specific LED driver header for the Atmel XPLAIN.
+ *
+ *  <table>
+ *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr>
+ *    <tr><td>LEDS_LED1</td><td>Green</td><td>General Indicator</td><td>Low</td><td>PORTB.6</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __LEDS_XPLAIN_H__
+#define __LEDS_XPLAIN_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_LEDS_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/LEDS.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** LED mask for the first LED on the board. */
+			#define LEDS_LED1        (1 << 6)
+
+			/** LED mask for all the LEDs on the board. */
+			#define LEDS_ALL_LEDS    LEDS_LED1
+
+			/** LED mask for none of the board LEDs. */
+			#define LEDS_NO_LEDS     0
+
+		/* Inline Functions: */
+		#if !defined(__DOXYGEN__)
+			static inline void LEDs_Init(void)
+			{
+				DDRB  |= LEDS_ALL_LEDS;
+				PORTB |= LEDS_ALL_LEDS;
+			}
+
+			static inline void LEDs_Disable(void)
+			{
+				DDRB  &= ~LEDS_ALL_LEDS;
+				PORTB &= ~LEDS_ALL_LEDS;
+			}
+
+			static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask)
+			{
+				PORTB &= ~LEDMask;
+			}
+
+			static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask)
+			{
+				PORTB |= LEDMask;
+			}
+
+			static inline void LEDs_SetAllLEDs(const uint8_t LEDMask)
+			{
+				PORTB = ((PORTB | LEDS_ALL_LEDS) & ~LEDMask);
+			}
+
+			static inline void LEDs_ChangeLEDs(const uint8_t LEDMask,
+			                                   const uint8_t ActiveMask)
+			{
+				PORTB = ((PORTB | LEDMask) & ~ActiveMask);
+			}
+
+			static inline void LEDs_ToggleLEDs(const uint8_t LEDMask)
+			{
+				PINB  = LEDMask;
+			}
+
+			static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t LEDs_GetLEDs(void)
+			{
+				return (~PORTB & LEDS_ALL_LEDS);
+			}
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/XPLAINED_MINI/Board.h b/lib/lufa/LUFA/Drivers/Board/AVR8/XPLAINED_MINI/Board.h
new file mode 100644
index 0000000000..2253e33ea3
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/XPLAINED_MINI/Board.h
@@ -0,0 +1,78 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific information header for the Atmel Xplained-MINI series kits.
+ *  \copydetails Group_BoardInfo_XPLAINED_MINI
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the Board driver
+ *        dispatch header located in LUFA/Drivers/Board/Board.h.
+ */
+
+/** \ingroup Group_BoardInfo
+ *  \defgroup Group_BoardInfo_XPLAINED_MINI XPLAINED_MINI
+ *  \brief Board specific information header for the Atmel Xplained-MINI series kits.
+ *
+ *  Board specific information header for the Atmel Xplained-MINI series kits.
+ *
+ *  @{
+ */
+
+#ifndef __BOARD_XPLAINED_MINI_H__
+#define __BOARD_XPLAINED_MINI_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+		#include "../../LEDs.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_BOARD_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Indicates the board has hardware LEDs mounted. */
+			#define BOARD_HAS_LEDS
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/XPLAINED_MINI/LEDs.h b/lib/lufa/LUFA/Drivers/Board/AVR8/XPLAINED_MINI/LEDs.h
new file mode 100644
index 0000000000..5c8f1967b0
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/XPLAINED_MINI/LEDs.h
@@ -0,0 +1,135 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific LED driver header for the Atmel Xplained-MINI series kits..
+ *  \copydetails Group_LEDs_XPLAINED_MINI
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the LEDs driver
+ *        dispatch header located in LUFA/Drivers/Board/LEDs.h.
+ */
+
+/** \ingroup Group_LEDs
+ *  \defgroup Group_LEDs_XPLAINED_MINI XPLAINED_MINI
+ *  \brief Board specific LED driver header for the Atmel Xplained-MINI series kits.
+ *
+ *  Board specific LED driver header for the Atmel Xplained-MINI series kits.
+ *
+ *  <table>
+ *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr>
+ *    <tr><td>LEDS_LED1</td><td>Green</td><td>General Indicator</td><td>Low</td><td>PORTC.6</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __LEDS_XPLAINED_MINI_H__
+#define __LEDS_XPLAINED_MINI_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_LEDS_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/LEDS.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** LED mask for the first LED on the board. */
+			#define LEDS_LED1        (1 << 6)
+
+			/** LED mask for all the LEDs on the board. */
+			#define LEDS_ALL_LEDS    LEDS_LED1
+
+			/** LED mask for none of the board LEDs. */
+			#define LEDS_NO_LEDS     0
+
+		/* Inline Functions: */
+		#if !defined(__DOXYGEN__)
+			static inline void LEDs_Init(void)
+			{
+				DDRC  |= LEDS_ALL_LEDS;
+				PORTC |= LEDS_ALL_LEDS;
+			}
+
+			static inline void LEDs_Disable(void)
+			{
+				DDRC  &= ~LEDS_ALL_LEDS;
+				PORTC &= ~LEDS_ALL_LEDS;
+			}
+
+			static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask)
+			{
+				PORTC &= ~LEDMask;
+			}
+
+			static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask)
+			{
+				PORTC |= LEDMask;
+			}
+
+			static inline void LEDs_SetAllLEDs(const uint8_t LEDMask)
+			{
+				PORTC = ((PORTC | LEDS_ALL_LEDS) & ~LEDMask);
+			}
+
+			static inline void LEDs_ChangeLEDs(const uint8_t LEDMask,
+			                                   const uint8_t ActiveMask)
+			{
+				PORTC = ((PORTC | LEDMask) & ~ActiveMask);
+			}
+
+			static inline void LEDs_ToggleLEDs(const uint8_t LEDMask)
+			{
+				PINC  = LEDMask;
+			}
+
+			static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t LEDs_GetLEDs(void)
+			{
+				return (~PORTC & LEDS_ALL_LEDS);
+			}
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/YUN/Board.h b/lib/lufa/LUFA/Drivers/Board/AVR8/YUN/Board.h
new file mode 100644
index 0000000000..035f66a52b
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/YUN/Board.h
@@ -0,0 +1,78 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific information header for the Arduino Yun board.
+ *  \copydetails Group_BoardInfo_YUN
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the Board driver
+ *        dispatch header located in LUFA/Drivers/Board/Board.h.
+ */
+
+/** \ingroup Group_BoardInfo
+ *  \defgroup Group_BoardInfo_YUN YUN
+ *  \brief Board specific information header for the Arduino Yun board.
+ *
+ *  Board specific information header for the Arduino Yun board (http://arduino.cc/en/Main/arduinoBoardYun).
+ *
+ *  @{
+ */
+
+#ifndef __BOARD_YUN_H__
+#define __BOARD_YUN_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+		#include "../../LEDs.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_BOARD_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Indicates the board has hardware LEDs mounted. */
+			#define BOARD_HAS_LEDS
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/YUN/LEDs.h b/lib/lufa/LUFA/Drivers/Board/AVR8/YUN/LEDs.h
new file mode 100644
index 0000000000..d06acd7e32
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/AVR8/YUN/LEDs.h
@@ -0,0 +1,169 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific LED driver header for the Arduino Yun board.
+ *  \copydetails Group_LEDs_YUN
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the LEDs driver
+ *        dispatch header located in LUFA/Drivers/Board/LEDs.h.
+ */
+
+/** \ingroup Group_LEDs
+ *  \defgroup Group_LEDs_YUN YUN
+ *  \brief Board specific LED driver header for the Arduino Yun board.
+ *
+ *  Board specific LED driver header for the Arduino Yun board (http://arduino.cc/en/Main/arduinoBoardYun).
+ *
+ *  <table>
+ *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr>
+ *    <tr><td>LEDS_LED1</td><td>Yellow</td><td>RX</td><td>Low</td><td>PORTB.0</td></tr>
+ *    <tr><td>LEDS_LED2</td><td>Yellow</td><td>TX</td><td>Low</td><td>PORTD.5</td></tr>
+ *    <tr><td>LEDS_LED3</td><td>Red</td><td>General Indicator</td><td>High</td><td>PORTC.7</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __LEDS_YUN_H__
+#define __LEDS_YUN_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_LEDS_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/LEDS.h instead.
+		#endif
+
+	/* Private Interface - For use in library only: */
+	#if !defined(__DOXYGEN__)
+		/* Macros: */
+			#define LEDS_PORTB_LEDS       (LEDS_LED1)
+			#define LEDS_PORTD_LEDS       (LEDS_LED2)
+			#define LEDS_PORTC_LEDS       (LEDS_LED3)
+	#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** LED mask for the first LED on the board. */
+			#define LEDS_LED1        (1 << 0)
+
+			/** LED mask for the second LED on the board. */
+			#define LEDS_LED2        (1 << 5)
+
+			/** LED mask for the third LED on the board. */
+			#define LEDS_LED3        (1 << 7)
+
+			/** LED mask for all the LEDs on the board. */
+			#define LEDS_ALL_LEDS    (LEDS_LED1 | LEDS_LED2 | LEDS_LED3)
+
+			/** LED mask for none of the board LEDs. */
+			#define LEDS_NO_LEDS     0
+
+		/* Inline Functions: */
+		#if !defined(__DOXYGEN__)
+			static inline void LEDs_Init(void)
+			{
+				DDRB  |=  LEDS_PORTB_LEDS;
+				PORTB |=  LEDS_PORTB_LEDS;
+				DDRD  |=  LEDS_PORTD_LEDS;
+				PORTD |=  LEDS_PORTD_LEDS;
+				DDRC  |=  LEDS_PORTC_LEDS;
+				PORTC &= ~LEDS_PORTC_LEDS;
+			}
+
+			static inline void LEDs_Disable(void)
+			{
+				DDRB  &= ~LEDS_PORTB_LEDS;
+				PORTB &= ~LEDS_PORTB_LEDS;
+				DDRD  &= ~LEDS_PORTD_LEDS;
+				PORTD &= ~LEDS_PORTD_LEDS;
+				DDRC  &= ~LEDS_PORTC_LEDS;
+				PORTC &= ~LEDS_PORTC_LEDS;
+			}
+
+			static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask)
+			{
+				PORTB &= ~(LEDMask & LEDS_PORTB_LEDS);
+				PORTD &= ~(LEDMask & LEDS_PORTD_LEDS);
+				PORTC |=  (LEDMask & LEDS_PORTC_LEDS);
+			}
+
+			static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask)
+			{
+				PORTB |=  (LEDMask & LEDS_PORTB_LEDS);
+				PORTD |=  (LEDMask & LEDS_PORTD_LEDS);
+				PORTC &= ~(LEDMask & LEDS_PORTC_LEDS);
+			}
+
+			static inline void LEDs_SetAllLEDs(const uint8_t LEDMask)
+			{
+				PORTB = ((PORTB |  LEDS_PORTB_LEDS) & ~(LEDMask & LEDS_PORTB_LEDS));
+				PORTD = ((PORTD |  LEDS_PORTD_LEDS) & ~(LEDMask & LEDS_PORTD_LEDS));
+				PORTC = ((PORTC & ~LEDS_PORTC_LEDS) |  (LEDMask & LEDS_PORTC_LEDS));
+			}
+
+			static inline void LEDs_ChangeLEDs(const uint8_t LEDMask,
+			                                   const uint8_t ActiveMask)
+			{
+				PORTB = ((PORTB |  (LEDMask & LEDS_PORTB_LEDS)) & ~(ActiveMask & LEDS_PORTB_LEDS));
+				PORTD = ((PORTD |  (LEDMask & LEDS_PORTD_LEDS)) & ~(ActiveMask & LEDS_PORTD_LEDS));
+				PORTC = ((PORTC & ~(LEDMask & LEDS_PORTC_LEDS)) |  (ActiveMask & LEDS_PORTC_LEDS));
+			}
+
+			static inline void LEDs_ToggleLEDs(const uint8_t LEDMask)
+			{
+				PINB  = (LEDMask & LEDS_PORTB_LEDS);
+				PIND  = (LEDMask & LEDS_PORTD_LEDS);
+				PINC  = (LEDMask & LEDS_PORTC_LEDS);
+			}
+
+			static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t LEDs_GetLEDs(void)
+			{
+				return ((~PORTB & LEDS_PORTB_LEDS) | (~PORTD & LEDS_PORTD_LEDS) | (PORTC & LEDS_PORTC_LEDS));
+			}
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/Board.h b/lib/lufa/LUFA/Drivers/Board/Board.h
new file mode 100644
index 0000000000..3b28e6cca3
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/Board.h
@@ -0,0 +1,173 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board hardware information driver.
+ *
+ *  This file is the master dispatch header file for the board-specific information driver, to give information
+ *  on the hardware contained on a specific board.
+ *
+ *  User code should include this file, which will in turn include the correct board driver header file for the
+ *  currently selected board.
+ *
+ *  If the \c BOARD value is set to \c BOARD_USER, this will include the \c /Board/Board.h file in the user project
+ *  directory.
+ *
+ *  For possible \c BOARD makefile values, see \ref Group_BoardTypes.
+ */
+
+/** \ingroup Group_BoardDrivers
+ *  \defgroup Group_BoardInfo Board Information Driver - LUFA/Drivers/Board/Board.h
+ *  \brief Board hardware information driver.
+ *
+ *  \section Sec_BoardInfo_Dependencies Module Source Dependencies
+ *  The following files must be built with any user project that uses this module:
+ *    - None
+ *
+ *  @{
+ */
+
+#ifndef __BOARD_H__
+#define __BOARD_H__
+
+	/* Macros: */
+		#define __INCLUDE_FROM_BOARD_H
+
+	/* Includes: */
+		#include "../../Common/Common.h"
+
+		#if (BOARD == BOARD_USBKEY)
+			#include "AVR8/USBKEY/Board.h"
+		#elif (BOARD == BOARD_STK525)
+			#include "AVR8/STK525/Board.h"
+		#elif (BOARD == BOARD_STK526)
+			#include "AVR8/STK526/Board.h"
+		#elif (BOARD == BOARD_RZUSBSTICK)
+			#include "AVR8/RZUSBSTICK/Board.h"
+		#elif (BOARD == BOARD_ATAVRUSBRF01)
+			#include "AVR8/ATAVRUSBRF01/Board.h"
+		#elif ((BOARD == BOARD_XPLAIN) || (BOARD == BOARD_XPLAIN_REV1))
+			#include "AVR8/XPLAIN/Board.h"
+		#elif (BOARD == BOARD_BUMBLEB)
+			#include "AVR8/BUMBLEB/Board.h"
+		#elif (BOARD == BOARD_EVK527)
+			#include "AVR8/EVK527/Board.h"
+		#elif ((BOARD == BOARD_TEENSY) || (BOARD == BOARD_TEENSY2))
+			#include "AVR8/TEENSY/Board.h"
+		#elif ((BOARD == BOARD_QMK))
+			#include "AVR8/QMK/Board.h"
+		#elif (BOARD == BOARD_USBTINYMKII)
+			#include "AVR8/USBTINYMKII/Board.h"
+		#elif (BOARD == BOARD_BENITO)
+			#include "AVR8/BENITO/Board.h"
+		#elif (BOARD == BOARD_JMDBU2)
+			#include "AVR8/JMDBU2/Board.h"
+		#elif (BOARD == BOARD_OLIMEX162)
+			#include "AVR8/OLIMEX162/Board.h"
+		#elif (BOARD == BOARD_USBFOO)
+			#include "AVR8/USBFOO/Board.h"
+		#elif (BOARD == BOARD_UDIP)
+			#include "AVR8/UDIP/Board.h"
+		#elif (BOARD == BOARD_BUI)
+			#include "AVR8/BUI/Board.h"
+		#elif (BOARD == BOARD_UNO)
+			#include "AVR8/UNO/Board.h"
+		#elif (BOARD == BOARD_CULV3)
+			#include "AVR8/CULV3/Board.h"
+		#elif (BOARD == BOARD_BLACKCAT)
+			#include "AVR8/BLACKCAT/Board.h"
+		#elif (BOARD == BOARD_MAXIMUS)
+			#include "AVR8/MAXIMUS/Board.h"
+		#elif (BOARD == BOARD_MINIMUS)
+			#include "AVR8/MINIMUS/Board.h"
+		#elif (BOARD == BOARD_ADAFRUITU4)
+			#include "AVR8/ADAFRUITU4/Board.h"
+		#elif (BOARD == BOARD_MICROSIN162)
+			#include "AVR8/MICROSIN162/Board.h"
+		#elif (BOARD == BOARD_SPARKFUN8U2)
+			#include "AVR8/SPARKFUN8U2/Board.h"
+		#elif (BOARD == BOARD_EVK1101)
+			#include "UC3/EVK1101/Board.h"
+		#elif (BOARD == BOARD_TUL)
+			#include "AVR8/TUL/Board.h"
+		#elif (BOARD == BOARD_EVK1100)
+			#include "UC3/EVK1100/Board.h"
+		#elif (BOARD == BOARD_EVK1104)
+			#include "UC3/EVK1104/Board.h"
+		#elif (BOARD == BOARD_A3BU_XPLAINED)
+			#include "XMEGA/A3BU_XPLAINED/Board.h"
+		#elif ((BOARD == BOARD_USB2AX) || (BOARD == BOARD_USB2AX_V3) || (BOARD == BOARD_USB2AX_V31))
+			#include "AVR8/USB2AX/Board.h"
+		#elif ((BOARD == BOARD_MICROPENDOUS_REV1) || (BOARD == BOARD_MICROPENDOUS_REV2) || \
+		       (BOARD == BOARD_MICROPENDOUS_32U2) || (BOARD == BOARD_MICROPENDOUS_A) || \
+		       (BOARD == BOARD_MICROPENDOUS_1)    || (BOARD == BOARD_MICROPENDOUS_2) || \
+		       (BOARD == BOARD_MICROPENDOUS_3)    || (BOARD == BOARD_MICROPENDOUS_4) || \
+		       (BOARD == BOARD_MICROPENDOUS_DIP))
+			#include "AVR8/MICROPENDOUS/Board.h"
+		#elif (BOARD == BOARD_B1_XPLAINED)
+			#include "XMEGA/B1_XPLAINED/Board.h"
+		#elif (BOARD == BOARD_MULTIO)
+			#include "AVR8/MULTIO/Board.h"
+		#elif (BOARD == BOARD_BIGMULTIO)
+			#include "AVR8/BIGMULTIO/Board.h"
+		#elif (BOARD == BOARD_DUCE)
+			#include "AVR8/DUCE/Board.h"
+		#elif (BOARD == BOARD_OLIMEX32U4)
+			#include "AVR8/OLIMEX32U4/Board.h"
+		#elif (BOARD == BOARD_OLIMEXT32U4)
+			#include "AVR8/OLIMEXT32U4/Board.h"
+		#elif (BOARD == BOARD_OLIMEXISPMK2)
+			#include "AVR8/OLIMEXISPMK2/Board.h"
+		#elif (BOARD == BOARD_LEONARDO)
+			#include "AVR8/LEONARDO/Board.h"
+		#elif (BOARD == BOARD_UC3A3_XPLAINED)
+			#include "UC3/UC3A3_XPLAINED/Board.h"
+		#elif (BOARD == BOARD_STANGE_ISP)
+			#include "AVR8/STANGE_ISP/Board.h"
+		#elif (BOARD == BOARD_C3_XPLAINED)
+			#include "XMEGA/C3_XPLAINED/Board.h"
+		#elif (BOARD == BOARD_U2S)
+			#include "AVR8/U2S/Board.h"
+		#elif (BOARD == BOARD_YUN)
+			#include "AVR8/YUN/Board.h"
+		#elif (BOARD == BOARD_MICRO)
+			#include "AVR8/MICRO/Board.h"
+		#elif (BOARD == BOARD_POLOLUMICRO)
+			#include "AVR8/POLOLUMICRO/Board.h"
+		#elif (BOARD == BOARD_XPLAINED_MINI)
+			#include "AVR8/XPLAINED_MINI/Board.h"
+		#else
+			#include "Board/Board.h"
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/Buttons.h b/lib/lufa/LUFA/Drivers/Board/Buttons.h
new file mode 100644
index 0000000000..00ebe8c15d
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/Buttons.h
@@ -0,0 +1,189 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Digital button board hardware driver.
+ *
+ *  This file is the master dispatch header file for the board-specific Buttons driver, for boards containing
+ *  physical pushbuttons connected to the microcontroller's GPIO pins.
+ *
+ *  User code should include this file, which will in turn include the correct Button driver header file for the
+ *  currently selected board.
+ *
+ *  If the \c BOARD value is set to \c BOARD_USER, this will include the \c /Board/Buttons.h file in the user project
+ *  directory.
+ *
+ *  For possible \c BOARD makefile values, see \ref Group_BoardTypes.
+ */
+
+/** \ingroup Group_BoardDrivers
+ *  \defgroup Group_Buttons Buttons Driver - LUFA/Drivers/Board/Buttons.h
+ *  \brief Digital button board hardware driver.
+ *
+ *  \section Sec_Buttons_Dependencies Module Source Dependencies
+ *  The following files must be built with any user project that uses this module:
+ *    - None
+ *
+ *  \section Sec_Buttons_ModDescription Module Description
+ *  Hardware buttons driver. This provides an easy to use driver for the hardware buttons present on many boards.
+ *  It provides a way to easily configure and check the status of all the buttons on the board so that appropriate
+ *  actions can be taken.
+ *
+ *  If the \c BOARD value is set to \c BOARD_USER, this will include the \c /Board/Buttons.h file in the user project
+ *  directory. Otherwise, it will include the appropriate built-in board driver header file.
+ *
+ *  For possible \c BOARD makefile values, see \ref Group_BoardTypes.
+ *
+ *  \section Sec_Buttons_ExampleUsage Example Usage
+ *  The following snippet is an example of how this module may be used within a typical
+ *  application.
+ *
+ *  \code
+ *      // Initialize the button driver before first use
+ *      Buttons_Init();
+ *
+ *      printf("Waiting for button press...\r\n");
+ *
+ *      // Loop until a board button has been pressed
+ *      uint8_t ButtonPress;
+ *      while (!(ButtonPress = Buttons_GetStatus())) {};
+ *
+ *      // Display which button was pressed (assuming two board buttons)
+ *      printf("Button pressed: %s\r\n", (ButtonPress == BUTTONS_BUTTON1) ? "Button 1" : "Button 2");
+ *  \endcode
+ *
+ *  @{
+ */
+
+#ifndef __BUTTONS_H__
+#define __BUTTONS_H__
+
+	/* Macros: */
+		#define __INCLUDE_FROM_BUTTONS_H
+
+	/* Includes: */
+		#include "../../Common/Common.h"
+
+		#if (BOARD == BOARD_NONE)
+			#define BUTTONS_BUTTON1  0
+			static inline void       Buttons_Init(void) {}
+			static inline void       Buttons_Disable(void) {}
+			static inline uint_reg_t Buttons_GetStatus(void) { return 0; }
+		#elif (BOARD == BOARD_USBKEY)
+			#include "AVR8/USBKEY/Buttons.h"
+		#elif (BOARD == BOARD_STK525)
+			#include "AVR8/STK525/Buttons.h"
+		#elif (BOARD == BOARD_STK526)
+			#include "AVR8/STK526/Buttons.h"
+		#elif (BOARD == BOARD_ATAVRUSBRF01)
+			#include "AVR8/ATAVRUSBRF01/Buttons.h"
+		#elif (BOARD == BOARD_BUMBLEB)
+			#include "AVR8/BUMBLEB/Buttons.h"
+		#elif (BOARD == BOARD_EVK527)
+			#include "AVR8/EVK527/Buttons.h"
+		#elif (BOARD == BOARD_USBTINYMKII)
+			#include "AVR8/USBTINYMKII/Buttons.h"
+		#elif (BOARD == BOARD_BENITO)
+			#include "AVR8/BENITO/Buttons.h"
+		#elif (BOARD == BOARD_JMDBU2)
+			#include "AVR8/JMDBU2/Buttons.h"
+		#elif (BOARD == BOARD_OLIMEX162)
+			#include "AVR8/OLIMEX162/Buttons.h"
+		#elif (BOARD == BOARD_USBFOO)
+			#include "AVR8/USBFOO/Buttons.h"
+		#elif (BOARD == BOARD_UDIP)
+			#include "AVR8/UDIP/Buttons.h"
+		#elif (BOARD == BOARD_CULV3)
+			#include "AVR8/CULV3/Buttons.h"
+		#elif (BOARD == BOARD_MINIMUS)
+			#include "AVR8/MINIMUS/Buttons.h"
+		#elif (BOARD == BOARD_MICROSIN162)
+			#include "AVR8/MICROSIN162/Buttons.h"
+		#elif (BOARD == BOARD_EVK1101)
+			#include "UC3/EVK1101/Buttons.h"
+		#elif (BOARD == BOARD_TUL)
+			#include "AVR8/TUL/Buttons.h"
+		#elif (BOARD == BOARD_EVK1100)
+			#include "UC3/EVK1100/Buttons.h"
+		#elif (BOARD == BOARD_EVK1104)
+			#include "UC3/EVK1104/Buttons.h"
+		#elif (BOARD == BOARD_A3BU_XPLAINED)
+			#include "XMEGA/A3BU_XPLAINED/Buttons.h"
+		#elif ((BOARD == BOARD_USB2AX) || (BOARD == BOARD_USB2AX_V3))
+			#include "AVR8/USB2AX/Buttons.h"
+		#elif ((BOARD == BOARD_MICROPENDOUS_32U2) || (BOARD == BOARD_MICROPENDOUS_A) || \
+		       (BOARD == BOARD_MICROPENDOUS_1)    || (BOARD == BOARD_MICROPENDOUS_2) || \
+		       (BOARD == BOARD_MICROPENDOUS_3)    || (BOARD == BOARD_MICROPENDOUS_4) || \
+		       (BOARD == BOARD_MICROPENDOUS_REV1) || (BOARD == BOARD_MICROPENDOUS_REV2) || \
+		       (BOARD == BOARD_MICROPENDOUS_DIP))
+			#include "AVR8/MICROPENDOUS/Buttons.h"
+		#elif (BOARD == BOARD_B1_XPLAINED)
+			#include "XMEGA/B1_XPLAINED/Buttons.h"
+		#elif (BOARD == BOARD_OLIMEX32U4)
+			#include "AVR8/OLIMEX32U4/Buttons.h"
+		#elif (BOARD == BOARD_OLIMEXT32U4)
+			#include "AVR8/OLIMEXT32U4/Buttons.h"
+		#elif (BOARD == BOARD_OLIMEXISPMK2)
+			#include "AVR8/OLIMEXISPMK2/Buttons.h"
+		#elif (BOARD == BOARD_UC3A3_XPLAINED)
+			#include "UC3/UC3A3_XPLAINED/Buttons.h"
+		#elif (BOARD == BOARD_STANGE_ISP)
+			#include "AVR8/STANGE_ISP/Buttons.h"
+		#elif (BOARD == BOARD_C3_XPLAINED)
+			#include "XMEGA/C3_XPLAINED/Buttons.h"
+		#elif (BOARD == BOARD_U2S)
+			#include "AVR8/U2S/Buttons.h"
+		#else
+			#include "Board/Buttons.h"
+		#endif
+
+	/* Pseudo-Functions for Doxygen: */
+	#if defined(__DOXYGEN__)
+		/** Initializes the buttons driver, so that the current button position can be read. This sets the appropriate
+		 *  I/O pins to an inputs with pull-ups enabled.
+		 *
+		 *  This must be called before any Button driver functions are used.
+		 */
+		static inline void Buttons_Init(void);
+
+		/** Disables the buttons driver, releasing the I/O pins back to their default high-impedance input mode. */
+		static inline void Buttons_Disable(void);
+
+		/** Returns a mask indicating which board buttons are currently pressed.
+		 *
+		 *  \return Mask of \c BUTTONS_BUTTON* constants indicating which board buttons are currently pressed.
+		 */
+		static inline uint_reg_t Buttons_GetStatus(void) ATTR_WARN_UNUSED_RESULT;
+	#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/Dataflash.h b/lib/lufa/LUFA/Drivers/Board/Dataflash.h
new file mode 100644
index 0000000000..b634dccaa6
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/Dataflash.h
@@ -0,0 +1,264 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Master include file for the board dataflash IC driver.
+ *  \brief Atmel Dataflash storage IC board hardware driver.
+ *
+ *  This file is the master dispatch header file for the board-specific Atmel dataflash driver, for boards containing
+ *  Atmel Dataflash ICs for external non-volatile storage.
+ *
+ *  User code should include this file, which will in turn include the correct dataflash driver header file for
+ *  the currently selected board.
+ *
+ *  If the \c BOARD value is set to \c BOARD_USER, this will include the \c /Board/Dataflash.h file in the user project
+ *  directory.
+ *
+ *  For possible \c BOARD makefile values, see \ref Group_BoardTypes.
+ */
+
+/** \ingroup Group_BoardDrivers
+ *  \defgroup Group_Dataflash Dataflash Driver - LUFA/Drivers/Board/Dataflash.h
+ *  \brief Atmel Dataflash storage IC board hardware driver.
+ *
+ *  \section Sec_Dataflash_Dependencies Module Source Dependencies
+ *  The following files must be built with any user project that uses this module:
+ *    - None
+ *
+ *  \section Sec_Dataflash_ModDescription Module Description
+ *  Dataflash driver. This module provides an easy to use interface for the Dataflash ICs located on many boards,
+ *  for the storage of large amounts of data into the Dataflash's non-volatile memory.
+ *
+ *  If the \c BOARD value is set to \c BOARD_USER, this will include the \c /Board/Dataflash.h file in the user project
+ *  directory. Otherwise, it will include the appropriate built-in board driver header file.
+ *
+ *  For possible \c BOARD makefile values, see \ref Group_BoardTypes.
+ *
+ *  \section Sec_Dataflash_ExampleUsage Example Usage
+ *  The following snippet is an example of how this module may be used within a typical
+ *  application.
+ *
+ *  \code
+ *      // Initialize the board Dataflash driver before first use
+ *      Dataflash_Init();
+ *
+ *      uint8_t WriteBuffer[DATAFLASH_PAGE_SIZE];
+ *      uint8_t ReadBuffer[DATAFLASH_PAGE_SIZE];
+ *
+ *      // Fill page write buffer with a repeating pattern
+ *      for (uint16_t i = 0; i < DATAFLASH_PAGE_SIZE; i++)
+ *        WriteBuffer[i] = (i & 0xFF);
+ *
+ *      // Must select the chip of interest first before operating on it
+ *      Dataflash_SelectChip(DATAFLASH_CHIP1);
+ *
+ *      // Write to the Dataflash's first internal memory buffer
+ *      printf("Writing data to first dataflash buffer:\r\n");
+ *      Dataflash_SendByte(DF_CMD_BUFF1WRITE);
+ *      Dataflash_SendAddressBytes(0, 0);
+ *
+ *      for (uint16_t i = 0; i < DATAFLASH_PAGE_SIZE; i++)
+ *        Dataflash_SendByte(WriteBuffer[i]);
+ *
+ *      // Commit the Dataflash's first memory buffer to the non-volatile FLASH memory
+ *      printf("Committing page to non-volatile memory page index 5:\r\n");
+ *      Dataflash_SendByte(DF_CMD_BUFF1TOMAINMEMWITHERASE);
+ *      Dataflash_SendAddressBytes(5, 0);
+ *      Dataflash_WaitWhileBusy();
+ *
+ *      // Read the page from non-volatile FLASH memory into the Dataflash's second memory buffer
+ *      printf("Reading data into second dataflash buffer:\r\n");
+ *      Dataflash_SendByte(DF_CMD_MAINMEMTOBUFF2);
+ *      Dataflash_SendAddressBytes(5, 0);
+ *      Dataflash_WaitWhileBusy();
+ *
+ *      // Read the Dataflash's second internal memory buffer
+ *      Dataflash_SendByte(DF_CMD_BUFF2READ);
+ *      Dataflash_SendAddressBytes(0, 0);
+ *
+ *      for (uint16_t i = 0; i < DATAFLASH_PAGE_SIZE; i++)
+ *        ReadBuffer[i] = Dataflash_ReceiveByte();
+ *
+ *      // Deselect the chip after use
+ *      Dataflash_DeselectChip();
+ *  \endcode
+ *
+ *  @{
+ */
+
+#ifndef __DATAFLASH_H__
+#define __DATAFLASH_H__
+
+	/* Macros: */
+		#define __INCLUDE_FROM_DATAFLASH_H
+
+	/* Includes: */
+		#include "../../Common/Common.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Retrieves the Dataflash chip select mask for the given Dataflash chip index.
+			 *
+			 *  \attention This macro will only work correctly on chip index numbers that are compile-time
+			 *             constants defined by the preprocessor.
+			 *
+			 *  \param[in] index  Index of the dataflash chip mask to retrieve.
+			 *
+			 *  \return Mask for the given Dataflash chip's /CS pin
+			 */
+			#define DATAFLASH_CHIP_MASK(index)      CONCAT_EXPANDED(DATAFLASH_CHIP, index)
+
+		/* Inline Functions: */
+			/** Initializes the dataflash driver so that commands and data may be sent to an attached dataflash IC.
+			 *
+			 *  \note The microcontroller's physical interface driver connected to the Dataflash IC must be initialized before
+			 *        any of the dataflash commands are used. This is usually a SPI hardware port, but on some devices/boards may
+			 *        be a USART operating in SPI Master mode.
+			 */
+			static inline void Dataflash_Init(void);
+
+			/** Determines the currently selected dataflash chip.
+			 *
+			 *  \return Mask of the currently selected Dataflash chip, either \ref DATAFLASH_NO_CHIP if no chip is selected
+			 *  or a \c DATAFLASH_CHIPn mask (where n is the chip number).
+			 */
+			static inline uint8_t Dataflash_GetSelectedChip(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT;
+
+			/** Selects the given dataflash chip.
+			 *
+			 *  \param[in]  ChipMask  Mask of the Dataflash IC to select, in the form of a \c DATAFLASH_CHIPn mask (where n is
+			 *              the chip number).
+			 */
+			static inline void Dataflash_SelectChip(const uint8_t ChipMask) ATTR_ALWAYS_INLINE;
+
+			/** Deselects the current dataflash chip, so that no dataflash is selected. */
+			static inline void Dataflash_DeselectChip(void) ATTR_ALWAYS_INLINE;
+
+			/** Selects a dataflash IC from the given page number, which should range from 0 to
+			 *  ((DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS) - 1). For boards containing only one
+			 *  dataflash IC, this will select \ref DATAFLASH_CHIP1. If the given page number is outside
+			 *  the total number of pages contained in the boards dataflash ICs, all dataflash ICs
+			 *  are deselected.
+			 *
+			 *  \param[in] PageAddress  Address of the page to manipulate, ranging from
+			 *                          0 to ((DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS) - 1).
+			 */
+			static inline void Dataflash_SelectChipFromPage(const uint16_t PageAddress);
+
+			/** Toggles the select line of the currently selected dataflash IC, so that it is ready to receive
+			 *  a new command.
+			 */
+			static inline void Dataflash_ToggleSelectedChipCS(void);
+
+			/** Spin-loops while the currently selected dataflash is busy executing a command, such as a main
+			 *  memory page program or main memory to buffer transfer.
+			 */
+			static inline void Dataflash_WaitWhileBusy(void);
+
+			/** Sends a set of page and buffer address bytes to the currently selected dataflash IC, for use with
+			 *  dataflash commands which require a complete 24-bit address.
+			 *
+			 *  \param[in] PageAddress  Page address within the selected dataflash IC
+			 *  \param[in] BufferByte   Address within the dataflash's buffer
+			 */
+			static inline void Dataflash_SendAddressBytes(uint16_t PageAddress,
+			                                              const uint16_t BufferByte);
+
+			/** Sends a byte to the currently selected dataflash IC, and returns a byte from the dataflash.
+			 *
+			 *  \param[in] Byte  Byte of data to send to the dataflash
+			 *
+			 *  \return Last response byte from the dataflash
+			 */
+			static inline uint8_t Dataflash_TransferByte(const uint8_t Byte) ATTR_ALWAYS_INLINE;
+
+			/** Sends a byte to the currently selected dataflash IC, and ignores the next byte from the dataflash.
+			 *
+			 *  \param[in] Byte  Byte of data to send to the dataflash
+			 */
+			static inline void Dataflash_SendByte(const uint8_t Byte) ATTR_ALWAYS_INLINE;
+
+			/** Sends a dummy byte to the currently selected dataflash IC, and returns the next byte from the dataflash.
+			 *
+			 *  \return Last response byte from the dataflash
+			 */
+			static inline uint8_t Dataflash_ReceiveByte(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT;
+
+		/* Includes: */
+			#if (BOARD == BOARD_NONE)
+				#define DATAFLASH_TOTALCHIPS  0
+				#define DATAFLASH_NO_CHIP     0
+				#define DATAFLASH_CHIP1       0
+				#define DATAFLASH_PAGE_SIZE   0
+				#define DATAFLASH_PAGES       0
+				static inline void    Dataflash_Init(void) {};
+				static inline uint8_t Dataflash_TransferByte(const uint8_t Byte) { return 0; };
+				static inline void    Dataflash_SendByte(const uint8_t Byte) {};
+				static inline uint8_t Dataflash_ReceiveByte(void) { return 0; };
+				static inline uint8_t Dataflash_GetSelectedChip(void) { return 0; };
+				static inline void    Dataflash_SelectChip(const uint8_t ChipMask) {};
+				static inline void    Dataflash_DeselectChip(void) {};
+				static inline void    Dataflash_SelectChipFromPage(const uint16_t PageAddress) {};
+				static inline void    Dataflash_ToggleSelectedChipCS(void) {};
+				static inline void    Dataflash_WaitWhileBusy(void) {};
+				static inline void    Dataflash_SendAddressBytes(uint16_t PageAddress,
+				                                                 const uint16_t BufferByte) {};
+			#elif (BOARD == BOARD_USBKEY)
+				#include "AVR8/USBKEY/Dataflash.h"
+			#elif (BOARD == BOARD_STK525)
+				#include "AVR8/STK525/Dataflash.h"
+			#elif (BOARD == BOARD_STK526)
+				#include "AVR8/STK526/Dataflash.h"
+			#elif ((BOARD == BOARD_XPLAIN) || (BOARD == BOARD_XPLAIN_REV1))
+				#include "AVR8/XPLAIN/Dataflash.h"
+			#elif (BOARD == BOARD_EVK527)
+				#include "AVR8/EVK527/Dataflash.h"
+			#elif (BOARD == BOARD_A3BU_XPLAINED)
+				#include "XMEGA/A3BU_XPLAINED/Dataflash.h"
+			#elif (BOARD == BOARD_B1_XPLAINED)
+				#include "XMEGA/B1_XPLAINED/Dataflash.h"
+			#else
+				#include "Board/Dataflash.h"
+			#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/Joystick.h b/lib/lufa/LUFA/Drivers/Board/Joystick.h
new file mode 100644
index 0000000000..0d0fe89344
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/Joystick.h
@@ -0,0 +1,152 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Digital joystick board hardware driver.
+ *
+ *  This file is the master dispatch header file for the board-specific Joystick driver, for boards containing a
+ *  digital joystick.
+ *
+ *  User code should include this file, which will in turn include the correct joystick driver header file for the
+ *  currently selected board.
+ *
+ *  If the \c BOARD value is set to \c BOARD_USER, this will include the \c /Board/Joystick.h file in the user project
+ *  directory.
+ *
+ *  For possible \c BOARD makefile values, see \ref Group_BoardTypes.
+ */
+
+/** \ingroup Group_BoardDrivers
+ *  \defgroup Group_Joystick Joystick Driver - LUFA/Drivers/Board/Joystick.h
+ *  \brief Digital joystick board hardware driver.
+ *
+ *  \section Sec_Joystick_Dependencies Module Source Dependencies
+ *  The following files must be built with any user project that uses this module:
+ *    - None
+ *
+ *  \section Sec_Joystick_ModDescription Module Description
+ *  Hardware Joystick driver. This module provides an easy to use interface to control the hardware digital Joystick
+ *  located on many boards.
+ *
+ *  If the \c BOARD value is set to \c BOARD_USER, this will include the \c /Board/Joystick.h file in the user project
+ *  directory. Otherwise, it will include the appropriate built-in board driver header file.
+ *
+ *  For possible \c BOARD makefile values, see \ref Group_BoardTypes.
+ *
+ *  \section Sec_Joystick_ExampleUsage Example Usage
+ *  The following snippet is an example of how this module may be used within a typical
+ *  application.
+ *
+ *  \code
+ *      // Initialize the board Joystick driver before first use
+ *      Joystick_Init();
+ *
+ *      printf("Waiting for joystick movement...\r\n");
+ *
+ *      // Loop until a the joystick has been moved
+ *      uint8_t JoystickMovement;
+ *      while (!(JoystickMovement = Joystick_GetStatus())) {};
+ *
+ *      // Display which direction the joystick was moved in
+ *      printf("Joystick moved:\r\n");
+ *
+ *      if (JoystickMovement & (JOY_UP | JOY_DOWN))
+ *        printf("%s ", (JoystickMovement & JOY_UP) ? "Up" : "Down");
+ *
+ *      if (JoystickMovement & (JOY_LEFT | JOY_RIGHT))
+ *        printf("%s ", (JoystickMovement & JOY_LEFT) ? "Left" : "Right");
+ *
+ *      if (JoystickMovement & JOY_PRESS)
+ *        printf("Pressed");
+ *  \endcode
+ *
+ *  @{
+ */
+
+#ifndef __JOYSTICK_H__
+#define __JOYSTICK_H__
+
+	/* Macros: */
+		#define __INCLUDE_FROM_JOYSTICK_H
+
+	/* Includes: */
+		#include "../../Common/Common.h"
+
+		#if (BOARD == BOARD_NONE)
+			#define JOY_UP           0
+			#define JOY_DOWN         0
+			#define JOY_LEFT         0
+			#define JOY_RIGHT        0
+			#define JOY_PRESS        0
+			static inline void       Joystick_Init(void) {}
+			static inline void       Joystick_Disable(void) {}
+			static inline uint_reg_t Joystick_GetStatus(void) { return 0; }
+		#elif (BOARD == BOARD_USBKEY)
+			#include "AVR8/USBKEY/Joystick.h"
+		#elif (BOARD == BOARD_STK525)
+			#include "AVR8/STK525/Joystick.h"
+		#elif (BOARD == BOARD_STK526)
+			#include "AVR8/STK526/Joystick.h"
+		#elif (BOARD == BOARD_BUMBLEB)
+			#include "AVR8/BUMBLEB/Joystick.h"
+		#elif (BOARD == BOARD_EVK527)
+			#include "AVR8/EVK527/Joystick.h"
+		#elif (BOARD == BOARD_EVK1101)
+			#include "UC3/EVK1101/Joystick.h"
+		#elif (BOARD == BOARD_EVK1100)
+			#include "UC3/EVK1100/Joystick.h"
+		#else
+			#include "Board/Joystick.h"
+		#endif
+
+	/* Pseudo-Functions for Doxygen: */
+	#if defined(__DOXYGEN__)
+		/** Initializes the joystick driver so that the joystick position can be read. This sets the appropriate
+		 *  I/O pins to inputs with their pull-ups enabled.
+		 *
+		 *  This must be called before any Joystick driver functions are used.
+		 */
+		static inline void Joystick_Init(void);
+
+		/** Disables the joystick driver, releasing the I/O pins back to their default high-impedance input mode. */
+		static inline void Joystick_Disable(void);
+
+		/** Returns the current status of the joystick, as a mask indicating the direction the joystick is
+		 *  currently facing in (multiple bits can be set).
+		 *
+		 *  \return Mask of \c JOYSTICK_* constants indicating the current joystick direction(s).
+		 */
+		static inline uint_reg_t Joystick_GetStatus(void) ATTR_WARN_UNUSED_RESULT;
+	#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/LEDs.h b/lib/lufa/LUFA/Drivers/Board/LEDs.h
new file mode 100644
index 0000000000..74abb37238
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/LEDs.h
@@ -0,0 +1,304 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief LED board hardware driver.
+ *
+ *  This file is the master dispatch header file for the board-specific LED driver, for boards containing user
+ *  controllable LEDs.
+ *
+ *  User code should include this file, which will in turn include the correct LED driver header file for the
+ *  currently selected board.
+ *
+ *  If the \c BOARD value is set to \c BOARD_USER, this will include the \c /Board/LEDs.h file in the user project
+ *  directory.
+ *
+ *  For possible \c BOARD makefile values, see \ref Group_BoardTypes.
+ */
+
+/** \ingroup Group_BoardDrivers
+ *  \defgroup Group_LEDs LEDs Driver - LUFA/Drivers/Board/LEDs.h
+ *  \brief LED board hardware driver.
+ *
+ *  \section Sec_LEDs_Dependencies Module Source Dependencies
+ *  The following files must be built with any user project that uses this module:
+ *    - None
+ *
+ *  \section Sec_LEDs_ModDescription Module Description
+ *  Hardware LEDs driver. This provides an easy to use driver for the hardware LEDs present on many boards. It
+ *  provides an interface to configure, test and change the status of all the board LEDs.
+ *
+ *  If the \c BOARD value is set to \c BOARD_USER, this will include the \c /Board/LEDs.h file in the user project
+ *  directory. Otherwise, it will include the appropriate built-in board driver header file. If the BOARD value
+ *  is set to \c BOARD_NONE, this driver is silently disabled.
+ *
+ *  For possible \c BOARD makefile values, see \ref Group_BoardTypes.
+ *
+ *  \note To make code as compatible as possible, it is assumed that all boards carry a minimum of four LEDs. If
+ *        a board contains less than four LEDs, the remaining LED masks are defined to 0 so as to have no effect.
+ *        If other behavior is desired, either alias the remaining LED masks to existing LED masks via the -D
+ *        switch in the project makefile, or alias them to nothing in the makefile to cause compilation errors when
+ *        a non-existing LED is referenced in application code. Note that this means that it is possible to make
+ *        compatible code for a board with no LEDs by making a board LED driver (see \ref Page_WritingBoardDrivers)
+ *        which contains only stub functions and defines no LEDs.
+ *
+ *  \section Sec_LEDs_ExampleUsage Example Usage
+ *  The following snippet is an example of how this module may be used within a typical
+ *  application.
+ *
+ *  \code
+ *      // Initialize the board LED driver before first use
+ *      LEDs_Init();
+ *
+ *      // Turn on each of the four LEDs in turn
+ *      LEDs_SetAllLEDs(LEDS_LED1);
+ *      Delay_MS(500);
+ *      LEDs_SetAllLEDs(LEDS_LED2);
+ *      Delay_MS(500);
+ *      LEDs_SetAllLEDs(LEDS_LED3);
+ *      Delay_MS(500);
+ *      LEDs_SetAllLEDs(LEDS_LED4);
+ *      Delay_MS(500);
+ *
+ *      // Turn on all LEDs
+ *      LEDs_SetAllLEDs(LEDS_ALL_LEDS);
+ *      Delay_MS(1000);
+ *
+ *      // Turn on LED 1, turn off LED 2, leaving LEDs 3 and 4 in their current state
+ *      LEDs_ChangeLEDs((LEDS_LED1 | LEDS_LED2), LEDS_LED1);
+ *  \endcode
+ *
+ *  @{
+ */
+
+#ifndef __LEDS_H__
+#define __LEDS_H__
+
+	/* Macros: */
+		#define __INCLUDE_FROM_LEDS_H
+
+	/* Includes: */
+		#include "../../Common/Common.h"
+
+		#if (BOARD == BOARD_NONE)
+			static inline void       LEDs_Init(void) {}
+			static inline void       LEDs_Disable(void) {}
+			static inline void       LEDs_TurnOnLEDs(const uint_reg_t LEDMask) {}
+			static inline void       LEDs_TurnOffLEDs(const uint_reg_t LEDMask) {}
+			static inline void       LEDs_SetAllLEDs(const uint_reg_t LEDMask) {}
+			static inline void       LEDs_ChangeLEDs(const uint_reg_t LEDMask, const uint_reg_t ActiveMask) {}
+			static inline void       LEDs_ToggleLEDs(const uint_reg_t LEDMask) {}
+			static inline uint_reg_t LEDs_GetLEDs(void) { return 0; }
+		#elif (BOARD == BOARD_USBKEY)
+			#include "AVR8/USBKEY/LEDs.h"
+		#elif (BOARD == BOARD_STK525)
+			#include "AVR8/STK525/LEDs.h"
+		#elif (BOARD == BOARD_STK526)
+			#include "AVR8/STK526/LEDs.h"
+		#elif (BOARD == BOARD_RZUSBSTICK)
+			#include "AVR8/RZUSBSTICK/LEDs.h"
+		#elif (BOARD == BOARD_ATAVRUSBRF01)
+			#include "AVR8/ATAVRUSBRF01/LEDs.h"
+		#elif ((BOARD == BOARD_XPLAIN) || (BOARD == BOARD_XPLAIN_REV1))
+			#include "AVR8/XPLAIN/LEDs.h"
+		#elif (BOARD == BOARD_BUMBLEB)
+			#include "AVR8/BUMBLEB/LEDs.h"
+		#elif (BOARD == BOARD_EVK527)
+			#include "AVR8/EVK527/LEDs.h"
+		#elif ((BOARD == BOARD_TEENSY) || (BOARD == BOARD_TEENSY2))
+			#include "AVR8/TEENSY/LEDs.h"
+		#elif ((BOARD == BOARD_QMK))
+			#include "AVR8/QMK/LEDs.h"
+		#elif (BOARD == BOARD_USBTINYMKII)
+			#include "AVR8/USBTINYMKII/LEDs.h"
+		#elif (BOARD == BOARD_BENITO)
+			#include "AVR8/BENITO/LEDs.h"
+		#elif (BOARD == BOARD_JMDBU2)
+			#include "AVR8/JMDBU2/LEDs.h"
+		#elif (BOARD == BOARD_OLIMEX162)
+			#include "AVR8/OLIMEX162/LEDs.h"
+		#elif (BOARD == BOARD_USBFOO)
+			#include "AVR8/USBFOO/LEDs.h"
+		#elif (BOARD == BOARD_UDIP)
+			#include "AVR8/UDIP/LEDs.h"
+		#elif (BOARD == BOARD_BUI)
+			#include "AVR8/BUI/LEDs.h"
+		#elif (BOARD == BOARD_UNO)
+			#include "AVR8/UNO/LEDs.h"
+		#elif (BOARD == BOARD_CULV3)
+			#include "AVR8/CULV3/LEDs.h"
+		#elif (BOARD == BOARD_BLACKCAT)
+			#include "AVR8/BLACKCAT/LEDs.h"
+		#elif (BOARD == BOARD_MAXIMUS)
+			#include "AVR8/MAXIMUS/LEDs.h"
+		#elif (BOARD == BOARD_MINIMUS)
+			#include "AVR8/MINIMUS/LEDs.h"
+		#elif (BOARD == BOARD_ADAFRUITU4)
+			#include "AVR8/ADAFRUITU4/LEDs.h"
+		#elif (BOARD == BOARD_MICROSIN162)
+			#include "AVR8/MICROSIN162/LEDs.h"
+		#elif (BOARD == BOARD_SPARKFUN8U2)
+			#include "AVR8/SPARKFUN8U2/LEDs.h"
+		#elif (BOARD == BOARD_EVK1101)
+			#include "UC3/EVK1101/LEDs.h"
+		#elif (BOARD == BOARD_TUL)
+			#include "AVR8/TUL/LEDs.h"
+		#elif (BOARD == BOARD_EVK1100)
+			#include "UC3/EVK1100/LEDs.h"
+		#elif (BOARD == BOARD_EVK1104)
+			#include "UC3/EVK1104/LEDs.h"
+		#elif (BOARD == BOARD_A3BU_XPLAINED)
+			#include "XMEGA/A3BU_XPLAINED/LEDs.h"
+		#elif ((BOARD == BOARD_USB2AX) || (BOARD == BOARD_USB2AX_V3) || (BOARD == BOARD_USB2AX_V31))
+			#include "AVR8/USB2AX/LEDs.h"
+		#elif ((BOARD == BOARD_MICROPENDOUS_REV1) || (BOARD == BOARD_MICROPENDOUS_REV2) || \
+		       (BOARD == BOARD_MICROPENDOUS_32U2))
+			#include "AVR8/MICROPENDOUS/LEDs.h"
+		#elif (BOARD == BOARD_B1_XPLAINED)
+			#include "XMEGA/B1_XPLAINED/LEDs.h"
+		#elif (BOARD == BOARD_MULTIO)
+			#include "AVR8/MULTIO/LEDs.h"
+		#elif (BOARD == BOARD_BIGMULTIO)
+			#include "AVR8/BIGMULTIO/LEDs.h"
+		#elif (BOARD == BOARD_DUCE)
+			#include "AVR8/DUCE/LEDs.h"
+		#elif (BOARD == BOARD_OLIMEX32U4)
+			#include "AVR8/OLIMEX32U4/LEDs.h"
+		#elif (BOARD == BOARD_OLIMEXT32U4)
+			#include "AVR8/OLIMEXT32U4/LEDs.h"
+		#elif (BOARD == BOARD_OLIMEXISPMK2)
+			#include "AVR8/OLIMEXISPMK2/LEDs.h"
+		#elif (BOARD == BOARD_LEONARDO)
+			#include "AVR8/LEONARDO/LEDs.h"
+		#elif (BOARD == BOARD_UC3A3_XPLAINED)
+			#include "UC3/UC3A3_XPLAINED/LEDs.h"
+		#elif (BOARD == BOARD_STANGE_ISP)
+			#include "AVR8/STANGE_ISP/LEDs.h"
+		#elif (BOARD == BOARD_C3_XPLAINED)
+			#include "XMEGA/C3_XPLAINED/LEDs.h"
+		#elif (BOARD == BOARD_U2S)
+			#include "AVR8/U2S/LEDs.h"
+		#elif (BOARD == BOARD_YUN)
+			#include "AVR8/YUN/LEDs.h"
+		#elif (BOARD == BOARD_MICRO)
+			#include "AVR8/MICRO/LEDs.h"
+		#elif (BOARD == BOARD_POLOLUMICRO)
+			#include "AVR8/POLOLUMICRO/LEDs.h"
+		#elif (BOARD == BOARD_XPLAINED_MINI)
+			#include "AVR8/XPLAINED_MINI/LEDs.h"
+		#else
+			#include "Board/LEDs.h"
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__DOXYGEN__)
+			#if !defined(LEDS_NO_LEDS)
+				#define LEDS_NO_LEDS   0
+			#endif
+
+			#if !defined(LEDS_ALL_LEDS)
+				#define LEDS_ALL_LEDS  (LEDS_LED1 | LEDS_LED2 | LEDS_LED3 | LEDS_LED4)
+			#endif
+
+			#if !defined(LEDS_LED1)
+				#define LEDS_LED1      0
+			#endif
+
+			#if !defined(LEDS_LED2)
+				#define LEDS_LED2      0
+			#endif
+
+			#if !defined(LEDS_LED3)
+				#define LEDS_LED3      0
+			#endif
+
+			#if !defined(LEDS_LED4)
+				#define LEDS_LED4      0
+			#endif
+		#endif
+
+	/* Pseudo-Functions for Doxygen: */
+	#if defined(__DOXYGEN__)
+		/** Initializes the board LED driver so that the LEDs can be controlled. This sets the appropriate port
+		 *  I/O pins as outputs, and sets the LEDs to default to off.
+		 *
+		 *  This must be called before any LED driver functions are used.
+		 */
+		static inline void LEDs_Init(void);
+
+		/** Disables the board LED driver, releasing the I/O pins back to their default high-impedance input mode. */
+		static inline void LEDs_Disable(void);
+
+		/** Turns on the LEDs specified in the given LED mask.
+		 *
+		 *  \param[in] LEDMask  Mask of the board LEDs to manipulate (see board-specific LEDs.h driver file).
+		 */
+		static inline void LEDs_TurnOnLEDs(const uint_reg_t LEDMask);
+
+		/** Turns off the LEDs specified in the given LED mask.
+		 *
+		 *  \param[in] LEDMask  Mask of the board LEDs to manipulate (see board-specific LEDs.h driver file).
+		 */
+		static inline void LEDs_TurnOffLEDs(const uint_reg_t LEDMask);
+
+		/** Turns off all LEDs not specified in the given LED mask, and turns on all the LEDs in the given LED
+		 *  mask.
+		 *
+		 *  \param[in] LEDMask  Mask of the board LEDs to manipulate (see board-specific LEDs.h driver file).
+		 */
+		static inline void LEDs_SetAllLEDs(const uint_reg_t LEDMask);
+
+		/** Turns off all LEDs in the LED mask that are not set in the active mask, and turns on all the LEDs
+		 *  specified in both the LED and active masks.
+		 *
+		 *  \param[in] LEDMask     Mask of the board LEDs to manipulate (see board-specific LEDs.h driver file).
+		 *  \param[in] ActiveMask  Mask of whether the LEDs in the LED mask should be turned on or off.
+		 */
+		static inline void LEDs_ChangeLEDs(const uint_reg_t LEDMask,
+		                                   const uint_reg_t ActiveMask);
+
+		/** Toggles all LEDs in the LED mask, leaving all others in their current states.
+		 *
+		 *  \param[in] LEDMask  Mask of the board LEDs to manipulate (see board-specific LEDs.h driver file).
+		 */
+		static inline void LEDs_ToggleLEDs(const uint_reg_t LEDMask);
+
+		/** Returns the status of all the board LEDs; set LED masks in the return value indicate that the
+		 *  corresponding LED is on.
+		 *
+		 *  \return Mask of \c LEDS_LED* constants indicating which of the board LEDs are currently turned on.
+		 */
+		static inline uint_reg_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT;
+	#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/Temperature.c b/lib/lufa/LUFA/Drivers/Board/Temperature.c
new file mode 100644
index 0000000000..2fb1976272
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/Temperature.c
@@ -0,0 +1,66 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+#define  __INCLUDE_FROM_TEMPERATURE_C
+#include "Temperature.h"
+
+#if defined(TEMPERATURE_SENSOR_DRIVER_COMPATIBLE)
+
+static const uint16_t PROGMEM Temperature_Lookup[TEMP_TABLE_SIZE] =
+{
+	0x3B4, 0x3B0, 0x3AB, 0x3A6, 0x3A0, 0x39A, 0x394, 0x38E, 0x388, 0x381, 0x37A, 0x373,
+	0x36B, 0x363, 0x35B, 0x353, 0x34A, 0x341, 0x338, 0x32F, 0x325, 0x31B, 0x311, 0x307,
+	0x2FC, 0x2F1, 0x2E6, 0x2DB, 0x2D0, 0x2C4, 0x2B8, 0x2AC, 0x2A0, 0x294, 0x288, 0x27C,
+	0x26F, 0x263, 0x256, 0x24A, 0x23D, 0x231, 0x225, 0x218, 0x20C, 0x200, 0x1F3, 0x1E7,
+	0x1DB, 0x1CF, 0x1C4, 0x1B8, 0x1AC, 0x1A1, 0x196, 0x18B, 0x180, 0x176, 0x16B, 0x161,
+	0x157, 0x14D, 0x144, 0x13A, 0x131, 0x128, 0x11F, 0x117, 0x10F, 0x106, 0x0FE, 0x0F7,
+	0x0EF, 0x0E8, 0x0E1, 0x0DA, 0x0D3, 0x0CD, 0x0C7, 0x0C0, 0x0BA, 0x0B5, 0x0AF, 0x0AA,
+	0x0A4, 0x09F, 0x09A, 0x096, 0x091, 0x08C, 0x088, 0x084, 0x080, 0x07C, 0x078, 0x074,
+	0x071, 0x06D, 0x06A, 0x067, 0x064, 0x061, 0x05E, 0x05B, 0x058, 0x055, 0x053, 0x050,
+	0x04E, 0x04C, 0x049, 0x047, 0x045, 0x043, 0x041, 0x03F, 0x03D, 0x03C, 0x03A, 0x038
+};
+
+int8_t Temperature_GetTemperature(void)
+{
+	uint16_t Temp_ADC = ADC_GetChannelReading(ADC_REFERENCE_AVCC | ADC_RIGHT_ADJUSTED | TEMP_ADC_CHANNEL_MASK);
+
+	if (Temp_ADC > pgm_read_word(&Temperature_Lookup[0]))
+	  return TEMP_MIN_TEMP;
+
+	for (uint16_t Index = 0; Index < TEMP_TABLE_SIZE; Index++)
+	{
+		if (Temp_ADC > pgm_read_word(&Temperature_Lookup[Index]))
+		  return (Index + TEMP_TABLE_OFFSET_DEGREES);
+	}
+
+	return TEMP_MAX_TEMP;
+}
+
+#endif
diff --git a/lib/lufa/LUFA/Drivers/Board/Temperature.h b/lib/lufa/LUFA/Drivers/Board/Temperature.h
new file mode 100644
index 0000000000..f381cc92d9
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/Temperature.h
@@ -0,0 +1,147 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief NTC Temperature Sensor board hardware driver.
+ *
+ *  Master include file for the board temperature sensor driver, for the USB boards which contain a temperature sensor.
+ */
+
+/** \ingroup Group_BoardDrivers
+ *  \defgroup Group_Temperature Temperature Sensor Driver - LUFA/Drivers/Board/Temperature.h
+ *  \brief NTC Temperature Sensor board hardware driver.
+ *
+ *  \section Sec_Temperature_Dependencies Module Source Dependencies
+ *  The following files must be built with any user project that uses this module:
+ *    - LUFA/Drivers/Board/Temperature.c <i>(Makefile source module name: LUFA_SRC_TEMPERATURE)</i>
+ *
+ *  \section Sec_Temperature_ModDescription Module Description
+ *  Temperature sensor driver. This provides an easy to use interface for the hardware temperature sensor located
+ *  on many boards. It provides an interface to configure the sensor and appropriate ADC channel, plus read out the
+ *  current temperature in degrees C. It is designed for and will only work with the temperature sensor located on the
+ *  official Atmel USB AVR boards, as each sensor has different characteristics.
+ *
+ *  \section Sec_Temperature_ExampleUsage Example Usage
+ *  The following snippet is an example of how this module may be used within a typical
+ *  application.
+ *
+ *  \code
+ *      // Initialize the ADC and board temperature sensor drivers before first use
+ *      ADC_Init(ADC_FREE_RUNNING | ADC_PRESCALE_128);
+ *      Temperature_Init();
+ *
+ *      // Display converted temperature in degrees Celsius
+ *      printf("Current Temperature: %d Degrees\r\n", Temperature_GetTemperature());
+ *  \endcode
+ *
+ *  @{
+ */
+
+#ifndef __TEMPERATURE_H__
+#define __TEMPERATURE_H__
+
+	/* Includes: */
+		#include "../../Common/Common.h"
+
+	/* Preprocessor Checks: */
+		#if ((BOARD == BOARD_USBKEY) || (BOARD == BOARD_STK525) || \
+		     (BOARD == BOARD_STK526) || (BOARD == BOARD_EVK527))
+			#define TEMPERATURE_SENSOR_DRIVER_COMPATIBLE
+		#endif
+
+		#if !defined(__INCLUDE_FROM_TEMPERATURE_C) && !defined(TEMPERATURE_SENSOR_DRIVER_COMPATIBLE)
+			#error The selected board does not contain a compatible temperature sensor.
+		#endif
+
+	#if defined(TEMPERATURE_SENSOR_DRIVER_COMPATIBLE)
+
+	/* Includes: */
+		#include "../Peripheral/ADC.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** ADC channel number for the temperature sensor. */
+			#define TEMP_ADC_CHANNEL       0
+
+			/** ADC channel MUX mask for the temperature sensor. */
+			#define TEMP_ADC_CHANNEL_MASK  ADC_CHANNEL0
+
+			/** Size of the temperature sensor lookup table, in lookup values */
+			#define TEMP_TABLE_SIZE        120
+
+			/** Minimum returnable temperature from the \ref Temperature_GetTemperature() function. */
+			#define TEMP_MIN_TEMP          TEMP_TABLE_OFFSET_DEGREES
+
+			/** Maximum returnable temperature from the \ref Temperature_GetTemperature() function. */
+			#define TEMP_MAX_TEMP          ((TEMP_TABLE_SIZE - 1) + TEMP_TABLE_OFFSET_DEGREES)
+
+		/* Inline Functions: */
+			/** Initializes the temperature sensor driver, including setting up the appropriate ADC channel.
+			 *  This must be called before any other temperature sensor routines.
+			 *
+			 *  \pre The ADC itself (not the ADC channel) must be configured separately before calling the
+			 *       temperature sensor functions.
+			 */
+			static inline void Temperature_Init(void) ATTR_ALWAYS_INLINE;
+			static inline void Temperature_Init(void)
+			{
+				ADC_SetupChannel(TEMP_ADC_CHANNEL);
+			}
+
+		/* Function Prototypes: */
+			/** Performs a complete ADC on the temperature sensor channel, and converts the result into a
+			 *  valid temperature between \ref TEMP_MIN_TEMP and \ref TEMP_MAX_TEMP in degrees Celsius.
+			 *
+			 *  \return Signed temperature value in degrees Celsius.
+			 */
+			int8_t Temperature_GetTemperature(void) ATTR_WARN_UNUSED_RESULT;
+
+	/* Private Interface - For use in library only: */
+	#if !defined(__DOXYGEN__)
+		/* Macros: */
+			#define TEMP_TABLE_OFFSET_DEGREES   -21
+	#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+	#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/UC3/EVK1100/Board.h b/lib/lufa/LUFA/Drivers/Board/UC3/EVK1100/Board.h
new file mode 100644
index 0000000000..bd68cf5774
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/UC3/EVK1100/Board.h
@@ -0,0 +1,86 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific information header for the Atmel EVK1100.
+ *  \copydetails Group_BoardInfo_EVK1100
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the Board driver
+ *        dispatch header located in LUFA/Drivers/Board/Board.h.
+ */
+
+/** \ingroup Group_BoardInfo
+ *  \defgroup Group_BoardInfo_EVK1100 EVK1100
+ *  \brief Board specific information header for the Atmel Atmel EVK1100.
+ *
+ *  Board specific information header for the Atmel Atmel EVK1100.
+ *
+ *  @{
+ */
+
+#ifndef __BOARD_EVK1100_H__
+#define __BOARD_EVK1100_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+		#include "../../Buttons.h"
+		#include "../../Joystick.h"
+		#include "../../LEDs.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_BOARD_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Indicates the board has hardware Buttons mounted. */
+			#define BOARD_HAS_BUTTONS
+
+			/** Indicates the board has a hardware Joystick mounted. */
+			#define BOARD_HAS_JOYSTICK
+
+			/** Indicates the board has hardware LEDs mounted. */
+			#define BOARD_HAS_LEDS
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/UC3/EVK1100/Buttons.h b/lib/lufa/LUFA/Drivers/Board/UC3/EVK1100/Buttons.h
new file mode 100644
index 0000000000..a2bd15d285
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/UC3/EVK1100/Buttons.h
@@ -0,0 +1,117 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific Buttons driver header for the Atmel EVK1100.
+ *  \copydetails Group_Buttons_EVK1100
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the Buttons driver
+ *        dispatch header located in LUFA/Drivers/Board/Buttons.h.
+ */
+
+/** \ingroup Group_Buttons
+ *  \defgroup Group_Buttons_EVK1100 EVK1100
+ *  \brief Board specific Buttons driver header for the Atmel EVK1100.
+ *
+ *  Board specific Buttons driver header for the Atmel EVK1100.
+ *
+ *  <table>
+ *    <tr><th>Name</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr>
+ *    <tr><td>BUTTONS_BUTTON1</td><td>SW0 Button</td><td>Low</td><td>GPIO88</td></tr>
+ *    <tr><td>BUTTONS_BUTTON2</td><td>SW1 Button</td><td>Low</td><td>GPIO85</td></tr>
+ *    <tr><td>BUTTONS_BUTTON3</td><td>SW2 Button</td><td>Low</td><td>GPIO82</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __BUTTONS_EVK1100_H__
+#define __BUTTONS_EVK1100_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_BUTTONS_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Buttons.h instead.
+		#endif
+
+	/* Private Interface - For use in library only: */
+	#if !defined(__DOXYGEN__)
+		/* Macros: */
+			#define BUTTONS_PORT          2
+	#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Mask of the first button on the board */
+			#define BUTTONS_BUTTON1       (1UL << 24)
+
+			/** Mask of the second button on the board */
+			#define BUTTONS_BUTTON2       (1UL << 21)
+
+			/** Mask of the third button on the board */
+			#define BUTTONS_BUTTON3       (1UL << 18)
+
+		/* Inline Functions: */
+		#if !defined(__DOXYGEN__)
+			static inline void Buttons_Init(void)
+			{
+				AVR32_GPIO.port[BUTTONS_PORT].gpers = (BUTTONS_BUTTON1 | BUTTONS_BUTTON2);
+				AVR32_GPIO.port[BUTTONS_PORT].puers = (BUTTONS_BUTTON1 | BUTTONS_BUTTON2);
+			}
+
+			static inline void Buttons_Disable(void)
+			{
+				AVR32_GPIO.port[BUTTONS_PORT].gperc = (BUTTONS_BUTTON1 | BUTTONS_BUTTON2);
+				AVR32_GPIO.port[BUTTONS_PORT].puerc = (BUTTONS_BUTTON1 | BUTTONS_BUTTON2);
+			}
+
+			static inline uint32_t Buttons_GetStatus(void) ATTR_WARN_UNUSED_RESULT;
+			static inline uint32_t Buttons_GetStatus(void)
+			{
+				return (~(AVR32_GPIO.port[JOY_MOVE_PORT].pvr & (BUTTONS_BUTTON1 | BUTTONS_BUTTON2)));
+			}
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/UC3/EVK1100/Joystick.h b/lib/lufa/LUFA/Drivers/Board/UC3/EVK1100/Joystick.h
new file mode 100644
index 0000000000..7117bc519d
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/UC3/EVK1100/Joystick.h
@@ -0,0 +1,122 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific joystick driver header for the Atmel EVK1100.
+ *  \copydetails Group_Joystick_EVK1100
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the joystick driver
+ *        dispatch header located in LUFA/Drivers/Board/Joystick.h.
+ */
+
+/** \ingroup Group_Joystick
+ *  \defgroup Group_Joystick_EVK1100 EVK1100
+ *  \brief Board specific joystick driver header for the Atmel EVK1100.
+ *
+ *  Board specific joystick driver header for the Atmel EVK1100.
+ *
+ *  <table>
+ *    <tr><th>Left Port Pin</th><th>Up Port Pin</th><th>Right Port Pin</th><th>Down Port Pin</th><th>Press Port Pin</th></tr>
+ *    <tr><td>GPIO25</td><td>GPIO26</td><td>GPIO28</td><td>GPIO27</td><td>GPIO20</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __JOYSTICK_EVK1100_H__
+#define __JOYSTICK_EVK1100_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_JOYSTICK_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Joystick.h instead.
+		#endif
+
+	/* Private Interface - For use in library only: */
+	#if !defined(__DOXYGEN__)
+		/* Macros: */
+			#define JOY_PORT                 0
+			#define JOY_MASK                ((1UL << 28) | (1UL << 27) | (1UL << 26) | (1UL << 25) | (1UL << 20))
+	#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Mask for the joystick being pushed in the left direction. */
+			#define JOY_LEFT                  (1UL << 25)
+
+			/** Mask for the joystick being pushed in the upward direction. */
+			#define JOY_UP                    (1UL << 26)
+
+			/** Mask for the joystick being pushed in the right direction. */
+			#define JOY_RIGHT                 (1UL << 28)
+
+			/** Mask for the joystick being pushed in the downward direction. */
+			#define JOY_DOWN                  (1UL << 27)
+
+			/** Mask for the joystick being pushed inward. */
+			#define JOY_PRESS                 (1UL << 20)
+
+		/* Inline Functions: */
+		#if !defined(__DOXYGEN__)
+			static inline void Joystick_Init(void)
+			{
+				AVR32_GPIO.port[JOY_PORT].gpers = JOY_MASK;
+				AVR32_GPIO.port[JOY_PORT].gpers = JOY_MASK;
+			};
+
+			static inline void Joystick_Disable(void)
+			{
+				AVR32_GPIO.port[JOY_PORT].gperc = JOY_MASK;
+				AVR32_GPIO.port[JOY_PORT].gperc = JOY_MASK;
+			};
+
+			static inline uint32_t Joystick_GetStatus(void) ATTR_WARN_UNUSED_RESULT;
+			static inline uint32_t Joystick_GetStatus(void)
+			{
+				return (uint32_t)(~(AVR32_GPIO.port[JOY_PORT].pvr & JOY_MASK));
+			}
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/UC3/EVK1100/LEDs.h b/lib/lufa/LUFA/Drivers/Board/UC3/EVK1100/LEDs.h
new file mode 100644
index 0000000000..ca6a37f3ed
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/UC3/EVK1100/LEDs.h
@@ -0,0 +1,173 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific LED driver header for the Atmel EVK1100.
+ *  \copydetails Group_LEDs_EVK1100
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the LEDs driver
+ *        dispatch header located in LUFA/Drivers/Board/LEDs.h.
+ */
+
+/** \ingroup Group_LEDs
+ *  \defgroup Group_LEDs_EVK1100 EVK1100
+ *  \brief Board specific LED driver header for the Atmel EVK1100.
+ *
+ *  Board specific LED driver header for the Atmel EVK1100.
+ *
+ *  <table>
+ *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr>
+ *    <tr><td>LEDS_LED1</td><td>Green</td><td>LED0 LED</td><td>Low</td><td>GPIO51</td></tr>
+ *    <tr><td>LEDS_LED2</td><td>Green</td><td>LED1 LED</td><td>Low</td><td>GPIO52</td></tr>
+ *    <tr><td>LEDS_LED3</td><td>Green</td><td>LED2 LED</td><td>Low</td><td>GPIO53</td></tr>
+ *    <tr><td>LEDS_LED4</td><td>Green</td><td>LED3 LED</td><td>Low</td><td>GPIO54</td></tr>
+ *    <tr><td>LEDS_LED5</td><td>Green</td><td>LED4 LED</td><td>Low</td><td>GPIO59</td></tr>
+ *    <tr><td>LEDS_LED6</td><td>Green</td><td>LED5 LED</td><td>Low</td><td>GPIO60</td></tr>
+ *    <tr><td>LEDS_LED7</td><td>Green</td><td>LED6 LED</td><td>Low</td><td>GPIO61</td></tr>
+ *    <tr><td>LEDS_LED8</td><td>Green</td><td>LED7 LED</td><td>Low</td><td>GPIO62</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __LEDS_EVK1100_H__
+#define __LEDS_EVK1100_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_LEDS_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/LEDS.h instead.
+		#endif
+
+	/* Private Interface - For use in library only: */
+	#if !defined(__DOXYGEN__)
+		/* Macros: */
+			#define LEDS_PORT        1
+	#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** LED mask for the first LED on the board. */
+			#define LEDS_LED1        (1UL << 19)
+
+			/** LED mask for the second LED on the board. */
+			#define LEDS_LED2        (1UL << 20)
+
+			/** LED mask for the third LED on the board. */
+			#define LEDS_LED3        (1UL << 21)
+
+			/** LED mask for the fourth LED on the board. */
+			#define LEDS_LED4        (1UL << 22)
+
+			/** LED mask for the fifth LED on the board. */
+			#define LEDS_LED5        (1UL << 27)
+
+			/** LED mask for the sixth LED on the board. */
+			#define LEDS_LED6        (1UL << 28)
+
+			/** LED mask for the seventh LED on the board. */
+			#define LEDS_LED7        (1UL << 29)
+
+			/** LED mask for the eighth LED on the board. */
+			#define LEDS_LED8        (1UL << 30)
+
+			/** LED mask for all the LEDs on the board. */
+			#define LEDS_ALL_LEDS    (LEDS_LED1 | LEDS_LED2 | LEDS_LED3 | LEDS_LED4 \
+			                          LEDS_LED5 | LEDS_LED6 | LEDS_LED7 | LEDS_LED8)
+
+			/** LED mask for the none of the board LEDs */
+			#define LEDS_NO_LEDS     0
+
+		/* Inline Functions: */
+		#if !defined(__DOXYGEN__)
+			static inline void LEDs_Init(void)
+			{
+				AVR32_GPIO.port[LEDS_PORT].gpers = LEDS_ALL_LEDS;
+				AVR32_GPIO.port[LEDS_PORT].oders = LEDS_ALL_LEDS;
+				AVR32_GPIO.port[LEDS_PORT].ovrs  = LEDS_ALL_LEDS;
+			}
+
+			static inline void LEDs_Disable(void)
+			{
+				AVR32_GPIO.port[LEDS_PORT].gperc = LEDS_ALL_LEDS;
+				AVR32_GPIO.port[LEDS_PORT].oderc = LEDS_ALL_LEDS;
+				AVR32_GPIO.port[LEDS_PORT].ovrc  = LEDS_ALL_LEDS;
+			}
+
+			static inline void LEDs_TurnOnLEDs(const uint32_t LEDMask)
+			{
+				AVR32_GPIO.port[LEDS_PORT].ovrc  = LEDMask;
+			}
+
+			static inline void LEDs_TurnOffLEDs(const uint32_t LEDMask)
+			{
+				AVR32_GPIO.port[LEDS_PORT].ovrs  = LEDMask;
+			}
+
+			static inline void LEDs_SetAllLEDs(const uint32_t LEDMask)
+			{
+				AVR32_GPIO.port[LEDS_PORT].ovrs  = LEDS_ALL_LEDS;
+				AVR32_GPIO.port[LEDS_PORT].ovrc  = LEDMask;
+			}
+
+			static inline void LEDs_ChangeLEDs(const uint32_t LEDMask, const uint32_t ActiveMask)
+			{
+				AVR32_GPIO.port[LEDS_PORT].ovrs  = LEDMask;
+				AVR32_GPIO.port[LEDS_PORT].ovrc  = ActiveMask;
+			}
+
+			static inline void LEDs_ToggleLEDs(const uint32_t LEDMask)
+			{
+				AVR32_GPIO.port[LEDS_PORT].ovrt  = LEDMask;
+			}
+
+			static inline uint32_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT;
+			static inline uint32_t LEDs_GetLEDs(void)
+			{
+				return (~AVR32_GPIO.port[LEDS_PORT].ovr & LEDS_ALL_LEDS);
+			}
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/UC3/EVK1101/Board.h b/lib/lufa/LUFA/Drivers/Board/UC3/EVK1101/Board.h
new file mode 100644
index 0000000000..46d79f00a4
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/UC3/EVK1101/Board.h
@@ -0,0 +1,86 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific information header for the Atmel EVK1101.
+ *  \copydetails Group_BoardInfo_EVK1101
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the Board driver
+ *        dispatch header located in LUFA/Drivers/Board/Board.h.
+ */
+
+/** \ingroup Group_BoardInfo
+ *  \defgroup Group_BoardInfo_EVK1101 EVK1101
+ *  \brief Board specific information header for the Atmel Atmel EVK1101.
+ *
+ *  Board specific information header for the Atmel Atmel EVK1101.
+ *
+ *  @{
+ */
+
+#ifndef __BOARD_EVK1101_H__
+#define __BOARD_EVK1101_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+		#include "../../Buttons.h"
+		#include "../../Joystick.h"
+		#include "../../LEDs.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_BOARD_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Indicates the board has hardware Buttons mounted. */
+			#define BOARD_HAS_BUTTONS
+
+			/** Indicates the board has a hardware Joystick mounted. */
+			#define BOARD_HAS_JOYSTICK
+
+			/** Indicates the board has hardware LEDs mounted. */
+			#define BOARD_HAS_LEDS
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/UC3/EVK1101/Buttons.h b/lib/lufa/LUFA/Drivers/Board/UC3/EVK1101/Buttons.h
new file mode 100644
index 0000000000..41bf42c668
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/UC3/EVK1101/Buttons.h
@@ -0,0 +1,113 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific Buttons driver header for the Atmel EVK1101.
+ *  \copydetails Group_Buttons_EVK1101
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the Buttons driver
+ *        dispatch header located in LUFA/Drivers/Board/Buttons.h.
+ */
+
+/** \ingroup Group_Buttons
+ *  \defgroup Group_Buttons_EVK1101 EVK1101
+ *  \brief Board specific Buttons driver header for the Atmel EVK1101.
+ *
+ *  Board specific Buttons driver header for the Atmel EVK1101.
+ *
+ *  <table>
+ *    <tr><th>Name</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr>
+ *    <tr><td>BUTTONS_BUTTON1</td><td>SW0 Button</td><td>Low</td><td>GPIO34</td></tr>
+ *    <tr><td>BUTTONS_BUTTON2</td><td>SW1 Button</td><td>Low</td><td>GPIO35</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __BUTTONS_EVK1101_H__
+#define __BUTTONS_EVK1101_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_BUTTONS_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Buttons.h instead.
+		#endif
+
+	/* Private Interface - For use in library only: */
+	#if !defined(__DOXYGEN__)
+		/* Macros: */
+			#define BUTTONS_PORT          1
+	#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Mask of the first button on the board */
+			#define BUTTONS_BUTTON1       (1UL << 2)
+
+			/** Mask of the second button on the board */
+			#define BUTTONS_BUTTON2       (1UL << 3)
+
+		/* Inline Functions: */
+		#if !defined(__DOXYGEN__)
+			static inline void Buttons_Init(void)
+			{
+				AVR32_GPIO.port[BUTTONS_PORT].gpers = (BUTTONS_BUTTON1 | BUTTONS_BUTTON2);
+				AVR32_GPIO.port[BUTTONS_PORT].puers = (BUTTONS_BUTTON1 | BUTTONS_BUTTON2);
+			}
+
+			static inline void Buttons_Disable(void)
+			{
+				AVR32_GPIO.port[BUTTONS_PORT].gperc = (BUTTONS_BUTTON1 | BUTTONS_BUTTON2);
+				AVR32_GPIO.port[BUTTONS_PORT].puerc = (BUTTONS_BUTTON1 | BUTTONS_BUTTON2);
+			}
+
+			static inline uint32_t Buttons_GetStatus(void) ATTR_WARN_UNUSED_RESULT;
+			static inline uint32_t Buttons_GetStatus(void)
+			{
+				return (~(AVR32_GPIO.port[BUTTONS_PORT].pvr & (BUTTONS_BUTTON1 | BUTTONS_BUTTON2)));
+			}
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/UC3/EVK1101/Joystick.h b/lib/lufa/LUFA/Drivers/Board/UC3/EVK1101/Joystick.h
new file mode 100644
index 0000000000..1351213017
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/UC3/EVK1101/Joystick.h
@@ -0,0 +1,131 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific joystick driver header for the Atmel EVK1101.
+ *  \copydetails Group_Joystick_EVK1101
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the joystick driver
+ *        dispatch header located in LUFA/Drivers/Board/Joystick.h.
+ */
+
+/** \ingroup Group_Joystick
+ *  \defgroup Group_Joystick_EVK1101 EVK1101
+ *  \brief Board specific joystick driver header for the Atmel EVK1101.
+ *
+ *  Board specific joystick driver header for the Atmel EVK1101.
+ *
+ *  <table>
+ *    <tr><th>Left Port Pin</th><th>Up Port Pin</th><th>Right Port Pin</th><th>Down Port Pin</th><th>Press Port Pin</th></tr>
+ *    <tr><td>GPIO38</td><td>GPIO39</td><td>GPIO41</td><td>GPIO40</td><td>GPIO13</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __JOYSTICK_EVK1101_H__
+#define __JOYSTICK_EVK1101_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_JOYSTICK_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Joystick.h instead.
+		#endif
+
+	/* Private Interface - For use in library only: */
+	#if !defined(__DOXYGEN__)
+		/* Macros: */
+			#define JOY_MOVE_PORT            1
+			#define JOY_MOVE_MASK            ((1UL << 6) | (1UL << 7) | (1UL << 8) | (1UL << 9))
+			#define JOY_PRESS_PORT           0
+			#define JOY_PRESS_MASK           (1UL << 13)
+	#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Mask for the joystick being pushed in the left direction. */
+			#define JOY_LEFT                  (1UL << 6)
+
+			/** Mask for the joystick being pushed in the upward direction. */
+			#define JOY_UP                    (1UL << 7)
+
+			/** Mask for the joystick being pushed in the right direction. */
+			#define JOY_RIGHT                 (1UL << 9)
+
+			/** Mask for the joystick being pushed in the downward direction. */
+			#define JOY_DOWN                  (1UL << 8)
+
+			/** Mask for the joystick being pushed inward. */
+			#define JOY_PRESS                 (1UL << 13)
+
+		/* Inline Functions: */
+		#if !defined(__DOXYGEN__)
+			static inline void Joystick_Init(void)
+			{
+				AVR32_GPIO.port[JOY_MOVE_PORT].gpers  = JOY_MOVE_MASK;
+				AVR32_GPIO.port[JOY_PRESS_PORT].gpers = JOY_PRESS_MASK;
+
+				AVR32_GPIO.port[JOY_MOVE_PORT].puers  = JOY_MOVE_MASK;
+				AVR32_GPIO.port[JOY_PRESS_PORT].puers = JOY_PRESS_MASK;
+			};
+
+			static inline void Joystick_Disable(void)
+			{
+				AVR32_GPIO.port[JOY_MOVE_PORT].gperc  = JOY_MOVE_MASK;
+				AVR32_GPIO.port[JOY_PRESS_PORT].gperc = JOY_PRESS_MASK;
+
+				AVR32_GPIO.port[JOY_MOVE_PORT].puerc  = JOY_MOVE_MASK;
+				AVR32_GPIO.port[JOY_PRESS_PORT].puerc = JOY_PRESS_MASK;
+			};
+
+			static inline uint32_t Joystick_GetStatus(void) ATTR_WARN_UNUSED_RESULT;
+			static inline uint32_t Joystick_GetStatus(void)
+			{
+				return (uint32_t)(~((AVR32_GPIO.port[JOY_MOVE_PORT].pvr  & JOY_MOVE_MASK) |
+				                    (AVR32_GPIO.port[JOY_PRESS_PORT].pvr & JOY_PRESS_MASK)));
+			}
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/UC3/EVK1101/LEDs.h b/lib/lufa/LUFA/Drivers/Board/UC3/EVK1101/LEDs.h
new file mode 100644
index 0000000000..71d45d2ad3
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/UC3/EVK1101/LEDs.h
@@ -0,0 +1,156 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific LED driver header for the Atmel EVK1101.
+ *  \copydetails Group_LEDs_EVK1101
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the LEDs driver
+ *        dispatch header located in LUFA/Drivers/Board/LEDs.h.
+ */
+
+/** \ingroup Group_LEDs
+ *  \defgroup Group_LEDs_EVK1101 EVK1101
+ *  \brief Board specific LED driver header for the Atmel EVK1101.
+ *
+ *  Board specific LED driver header for the Atmel EVK1101.
+ *
+ *  <table>
+ *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr>
+ *    <tr><td>LEDS_LED1</td><td>Green</td><td>LED0 LED</td><td>Low</td><td>GPIO7</td></tr>
+ *    <tr><td>LEDS_LED2</td><td>Green</td><td>LED1 LED</td><td>Low</td><td>GPIO8</td></tr>
+ *    <tr><td>LEDS_LED3</td><td>Green</td><td>LED2 LED</td><td>Low</td><td>GPIO21</td></tr>
+ *    <tr><td>LEDS_LED4</td><td>Green</td><td>LED3 LED</td><td>Low</td><td>GPIO22</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __LEDS_EVK1101_H__
+#define __LEDS_EVK1101_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_LEDS_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/LEDS.h instead.
+		#endif
+
+	/* Private Interface - For use in library only: */
+	#if !defined(__DOXYGEN__)
+		/* Macros: */
+			#define LEDS_PORT        0
+	#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** LED mask for the first LED on the board. */
+			#define LEDS_LED1        (1UL << 7)
+
+			/** LED mask for the second LED on the board. */
+			#define LEDS_LED2        (1UL << 8)
+
+			/** LED mask for the third LED on the board. */
+			#define LEDS_LED3        (1UL << 21)
+
+			/** LED mask for the fourth LED on the board. */
+			#define LEDS_LED4        (1UL << 22)
+
+			/** LED mask for all the LEDs on the board. */
+			#define LEDS_ALL_LEDS    (LEDS_LED1 | LEDS_LED2 | LEDS_LED3 | LEDS_LED4)
+
+			/** LED mask for the none of the board LEDs */
+			#define LEDS_NO_LEDS     0
+
+		/* Inline Functions: */
+		#if !defined(__DOXYGEN__)
+			static inline void LEDs_Init(void)
+			{
+				AVR32_GPIO.port[LEDS_PORT].gpers = LEDS_ALL_LEDS;
+				AVR32_GPIO.port[LEDS_PORT].oders = LEDS_ALL_LEDS;
+				AVR32_GPIO.port[LEDS_PORT].ovrs  = LEDS_ALL_LEDS;
+			}
+
+			static inline void LEDs_Disable(void)
+			{
+				AVR32_GPIO.port[LEDS_PORT].gperc = LEDS_ALL_LEDS;
+				AVR32_GPIO.port[LEDS_PORT].oderc = LEDS_ALL_LEDS;
+				AVR32_GPIO.port[LEDS_PORT].ovrc  = LEDS_ALL_LEDS;
+			}
+
+			static inline void LEDs_TurnOnLEDs(const uint32_t LEDMask)
+			{
+				AVR32_GPIO.port[LEDS_PORT].ovrc  = LEDMask;
+			}
+
+			static inline void LEDs_TurnOffLEDs(const uint32_t LEDMask)
+			{
+				AVR32_GPIO.port[LEDS_PORT].ovrs  = LEDMask;
+			}
+
+			static inline void LEDs_SetAllLEDs(const uint32_t LEDMask)
+			{
+				AVR32_GPIO.port[LEDS_PORT].ovrs  = LEDS_ALL_LEDS;
+				AVR32_GPIO.port[LEDS_PORT].ovrc  = LEDMask;
+			}
+
+			static inline void LEDs_ChangeLEDs(const uint32_t LEDMask, const uint32_t ActiveMask)
+			{
+				AVR32_GPIO.port[LEDS_PORT].ovrs  = LEDMask;
+				AVR32_GPIO.port[LEDS_PORT].ovrc  = ActiveMask;
+			}
+
+			static inline void LEDs_ToggleLEDs(const uint32_t LEDMask)
+			{
+				AVR32_GPIO.port[LEDS_PORT].ovrt  = LEDMask;
+			}
+
+			static inline uint32_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT;
+			static inline uint32_t LEDs_GetLEDs(void)
+			{
+				return (~AVR32_GPIO.port[LEDS_PORT].ovr & LEDS_ALL_LEDS);
+			}
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/UC3/EVK1104/Board.h b/lib/lufa/LUFA/Drivers/Board/UC3/EVK1104/Board.h
new file mode 100644
index 0000000000..0c8b762d71
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/UC3/EVK1104/Board.h
@@ -0,0 +1,82 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific information header for the Atmel EVK1104.
+ *  \copydetails Group_BoardInfo_EVK1104
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the Board driver
+ *        dispatch header located in LUFA/Drivers/Board/Board.h.
+ */
+
+/** \ingroup Group_BoardInfo
+ *  \defgroup Group_BoardInfo_EVK1104 EVK1104
+ *  \brief Board specific information header for the Atmel Atmel EVK1104.
+ *
+ *  Board specific information header for the Atmel Atmel EVK1104.
+ *
+ *  @{
+ */
+
+#ifndef __BOARD_EVK1104_H__
+#define __BOARD_EVK1104_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+		#include "../../Buttons.h"
+		#include "../../LEDs.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_BOARD_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Indicates the board has hardware Buttons mounted. */
+			#define BOARD_HAS_BUTTONS
+
+			/** Indicates the board has hardware LEDs mounted. */
+			#define BOARD_HAS_LEDS
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/UC3/EVK1104/Buttons.h b/lib/lufa/LUFA/Drivers/Board/UC3/EVK1104/Buttons.h
new file mode 100644
index 0000000000..d12fda5739
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/UC3/EVK1104/Buttons.h
@@ -0,0 +1,109 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific Buttons driver header for the Atmel EVK1104.
+ *  \copydetails Group_Buttons_EVK1104
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the Buttons driver
+ *        dispatch header located in LUFA/Drivers/Board/Buttons.h.
+ */
+
+/** \ingroup Group_Buttons
+ *  \defgroup Group_Buttons_EVK1104 EVK1104
+ *  \brief Board specific Buttons driver header for the Atmel EVK1104.
+ *
+ *  Board specific Buttons driver header for the Atmel EVK1104.
+ *
+ *  <table>
+ *    <tr><th>Name</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr>
+ *    <tr><td>BUTTONS_BUTTON1</td><td>SW0 Button</td><td>Low</td><td>GPIO42</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __BUTTONS_EVK1104_H__
+#define __BUTTONS_EVK1104_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_BUTTONS_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Buttons.h instead.
+		#endif
+
+	/* Private Interface - For use in library only: */
+	#if !defined(__DOXYGEN__)
+		/* Macros: */
+			#define BUTTONS_PORT          1
+	#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Mask of the first button on the board */
+			#define BUTTONS_BUTTON1       (1UL << 10)
+
+		/* Inline Functions: */
+		#if !defined(__DOXYGEN__)
+			static inline void Buttons_Init(void)
+			{
+				AVR32_GPIO.port[BUTTONS_PORT].gpers = (BUTTONS_BUTTON1 | BUTTONS_BUTTON2);
+				AVR32_GPIO.port[BUTTONS_PORT].puers = (BUTTONS_BUTTON1 | BUTTONS_BUTTON2);
+			}
+
+			static inline void Buttons_Disable(void)
+			{
+				AVR32_GPIO.port[BUTTONS_PORT].gperc = (BUTTONS_BUTTON1 | BUTTONS_BUTTON2);
+				AVR32_GPIO.port[BUTTONS_PORT].puerc = (BUTTONS_BUTTON1 | BUTTONS_BUTTON2);
+			}
+
+			static inline uint32_t Buttons_GetStatus(void) ATTR_WARN_UNUSED_RESULT;
+			static inline uint32_t Buttons_GetStatus(void)
+			{
+				return (~(AVR32_GPIO.port[JOY_MOVE_PORT].pvr & (BUTTONS_BUTTON1 | BUTTONS_BUTTON2)));
+			}
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/UC3/EVK1104/LEDs.h b/lib/lufa/LUFA/Drivers/Board/UC3/EVK1104/LEDs.h
new file mode 100644
index 0000000000..793ea86dea
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/UC3/EVK1104/LEDs.h
@@ -0,0 +1,174 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific LED driver header for the Atmel EVK1104.
+ *  \copydetails Group_LEDs_EVK1104
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the LEDs driver
+ *        dispatch header located in LUFA/Drivers/Board/LEDs.h.
+ */
+
+/** \ingroup Group_LEDs
+ *  \defgroup Group_LEDs_EVK1104 EVK1104
+ *  \brief Board specific LED driver header for the Atmel EVK1104.
+ *
+ *  Board specific LED driver header for the Atmel EVK1104.
+ *
+ *  <table>
+ *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr>
+ *    <tr><td>LEDS_LED1</td><td>Green</td><td>LED0 LED</td><td>Low</td><td>GPIO67</td></tr>
+ *    <tr><td>LEDS_LED2</td><td>Green</td><td>LED1 LED</td><td>Low</td><td>GPIO101</td></tr>
+ *    <tr><td>LEDS_LED3</td><td>Green</td><td>LED2 LED</td><td>Low</td><td>GPIO102</td></tr>
+ *    <tr><td>LEDS_LED4</td><td>Green</td><td>LED3 LED</td><td>Low</td><td>GPIO105</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __LEDS_EVK1104_H__
+#define __LEDS_EVK1104_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_LEDS_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/LEDS.h instead.
+		#endif
+
+	/* Private Interface - For use in library only: */
+	#if !defined(__DOXYGEN__)
+		/* Macros: */
+			#define LEDS_LEDMASK2    (1UL << 3)
+			#define LEDS_LEDMASK3   ((1UL << 9) | (1UL << 6) | (1UL << 5))
+	#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** LED mask for the first LED on the board. */
+			#define LEDS_LED1        (1UL << 3)
+
+			/** LED mask for the second LED on the board. */
+			#define LEDS_LED2        (1UL << 5)
+
+			/** LED mask for the third LED on the board. */
+			#define LEDS_LED3        (1UL << 9)
+
+			/** LED mask for the fourth LED on the board. */
+			#define LEDS_LED4        (1UL << 6)
+
+			/** LED mask for all the LEDs on the board. */
+			#define LEDS_ALL_LEDS    (LEDS_LED1 | LEDS_LED2 | LEDS_LED3 | LEDS_LED4)
+
+			/** LED mask for the none of the board LEDs */
+			#define LEDS_NO_LEDS     0
+
+		/* Inline Functions: */
+		#if !defined(__DOXYGEN__)
+			static inline void LEDs_Init(void)
+			{
+				AVR32_GPIO.port[2].gpers = LEDS_LEDMASK2;
+				AVR32_GPIO.port[2].oders = LEDS_LEDMASK2;
+				AVR32_GPIO.port[2].ovrs  = LEDS_LEDMASK2;
+
+				AVR32_GPIO.port[3].gpers = LEDS_LEDMASK3;
+				AVR32_GPIO.port[3].oders = LEDS_LEDMASK3;
+				AVR32_GPIO.port[3].ovrs  = LEDS_LEDMASK3;
+			}
+
+			static inline void LEDs_Disable(void)
+			{
+				AVR32_GPIO.port[2].gperc = LEDS_LEDMASK2;
+				AVR32_GPIO.port[2].oderc = LEDS_LEDMASK2;
+				AVR32_GPIO.port[2].ovrc  = LEDS_LEDMASK2;
+
+				AVR32_GPIO.port[3].gperc = LEDS_LEDMASK3;
+				AVR32_GPIO.port[3].oderc = LEDS_LEDMASK3;
+				AVR32_GPIO.port[3].ovrc  = LEDS_LEDMASK3;
+			}
+
+			static inline void LEDs_TurnOnLEDs(const uint32_t LEDMask)
+			{
+				AVR32_GPIO.port[2].ovrc  = (LEDMask & LEDS_LEDMASK2);
+				AVR32_GPIO.port[3].ovrc  = (LEDMask & LEDS_LEDMASK3);
+			}
+
+			static inline void LEDs_TurnOffLEDs(const uint32_t LEDMask)
+			{
+				AVR32_GPIO.port[2].ovrs  = (LEDMask & LEDS_LEDMASK2);
+				AVR32_GPIO.port[3].ovrs  = (LEDMask & LEDS_LEDMASK3);
+			}
+
+			static inline void LEDs_SetAllLEDs(const uint32_t LEDMask)
+			{
+				AVR32_GPIO.port[2].ovrs  = LEDS_LEDMASK2;
+				AVR32_GPIO.port[2].ovrc  = (LEDMask & LEDS_LEDMASK2);
+
+				AVR32_GPIO.port[3].ovrs  = LEDS_LEDMASK3;
+				AVR32_GPIO.port[3].ovrc  = (LEDMask & LEDS_LEDMASK3);
+			}
+
+			static inline void LEDs_ChangeLEDs(const uint32_t LEDMask, const uint32_t ActiveMask)
+			{
+				AVR32_GPIO.port[2].ovrs  = (LEDMask    & LEDS_LEDMASK2);
+				AVR32_GPIO.port[2].ovrc  = (ActiveMask & LEDS_LEDMASK2);
+
+				AVR32_GPIO.port[3].ovrs  = (LEDMask    & LEDS_LEDMASK3);
+				AVR32_GPIO.port[3].ovrc  = (ActiveMask & LEDS_LEDMASK3);
+			}
+
+			static inline void LEDs_ToggleLEDs(const uint32_t LEDMask)
+			{
+				AVR32_GPIO.port[2].ovrt  = (LEDMask & LEDS_LEDMASK2);
+				AVR32_GPIO.port[3].ovrt  = (LEDMask & LEDS_LEDMASK3);
+			}
+
+			static inline uint32_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT;
+			static inline uint32_t LEDs_GetLEDs(void)
+			{
+				return ((~AVR32_GPIO.port[2].ovr & LEDS_LEDMASK2) | (~AVR32_GPIO.port[3].ovr & LEDS_LEDMASK3));
+			}
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/UC3/UC3A3_XPLAINED/Board.h b/lib/lufa/LUFA/Drivers/Board/UC3/UC3A3_XPLAINED/Board.h
new file mode 100644
index 0000000000..94abc3e49d
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/UC3/UC3A3_XPLAINED/Board.h
@@ -0,0 +1,82 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific information header for the Atmel UC3-A3 Xplained.
+ *  \copydetails Group_BoardInfo_UC3_A3_XPLAINED
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the Board driver
+ *        dispatch header located in LUFA/Drivers/Board/Board.h.
+ */
+
+/** \ingroup Group_BoardInfo
+ *  \defgroup Group_BoardInfo_UC3_A3_XPLAINED UC3_A3_XPLAINED
+ *  \brief Board specific information header for the Atmel UC3-A3 Xplained.
+ *
+ *  Board specific information header for the Atmel UC3-A3 Xplained.
+ *
+ *  @{
+ */
+
+#ifndef __BOARD_UC3_A3_XPLAINED_H__
+#define __BOARD_UC3_A3_XPLAINED_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+		#include "../../Buttons.h"
+		#include "../../LEDs.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_BOARD_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Indicates the board has hardware Buttons mounted. */
+			#define BOARD_HAS_BUTTONS
+
+			/** Indicates the board has hardware LEDs mounted. */
+			#define BOARD_HAS_LEDS
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/UC3/UC3A3_XPLAINED/Buttons.h b/lib/lufa/LUFA/Drivers/Board/UC3/UC3A3_XPLAINED/Buttons.h
new file mode 100644
index 0000000000..879373e0ed
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/UC3/UC3A3_XPLAINED/Buttons.h
@@ -0,0 +1,109 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific Buttons driver header for the Atmel UC3-A3 Xplained.
+ *  \copydetails Group_Buttons_UC3A3_XPLAINED
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the Buttons driver
+ *        dispatch header located in LUFA/Drivers/Board/Buttons.h.
+ */
+
+/** \ingroup Group_Buttons
+ *  \defgroup Group_Buttons_UC3A3_XPLAINED UC3A3_XPLAINED
+ *  \brief Board specific Buttons driver header for the Atmel UC3-A3 Xplained.
+ *
+ *  Board specific Buttons driver header for the Atmel UC3-A3 Xplained.
+ *
+ *  <table>
+ *    <tr><th>Name</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr>
+ *    <tr><td>BUTTONS_BUTTON1</td><td>SW0 Button</td><td>Low</td><td>GPIO32</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __BUTTONS_UC3A3_XPLAINED_H__
+#define __BUTTONS_UC3A3_XPLAINED_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_BUTTONS_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Buttons.h instead.
+		#endif
+
+	/* Private Interface - For use in library only: */
+	#if !defined(__DOXYGEN__)
+		/* Macros: */
+			#define BUTTONS_PORT          1
+	#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Mask of the first button on the board */
+			#define BUTTONS_BUTTON1       (1UL << 0)
+
+		/* Inline Functions: */
+		#if !defined(__DOXYGEN__)
+			static inline void Buttons_Init(void)
+			{
+				AVR32_GPIO.port[BUTTONS_PORT].gpers = (BUTTONS_BUTTON1 | BUTTONS_BUTTON2);
+				AVR32_GPIO.port[BUTTONS_PORT].puers = (BUTTONS_BUTTON1 | BUTTONS_BUTTON2);
+			}
+
+			static inline void Buttons_Disable(void)
+			{
+				AVR32_GPIO.port[BUTTONS_PORT].gperc = (BUTTONS_BUTTON1 | BUTTONS_BUTTON2);
+				AVR32_GPIO.port[BUTTONS_PORT].puerc = (BUTTONS_BUTTON1 | BUTTONS_BUTTON2);
+			}
+
+			static inline uint32_t Buttons_GetStatus(void) ATTR_WARN_UNUSED_RESULT;
+			static inline uint32_t Buttons_GetStatus(void)
+			{
+				return (~(AVR32_GPIO.port[JOY_MOVE_PORT].pvr & (BUTTONS_BUTTON1 | BUTTONS_BUTTON2)));
+			}
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/UC3/UC3A3_XPLAINED/LEDs.h b/lib/lufa/LUFA/Drivers/Board/UC3/UC3A3_XPLAINED/LEDs.h
new file mode 100644
index 0000000000..cbd2bde32d
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/UC3/UC3A3_XPLAINED/LEDs.h
@@ -0,0 +1,182 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific LED driver header for the Atmel UC3-A3 Xplained.
+ *  \copydetails Group_LEDs_UC3A3_XPLAINED
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the LEDs driver
+ *        dispatch header located in LUFA/Drivers/Board/LEDs.h.
+ */
+
+/** \ingroup Group_LEDs
+ *  \defgroup Group_LEDs_UC3A3_XPLAINED UC3A3_XPLAINED
+ *  \brief Board specific LED driver header for the Atmel UC3-A3 Xplained.
+ *
+ *  Board specific LED driver header for the Atmel UC3-A3 Xplained.
+ *
+ *  <table>
+ *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr>
+ *    <tr><td>LEDS_LED1</td><td>Yellow</td><td>LED0 LED</td><td>Low</td><td>GPIO35</td></tr>
+ *    <tr><td>LEDS_LED2</td><td>Yellow</td><td>LED1 LED</td><td>Low</td><td>GPIO73</td></tr>
+ *    <tr><td>LEDS_LED3</td><td>Yellow</td><td>LED2 LED</td><td>Low</td><td>GPIO34</td></tr>
+ *    <tr><td>LEDS_LED4</td><td>Yellow</td><td>LED3 LED</td><td>Low</td><td>GPIO38</td></tr>
+ *    <tr><td>LEDS_LED5</td><td>Green</td><td>Status</td><td>Low</td><td>GPIO50</td></tr>
+ *    <tr><td>LEDS_LED6</td><td>Red</td><td>Power</td><td>High</td><td>GPIO49</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __LEDS_UC3A3_XPLAINED_H__
+#define __LEDS_UC3A3_XPLAINED_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_LEDS_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/LEDS.h instead.
+		#endif
+
+	/* Private Interface - For use in library only: */
+	#if !defined(__DOXYGEN__)
+		/* Macros: */
+			#define LEDS_LEDMASK1   ((1UL << 3) | (1UL << 2) | (1UL << 6) | (1UL << 18) | (1UL << 17))
+			#define LEDS_LEDMASK3    (1UL << 9)
+	#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** LED mask for the first LED on the board. */
+			#define LEDS_LED1        (1UL << 3)
+
+			/** LED mask for the second LED on the board. */
+			#define LEDS_LED2        (1UL << 9)
+
+			/** LED mask for the third LED on the board. */
+			#define LEDS_LED3        (1UL << 2)
+
+			/** LED mask for the fourth LED on the board. */
+			#define LEDS_LED4        (1UL << 6)
+
+			/** LED mask for the fifth LED on the board. */
+			#define LEDS_LED5        (1UL << 18)
+
+			/** LED mask for the sixth LED on the board. */
+			#define LEDS_LED6        (1UL << 17)
+
+			/** LED mask for all the LEDs on the board. */
+			#define LEDS_ALL_LEDS    (LEDS_LED1 | LEDS_LED2 | LEDS_LED3 | LEDS_LED4 | LEDS_LED5 | LEDS_LED6)
+
+			/** LED mask for the none of the board LEDs */
+			#define LEDS_NO_LEDS     0
+
+		/* Inline Functions: */
+		#if !defined(__DOXYGEN__)
+			static inline void LEDs_Init(void)
+			{
+				AVR32_GPIO.port[1].gpers = LEDS_LEDMASK1;
+				AVR32_GPIO.port[1].oders = LEDS_LEDMASK1;
+				AVR32_GPIO.port[1].ovrs  = LEDS_LEDMASK1;
+
+				AVR32_GPIO.port[3].gpers = LEDS_LEDMASK3;
+				AVR32_GPIO.port[3].oders = LEDS_LEDMASK3;
+				AVR32_GPIO.port[3].ovrs  = LEDS_LEDMASK3;
+			}
+
+			static inline void LEDs_Disable(void)
+			{
+				AVR32_GPIO.port[1].gperc = LEDS_LEDMASK1;
+				AVR32_GPIO.port[1].oderc = LEDS_LEDMASK1;
+				AVR32_GPIO.port[1].ovrc  = LEDS_LEDMASK1;
+
+				AVR32_GPIO.port[3].gperc = LEDS_LEDMASK3;
+				AVR32_GPIO.port[3].oderc = LEDS_LEDMASK3;
+				AVR32_GPIO.port[3].ovrc  = LEDS_LEDMASK3;
+			}
+
+			static inline void LEDs_TurnOnLEDs(const uint32_t LEDMask)
+			{
+				AVR32_GPIO.port[1].ovrc  = (LEDMask & LEDS_LEDMASK1);
+				AVR32_GPIO.port[3].ovrc  = (LEDMask & LEDS_LEDMASK3);
+			}
+
+			static inline void LEDs_TurnOffLEDs(const uint32_t LEDMask)
+			{
+				AVR32_GPIO.port[1].ovrs  = (LEDMask & LEDS_LEDMASK1);
+				AVR32_GPIO.port[3].ovrs  = (LEDMask & LEDS_LEDMASK3);
+			}
+
+			static inline void LEDs_SetAllLEDs(const uint32_t LEDMask)
+			{
+				AVR32_GPIO.port[1].ovrs  = LEDS_LEDMASK1;
+				AVR32_GPIO.port[1].ovrc  = (LEDMask & LEDS_LEDMASK1);
+
+				AVR32_GPIO.port[3].ovrs  = LEDS_LEDMASK3;
+				AVR32_GPIO.port[3].ovrc  = (LEDMask & LEDS_LEDMASK3);
+			}
+
+			static inline void LEDs_ChangeLEDs(const uint32_t LEDMask, const uint32_t ActiveMask)
+			{
+				AVR32_GPIO.port[1].ovrs  = (LEDMask    & LEDS_LEDMASK1);
+				AVR32_GPIO.port[1].ovrc  = (ActiveMask & LEDS_LEDMASK1);
+
+				AVR32_GPIO.port[3].ovrs  = (LEDMask    & LEDS_LEDMASK3);
+				AVR32_GPIO.port[3].ovrc  = (ActiveMask & LEDS_LEDMASK3);
+			}
+
+			static inline void LEDs_ToggleLEDs(const uint32_t LEDMask)
+			{
+				AVR32_GPIO.port[1].ovrt  = (LEDMask & LEDS_LEDMASK1);
+				AVR32_GPIO.port[3].ovrt  = (LEDMask & LEDS_LEDMASK3);
+			}
+
+			static inline uint32_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT;
+			static inline uint32_t LEDs_GetLEDs(void)
+			{
+				return ((~AVR32_GPIO.port[1].ovr & LEDS_LEDMASK1) | (~AVR32_GPIO.port[3].ovr & LEDS_LEDMASK3));
+			}
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/XMEGA/A3BU_XPLAINED/Board.h b/lib/lufa/LUFA/Drivers/Board/XMEGA/A3BU_XPLAINED/Board.h
new file mode 100644
index 0000000000..2bc2377c2d
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/XMEGA/A3BU_XPLAINED/Board.h
@@ -0,0 +1,86 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific information header for the Atmel XMEGA A3BU Xplained.
+ *  \copydetails Group_BoardInfo_A3BU_XPLAINED
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the Board driver
+ *        dispatch header located in LUFA/Drivers/Board/Board.h.
+ */
+
+/** \ingroup Group_BoardInfo
+ *  \defgroup Group_BoardInfo_A3BU_XPLAINED A3BU_XPLAINED
+ *  \brief Board specific information header for the Atmel XMEGA A3BU Xplained.
+ *
+ *  Board specific information header for the Atmel XMEGA A3BU Xplained.
+ *
+ *  @{
+ */
+
+#ifndef __BOARD_A3BU_XPLAINED_H__
+#define __BOARD_A3BU_XPLAINED_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+		#include "../../Buttons.h"
+		#include "../../Dataflash.h"
+		#include "../../LEDs.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_BOARD_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Indicates the board has hardware Buttons mounted. */
+			#define BOARD_HAS_BUTTONS
+
+			/** Indicates the board has a hardware Dataflash mounted. */
+			#define BOARD_HAS_DATAFLASH
+
+			/** Indicates the board has hardware LEDs mounted. */
+			#define BOARD_HAS_LEDS
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/XMEGA/A3BU_XPLAINED/Buttons.h b/lib/lufa/LUFA/Drivers/Board/XMEGA/A3BU_XPLAINED/Buttons.h
new file mode 100644
index 0000000000..901869d35e
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/XMEGA/A3BU_XPLAINED/Buttons.h
@@ -0,0 +1,119 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific Buttons driver header for the Atmel XMEGA A3BU Xplained.
+ *  \copydetails Group_Buttons_A3BU_XPLAINED
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the Buttons driver
+ *        dispatch header located in LUFA/Drivers/Board/Buttons.h.
+ */
+
+/** \ingroup Group_Buttons
+ *  \defgroup Group_Buttons_A3BU_XPLAINED A3BU_XPLAINED
+ *  \brief Board specific Buttons driver header for the Atmel XMEGA A3BU Xplained.
+ *
+ *  Board specific Buttons driver header for the Atmel XMEGA A3BU Xplained.
+ *
+ *  <table>
+ *    <tr><th>Name</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr>
+ *    <tr><td>BUTTONS_BUTTON1</td><td>SW0 Button</td><td>Low</td><td>PORTE.5</td></tr>
+ *    <tr><td>BUTTONS_BUTTON2</td><td>SW1 Button</td><td>Low</td><td>PORTF.1</td></tr>
+ *    <tr><td>BUTTONS_BUTTON3</td><td>SW2 Button</td><td>Low</td><td>PORTF.2</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __BUTTONS_A3BU_XPLAINED_H__
+#define __BUTTONS_A3BU_XPLAINED_H__
+
+	/* Includes: */
+		#include <avr/io.h>
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_BUTTONS_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Buttons.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Button mask for the first button on the board. */
+			#define BUTTONS_BUTTON1          (1 << 5)
+
+			/** Button mask for the second button on the board. */
+			#define BUTTONS_BUTTON2          (1 << 1)
+
+			/** Button mask for the third button on the board. */
+			#define BUTTONS_BUTTON3          (1 << 2)
+
+		/* Inline Functions: */
+		#if !defined(__DOXYGEN__)
+			static inline void Buttons_Init(void)
+			{
+				PORTE.OUTCLR   = BUTTONS_BUTTON1;
+				PORTE.PIN5CTRL = (PORT_OPC_PULLUP_gc | PORT_INVEN_bm);
+
+				PORTF.OUTCLR   = (BUTTONS_BUTTON2 | BUTTONS_BUTTON3);
+				PORTF.PIN1CTRL = (PORT_OPC_PULLUP_gc | PORT_INVEN_bm);
+				PORTF.PIN2CTRL = (PORT_OPC_PULLUP_gc | PORT_INVEN_bm);
+			}
+
+			static inline void Buttons_Disable(void)
+			{
+				PORTE.OUTCLR   = BUTTONS_BUTTON1;
+				PORTE.PIN5CTRL = 0;
+
+				PORTF.OUTCLR   = (BUTTONS_BUTTON2 | BUTTONS_BUTTON3);
+				PORTF.PIN1CTRL = 0;
+				PORTF.PIN2CTRL = 0;
+			}
+
+			static inline uint8_t Buttons_GetStatus(void) ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t Buttons_GetStatus(void)
+			{
+				return ((PORTE_IN & BUTTONS_BUTTON1) | (PORTF_IN & (BUTTONS_BUTTON2 | BUTTONS_BUTTON3)));
+			}
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/XMEGA/A3BU_XPLAINED/Dataflash.h b/lib/lufa/LUFA/Drivers/Board/XMEGA/A3BU_XPLAINED/Dataflash.h
new file mode 100644
index 0000000000..b48473890b
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/XMEGA/A3BU_XPLAINED/Dataflash.h
@@ -0,0 +1,228 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific Dataflash driver header for the Atmel XMEGA A3BU Xplained.
+ *  \copydetails Group_Dataflash_A3BU_XPLAINED
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the dataflash driver
+ *        dispatch header located in LUFA/Drivers/Board/Dataflash.h.
+ */
+
+/** \ingroup Group_Dataflash
+ *  \defgroup Group_Dataflash_A3BU_XPLAINED A3BU_XPLAINED
+ *  \brief Board specific Dataflash driver header for the Atmel XMEGA A3BU Xplained.
+ *
+ *  Board specific Dataflash driver header for the Atmel XMEGA A3BU Xplained board.
+ *
+ *  <table>
+ *    <tr><th>Name</th><th>Info</th><th>Select Pin</th><th>SPI Port</th></tr>
+ *    <tr><td>DATAFLASH_CHIP1</td><td>AT45DB642D (8MB)</td><td>PORTF.4</td><td>USARTD0 (In SPI Mode)</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __DATAFLASH_A3BU_XPLAINED_H__
+#define __DATAFLASH_A3BU_XPLAINED_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+		#include "../../../Misc/AT45DB642D.h"
+		#include "../../../Peripheral/SerialSPI.h"
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_DATAFLASH_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Dataflash.h instead.
+		#endif
+
+	/* Private Interface - For use in library only: */
+	#if !defined(__DOXYGEN__)
+		/* Macros: */
+			#define DATAFLASH_CHIPCS_MASK                DATAFLASH_CHIP1
+			#define DATAFLASH_CHIPCS_PORT                PORTF
+	#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Constant indicating the total number of dataflash ICs mounted on the selected board. */
+			#define DATAFLASH_TOTALCHIPS                 1
+
+			/** Mask for no dataflash chip selected. */
+			#define DATAFLASH_NO_CHIP                    0
+
+			/** Mask for the first dataflash chip selected. */
+			#define DATAFLASH_CHIP1                      (1 << 4)
+
+			/** Internal main memory page size for the board's dataflash ICs. */
+			#define DATAFLASH_PAGE_SIZE                  1024
+
+			/** Total number of pages inside each of the board's dataflash ICs. */
+			#define DATAFLASH_PAGES                      8192
+
+		/* Inline Functions: */
+			/** Initializes the dataflash driver so that commands and data may be sent to an attached dataflash IC.
+			 *  The appropriate SPI interface will be automatically configured.
+			 */
+			static inline void Dataflash_Init(void)
+			{
+				DATAFLASH_CHIPCS_PORT.DIRSET   = DATAFLASH_CHIPCS_MASK;
+
+				PORTCFG.MPCMASK                = DATAFLASH_CHIPCS_MASK;
+				DATAFLASH_CHIPCS_PORT.PIN0CTRL = PORT_INVEN_bm;
+
+				SerialSPI_Init(&USARTD0, (USART_SPI_SCK_LEAD_RISING | USART_SPI_SAMPLE_LEADING | USART_SPI_ORDER_MSB_FIRST), (F_CPU / 2));
+
+				PORTD.DIRSET   = PIN3_bm | PIN1_bm;
+				PORTD.DIRCLR   = PIN2_bm;
+				PORTC.PIN2CTRL = PORT_OPC_PULLUP_gc;
+			}
+
+			/** Sends a byte to the currently selected dataflash IC, and returns a byte from the dataflash.
+			 *
+			 *  \param[in] Byte  Byte of data to send to the dataflash
+			 *
+			 *  \return Last response byte from the dataflash
+			 */
+			static inline uint8_t Dataflash_TransferByte(const uint8_t Byte) ATTR_ALWAYS_INLINE;
+			static inline uint8_t Dataflash_TransferByte(const uint8_t Byte)
+			{
+				return SerialSPI_TransferByte(&USARTD0, Byte);
+			}
+
+			/** Sends a byte to the currently selected dataflash IC, and ignores the next byte from the dataflash.
+			 *
+			 *  \param[in] Byte  Byte of data to send to the dataflash
+			 */
+			static inline void Dataflash_SendByte(const uint8_t Byte) ATTR_ALWAYS_INLINE;
+			static inline void Dataflash_SendByte(const uint8_t Byte)
+			{
+				SerialSPI_SendByte(&USARTD0, Byte);
+			}
+
+			/** Sends a dummy byte to the currently selected dataflash IC, and returns the next byte from the dataflash.
+			 *
+			 *  \return Last response byte from the dataflash
+			 */
+			static inline uint8_t Dataflash_ReceiveByte(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t Dataflash_ReceiveByte(void)
+			{
+				return SerialSPI_ReceiveByte(&USARTD0);
+			}
+
+			/** Determines the currently selected dataflash chip.
+			 *
+			 *  \return Mask of the currently selected Dataflash chip, either \ref DATAFLASH_NO_CHIP if no chip is selected
+			 *          or a DATAFLASH_CHIPn mask (where n is the chip number).
+			 */
+			static inline uint8_t Dataflash_GetSelectedChip(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t Dataflash_GetSelectedChip(void)
+			{
+				return (DATAFLASH_CHIPCS_PORT.OUT & DATAFLASH_CHIPCS_MASK);
+			}
+
+			/** Selects the given dataflash chip.
+			 *
+			 *  \param[in]  ChipMask  Mask of the Dataflash IC to select, in the form of a \c DATAFLASH_CHIPn mask (where n is
+			 *              the chip number).
+			 */
+			static inline void Dataflash_SelectChip(const uint8_t ChipMask) ATTR_ALWAYS_INLINE;
+			static inline void Dataflash_SelectChip(const uint8_t ChipMask)
+			{
+				DATAFLASH_CHIPCS_PORT.OUTCLR = DATAFLASH_CHIPCS_MASK;
+				DATAFLASH_CHIPCS_PORT.OUTSET = ChipMask;
+			}
+
+			/** Deselects the current dataflash chip, so that no dataflash is selected. */
+			static inline void Dataflash_DeselectChip(void) ATTR_ALWAYS_INLINE;
+			static inline void Dataflash_DeselectChip(void)
+			{
+				Dataflash_SelectChip(DATAFLASH_NO_CHIP);
+			}
+
+			/** Selects a dataflash IC from the given page number, which should range from 0 to
+			 *  ((DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS) - 1). For boards containing only one
+			 *  dataflash IC, this will select DATAFLASH_CHIP1. If the given page number is outside
+			 *  the total number of pages contained in the boards dataflash ICs, all dataflash ICs
+			 *  are deselected.
+			 *
+			 *  \param[in] PageAddress  Address of the page to manipulate, ranging from
+			 *                          0 to ((DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS) - 1).
+			 */
+			static inline void Dataflash_SelectChipFromPage(const uint16_t PageAddress)
+			{
+				Dataflash_DeselectChip();
+
+				if (PageAddress >= (DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS))
+				  return;
+
+				Dataflash_SelectChip(DATAFLASH_CHIP1);
+			}
+
+			/** Toggles the select line of the currently selected dataflash IC, so that it is ready to receive
+			 *  a new command.
+			 */
+			static inline void Dataflash_ToggleSelectedChipCS(void)
+			{
+				uint8_t SelectedChipMask = Dataflash_GetSelectedChip();
+
+				Dataflash_DeselectChip();
+				Dataflash_SelectChip(SelectedChipMask);
+			}
+
+			/** Spin-loops while the currently selected dataflash is busy executing a command, such as a main
+			 *  memory page program or main memory to buffer transfer.
+			 */
+			static inline void Dataflash_WaitWhileBusy(void)
+			{
+				Dataflash_ToggleSelectedChipCS();
+				Dataflash_SendByte(DF_CMD_GETSTATUS);
+				while (!(Dataflash_ReceiveByte() & DF_STATUS_READY));
+				Dataflash_ToggleSelectedChipCS();
+			}
+
+			/** Sends a set of page and buffer address bytes to the currently selected dataflash IC, for use with
+			 *  dataflash commands which require a complete 24-bit address.
+			 *
+			 *  \param[in] PageAddress  Page address within the selected dataflash IC
+			 *  \param[in] BufferByte   Address within the dataflash's buffer
+			 */
+			static inline void Dataflash_SendAddressBytes(uint16_t PageAddress,
+			                                              const uint16_t BufferByte)
+			{
+				Dataflash_SendByte(PageAddress >> 5);
+				Dataflash_SendByte((PageAddress << 3) | (BufferByte >> 8));
+				Dataflash_SendByte(BufferByte);
+			}
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/XMEGA/A3BU_XPLAINED/LEDs.h b/lib/lufa/LUFA/Drivers/Board/XMEGA/A3BU_XPLAINED/LEDs.h
new file mode 100644
index 0000000000..a0c5b3af4b
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/XMEGA/A3BU_XPLAINED/LEDs.h
@@ -0,0 +1,181 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific LED driver header for the Atmel XMEGA A3BU Xplained.
+ *  \copydetails Group_LEDs_A3BU_XPLAINED
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the LEDs driver
+ *        dispatch header located in LUFA/Drivers/Board/LEDs.h.
+ */
+
+/** \ingroup Group_LEDs
+ *  \defgroup Group_LEDs_A3BU_XPLAINED A3BU_XPLAINED
+ *  \brief Board specific LED driver header for the Atmel XMEGA A3BU Xplained.
+ *
+ *  Board specific LED driver header for the Atmel XMEGA A3BU Xplained.
+ *
+ *  <table>
+ *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr>
+ *    <tr><td>LEDS_LED1</td><td>Yellow</td><td>LED0 LED</td><td>Low</td><td>PORTR.0</td></tr>
+ *    <tr><td>LEDS_LED2</td><td>Yellow</td><td>LED1 LED</td><td>Low</td><td>PORTR.1</td></tr>
+ *    <tr><td>LEDS_LED3</td><td>Red</td><td>Status Bicolour Red LED</td><td>Low</td><td>PORTD.4</td></tr>
+ *    <tr><td>LEDS_LED4</td><td>Green</td><td>Status Bicolour Green LED</td><td>High</td><td>PORTD.5</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __LEDS_A3BU_XPLAINED_H__
+#define __LEDS_A3BU_XPLAINED_H__
+
+	/* Includes: */
+		#include <avr/io.h>
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_LEDS_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/LEDS.h instead.
+		#endif
+
+	/* Private Interface - For use in library only: */
+	#if !defined(__DOXYGEN__)
+		/* Macros: */
+			#define LEDS_PORTR_LEDS       (LEDS_LED1 | LEDS_LED2)
+			#define LEDS_PORTD_LEDS       (LEDS_LED3 | LEDS_LED4)
+	#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** LED mask for the first LED on the board. */
+			#define LEDS_LED1        (1 << 0)
+
+			/** LED mask for the second LED on the board. */
+			#define LEDS_LED2        (1 << 1)
+
+			/** LED mask for the third LED on the board. */
+			#define LEDS_LED3        (1 << 4)
+
+			/** LED mask for the fourth LED on the board. */
+			#define LEDS_LED4        (1 << 5)
+
+			/** LED mask for all the LEDs on the board. */
+			#define LEDS_ALL_LEDS    (LEDS_LED1 | LEDS_LED2 | LEDS_LED3 | LEDS_LED4)
+
+			/** LED mask for none of the board LEDs. */
+			#define LEDS_NO_LEDS     0
+
+		/* Inline Functions: */
+		#if !defined(__DOXYGEN__)
+			static inline void LEDs_Init(void)
+			{
+				PORTR.DIRSET    = LEDS_PORTR_LEDS;
+				PORTR.OUTCLR    = LEDS_PORTR_LEDS;
+
+				PORTCFG.MPCMASK = LEDS_PORTR_LEDS;
+				PORTR.PIN0CTRL  = PORT_INVEN_bm;
+
+				PORTD.DIRSET    = LEDS_PORTD_LEDS;
+				PORTD.OUTCLR    = LEDS_PORTD_LEDS;
+
+				PORTD.PIN4CTRL  = PORT_INVEN_bm;
+			}
+
+			static inline void LEDs_Disable(void)
+			{
+				PORTR.DIRCLR    = LEDS_PORTR_LEDS;
+				PORTR.OUTCLR    = LEDS_PORTR_LEDS;
+
+				PORTCFG.MPCMASK = 0;
+				PORTR.PIN0CTRL  = LEDS_PORTR_LEDS;
+
+				PORTD.DIRCLR    = LEDS_PORTD_LEDS;
+				PORTD.OUTCLR    = LEDS_PORTD_LEDS;
+
+				PORTD.PIN4CTRL  = 0;
+			}
+
+			static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask)
+			{
+				PORTR_OUTSET = LEDMask & LEDS_PORTR_LEDS;
+				PORTD_OUTSET = LEDMask & LEDS_PORTD_LEDS;
+			}
+
+			static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask)
+			{
+				PORTR_OUTCLR = LEDMask & LEDS_PORTR_LEDS;
+				PORTD_OUTCLR = LEDMask & LEDS_PORTD_LEDS;
+			}
+
+			static inline void LEDs_SetAllLEDs(const uint8_t LEDMask)
+			{
+				PORTR_OUTCLR = LEDS_PORTR_LEDS;
+				PORTD_OUTCLR = LEDS_PORTD_LEDS;
+
+				PORTR_OUTSET = (LEDMask & LEDS_PORTR_LEDS);
+				PORTD_OUTSET = (LEDMask & LEDS_PORTD_LEDS);
+			}
+
+			static inline void LEDs_ChangeLEDs(const uint8_t LEDMask,
+			                                   const uint8_t ActiveMask)
+			{
+				PORTR_OUTCLR = (LEDMask & LEDS_PORTR_LEDS);
+				PORTD_OUTCLR = (LEDMask & LEDS_PORTD_LEDS);
+
+				PORTR_OUTSET = (ActiveMask & LEDS_PORTR_LEDS);
+				PORTD_OUTSET = (ActiveMask & LEDS_PORTD_LEDS);
+			}
+
+			static inline void LEDs_ToggleLEDs(const uint8_t LEDMask)
+			{
+				PORTR_OUTTGL = (LEDMask & LEDS_PORTR_LEDS);
+				PORTD_OUTTGL = (LEDMask & LEDS_PORTD_LEDS);
+			}
+
+			static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t LEDs_GetLEDs(void)
+			{
+				return ((PORTR_OUT & LEDS_PORTR_LEDS) | (PORTD_OUT & LEDS_PORTD_LEDS));
+			}
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/XMEGA/B1_XPLAINED/Board.h b/lib/lufa/LUFA/Drivers/Board/XMEGA/B1_XPLAINED/Board.h
new file mode 100644
index 0000000000..b133b9ae3a
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/XMEGA/B1_XPLAINED/Board.h
@@ -0,0 +1,86 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific information header for the Atmel XMEGA B1 Xplained.
+ *  \copydetails Group_BoardInfo_B1_XPLAINED
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the Board driver
+ *        dispatch header located in LUFA/Drivers/Board/Board.h.
+ */
+
+/** \ingroup Group_BoardInfo
+ *  \defgroup Group_BoardInfo_B1_XPLAINED B1_XPLAINED
+ *  \brief Board specific information header for the Atmel XMEGA B1 Xplained.
+ *
+ *  Board specific information header for the Atmel XMEGA B1 Xplained.
+ *
+ *  @{
+ */
+
+#ifndef __BOARD_B1_XPLAINED_H__
+#define __BOARD_B1_XPLAINED_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+		#include "../../Buttons.h"
+		#include "../../Dataflash.h"
+		#include "../../LEDs.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_BOARD_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Indicates the board has hardware Buttons mounted. */
+			#define BOARD_HAS_BUTTONS
+
+			/** Indicates the board has a hardware Dataflash mounted. */
+			#define BOARD_HAS_DATAFLASH
+
+			/** Indicates the board has hardware LEDs mounted. */
+			#define BOARD_HAS_LEDS
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/XMEGA/B1_XPLAINED/Buttons.h b/lib/lufa/LUFA/Drivers/Board/XMEGA/B1_XPLAINED/Buttons.h
new file mode 100644
index 0000000000..01c7c084a6
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/XMEGA/B1_XPLAINED/Buttons.h
@@ -0,0 +1,119 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific Buttons driver header for the Atmel XMEGA B1 Xplained.
+ *  \copydetails Group_Buttons_B1_XPLAINED
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the Buttons driver
+ *        dispatch header located in LUFA/Drivers/Board/Buttons.h.
+ */
+
+/** \ingroup Group_Buttons
+ *  \defgroup Group_Buttons_B1_XPLAINED B1_XPLAINED
+ *  \brief Board specific Buttons driver header for the Atmel XMEGA B1 Xplained.
+ *
+ *  Board specific Buttons driver header for the Atmel XMEGA B1 Xplained.
+ *
+ *  <table>
+ *    <tr><th>Name</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr>
+ *    <tr><td>BUTTONS_BUTTON1</td><td>Touch CS0 Button</td><td>Low</td><td>PORTE.0</td></tr>
+ *    <tr><td>BUTTONS_BUTTON2</td><td>Touch CS1 Button</td><td>Low</td><td>PORTE.1</td></tr>
+ *    <tr><td>BUTTONS_BUTTON3</td><td>Touch CS2 Button</td><td>Low</td><td>PORTE.2</td></tr>
+ *    <tr><td>BUTTONS_BUTTON4</td><td>Touch CS3 Button</td><td>Low</td><td>PORTE.3</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __BUTTONS_B1_XPLAINED_H__
+#define __BUTTONS_B1_XPLAINED_H__
+
+	/* Includes: */
+		#include <avr/io.h>
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_BUTTONS_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Buttons.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Button mask for the first button on the board. */
+			#define BUTTONS_BUTTON1          (1 << 0)
+
+			/** Button mask for the second button on the board. */
+			#define BUTTONS_BUTTON2          (1 << 1)
+
+			/** Button mask for the third button on the board. */
+			#define BUTTONS_BUTTON3          (1 << 2)
+
+			/** Button mask for the fourth button on the board. */
+			#define BUTTONS_BUTTON4          (1 << 3)
+
+		/* Inline Functions: */
+		#if !defined(__DOXYGEN__)
+			static inline void Buttons_Init(void)
+			{
+				PORTE.OUTSET    = (BUTTONS_BUTTON1 | BUTTONS_BUTTON2 | BUTTONS_BUTTON3 | BUTTONS_BUTTON4);
+
+				PORTCFG.MPCMASK = (BUTTONS_BUTTON1 | BUTTONS_BUTTON2 | BUTTONS_BUTTON3 | BUTTONS_BUTTON4);
+				PORTE.PIN0CTRL  = (PORT_INVEN_bm | PORT_OPC_PULLUP_gc);
+			}
+
+			static inline void Buttons_Disable(void)
+			{
+				PORTE.OUTCLR    = (BUTTONS_BUTTON1 | BUTTONS_BUTTON2 | BUTTONS_BUTTON3 | BUTTONS_BUTTON4);
+
+				PORTCFG.MPCMASK = (BUTTONS_BUTTON1 | BUTTONS_BUTTON2 | BUTTONS_BUTTON3 | BUTTONS_BUTTON4);
+				PORTE.PIN0CTRL  = 0;
+			}
+
+			static inline uint8_t Buttons_GetStatus(void) ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t Buttons_GetStatus(void)
+			{
+				return (PORTE_IN & (BUTTONS_BUTTON1 | BUTTONS_BUTTON2 | BUTTONS_BUTTON3 | BUTTONS_BUTTON4));
+			}
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/XMEGA/B1_XPLAINED/Dataflash.h b/lib/lufa/LUFA/Drivers/Board/XMEGA/B1_XPLAINED/Dataflash.h
new file mode 100644
index 0000000000..71402661cd
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/XMEGA/B1_XPLAINED/Dataflash.h
@@ -0,0 +1,229 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific Dataflash driver header for the Atmel XMEGA B1 Xplained.
+ *  \copydetails Group_Dataflash_B1_XPLAINED
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the dataflash driver
+ *        dispatch header located in LUFA/Drivers/Board/Dataflash.h.
+ */
+
+/** \ingroup Group_Dataflash
+ *  \defgroup Group_Dataflash_B1_XPLAINED B1_XPLAINED
+ *  \brief Board specific Dataflash driver header for the Atmel XMEGA B1 Xplained.
+ *
+ *  Board specific Dataflash driver header for the Atmel XMEGA B1 Xplained board.
+ *
+ *  <table>
+ *    <tr><th>Name</th><th>Info</th><th>Select Pin</th><th>SPI Port</th></tr>
+ *    <tr><td>DATAFLASH_CHIP1</td><td>AT45DB642D (8MB)</td><td>PORTD.2</td><td>USARTC0 (In SPI Mode, Remapped)</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __DATAFLASH_B1_XPLAINED_H__
+#define __DATAFLASH_B1_XPLAINED_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+		#include "../../../Misc/AT45DB642D.h"
+		#include "../../../Peripheral/SerialSPI.h"
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_DATAFLASH_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Dataflash.h instead.
+		#endif
+
+	/* Private Interface - For use in library only: */
+	#if !defined(__DOXYGEN__)
+		/* Macros: */
+			#define DATAFLASH_CHIPCS_MASK                DATAFLASH_CHIP1
+			#define DATAFLASH_CHIPCS_PORT                PORTD
+	#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Constant indicating the total number of dataflash ICs mounted on the selected board. */
+			#define DATAFLASH_TOTALCHIPS                 1
+
+			/** Mask for no dataflash chip selected. */
+			#define DATAFLASH_NO_CHIP                    0
+
+			/** Mask for the first dataflash chip selected. */
+			#define DATAFLASH_CHIP1                      (1 << 2)
+
+			/** Internal main memory page size for the board's dataflash ICs. */
+			#define DATAFLASH_PAGE_SIZE                  1024
+
+			/** Total number of pages inside each of the board's dataflash ICs. */
+			#define DATAFLASH_PAGES                      8192
+
+		/* Inline Functions: */
+			/** Initializes the dataflash driver so that commands and data may be sent to an attached dataflash IC.
+			 *  The appropriate SPI interface will be automatically configured.
+			 */
+			static inline void Dataflash_Init(void)
+			{
+				DATAFLASH_CHIPCS_PORT.DIRSET   = DATAFLASH_CHIPCS_MASK;
+
+				PORTCFG.MPCMASK                = DATAFLASH_CHIPCS_MASK;
+				DATAFLASH_CHIPCS_PORT.PIN0CTRL = PORT_INVEN_bm;
+
+				SerialSPI_Init(&USARTC0, (USART_SPI_SCK_LEAD_RISING | USART_SPI_SAMPLE_LEADING | USART_SPI_ORDER_MSB_FIRST), (F_CPU / 2));
+
+				PORTC.REMAP   |= PORT_USART0_bm;
+				PORTC.DIRSET   = PIN7_bm | PIN5_bm;
+				PORTC.DIRCLR   = PIN6_bm;
+				PORTC.PIN6CTRL = PORT_OPC_PULLUP_gc;
+			}
+
+			/** Sends a byte to the currently selected dataflash IC, and returns a byte from the dataflash.
+			 *
+			 *  \param[in] Byte  Byte of data to send to the dataflash
+			 *
+			 *  \return Last response byte from the dataflash
+			 */
+			static inline uint8_t Dataflash_TransferByte(const uint8_t Byte) ATTR_ALWAYS_INLINE;
+			static inline uint8_t Dataflash_TransferByte(const uint8_t Byte)
+			{
+				return SerialSPI_TransferByte(&USARTC0, Byte);
+			}
+
+			/** Sends a byte to the currently selected dataflash IC, and ignores the next byte from the dataflash.
+			 *
+			 *  \param[in] Byte  Byte of data to send to the dataflash
+			 */
+			static inline void Dataflash_SendByte(const uint8_t Byte) ATTR_ALWAYS_INLINE;
+			static inline void Dataflash_SendByte(const uint8_t Byte)
+			{
+				SerialSPI_SendByte(&USARTC0, Byte);
+			}
+
+			/** Sends a dummy byte to the currently selected dataflash IC, and returns the next byte from the dataflash.
+			 *
+			 *  \return Last response byte from the dataflash
+			 */
+			static inline uint8_t Dataflash_ReceiveByte(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t Dataflash_ReceiveByte(void)
+			{
+				return SerialSPI_ReceiveByte(&USARTC0);
+			}
+
+			/** Determines the currently selected dataflash chip.
+			 *
+			 *  \return Mask of the currently selected Dataflash chip, either \ref DATAFLASH_NO_CHIP if no chip is selected
+			 *          or a DATAFLASH_CHIPn mask (where n is the chip number).
+			 */
+			static inline uint8_t Dataflash_GetSelectedChip(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t Dataflash_GetSelectedChip(void)
+			{
+				return (DATAFLASH_CHIPCS_PORT.OUT & DATAFLASH_CHIPCS_MASK);
+			}
+
+			/** Selects the given dataflash chip.
+			 *
+			 *  \param[in]  ChipMask  Mask of the Dataflash IC to select, in the form of a \c DATAFLASH_CHIPn mask (where n is
+			 *              the chip number).
+			 */
+			static inline void Dataflash_SelectChip(const uint8_t ChipMask) ATTR_ALWAYS_INLINE;
+			static inline void Dataflash_SelectChip(const uint8_t ChipMask)
+			{
+				DATAFLASH_CHIPCS_PORT.OUTCLR = DATAFLASH_CHIPCS_MASK;
+				DATAFLASH_CHIPCS_PORT.OUTSET = (ChipMask & DATAFLASH_CHIPCS_MASK);
+			}
+
+			/** Deselects the current dataflash chip, so that no dataflash is selected. */
+			static inline void Dataflash_DeselectChip(void) ATTR_ALWAYS_INLINE;
+			static inline void Dataflash_DeselectChip(void)
+			{
+				Dataflash_SelectChip(DATAFLASH_NO_CHIP);
+			}
+
+			/** Selects a dataflash IC from the given page number, which should range from 0 to
+			 *  ((DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS) - 1). For boards containing only one
+			 *  dataflash IC, this will select DATAFLASH_CHIP1. If the given page number is outside
+			 *  the total number of pages contained in the boards dataflash ICs, all dataflash ICs
+			 *  are deselected.
+			 *
+			 *  \param[in] PageAddress  Address of the page to manipulate, ranging from
+			 *                          0 to ((DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS) - 1).
+			 */
+			static inline void Dataflash_SelectChipFromPage(const uint16_t PageAddress)
+			{
+				Dataflash_DeselectChip();
+
+				if (PageAddress >= (DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS))
+				  return;
+
+				Dataflash_SelectChip(DATAFLASH_CHIP1);
+			}
+
+			/** Toggles the select line of the currently selected dataflash IC, so that it is ready to receive
+			 *  a new command.
+			 */
+			static inline void Dataflash_ToggleSelectedChipCS(void)
+			{
+				uint8_t SelectedChipMask = Dataflash_GetSelectedChip();
+
+				Dataflash_DeselectChip();
+				Dataflash_SelectChip(SelectedChipMask);
+			}
+
+			/** Spin-loops while the currently selected dataflash is busy executing a command, such as a main
+			 *  memory page program or main memory to buffer transfer.
+			 */
+			static inline void Dataflash_WaitWhileBusy(void)
+			{
+				Dataflash_ToggleSelectedChipCS();
+				Dataflash_SendByte(DF_CMD_GETSTATUS);
+				while (!(Dataflash_ReceiveByte() & DF_STATUS_READY));
+				Dataflash_ToggleSelectedChipCS();
+			}
+
+			/** Sends a set of page and buffer address bytes to the currently selected dataflash IC, for use with
+			 *  dataflash commands which require a complete 24-bit address.
+			 *
+			 *  \param[in] PageAddress  Page address within the selected dataflash IC
+			 *  \param[in] BufferByte   Address within the dataflash's buffer
+			 */
+			static inline void Dataflash_SendAddressBytes(uint16_t PageAddress,
+			                                              const uint16_t BufferByte)
+			{
+				Dataflash_SendByte(PageAddress >> 5);
+				Dataflash_SendByte((PageAddress << 3) | (BufferByte >> 8));
+				Dataflash_SendByte(BufferByte);
+			}
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/XMEGA/B1_XPLAINED/LEDs.h b/lib/lufa/LUFA/Drivers/Board/XMEGA/B1_XPLAINED/LEDs.h
new file mode 100644
index 0000000000..078532ac4f
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/XMEGA/B1_XPLAINED/LEDs.h
@@ -0,0 +1,183 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific LED driver header for the Atmel XMEGA B1 Xplained.
+ *  \copydetails Group_LEDs_B1_XPLAINED
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the LEDs driver
+ *        dispatch header located in LUFA/Drivers/Board/LEDs.h.
+ */
+
+/** \ingroup Group_LEDs
+ *  \defgroup Group_LEDs_B1_XPLAINED B1_XPLAINED
+ *  \brief Board specific LED driver header for the Atmel XMEGA B1 Xplained.
+ *
+ *  Board specific LED driver header for the Atmel XMEGA B1 Xplained.
+ *
+ *  <table>
+ *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr>
+ *    <tr><td>LEDS_LED1</td><td>Yellow</td><td>LED0 LED</td><td>High</td><td>PORTB.4</td></tr>
+ *    <tr><td>LEDS_LED2</td><td>Yellow</td><td>LED1 LED</td><td>High</td><td>PORTB.5</td></tr>
+ *    <tr><td>LEDS_LED3</td><td>Yellow</td><td>LED2 LED</td><td>High</td><td>PORTB.6</td></tr>
+ *    <tr><td>LEDS_LED4</td><td>Yellow</td><td>LED3 LED</td><td>High</td><td>PORTB.7</td></tr>
+ *    <tr><td>LEDS_LED5</td><td>Green</td><td>USB LED</td><td>Low</td><td>PORTE.4</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __LEDS_B1_XPLAINED_H__
+#define __LEDS_B1_XPLAINED_H__
+
+	/* Includes: */
+		#include <avr/io.h>
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_LEDS_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/LEDS.h instead.
+		#endif
+
+	/* Private Interface - For use in library only: */
+	#if !defined(__DOXYGEN__)
+		/* Macros: */
+			#define LEDS_PORTB_LEDS        (LEDS_LED1 | LEDS_LED2 | LEDS_LED3 | LEDS_LED4)
+			#define LEDS_PORTE_LEDS        LEDS_LED5
+
+			#define LEDS_PORTE_MASK_SHIFT  1
+	#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** LED mask for the first LED on the board. */
+			#define LEDS_LED1        (1 << 4)
+
+			/** LED mask for the second LED on the board. */
+			#define LEDS_LED2        (1 << 5)
+
+			/** LED mask for the third LED on the board. */
+			#define LEDS_LED3        (1 << 6)
+
+			/** LED mask for the fourth LED on the board. */
+			#define LEDS_LED4        (1 << 7)
+
+			/** LED mask for the fifth LED on the board. */
+			#define LEDS_LED5       ((1 << 4) >> LEDS_PORTE_MASK_SHIFT)
+
+			/** LED mask for all the LEDs on the board. */
+			#define LEDS_ALL_LEDS    (LEDS_LED1 | LEDS_LED2 | LEDS_LED3 | LEDS_LED4 | LEDS_LED5)
+
+			/** LED mask for none of the board LEDs. */
+			#define LEDS_NO_LEDS     0
+
+		/* Inline Functions: */
+		#if !defined(__DOXYGEN__)
+			static inline void LEDs_Init(void)
+			{
+				PORTB.DIRSET    = LEDS_PORTB_LEDS;
+				PORTB.OUTCLR    = LEDS_PORTB_LEDS;
+
+				PORTCFG.MPCMASK = LEDS_PORTB_LEDS;
+				PORTB.PIN0CTRL  = PORT_INVEN_bm;
+
+				PORTE.DIRSET    = (LEDS_PORTE_LEDS << LEDS_PORTE_MASK_SHIFT);
+				PORTE.OUTCLR    = (LEDS_PORTE_LEDS << LEDS_PORTE_MASK_SHIFT);
+			}
+
+			static inline void LEDs_Disable(void)
+			{
+				PORTB.DIRCLR    = LEDS_PORTB_LEDS;
+				PORTB.OUTCLR    = LEDS_PORTB_LEDS;
+
+				PORTCFG.MPCMASK = 0;
+				PORTB.PIN0CTRL  = LEDS_PORTB_LEDS;
+
+				PORTE.DIRCLR    = (LEDS_PORTE_LEDS << LEDS_PORTE_MASK_SHIFT);
+				PORTE.OUTCLR    = (LEDS_PORTE_LEDS << LEDS_PORTE_MASK_SHIFT);
+			}
+
+			static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask)
+			{
+				PORTB_OUTSET = (LEDMask & LEDS_PORTB_LEDS);
+				PORTE_OUTSET = ((LEDMask & LEDS_PORTE_LEDS) << LEDS_PORTE_MASK_SHIFT);
+			}
+
+			static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask)
+			{
+				PORTB_OUTCLR = (LEDMask & LEDS_PORTB_LEDS);
+				PORTE_OUTCLR = ((LEDMask & LEDS_PORTE_LEDS) << LEDS_PORTE_MASK_SHIFT);
+			}
+
+			static inline void LEDs_SetAllLEDs(const uint8_t LEDMask)
+			{
+				PORTB_OUTCLR = LEDS_PORTB_LEDS;
+				PORTE_OUTCLR = (LEDS_PORTE_LEDS << LEDS_PORTE_MASK_SHIFT);
+
+				PORTB_OUTSET = (LEDMask & LEDS_PORTB_LEDS);
+				PORTE_OUTSET = ((LEDMask & LEDS_PORTE_LEDS) << LEDS_PORTE_MASK_SHIFT);
+			}
+
+			static inline void LEDs_ChangeLEDs(const uint8_t LEDMask,
+			                                   const uint8_t ActiveMask)
+			{
+				PORTB_OUTCLR =  (LEDMask & LEDS_PORTB_LEDS);
+				PORTE_OUTCLR = ((LEDMask & LEDS_PORTE_LEDS) << LEDS_PORTE_MASK_SHIFT);
+
+				PORTB_OUTSET =  (ActiveMask & LEDS_PORTB_LEDS);
+				PORTE_OUTSET = ((ActiveMask & LEDS_PORTE_LEDS) << LEDS_PORTE_MASK_SHIFT);
+			}
+
+			static inline void LEDs_ToggleLEDs(const uint8_t LEDMask)
+			{
+				PORTB_OUTTGL = (LEDMask & LEDS_PORTB_LEDS);
+				PORTE_OUTTGL = ((LEDMask & LEDS_PORTE_LEDS) << LEDS_PORTE_MASK_SHIFT);
+			}
+
+			static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t LEDs_GetLEDs(void)
+			{
+				return ((PORTB_OUT & LEDS_PORTB_LEDS) | (PORTE_OUT & (LEDS_PORTE_LEDS << LEDS_PORTE_MASK_SHIFT)));
+			}
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/XMEGA/C3_XPLAINED/Board.h b/lib/lufa/LUFA/Drivers/Board/XMEGA/C3_XPLAINED/Board.h
new file mode 100644
index 0000000000..e48bd5836f
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/XMEGA/C3_XPLAINED/Board.h
@@ -0,0 +1,83 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific information header for the Atmel XMEGA C3 Xplained.
+ *  \copydetails Group_BoardInfo_C3_XPLAINED
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the Board driver
+ *        dispatch header located in LUFA/Drivers/Board/Board.h.
+ */
+
+/** \ingroup Group_BoardInfo
+ *  \defgroup Group_BoardInfo_C3_XPLAINED C3_XPLAINED
+ *  \brief Board specific information header for the Atmel XMEGA C3 Xplained.
+ *
+ *  Board specific information header for the Atmel XMEGA C3 Xplained.
+ *
+ *  @{
+ */
+
+#ifndef __BOARD_C3_XPLAINED_H__
+#define __BOARD_C3_XPLAINED_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+		#include "../../Buttons.h"
+		#include "../../Dataflash.h"
+		#include "../../LEDs.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_BOARD_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Indicates the board has hardware Buttons mounted. */
+			#define BOARD_HAS_BUTTONS
+
+			/** Indicates the board has hardware LEDs mounted. */
+			#define BOARD_HAS_LEDS
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/XMEGA/C3_XPLAINED/Buttons.h b/lib/lufa/LUFA/Drivers/Board/XMEGA/C3_XPLAINED/Buttons.h
new file mode 100644
index 0000000000..1a8c1fc7e9
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/XMEGA/C3_XPLAINED/Buttons.h
@@ -0,0 +1,109 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific Buttons driver header for the Atmel XMEGA C3 Xplained.
+ *  \copydetails Group_Buttons_C3_XPLAINED
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the Buttons driver
+ *        dispatch header located in LUFA/Drivers/Board/Buttons.h.
+ */
+
+/** \ingroup Group_Buttons
+ *  \defgroup Group_Buttons_C3_XPLAINED C3_XPLAINED
+ *  \brief Board specific Buttons driver header for the Atmel XMEGA C3 Xplained.
+ *
+ *  Board specific Buttons driver header for the Atmel XMEGA C3 Xplained.
+ *
+ *  <table>
+ *    <tr><th>Name</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr>
+ *    <tr><td>BUTTONS_BUTTON1</td><td>SW0 Button</td><td>Low</td><td>PORTF.1</td></tr>
+ *    <tr><td>BUTTONS_BUTTON2</td><td>SW1 Button</td><td>Low</td><td>PORTF.2</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __BUTTONS_C3_XPLAINED_H__
+#define __BUTTONS_C3_XPLAINED_H__
+
+	/* Includes: */
+		#include <avr/io.h>
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_BUTTONS_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/Buttons.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Button mask for the first button on the board. */
+			#define BUTTONS_BUTTON1          (1 << 1)
+
+			/** Button mask for the second button on the board. */
+			#define BUTTONS_BUTTON2          (1 << 2)
+
+		/* Inline Functions: */
+		#if !defined(__DOXYGEN__)
+			static inline void Buttons_Init(void)
+			{
+				PORTF.OUTCLR   = (BUTTONS_BUTTON1 | BUTTONS_BUTTON2);
+				PORTF.PIN1CTRL = (PORT_OPC_PULLUP_gc | PORT_INVEN_bm);
+				PORTF.PIN2CTRL = (PORT_OPC_PULLUP_gc | PORT_INVEN_bm);
+			}
+
+			static inline void Buttons_Disable(void)
+			{
+				PORTF.OUTCLR   = (BUTTONS_BUTTON1 | BUTTONS_BUTTON2);
+				PORTF.PIN1CTRL = 0;
+				PORTF.PIN2CTRL = 0;
+			}
+
+			static inline uint8_t Buttons_GetStatus(void) ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t Buttons_GetStatus(void)
+			{
+				return (PORTF_IN & (BUTTONS_BUTTON1 | BUTTONS_BUTTON2));
+			}
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Board/XMEGA/C3_XPLAINED/LEDs.h b/lib/lufa/LUFA/Drivers/Board/XMEGA/C3_XPLAINED/LEDs.h
new file mode 100644
index 0000000000..f701c883e1
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Board/XMEGA/C3_XPLAINED/LEDs.h
@@ -0,0 +1,181 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Board specific LED driver header for the Atmel XMEGA C3 Xplained.
+ *  \copydetails Group_LEDs_C3_XPLAINED
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the LEDs driver
+ *        dispatch header located in LUFA/Drivers/Board/LEDs.h.
+ */
+
+/** \ingroup Group_LEDs
+ *  \defgroup Group_LEDs_C3_XPLAINED C3_XPLAINED
+ *  \brief Board specific LED driver header for the Atmel XMEGA C3 Xplained.
+ *
+ *  Board specific LED driver header for the Atmel XMEGA C3 Xplained.
+ *
+ *  <table>
+ *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr>
+ *    <tr><td>LEDS_LED1</td><td>Yellow</td><td>LED0 LED</td><td>Low</td><td>PORTR.0</td></tr>
+ *    <tr><td>LEDS_LED2</td><td>Yellow</td><td>LED1 LED</td><td>Low</td><td>PORTR.1</td></tr>
+ *    <tr><td>LEDS_LED3</td><td>Red</td><td>Status Bicolour Red LED</td><td>Low</td><td>PORTD.4</td></tr>
+ *    <tr><td>LEDS_LED4</td><td>Green</td><td>Status Bicolour Green LED</td><td>High</td><td>PORTD.5</td></tr>
+ *  </table>
+ *
+ *  @{
+ */
+
+#ifndef __LEDS_C3_XPLAINED_H__
+#define __LEDS_C3_XPLAINED_H__
+
+	/* Includes: */
+		#include <avr/io.h>
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_LEDS_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Board/LEDS.h instead.
+		#endif
+
+	/* Private Interface - For use in library only: */
+	#if !defined(__DOXYGEN__)
+		/* Macros: */
+			#define LEDS_PORTR_LEDS       (LEDS_LED1 | LEDS_LED2)
+			#define LEDS_PORTD_LEDS       (LEDS_LED3 | LEDS_LED4)
+	#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** LED mask for the first LED on the board. */
+			#define LEDS_LED1        (1 << 0)
+
+			/** LED mask for the second LED on the board. */
+			#define LEDS_LED2        (1 << 1)
+
+			/** LED mask for the third LED on the board. */
+			#define LEDS_LED3        (1 << 4)
+
+			/** LED mask for the fourth LED on the board. */
+			#define LEDS_LED4        (1 << 5)
+
+			/** LED mask for all the LEDs on the board. */
+			#define LEDS_ALL_LEDS    (LEDS_LED1 | LEDS_LED2 | LEDS_LED3 | LEDS_LED4)
+
+			/** LED mask for none of the board LEDs. */
+			#define LEDS_NO_LEDS     0
+
+		/* Inline Functions: */
+		#if !defined(__DOXYGEN__)
+			static inline void LEDs_Init(void)
+			{
+				PORTR.DIRSET    = LEDS_PORTR_LEDS;
+				PORTR.OUTCLR    = LEDS_PORTR_LEDS;
+
+				PORTCFG.MPCMASK = LEDS_PORTR_LEDS;
+				PORTR.PIN0CTRL  = PORT_INVEN_bm;
+
+				PORTD.DIRSET    = LEDS_PORTD_LEDS;
+				PORTD.OUTCLR    = LEDS_PORTD_LEDS;
+
+				PORTD.PIN4CTRL  = PORT_INVEN_bm;
+			}
+
+			static inline void LEDs_Disable(void)
+			{
+				PORTR.DIRCLR    = LEDS_PORTR_LEDS;
+				PORTR.OUTCLR    = LEDS_PORTR_LEDS;
+
+				PORTCFG.MPCMASK = 0;
+				PORTR.PIN0CTRL  = LEDS_PORTR_LEDS;
+
+				PORTD.DIRCLR    = LEDS_PORTD_LEDS;
+				PORTD.OUTCLR    = LEDS_PORTD_LEDS;
+
+				PORTD.PIN4CTRL  = 0;
+			}
+
+			static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask)
+			{
+				PORTR_OUTSET = LEDMask & LEDS_PORTR_LEDS;
+				PORTD_OUTSET = LEDMask & LEDS_PORTD_LEDS;
+			}
+
+			static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask)
+			{
+				PORTR_OUTCLR = LEDMask & LEDS_PORTR_LEDS;
+				PORTD_OUTCLR = LEDMask & LEDS_PORTD_LEDS;
+			}
+
+			static inline void LEDs_SetAllLEDs(const uint8_t LEDMask)
+			{
+				PORTR_OUTCLR = LEDS_PORTR_LEDS;
+				PORTD_OUTCLR = LEDS_PORTD_LEDS;
+
+				PORTR_OUTSET = (LEDMask & LEDS_PORTR_LEDS);
+				PORTD_OUTSET = (LEDMask & LEDS_PORTD_LEDS);
+			}
+
+			static inline void LEDs_ChangeLEDs(const uint8_t LEDMask,
+			                                   const uint8_t ActiveMask)
+			{
+				PORTR_OUTCLR = (LEDMask & LEDS_PORTR_LEDS);
+				PORTD_OUTCLR = (LEDMask & LEDS_PORTD_LEDS);
+
+				PORTR_OUTSET = (ActiveMask & LEDS_PORTR_LEDS);
+				PORTD_OUTSET = (ActiveMask & LEDS_PORTD_LEDS);
+			}
+
+			static inline void LEDs_ToggleLEDs(const uint8_t LEDMask)
+			{
+				PORTR_OUTTGL = (LEDMask & LEDS_PORTR_LEDS);
+				PORTD_OUTTGL = (LEDMask & LEDS_PORTD_LEDS);
+			}
+
+			static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t LEDs_GetLEDs(void)
+			{
+				return ((PORTR_OUT & LEDS_PORTR_LEDS) | (PORTD_OUT & LEDS_PORTD_LEDS));
+			}
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Misc/AT45DB321C.h b/lib/lufa/LUFA/Drivers/Misc/AT45DB321C.h
new file mode 100644
index 0000000000..e354ca47be
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Misc/AT45DB321C.h
@@ -0,0 +1,100 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Command constants for the Atmel AT45DB321C Dataflash.
+ *  \copydetails Group_AT45DB321C
+ */
+
+/** \ingroup Group_MiscDrivers
+ *  \defgroup Group_AT45DB321C Atmel AT45DB321C Dataflash Commands - LUFA/Drivers/Misc/AT45DB321C.h
+ *  \brief Command constants for the Atmel AT45DB321C Dataflash.
+ *
+ *  Dataflash command constants for the Atmel AT45DB321C Dataflash IC.
+ *
+ *  @{
+ */
+
+#ifndef __AT45DB321C_CMDS_H__
+#define __AT45DB321C_CMDS_H__
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** \name Dataflash Status Values */
+			//@{
+			#define DF_STATUS_READY                         (1 << 7)
+			#define DF_STATUS_COMPMISMATCH                  (1 << 6)
+			#define DF_STATUS_SECTORPROTECTION_ON           (1 << 1)
+			//@}
+
+			/** \name Dataflash Commands */
+			//@{
+			#define DF_CMD_GETSTATUS                        0xD7
+
+			#define DF_CMD_MAINMEMTOBUFF1                   0x53
+			#define DF_CMD_MAINMEMTOBUFF2                   0x55
+			#define DF_CMD_MAINMEMTOBUFF1COMP               0x60
+			#define DF_CMD_MAINMEMTOBUFF2COMP               0x61
+			#define DF_CMD_AUTOREWRITEBUFF1                 0x58
+			#define DF_CMD_AUTOREWRITEBUFF2                 0x59
+
+			#define DF_CMD_MAINMEMPAGEREAD                  0xD2
+			#define DF_CMD_CONTARRAYREAD_LF                 0xE8
+			#define DF_CMD_BUFF1READ_LF                     0xD4
+			#define DF_CMD_BUFF2READ_LF                     0xD6
+
+			#define DF_CMD_BUFF1WRITE                       0x84
+			#define DF_CMD_BUFF2WRITE                       0x87
+			#define DF_CMD_BUFF1TOMAINMEMWITHERASE          0x83
+			#define DF_CMD_BUFF2TOMAINMEMWITHERASE          0x86
+			#define DF_CMD_BUFF1TOMAINMEM                   0x88
+			#define DF_CMD_BUFF2TOMAINMEM                   0x89
+			#define DF_CMD_MAINMEMPAGETHROUGHBUFF1          0x82
+			#define DF_CMD_MAINMEMPAGETHROUGHBUFF2          0x85
+
+			#define DF_CMD_PAGEERASE                        0x81
+			#define DF_CMD_BLOCKERASE                       0x50
+
+			#define DF_CMD_SECTORPROTECTIONOFF              ((char[]){0x3D, 0x2A, 0x7F, 0xCF})
+			#define DF_CMD_SECTORPROTECTIONOFF_BYTE1        0x3D
+			#define DF_CMD_SECTORPROTECTIONOFF_BYTE2        0x2A
+			#define DF_CMD_SECTORPROTECTIONOFF_BYTE3        0x7F
+			#define DF_CMD_SECTORPROTECTIONOFF_BYTE4        0xCF
+
+			#define DF_CMD_READMANUFACTURERDEVICEINFO       0x9F
+			//@}
+
+			/** Manufacturer code for Atmel Corporation, returned by Atmel Dataflash ICs in response to the \c DF_CMD_READMANUFACTURERDEVICEINFO command. */
+			#define DF_MANUFACTURER_ATMEL                   0x1F
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Misc/AT45DB642D.h b/lib/lufa/LUFA/Drivers/Misc/AT45DB642D.h
new file mode 100644
index 0000000000..76a7a5cb6c
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Misc/AT45DB642D.h
@@ -0,0 +1,116 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Command constants for the Atmel AT45DB642D Dataflash.
+ *  \copydetails Group_AT45DB642D
+ */
+
+/** \ingroup Group_MiscDrivers
+ *  \defgroup Group_AT45DB642D Atmel AT45DB642D Dataflash Commands - LUFA/Drivers/Misc/AT45DB642D.h
+ *  \brief Command constants for the Atmel AT45DB642D Dataflash.
+ *
+ *  Dataflash command constants for the Atmel AT45DB642D Dataflash IC.
+ *
+ *  @{
+ */
+
+#ifndef __AT45DB642D_CMDS_H__
+#define __AT45DB642D_CMDS_H__
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** \name Dataflash Status Values */
+			//@{
+			#define DF_STATUS_READY                         (1 << 7)
+			#define DF_STATUS_COMPMISMATCH                  (1 << 6)
+			#define DF_STATUS_SECTORPROTECTION_ON           (1 << 1)
+			#define DF_STATUS_BINARYPAGESIZE_ON             (1 << 0)
+			//@}
+
+			/** \name Dataflash Commands */
+			//@{
+			#define DF_CMD_GETSTATUS                        0xD7
+			#define DF_CMD_POWERDOWN                        0xB9
+			#define DF_CMD_WAKEUP                           0xAB
+
+			#define DF_CMD_MAINMEMTOBUFF1                   0x53
+			#define DF_CMD_MAINMEMTOBUFF2                   0x55
+			#define DF_CMD_MAINMEMTOBUFF1COMP               0x60
+			#define DF_CMD_MAINMEMTOBUFF2COMP               0x61
+			#define DF_CMD_AUTOREWRITEBUFF1                 0x58
+			#define DF_CMD_AUTOREWRITEBUFF2                 0x59
+
+			#define DF_CMD_MAINMEMPAGEREAD                  0xD2
+			#define DF_CMD_CONTARRAYREAD_LF                 0x03
+			#define DF_CMD_BUFF1READ_LF                     0xD1
+			#define DF_CMD_BUFF2READ_LF                     0xD3
+
+			#define DF_CMD_BUFF1WRITE                       0x84
+			#define DF_CMD_BUFF2WRITE                       0x87
+			#define DF_CMD_BUFF1TOMAINMEMWITHERASE          0x83
+			#define DF_CMD_BUFF2TOMAINMEMWITHERASE          0x86
+			#define DF_CMD_BUFF1TOMAINMEM                   0x88
+			#define DF_CMD_BUFF2TOMAINMEM                   0x89
+			#define DF_CMD_MAINMEMPAGETHROUGHBUFF1          0x82
+			#define DF_CMD_MAINMEMPAGETHROUGHBUFF2          0x85
+
+			#define DF_CMD_PAGEERASE                        0x81
+			#define DF_CMD_BLOCKERASE                       0x50
+			#define DF_CMD_SECTORERASE                      0x7C
+
+			#define DF_CMD_CHIPERASE                        ((char[]){0xC7, 0x94, 0x80, 0x9A})
+			#define DF_CMD_CHIPERASE_BYTE1                  0xC7
+			#define DF_CMD_CHIPERASE_BYTE2                  0x94
+			#define DF_CMD_CHIPERASE_BYTE3                  0x80
+			#define DF_CMD_CHIPERASE_BYTE4                  0x9A
+
+			#define DF_CMD_SECTORPROTECTIONOFF              ((char[]){0x3D, 0x2A, 0x7F, 0x9A})
+			#define DF_CMD_SECTORPROTECTIONOFF_BYTE1        0x3D
+			#define DF_CMD_SECTORPROTECTIONOFF_BYTE2        0x2A
+			#define DF_CMD_SECTORPROTECTIONOFF_BYTE3        0x7F
+			#define DF_CMD_SECTORPROTECTIONOFF_BYTE4        0x9A
+
+			#define DF_CMD_BINARYPAGESIZEMODEON             ((char[]){0x3D, 0x2A, 0x80, 0xA6})
+			#define DF_CMD_BINARYPAGESIZEMODEON_BYTE1       0x3D
+			#define DF_CMD_BINARYPAGESIZEMODEON_BYTE2       0x2A
+			#define DF_CMD_BINARYPAGESIZEMODEON_BYTE3       0x80
+			#define DF_CMD_BINARYPAGESIZEMODEON_BYTE4       0xA6
+
+			#define DF_CMD_READMANUFACTURERDEVICEINFO       0x9F
+			//@}
+
+			/** Manufacturer code for Atmel Corporation, returned by Atmel Dataflash ICs in response to the \c DF_CMD_READMANUFACTURERDEVICEINFO command. */
+			#define DF_MANUFACTURER_ATMEL                   0x1F
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Misc/RingBuffer.h b/lib/lufa/LUFA/Drivers/Misc/RingBuffer.h
new file mode 100644
index 0000000000..0e76a0779a
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Misc/RingBuffer.h
@@ -0,0 +1,308 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Lightweight ring (circular) buffer, for fast insertion/deletion of bytes.
+ *
+ *  Lightweight ring buffer, for fast insertion/deletion. Multiple buffers can be created of
+ *  different sizes to suit different needs.
+ *
+ *  Note that for each buffer, insertion and removal operations may occur at the same time (via
+ *  a multi-threaded ISR based system) however the same kind of operation (two or more insertions
+ *  or deletions) must not overlap. If there is possibility of two or more of the same kind of
+ *  operating occurring at the same point in time, atomic (mutex) locking should be used.
+ */
+
+/** \ingroup Group_MiscDrivers
+ *  \defgroup Group_RingBuff Generic Byte Ring Buffer - LUFA/Drivers/Misc/RingBuffer.h
+ *  \brief Lightweight ring buffer, for fast insertion/deletion of bytes.
+ *
+ *  \section Sec_RingBuff_Dependencies Module Source Dependencies
+ *  The following files must be built with any user project that uses this module:
+ *    - None
+ *
+ *  \section Sec_RingBuff_ModDescription Module Description
+ *  Lightweight ring buffer, for fast insertion/deletion. Multiple buffers can be created of
+ *  different sizes to suit different needs.
+ *
+ *  Note that for each buffer, insertion and removal operations may occur at the same time (via
+ *  a multi-threaded ISR based system) however the same kind of operation (two or more insertions
+ *  or deletions) must not overlap. If there is possibility of two or more of the same kind of
+ *  operating occurring at the same point in time, atomic (mutex) locking should be used.
+ *
+ *  \section Sec_RingBuff_ExampleUsage Example Usage
+ *  The following snippet is an example of how this module may be used within a typical
+ *  application.
+ *
+ *  \code
+ *      // Create the buffer structure and its underlying storage array
+ *      RingBuffer_t Buffer;
+ *      uint8_t      BufferData[128];
+ *
+ *      // Initialize the buffer with the created storage array
+ *      RingBuffer_InitBuffer(&Buffer, BufferData, sizeof(BufferData));
+ *
+ *      // Insert some data into the buffer
+ *      RingBuffer_Insert(&Buffer, 'H');
+ *      RingBuffer_Insert(&Buffer, 'E');
+ *      RingBuffer_Insert(&Buffer, 'L');
+ *      RingBuffer_Insert(&Buffer, 'L');
+ *      RingBuffer_Insert(&Buffer, 'O');
+ *
+ *      // Cache the number of stored bytes in the buffer
+ *      uint16_t BufferCount = RingBuffer_GetCount(&Buffer);
+ *
+ *      // Printer stored data length
+ *      printf("Buffer Length: %d, Buffer Data: \r\n", BufferCount);
+ *
+ *      // Print contents of the buffer one character at a time
+ *      while (BufferCount--)
+ *        putc(RingBuffer_Remove(&Buffer));
+ *  \endcode
+ *
+ *  @{
+ */
+
+#ifndef __RING_BUFFER_H__
+#define __RING_BUFFER_H__
+
+	/* Includes: */
+		#include "../../Common/Common.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Type Defines: */
+		/** \brief Ring Buffer Management Structure.
+		 *
+		 *  Type define for a new ring buffer object. Buffers should be initialized via a call to
+		 *  \ref RingBuffer_InitBuffer() before use.
+		 */
+		typedef struct
+		{
+			uint8_t* In; /**< Current storage location in the circular buffer. */
+			uint8_t* Out; /**< Current retrieval location in the circular buffer. */
+			uint8_t* Start; /**< Pointer to the start of the buffer's underlying storage array. */
+			uint8_t* End; /**< Pointer to the end of the buffer's underlying storage array. */
+			uint16_t Size; /**< Size of the buffer's underlying storage array. */
+			uint16_t Count; /**< Number of bytes currently stored in the buffer. */
+		} RingBuffer_t;
+
+	/* Inline Functions: */
+		/** Initializes a ring buffer ready for use. Buffers must be initialized via this function
+		 *  before any operations are called upon them. Already initialized buffers may be reset
+		 *  by re-initializing them using this function.
+		 *
+		 *  \param[out] Buffer   Pointer to a ring buffer structure to initialize.
+		 *  \param[out] DataPtr  Pointer to a global array that will hold the data stored into the ring buffer.
+		 *  \param[out] Size     Maximum number of bytes that can be stored in the underlying data array.
+		 */
+		static inline void RingBuffer_InitBuffer(RingBuffer_t* Buffer,
+		                                         uint8_t* const DataPtr,
+		                                         const uint16_t Size) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2);
+		static inline void RingBuffer_InitBuffer(RingBuffer_t* Buffer,
+		                                         uint8_t* const DataPtr,
+		                                         const uint16_t Size)
+		{
+			GCC_FORCE_POINTER_ACCESS(Buffer);
+
+			uint_reg_t CurrentGlobalInt = GetGlobalInterruptMask();
+			GlobalInterruptDisable();
+
+			Buffer->In     = DataPtr;
+			Buffer->Out    = DataPtr;
+			Buffer->Start  = &DataPtr[0];
+			Buffer->End    = &DataPtr[Size];
+			Buffer->Size   = Size;
+			Buffer->Count  = 0;
+
+			SetGlobalInterruptMask(CurrentGlobalInt);
+		}
+
+		/** Retrieves the current number of bytes stored in a particular buffer. This value is computed
+		 *  by entering an atomic lock on the buffer, so that the buffer cannot be modified while the
+		 *  computation takes place. This value should be cached when reading out the contents of the buffer,
+		 *  so that as small a time as possible is spent in an atomic lock.
+		 *
+		 *  \note The value returned by this function is guaranteed to only be the minimum number of bytes
+		 *        stored in the given buffer; this value may change as other threads write new data, thus
+		 *        the returned number should be used only to determine how many successive reads may safely
+		 *        be performed on the buffer.
+		 *
+		 *  \param[in] Buffer  Pointer to a ring buffer structure whose count is to be computed.
+		 *
+		 *  \return Number of bytes currently stored in the buffer.
+		 */
+		static inline uint16_t RingBuffer_GetCount(RingBuffer_t* const Buffer) ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(1);
+		static inline uint16_t RingBuffer_GetCount(RingBuffer_t* const Buffer)
+		{
+			uint16_t Count;
+
+			uint_reg_t CurrentGlobalInt = GetGlobalInterruptMask();
+			GlobalInterruptDisable();
+
+			Count = Buffer->Count;
+
+			SetGlobalInterruptMask(CurrentGlobalInt);
+			return Count;
+		}
+
+		/** Retrieves the free space in a particular buffer. This value is computed by entering an atomic lock
+		 *  on the buffer, so that the buffer cannot be modified while the computation takes place.
+		 *
+		 *  \note The value returned by this function is guaranteed to only be the maximum number of bytes
+		 *        free in the given buffer; this value may change as other threads write new data, thus
+		 *        the returned number should be used only to determine how many successive writes may safely
+		 *        be performed on the buffer when there is a single writer thread.
+		 *
+		 *  \param[in] Buffer  Pointer to a ring buffer structure whose free count is to be computed.
+		 *
+		 *  \return Number of free bytes in the buffer.
+		 */
+		static inline uint16_t RingBuffer_GetFreeCount(RingBuffer_t* const Buffer) ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(1);
+		static inline uint16_t RingBuffer_GetFreeCount(RingBuffer_t* const Buffer)
+		{
+			return (Buffer->Size - RingBuffer_GetCount(Buffer));
+		}
+
+		/** Atomically determines if the specified ring buffer contains any data. This should
+		 *  be tested before removing data from the buffer, to ensure that the buffer does not
+		 *  underflow.
+		 *
+		 *  If the data is to be removed in a loop, store the total number of bytes stored in the
+		 *  buffer (via a call to the \ref RingBuffer_GetCount() function) in a temporary variable
+		 *  to reduce the time spent in atomicity locks.
+		 *
+		 *  \param[in,out] Buffer  Pointer to a ring buffer structure to insert into.
+		 *
+		 *  \return Boolean \c true if the buffer contains no free space, \c false otherwise.
+		 */
+		static inline bool RingBuffer_IsEmpty(RingBuffer_t* const Buffer) ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(1);
+		static inline bool RingBuffer_IsEmpty(RingBuffer_t* const Buffer)
+		{
+			return (RingBuffer_GetCount(Buffer) == 0);
+		}
+
+		/** Atomically determines if the specified ring buffer contains any free space. This should
+		 *  be tested before storing data to the buffer, to ensure that no data is lost due to a
+		 *  buffer overrun.
+		 *
+		 *  \param[in,out] Buffer  Pointer to a ring buffer structure to insert into.
+		 *
+		 *  \return Boolean \c true if the buffer contains no free space, \c false otherwise.
+		 */
+		static inline bool RingBuffer_IsFull(RingBuffer_t* const Buffer) ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(1);
+		static inline bool RingBuffer_IsFull(RingBuffer_t* const Buffer)
+		{
+			return (RingBuffer_GetCount(Buffer) == Buffer->Size);
+		}
+
+		/** Inserts an element into the ring buffer.
+		 *
+		 *  \warning Only one execution thread (main program thread or an ISR) may insert into a single buffer
+		 *           otherwise data corruption may occur. Insertion and removal may occur from different execution
+		 *           threads.
+		 *
+		 *  \param[in,out] Buffer  Pointer to a ring buffer structure to insert into.
+		 *  \param[in]     Data    Data element to insert into the buffer.
+		 */
+		static inline void RingBuffer_Insert(RingBuffer_t* Buffer,
+		                                     const uint8_t Data) ATTR_NON_NULL_PTR_ARG(1);
+		static inline void RingBuffer_Insert(RingBuffer_t* Buffer,
+		                                     const uint8_t Data)
+		{
+			GCC_FORCE_POINTER_ACCESS(Buffer);
+
+			*Buffer->In = Data;
+
+			if (++Buffer->In == Buffer->End)
+			  Buffer->In = Buffer->Start;
+
+			uint_reg_t CurrentGlobalInt = GetGlobalInterruptMask();
+			GlobalInterruptDisable();
+
+			Buffer->Count++;
+
+			SetGlobalInterruptMask(CurrentGlobalInt);
+		}
+
+		/** Removes an element from the ring buffer.
+		 *
+		 *  \warning Only one execution thread (main program thread or an ISR) may remove from a single buffer
+		 *           otherwise data corruption may occur. Insertion and removal may occur from different execution
+		 *           threads.
+		 *
+		 *  \param[in,out] Buffer  Pointer to a ring buffer structure to retrieve from.
+		 *
+		 *  \return Next data element stored in the buffer.
+		 */
+		static inline uint8_t RingBuffer_Remove(RingBuffer_t* Buffer) ATTR_NON_NULL_PTR_ARG(1);
+		static inline uint8_t RingBuffer_Remove(RingBuffer_t* Buffer)
+		{
+			GCC_FORCE_POINTER_ACCESS(Buffer);
+
+			uint8_t Data = *Buffer->Out;
+
+			if (++Buffer->Out == Buffer->End)
+			  Buffer->Out = Buffer->Start;
+
+			uint_reg_t CurrentGlobalInt = GetGlobalInterruptMask();
+			GlobalInterruptDisable();
+
+			Buffer->Count--;
+
+			SetGlobalInterruptMask(CurrentGlobalInt);
+
+			return Data;
+		}
+
+		/** Returns the next element stored in the ring buffer, without removing it.
+		 *
+		 *  \param[in,out] Buffer  Pointer to a ring buffer structure to retrieve from.
+		 *
+		 *  \return Next data element stored in the buffer.
+		 */
+		static inline uint8_t RingBuffer_Peek(RingBuffer_t* const Buffer) ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(1);
+		static inline uint8_t RingBuffer_Peek(RingBuffer_t* const Buffer)
+		{
+			return *Buffer->Out;
+		}
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Misc/TerminalCodes.h b/lib/lufa/LUFA/Drivers/Misc/TerminalCodes.h
new file mode 100644
index 0000000000..b12a247ed1
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Misc/TerminalCodes.h
@@ -0,0 +1,231 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief ANSI terminal special escape code macros.
+ *
+ *  ANSI terminal compatible escape sequences. These escape sequences are designed to be concatenated with existing
+ *  strings to modify their display on a compatible terminal application.
+ */
+
+/** \ingroup Group_MiscDrivers
+ *  \defgroup Group_Terminal ANSI Terminal Escape Codes - LUFA/Drivers/Misc/TerminalCodes.h
+ *  \brief ANSI terminal special escape code macros.
+ *
+ *  \section Sec_Terminal_Dependencies Module Source Dependencies
+ *  The following files must be built with any user project that uses this module:
+ *    - None
+ *
+ *  \section Sec_Terminal_ModDescription Module Description
+ *  Escape code macros for ANSI compliant text terminals.
+ *
+ *  \note If desired, the macro \c DISABLE_TERMINAL_CODES can be defined in the project makefile and passed to the GCC
+ *        compiler via the -D switch to disable the terminal codes without modifying the source, for use with non
+ *        compatible terminals (any terminal codes then equate to empty strings).
+ *
+ *  \section Sec_Terminal_ExampleUsage Example Usage
+ *  The following snippet is an example of how this module may be used within a typical
+ *  application.
+ *
+ *  \code
+ *      printf("Normal String, "
+ *             ESC_BOLD_ON "Bold String, "
+ *             ESC_UNDERLINE_ON "Bold and Underlined String"
+ *             ESC_RESET ESC_FG_BLUE ESC_BG_YELLOW "Normal Blue-on-Yellow String");
+ *  \endcode
+ *
+ *  @{
+ */
+
+#ifndef __TERMINALCODES_H__
+#define __TERMINALCODES_H__
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			#if !defined(DISABLE_TERMINAL_CODES)
+				/** Creates an ANSI escape sequence with the specified payload.
+				 *
+				 *  \param[in] EscapeSeq  Payload to encode as an ANSI escape sequence, a \c ESC_* mask.
+				 */
+				#define ANSI_ESCAPE_SEQUENCE(EscapeSeq)  "\33[" EscapeSeq
+			#else
+				#define ANSI_ESCAPE_SEQUENCE(EscapeSeq)
+			#endif
+
+			/** \name Text Display Modifier Control Sequences */
+			//@{
+			/** Turns on bold so that any following text is printed to the terminal in bold. */
+			#define ESC_BOLD_ON                     ANSI_ESCAPE_SEQUENCE("1m")
+
+			/** Turns on italics so that any following text is printed to the terminal in italics. */
+			#define ESC_ITALICS_ON                  ANSI_ESCAPE_SEQUENCE("3m")
+
+			/** Turns on underline so that any following text is printed to the terminal underlined. */
+			#define ESC_UNDERLINE_ON                ANSI_ESCAPE_SEQUENCE("4m")
+
+			/** Turns on inverse so that any following text is printed to the terminal in inverted colours. */
+			#define ESC_INVERSE_ON                  ANSI_ESCAPE_SEQUENCE("7m")
+
+			/** Turns on strike-through so that any following text is printed to the terminal with a line through the
+			 *  center.
+			 */
+			#define ESC_STRIKETHROUGH_ON            ANSI_ESCAPE_SEQUENCE("9m")
+
+			/** Turns off bold so that any following text is printed to the terminal in non bold. */
+			#define ESC_BOLD_OFF                    ANSI_ESCAPE_SEQUENCE("22m")
+
+			/** Turns off italics so that any following text is printed to the terminal in non italics. */
+			#define ESC_ITALICS_OFF                 ANSI_ESCAPE_SEQUENCE("23m")
+
+			/** Turns off underline so that any following text is printed to the terminal non underlined. */
+			#define ESC_UNDERLINE_OFF               ANSI_ESCAPE_SEQUENCE("24m")
+
+			/** Turns off inverse so that any following text is printed to the terminal in non inverted colours. */
+			#define ESC_INVERSE_OFF                 ANSI_ESCAPE_SEQUENCE("27m")
+
+			/** Turns off strike-through so that any following text is printed to the terminal without a line through
+			 *  the center.
+			 */
+			#define ESC_STRIKETHROUGH_OFF           ANSI_ESCAPE_SEQUENCE("29m")
+			//@}
+
+			/** \name Text Colour Control Sequences */
+			//@{
+			/** Sets the foreground (text) colour to black. */
+			#define ESC_FG_BLACK                    ANSI_ESCAPE_SEQUENCE("30m")
+
+			/** Sets the foreground (text) colour to red. */
+			#define ESC_FG_RED                      ANSI_ESCAPE_SEQUENCE("31m")
+
+			/** Sets the foreground (text) colour to green. */
+			#define ESC_FG_GREEN                    ANSI_ESCAPE_SEQUENCE("32m")
+
+			/** Sets the foreground (text) colour to yellow. */
+			#define ESC_FG_YELLOW                   ANSI_ESCAPE_SEQUENCE("33m")
+
+			/** Sets the foreground (text) colour to blue. */
+			#define ESC_FG_BLUE                     ANSI_ESCAPE_SEQUENCE("34m")
+
+			/** Sets the foreground (text) colour to magenta. */
+			#define ESC_FG_MAGENTA                  ANSI_ESCAPE_SEQUENCE("35m")
+
+			/** Sets the foreground (text) colour to cyan. */
+			#define ESC_FG_CYAN                     ANSI_ESCAPE_SEQUENCE("36m")
+
+			/** Sets the foreground (text) colour to white. */
+			#define ESC_FG_WHITE                    ANSI_ESCAPE_SEQUENCE("37m")
+
+			/** Sets the foreground (text) colour to the terminal's default. */
+			#define ESC_FG_DEFAULT                  ANSI_ESCAPE_SEQUENCE("39m")
+
+			/** Sets the text background colour to black. */
+			#define ESC_BG_BLACK                    ANSI_ESCAPE_SEQUENCE("40m")
+
+			/** Sets the text background colour to red. */
+			#define ESC_BG_RED                      ANSI_ESCAPE_SEQUENCE("41m")
+
+			/** Sets the text background colour to green. */
+			#define ESC_BG_GREEN                    ANSI_ESCAPE_SEQUENCE("42m")
+
+			/** Sets the text background colour to yellow. */
+			#define ESC_BG_YELLOW                   ANSI_ESCAPE_SEQUENCE("43m")
+
+			/** Sets the text background colour to blue. */
+			#define ESC_BG_BLUE                     ANSI_ESCAPE_SEQUENCE("44m")
+
+			/** Sets the text background colour to magenta. */
+			#define ESC_BG_MAGENTA                  ANSI_ESCAPE_SEQUENCE("45m")
+
+			/** Sets the text background colour to cyan. */
+			#define ESC_BG_CYAN                     ANSI_ESCAPE_SEQUENCE("46m")
+
+			/** Sets the text background colour to white. */
+			#define ESC_BG_WHITE                    ANSI_ESCAPE_SEQUENCE("47m")
+
+			/** Sets the text background colour to the terminal's default. */
+			#define ESC_BG_DEFAULT                  ANSI_ESCAPE_SEQUENCE("49m")
+			//@}
+
+			/** \name Cursor Positioning Control Sequences */
+			//@{
+			/** Saves the current cursor position so that it may be restored with \ref ESC_CURSOR_POS_RESTORE. */
+			#define ESC_CURSOR_POS_SAVE             ANSI_ESCAPE_SEQUENCE("s")
+
+			/** Restores the cursor position to the last position saved with \ref ESC_CURSOR_POS_SAVE. */
+			#define ESC_CURSOR_POS_RESTORE          ANSI_ESCAPE_SEQUENCE("u")
+
+			/** Sets the cursor position to the given line and column.
+			 *
+			 *  \param[in] Line    Line number to position the cursor at.
+			 *  \param[in] Column  Column number to position the cursor at.
+			 */
+			#define ESC_CURSOR_POS(Line, Column)    ANSI_ESCAPE_SEQUENCE(#Line ";" #Column "H")
+
+			/** Moves the cursor up the given number of lines.
+			 *
+			 *  \param[in] Lines  Number of lines to move the cursor position
+			 */
+			#define ESC_CURSOR_UP(Lines)            ANSI_ESCAPE_SEQUENCE(#Lines "A")
+
+			/** Moves the cursor down the given number of lines.
+			 *
+			 *  \param[in] Lines  Number of lines to move the cursor position
+			 */
+			#define ESC_CURSOR_DOWN(Lines)          ANSI_ESCAPE_SEQUENCE(#Lines "B")
+
+			/** Moves the cursor to the right the given number of columns.
+			 *
+			 *  \param[in] Columns  Number of columns to move the cursor position
+			 */
+			#define ESC_CURSOR_FORWARD(Columns)     ANSI_ESCAPE_SEQUENCE(#Columns "C")
+
+			/** Moves the cursor to the left the given number of columns.
+			 *
+			 *  \param[in] Columns  Number of columns to move the cursor position
+			 */
+			#define ESC_CURSOR_BACKWARD(Columns)    ANSI_ESCAPE_SEQUENCE(#Columns "D")
+			//@}
+
+			/** \name Miscellaneous Control Sequences */
+			//@{
+			/** Resets any escape sequence modifiers back to their defaults. */
+			#define ESC_RESET                       ANSI_ESCAPE_SEQUENCE("0m")
+
+			/** Erases the entire display, returning the cursor to the top left. */
+			#define ESC_ERASE_DISPLAY               ANSI_ESCAPE_SEQUENCE("2J")
+
+			/** Erases the current line, returning the cursor to the far left. */
+			#define ESC_ERASE_LINE                  ANSI_ESCAPE_SEQUENCE("K")
+			//@}
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Peripheral/ADC.h b/lib/lufa/LUFA/Drivers/Peripheral/ADC.h
new file mode 100644
index 0000000000..a0182b3c77
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Peripheral/ADC.h
@@ -0,0 +1,75 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Hardware Analogue-to-Digital converter driver.
+ *
+ *  This file is the master dispatch header file for the device-specific ADC driver, for microcontrollers
+ *  containing an ADC.
+ *
+ *  User code should include this file, which will in turn include the correct ADC driver header file for the
+ *  currently selected architecture and microcontroller model.
+ */
+
+/** \ingroup Group_PeripheralDrivers
+ *  \defgroup Group_ADC ADC Driver - LUFA/Drivers/Peripheral/ADC.h
+ *  \brief Hardware Analogue-to-Digital converter driver.
+ *
+ *  \section Sec_ADC_Dependencies Module Source Dependencies
+ *  The following files must be built with any user project that uses this module:
+ *    - None
+ *
+ *  \section Sec_ADC_ModDescription Module Description
+ *  Hardware ADC driver. This module provides an easy to use driver for the hardware ADC
+ *  present on many microcontrollers, for the conversion of analogue signals into the
+ *  digital domain.
+ *
+ *  \note The exact API for this driver may vary depending on the target used - see
+ *        individual target module documentation for the API specific to your target processor.
+ */
+
+#ifndef __ADC_H__
+#define __ADC_H__
+
+	/* Macros: */
+		#define __INCLUDE_FROM_ADC_H
+
+	/* Includes: */
+		#include "../../Common/Common.h"
+
+	/* Includes: */
+		#if (ARCH == ARCH_AVR8)
+			#include "AVR8/ADC_AVR8.h"
+		#else
+			#error The ADC peripheral driver is not currently available for your selected architecture.
+		#endif
+
+#endif
+
diff --git a/lib/lufa/LUFA/Drivers/Peripheral/AVR8/ADC_AVR8.h b/lib/lufa/LUFA/Drivers/Peripheral/AVR8/ADC_AVR8.h
new file mode 100644
index 0000000000..a2b7eded3d
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Peripheral/AVR8/ADC_AVR8.h
@@ -0,0 +1,446 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief ADC Peripheral Driver (AVR8)
+ *
+ *  On-chip Analogue-to-Digital converter (ADC) driver for supported U4, U6 and U7 model AVRs that contain an ADC
+ *  peripheral internally.
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the ADC driver
+ *        dispatch header located in LUFA/Drivers/Peripheral/ADC.h.
+ */
+
+/** \ingroup Group_ADC
+ *  \defgroup Group_ADC_AVR8 ADC Peripheral Driver (AVR8)
+ *
+ *  \section Sec_ADC_AVR8_ModDescription Module Description
+ *  On-chip Analogue-to-Digital converter (ADC) driver for supported U4, U6 and U7 model AVRs that contain an ADC
+ *  peripheral internally.
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the ADC driver
+ *        dispatch header located in LUFA/Drivers/Peripheral/ADC.h.
+ *
+ *  \section Sec_ADC_AVR8_ExampleUsage Example Usage
+ *  The following snippet is an example of how this module may be used within a typical
+ *  application.
+ *
+ *  \code
+ *      // Initialize the ADC driver before first use
+ *      ADC_Init(ADC_FREE_RUNNING | ADC_PRESCALE_32);
+ *
+ *      // Must setup the ADC channel to read beforehand
+ *      ADC_SetupChannel(1);
+ *
+ *      // Perform a single conversion of the ADC channel 1
+ *      ADC_GetChannelReading(ADC_REFERENCE_AVCC | ADC_RIGHT_ADJUSTED | ADC_CHANNEL1);
+ *      printf("Conversion Result: %d\r\n", ADC_GetResult());
+ *
+ *      // Start reading ADC channel 1 in free running (continuous conversion) mode
+ *      ADC_StartReading(ADC_REFERENCE_AVCC | ADC_RIGHT_ADJUSTED | ADC_CHANNEL1);
+ *      for (;;)
+ *      {
+ *           while (!(ADC_IsReadingComplete())) {};
+ *           printf("Conversion Result: %d\r\n", ADC_GetResult());
+ *      }
+ *  \endcode
+ *
+ *  @{
+ */
+
+#ifndef __ADC_AVR8_H__
+#define __ADC_AVR8_H__
+
+	/* Includes: */
+		#include "../../../Common/Common.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_ADC_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Peripheral/ADC.h instead.
+		#endif
+
+		#if !(defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB646__) || \
+		      defined(__AVR_AT90USB1287__) || defined(__AVR_AT90USB647__) || \
+			  defined(__AVR_ATmega16U4__)  || defined(__AVR_ATmega32U4__))
+			#error The ADC peripheral driver is not currently available for your selected microcontroller model.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** \name ADC Reference Configuration Masks */
+			//@{
+			/** Reference mask, for using the voltage present at the AVR's AREF pin for the ADC reference. */
+			#define ADC_REFERENCE_AREF              0
+
+			/** Reference mask, for using the voltage present at the AVR's AVCC pin for the ADC reference. */
+			#define ADC_REFERENCE_AVCC              (1 << REFS0)
+
+			/** Reference mask, for using the internally generated 2.56V reference voltage as the ADC reference. */
+			#define ADC_REFERENCE_INT2560MV         ((1 << REFS1) | (1 << REFS0))
+			//@}
+
+			/** \name ADC Result Adjustment Configuration Masks */
+			//@{
+			/** Left-adjusts the 10-bit ADC result, so that the upper 8 bits of the value returned by the
+			 *  \ref ADC_GetResult() macro contain the 8 most significant bits of the result.
+			 */
+			#define ADC_LEFT_ADJUSTED               (1 << ADLAR)
+
+			/** Right-adjusts the 10-bit ADC result, so that the lower 8 bits of the value returned by the
+			 *  \ref ADC_GetResult() macro contain the 8 least significant bits of the result.
+			 */
+			#define ADC_RIGHT_ADJUSTED              (0 << ADLAR)
+			//@}
+
+			/** \name ADC Mode Configuration Masks */
+			//@{
+			/** Sets the ADC mode to free running, so that conversions take place continuously as fast as the ADC
+			 *  is capable of at the given input clock speed.
+			 */
+			#define ADC_FREE_RUNNING                (1 << ADATE)
+
+			/** Sets the ADC mode to single conversion, so that only a single conversion will take place before
+			 *  the ADC returns to idle.
+			 */
+			#define ADC_SINGLE_CONVERSION           (0 << ADATE)
+			//@}
+
+			/** \name ADC Prescaler Configuration Masks */
+			//@{
+			/** Sets the ADC input clock to prescale by a factor of 2 the AVR's system clock. */
+			#define ADC_PRESCALE_2                  (1 << ADPS0)
+
+			/** Sets the ADC input clock to prescale by a factor of 4 the AVR's system clock. */
+			#define ADC_PRESCALE_4                  (1 << ADPS1)
+
+			/** Sets the ADC input clock to prescale by a factor of 8 the AVR's system clock. */
+			#define ADC_PRESCALE_8                  ((1 << ADPS0) | (1 << ADPS1))
+
+			/** Sets the ADC input clock to prescale by a factor of 16 the AVR's system clock. */
+			#define ADC_PRESCALE_16                 (1 << ADPS2)
+
+			/** Sets the ADC input clock to prescale by a factor of 32 the AVR's system clock. */
+			#define ADC_PRESCALE_32                 ((1 << ADPS2) | (1 << ADPS0))
+
+			/** Sets the ADC input clock to prescale by a factor of 64 the AVR's system clock. */
+			#define ADC_PRESCALE_64                 ((1 << ADPS2) | (1 << ADPS1))
+
+			/** Sets the ADC input clock to prescale by a factor of 128 the AVR's system clock. */
+			#define ADC_PRESCALE_128                ((1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0))
+			//@}
+
+			/** \name ADC MUX Masks */
+			//@{
+			/** MUX mask define for the ADC0 channel of the ADC. See \ref ADC_StartReading() and \ref ADC_GetChannelReading(). */
+			#define ADC_CHANNEL0                    (0x00 << MUX0)
+
+			/** MUX mask define for the ADC1 channel of the ADC. See \ref ADC_StartReading() and \ref ADC_GetChannelReading(). */
+			#define ADC_CHANNEL1                    (0x01 << MUX0)
+
+			#if (!(defined(__AVR_ATmega16U4__) || defined(__AVR_ATmega32U4__)) || defined(__DOXYGEN__))
+				/** MUX mask define for the ADC2 channel of the ADC. See \ref ADC_StartReading() and \ref ADC_GetChannelReading().
+				 *
+				 *  \note Not available on all AVR models.
+				 */
+				#define ADC_CHANNEL2                (0x02 << MUX0)
+
+				/** MUX mask define for the ADC3 channel of the ADC. See \ref ADC_StartReading() and \ref ADC_GetChannelReading().
+				 *
+				 *  \note Not available on all AVR models.
+				 */
+				#define ADC_CHANNEL3                (0x03 << MUX0)
+			#endif
+
+			/** MUX mask define for the ADC4 channel of the ADC. See \ref ADC_StartReading() and \ref ADC_GetChannelReading(). */
+			#define ADC_CHANNEL4                    (0x04 << MUX0)
+
+			/** MUX mask define for the ADC5 channel of the ADC. See \ref ADC_StartReading() and \ref ADC_GetChannelReading(). */
+			#define ADC_CHANNEL5                    (0x05 << MUX0)
+
+			/** MUX mask define for the ADC6 channel of the ADC. See \ref ADC_StartReading() and \ref ADC_GetChannelReading(). */
+			#define ADC_CHANNEL6                    (0x06 << MUX0)
+
+			/** MUX mask define for the ADC7 channel of the ADC. See \ref ADC_StartReading and \ref ADC_GetChannelReading. */
+			#define ADC_CHANNEL7                    (0x07 << MUX0)
+
+			#if (defined(__AVR_ATmega16U4__)  || defined(__AVR_ATmega32U4__) || defined(__DOXYGEN__))
+				/** MUX mask define for the ADC8 channel of the ADC. See \ref ADC_StartReading() and \ref ADC_GetChannelReading().
+				 *
+				 *  \note Not available on all AVR models.
+				 */
+				#define ADC_CHANNEL8                ((1 << 8) | (0x00 << MUX0))
+
+				/** MUX mask define for the ADC9 channel of the ADC. See \ref ADC_StartReading() and \ref ADC_GetChannelReading().
+				 *
+				 *  \note Not available on all AVR models.
+				 */
+				#define ADC_CHANNEL9                ((1 << 8) | (0x01 << MUX0))
+
+				/** MUX mask define for the ADC10 channel of the ADC. See \ref ADC_StartReading() and \ref ADC_GetChannelReading().
+				 *
+				 *  \note Not available on all AVR models.
+				 */
+				#define ADC_CHANNEL10               ((1 << 8) | (0x02 << MUX0))
+
+				/** MUX mask define for the ADC11 channel of the ADC. See \ref ADC_StartReading() and \ref ADC_GetChannelReading().
+				 *
+				 *  \note Not available on all AVR models.
+				 */
+				#define ADC_CHANNEL11               ((1 << 8) | (0x03 << MUX0))
+
+				/** MUX mask define for the ADC12 channel of the ADC. See \ref ADC_StartReading() and \ref ADC_GetChannelReading().
+				 *
+				 *  \note Not available on all AVR models.
+				 */
+				#define ADC_CHANNEL12               ((1 << 8) | (0x04 << MUX0))
+
+				/** MUX mask define for the ADC13 channel of the ADC. See \ref ADC_StartReading() and \ref ADC_GetChannelReading().
+				 *
+				 *  \note Not available on all AVR models.
+				 */
+				#define ADC_CHANNEL13               ((1 << 8) | (0x05 << MUX0))
+
+				/** MUX mask define for the internal temperature sensor channel of the ADC. See \ref ADC_StartReading() and
+				 *  \ref ADC_GetChannelReading().
+				 *
+				 *  \note Not available on all AVR models.
+				 */
+				#define ADC_INT_TEMP_SENS           ((1 << 8) | (0x07 << MUX0))
+			#endif
+
+			/** MUX mask define for the internal 1.1V band-gap channel of the ADC. See \ref ADC_StartReading() and \ref ADC_GetChannelReading(). */
+			#define ADC_1100MV_BANDGAP              (0x1E << MUX0)
+
+			/** Retrieves the ADC MUX mask for the given ADC channel number.
+			 *
+			 *  \attention This macro will only work correctly on channel numbers that are compile-time
+			 *             constants defined by the preprocessor.
+			 *
+			 *  \param[in] Channel  Index of the ADC channel whose MUX mask is to be retrieved.
+			 */
+			#define ADC_GET_CHANNEL_MASK(Channel)   CONCAT_EXPANDED(ADC_CHANNEL, Channel)
+			//@}
+
+		/* Inline Functions: */
+			/** Configures the given ADC channel, ready for ADC conversions. This function sets the
+			 *  associated port pin as an input and disables the digital portion of the I/O to reduce
+			 *  power consumption.
+			 *
+			 *  \note This must only be called for ADC channels with are connected to a physical port
+			 *        pin of the AVR, denoted by its special alternative function ADCx.
+			 *
+			 *  \warning The channel number must be specified as an integer, and <b>not</b> a \c ADC_CHANNEL* mask.
+			 *
+			 *  \param[in] ChannelIndex  ADC channel number to set up for conversions.
+			 */
+			static inline void ADC_SetupChannel(const uint8_t ChannelIndex)
+			{
+				#if (defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB646__) || \
+					 defined(__AVR_AT90USB1287__) || defined(__AVR_AT90USB647__))
+				DDRF  &= ~(1 << ChannelIndex);
+				DIDR0 |=  (1 << ChannelIndex);
+				#elif (defined(__AVR_ATmega16U4__) || defined(__AVR_ATmega32U4__))
+				if (ChannelIndex < 8)
+				{
+					DDRF  &= ~(1 << ChannelIndex);
+					DIDR0 |=  (1 << ChannelIndex);
+				}
+				else if (ChannelIndex == 8)
+				{
+					DDRD  &= ~(1 << 4);
+					DIDR2 |=  (1 << 0);
+				}
+				else if (ChannelIndex < 11)
+				{
+					DDRD  &= ~(1 << (ChannelIndex - 3));
+					DIDR2 |=  (1 << (ChannelIndex - 8));
+				}
+				else
+				{
+					DDRB  &= ~(1 << (ChannelIndex - 7));
+					DIDR2 |=  (1 << (ChannelIndex - 8));
+				}
+				#endif
+			}
+
+			/** De-configures the given ADC channel, re-enabling digital I/O mode instead of analog. This
+			 *  function sets the associated port pin as an input and re-enabled the digital portion of
+			 *  the I/O.
+			 *
+			 *  \note This must only be called for ADC channels with are connected to a physical port
+			 *        pin of the AVR, denoted by its special alternative function ADCx.
+			 *
+			 *  \warning The channel number must be specified as an integer, and <b>not</b> a \c ADC_CHANNEL* mask.
+			 *
+			 *  \param[in] ChannelIndex  ADC channel number to set up for conversions.
+			 */
+			static inline void ADC_DisableChannel(const uint8_t ChannelIndex)
+			{
+				#if (defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB646__) || \
+					 defined(__AVR_AT90USB1287__) || defined(__AVR_AT90USB647__))
+				DDRF  &= ~(1 << ChannelIndex);
+				DIDR0 &= ~(1 << ChannelIndex);
+				#elif (defined(__AVR_ATmega16U4__) || defined(__AVR_ATmega32U4__))
+				if (ChannelIndex < 8)
+				{
+					DDRF  &= ~(1 << ChannelIndex);
+					DIDR0 &= ~(1 << ChannelIndex);
+				}
+				else if (ChannelIndex == 8)
+				{
+					DDRD  &= ~(1 << 4);
+					DIDR2 &= ~(1 << 0);
+				}
+				else if (ChannelIndex < 11)
+				{
+					DDRD  &= ~(1 << (ChannelIndex - 3));
+					DIDR2 &= ~(1 << (ChannelIndex - 8));
+				}
+				else
+				{
+					DDRB  &= ~(1 << (ChannelIndex - 7));
+					DIDR2 &= ~(1 << (ChannelIndex - 8));
+				}
+				#endif
+			}
+
+			/** Starts the reading of the given channel, but does not wait until the conversion has completed.
+			 *  Once executed, the conversion status can be determined via the \ref ADC_IsReadingComplete() macro and
+			 *  the result read via the \ref ADC_GetResult() macro.
+			 *
+			 *  If the ADC has been initialized in free running mode, calling this function once will begin the repeated
+			 *  conversions. If the ADC is in single conversion mode (or the channel to convert from is to be changed),
+			 *  this function must be called each time a conversion is to take place.
+			 *
+			 *  \param[in] MUXMask  ADC channel mask, reference mask and adjustment mask.
+			 */
+			static inline void ADC_StartReading(const uint16_t MUXMask)
+			{
+				ADMUX = MUXMask;
+
+				#if (defined(__AVR_ATmega16U4__)  || defined(__AVR_ATmega32U4__) || defined(__DOXYGEN__))
+				if (MUXMask & (1 << 8))
+				  ADCSRB |=  (1 << MUX5);
+				else
+				  ADCSRB &= ~(1 << MUX5);
+				#endif
+
+				ADCSRA |= (1 << ADSC);
+			}
+
+			/** Indicates if the current ADC conversion is completed, or still in progress.
+			 *
+			 *  \return Boolean \c false if the reading is still taking place, or true if the conversion is
+			 *          complete and ready to be read out with \ref ADC_GetResult().
+			 */
+			static inline bool ADC_IsReadingComplete(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline bool ADC_IsReadingComplete(void)
+			{
+				return ((ADCSRA & (1 << ADIF)) ? true : false);
+			}
+
+			/** Retrieves the conversion value of the last completed ADC conversion and clears the reading
+			 *  completion flag.
+			 *
+			 *  \return The result of the last ADC conversion as an unsigned value.
+			 */
+			static inline uint16_t ADC_GetResult(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline uint16_t ADC_GetResult(void)
+			{
+				ADCSRA |= (1 << ADIF);
+				return ADC;
+			}
+
+			/** Performs a complete single reading from channel, including a polling spin-loop to wait for the
+			 *  conversion to complete, and the returning of the converted value.
+			 *
+			 *  \note For free running mode, the automated conversions should be initialized with a single call
+			 *        to \ref ADC_StartReading() to select the channel and begin the automated conversions, and
+			 *        the results read directly from the \ref ADC_GetResult() instead to reduce overhead.
+			 *
+			 *  \param[in] MUXMask  Mask comprising of an ADC channel mask, reference mask and adjustment mask.
+			 *
+			 *  \return Converted ADC result for the given ADC channel.
+			 */
+			static inline uint16_t ADC_GetChannelReading(const uint16_t MUXMask) ATTR_WARN_UNUSED_RESULT;
+			static inline uint16_t ADC_GetChannelReading(const uint16_t MUXMask)
+			{
+				ADC_StartReading(MUXMask);
+
+				while (!(ADC_IsReadingComplete()));
+
+				return ADC_GetResult();
+			}
+
+			/** Initializes the ADC, ready for conversions. This must be called before any other ADC operations.
+			 *  The "mode" parameter should be a mask comprised of a conversion mode (free running or single) and
+			 *  prescaler masks.
+			 *
+			 *  \param[in] Mode  Mask of ADC prescale and mode settings.
+			 */
+			static inline void ADC_Init(const uint8_t Mode) ATTR_ALWAYS_INLINE;
+			static inline void ADC_Init(const uint8_t Mode)
+			{
+				ADCSRA = ((1 << ADEN) | Mode);
+			}
+
+			/** Turns off the ADC. If this is called, any further ADC operations will require a call to
+			 *  \ref ADC_Init() before the ADC can be used again.
+			 */
+			static inline void ADC_Disable(void) ATTR_ALWAYS_INLINE;
+			static inline void ADC_Disable(void)
+			{
+				ADCSRA = 0;
+			}
+
+			/** Indicates if the ADC is currently enabled.
+			 *
+			 *  \return Boolean \c true if the ADC subsystem is currently enabled, \c false otherwise.
+			 */
+			static inline bool ADC_GetStatus(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline bool ADC_GetStatus(void)
+			{
+				return ((ADCSRA & (1 << ADEN)) ? true : false);
+			}
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Peripheral/AVR8/SPI_AVR8.h b/lib/lufa/LUFA/Drivers/Peripheral/AVR8/SPI_AVR8.h
new file mode 100644
index 0000000000..7244f4a954
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Peripheral/AVR8/SPI_AVR8.h
@@ -0,0 +1,258 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief SPI Peripheral Driver (AVR8)
+ *
+ *  On-chip SPI driver for the 8-bit AVR microcontrollers.
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the SPI driver
+ *        dispatch header located in LUFA/Drivers/Peripheral/SPI.h.
+ */
+
+/** \ingroup Group_SPI
+ *  \defgroup Group_SPI_AVR8 SPI Peripheral Driver (AVR8)
+ *
+ *  \section Sec_SPI_AVR8_ModDescription Module Description
+ *  Driver for the hardware SPI port available on most 8-bit AVR microcontroller models. This
+ *  module provides an easy to use driver for the setup and transfer of data over the
+ *  AVR's SPI port.
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the SPI driver
+ *        dispatch header located in LUFA/Drivers/Peripheral/SPI.h.
+ *
+ *  \section Sec_SPI_AVR8_ExampleUsage Example Usage
+ *  The following snippet is an example of how this module may be used within a typical
+ *  application.
+ *
+ *  \code
+ *      // Initialize the SPI driver before first use
+ *      SPI_Init(SPI_SPEED_FCPU_DIV_2 | SPI_ORDER_MSB_FIRST | SPI_SCK_LEAD_FALLING |
+ *               SPI_SAMPLE_TRAILING | SPI_MODE_MASTER);
+ *
+ *      // Send several bytes, ignoring the returned data
+ *      SPI_SendByte(0x01);
+ *      SPI_SendByte(0x02);
+ *      SPI_SendByte(0x03);
+ *
+ *      // Receive several bytes, sending a dummy 0x00 byte each time
+ *      uint8_t Byte1 = SPI_ReceiveByte();
+ *      uint8_t Byte2 = SPI_ReceiveByte();
+ *      uint8_t Byte3 = SPI_ReceiveByte();
+ *
+ *      // Send a byte, and store the received byte from the same transaction
+ *      uint8_t ResponseByte = SPI_TransferByte(0xDC);
+ *  \endcode
+ *
+ *  @{
+ */
+
+#ifndef __SPI_AVR8_H__
+#define __SPI_AVR8_H__
+
+	/* Includes: */
+		#include "../../../Common/Common.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_SPI_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Peripheral/SPI.h instead.
+		#endif
+
+	/* Private Interface - For use in library only: */
+	#if !defined(__DOXYGEN__)
+		/* Macros: */
+			#define SPI_USE_DOUBLESPEED            (1 << SPE)
+	#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** \name SPI Prescaler Configuration Masks */
+			//@{
+			/** SPI prescaler mask for \ref SPI_Init(). Divides the system clock by a factor of 2. */
+			#define SPI_SPEED_FCPU_DIV_2           SPI_USE_DOUBLESPEED
+
+			/** SPI prescaler mask for \ref SPI_Init(). Divides the system clock by a factor of 4. */
+			#define SPI_SPEED_FCPU_DIV_4           0
+
+			/** SPI prescaler mask for \ref SPI_Init(). Divides the system clock by a factor of 8. */
+			#define SPI_SPEED_FCPU_DIV_8           (SPI_USE_DOUBLESPEED | (1 << SPR0))
+
+			/** SPI prescaler mask for \ref SPI_Init(). Divides the system clock by a factor of 16. */
+			#define SPI_SPEED_FCPU_DIV_16          (1 << SPR0)
+
+			/** SPI prescaler mask for \ref SPI_Init(). Divides the system clock by a factor of 32. */
+			#define SPI_SPEED_FCPU_DIV_32          (SPI_USE_DOUBLESPEED | (1 << SPR1))
+
+			/** SPI prescaler mask for \ref SPI_Init(). Divides the system clock by a factor of 64. */
+			#define SPI_SPEED_FCPU_DIV_64          (SPI_USE_DOUBLESPEED | (1 << SPR1) | (1 << SPR0))
+
+			/** SPI prescaler mask for \ref SPI_Init(). Divides the system clock by a factor of 128. */
+			#define SPI_SPEED_FCPU_DIV_128         ((1 << SPR1) | (1 << SPR0))
+			//@}
+
+			/** \name SPI SCK Polarity Configuration Masks */
+			//@{
+			/** SPI clock polarity mask for \ref SPI_Init(). Indicates that the SCK should lead on the rising edge. */
+			#define SPI_SCK_LEAD_RISING            (0 << CPOL)
+
+			/** SPI clock polarity mask for \ref SPI_Init(). Indicates that the SCK should lead on the falling edge. */
+			#define SPI_SCK_LEAD_FALLING           (1 << CPOL)
+			//@}
+
+			/** \name SPI Sample Edge Configuration Masks */
+			//@{
+			/** SPI data sample mode mask for \ref SPI_Init(). Indicates that the data should sampled on the leading edge. */
+			#define SPI_SAMPLE_LEADING             (0 << CPHA)
+
+			/** SPI data sample mode mask for \ref SPI_Init(). Indicates that the data should be sampled on the trailing edge. */
+			#define SPI_SAMPLE_TRAILING            (1 << CPHA)
+			//@}
+
+			/** \name SPI Data Ordering Configuration Masks */
+			//@{
+			/** SPI data order mask for \ref SPI_Init(). Indicates that data should be shifted out MSB first. */
+			#define SPI_ORDER_MSB_FIRST            (0 << DORD)
+
+			/** SPI data order mask for \ref SPI_Init(). Indicates that data should be shifted out LSB first. */
+			#define SPI_ORDER_LSB_FIRST            (1 << DORD)
+			//@}
+
+			/** \name SPI Mode Configuration Masks */
+			//@{
+			/** SPI mode mask for \ref SPI_Init(). Indicates that the SPI interface should be initialized into slave mode. */
+			#define SPI_MODE_SLAVE                 (0 << MSTR)
+
+			/** SPI mode mask for \ref SPI_Init(). Indicates that the SPI interface should be initialized into master mode. */
+			#define SPI_MODE_MASTER                (1 << MSTR)
+			//@}
+
+		/* Inline Functions: */
+			/** Initializes the SPI subsystem, ready for transfers. Must be called before calling any other
+			 *  SPI routines.
+			 *
+			 *  \param[in] SPIOptions  SPI Options, a mask consisting of one of each of the \c SPI_SPEED_*,
+			 *                         \c SPI_SCK_*, \c SPI_SAMPLE_*, \c SPI_ORDER_* and \c SPI_MODE_* masks.
+			 */
+			static inline void SPI_Init(const uint8_t SPIOptions);
+			static inline void SPI_Init(const uint8_t SPIOptions)
+			{
+				/* Prevent high rise times on PB.0 (/SS) from forcing a change to SPI slave mode */
+				DDRB  |= (1 << 0);
+				PORTB |= (1 << 0);
+
+				DDRB  |=  ((1 << 1) | (1 << 2));
+				DDRB  &= ~(1 << 3);
+				PORTB |=  (1 << 3);
+
+				if (SPIOptions & SPI_USE_DOUBLESPEED)
+				  SPSR |= (1 << SPI2X);
+				else
+				  SPSR &= ~(1 << SPI2X);
+
+				/* Switch /SS to input mode after configuration to allow for forced mode changes */
+				DDRB &= ~(1 << 0);
+
+				SPCR  = ((1 << SPE) | SPIOptions);
+			}
+
+			/** Turns off the SPI driver, disabling and returning used hardware to their default configuration. */
+			static inline void SPI_Disable(void);
+			static inline void SPI_Disable(void)
+			{
+				DDRB  &= ~((1 << 1) | (1 << 2));
+				PORTB &= ~((1 << 0) | (1 << 3));
+
+				SPCR   = 0;
+				SPSR   = 0;
+			}
+
+			/** Retrieves the currently selected SPI mode, once the SPI interface has been configured.
+			 *
+			 *  \return \ref SPI_MODE_MASTER if the interface is currently in SPI Master mode, \ref SPI_MODE_SLAVE otherwise
+			 */
+			static inline uint8_t SPI_GetCurrentMode(void) ATTR_ALWAYS_INLINE;
+			static inline uint8_t SPI_GetCurrentMode(void)
+			{
+				return (SPCR & SPI_MODE_MASTER);
+			}
+
+			/** Sends and receives a byte through the SPI interface, blocking until the transfer is complete.
+			 *
+			 *  \param[in] Byte  Byte to send through the SPI interface.
+			 *
+			 *  \return Response byte from the attached SPI device.
+			 */
+			static inline uint8_t SPI_TransferByte(const uint8_t Byte) ATTR_ALWAYS_INLINE;
+			static inline uint8_t SPI_TransferByte(const uint8_t Byte)
+			{
+				SPDR = Byte;
+				while (!(SPSR & (1 << SPIF)));
+				return SPDR;
+			}
+
+			/** Sends a byte through the SPI interface, blocking until the transfer is complete. The response
+			 *  byte sent to from the attached SPI device is ignored.
+			 *
+			 *  \param[in] Byte  Byte to send through the SPI interface.
+			 */
+			static inline void SPI_SendByte(const uint8_t Byte) ATTR_ALWAYS_INLINE;
+			static inline void SPI_SendByte(const uint8_t Byte)
+			{
+				SPDR = Byte;
+				while (!(SPSR & (1 << SPIF)));
+			}
+
+			/** Sends a dummy byte through the SPI interface, blocking until the transfer is complete. The response
+			 *  byte from the attached SPI device is returned.
+			 *
+			 *  \return The response byte from the attached SPI device.
+			 */
+			static inline uint8_t SPI_ReceiveByte(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t SPI_ReceiveByte(void)
+			{
+				SPDR = 0x00;
+				while (!(SPSR & (1 << SPIF)));
+				return SPDR;
+			}
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Peripheral/AVR8/SerialSPI_AVR8.h b/lib/lufa/LUFA/Drivers/Peripheral/AVR8/SerialSPI_AVR8.h
new file mode 100644
index 0000000000..052780e733
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Peripheral/AVR8/SerialSPI_AVR8.h
@@ -0,0 +1,208 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Master SPI Mode Serial USART Peripheral Driver (XMEGA)
+ *
+ *  On-chip Master SPI mode USART driver for the XMEGA AVR microcontrollers.
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the SPI Master
+ *        Mode USART driver dispatch header located in LUFA/Drivers/Peripheral/Serial.h.
+ */
+
+/** \ingroup Group_SerialSPI
+ *  \defgroup Group_SerialSPI_AVR8 Master SPI Mode Serial USART Peripheral Driver (AVR8)
+ *
+ *  \section Sec_SerialSPI_AVR8_ModDescription Module Description
+ *  On-chip serial USART driver for the 8-bit AVR8 microcontrollers.
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the SPI Master
+ *        driver dispatch header located in LUFA/Drivers/Peripheral/SerialSPI.h.
+ *
+ *  \section Sec_SerialSPI_AVR8_ExampleUsage Example Usage
+ *  The following snippet is an example of how this module may be used within a typical
+ *  application.
+ *
+ *  \code
+ *      // Initialize the Master SPI mode USART driver before first use, with 1Mbit baud
+ *      SerialSPI_Init((USART_SPI_SCK_LEAD_RISING | USART_SPI_SAMPLE_LEADING | USART_SPI_ORDER_MSB_FIRST), 1000000);
+ *
+ *      // Send several bytes, ignoring the returned data
+ *      SerialSPI_SendByte(0x01);
+ *      SerialSPI_SendByte(0x02);
+ *      SerialSPI_SendByte(0x03);
+ *
+ *      // Receive several bytes, sending a dummy 0x00 byte each time
+ *      uint8_t Byte1 = SerialSPI_ReceiveByte();
+ *      uint8_t Byte2 = SerialSPI_ReceiveByte();
+ *      uint8_t Byte3 = SerialSPI_ReceiveByte();
+ *
+ *      // Send a byte, and store the received byte from the same transaction
+ *      uint8_t ResponseByte = SerialSPI_TransferByte(0xDC);
+ *  \endcode
+ *
+ *  @{
+ */
+
+#ifndef __SERIAL_SPI_AVR8_H__
+#define __SERIAL_SPI_AVR8_H__
+
+	/* Includes: */
+		#include "../../../Common/Common.h"
+
+		#include <stdio.h>
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_SERIAL_SPI_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Peripheral/Serial.h instead.
+		#endif
+
+	/* Private Interface - For use in library only: */
+		#if !defined(__DOXYGEN__)
+			#define SERIAL_SPI_UBBRVAL(Baud)             ((Baud < (F_CPU / 2)) ? ((F_CPU / (2 * Baud)) - 1) : 0)
+
+			/* Master USART SPI mode flag definitions missing in the AVR8 toolchain */
+			#if !defined(UCPHA1)
+				#define UCPHA1                           1
+			#endif
+			#if !defined(UDORD1)
+				#define UDORD1                           2
+			#endif
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** \name SPI SCK Polarity Configuration Masks */
+			//@{
+			/** SPI clock polarity mask for \ref SPI_Init(). Indicates that the SCK should lead on the rising edge. */
+			#define USART_SPI_SCK_LEAD_RISING            (0 << UCPOL1)
+
+			/** SPI clock polarity mask for \ref SPI_Init(). Indicates that the SCK should lead on the falling edge. */
+			#define USART_SPI_SCK_LEAD_FALLING           (1 << UCPOL1)
+			//@}
+
+			/** \name SPI Sample Edge Configuration Masks */
+			//@{
+			/** SPI data sample mode mask for \ref SerialSPI_Init(). Indicates that the data should sampled on the leading edge. */
+			#define USART_SPI_SAMPLE_LEADING             (0 << UCPHA1)
+
+			/** SPI data sample mode mask for \ref SerialSPI_Init(). Indicates that the data should be sampled on the trailing edge. */
+			#define USART_SPI_SAMPLE_TRAILING            (1 << UCPHA1)
+			//@}
+
+			/** \name SPI Data Ordering Configuration Masks */
+			//@{
+			/** SPI data order mask for \ref SerialSPI_Init(). Indicates that data should be shifted out MSB first. */
+			#define USART_SPI_ORDER_MSB_FIRST            (0 << UDORD1)
+
+			/** SPI data order mask for \ref SerialSPI_Init(). Indicates that data should be shifted out LSB first. */
+			#define USART_SPI_ORDER_LSB_FIRST            (1 << UDORD1)
+			//@}
+
+		/* Inline Functions: */
+			/** Initialize the USART module in Master SPI mode.
+			 *
+			 *  \param[in]     SPIOptions   USART SPI Options, a mask consisting of one of each of the \c USART_SPI_SCK_*,
+			 *                              \c USART_SPI_SAMPLE_* and \c USART_SPI_ORDER_* masks.
+			 *  \param[in]     BaudRate     SPI baud rate, in bits per second.
+			 */
+			static inline void SerialSPI_Init(const uint8_t SPIOptions,
+			                                  const uint32_t BaudRate)
+			{
+				DDRD  |= ((1 << 3) | (1 << 5));
+				PORTD |= (1 << 2);
+
+				UCSR1C = ((1 << UMSEL11) | (1 << UMSEL10) | SPIOptions);
+				UCSR1B = ((1 << TXEN1)  | (1 << RXEN1));
+
+				UBRR1  = SERIAL_SPI_UBBRVAL(BaudRate);
+			}
+
+			/** Turns off the USART driver, disabling and returning used hardware to their default configuration. */
+			static inline void SerialSPI_Disable(void)
+			{
+				UCSR1B = 0;
+				UCSR1A = 0;
+				UCSR1C = 0;
+
+				UBRR1  = 0;
+
+				DDRD  &= ~((1 << 3) | (1 << 5));
+				PORTD &= ~(1 << 2);
+			}
+
+			/** Sends and receives a byte through the USART SPI interface, blocking until the transfer is complete.
+			 *
+			 *  \param[in] DataByte  Byte to send through the USART SPI interface.
+			 *
+			 *  \return Response byte from the attached SPI device.
+			 */
+			static inline uint8_t SerialSPI_TransferByte(const uint8_t DataByte)
+			{
+				UDR1 = DataByte;
+				while (!(UCSR1A & (1 << TXC1)));
+				UCSR1A = (1 << TXC1);
+				return UDR1;
+			}
+
+			/** Sends a byte through the USART SPI interface, blocking until the transfer is complete. The response
+			 *  byte sent to from the attached SPI device is ignored.
+			 *
+			 *  \param[in] DataByte  Byte to send through the USART SPI interface.
+			 */
+			static inline void SerialSPI_SendByte(const uint8_t DataByte)
+			{
+				SerialSPI_TransferByte(DataByte);
+			}
+
+			/** Sends a dummy byte through the USART SPI interface, blocking until the transfer is complete. The response
+			 *  byte from the attached SPI device is returned.
+			 *
+			 *  \return The response byte from the attached SPI device.
+			 */
+			static inline uint8_t SerialSPI_ReceiveByte(void)
+			{
+				return SerialSPI_TransferByte(0);
+			}
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Peripheral/AVR8/Serial_AVR8.c b/lib/lufa/LUFA/Drivers/Peripheral/AVR8/Serial_AVR8.c
new file mode 100644
index 0000000000..779a80c48c
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Peripheral/AVR8/Serial_AVR8.c
@@ -0,0 +1,121 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+#include "../../../Common/Common.h"
+#if (ARCH == ARCH_AVR8)
+
+#define  __INCLUDE_FROM_SERIAL_C
+#include "../Serial.h"
+
+FILE USARTSerialStream;
+
+int Serial_putchar(char DataByte,
+                   FILE *Stream)
+{
+	(void)Stream;
+
+	Serial_SendByte(DataByte);
+	return 0;
+}
+
+int Serial_getchar(FILE *Stream)
+{
+	(void)Stream;
+
+	if (!(Serial_IsCharReceived()))
+	  return _FDEV_EOF;
+
+	return Serial_ReceiveByte();
+}
+
+int Serial_getchar_Blocking(FILE *Stream)
+{
+	(void)Stream;
+
+	while (!(Serial_IsCharReceived()));
+	return Serial_ReceiveByte();
+}
+
+void Serial_SendString_P(const char* FlashStringPtr)
+{
+	uint8_t CurrByte;
+
+	while ((CurrByte = pgm_read_byte(FlashStringPtr)) != 0x00)
+	{
+		Serial_SendByte(CurrByte);
+		FlashStringPtr++;
+	}
+}
+
+void Serial_SendString(const char* StringPtr)
+{
+	uint8_t CurrByte;
+
+	while ((CurrByte = *StringPtr) != 0x00)
+	{
+		Serial_SendByte(CurrByte);
+		StringPtr++;
+	}
+}
+
+void Serial_SendData(const void* Buffer,
+                     uint16_t Length)
+{
+	uint8_t* CurrByte = (uint8_t*)Buffer;
+
+	while (Length--)
+	  Serial_SendByte(*(CurrByte++));
+}
+
+void Serial_CreateStream(FILE* Stream)
+{
+	if (!(Stream))
+	{
+		Stream = &USARTSerialStream;
+		stdin  = Stream;
+		stdout = Stream;
+	}
+
+	*Stream = (FILE)FDEV_SETUP_STREAM(Serial_putchar, Serial_getchar, _FDEV_SETUP_RW);
+}
+
+void Serial_CreateBlockingStream(FILE* Stream)
+{
+	if (!(Stream))
+	{
+		Stream = &USARTSerialStream;
+		stdin  = Stream;
+		stdout = Stream;
+	}
+
+	*Stream = (FILE)FDEV_SETUP_STREAM(Serial_putchar, Serial_getchar_Blocking, _FDEV_SETUP_RW);
+}
+
+#endif
diff --git a/lib/lufa/LUFA/Drivers/Peripheral/AVR8/Serial_AVR8.h b/lib/lufa/LUFA/Drivers/Peripheral/AVR8/Serial_AVR8.h
new file mode 100644
index 0000000000..b3e7ee36a4
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Peripheral/AVR8/Serial_AVR8.h
@@ -0,0 +1,271 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Serial USART Peripheral Driver (AVR8)
+ *
+ *  On-chip serial USART driver for the 8-bit AVR microcontrollers.
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the USART driver
+ *        dispatch header located in LUFA/Drivers/Peripheral/Serial.h.
+ */
+
+/** \ingroup Group_Serial
+ *  \defgroup Group_Serial_AVR8 Serial USART Peripheral Driver (AVR8)
+ *
+ *  \section Sec_Serial_AVR8_ModDescription Module Description
+ *  On-chip serial USART driver for the 8-bit AVR microcontrollers.
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the USART driver
+ *        dispatch header located in LUFA/Drivers/Peripheral/Serial.h.
+ *
+ *  \section Sec_Serial_AVR8_ExampleUsage Example Usage
+ *  The following snippet is an example of how this module may be used within a typical
+ *  application.
+ *
+ *  \code
+ *      // Initialize the serial USART driver before first use, with 9600 baud (and no double-speed mode)
+ *      Serial_Init(9600, false);
+ *
+ *      // Send a string through the USART
+ *      Serial_SendString("Test String\r\n");
+ *
+ *      // Send a raw byte through the USART
+ *      Serial_SendByte(0xDC);
+ *
+ *      // Receive a byte through the USART (or -1 if no data received)
+ *      int16_t DataByte = Serial_ReceiveByte();
+ *  \endcode
+ *
+ *  @{
+ */
+
+#ifndef __SERIAL_AVR8_H__
+#define __SERIAL_AVR8_H__
+
+	/* Includes: */
+		#include "../../../Common/Common.h"
+		#include "../../Misc/TerminalCodes.h"
+
+		#include <stdio.h>
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_SERIAL_H) && !defined(__INCLUDE_FROM_SERIAL_C)
+			#error Do not include this file directly. Include LUFA/Drivers/Peripheral/Serial.h instead.
+		#endif
+
+	/* Private Interface - For use in library only: */
+	#if !defined(__DOXYGEN__)
+		/* External Variables: */
+			extern FILE USARTSerialStream;
+
+		/* Function Prototypes: */
+			int Serial_putchar(char DataByte,
+			                   FILE *Stream);
+			int Serial_getchar(FILE *Stream);
+			int Serial_getchar_Blocking(FILE *Stream);
+	#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Macro for calculating the baud value from a given baud rate when the \c U2X (double speed) bit is
+			 *  not set.
+			 *
+			 *  \param[in] Baud  Target serial UART baud rate.
+			 *
+			 *  \return Closest UBRR register value for the given UART frequency.
+			 */
+			#define SERIAL_UBBRVAL(Baud)    ((((F_CPU / 16) + (Baud / 2)) / (Baud)) - 1)
+
+			/** Macro for calculating the baud value from a given baud rate when the \c U2X (double speed) bit is
+			 *  set.
+			 *
+			 *  \param[in] Baud  Target serial UART baud rate.
+			 *
+			 *  \return Closest UBRR register value for the given UART frequency.
+			 */
+			#define SERIAL_2X_UBBRVAL(Baud) ((((F_CPU / 8) + (Baud / 2)) / (Baud)) - 1)
+
+		/* Function Prototypes: */
+			/** Transmits a given NUL terminated string located in program space (FLASH) through the USART.
+			 *
+			 *  \param[in] FlashStringPtr  Pointer to a string located in program space.
+			 */
+			void Serial_SendString_P(const char* FlashStringPtr) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Transmits a given NUL terminated string located in SRAM memory through the USART.
+			 *
+			 *  \param[in] StringPtr  Pointer to a string located in SRAM space.
+			 */
+			void Serial_SendString(const char* StringPtr) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Transmits a given buffer located in SRAM memory through the USART.
+			 *
+			 *  \param[in] Buffer  Pointer to a buffer containing the data to send.
+			 *  \param[in] Length  Length of the data to send, in bytes.
+			 */
+			void Serial_SendData(const void* Buffer, uint16_t Length) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Creates a standard character stream from the USART so that it can be used with all the regular functions
+			 *  in the avr-libc \c <stdio.h> library that accept a \c FILE stream as a destination (e.g. \c fprintf). The created
+			 *  stream is bidirectional and can be used for both input and output functions.
+			 *
+			 *  Reading data from this stream is non-blocking, i.e. in most instances, complete strings cannot be read in by a single
+			 *  fetch, as the endpoint will not be ready at some point in the transmission, aborting the transfer. However, this may
+			 *  be used when the read data is processed byte-per-bye (via \c getc()) or when the user application will implement its own
+			 *  line buffering.
+			 *
+			 *  \param[in,out] Stream  Pointer to a FILE structure where the created stream should be placed, if \c NULL, \c stdout
+			 *                         and \c stdin will be configured to use the USART.
+			 *
+			 *  \pre The USART must first be configured via a call to \ref Serial_Init() before the stream is used.
+			 */
+			void Serial_CreateStream(FILE* Stream);
+
+			/** Identical to \ref Serial_CreateStream(), except that reads are blocking until the calling stream function terminates
+			 *  the transfer.
+			 *
+			 *  \param[in,out] Stream  Pointer to a FILE structure where the created stream should be placed, if \c NULL, \c stdout
+			 *                         and \c stdin will be configured to use the USART.
+			 *
+			 *  \pre The USART must first be configured via a call to \ref Serial_Init() before the stream is used.
+			 */
+			void Serial_CreateBlockingStream(FILE* Stream);
+
+		/* Inline Functions: */
+			/** Initializes the USART, ready for serial data transmission and reception. This initializes the interface to
+			 *  standard 8-bit, no parity, 1 stop bit settings suitable for most applications.
+			 *
+			 *  \param[in] BaudRate     Serial baud rate, in bits per second. This should be the target baud rate regardless of the
+			 *                          \c DoubleSpeed parameter's value.
+			 *  \param[in] DoubleSpeed  Enables double speed mode when set, halving the sample time to double the baud rate.
+			 */
+			static inline void Serial_Init(const uint32_t BaudRate,
+			                               const bool DoubleSpeed);
+			static inline void Serial_Init(const uint32_t BaudRate,
+			                               const bool DoubleSpeed)
+			{
+				UBRR1  = (DoubleSpeed ? SERIAL_2X_UBBRVAL(BaudRate) : SERIAL_UBBRVAL(BaudRate));
+
+				UCSR1C = ((1 << UCSZ11) | (1 << UCSZ10));
+				UCSR1A = (DoubleSpeed ? (1 << U2X1) : 0);
+				UCSR1B = ((1 << TXEN1)  | (1 << RXEN1));
+
+				DDRD  |= (1 << 3);
+				PORTD |= (1 << 2);
+			}
+
+			/** Turns off the USART driver, disabling and returning used hardware to their default configuration. */
+			static inline void Serial_Disable(void);
+			static inline void Serial_Disable(void)
+			{
+				UCSR1B = 0;
+				UCSR1A = 0;
+				UCSR1C = 0;
+
+				UBRR1  = 0;
+
+				DDRD  &= ~(1 << 3);
+				PORTD &= ~(1 << 2);
+			}
+
+			/** Indicates whether a character has been received through the USART.
+			 *
+			 *  \return Boolean \c true if a character has been received, \c false otherwise.
+			 */
+			static inline bool Serial_IsCharReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline bool Serial_IsCharReceived(void)
+			{
+				return ((UCSR1A & (1 << RXC1)) ? true : false);
+			}
+
+			/** Indicates whether there is hardware buffer space for a new transmit on the USART. This
+			 *  function can be used to determine if a call to \ref Serial_SendByte() will block in advance.
+			 *
+			 *  \return Boolean \c true if a character can be queued for transmission immediately, \c false otherwise.
+			 */
+			static inline bool Serial_IsSendReady(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline bool Serial_IsSendReady(void)
+			{
+				return ((UCSR1A & (1 << UDRE1)) ? true : false);
+			}
+
+			/** Indicates whether the hardware USART transmit buffer is completely empty, indicating all
+			 *  pending transmissions have completed.
+			 *
+			 *  \return Boolean \c true if no characters are buffered for transmission, \c false otherwise.
+			 */
+			static inline bool Serial_IsSendComplete(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline bool Serial_IsSendComplete(void)
+			{
+				return ((UCSR1A & (1 << TXC1)) ? true : false);
+			}
+
+			/** Transmits a given byte through the USART.
+			 *
+			 *  \note If no buffer space is available in the hardware USART, this function will block. To check if
+			 *        space is available before calling this function, see \ref Serial_IsSendReady().
+			 *
+			 *  \param[in] DataByte  Byte to transmit through the USART.
+			 */
+			static inline void Serial_SendByte(const char DataByte) ATTR_ALWAYS_INLINE;
+			static inline void Serial_SendByte(const char DataByte)
+			{
+				while (!(Serial_IsSendReady()));
+				UDR1 = DataByte;
+			}
+
+			/** Receives the next byte from the USART.
+			 *
+			 *  \return Next byte received from the USART, or a negative value if no byte has been received.
+			 */
+			static inline int16_t Serial_ReceiveByte(void) ATTR_ALWAYS_INLINE;
+			static inline int16_t Serial_ReceiveByte(void)
+			{
+				if (!(Serial_IsCharReceived()))
+				  return -1;
+
+				return UDR1;
+			}
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Peripheral/AVR8/TWI_AVR8.c b/lib/lufa/LUFA/Drivers/Peripheral/AVR8/TWI_AVR8.c
new file mode 100644
index 0000000000..eb08687be3
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Peripheral/AVR8/TWI_AVR8.c
@@ -0,0 +1,209 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+#include "../../../Common/Common.h"
+#if (ARCH == ARCH_AVR8) && defined(TWCR)
+
+#define  __INCLUDE_FROM_TWI_C
+#include "../TWI.h"
+
+uint8_t TWI_StartTransmission(const uint8_t SlaveAddress,
+                              const uint8_t TimeoutMS)
+{
+	for (;;)
+	{
+		bool     BusCaptured = false;
+		uint16_t TimeoutRemaining;
+
+		TWCR = ((1 << TWINT) | (1 << TWSTA) | (1 << TWEN));
+
+		TimeoutRemaining = (TimeoutMS * 100);
+		while (TimeoutRemaining && !(BusCaptured))
+		{
+			if (TWCR & (1 << TWINT))
+			{
+				switch (TWSR & TW_STATUS_MASK)
+				{
+					case TW_START:
+					case TW_REP_START:
+						BusCaptured = true;
+						break;
+					case TW_MT_ARB_LOST:
+						TWCR = ((1 << TWINT) | (1 << TWSTA) | (1 << TWEN));
+						continue;
+					default:
+						TWCR = (1 << TWEN);
+						return TWI_ERROR_BusFault;
+				}
+			}
+
+			_delay_us(10);
+			TimeoutRemaining--;
+		}
+
+		if (!(TimeoutRemaining))
+		{
+			TWCR = (1 << TWEN);
+			return TWI_ERROR_BusCaptureTimeout;
+		}
+
+		TWDR = SlaveAddress;
+		TWCR = ((1 << TWINT) | (1 << TWEN));
+
+		TimeoutRemaining = (TimeoutMS * 100);
+		while (TimeoutRemaining)
+		{
+			if (TWCR & (1 << TWINT))
+			  break;
+
+			_delay_us(10);
+			TimeoutRemaining--;
+		}
+
+		if (!(TimeoutRemaining))
+		  return TWI_ERROR_SlaveResponseTimeout;
+
+		switch (TWSR & TW_STATUS_MASK)
+		{
+			case TW_MT_SLA_ACK:
+			case TW_MR_SLA_ACK:
+				return TWI_ERROR_NoError;
+			default:
+				TWCR = ((1 << TWINT) | (1 << TWSTO) | (1 << TWEN));
+				return TWI_ERROR_SlaveNotReady;
+		}
+	}
+}
+
+bool TWI_SendByte(const uint8_t Byte)
+{
+	TWDR = Byte;
+	TWCR = ((1 << TWINT) | (1 << TWEN));
+	while (!(TWCR & (1 << TWINT)));
+
+	return ((TWSR & TW_STATUS_MASK) == TW_MT_DATA_ACK);
+}
+
+bool TWI_ReceiveByte(uint8_t* const Byte,
+					 const bool LastByte)
+{
+	uint8_t TWCRMask;
+
+	if (LastByte)
+	  TWCRMask = ((1 << TWINT) | (1 << TWEN));
+	else
+	  TWCRMask = ((1 << TWINT) | (1 << TWEN) | (1 << TWEA));
+
+	TWCR = TWCRMask;
+	while (!(TWCR & (1 << TWINT)));
+	*Byte = TWDR;
+
+	uint8_t Status = (TWSR & TW_STATUS_MASK);
+
+	return ((LastByte) ? (Status == TW_MR_DATA_NACK) : (Status == TW_MR_DATA_ACK));
+}
+
+uint8_t TWI_ReadPacket(const uint8_t SlaveAddress,
+                       const uint8_t TimeoutMS,
+                       const uint8_t* InternalAddress,
+                       uint8_t InternalAddressLen,
+                       uint8_t* Buffer,
+                       uint16_t Length)
+{
+	uint8_t ErrorCode;
+
+	if ((ErrorCode = TWI_StartTransmission((SlaveAddress & TWI_DEVICE_ADDRESS_MASK) | TWI_ADDRESS_WRITE,
+	                                       TimeoutMS)) == TWI_ERROR_NoError)
+	{
+		while (InternalAddressLen--)
+		{
+			if (!(TWI_SendByte(*(InternalAddress++))))
+			{
+				ErrorCode = TWI_ERROR_SlaveNAK;
+				break;
+			}
+		}
+
+		if ((ErrorCode = TWI_StartTransmission((SlaveAddress & TWI_DEVICE_ADDRESS_MASK) | TWI_ADDRESS_READ,
+											   TimeoutMS)) == TWI_ERROR_NoError)
+		{
+			while (Length--)
+			{
+				if (!(TWI_ReceiveByte(Buffer++, (Length == 0))))
+				{
+					ErrorCode = TWI_ERROR_SlaveNAK;
+					break;
+				}
+			}
+
+			TWI_StopTransmission();
+		}
+	}
+
+	return ErrorCode;
+}
+
+uint8_t TWI_WritePacket(const uint8_t SlaveAddress,
+                        const uint8_t TimeoutMS,
+                        const uint8_t* InternalAddress,
+                        uint8_t InternalAddressLen,
+                        const uint8_t* Buffer,
+                        uint16_t Length)
+{
+	uint8_t ErrorCode;
+
+	if ((ErrorCode = TWI_StartTransmission((SlaveAddress & TWI_DEVICE_ADDRESS_MASK) | TWI_ADDRESS_WRITE,
+	                                       TimeoutMS)) == TWI_ERROR_NoError)
+	{
+		while (InternalAddressLen--)
+		{
+			if (!(TWI_SendByte(*(InternalAddress++))))
+			{
+				ErrorCode = TWI_ERROR_SlaveNAK;
+				break;
+			}
+		}
+
+		while (Length--)
+		{
+			if (!(TWI_SendByte(*(Buffer++))))
+			{
+				ErrorCode = TWI_ERROR_SlaveNAK;
+				break;
+			}
+		}
+
+		TWI_StopTransmission();
+	}
+
+	return ErrorCode;
+}
+
+#endif
diff --git a/lib/lufa/LUFA/Drivers/Peripheral/AVR8/TWI_AVR8.h b/lib/lufa/LUFA/Drivers/Peripheral/AVR8/TWI_AVR8.h
new file mode 100644
index 0000000000..a8b845a5d7
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Peripheral/AVR8/TWI_AVR8.h
@@ -0,0 +1,305 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief TWI Peripheral Driver (AVR8)
+ *
+ *  On-chip TWI driver for the 8-bit AVR microcontrollers.
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the TWI driver
+ *        dispatch header located in LUFA/Drivers/Peripheral/TWI.h.
+ */
+
+/** \ingroup Group_TWI
+ *  \defgroup Group_TWI_AVR8 TWI Peripheral Driver (AVR8)
+ *
+ *  \section Sec_TWI_AVR8_ModDescription Module Description
+ *  Master mode TWI driver for the 8-bit AVR microcontrollers which contain a hardware TWI module.
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the TWI driver
+ *        dispatch header located in LUFA/Drivers/Peripheral/TWI.h.
+ *
+ *  \section Sec_TWI_AVR8_ExampleUsage Example Usage
+ *  The following snippet is an example of how this module may be used within a typical
+ *  application.
+ *
+ *  <b>Low Level API Example:</b>
+ *  \code
+ *      // Initialize the TWI driver before first use at 200KHz
+ *      TWI_Init(TWI_BIT_PRESCALE_1, TWI_BITLENGTH_FROM_FREQ(1, 200000));
+ *
+ *      // Start a write session to device at device address 0xA0, internal address 0xDC with a 10ms timeout
+ *      if (TWI_StartTransmission(0xA0 | TWI_ADDRESS_WRITE, 10) == TWI_ERROR_NoError)
+ *      {
+ *          TWI_SendByte(0xDC);
+ *
+ *          TWI_SendByte(0x01);
+ *          TWI_SendByte(0x02);
+ *          TWI_SendByte(0x03);
+ *
+ *          // Must stop transmission afterwards to release the bus
+ *          TWI_StopTransmission();
+ *      }
+ *
+ *      // Start a read session to device at address 0xA0, internal address 0xDC with a 10ms timeout
+ *      if (TWI_StartTransmission(0xA0 | TWI_ADDRESS_WRITE, 10) == TWI_ERROR_NoError)
+ *      {
+ *          TWI_SendByte(0xDC);
+ *          TWI_StopTransmission();
+ *
+ *          if (TWI_StartTransmission(0xA0 | TWI_ADDRESS_READ, 10) == TWI_ERROR_NoError)
+ *          {
+ *              uint8_t Byte1, Byte2, Byte3;
+ *
+ *              // Read three bytes, acknowledge after the third byte is received
+ *              TWI_ReceiveByte(&Byte1, false);
+ *              TWI_ReceiveByte(&Byte2, false);
+ *              TWI_ReceiveByte(&Byte3, true);
+ *
+ *              // Must stop transmission afterwards to release the bus
+ *              TWI_StopTransmission();
+ *          }
+ *      }
+ *  \endcode
+ *
+ *  <b>High Level API Example:</b>
+ *  \code
+ *      // Initialize the TWI driver before first use at 200KHz
+ *      TWI_Init(TWI_BIT_PRESCALE_1, TWI_BITLENGTH_FROM_FREQ(1, 200000));
+ *
+ *      // Start a write session to device at device address 0xA0, internal address 0xDC with a 10ms timeout
+ *      uint8_t InternalWriteAddress = 0xDC;
+ *      uint8_t WritePacket[3] = {0x01, 0x02, 0x03};
+ *
+ *      TWI_WritePacket(0xA0, 10, &InternalWriteAddress, sizeof(InternalWriteAddress),
+ *                      &WritePacket, sizeof(WritePacket);
+ *
+ *      // Start a read session to device at address 0xA0, internal address 0xDC with a 10ms timeout
+ *      uint8_t InternalReadAddress = 0xDC;
+ *      uint8_t ReadPacket[3];
+ *
+ *      TWI_ReadPacket(0xA0, 10, &InternalReadAddress, sizeof(InternalReadAddress),
+ *                     &ReadPacket, sizeof(ReadPacket);
+ *  \endcode
+ *
+ *  @{
+ */
+
+#ifndef __TWI_AVR8_H__
+#define __TWI_AVR8_H__
+
+	/* Includes: */
+		#include "../../../Common/Common.h"
+
+		#include <stdio.h>
+		#include <util/twi.h>
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_TWI_H) && !defined(__INCLUDE_FROM_TWI_C)
+			#error Do not include this file directly. Include LUFA/Drivers/Peripheral/TWI.h instead.
+		#endif
+
+		#if !(defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB646__) || \
+		      defined(__AVR_AT90USB1287__) || defined(__AVR_AT90USB647__) || \
+			  defined(__AVR_ATmega16U4__)  || defined(__AVR_ATmega32U4__))
+			#error The TWI peripheral driver is not currently available for your selected microcontroller model.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** TWI slave device address mask for a read session. Mask with a slave device base address to obtain
+			 *  the correct TWI bus address for the slave device when reading data from it.
+			 */
+			#define TWI_ADDRESS_READ         0x01
+
+			/** TWI slave device address mask for a write session. Mask with a slave device base address to obtain
+			 *  the correct TWI bus address for the slave device when writing data to it.
+			 */
+			#define TWI_ADDRESS_WRITE        0x00
+
+			/** Mask to retrieve the base address for a TWI device, which can then be ORed with \ref TWI_ADDRESS_READ
+			 *  or \ref TWI_ADDRESS_WRITE to obtain the device's read and write address respectively.
+			 */
+			#define TWI_DEVICE_ADDRESS_MASK  0xFE
+
+			/** Bit length prescaler for \ref TWI_Init(). This mask multiplies the TWI bit length prescaler by 1. */
+			#define TWI_BIT_PRESCALE_1       ((0 << TWPS1) | (0 << TWPS0))
+
+			/** Bit length prescaler for \ref TWI_Init(). This mask multiplies the TWI bit length prescaler by 4. */
+			#define TWI_BIT_PRESCALE_4       ((0 << TWPS1) | (1 << TWPS0))
+
+			/** Bit length prescaler for \ref TWI_Init(). This mask multiplies the TWI bit length prescaler by 16. */
+			#define TWI_BIT_PRESCALE_16      ((1 << TWPS1) | (0 << TWPS0))
+
+			/** Bit length prescaler for \ref TWI_Init(). This mask multiplies the TWI bit length prescaler by 64. */
+			#define TWI_BIT_PRESCALE_64      ((1 << TWPS1) | (1 << TWPS0))
+
+			/** Calculates the length of each bit on the TWI bus for a given target frequency. This may be used with
+			 *  the \ref TWI_Init() function to convert a bus frequency to a number of clocks for the \c BitLength
+			 *  parameter.
+			 *
+			 *  \param[in] Prescale   Prescaler set on the TWI bus.
+			 *  \param[in] Frequency  Desired TWI bus frequency in Hz.
+			 *
+			 *  \return Bit length in clocks for the given TWI bus frequency at the given prescaler value.
+			 */
+			#define TWI_BITLENGTH_FROM_FREQ(Prescale, Frequency) ((((F_CPU / (Prescale)) / (Frequency)) - 16) / 2)
+
+		/* Enums: */
+			/** Enum for the possible return codes of the TWI transfer start routine and other dependant TWI functions. */
+			enum TWI_ErrorCodes_t
+			{
+				TWI_ERROR_NoError              = 0, /**< Indicates that the command completed successfully. */
+				TWI_ERROR_BusFault             = 1, /**< A TWI bus fault occurred while attempting to capture the bus. */
+				TWI_ERROR_BusCaptureTimeout    = 2, /**< A timeout occurred whilst waiting for the bus to be ready. */
+				TWI_ERROR_SlaveResponseTimeout = 3, /**< No ACK received at the nominated slave address within the timeout period. */
+				TWI_ERROR_SlaveNotReady        = 4, /**< Slave NAKed the TWI bus START condition. */
+				TWI_ERROR_SlaveNAK             = 5, /**< Slave NAKed whilst attempting to send data to the device. */
+			};
+
+		/* Inline Functions: */
+			/** Initializes the TWI hardware into master mode, ready for data transmission and reception. This must be
+			 *  before any other TWI operations.
+			 *
+			 *  The generated SCL frequency will be according to the formula <pre>F_CPU / (16 + 2 * BitLength + 4 ^ Prescale)</pre>.
+			 *
+			 *  \attention The value of the \c BitLength parameter should not be set below 10 or invalid bus conditions may
+			 *             occur, as indicated in the AVR8 microcontroller datasheet.
+			 *
+			 *  \param[in] Prescale   Prescaler to use when determining the bus frequency, a \c TWI_BIT_PRESCALE_* value.
+			 *  \param[in] BitLength  Length of the bits sent on the bus.
+			 */
+			static inline void TWI_Init(const uint8_t Prescale,
+			                            const uint8_t BitLength) ATTR_ALWAYS_INLINE;
+			static inline void TWI_Init(const uint8_t Prescale,
+			                            const uint8_t BitLength)
+			{
+				TWCR |= (1 << TWEN);
+				TWSR  = Prescale;
+				TWBR  = BitLength;
+			}
+
+			/** Turns off the TWI driver hardware. If this is called, any further TWI operations will require a call to
+			 *  \ref TWI_Init() before the TWI can be used again.
+			 */
+			static inline void TWI_Disable(void) ATTR_ALWAYS_INLINE;
+			static inline void TWI_Disable(void)
+			{
+				TWCR &= ~(1 << TWEN);
+			}
+
+			/** Sends a TWI STOP onto the TWI bus, terminating communication with the currently addressed device. */
+			static inline void TWI_StopTransmission(void) ATTR_ALWAYS_INLINE;
+			static inline void TWI_StopTransmission(void)
+			{
+				TWCR = ((1 << TWINT) | (1 << TWSTO) | (1 << TWEN));
+			}
+
+		/* Function Prototypes: */
+			/** Begins a master mode TWI bus communication with the given slave device address.
+			 *
+			 *  \param[in] SlaveAddress  Address of the slave TWI device to communicate with.
+			 *  \param[in] TimeoutMS     Timeout period within which the slave must respond, in milliseconds.
+			 *
+			 *  \return A value from the \ref TWI_ErrorCodes_t enum.
+			 */
+			uint8_t TWI_StartTransmission(const uint8_t SlaveAddress,
+			                              const uint8_t TimeoutMS);
+
+			/** Sends a byte to the currently addressed device on the TWI bus.
+			 *
+			 *  \param[in] Byte  Byte to send to the currently addressed device
+			 *
+			 *  \return Boolean \c true if the recipient ACKed the byte, \c false otherwise
+			 */
+			bool TWI_SendByte(const uint8_t Byte);
+
+			/** Receives a byte from the currently addressed device on the TWI bus.
+			 *
+			 *  \param[in] Byte      Location where the read byte is to be stored.
+			 *  \param[in] LastByte  Indicates if the byte should be ACKed if false, NAKed if true.
+			 *
+			 *  \return Boolean \c true if the byte reception successfully completed, \c false otherwise.
+			 */
+			bool TWI_ReceiveByte(uint8_t* const Byte,
+			                     const bool LastByte) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** High level function to perform a complete packet transfer over the TWI bus to the specified
+			 *  device.
+			 *
+			 *  \param[in] SlaveAddress        Base address of the TWI slave device to communicate with.
+			 *  \param[in] TimeoutMS           Timeout for bus capture and slave START ACK, in milliseconds.
+			 *  \param[in] InternalAddress     Pointer to a location where the internal slave read start address is stored.
+			 *  \param[in] InternalAddressLen  Size of the internal device address, in bytes.
+			 *  \param[in] Buffer              Pointer to a buffer where the read packet data is to be stored.
+			 *  \param[in] Length              Size of the packet to read, in bytes.
+			 *
+			 *  \return A value from the \ref TWI_ErrorCodes_t enum.
+			 */
+			uint8_t TWI_ReadPacket(const uint8_t SlaveAddress,
+			                       const uint8_t TimeoutMS,
+			                       const uint8_t* InternalAddress,
+			                       uint8_t InternalAddressLen,
+			                       uint8_t* Buffer,
+			                       uint16_t Length) ATTR_NON_NULL_PTR_ARG(3);
+
+			/** High level function to perform a complete packet transfer over the TWI bus from the specified
+			 *  device.
+			 *
+			 *  \param[in] SlaveAddress        Base address of the TWI slave device to communicate with
+			 *  \param[in] TimeoutMS           Timeout for bus capture and slave START ACK, in milliseconds
+			 *  \param[in] InternalAddress     Pointer to a location where the internal slave write start address is stored
+			 *  \param[in] InternalAddressLen  Size of the internal device address, in bytes
+			 *  \param[in] Buffer              Pointer to a buffer where the packet data to send is stored
+			 *  \param[in] Length              Size of the packet to send, in bytes
+			 *
+			 *  \return A value from the \ref TWI_ErrorCodes_t enum.
+			 */
+			uint8_t TWI_WritePacket(const uint8_t SlaveAddress,
+			                        const uint8_t TimeoutMS,
+			                        const uint8_t* InternalAddress,
+			                        uint8_t InternalAddressLen,
+			                        const uint8_t* Buffer,
+			                        uint16_t Length) ATTR_NON_NULL_PTR_ARG(3);
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Peripheral/SPI.h b/lib/lufa/LUFA/Drivers/Peripheral/SPI.h
new file mode 100644
index 0000000000..f0cd177e00
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Peripheral/SPI.h
@@ -0,0 +1,76 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Hardware Serial Peripheral Interface driver.
+ *
+ *  This file is the master dispatch header file for the device-specific SPI driver, for microcontrollers
+ *  containing a hardware SPI.
+ *
+ *  User code should include this file, which will in turn include the correct SPI driver header file for the
+ *  currently selected architecture and microcontroller model.
+ */
+
+/** \ingroup Group_PeripheralDrivers
+ *  \defgroup Group_SPI SPI Driver - LUFA/Drivers/Peripheral/SPI.h
+ *  \brief Hardware Serial Peripheral Interface driver.
+ *
+ *  \section Sec_SPI_Dependencies Module Source Dependencies
+ *  The following files must be built with any user project that uses this module:
+ *    - None
+ *
+ *  \section Sec_SPI_ModDescription Module Description
+ *  Hardware SPI driver. This module provides an easy to use driver for the setup and transfer of data over
+ *  the selected architecture and microcontroller model's SPI port.
+ *
+ *  \note The exact API for this driver may vary depending on the target used - see
+ *        individual target module documentation for the API specific to your target processor.
+ */
+
+#ifndef __SPI_H__
+#define __SPI_H__
+
+	/* Macros: */
+		#define __INCLUDE_FROM_SPI_H
+
+	/* Includes: */
+		#include "../../Common/Common.h"
+
+	/* Includes: */
+		#if (ARCH == ARCH_AVR8)
+			#include "AVR8/SPI_AVR8.h"
+		#elif (ARCH == ARCH_XMEGA)
+			#include "XMEGA/SPI_XMEGA.h"
+		#else
+			#error The SPI peripheral driver is not currently available for your selected architecture.
+		#endif
+
+#endif
+
diff --git a/lib/lufa/LUFA/Drivers/Peripheral/Serial.h b/lib/lufa/LUFA/Drivers/Peripheral/Serial.h
new file mode 100644
index 0000000000..0c537bcd34
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Peripheral/Serial.h
@@ -0,0 +1,76 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Hardware Serial USART driver.
+ *
+ *  This file is the master dispatch header file for the device-specific USART driver, for microcontrollers
+ *  containing a hardware USART.
+ *
+ *  User code should include this file, which will in turn include the correct ADC driver header file for the
+ *  currently selected architecture and microcontroller model.
+ */
+
+/** \ingroup Group_PeripheralDrivers
+ *  \defgroup Group_Serial Serial USART Driver - LUFA/Drivers/Peripheral/Serial.h
+ *  \brief Hardware Serial USART driver.
+ *
+ *  \section Sec_Serial_Dependencies Module Source Dependencies
+ *  The following files must be built with any user project that uses this module:
+ *    - LUFA/Drivers/Peripheral/<i>ARCH</i>/Serial_<i>ARCH</i>.c <i>(Makefile source module name: LUFA_SRC_SERIAL)</i>
+ *
+ *  \section Sec_Serial_ModDescription Module Description
+ *  Hardware serial USART driver. This module provides an easy to use driver for the setup and transfer
+ *  of data over the selected architecture and microcontroller model's USART port.
+ *
+ *  \note The exact API for this driver may vary depending on the target used - see
+ *        individual target module documentation for the API specific to your target processor.
+ */
+
+#ifndef __SERIAL_H__
+#define __SERIAL_H__
+
+	/* Macros: */
+		#define __INCLUDE_FROM_SERIAL_H
+
+	/* Includes: */
+		#include "../../Common/Common.h"
+
+	/* Includes: */
+		#if (ARCH == ARCH_AVR8)
+			#include "AVR8/Serial_AVR8.h"
+		#elif (ARCH == ARCH_XMEGA)
+			#include "XMEGA/Serial_XMEGA.h"
+		#else
+			#error The Serial peripheral driver is not currently available for your selected architecture.
+		#endif
+
+#endif
+
diff --git a/lib/lufa/LUFA/Drivers/Peripheral/SerialSPI.h b/lib/lufa/LUFA/Drivers/Peripheral/SerialSPI.h
new file mode 100644
index 0000000000..dbab9dbf03
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Peripheral/SerialSPI.h
@@ -0,0 +1,76 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Hardware SPI Master Mode Serial USART driver.
+ *
+ *  This file is the master dispatch header file for the device-specific SPI Master Mode USART driver, for
+ *  microcontrollers containing a hardware USART capable of operating in a Master SPI mode.
+ *
+ *  User code should include this file, which will in turn include the correct ADC driver header file for the
+ *  currently selected architecture and microcontroller model.
+ */
+
+/** \ingroup Group_PeripheralDrivers
+ *  \defgroup Group_SerialSPI Master SPI Mode Serial USART Driver - LUFA/Drivers/Peripheral/SerialSPI.h
+ *  \brief Hardware SPI Master Mode Serial USART driver.
+ *
+ *  \section Sec_SerialSPI_Dependencies Module Source Dependencies
+ *  The following files must be built with any user project that uses this module:
+ *    - None
+ *
+ *  \section Sec_SerialSPI_ModDescription Module Description
+ *  Hardware SPI Master Mode serial USART driver. This module provides an easy to use driver for the setup and transfer
+ *  of data over the selected architecture and microcontroller model's USART port, using a SPI framing format.
+ *
+ *  \note The exact API for this driver may vary depending on the target used - see
+ *        individual target module documentation for the API specific to your target processor.
+ */
+
+#ifndef __SERIAL_SPI_H__
+#define __SERIAL_SPI_H__
+
+	/* Macros: */
+		#define __INCLUDE_FROM_SERIAL_SPI_H
+
+	/* Includes: */
+		#include "../../Common/Common.h"
+
+	/* Includes: */
+		#if (ARCH == ARCH_AVR8)
+			#include "AVR8/SerialSPI_AVR8.h"
+		#elif (ARCH == ARCH_XMEGA)
+			#include "XMEGA/SerialSPI_XMEGA.h"
+		#else
+			#error The Serial SPI Master Mode peripheral driver is not currently available for your selected architecture.
+		#endif
+
+#endif
+
diff --git a/lib/lufa/LUFA/Drivers/Peripheral/TWI.h b/lib/lufa/LUFA/Drivers/Peripheral/TWI.h
new file mode 100644
index 0000000000..24483d8e13
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Peripheral/TWI.h
@@ -0,0 +1,76 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Hardware Two Wire Interface (I2C) driver.
+ *
+ *  This file is the master dispatch header file for the device-specific SPI driver, for microcontrollers
+ *  containing a hardware TWI.
+ *
+ *  User code should include this file, which will in turn include the correct TWI driver header file for the
+ *  currently selected architecture and microcontroller model.
+ */
+
+/** \ingroup Group_PeripheralDrivers
+ *  \defgroup Group_TWI TWI Driver - LUFA/Drivers/Peripheral/TWI.h
+ *  \brief Hardware Two Wire Interface (I2C) driver.
+ *
+ *  \section Sec_TWI_Dependencies Module Source Dependencies
+ *  The following files must be built with any user project that uses this module:
+ *    - LUFA/Drivers/Peripheral/<i>ARCH</i>/TWI_<i>ARCH</i>.c <i>(Makefile source module name: LUFA_SRC_TWI)</i>
+ *
+ *  \section Sec_TWI_ModDescription Module Description
+ *  Hardware TWI driver. This module provides an easy to use driver for the setup and transfer of data over
+ *  the selected architecture and microcontroller model's TWI bus port.
+ *
+ *  \note The exact API for this driver may vary depending on the target used - see
+ *        individual target module documentation for the API specific to your target processor.
+ */
+
+#ifndef __TWI_H__
+#define __TWI_H__
+
+	/* Macros: */
+		#define __INCLUDE_FROM_TWI_H
+
+	/* Includes: */
+		#include "../../Common/Common.h"
+
+	/* Includes: */
+		#if (ARCH == ARCH_AVR8)
+			#include "AVR8/TWI_AVR8.h"
+		#elif (ARCH == ARCH_XMEGA)
+			#include "XMEGA/TWI_XMEGA.h"
+		#else
+			#error The TWI peripheral driver is not currently available for your selected architecture.
+		#endif
+
+#endif
+
diff --git a/lib/lufa/LUFA/Drivers/Peripheral/XMEGA/SPI_XMEGA.h b/lib/lufa/LUFA/Drivers/Peripheral/XMEGA/SPI_XMEGA.h
new file mode 100644
index 0000000000..7797df11a9
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Peripheral/XMEGA/SPI_XMEGA.h
@@ -0,0 +1,251 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief SPI Peripheral Driver (XMEGA)
+ *
+ *  On-chip SPI driver for the XMEGA microcontrollers.
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the SPI driver
+ *        dispatch header located in LUFA/Drivers/Peripheral/SPI.h.
+ */
+
+/** \ingroup Group_SPI
+ *  \defgroup Group_SPI_XMEGA SPI Peripheral Driver (XMEGA)
+ *
+ *  \section Sec_SPI_XMEGA_ModDescription Module Description
+ *  Driver for the hardware SPI port(s) available on XMEGA AVR microcontroller models. This
+ *  module provides an easy to use driver for the setup and transfer of data over the AVR's
+ *  SPI ports.
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the SPI driver
+ *        dispatch header located in LUFA/Drivers/Peripheral/SPI.h.
+ *
+ *  \code
+ *      // Initialize the SPI driver before first use
+ *      SPI_Init(&SPIC,
+ *               SPI_SPEED_FCPU_DIV_2 | SPI_ORDER_MSB_FIRST | SPI_SCK_LEAD_FALLING |
+ *               SPI_SAMPLE_TRAILING | SPI_MODE_MASTER);
+ *
+ *      // Send several bytes, ignoring the returned data
+ *      SPI_SendByte(&SPIC, 0x01);
+ *      SPI_SendByte(&SPIC, 0x02);
+ *      SPI_SendByte(&SPIC, 0x03);
+ *
+ *      // Receive several bytes, sending a dummy 0x00 byte each time
+ *      uint8_t Byte1 = SPI_ReceiveByte(&SPIC);
+ *      uint8_t Byte2 = SPI_ReceiveByte(&SPIC);
+ *      uint8_t Byte3 = SPI_ReceiveByte(&SPIC);
+ *
+ *      // Send a byte, and store the received byte from the same transaction
+ *      uint8_t ResponseByte = SPI_TransferByte(&SPIC, 0xDC);
+ *  \endcode
+ *
+ *  @{
+ */
+
+#ifndef __SPI_XMEGA_H__
+#define __SPI_XMEGA_H__
+
+	/* Includes: */
+		#include "../../../Common/Common.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_SPI_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Peripheral/SPI.h instead.
+		#endif
+
+	/* Private Interface - For use in library only: */
+	#if !defined(__DOXYGEN__)
+		/* Macros: */
+			#define SPI_USE_DOUBLESPEED            SPI_CLK2X_bm
+	#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** \name SPI Prescaler Configuration Masks */
+			//@{
+			/** SPI prescaler mask for \ref SPI_Init(). Divides the system clock by a factor of 2. */
+			#define SPI_SPEED_FCPU_DIV_2           SPI_USE_DOUBLESPEED
+
+			/** SPI prescaler mask for \ref SPI_Init(). Divides the system clock by a factor of 4. */
+			#define SPI_SPEED_FCPU_DIV_4           0
+
+			/** SPI prescaler mask for \ref SPI_Init(). Divides the system clock by a factor of 8. */
+			#define SPI_SPEED_FCPU_DIV_8           (SPI_USE_DOUBLESPEED | (1 << SPI_PRESCALER_gp))
+
+			/** SPI prescaler mask for \ref SPI_Init(). Divides the system clock by a factor of 16. */
+			#define SPI_SPEED_FCPU_DIV_16          (1 << SPI_PRESCALER_gp)
+
+			/** SPI prescaler mask for \ref SPI_Init(). Divides the system clock by a factor of 32. */
+			#define SPI_SPEED_FCPU_DIV_32          (SPI_USE_DOUBLESPEED | (2 << SPI_PRESCALER_gp))
+
+			/** SPI prescaler mask for \ref SPI_Init(). Divides the system clock by a factor of 64. */
+			#define SPI_SPEED_FCPU_DIV_64          (2 << SPI_PRESCALER_gp)
+
+			/** SPI prescaler mask for \ref SPI_Init(). Divides the system clock by a factor of 128. */
+			#define SPI_SPEED_FCPU_DIV_128         (3 << SPI_PRESCALER_gp)
+			//@}
+
+			/** \name SPI SCK Polarity Configuration Masks */
+			//@{
+			/** SPI clock polarity mask for \ref SPI_Init(). Indicates that the SCK should lead on the rising edge. */
+			#define SPI_SCK_LEAD_RISING            0
+
+			/** SPI clock polarity mask for \ref SPI_Init(). Indicates that the SCK should lead on the falling edge. */
+			#define SPI_SCK_LEAD_FALLING           SPI_MODE1_bm
+			//@}
+
+			/** \name SPI Sample Edge Configuration Masks */
+			//@{
+			/** SPI data sample mode mask for \ref SPI_Init(). Indicates that the data should sampled on the leading edge. */
+			#define SPI_SAMPLE_LEADING             0
+
+			/** SPI data sample mode mask for \ref SPI_Init(). Indicates that the data should be sampled on the trailing edge. */
+			#define SPI_SAMPLE_TRAILING            SPI_MODE0_bm
+			//@}
+
+			/** \name SPI Data Ordering Configuration Masks */
+			//@{
+			/** SPI data order mask for \ref SPI_Init(). Indicates that data should be shifted out MSB first. */
+			#define SPI_ORDER_MSB_FIRST            0
+
+			/** SPI data order mask for \ref SPI_Init(). Indicates that data should be shifted out LSB first. */
+			#define SPI_ORDER_LSB_FIRST            SPI_DORD_bm
+			//@}
+
+			/** \name SPI Mode Configuration Masks */
+			//@{
+			/** SPI mode mask for \ref SPI_Init(). Indicates that the SPI interface should be initialized into slave mode. */
+			#define SPI_MODE_SLAVE                 0
+
+			/** SPI mode mask for \ref SPI_Init(). Indicates that the SPI interface should be initialized into master mode. */
+			#define SPI_MODE_MASTER                SPI_MASTER_bm
+			//@}
+
+		/* Inline Functions: */
+			/** Initializes the SPI subsystem, ready for transfers. Must be called before calling any other
+			 *  SPI routines.
+			 *
+			 *  \param[in,out] SPI         Pointer to the base of the SPI peripheral within the device.
+			 *  \param[in]     SPIOptions  SPI Options, a mask consisting of one of each of the \c SPI_SPEED_*,
+			 *                             \c SPI_SCK_*, \c SPI_SAMPLE_*, \c SPI_ORDER_* and \c SPI_MODE_* masks.
+			 */
+			static inline void SPI_Init(SPI_t* const SPI,
+			                            const uint8_t SPIOptions) ATTR_NON_NULL_PTR_ARG(1);
+			static inline void SPI_Init(SPI_t* const SPI,
+			                            const uint8_t SPIOptions)
+			{
+				SPI->CTRL = (SPIOptions | SPI_ENABLE_bm);
+			}
+
+			/** Turns off the SPI driver, disabling and returning used hardware to their default configuration.
+			 *
+			 *  \param[in,out] SPI   Pointer to the base of the SPI peripheral within the device.
+			 */
+			static inline void SPI_Disable(SPI_t* const SPI) ATTR_NON_NULL_PTR_ARG(1);
+			static inline void SPI_Disable(SPI_t* const SPI)
+			{
+				SPI->CTRL &= ~SPI_ENABLE_bm;
+			}
+
+			/** Retrieves the currently selected SPI mode, once the SPI interface has been configured.
+			 *
+			 *  \param[in,out] SPI  Pointer to the base of the SPI peripheral within the device.
+			 *
+			 *  \return \ref SPI_MODE_MASTER if the interface is currently in SPI Master mode, \ref SPI_MODE_SLAVE otherwise
+			 */
+			static inline uint8_t SPI_GetCurrentMode(SPI_t* const SPI) ATTR_ALWAYS_INLINE ATTR_NON_NULL_PTR_ARG(1);
+			static inline uint8_t SPI_GetCurrentMode(SPI_t* const SPI)
+			{
+				return (SPI->CTRL & SPI_MASTER_bm);
+			}
+
+			/** Sends and receives a byte through the SPI interface, blocking until the transfer is complete.
+			 *
+			 *  \param[in,out] SPI   Pointer to the base of the SPI peripheral within the device.
+			 *  \param[in]     Byte  Byte to send through the SPI interface.
+			 *
+			 *  \return Response byte from the attached SPI device.
+			 */
+			static inline uint8_t SPI_TransferByte(SPI_t* const SPI,
+			                                       const uint8_t Byte) ATTR_ALWAYS_INLINE ATTR_NON_NULL_PTR_ARG(1);
+			static inline uint8_t SPI_TransferByte(SPI_t* const SPI,
+			                                       const uint8_t Byte)
+			{
+				SPI->DATA = Byte;
+				while (!(SPI->STATUS & SPI_IF_bm));
+				return SPI->DATA;
+			}
+
+			/** Sends a byte through the SPI interface, blocking until the transfer is complete. The response
+			 *  byte sent to from the attached SPI device is ignored.
+			 *
+			 *  \param[in,out] SPI   Pointer to the base of the SPI peripheral within the device.
+			 *  \param[in]     Byte  Byte to send through the SPI interface.
+			 */
+			static inline void SPI_SendByte(SPI_t* const SPI,
+			                                const uint8_t Byte) ATTR_ALWAYS_INLINE ATTR_NON_NULL_PTR_ARG(1);
+			static inline void SPI_SendByte(SPI_t* const SPI,
+			                                const uint8_t Byte)
+			{
+				SPI->DATA = Byte;
+				while (!(SPI->STATUS & SPI_IF_bm));
+			}
+
+			/** Sends a dummy byte through the SPI interface, blocking until the transfer is complete. The response
+			 *  byte from the attached SPI device is returned.
+			 *
+			 *  \param[in,out] SPI  Pointer to the base of the SPI peripheral within the device.
+			 *
+			 *  \return The response byte from the attached SPI device.
+			 */
+			static inline uint8_t SPI_ReceiveByte(SPI_t* const SPI) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(1);
+			static inline uint8_t SPI_ReceiveByte(SPI_t* const SPI)
+			{
+				SPI->DATA = 0;
+				while (!(SPI->STATUS & SPI_IF_bm));
+				return SPI->DATA;
+			}
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Peripheral/XMEGA/SerialSPI_XMEGA.h b/lib/lufa/LUFA/Drivers/Peripheral/XMEGA/SerialSPI_XMEGA.h
new file mode 100644
index 0000000000..ca3235083c
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Peripheral/XMEGA/SerialSPI_XMEGA.h
@@ -0,0 +1,212 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Master SPI Mode Serial USART Peripheral Driver (XMEGA)
+ *
+ *  On-chip Master SPI mode USART driver for the XMEGA AVR microcontrollers.
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the SPI Master
+ *        Mode USART driver dispatch header located in LUFA/Drivers/Peripheral/Serial.h.
+ */
+
+/** \ingroup Group_SerialSPI
+ *  \defgroup Group_SerialSPI_XMEGA Master SPI Mode Serial USART Peripheral Driver (XMEGA)
+ *
+ *  \section Sec_SerialSPI_XMEGA_ModDescription Module Description
+ *  On-chip serial USART driver for the XMEGA AVR microcontrollers.
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the ADC driver
+ *        dispatch header located in LUFA/Drivers/Peripheral/SerialSPI.h.
+ *
+ *  \section Sec_SerialSPI_XMEGA_ExampleUsage Example Usage
+ *  The following snippet is an example of how this module may be used within a typical
+ *  application.
+ *
+ *  \code
+ *      // Initialize the Master SPI mode USART driver before first use, with 1Mbit baud
+ *      SerialSPI_Init(&USARTD0, (USART_SPI_SCK_LEAD_RISING | USART_SPI_SAMPLE_LEADING | USART_SPI_ORDER_MSB_FIRST), 1000000);
+ *
+ *      // Send several bytes, ignoring the returned data
+ *      SerialSPI_SendByte(&USARTD0, 0x01);
+ *      SerialSPI_SendByte(&USARTD0, 0x02);
+ *      SerialSPI_SendByte(&USARTD0, 0x03);
+ *
+ *      // Receive several bytes, sending a dummy 0x00 byte each time
+ *      uint8_t Byte1 = SerialSPI_ReceiveByte(&USARTD);
+ *      uint8_t Byte2 = SerialSPI_ReceiveByte(&USARTD);
+ *      uint8_t Byte3 = SerialSPI_ReceiveByte(&USARTD);
+ *
+ *      // Send a byte, and store the received byte from the same transaction
+ *      uint8_t ResponseByte = SerialSPI_TransferByte(&USARTD0, 0xDC);
+ *  \endcode
+ *
+ *  @{
+ */
+
+#ifndef __SERIAL_SPI_XMEGA_H__
+#define __SERIAL_SPI_XMEGA_H__
+
+	/* Includes: */
+		#include "../../../Common/Common.h"
+
+		#include <stdio.h>
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_SERIAL_SPI_H)
+			#error Do not include this file directly. Include LUFA/Drivers/Peripheral/Serial.h instead.
+		#endif
+
+	/* Private Interface - For use in library only: */
+	#if !defined(__DOXYGEN__)
+			#define SERIAL_SPI_UBBRVAL(Baud)       ((Baud < (F_CPU / 2)) ? ((F_CPU / (2 * Baud)) - 1) : 0)
+	#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** \name SPI SCK Polarity Configuration Masks */
+			//@{
+			/** SPI clock polarity mask for \ref SerialSPI_Init(). Indicates that the SCK should lead on the rising edge. */
+			#define USART_SPI_SCK_LEAD_RISING      0
+			//@}
+
+			/** \name SPI Sample Edge Configuration Masks */
+			//@{
+			/** SPI data sample mode mask for \ref SerialSPI_Init(). Indicates that the data should sampled on the leading edge. */
+			#define USART_SPI_SAMPLE_LEADING       0
+
+			/** SPI data sample mode mask for \ref SerialSPI_Init(). Indicates that the data should be sampled on the trailing edge. */
+			#define USART_SPI_SAMPLE_TRAILING      (1 << 1)
+			//@}
+
+			/** \name SPI Data Ordering Configuration Masks */
+			//@{
+			/** SPI data order mask for \ref SerialSPI_Init(). Indicates that data should be shifted out MSB first. */
+			#define USART_SPI_ORDER_MSB_FIRST      0
+
+			/** SPI data order mask for \ref SerialSPI_Init(). Indicates that data should be shifted out LSB first. */
+			#define USART_SPI_ORDER_LSB_FIRST      (1 << 2)
+			//@}
+
+		/* Inline Functions: */
+			/** Initialize the USART module in Master SPI mode.
+			 *
+			 *  \param[in,out] USART        Pointer to the base of the USART peripheral within the device.
+			 *  \param[in]     SPIOptions   USART SPI Options, a mask consisting of one of each of the \c USART_SPI_SCK_*,
+			 *                              \c USART_SPI_SAMPLE_* and \c USART_SPI_ORDER_* masks.
+			 *  \param[in]     BaudRate     SPI baud rate, in bits per second.
+			 */
+			static inline void SerialSPI_Init(USART_t* const USART,
+			                                  const uint8_t SPIOptions,
+			                                  const uint32_t BaudRate) ATTR_NON_NULL_PTR_ARG(1);
+			static inline void SerialSPI_Init(USART_t* const USART,
+			                                  const uint8_t SPIOptions,
+			                                  const uint32_t BaudRate)
+			{
+				uint16_t BaudValue = SERIAL_SPI_UBBRVAL(BaudRate);
+
+				USART->BAUDCTRLB = (BaudValue >> 8);
+				USART->BAUDCTRLA = (BaudValue & 0xFF);
+
+				USART->CTRLC = (USART_CMODE_MSPI_gc | SPIOptions);
+				USART->CTRLB = (USART_RXEN_bm | USART_TXEN_bm);
+			}
+
+			/** Turns off the USART driver, disabling and returning used hardware to their default configuration.
+			 *
+			 *  \param[in,out] USART  Pointer to the base of the USART peripheral within the device.
+			 */
+			static inline void SerialSPI_Disable(USART_t* const USART) ATTR_ALWAYS_INLINE ATTR_NON_NULL_PTR_ARG(1);
+			static inline void SerialSPI_Disable(USART_t* const USART)
+			{
+				USART->CTRLA = 0;
+				USART->CTRLB = 0;
+				USART->CTRLC = 0;
+			}
+
+			/** Sends and receives a byte through the USART SPI interface, blocking until the transfer is complete.
+			 *
+			 *  \param[in,out] USART     Pointer to the base of the USART peripheral within the device.
+			 *  \param[in]     DataByte  Byte to send through the USART SPI interface.
+			 *
+			 *  \return Response byte from the attached SPI device.
+			 */
+			static inline uint8_t SerialSPI_TransferByte(USART_t* const USART,
+			                                             const uint8_t DataByte) ATTR_ALWAYS_INLINE ATTR_NON_NULL_PTR_ARG(1);
+			static inline uint8_t SerialSPI_TransferByte(USART_t* const USART,
+			                                             const uint8_t DataByte)
+			{
+				USART->DATA   = DataByte;
+				while (!(USART->STATUS & USART_TXCIF_bm));
+				USART->STATUS = USART_TXCIF_bm;
+				return USART->DATA;
+			}
+
+			/** Sends a byte through the USART SPI interface, blocking until the transfer is complete. The response
+			 *  byte sent to from the attached SPI device is ignored.
+			 *
+			 *  \param[in,out] USART     Pointer to the base of the USART peripheral within the device.
+			 *  \param[in]     DataByte  Byte to send through the USART SPI interface.
+			 */
+			static inline void SerialSPI_SendByte(USART_t* const USART,
+			                                      const uint8_t DataByte) ATTR_ALWAYS_INLINE ATTR_NON_NULL_PTR_ARG(1);
+			static inline void SerialSPI_SendByte(USART_t* const USART,
+			                                      const uint8_t DataByte)
+			{
+				SerialSPI_TransferByte(USART, DataByte);
+			}
+
+			/** Sends a dummy byte through the USART SPI interface, blocking until the transfer is complete. The response
+			 *  byte from the attached SPI device is returned.
+			 *
+			 *  \param[in,out] USART  Pointer to the base of the USART peripheral within the device.
+			 *
+			 *  \return The response byte from the attached SPI device.
+			 */
+			static inline uint8_t SerialSPI_ReceiveByte(USART_t* const USART) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(1);
+			static inline uint8_t SerialSPI_ReceiveByte(USART_t* const USART)
+			{
+				return SerialSPI_TransferByte(USART, 0);
+			}
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Peripheral/XMEGA/Serial_XMEGA.c b/lib/lufa/LUFA/Drivers/Peripheral/XMEGA/Serial_XMEGA.c
new file mode 100644
index 0000000000..9ecda47d2d
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Peripheral/XMEGA/Serial_XMEGA.c
@@ -0,0 +1,126 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+#include "../../../Common/Common.h"
+#if (ARCH == ARCH_XMEGA)
+
+#define  __INCLUDE_FROM_SERIAL_C
+#include "../Serial.h"
+
+FILE USARTSerialStream;
+
+int Serial_putchar(char DataByte,
+                   FILE *Stream)
+{
+	USART_t* USART = fdev_get_udata(Stream);
+
+	Serial_SendByte(USART, DataByte);
+	return 0;
+}
+
+int Serial_getchar(FILE *Stream)
+{
+	USART_t* USART = fdev_get_udata(Stream);
+
+	if (!(Serial_IsCharReceived(USART)))
+	  return _FDEV_EOF;
+
+	return Serial_ReceiveByte(USART);
+}
+
+int Serial_getchar_Blocking(FILE *Stream)
+{
+	USART_t* USART = fdev_get_udata(Stream);
+
+	while (!(Serial_IsCharReceived(USART)));
+	return Serial_ReceiveByte(USART);
+}
+
+void Serial_SendString_P(USART_t* const USART,
+                         const char* FlashStringPtr)
+{
+	uint8_t CurrByte;
+
+	while ((CurrByte = pgm_read_byte(FlashStringPtr)) != 0x00)
+	{
+		Serial_SendByte(USART, CurrByte);
+		FlashStringPtr++;
+	}
+}
+
+void Serial_SendString(USART_t* const USART,
+                       const char* StringPtr)
+{
+	uint8_t CurrByte;
+
+	while ((CurrByte = *StringPtr) != 0x00)
+	{
+		Serial_SendByte(USART, CurrByte);
+		StringPtr++;
+	}
+}
+
+void Serial_SendData(USART_t* const USART,
+                     const void* Buffer,
+                     uint16_t Length)
+{
+	uint8_t* CurrByte = (uint8_t*)Buffer;
+
+	while (Length--)
+	  Serial_SendByte(USART, *(CurrByte++));
+}
+
+void Serial_CreateStream(USART_t* USART, FILE* Stream)
+{
+	if (!(Stream))
+	{
+		Stream = &USARTSerialStream;
+		stdin  = Stream;
+		stdout = Stream;
+    }
+
+    *Stream = (FILE)FDEV_SETUP_STREAM(Serial_putchar, Serial_getchar, _FDEV_SETUP_RW);
+    fdev_set_udata(Stream, USART);
+}
+
+void Serial_CreateBlockingStream(USART_t* USART, FILE* Stream)
+{
+	if (!(Stream))
+	{
+		Stream = &USARTSerialStream;
+		stdin  = Stream;
+		stdout = Stream;
+	}
+
+    *Stream = (FILE)FDEV_SETUP_STREAM(Serial_putchar, Serial_getchar_Blocking, _FDEV_SETUP_RW);
+    fdev_set_udata(Stream, USART);
+}
+
+#endif
diff --git a/lib/lufa/LUFA/Drivers/Peripheral/XMEGA/Serial_XMEGA.h b/lib/lufa/LUFA/Drivers/Peripheral/XMEGA/Serial_XMEGA.h
new file mode 100644
index 0000000000..36f507d43e
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Peripheral/XMEGA/Serial_XMEGA.h
@@ -0,0 +1,289 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Serial USART Peripheral Driver (XMEGA)
+ *
+ *  On-chip serial USART driver for the XMEGA AVR microcontrollers.
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the USART driver
+ *        dispatch header located in LUFA/Drivers/Peripheral/Serial.h.
+ */
+
+/** \ingroup Group_Serial
+ *  \defgroup Group_Serial_XMEGA Serial USART Peripheral Driver (XMEGA)
+ *
+ *  \section Sec_Serial_XMEGA_ModDescription Module Description
+ *  On-chip serial USART driver for the XMEGA AVR microcontrollers.
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the USART driver
+ *        dispatch header located in LUFA/Drivers/Peripheral/Serial.h.
+ *
+ *  \section Sec_Serial_XMEGA_ExampleUsage Example Usage
+ *  The following snippet is an example of how this module may be used within a typical
+ *  application.
+ *
+ *  \code
+ *      // Initialize the serial USART driver before first use, with 9600 baud (and no double-speed mode)
+ *      Serial_Init(&USARTD0, 9600, false);
+ *
+ *      // Send a string through the USART
+ *      Serial_TxString(&USARTD0, "Test String\r\n");
+ *
+ *      // Receive a byte through the USART
+ *      uint8_t DataByte = Serial_RxByte(&USARTD0);
+ *  \endcode
+ *
+ *  @{
+ */
+
+#ifndef __SERIAL_XMEGA_H__
+#define __SERIAL_XMEGA_H__
+
+	/* Includes: */
+		#include "../../../Common/Common.h"
+		#include "../../Misc/TerminalCodes.h"
+
+		#include <stdio.h>
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_SERIAL_H) && !defined(__INCLUDE_FROM_SERIAL_C)
+			#error Do not include this file directly. Include LUFA/Drivers/Peripheral/Serial.h instead.
+		#endif
+
+	/* Private Interface - For use in library only: */
+	#if !defined(__DOXYGEN__)
+		/* External Variables: */
+			extern FILE USARTSerialStream;
+
+		/* Function Prototypes: */
+			int Serial_putchar(char DataByte,
+			                   FILE *Stream);
+			int Serial_getchar(FILE *Stream);
+			int Serial_getchar_Blocking(FILE *Stream);
+	#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Macro for calculating the baud value from a given baud rate when the \c U2X (double speed) bit is
+			 *  not set.
+			 *
+			 *  \param[in] Baud  Target serial UART baud rate.
+			 *
+			 *  \return Closest UBRR register value for the given UART frequency.
+			 */
+			#define SERIAL_UBBRVAL(Baud)    ((((F_CPU / 16) + (Baud / 2)) / (Baud)) - 1)
+
+			/** Macro for calculating the baud value from a given baud rate when the \c U2X (double speed) bit is
+			 *  set.
+			 *
+			 *  \param[in] Baud  Target serial UART baud rate.
+			 *
+			 *  \return Closest UBRR register value for the given UART frequency.
+			 */
+			#define SERIAL_2X_UBBRVAL(Baud) ((((F_CPU / 8) + (Baud / 2)) / (Baud)) - 1)
+
+		/* Function Prototypes: */
+			/** Transmits a given string located in program space (FLASH) through the USART.
+			 *
+			 *  \param[in,out] USART           Pointer to the base of the USART peripheral within the device.
+			 *  \param[in]     FlashStringPtr  Pointer to a string located in program space.
+			 */
+			void Serial_SendString_P(USART_t* const USART,
+			                         const char* FlashStringPtr) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Transmits a given string located in SRAM memory through the USART.
+			 *
+			 *  \param[in,out] USART      Pointer to the base of the USART peripheral within the device.
+			 *  \param[in]     StringPtr  Pointer to a string located in SRAM space.
+			 */
+			void Serial_SendString(USART_t* const USART,
+			                       const char* StringPtr) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Transmits a given buffer located in SRAM memory through the USART.
+			 *
+			 *  \param[in,out] USART   Pointer to the base of the USART peripheral within the device.
+			 *  \param[in]     Buffer  Pointer to a buffer containing the data to send.
+			 *  \param[in]     Length  Length of the data to send, in bytes.
+			 */
+			void Serial_SendData(USART_t* const USART,
+			                     const void* Buffer,
+			                     uint16_t Length) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Creates a standard character stream from the USART so that it can be used with all the regular functions
+			 *  in the avr-libc \c <stdio.h> library that accept a \c FILE stream as a destination (e.g. \c fprintf). The created
+			 *  stream is bidirectional and can be used for both input and output functions.
+			 *
+			 *  Reading data from this stream is non-blocking, i.e. in most instances, complete strings cannot be read in by a single
+			 *  fetch, as the endpoint will not be ready at some point in the transmission, aborting the transfer. However, this may
+			 *  be used when the read data is processed byte-per-bye (via \c getc()) or when the user application will implement its own
+			 *  line buffering.
+			 *
+			 *  \param[in,out] USART   Pointer to the base of the USART peripheral within the device.
+			 *  \param[in,out] Stream  Pointer to a FILE structure where the created stream should be placed, if \c NULL, \c stdout
+			 *                         and \c stdin will be configured to use the USART.
+			 *
+			 *  \pre The USART must first be configured via a call to \ref Serial_Init() before the stream is used.
+			 */
+			void Serial_CreateStream(USART_t* USART, FILE* Stream);
+
+            /** Identical to \ref Serial_CreateStream(), except that reads are blocking until the calling stream function terminates
+			 *  the transfer.
+			 *
+			 *  \param[in,out] USART   Pointer to the base of the USART peripheral within the device.
+			 *  \param[in,out] Stream  Pointer to a FILE structure where the created stream should be placed, if \c NULL, \c stdout
+			 *                         and \c stdin will be configured to use the USART.
+			 *
+			 *  \pre The USART must first be configured via a call to \ref Serial_Init() before the stream is used.
+			 */
+			void Serial_CreateBlockingStream(USART_t* USART, FILE* Stream);
+
+		/* Inline Functions: */
+			/** Initializes the USART, ready for serial data transmission and reception. This initializes the interface to
+			 *  standard 8-bit, no parity, 1 stop bit settings suitable for most applications.
+			 *
+			 *  \param[in,out] USART        Pointer to the base of the USART peripheral within the device.
+			 *  \param[in]     BaudRate     Serial baud rate, in bits per second. This should be the target baud rate regardless of
+			 *                              the \c DoubleSpeed parameter's value.
+			 *  \param[in]     DoubleSpeed  Enables double speed mode when set, halving the sample time to double the baud rate.
+			 */
+			static inline void Serial_Init(USART_t* const USART,
+			                               const uint32_t BaudRate,
+			                               const bool DoubleSpeed) ATTR_NON_NULL_PTR_ARG(1);
+			static inline void Serial_Init(USART_t* const USART,
+			                               const uint32_t BaudRate,
+			                               const bool DoubleSpeed)
+			{
+				uint16_t BaudValue = (DoubleSpeed ? SERIAL_2X_UBBRVAL(BaudRate) : SERIAL_UBBRVAL(BaudRate));
+
+				USART->BAUDCTRLB = (BaudValue >> 8);
+				USART->BAUDCTRLA = (BaudValue & 0xFF);
+
+				USART->CTRLC = (USART_CMODE_ASYNCHRONOUS_gc | USART_PMODE_DISABLED_gc | USART_CHSIZE_8BIT_gc);
+				USART->CTRLB = (USART_RXEN_bm | USART_TXEN_bm | (DoubleSpeed ? USART_CLK2X_bm : 0));
+			}
+
+			/** Turns off the USART driver, disabling and returning used hardware to their default configuration.
+			 *
+			 *  \param[in,out] USART  Pointer to the base of the USART peripheral within the device.
+			 */
+			static inline void Serial_Disable(USART_t* const USART) ATTR_ALWAYS_INLINE ATTR_NON_NULL_PTR_ARG(1);
+			static inline void Serial_Disable(USART_t* const USART)
+			{
+				USART->CTRLA = 0;
+				USART->CTRLB = 0;
+				USART->CTRLC = 0;
+			}
+
+			/** Indicates whether a character has been received through the USART.
+			 *
+			 *  \param[in,out] USART  Pointer to the base of the USART peripheral within the device.
+			 *
+			 *  \return Boolean \c true if a character has been received, \c false otherwise.
+			 */
+			static inline bool Serial_IsCharReceived(USART_t* const USART) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(1);
+			static inline bool Serial_IsCharReceived(USART_t* const USART)
+			{
+				return ((USART->STATUS & USART_RXCIF_bm) ? true : false);
+			}
+
+			/** Indicates whether there is hardware buffer space for a new transmit on the USART. This
+			 *  function can be used to determine if a call to \ref Serial_SendByte() will block in advance.
+			 *
+			 *  \param[in,out] USART  Pointer to the base of the USART peripheral within the device.
+			 *
+			 *  \return Boolean \c true if a character can be queued for transmission immediately, \c false otherwise.
+			 */
+			static inline bool Serial_IsSendReady(USART_t* const USART) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(1);
+			static inline bool Serial_IsSendReady(USART_t* const USART)
+			{
+				return (USART->STATUS & USART_DREIF_bm) ? true : false;
+			}
+
+			/** Indicates whether the hardware USART transmit buffer is completely empty, indicating all
+			 *  pending transmissions have completed.
+			 *
+			 *  \param[in,out] USART  Pointer to the base of the USART peripheral within the device.
+			 *
+			 *  \return Boolean \c true if no characters are buffered for transmission, \c false otherwise.
+			 */
+			static inline bool Serial_IsSendComplete(USART_t* const USART) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(1);
+			static inline bool Serial_IsSendComplete(USART_t* const USART)
+			{
+				return (USART->STATUS & USART_TXCIF_bm) ? true : false;
+			}
+
+			/** Transmits a given byte through the USART.
+			 *
+			 *  \note If no buffer space is available in the hardware USART, this function will block. To check if
+			 *        space is available before calling this function, see \ref Serial_IsSendReady().
+			 *
+			 *  \param[in,out] USART     Pointer to the base of the USART peripheral within the device.
+			 *  \param[in]     DataByte  Byte to transmit through the USART.
+			 */
+			static inline void Serial_SendByte(USART_t* const USART,
+			                                   const char DataByte) ATTR_ALWAYS_INLINE ATTR_NON_NULL_PTR_ARG(1);
+			static inline void Serial_SendByte(USART_t* const USART,
+			                                   const char DataByte)
+			{
+				while (!(Serial_IsSendReady(USART)));
+				USART->DATA = DataByte;
+			}
+
+			/** Receives the next byte from the USART.
+			 *
+			 *  \param[in,out] USART  Pointer to the base of the USART peripheral within the device.
+			 *
+			 *  \return Next byte received from the USART, or a negative value if no byte has been received.
+			 */
+			static inline int16_t Serial_ReceiveByte(USART_t* const USART) ATTR_ALWAYS_INLINE ATTR_NON_NULL_PTR_ARG(1);
+			static inline int16_t Serial_ReceiveByte(USART_t* const USART)
+			{
+				if (!(Serial_IsCharReceived(USART)))
+				  return -1;
+
+				USART->STATUS = USART_RXCIF_bm;
+				return USART->DATA;
+			}
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/Peripheral/XMEGA/TWI_XMEGA.c b/lib/lufa/LUFA/Drivers/Peripheral/XMEGA/TWI_XMEGA.c
new file mode 100644
index 0000000000..92cc643b9e
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Peripheral/XMEGA/TWI_XMEGA.c
@@ -0,0 +1,185 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+#include "../../../Common/Common.h"
+#if (ARCH == ARCH_XMEGA)
+
+#define  __INCLUDE_FROM_TWI_C
+#include "../TWI.h"
+
+uint8_t TWI_StartTransmission(TWI_t* const TWI,
+                              const uint8_t SlaveAddress,
+                              const uint8_t TimeoutMS)
+{
+	uint16_t TimeoutRemaining;
+
+	TWI->MASTER.ADDR = SlaveAddress;
+
+	TimeoutRemaining = (TimeoutMS * 100);
+	while (TimeoutRemaining)
+	{
+		uint8_t status = TWI->MASTER.STATUS;
+
+		if ((status & (TWI_MASTER_WIF_bm | TWI_MASTER_ARBLOST_bm)) == (TWI_MASTER_WIF_bm | TWI_MASTER_ARBLOST_bm))
+		{
+			TWI->MASTER.ADDR = SlaveAddress;
+		}
+		else if ((status & (TWI_MASTER_WIF_bm | TWI_MASTER_RXACK_bm)) == (TWI_MASTER_WIF_bm | TWI_MASTER_RXACK_bm))
+		{
+			TWI_StopTransmission(TWI);
+			return TWI_ERROR_SlaveResponseTimeout;
+		}
+		else if (status & (TWI_MASTER_WIF_bm | TWI_MASTER_RIF_bm))
+		{
+			return TWI_ERROR_NoError;
+		}
+
+		_delay_us(10);
+		TimeoutRemaining--;
+	}
+
+	if (!(TimeoutRemaining)) {
+		if (TWI->MASTER.STATUS & TWI_MASTER_CLKHOLD_bm) {
+			TWI_StopTransmission(TWI);
+		}
+	}
+
+	return TWI_ERROR_BusCaptureTimeout;
+}
+
+bool TWI_SendByte(TWI_t* const TWI,
+                  const uint8_t Byte)
+{
+	TWI->MASTER.DATA = Byte;
+
+	while (!(TWI->MASTER.STATUS & TWI_MASTER_WIF_bm));
+
+	return (TWI->MASTER.STATUS & TWI_MASTER_WIF_bm) && !(TWI->MASTER.STATUS & TWI_MASTER_RXACK_bm);
+}
+
+bool TWI_ReceiveByte(TWI_t* const TWI,
+                     uint8_t* const Byte,
+                     const bool LastByte)
+{
+	if ((TWI->MASTER.STATUS & (TWI_MASTER_BUSERR_bm | TWI_MASTER_ARBLOST_bm)) == (TWI_MASTER_BUSERR_bm | TWI_MASTER_ARBLOST_bm)) {
+		return false;
+	}
+
+	while (!(TWI->MASTER.STATUS & TWI_MASTER_RIF_bm));
+
+	*Byte = TWI->MASTER.DATA;
+
+	if (LastByte)
+	  TWI->MASTER.CTRLC = TWI_MASTER_ACKACT_bm | TWI_MASTER_CMD_STOP_gc;
+	else
+	  TWI->MASTER.CTRLC = TWI_MASTER_CMD_RECVTRANS_gc;
+
+	return true;
+}
+
+uint8_t TWI_ReadPacket(TWI_t* const TWI,
+                       const uint8_t SlaveAddress,
+                       const uint8_t TimeoutMS,
+                       const uint8_t* InternalAddress,
+                       uint8_t InternalAddressLen,
+                       uint8_t* Buffer,
+                       uint16_t Length)
+{
+	uint8_t ErrorCode;
+
+	if ((ErrorCode = TWI_StartTransmission(TWI, (SlaveAddress & TWI_DEVICE_ADDRESS_MASK) | TWI_ADDRESS_WRITE,
+	                                       TimeoutMS)) == TWI_ERROR_NoError)
+	{
+		while (InternalAddressLen--)
+		{
+			if (!(TWI_SendByte(TWI, *(InternalAddress++))))
+			{
+				ErrorCode = TWI_ERROR_SlaveNAK;
+				break;
+			}
+		}
+
+		if ((ErrorCode = TWI_StartTransmission(TWI, (SlaveAddress & TWI_DEVICE_ADDRESS_MASK) | TWI_ADDRESS_READ,
+		                                       TimeoutMS)) == TWI_ERROR_NoError)
+		{
+			while (Length--)
+			{
+				if (!(TWI_ReceiveByte(TWI, Buffer++, (Length == 0))))
+				{
+					ErrorCode = TWI_ERROR_SlaveNAK;
+					break;
+				}
+			}
+		}
+
+		TWI_StopTransmission(TWI);
+	}
+
+	return ErrorCode;
+}
+
+uint8_t TWI_WritePacket(TWI_t* const TWI,
+                        const uint8_t SlaveAddress,
+                        const uint8_t TimeoutMS,
+                        const uint8_t* InternalAddress,
+                        uint8_t InternalAddressLen,
+                        const uint8_t* Buffer,
+                        uint16_t Length)
+{
+	uint8_t ErrorCode;
+
+	if ((ErrorCode = TWI_StartTransmission(TWI, (SlaveAddress & TWI_DEVICE_ADDRESS_MASK) | TWI_ADDRESS_WRITE,
+	                                       TimeoutMS)) == TWI_ERROR_NoError)
+	{
+		while (InternalAddressLen--)
+		{
+			if (!(TWI_SendByte(TWI, *(InternalAddress++))))
+			{
+				ErrorCode = TWI_ERROR_SlaveNAK;
+				break;
+			}
+		}
+
+		while (Length--)
+		{
+			if (!(TWI_SendByte(TWI, *(Buffer++))))
+			{
+				ErrorCode = TWI_ERROR_SlaveNAK;
+				break;
+			}
+		}
+
+		TWI_StopTransmission(TWI);
+	}
+
+	return ErrorCode;
+}
+
+#endif
diff --git a/lib/lufa/LUFA/Drivers/Peripheral/XMEGA/TWI_XMEGA.h b/lib/lufa/LUFA/Drivers/Peripheral/XMEGA/TWI_XMEGA.h
new file mode 100644
index 0000000000..94ada73719
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/Peripheral/XMEGA/TWI_XMEGA.h
@@ -0,0 +1,302 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief TWI Peripheral Driver (XMEGA)
+ *
+ *  On-chip TWI driver for the XMEGA Family of AVR microcontrollers.
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the TWI driver
+ *        dispatch header located in LUFA/Drivers/Peripheral/TWI.h.
+ */
+
+/** \ingroup Group_TWI
+ *  \defgroup Group_TWI_XMEGA TWI Peripheral Driver (XMEGA)
+ *
+ *  \section Sec_TWI_XMEGA_ModDescription Module Description
+ *  Master mode TWI driver for the 8-bit AVR microcontrollers which contain a hardware TWI module.
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the TWI driver
+ *        dispatch header located in LUFA/Drivers/Peripheral/TWI.h.
+ *
+ *  \section Sec_TWI_XMEGA_ExampleUsage Example Usage
+ *  The following snippet is an example of how this module may be used within a typical
+ *  application.
+ *
+ *  <b>Low Level API Example:</b>
+ *  \code
+ *      // Initialize the TWI driver before first use at 200KHz
+ *      TWI_Init(&TWIC, TWI_BAUD_FROM_FREQ(200000));
+ *
+ *      // Start a write session to device at device address 0xA0, internal address 0xDC with a 10ms timeout
+ *      if (TWI_StartTransmission(&TWIC, 0xA0 | TWI_ADDRESS_WRITE, 10) == TWI_ERROR_NoError)
+ *      {
+ *          TWI_SendByte(&TWIC, 0xDC);
+ *
+ *          TWI_SendByte(&TWIC, 0x01);
+ *          TWI_SendByte(&TWIC, 0x02);
+ *          TWI_SendByte(&TWIC, 0x03);
+ *
+ *          // Must stop transmission afterwards to release the bus
+ *          TWI_StopTransmission(&TWIC);
+ *      }
+ *
+ *      // Start a read session to device at address 0xA0, internal address 0xDC with a 10ms timeout
+ *      if (TWI_StartTransmission(&TWIC, 0xA0 | TWI_ADDRESS_WRITE, 10) == TWI_ERROR_NoError)
+ *      {
+ *          TWI_SendByte(&TWIC, 0xDC);
+ *          TWI_StopTransmission(&TWIC);
+ *
+ *          if (TWI_StartTransmission(&TWIC, 0xA0 | TWI_ADDRESS_READ, 10) == TWI_ERROR_NoError)
+ *          {
+ *              uint8_t Byte1, Byte2, Byte3;
+ *
+ *              // Read three bytes, acknowledge after the third byte is received
+ *              TWI_ReceiveByte(&TWIC, &Byte1, false);
+ *              TWI_ReceiveByte(&TWIC, &Byte2, false);
+ *              TWI_ReceiveByte(&TWIC, &Byte3, true);
+ *
+ *              // Must stop transmission afterwards to release the bus
+ *              TWI_StopTransmission(&TWIC);
+ *          }
+ *      }
+ *  \endcode
+ *
+ *  <b>High Level API Example:</b>
+ *  \code
+ *      // Initialize the TWI driver before first use at 200KHz
+ *      TWI_Init(&TWIC, TWI_BAUD_FROM_FREQ(200000));
+ *
+ *      // Start a write session to device at device address 0xA0, internal address 0xDC with a 10ms timeout
+ *      uint8_t InternalWriteAddress = 0xDC;
+ *      uint8_t WritePacket[3] = {0x01, 0x02, 0x03};
+ *
+ *      TWI_WritePacket(&TWIC, 0xA0, 10, &InternalWriteAddress, sizeof(InternalWriteAddress),
+ *                      &WritePacket, sizeof(WritePacket);
+ *
+ *      // Start a read session to device at address 0xA0, internal address 0xDC with a 10ms timeout
+ *      uint8_t InternalReadAddress = 0xDC;
+ *      uint8_t ReadPacket[3];
+ *
+ *      TWI_ReadPacket(&TWIC, 0xA0, 10, &InternalReadAddress, sizeof(InternalReadAddress),
+ *                     &ReadPacket, sizeof(ReadPacket);
+ *  \endcode
+ *
+ *  @{
+ */
+
+#ifndef __TWI_XMEGA_H__
+#define __TWI_XMEGA_H__
+
+	/* Includes: */
+		#include "../../../Common/Common.h"
+
+		#include <stdio.h>
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_TWI_H) && !defined(__INCLUDE_FROM_TWI_C)
+			#error Do not include this file directly. Include LUFA/Drivers/Peripheral/TWI.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** TWI slave device address mask for a read session. Mask with a slave device base address to obtain
+			 *  the correct TWI bus address for the slave device when reading data from it.
+			 */
+			#define TWI_ADDRESS_READ         0x01
+
+			/** TWI slave device address mask for a write session. Mask with a slave device base address to obtain
+			 *  the correct TWI bus address for the slave device when writing data to it.
+			 */
+			#define TWI_ADDRESS_WRITE        0x00
+
+			/** Mask to retrieve the base address for a TWI device, which can then be ORed with \ref TWI_ADDRESS_READ
+			 *  or \ref TWI_ADDRESS_WRITE to obtain the device's read and write address respectively.
+			 */
+			#define TWI_DEVICE_ADDRESS_MASK  0xFE
+
+			/** Calculates the length of each bit on the TWI bus for a given target frequency. This may be used with
+			 *  the \ref TWI_Init() function to convert a bus frequency to a number of clocks for the \c BitLength
+			 *  parameter.
+			 *
+			 *  \param[in] Frequency  Desired TWI bus frequency in Hz.
+			 *
+			 *  \return Bit length in clocks for the given TWI bus frequency at the given prescaler value.
+			 */
+			#define TWI_BAUD_FROM_FREQ(Frequency) ((F_CPU / (2 * Frequency)) - 5)
+
+		/* Enums: */
+			/** Enum for the possible return codes of the TWI transfer start routine and other dependant TWI functions. */
+			enum TWI_ErrorCodes_t
+			{
+				TWI_ERROR_NoError              = 0, /**< Indicates that the command completed successfully. */
+				TWI_ERROR_BusFault             = 1, /**< A TWI bus fault occurred while attempting to capture the bus. */
+				TWI_ERROR_BusCaptureTimeout    = 2, /**< A timeout occurred whilst waiting for the bus to be ready. */
+				TWI_ERROR_SlaveResponseTimeout = 3, /**< No ACK received at the nominated slave address within the timeout period. */
+				TWI_ERROR_SlaveNotReady        = 4, /**< Slave NAKed the TWI bus START condition. */
+				TWI_ERROR_SlaveNAK             = 5, /**< Slave NAKed whilst attempting to send data to the device. */
+			};
+
+		/* Inline Functions: */
+			/** Initializes the TWI hardware into master mode, ready for data transmission and reception. This must be
+			 *  before any other TWI operations.
+			 *
+			 *  The generated SCL frequency will be according to the formula <pre>F_CPU / (2 * (5 + (BAUD)))</pre>.
+			 *
+			 *  \attention The value of the \c BitLength parameter should not be set below 10 or invalid bus conditions may
+			 *             occur, as indicated in the XMEGA microcontroller datasheet.
+			 *
+			 *  \param[in] TWI   Pointer to the base of the TWI peripheral within the device.
+			 *  \param[in] Baud  Value of the BAUD register of the TWI Master.
+			 */
+			static inline void TWI_Init(TWI_t* const TWI,
+			                            const uint8_t Baud) ATTR_ALWAYS_INLINE ATTR_NON_NULL_PTR_ARG(1);
+			static inline void TWI_Init(TWI_t* const TWI,
+			                            const uint8_t Baud)
+			{
+				TWI->CTRL          = 0x00;
+				TWI->MASTER.BAUD   = Baud;
+				TWI->MASTER.CTRLA  = TWI_MASTER_ENABLE_bm;
+				TWI->MASTER.CTRLB  = 0;
+				TWI->MASTER.STATUS = TWI_MASTER_BUSSTATE_IDLE_gc;
+			}
+
+			/** Turns off the TWI driver hardware. If this is called, any further TWI operations will require a call to
+			 *  \ref TWI_Init() before the TWI can be used again.
+	   		 *
+			 *  \param[in] TWI  Pointer to the base of the TWI peripheral within the device.
+			 */
+			static inline void TWI_Disable(TWI_t* const TWI) ATTR_ALWAYS_INLINE ATTR_NON_NULL_PTR_ARG(1);
+			static inline void TWI_Disable(TWI_t* const TWI)
+			{
+				TWI->MASTER.CTRLA &= ~TWI_MASTER_ENABLE_bm;
+			}
+
+			/** Sends a TWI STOP onto the TWI bus, terminating communication with the currently addressed device.
+			 *
+			 *  \param[in] TWI  Pointer to the base of the TWI peripheral within the device.
+			 */
+			static inline void TWI_StopTransmission(TWI_t* const TWI) ATTR_ALWAYS_INLINE ATTR_NON_NULL_PTR_ARG(1);
+			static inline void TWI_StopTransmission(TWI_t* const TWI)
+			{
+				TWI->MASTER.CTRLC = TWI_MASTER_ACKACT_bm | TWI_MASTER_CMD_STOP_gc;
+			}
+
+		/* Function Prototypes: */
+			/** Begins a master mode TWI bus communication with the given slave device address.
+			 *
+			 *  \param[in] TWI           Pointer to the base of the TWI peripheral within the device.
+			 *  \param[in] SlaveAddress  Address of the slave TWI device to communicate with.
+			 *  \param[in] TimeoutMS     Timeout period within which the slave must respond, in milliseconds.
+			 *
+			 *  \return A value from the \ref TWI_ErrorCodes_t enum.
+			 */
+			uint8_t TWI_StartTransmission(TWI_t* const TWI,
+			                              const uint8_t SlaveAddress,
+			                              const uint8_t TimeoutMS) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Sends a byte to the currently addressed device on the TWI bus.
+			 *
+			 *  \param[in] TWI   Pointer to the base of the TWI peripheral within the device.
+			 *  \param[in] Byte  Byte to send to the currently addressed device
+			 *
+			 *  \return Boolean \c true if the recipient ACKed the byte, \c false otherwise
+			 */
+			bool TWI_SendByte(TWI_t* const TWI,
+			                  const uint8_t Byte) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Receives a byte from the currently addressed device on the TWI bus.
+			 *
+			 *  \param[in] TWI       Pointer to the base of the TWI peripheral within the device.
+			 *  \param[in] Byte      Location where the read byte is to be stored.
+			 *  \param[in] LastByte  Indicates if the byte should be ACKed if false, NAKed if true.
+			 *
+			 *  \return Boolean \c true if the byte reception successfully completed, \c false otherwise.
+			 */
+			bool TWI_ReceiveByte(TWI_t* const TWI,
+			                     uint8_t* const Byte,
+			                     const bool LastByte) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2);
+
+			/** High level function to perform a complete packet transfer over the TWI bus to the specified
+			 *  device.
+			 *
+			 *  \param[in] TWI                 Pointer to the base of the TWI peripheral within the device.
+			 *  \param[in] SlaveAddress        Base address of the TWI slave device to communicate with.
+			 *  \param[in] TimeoutMS           Timeout for bus capture and slave START ACK, in milliseconds.
+			 *  \param[in] InternalAddress     Pointer to a location where the internal slave read start address is stored.
+			 *  \param[in] InternalAddressLen  Size of the internal device address, in bytes.
+			 *  \param[in] Buffer              Pointer to a buffer where the read packet data is to be stored.
+			 *  \param[in] Length              Size of the packet to read, in bytes.
+			 *
+			 *  \return A value from the \ref TWI_ErrorCodes_t enum.
+			 */
+			uint8_t TWI_ReadPacket(TWI_t* const TWI,
+			                       const uint8_t SlaveAddress,
+			                       const uint8_t TimeoutMS,
+			                       const uint8_t* InternalAddress,
+			                       uint8_t InternalAddressLen,
+			                       uint8_t* Buffer,
+			                       uint16_t Length) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(4);
+
+			/** High level function to perform a complete packet transfer over the TWI bus from the specified
+			 *  device.
+			 *
+			 *  \param[in] TWI                 Pointer to the base of the TWI peripheral within the device.
+			 *  \param[in] SlaveAddress        Base address of the TWI slave device to communicate with
+			 *  \param[in] TimeoutMS           Timeout for bus capture and slave START ACK, in milliseconds
+			 *  \param[in] InternalAddress     Pointer to a location where the internal slave write start address is stored
+			 *  \param[in] InternalAddressLen  Size of the internal device address, in bytes
+			 *  \param[in] Buffer              Pointer to a buffer where the packet data to send is stored
+			 *  \param[in] Length              Size of the packet to send, in bytes
+			 *
+			 *  \return A value from the \ref TWI_ErrorCodes_t enum.
+			 */
+			uint8_t TWI_WritePacket(TWI_t* const TWI,
+			                        const uint8_t SlaveAddress,
+			                        const uint8_t TimeoutMS,
+			                        const uint8_t* InternalAddress,
+			                        uint8_t InternalAddressLen,
+			                        const uint8_t* Buffer,
+			                        uint16_t Length) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(4);
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Class/AndroidAccessoryClass.h b/lib/lufa/LUFA/Drivers/USB/Class/AndroidAccessoryClass.h
new file mode 100644
index 0000000000..f1c0109ea0
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Class/AndroidAccessoryClass.h
@@ -0,0 +1,77 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Master include file for the library USB Android Open Accessory Class driver.
+ *
+ *  Master include file for the library USB Android Open Accessory Class driver, for both host and device modes, where available.
+ *
+ *  This file should be included in all user projects making use of this optional class driver, instead of
+ *  including any headers in the USB/ClassDriver/Device, USB/ClassDriver/Host or USB/ClassDriver/Common subdirectories.
+ */
+
+/** \ingroup Group_USBClassDrivers
+ *  \defgroup Group_USBClassAOA Android Open Accessory Class Driver
+ *  \brief USB class driver for the Google Android Open Accessory class standard.
+ *
+ *  \section Sec_USBClassAOA_Dependencies Module Source Dependencies
+ *  The following files must be built with any user project that uses this module:
+ *    - LUFA/Drivers/USB/Class/Host/AndroidAccessoryClassHost.c <i>(Makefile source module name: LUFA_SRC_USBCLASS)</i>
+ *
+ *  \section Sec_USBClassAOA_ModDescription Module Description
+ *  Android Open Accessory Class Driver module. This module contains an internal implementation of the USB Android Open Accessory
+ *  Class, for Host USB mode. User applications can use this class driver instead of implementing the Android Open Accessory Class
+ *  manually via the low-level LUFA APIs.
+ *
+ *  This module is designed to simplify the user code by exposing only the required interface needed to interface with
+ *  Host using the USB Android Open Accessory Class.
+ *
+ *  @{
+ */
+
+#ifndef _AOA_CLASS_H_
+#define _AOA_CLASS_H_
+
+	/* Macros: */
+		#define __INCLUDE_FROM_USB_DRIVER
+		#define __INCLUDE_FROM_AOA_DRIVER
+
+	/* Includes: */
+		#include "../Core/USBMode.h"
+
+		#if defined(USB_CAN_BE_HOST)
+			#include "Host/AndroidAccessoryClassHost.h"
+		#endif
+
+#endif
+
+/** @} */
+
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Class/AudioClass.h b/lib/lufa/LUFA/Drivers/USB/Class/AudioClass.h
new file mode 100644
index 0000000000..d6ced05dc6
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Class/AudioClass.h
@@ -0,0 +1,81 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Master include file for the library USB Audio 1.0 Class driver.
+ *
+ *  Master include file for the library USB Audio 1.0 Class driver, for both host and device modes, where available.
+ *
+ *  This file should be included in all user projects making use of this optional class driver, instead of
+ *  including any headers in the USB/ClassDriver/Device, USB/ClassDriver/Host or USB/ClassDriver/Common subdirectories.
+ */
+
+/** \ingroup Group_USBClassDrivers
+ *  \defgroup Group_USBClassAudio Audio 1.0 Class Driver
+ *  \brief USB class driver for the USB-IF Audio 1.0 class standard.
+ *
+ *  \section Sec_USBClassAudio_Dependencies Module Source Dependencies
+ *  The following files must be built with any user project that uses this module:
+ *    - LUFA/Drivers/USB/Class/Device/AudioClassDevice.c <i>(Makefile source module name: LUFA_SRC_USBCLASS)</i>
+ *    - LUFA/Drivers/USB/Class/Host/AudioClassHost.c <i>(Makefile source module name: LUFA_SRC_USBCLASS)</i>
+ *
+ *  \section Sec_USBClassAudio_ModDescription Module Description
+ *  Audio 1.0 Class Driver module. This module contains an internal implementation of the USB Audio 1.0 Class, for both
+ *  Device and Host USB modes. User applications can use this class driver instead of implementing the Audio 1.0 class
+ *  manually via the low-level LUFA APIs.
+ *
+ *  This module is designed to simplify the user code by exposing only the required interface needed to interface with
+ *  Hosts or Devices using the USB Audio 1.0 Class.
+ *
+ *  @{
+ */
+
+#ifndef _AUDIO_CLASS_H_
+#define _AUDIO_CLASS_H_
+
+	/* Macros: */
+		#define __INCLUDE_FROM_USB_DRIVER
+		#define __INCLUDE_FROM_AUDIO_DRIVER
+
+	/* Includes: */
+		#include "../Core/USBMode.h"
+
+		#if defined(USB_CAN_BE_DEVICE)
+			#include "Device/AudioClassDevice.h"
+		#endif
+
+		#if defined(USB_CAN_BE_HOST)
+			#include "Host/AudioClassHost.h"
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Class/CDCClass.h b/lib/lufa/LUFA/Drivers/USB/Class/CDCClass.h
new file mode 100644
index 0000000000..30b3ee237d
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Class/CDCClass.h
@@ -0,0 +1,81 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Master include file for the library USB CDC-ACM Class driver.
+ *
+ *  Master include file for the library USB CDC Class driver, for both host and device modes, where available.
+ *
+ *  This file should be included in all user projects making use of this optional class driver, instead of
+ *  including any headers in the USB/ClassDriver/Device, USB/ClassDriver/Host or USB/ClassDriver/Common subdirectories.
+ */
+
+/** \ingroup Group_USBClassDrivers
+ *  \defgroup Group_USBClassCDC CDC-ACM (Virtual Serial) Class Driver
+ *  \brief USB class driver for the USB-IF CDC-ACM (Virtual Serial) class standard.
+ *
+ *  \section Sec_USBClassCDC_Dependencies Module Source Dependencies
+ *  The following files must be built with any user project that uses this module:
+ *    - LUFA/Drivers/USB/Class/Device/CDCClassDevice.c <i>(Makefile source module name: LUFA_SRC_USBCLASS)</i>
+ *    - LUFA/Drivers/USB/Class/Host/CDCClassHost.c <i>(Makefile source module name: LUFA_SRC_USBCLASS)</i>
+ *
+ *  \section Sec_USBClassCDC_ModDescription Module Description
+ *  CDC Class Driver module. This module contains an internal implementation of the USB CDC-ACM class Virtual Serial
+ *  Ports, for both Device and Host USB modes. User applications can use this class driver instead of implementing the
+ *  CDC class manually via the low-level LUFA APIs.
+ *
+ *  This module is designed to simplify the user code by exposing only the required interface needed to interface with
+ *  Hosts or Devices using the USB CDC Class.
+ *
+ *  @{
+ */
+
+#ifndef _CDC_CLASS_H_
+#define _CDC_CLASS_H_
+
+	/* Macros: */
+		#define __INCLUDE_FROM_USB_DRIVER
+		#define __INCLUDE_FROM_CDC_DRIVER
+
+	/* Includes: */
+		#include "../Core/USBMode.h"
+
+		#if defined(USB_CAN_BE_DEVICE)
+			#include "Device/CDCClassDevice.h"
+		#endif
+
+		#if defined(USB_CAN_BE_HOST)
+			#include "Host/CDCClassHost.h"
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Common/AndroidAccessoryClassCommon.h b/lib/lufa/LUFA/Drivers/USB/Class/Common/AndroidAccessoryClassCommon.h
new file mode 100644
index 0000000000..fdf8671fc9
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Class/Common/AndroidAccessoryClassCommon.h
@@ -0,0 +1,129 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Common definitions and declarations for the library USB Android Open Accessory Class driver.
+ *
+ *  Common definitions and declarations for the library USB Android Open Accessory Class driver.
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the USB module driver
+ *        dispatch header located in LUFA/Drivers/USB.h.
+ */
+
+/** \ingroup Group_USBClassAOA
+ *  \defgroup Group_USBClassAOACommon  Common Class Definitions
+ *
+ *  \section Sec_USBClassAOACommon_ModDescription Module Description
+ *  Constants, Types and Enum definitions that are common to both Device and Host modes for the USB
+ *  Android Open Accessory Class.
+ *
+ *  @{
+ */
+
+#ifndef _AOA_CLASS_COMMON_H_
+#define _AOA_CLASS_COMMON_H_
+
+	/* Includes: */
+		#include "../../Core/StdDescriptors.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_AOA_DRIVER)
+			#error Do not include this file directly. Include LUFA/Drivers/USB.h instead.
+		#endif
+
+	/* Macros: */
+		/** Product ID value in a Device Descriptor to indicate an Android device in Open Accessory mode. */
+		#define ANDROID_ACCESSORY_PRODUCT_ID        0x2D00
+
+		/** Product ID value in a Device Descriptor to indicate an Android device in Open Accessory and Android Debug mode. */
+		#define ANDROID_ACCESSORY_ADB_PRODUCT_ID    0x2D01
+
+	/* Enums: */
+		/** Enum for possible Class, Subclass and Protocol values of device and interface descriptors relating to the
+		 *  Android Open Accessory class.
+		 */
+		enum AOA_Descriptor_ClassSubclassProtocol_t
+		{
+			AOA_CSCP_AOADataClass    = 0xFF, /**< Descriptor Class value indicating that the device or interface
+			                                  *   belongs to the AOA data class.
+			                                  */
+			AOA_CSCP_AOADataSubclass = 0xFF, /**< Descriptor Subclass value indicating that the device or interface
+			                                  *   belongs to AOA data subclass.
+			                                  */
+			AOA_CSCP_AOADataProtocol = 0x00, /**< Descriptor Protocol value indicating that the device or interface
+			                                  *   belongs to the AOA data class protocol.
+			                                  */
+		};
+
+		/** Enum for the Android Open Accessory class specific control requests that can be issued by the USB bus host. */
+		enum AOA_ClassRequests_t
+		{
+			AOA_REQ_GetAccessoryProtocol    = 0x33, /**< Android Open Accessory control request to retrieve the device's supported Accessory Protocol version. */
+			AOA_REQ_SendString              = 0x34, /**< Android Open Accessory control request to set an accessory property string in the device. */
+			AOA_REQ_StartAccessoryMode      = 0x35, /**< Android Open Accessory control request to switch the device into Accessory mode. */
+		};
+
+		/** Enum for the possible Android Open Accessory property string indexes. */
+		enum AOA_Strings_t
+		{
+			AOA_STRING_Manufacturer         = 0, /**< Index of the Manufacturer property string. */
+			AOA_STRING_Model                = 1, /**< Index of the Model Name property string. */
+			AOA_STRING_Description          = 2, /**< Index of the Description property string. */
+			AOA_STRING_Version              = 3, /**< Index of the Version Number property string. */
+			AOA_STRING_URI                  = 4, /**< Index of the URI Information property string. */
+			AOA_STRING_Serial               = 5, /**< Index of the Serial Number property string. */
+
+			#if !defined(__DOXYGEN__)
+			AOA_STRING_TOTAL_STRINGS
+			#endif
+		};
+
+		/** Enum for the possible Android Open Accessory protocol versions. */
+		enum AOA_Protocols_t
+		{
+			AOA_PROTOCOL_AccessoryV1        = 0x0001, /**< Android Open Accessory version 1. */
+			AOA_PROTOCOL_AccessoryV2        = 0x0002, /**< Android Open Accessory version 2. */
+		};
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Common/AudioClassCommon.h b/lib/lufa/LUFA/Drivers/USB/Class/Common/AudioClassCommon.h
new file mode 100644
index 0000000000..46ecd08587
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Class/Common/AudioClassCommon.h
@@ -0,0 +1,780 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Common definitions and declarations for the library USB Audio 1.0 Class driver.
+ *
+ *  Common definitions and declarations for the library USB Audio 1.0 Class driver.
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the USB module driver
+ *        dispatch header located in LUFA/Drivers/USB.h.
+ */
+
+/** \ingroup Group_USBClassAudio
+ *  \defgroup Group_USBClassAudioCommon  Common Class Definitions
+ *
+ *  \section Sec_USBClassAudioCommon_ModDescription Module Description
+ *  Constants, Types and Enum definitions that are common to both Device and Host modes for the USB
+ *  Audio 1.0 Class.
+ *
+ *  @{
+ */
+
+#ifndef _AUDIO_CLASS_COMMON_H_
+#define _AUDIO_CLASS_COMMON_H_
+
+	/* Includes: */
+		#include "../../Core/StdDescriptors.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_AUDIO_DRIVER)
+			#error Do not include this file directly. Include LUFA/Drivers/USB.h instead.
+		#endif
+
+	/* Macros: */
+		/** \name Audio Channel Masks */
+		//@{
+		/** Supported channel mask for an Audio class terminal descriptor. See the Audio class specification for more details. */
+		#define AUDIO_CHANNEL_LEFT_FRONT           (1 << 0)
+
+		/** Supported channel mask for an Audio class terminal descriptor. See the Audio class specification for more details. */
+		#define AUDIO_CHANNEL_RIGHT_FRONT          (1 << 1)
+
+		/** Supported channel mask for an Audio class terminal descriptor. See the Audio class specification for more details. */
+		#define AUDIO_CHANNEL_CENTER_FRONT         (1 << 2)
+
+		/** Supported channel mask for an Audio class terminal descriptor. See the Audio class specification for more details. */
+		#define AUDIO_CHANNEL_LOW_FREQ_ENHANCE     (1 << 3)
+
+		/** Supported channel mask for an Audio class terminal descriptor. See the Audio class specification for more details. */
+		#define AUDIO_CHANNEL_LEFT_SURROUND        (1 << 4)
+
+		/** Supported channel mask for an Audio class terminal descriptor. See the Audio class specification for more details. */
+		#define AUDIO_CHANNEL_RIGHT_SURROUND       (1 << 5)
+
+		/** Supported channel mask for an Audio class terminal descriptor. See the Audio class specification for more details. */
+		#define AUDIO_CHANNEL_LEFT_OF_CENTER       (1 << 6)
+
+		/** Supported channel mask for an Audio class terminal descriptor. See the Audio class specification for more details. */
+		#define AUDIO_CHANNEL_RIGHT_OF_CENTER      (1 << 7)
+
+		/** Supported channel mask for an Audio class terminal descriptor. See the Audio class specification for more details. */
+		#define AUDIO_CHANNEL_SURROUND             (1 << 8)
+
+		/** Supported channel mask for an Audio class terminal descriptor. See the Audio class specification for more details. */
+		#define AUDIO_CHANNEL_SIDE_LEFT            (1 << 9)
+
+		/** Supported channel mask for an Audio class terminal descriptor. See the Audio class specification for more details. */
+		#define AUDIO_CHANNEL_SIDE_RIGHT           (1 << 10)
+
+		/** Supported channel mask for an Audio class terminal descriptor. See the Audio class specification for more details. */
+		#define AUDIO_CHANNEL_TOP                  (1 << 11)
+		//@}
+
+		/** \name Audio Feature Masks */
+		//@{
+		/** Supported feature mask for an Audio class feature unit descriptor. See the Audio class specification for more details. */
+		#define AUDIO_FEATURE_MUTE                 (1 << 0)
+
+		/** Supported feature mask for an Audio class feature unit descriptor. See the Audio class specification for more details. */
+		#define AUDIO_FEATURE_VOLUME               (1 << 1)
+
+		/** Supported feature mask for an Audio class feature unit descriptor. See the Audio class specification for more details. */
+		#define AUDIO_FEATURE_BASS                 (1 << 2)
+
+		/** Supported feature mask for an Audio class feature unit descriptor. See the Audio class specification for more details. */
+		#define AUDIO_FEATURE_MID                  (1 << 3)
+
+		/** Supported feature mask for an Audio class feature unit descriptor. See the Audio class specification for more details. */
+		#define AUDIO_FEATURE_TREBLE               (1 << 4)
+
+		/** Supported feature mask for an Audio class feature unit descriptor. See the Audio class specification for more details. */
+		#define AUDIO_FEATURE_GRAPHIC_EQUALIZER    (1 << 5)
+
+		/** Supported feature mask for an Audio class feature unit descriptor. See the Audio class specification for more details. */
+		#define AUDIO_FEATURE_AUTOMATIC_GAIN       (1 << 6)
+
+		/** Supported feature mask for an Audio class feature unit descriptor. See the Audio class specification for more details. */
+		#define AUDIO_FEATURE_DELAY                (1 << 7)
+
+		/** Supported feature mask for an Audio class feature unit descriptor. See the Audio class specification for more details. */
+		#define AUDIO_FEATURE_BASS_BOOST           (1 << 8)
+
+		/** Supported feature mask for an Audio class feature unit descriptor. See the Audio class specification for more details. */
+		#define AUDIO_FEATURE_BASS_LOUDNESS        (1 << 9)
+		//@}
+
+		/** \name Audio Terminal Types */
+		//@{
+		/** Terminal type constant for an Audio class terminal descriptor. See the Audio class specification for more details. */
+		#define AUDIO_TERMINAL_UNDEFINED           0x0100
+
+		/** Terminal type constant for an Audio class terminal descriptor. See the Audio class specification for more details. */
+		#define AUDIO_TERMINAL_STREAMING           0x0101
+
+		/** Terminal type constant for an Audio class terminal descriptor. See the Audio class specification for more details. */
+		#define AUDIO_TERMINAL_VENDOR              0x01FF
+
+		/** Terminal type constant for an Audio class terminal descriptor. See the Audio class specification for more details. */
+		#define AUDIO_TERMINAL_IN_UNDEFINED        0x0200
+
+		/** Terminal type constant for an Audio class terminal descriptor. See the Audio class specification for more details. */
+		#define AUDIO_TERMINAL_IN_MIC              0x0201
+
+		/** Terminal type constant for an Audio class terminal descriptor. See the Audio class specification for more details. */
+		#define AUDIO_TERMINAL_IN_DESKTOP_MIC      0x0202
+
+		/** Terminal type constant for an Audio class terminal descriptor. See the Audio class specification for more details. */
+		#define AUDIO_TERMINAL_IN_PERSONAL_MIC     0x0203
+
+		/** Terminal type constant for an Audio class terminal descriptor. See the Audio class specification for more details. */
+		#define AUDIO_TERMINAL_IN_OMNIDIR_MIC      0x0204
+
+		/** Terminal type constant for an Audio class terminal descriptor. See the Audio class specification for more details. */
+		#define AUDIO_TERMINAL_IN_MIC_ARRAY        0x0205
+
+		/** Terminal type constant for an Audio class terminal descriptor. See the Audio class specification for more details. */
+		#define AUDIO_TERMINAL_IN_PROCESSING_MIC   0x0206
+
+		/** Terminal type constant for an Audio class terminal descriptor. See the Audio class specification for more details. */
+		#define AUDIO_TERMINAL_IN_OUT_UNDEFINED    0x0300
+
+		/** Terminal type constant for an Audio class terminal descriptor. See the Audio class specification for more details. */
+		#define AUDIO_TERMINAL_OUT_SPEAKER         0x0301
+
+		/** Terminal type constant for an Audio class terminal descriptor. See the Audio class specification for more details. */
+		#define AUDIO_TERMINAL_OUT_HEADPHONES      0x0302
+
+		/** Terminal type constant for an Audio class terminal descriptor. See the Audio class specification for more details. */
+		#define AUDIO_TERMINAL_OUT_HEAD_MOUNTED    0x0303
+
+		/** Terminal type constant for an Audio class terminal descriptor. See the Audio class specification for more details. */
+		#define AUDIO_TERMINAL_OUT_DESKTOP         0x0304
+
+		/** Terminal type constant for an Audio class terminal descriptor. See the Audio class specification for more details. */
+		#define AUDIO_TERMINAL_OUT_ROOM            0x0305
+
+		/** Terminal type constant for an Audio class terminal descriptor. See the Audio class specification for more details. */
+		#define AUDIO_TERMINAL_OUT_COMMUNICATION   0x0306
+
+		/** Terminal type constant for an Audio class terminal descriptor. See the Audio class specification for more details. */
+		#define AUDIO_TERMINAL_OUT_LOWFREQ         0x0307
+		//@}
+
+		/** Convenience macro to fill a 24-bit \ref USB_Audio_SampleFreq_t structure with the given sample rate as a 24-bit number.
+		 *
+		 *  \param[in] freq  Required audio sampling frequency in HZ
+		 */
+		#define AUDIO_SAMPLE_FREQ(freq)           {.Byte1 = ((uint32_t)freq & 0xFF), .Byte2 = (((uint32_t)freq >> 8) & 0xFF), .Byte3 = (((uint32_t)freq >> 16) & 0xFF)}
+
+		/** Mask for the attributes parameter of an Audio class-specific Endpoint descriptor, indicating that the endpoint
+		 *  accepts only filled endpoint packets of audio samples.
+		 */
+		#define AUDIO_EP_FULL_PACKETS_ONLY        (1 << 7)
+
+		/** Mask for the attributes parameter of an Audio class-specific Endpoint descriptor, indicating that the endpoint
+		 *  will accept partially filled endpoint packets of audio samples.
+		 */
+		#define AUDIO_EP_ACCEPTS_SMALL_PACKETS    (0 << 7)
+
+		/** Mask for the attributes parameter of an Audio class-specific Endpoint descriptor, indicating that the endpoint
+		 *  allows for sampling frequency adjustments to be made via control requests directed at the endpoint.
+		 */
+		#define AUDIO_EP_SAMPLE_FREQ_CONTROL      (1 << 0)
+
+		/** Mask for the attributes parameter of an Audio class-specific Endpoint descriptor, indicating that the endpoint
+		 *  allows for pitch adjustments to be made via control requests directed at the endpoint.
+		 */
+		#define AUDIO_EP_PITCH_CONTROL            (1 << 1)
+
+	/* Enums: */
+		/** Enum for possible Class, Subclass and Protocol values of device and interface descriptors relating to the Audio
+		 *  device class.
+		 */
+		enum Audio_Descriptor_ClassSubclassProtocol_t
+		{
+			AUDIO_CSCP_AudioClass                     = 0x01, /**< Descriptor Class value indicating that the device or
+			                                                   *   interface belongs to the USB Audio 1.0 class.
+			                                                   */
+			AUDIO_CSCP_ControlSubclass                = 0x01, /**< Descriptor Subclass value indicating that the device or
+			                                                   *   interface belongs to the Audio Control subclass.
+			                                                   */
+			AUDIO_CSCP_ControlProtocol                = 0x00, /**< Descriptor Protocol value indicating that the device or
+			                                                   *   interface belongs to the Audio Control protocol.
+			                                                   */
+			AUDIO_CSCP_AudioStreamingSubclass         = 0x02, /**< Descriptor Subclass value indicating that the device or
+			                                                   *   interface belongs to the MIDI Streaming subclass.
+			                                                   */
+			AUDIO_CSCP_MIDIStreamingSubclass          = 0x03, /**< Descriptor Subclass value indicating that the device or
+			                                                   *   interface belongs to the Audio streaming subclass.
+			                                                   */
+			AUDIO_CSCP_StreamingProtocol              = 0x00, /**< Descriptor Protocol value indicating that the device or
+			                                                   *   interface belongs to the Streaming Audio protocol.
+			                                                   */
+		};
+
+		/** Audio class specific interface description subtypes, for the Audio Control interface. */
+		enum Audio_CSInterface_AC_SubTypes_t
+		{
+			AUDIO_DSUBTYPE_CSInterface_Header         = 0x01, /**< Audio class specific control interface header. */
+			AUDIO_DSUBTYPE_CSInterface_InputTerminal  = 0x02, /**< Audio class specific control interface Input Terminal. */
+			AUDIO_DSUBTYPE_CSInterface_OutputTerminal = 0x03, /**< Audio class specific control interface Output Terminal. */
+			AUDIO_DSUBTYPE_CSInterface_Mixer          = 0x04, /**< Audio class specific control interface Mixer Unit. */
+			AUDIO_DSUBTYPE_CSInterface_Selector       = 0x05, /**< Audio class specific control interface Selector Unit. */
+			AUDIO_DSUBTYPE_CSInterface_Feature        = 0x06, /**< Audio class specific control interface Feature Unit. */
+			AUDIO_DSUBTYPE_CSInterface_Processing     = 0x07, /**< Audio class specific control interface Processing Unit. */
+			AUDIO_DSUBTYPE_CSInterface_Extension      = 0x08, /**< Audio class specific control interface Extension Unit. */
+		};
+
+		/** Audio class specific interface description subtypes, for the Audio Streaming interface. */
+		enum Audio_CSInterface_AS_SubTypes_t
+		{
+			AUDIO_DSUBTYPE_CSInterface_General        = 0x01, /**< Audio class specific streaming interface general descriptor. */
+			AUDIO_DSUBTYPE_CSInterface_FormatType     = 0x02, /**< Audio class specific streaming interface format type descriptor. */
+			AUDIO_DSUBTYPE_CSInterface_FormatSpecific = 0x03, /**< Audio class specific streaming interface format information descriptor. */
+		};
+
+		/** Audio class specific endpoint description subtypes, for the Audio Streaming interface. */
+		enum Audio_CSEndpoint_SubTypes_t
+		{
+			AUDIO_DSUBTYPE_CSEndpoint_General         = 0x01, /**< Audio class specific endpoint general descriptor. */
+		};
+
+		/** Enum for the Audio class specific control requests that can be issued by the USB bus host. */
+		enum Audio_ClassRequests_t
+		{
+			AUDIO_REQ_SetCurrent    = 0x01, /**< Audio class-specific request to set the current value of a parameter within the device. */
+			AUDIO_REQ_SetMinimum    = 0x02, /**< Audio class-specific request to set the minimum value of a parameter within the device. */
+			AUDIO_REQ_SetMaximum    = 0x03, /**< Audio class-specific request to set the maximum value of a parameter within the device. */
+			AUDIO_REQ_SetResolution = 0x04, /**< Audio class-specific request to set the resolution value of a parameter within the device. */
+			AUDIO_REQ_SetMemory     = 0x05, /**< Audio class-specific request to set the memory value of a parameter within the device. */
+			AUDIO_REQ_GetCurrent    = 0x81, /**< Audio class-specific request to get the current value of a parameter within the device. */
+			AUDIO_REQ_GetMinimum    = 0x82, /**< Audio class-specific request to get the minimum value of a parameter within the device. */
+			AUDIO_REQ_GetMaximum    = 0x83, /**< Audio class-specific request to get the maximum value of a parameter within the device. */
+			AUDIO_REQ_GetResolution = 0x84, /**< Audio class-specific request to get the resolution value of a parameter within the device. */
+			AUDIO_REQ_GetMemory     = 0x85, /**< Audio class-specific request to get the memory value of a parameter within the device. */
+			AUDIO_REQ_GetStatus     = 0xFF, /**< Audio class-specific request to get the device status. */
+		};
+
+		/** Enum for Audio class specific Endpoint control modifiers which can be set and retrieved by a USB host, if the corresponding
+		 *  endpoint control is indicated to be supported in the Endpoint's Audio-class specific endpoint descriptor.
+		 */
+		enum Audio_EndpointControls_t
+		{
+			AUDIO_EPCONTROL_SamplingFreq = 0x01, /**< Sampling frequency adjustment of the endpoint. */
+			AUDIO_EPCONTROL_Pitch        = 0x02, /**< Pitch adjustment of the endpoint. */
+		};
+
+	/* Type Defines: */
+		/** \brief Audio class-specific Input Terminal Descriptor (LUFA naming conventions).
+		 *
+		 *  Type define for an Audio class-specific input terminal descriptor. This indicates to the host that the device
+		 *  contains an input audio source, either from a physical terminal on the device, or a logical terminal (for example,
+		 *  a USB endpoint). See the USB Audio specification for more details.
+		 *
+		 *  \see \ref USB_Audio_StdDescriptor_InputTerminal_t for the version of this type with standard element names.
+		 *
+		 *  \note Regardless of CPU architecture, these values should be stored as little endian.
+		 */
+		typedef struct
+		{
+			USB_Descriptor_Header_t Header; /**< Regular descriptor header containing the descriptor's type and length. */
+			uint8_t                 Subtype; /**< Sub type value used to distinguish between audio class-specific descriptors,
+			                                  *   must be \ref AUDIO_DSUBTYPE_CSInterface_InputTerminal.
+			                                  */
+
+			uint8_t                 TerminalID; /**< ID value of this terminal unit - must be a unique value within the device. */
+			uint16_t                TerminalType; /**< Type of terminal, a \c TERMINAL_* mask. */
+			uint8_t                 AssociatedOutputTerminal; /**< ID of associated output terminal, for physically grouped terminals
+			                                                   *   such as the speaker and microphone of a phone handset.
+			                                                   */
+			uint8_t                 TotalChannels; /**< Total number of separate audio channels within this interface (right, left, etc.) */
+			uint16_t                ChannelConfig; /**< \c CHANNEL_* masks indicating what channel layout is supported by this terminal. */
+
+			uint8_t                 ChannelStrIndex; /**< Index of a string descriptor describing this channel within the device. */
+			uint8_t                 TerminalStrIndex; /**< Index of a string descriptor describing this descriptor within the device. */
+		} ATTR_PACKED USB_Audio_Descriptor_InputTerminal_t;
+
+		/** \brief Audio class-specific Input Terminal Descriptor (USB-IF naming conventions).
+		 *
+		 *  Type define for an Audio class-specific input terminal descriptor. This indicates to the host that the device
+		 *  contains an input audio source, either from a physical terminal on the device, or a logical terminal (for example,
+		 *  a USB endpoint). See the USB Audio specification for more details.
+		 *
+		 *  \see \ref USB_Audio_Descriptor_InputTerminal_t for the version of this type with non-standard LUFA specific
+		 *       element names.
+		 *
+		 *  \note Regardless of CPU architecture, these values should be stored as little endian.
+		 */
+		typedef struct
+		{
+			uint8_t  bLength; /**< Size of the descriptor, in bytes. */
+			uint8_t  bDescriptorType; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a value
+			                           *   given by the specific class.
+			                           */
+
+			uint8_t  bDescriptorSubtype; /**< Sub type value used to distinguish between audio class-specific descriptors,
+			                              *   must be \ref AUDIO_DSUBTYPE_CSInterface_InputTerminal.
+			                              */
+			uint8_t  bTerminalID; /**< ID value of this terminal unit - must be a unique value within the device. */
+			uint16_t wTerminalType; /**< Type of terminal, a \c TERMINAL_* mask. */
+			uint8_t  bAssocTerminal; /**< ID of associated output terminal, for physically grouped terminals
+			                          *   such as the speaker and microphone of a phone handset.
+			                          */
+			uint8_t  bNrChannels; /**< Total number of separate audio channels within this interface (right, left, etc.) */
+			uint16_t wChannelConfig; /**< \c CHANNEL_* masks indicating what channel layout is supported by this terminal. */
+
+			uint8_t  iChannelNames; /**< Index of a string descriptor describing this channel within the device. */
+			uint8_t  iTerminal; /**< Index of a string descriptor describing this descriptor within the device. */
+		} ATTR_PACKED USB_Audio_StdDescriptor_InputTerminal_t;
+
+		/** \brief Audio class-specific Output Terminal Descriptor (LUFA naming conventions).
+		 *
+		 *  Type define for an Audio class-specific output terminal descriptor. This indicates to the host that the device
+		 *  contains an output audio sink, either to a physical terminal on the device, or a logical terminal (for example,
+		 *  a USB endpoint). See the USB Audio specification for more details.
+		 *
+		 *  \see \ref USB_Audio_StdDescriptor_OutputTerminal_t for the version of this type with standard element names.
+		 *
+		 *  \note Regardless of CPU architecture, these values should be stored as little endian.
+		 */
+		typedef struct
+		{
+			USB_Descriptor_Header_t Header; /**< Regular descriptor header containing the descriptor's type and length. */
+			uint8_t                 Subtype; /**< Sub type value used to distinguish between audio class-specific descriptors,
+			                                  *   must be \ref AUDIO_DSUBTYPE_CSInterface_OutputTerminal.
+			                                  */
+
+			uint8_t                 TerminalID; /**< ID value of this terminal unit - must be a unique value within the device. */
+			uint16_t                TerminalType; /**< Type of terminal, a \c TERMINAL_* mask. */
+			uint8_t                 AssociatedInputTerminal; /**< ID of associated input terminal, for physically grouped terminals
+			                                                    *   such as the speaker and microphone of a phone handset.
+			                                                    */
+			uint8_t                 SourceID; /**< ID value of the unit this terminal's audio is sourced from. */
+
+			uint8_t                 TerminalStrIndex; /**< Index of a string descriptor describing this descriptor within the device. */
+		} ATTR_PACKED USB_Audio_Descriptor_OutputTerminal_t;
+
+		/** \brief Audio class-specific Output Terminal Descriptor (USB-IF naming conventions).
+		 *
+		 *  Type define for an Audio class-specific output terminal descriptor. This indicates to the host that the device
+		 *  contains an output audio sink, either to a physical terminal on the device, or a logical terminal (for example,
+		 *  a USB endpoint). See the USB Audio specification for more details.
+		 *
+		 *  \see \ref USB_Audio_Descriptor_OutputTerminal_t for the version of this type with non-standard LUFA specific
+		 *       element names.
+		 *
+		 *  \note Regardless of CPU architecture, these values should be stored as little endian.
+		 */
+		typedef struct
+		{
+			uint8_t  bLength; /**< Size of the descriptor, in bytes. */
+			uint8_t  bDescriptorType; /**< Sub type value used to distinguish between audio class-specific descriptors,
+			                           *   must be \ref AUDIO_DSUBTYPE_CSInterface_OutputTerminal.
+			                           */
+
+			uint8_t  bDescriptorSubtype; /**< Sub type value used to distinguish between audio class-specific descriptors,
+			                              *   a value from the \ref Audio_CSInterface_AC_SubTypes_t enum.
+			                              */
+			uint8_t  bTerminalID; /**< ID value of this terminal unit - must be a unique value within the device. */
+			uint16_t wTerminalType; /**< Type of terminal, a \c TERMINAL_* mask. */
+			uint8_t  bAssocTerminal; /**< ID of associated input terminal, for physically grouped terminals
+			                          *   such as the speaker and microphone of a phone handset.
+			                          */
+			uint8_t  bSourceID; /**< ID value of the unit this terminal's audio is sourced from. */
+
+			uint8_t  iTerminal; /**< Index of a string descriptor describing this descriptor within the device. */
+		} ATTR_PACKED USB_Audio_StdDescriptor_OutputTerminal_t;
+
+		/** \brief Audio class-specific Interface Descriptor (LUFA naming conventions).
+		 *
+		 *  Type define for an Audio class-specific interface descriptor. This follows a regular interface descriptor to
+		 *  supply extra information about the audio device's layout to the host. See the USB Audio specification for more
+		 *  details.
+		 *
+		 *  \see \ref USB_Audio_StdDescriptor_Interface_AC_t for the version of this type with standard element names.
+		 *
+		 *  \note Regardless of CPU architecture, these values should be stored as little endian.
+		 */
+		typedef struct
+		{
+			USB_Descriptor_Header_t Header; /**< Regular descriptor header containing the descriptor's type and length. */
+			uint8_t                 Subtype; /**< Sub type value used to distinguish between audio class-specific descriptors,
+			                                  *   a value from the \ref Audio_CSInterface_AS_SubTypes_t enum.
+			                                  */
+
+			uint16_t                ACSpecification; /**< Binary Coded Decimal value, indicating the supported Audio Class specification version.
+			                                          *
+			                                          *   \see \ref VERSION_BCD() utility macro.
+			                                          */
+			uint16_t                TotalLength; /**< Total length of the Audio class-specific descriptors, including this descriptor. */
+
+			uint8_t                 InCollection; /**< Total number of Audio Streaming interfaces linked to this Audio Control interface (must be 1). */
+			uint8_t                 InterfaceNumber; /**< Interface number of the associated Audio Streaming interface. */
+		} ATTR_PACKED USB_Audio_Descriptor_Interface_AC_t;
+
+		/** \brief Audio class-specific Interface Descriptor (USB-IF naming conventions).
+		 *
+		 *  Type define for an Audio class-specific interface descriptor. This follows a regular interface descriptor to
+		 *  supply extra information about the audio device's layout to the host. See the USB Audio specification for more
+		 *  details.
+		 *
+		 *  \see \ref USB_Audio_Descriptor_Interface_AC_t for the version of this type with non-standard LUFA specific
+		 *       element names.
+		 *
+		 *  \note Regardless of CPU architecture, these values should be stored as little endian.
+		 */
+		typedef struct
+		{
+			uint8_t  bLength; /**< Size of the descriptor, in bytes. */
+			uint8_t  bDescriptorType; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a value
+			                           *   given by the specific class.
+			                           */
+
+			uint8_t  bDescriptorSubtype;/**< Sub type value used to distinguish between audio class-specific descriptors,
+			                             *   a value from the \ref Audio_CSInterface_AS_SubTypes_t enum.
+			                             */
+
+			uint16_t bcdADC; /**< Binary coded decimal value, indicating the supported Audio Class specification version.
+			                  *
+			                  *   \see \ref VERSION_BCD() utility macro.
+			                  */
+			uint16_t wTotalLength; /**< Total length of the Audio class-specific descriptors, including this descriptor. */
+
+			uint8_t  bInCollection; /**< Total number of Audio Streaming interfaces linked to this Audio Control interface (must be 1). */
+			uint8_t  bInterfaceNumbers; /**< Interface number of the associated Audio Streaming interface. */
+		} ATTR_PACKED USB_Audio_StdDescriptor_Interface_AC_t;
+
+		/** \brief Audio class-specific Feature Unit Descriptor (LUFA naming conventions).
+		 *
+		 *  Type define for an Audio class-specific Feature Unit descriptor. This indicates to the host what features
+		 *  are present in the device's audio stream for basic control, such as per-channel volume. See the USB Audio
+		 *  specification for more details.
+		 *
+		 *  \see \ref USB_Audio_StdDescriptor_FeatureUnit_t for the version of this type with standard element names.
+		 *
+		 *  \note Regardless of CPU architecture, these values should be stored as little endian.
+		 */
+		typedef struct
+		{
+			USB_Descriptor_Header_t Header; /**< Regular descriptor header containing the descriptor's type and length. */
+			uint8_t                 Subtype; /**< Sub type value used to distinguish between audio class-specific descriptors,
+			                                  *   must be \ref AUDIO_DSUBTYPE_CSInterface_Feature.
+			                                  */
+
+			uint8_t                 UnitID; /**< ID value of this feature unit - must be a unique value within the device. */
+			uint8_t                 SourceID; /**< Source ID value of the audio source input into this feature unit. */
+
+			uint8_t                 ControlSize; /**< Size of each element in the \c ChannelControls array. */
+			uint8_t                 ChannelControls[3]; /**< Feature masks for the control channel, and each separate audio channel. */
+
+			uint8_t                 FeatureUnitStrIndex; /**< Index of a string descriptor describing this descriptor within the device. */
+		} ATTR_PACKED USB_Audio_Descriptor_FeatureUnit_t;
+
+		/** \brief Audio class-specific Feature Unit Descriptor (USB-IF naming conventions).
+		 *
+		 *  Type define for an Audio class-specific Feature Unit descriptor. This indicates to the host what features
+		 *  are present in the device's audio stream for basic control, such as per-channel volume. See the USB Audio
+		 *  specification for more details.
+		 *
+		 *  \see \ref USB_Audio_Descriptor_FeatureUnit_t for the version of this type with non-standard LUFA specific
+		 *       element names.
+		 *
+		 *  \note Regardless of CPU architecture, these values should be stored as little endian.
+		 */
+		typedef struct
+		{
+			uint8_t bLength; /**< Size of the descriptor, in bytes. */
+			uint8_t bDescriptorType; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a value
+			                          *   given by the specific class.
+			                          */
+
+			uint8_t bDescriptorSubtype; /**< Sub type value used to distinguish between audio class-specific descriptors,
+			                             *   must be \ref AUDIO_DSUBTYPE_CSInterface_Feature.
+			                             */
+
+			uint8_t bUnitID; /**< ID value of this feature unit - must be a unique value within the device. */
+			uint8_t bSourceID; /**< Source ID value of the audio source input into this feature unit. */
+
+			uint8_t bControlSize; /**< Size of each element in the \c ChannelControls array. */
+			uint8_t bmaControls[3]; /**< Feature masks for the control channel, and each separate audio channel. */
+
+			uint8_t iFeature; /**< Index of a string descriptor describing this descriptor within the device. */
+		} ATTR_PACKED USB_Audio_StdDescriptor_FeatureUnit_t;
+
+		/** \brief Audio class-specific Streaming Audio Interface Descriptor (LUFA naming conventions).
+		 *
+		 *  Type define for an Audio class-specific streaming interface descriptor. This indicates to the host
+		 *  how audio streams within the device are formatted. See the USB Audio specification for more details.
+		 *
+		 *  \see \ref USB_Audio_StdDescriptor_Interface_AS_t for the version of this type with standard element names.
+		 *
+		 *  \note Regardless of CPU architecture, these values should be stored as little endian.
+		 */
+		typedef struct
+		{
+			USB_Descriptor_Header_t Header; /**< Regular descriptor header containing the descriptor's type and length. */
+			uint8_t                 Subtype; /**< Sub type value used to distinguish between audio class-specific descriptors,
+			                                  *   a value from the \ref Audio_CSInterface_AS_SubTypes_t enum.
+			                                  */
+
+			uint8_t                 TerminalLink; /**< ID value of the output terminal this descriptor is describing. */
+
+			uint8_t                 FrameDelay; /**< Delay in frames resulting from the complete sample processing from input to output. */
+			uint16_t                AudioFormat; /**< Format of the audio stream, see Audio Device Formats specification. */
+		} ATTR_PACKED USB_Audio_Descriptor_Interface_AS_t;
+
+		/** \brief Audio class-specific Streaming Audio Interface Descriptor (USB-IF naming conventions).
+		 *
+		 *  Type define for an Audio class-specific streaming interface descriptor. This indicates to the host
+		 *  how audio streams within the device are formatted. See the USB Audio specification for more details.
+		 *
+		 *  \see \ref USB_Audio_Descriptor_Interface_AS_t for the version of this type with non-standard LUFA specific
+		 *       element names.
+		 *
+		 *  \note Regardless of CPU architecture, these values should be stored as little endian.
+		 */
+		typedef struct
+		{
+			uint8_t  bLength; /**< Size of the descriptor, in bytes. */
+			uint8_t  bDescriptorType; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a value
+			                           *   given by the specific class.
+			                           */
+
+			uint8_t  bDescriptorSubtype; /**< Sub type value used to distinguish between audio class-specific descriptors,
+			                              *   a value from the \ref Audio_CSInterface_AS_SubTypes_t enum.
+			                              */
+
+			uint8_t  bTerminalLink; /**< ID value of the output terminal this descriptor is describing. */
+
+			uint8_t  bDelay; /**< Delay in frames resulting from the complete sample processing from input to output. */
+			uint16_t wFormatTag; /**< Format of the audio stream, see Audio Device Formats specification. */
+		} ATTR_PACKED USB_Audio_StdDescriptor_Interface_AS_t;
+
+		/** \brief Audio class-specific Format Descriptor (LUFA naming conventions).
+		 *
+		 *  Type define for an Audio class-specific audio format descriptor. This is used to give the host full details
+		 *  about the number of channels, the sample resolution, acceptable sample frequencies and encoding method used
+		 *  in the device's audio streams. See the USB Audio specification for more details.
+		 *
+		 *  \attention This descriptor <b>must</b> be followed by one or more \ref USB_Audio_SampleFreq_t elements containing
+		 *             the continuous or discrete sample frequencies.
+		 *
+		 *  \see \ref USB_Audio_StdDescriptor_Format_t for the version of this type with standard element names.
+		 *
+		 *  \note Regardless of CPU architecture, these values should be stored as little endian.
+		 */
+		typedef struct
+		{
+			USB_Descriptor_Header_t Header; /**< Regular descriptor header containing the descriptor's type and length. */
+			uint8_t                 Subtype; /**< Sub type value used to distinguish between audio class-specific descriptors,
+			                                  *   must be \ref AUDIO_DSUBTYPE_CSInterface_FormatType.
+			                                  */
+
+			uint8_t                 FormatType; /**< Format of the audio stream, see Audio Device Formats specification. */
+			uint8_t                 Channels; /**< Total number of discrete channels in the stream. */
+
+			uint8_t                 SubFrameSize; /**< Size in bytes of each channel's sample data in the stream. */
+			uint8_t                 BitResolution; /**< Bits of resolution of each channel's samples in the stream. */
+
+			uint8_t                 TotalDiscreteSampleRates; /**< Total number of discrete sample frequencies supported by the device. When
+			                                                   *   zero, this must be followed by the lower and upper continuous sampling
+			                                                   *   frequencies supported by the device; otherwise, this must be followed
+			                                                   *   by the given number of discrete sampling frequencies supported.
+			                                                   */
+		} ATTR_PACKED USB_Audio_Descriptor_Format_t;
+
+		/** \brief 24-Bit Audio Frequency Structure.
+		 *
+		 *  Type define for a 24-bit audio sample frequency structure. As GCC does not contain a built in 24-bit datatype,
+		 *  this this structure is used to build up the value instead. Fill this structure with the \ref AUDIO_SAMPLE_FREQ() macro.
+		 *
+		 *  \note Regardless of CPU architecture, these values should be stored as little endian.
+		 */
+		typedef struct
+		{
+			uint8_t Byte1; /**< Lowest 8 bits of the 24-bit value. */
+			uint8_t Byte2; /**< Middle 8 bits of the 24-bit value. */
+			uint8_t Byte3; /**< Upper 8 bits of the 24-bit value. */
+		} ATTR_PACKED USB_Audio_SampleFreq_t;
+
+		/** \brief Audio class-specific Format Descriptor (USB-IF naming conventions).
+		 *
+		 *  Type define for an Audio class-specific audio format descriptor. This is used to give the host full details
+		 *  about the number of channels, the sample resolution, acceptable sample frequencies and encoding method used
+		 *  in the device's audio streams. See the USB Audio specification for more details.
+		 *
+		 *  \attention This descriptor <b>must</b> be followed by one or more 24-bit integer elements containing the continuous
+		 *             or discrete sample frequencies.
+		 *
+		 *  \see \ref USB_Audio_Descriptor_Format_t for the version of this type with non-standard LUFA specific
+		 *       element names.
+		 *
+		 *  \note Regardless of CPU architecture, these values should be stored as little endian.
+		 */
+		typedef struct
+		{
+			uint8_t bLength; /**< Size of the descriptor, in bytes. */
+			uint8_t bDescriptorType; /**< Sub type value used to distinguish between audio class-specific descriptors,
+			                          *   must be \ref AUDIO_DSUBTYPE_CSInterface_FormatType.
+			                          */
+
+			uint8_t bDescriptorSubtype;/**< Sub type value used to distinguish between audio class-specific descriptors,
+			                            *   a value from the \ref Audio_CSInterface_AS_SubTypes_t enum.
+			                            */
+
+			uint8_t bFormatType; /**< Format of the audio stream, see Audio Device Formats specification. */
+			uint8_t bNrChannels; /**< Total number of discrete channels in the stream. */
+
+			uint8_t bSubFrameSize; /**< Size in bytes of each channel's sample data in the stream. */
+			uint8_t bBitResolution; /**< Bits of resolution of each channel's samples in the stream. */
+
+			uint8_t bSampleFrequencyType; /**< Total number of sample frequencies supported by the device. When
+			                               *   zero, this must be followed by the lower and upper continuous sampling
+			                               *   frequencies supported by the device; otherwise, this must be followed
+			                               *   by the given number of discrete sampling frequencies supported.
+			                               */
+		} ATTR_PACKED USB_Audio_StdDescriptor_Format_t;
+
+		/** \brief Audio class-specific Streaming Endpoint Descriptor (LUFA naming conventions).
+		 *
+		 *  Type define for an Audio class-specific endpoint descriptor. This contains a regular endpoint
+		 *  descriptor with a few Audio-class-specific extensions. See the USB Audio specification for more details.
+		 *
+		 *  \see \ref USB_Audio_StdDescriptor_StreamEndpoint_Std_t for the version of this type with standard element names.
+		 *
+		 *  \note Regardless of CPU architecture, these values should be stored as little endian.
+		 */
+		typedef struct
+		{
+			USB_Descriptor_Endpoint_t Endpoint; /**< Standard endpoint descriptor describing the audio endpoint. */
+
+			uint8_t                   Refresh; /**< Always set to zero for Audio class devices. */
+			uint8_t                   SyncEndpointNumber; /**< Endpoint address to send synchronization information to, if needed (zero otherwise). */
+		} ATTR_PACKED USB_Audio_Descriptor_StreamEndpoint_Std_t;
+
+		/** \brief Audio class-specific Streaming Endpoint Descriptor (USB-IF naming conventions).
+		 *
+		 *  Type define for an Audio class-specific endpoint descriptor. This contains a regular endpoint
+		 *  descriptor with a few Audio-class-specific extensions. See the USB Audio specification for more details.
+		 *
+		 *  \see \ref USB_Audio_Descriptor_StreamEndpoint_Std_t for the version of this type with non-standard LUFA specific
+		 *       element names.
+		 *
+		 *  \note Regardless of CPU architecture, these values should be stored as little endian.
+		 */
+		typedef struct
+		{
+			uint8_t  bLength; /**< Size of the descriptor, in bytes. */
+			uint8_t  bDescriptorType; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a
+			                           *   value given by the specific class.
+			                           */
+			uint8_t  bEndpointAddress; /**< Logical address of the endpoint within the device for the current
+			                            *   configuration, including direction mask.
+			                            */
+			uint8_t  bmAttributes; /**< Endpoint attributes, comprised of a mask of the endpoint type (\c EP_TYPE_*)
+			                        *   and attributes (\c ENDPOINT_ATTR_*) masks.
+			                        */
+			uint16_t wMaxPacketSize; /**< Size of the endpoint bank, in bytes. This indicates the maximum packet size
+			                          *   that the endpoint can receive at a time.
+			                          */
+			uint8_t  bInterval; /**< Polling interval in milliseconds for the endpoint if it is an INTERRUPT or
+			                     *   ISOCHRONOUS type.
+			                     */
+
+			uint8_t  bRefresh; /**< Always set to zero for Audio class devices. */
+			uint8_t  bSynchAddress; /**< Endpoint address to send synchronization information to, if needed (zero otherwise). */
+		} ATTR_PACKED USB_Audio_StdDescriptor_StreamEndpoint_Std_t;
+
+		/** \brief Audio class-specific Extended Endpoint Descriptor (LUFA naming conventions).
+		 *
+		 *  Type define for an Audio class-specific extended endpoint descriptor. This contains extra information
+		 *  on the usage of endpoints used to stream audio in and out of the USB Audio device, and follows an Audio
+		 *  class-specific extended endpoint descriptor. See the USB Audio specification for more details.
+		 *
+		 *  \see \ref USB_Audio_StdDescriptor_StreamEndpoint_Spc_t for the version of this type with standard element names.
+		 *
+		 *  \note Regardless of CPU architecture, these values should be stored as little endian.
+		 */
+		typedef struct
+		{
+			USB_Descriptor_Header_t Header; /**< Regular descriptor header containing the descriptor's type and length. */
+			uint8_t                 Subtype; /**< Sub type value used to distinguish between audio class-specific descriptors,
+			                                  *   a value from the \ref Audio_CSEndpoint_SubTypes_t enum.
+			                                  */
+
+			uint8_t                 Attributes; /**< Audio class-specific endpoint attributes, such as \ref AUDIO_EP_FULL_PACKETS_ONLY. */
+
+			uint8_t                 LockDelayUnits; /**< Units used for the LockDelay field, see Audio class specification. */
+			uint16_t                LockDelay; /**< Time required to internally lock endpoint's internal clock recovery circuitry. */
+		} ATTR_PACKED USB_Audio_Descriptor_StreamEndpoint_Spc_t;
+
+		/** \brief Audio class-specific Extended Endpoint Descriptor (USB-IF naming conventions).
+		 *
+		 *  Type define for an Audio class-specific extended endpoint descriptor. This contains extra information
+		 *  on the usage of endpoints used to stream audio in and out of the USB Audio device, and follows an Audio
+		 *  class-specific extended endpoint descriptor. See the USB Audio specification for more details.
+		 *
+		 *  \see \ref USB_Audio_Descriptor_StreamEndpoint_Spc_t for the version of this type with non-standard LUFA specific
+		 *       element names.
+		 *
+		 *  \note Regardless of CPU architecture, these values should be stored as little endian.
+		 */
+		typedef struct
+		{
+			uint8_t  bLength; /**< Size of the descriptor, in bytes. */
+			uint8_t  bDescriptorType; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a value
+			                           *   given by the specific class.
+			                           */
+
+			uint8_t  bDescriptorSubtype; /**< Sub type value used to distinguish between audio class-specific descriptors,
+			                              *   a value from the \ref Audio_CSEndpoint_SubTypes_t enum.
+			                              */
+
+			uint8_t  bmAttributes; /**< Audio class-specific endpoint attributes, such as \ref AUDIO_EP_FULL_PACKETS_ONLY. */
+
+			uint8_t  bLockDelayUnits; /**< Units used for the LockDelay field, see Audio class specification. */
+			uint16_t wLockDelay; /**< Time required to internally lock endpoint's internal clock recovery circuitry. */
+		} ATTR_PACKED USB_Audio_StdDescriptor_StreamEndpoint_Spc_t;
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Common/CDCClassCommon.h b/lib/lufa/LUFA/Drivers/USB/Class/Common/CDCClassCommon.h
new file mode 100644
index 0000000000..1ad49eca14
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Class/Common/CDCClassCommon.h
@@ -0,0 +1,391 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Common definitions and declarations for the library USB CDC Class driver.
+ *
+ *  Common definitions and declarations for the library USB CDC Class driver.
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the USB module driver
+ *        dispatch header located in LUFA/Drivers/USB.h.
+ */
+
+/** \ingroup Group_USBClassCDC
+ *  \defgroup Group_USBClassCDCCommon  Common Class Definitions
+ *
+ *  \section Sec_USBClassCDCCommon_ModDescription Module Description
+ *  Constants, Types and Enum definitions that are common to both Device and Host modes for the USB
+ *  CDC Class.
+ *
+ *  @{
+ */
+
+#ifndef _CDC_CLASS_COMMON_H_
+#define _CDC_CLASS_COMMON_H_
+
+	/* Includes: */
+		#include "../../Core/StdDescriptors.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_CDC_DRIVER)
+			#error Do not include this file directly. Include LUFA/Drivers/USB.h instead.
+		#endif
+
+	/* Macros: */
+		/** \name Virtual Control Line Masks */
+		//@{
+		/** Mask for the DTR handshake line for use with the \ref CDC_REQ_SetControlLineState class-specific request
+		 *  from the host, to indicate that the DTR line state should be high.
+		 */
+		#define CDC_CONTROL_LINE_OUT_DTR         (1 << 0)
+
+		/** Mask for the RTS handshake line for use with the \ref CDC_REQ_SetControlLineState class-specific request
+		 *  from the host, to indicate that the RTS line state should be high.
+		 */
+		#define CDC_CONTROL_LINE_OUT_RTS         (1 << 1)
+
+		/** Mask for the DCD handshake line for use with the \ref CDC_NOTIF_SerialState class-specific notification
+		 *  from the device to the host, to indicate that the DCD line state is currently high.
+		 */
+		#define CDC_CONTROL_LINE_IN_DCD          (1 << 0)
+
+		/** Mask for the DSR handshake line for use with the \ref CDC_NOTIF_SerialState class-specific notification
+		 *  from the device to the host, to indicate that the DSR line state is currently high.
+		 */
+		#define CDC_CONTROL_LINE_IN_DSR          (1 << 1)
+
+		/** Mask for the BREAK handshake line for use with the \ref CDC_NOTIF_SerialState class-specific notification
+		 *  from the device to the host, to indicate that the BREAK line state is currently high.
+		 */
+		#define CDC_CONTROL_LINE_IN_BREAK        (1 << 2)
+
+		/** Mask for the RING handshake line for use with the \ref CDC_NOTIF_SerialState class-specific notification
+		 *  from the device to the host, to indicate that the RING line state is currently high.
+		 */
+		#define CDC_CONTROL_LINE_IN_RING         (1 << 3)
+
+		/** Mask for use with the \ref CDC_NOTIF_SerialState class-specific notification from the device to the host,
+		 *  to indicate that a framing error has occurred on the virtual serial port.
+		 */
+		#define CDC_CONTROL_LINE_IN_FRAMEERROR   (1 << 4)
+
+		/** Mask for use with the \ref CDC_NOTIF_SerialState class-specific notification from the device to the host,
+		 *  to indicate that a parity error has occurred on the virtual serial port.
+		 */
+		#define CDC_CONTROL_LINE_IN_PARITYERROR  (1 << 5)
+
+		/** Mask for use with the \ref CDC_NOTIF_SerialState class-specific notification from the device to the host,
+		 *  to indicate that a data overrun error has occurred on the virtual serial port.
+		 */
+		#define CDC_CONTROL_LINE_IN_OVERRUNERROR (1 << 6)
+		//@}
+
+		/** Macro to define a CDC class-specific functional descriptor. CDC functional descriptors have a
+		 *  uniform structure but variable sized data payloads, thus cannot be represented accurately by
+		 *  a single \c typedef \c struct. A macro is used instead so that functional descriptors can be created
+		 *  easily by specifying the size of the payload. This allows \c sizeof() to work correctly.
+		 *
+		 *  \param[in] DataSize  Size in bytes of the CDC functional descriptor's data payload.
+		 */
+		#define CDC_FUNCTIONAL_DESCRIPTOR(DataSize)        \
+		     struct                                        \
+		     {                                             \
+		          USB_Descriptor_Header_t Header;          \
+			      uint8_t                 SubType;         \
+		          uint8_t                 Data[DataSize];  \
+		     }
+
+	/* Enums: */
+		/** Enum for possible Class, Subclass and Protocol values of device and interface descriptors relating to the CDC
+		 *  device class.
+		 */
+		enum CDC_Descriptor_ClassSubclassProtocol_t
+		{
+			CDC_CSCP_CDCClass               = 0x02, /**< Descriptor Class value indicating that the device or interface
+			                                         *   belongs to the CDC class.
+			                                         */
+			CDC_CSCP_NoSpecificSubclass     = 0x00, /**< Descriptor Subclass value indicating that the device or interface
+			                                         *   belongs to no specific subclass of the CDC class.
+			                                         */
+			CDC_CSCP_ACMSubclass            = 0x02, /**< Descriptor Subclass value indicating that the device or interface
+			                                         *   belongs to the Abstract Control Model CDC subclass.
+			                                         */
+			CDC_CSCP_ATCommandProtocol      = 0x01, /**< Descriptor Protocol value indicating that the device or interface
+			                                         *   belongs to the AT Command protocol of the CDC class.
+			                                         */
+			CDC_CSCP_NoSpecificProtocol     = 0x00, /**< Descriptor Protocol value indicating that the device or interface
+			                                         *   belongs to no specific protocol of the CDC class.
+			                                         */
+			CDC_CSCP_VendorSpecificProtocol = 0xFF, /**< Descriptor Protocol value indicating that the device or interface
+			                                         *   belongs to a vendor-specific protocol of the CDC class.
+			                                         */
+			CDC_CSCP_CDCDataClass           = 0x0A, /**< Descriptor Class value indicating that the device or interface
+			                                         *   belongs to the CDC Data class.
+			                                         */
+			CDC_CSCP_NoDataSubclass         = 0x00, /**< Descriptor Subclass value indicating that the device or interface
+			                                         *   belongs to no specific subclass of the CDC data class.
+			                                         */
+			CDC_CSCP_NoDataProtocol         = 0x00, /**< Descriptor Protocol value indicating that the device or interface
+			                                         *   belongs to no specific protocol of the CDC data class.
+			                                         */
+		};
+
+		/** Enum for the CDC class specific control requests that can be issued by the USB bus host. */
+		enum CDC_ClassRequests_t
+		{
+			CDC_REQ_SendEncapsulatedCommand = 0x00, /**< CDC class-specific request to send an encapsulated command to the device. */
+			CDC_REQ_GetEncapsulatedResponse = 0x01, /**< CDC class-specific request to retrieve an encapsulated command response from the device. */
+			CDC_REQ_SetLineEncoding         = 0x20, /**< CDC class-specific request to set the current virtual serial port configuration settings. */
+			CDC_REQ_GetLineEncoding         = 0x21, /**< CDC class-specific request to get the current virtual serial port configuration settings. */
+			CDC_REQ_SetControlLineState     = 0x22, /**< CDC class-specific request to set the current virtual serial port handshake line states. */
+			CDC_REQ_SendBreak               = 0x23, /**< CDC class-specific request to send a break to the receiver via the carrier channel. */
+		};
+
+		/** Enum for the CDC class specific notification requests that can be issued by a CDC device to a host. */
+		enum CDC_ClassNotifications_t
+		{
+			CDC_NOTIF_SerialState = 0x20, /**< Notification type constant for a change in the virtual serial port
+			                               *   handshake line states, for use with a \ref USB_Request_Header_t
+			                               *   notification structure when sent to the host via the CDC notification
+			                               *   endpoint.
+			                               */
+		};
+
+		/** Enum for the CDC class specific interface descriptor subtypes. */
+		enum CDC_DescriptorSubtypes_t
+		{
+			CDC_DSUBTYPE_CSInterface_Header           = 0x00, /**< CDC class-specific Header functional descriptor. */
+			CDC_DSUBTYPE_CSInterface_CallManagement   = 0x01, /**< CDC class-specific Call Management functional descriptor. */
+			CDC_DSUBTYPE_CSInterface_ACM              = 0x02, /**< CDC class-specific Abstract Control Model functional descriptor. */
+			CDC_DSUBTYPE_CSInterface_DirectLine       = 0x03, /**< CDC class-specific Direct Line functional descriptor. */
+			CDC_DSUBTYPE_CSInterface_TelephoneRinger  = 0x04, /**< CDC class-specific Telephone Ringer functional descriptor. */
+			CDC_DSUBTYPE_CSInterface_TelephoneCall    = 0x05, /**< CDC class-specific Telephone Call functional descriptor. */
+			CDC_DSUBTYPE_CSInterface_Union            = 0x06, /**< CDC class-specific Union functional descriptor. */
+			CDC_DSUBTYPE_CSInterface_CountrySelection = 0x07, /**< CDC class-specific Country Selection functional descriptor. */
+			CDC_DSUBTYPE_CSInterface_TelephoneOpModes = 0x08, /**< CDC class-specific Telephone Operation Modes functional descriptor. */
+			CDC_DSUBTYPE_CSInterface_USBTerminal      = 0x09, /**< CDC class-specific USB Terminal functional descriptor. */
+			CDC_DSUBTYPE_CSInterface_NetworkChannel   = 0x0A, /**< CDC class-specific Network Channel functional descriptor. */
+			CDC_DSUBTYPE_CSInterface_ProtocolUnit     = 0x0B, /**< CDC class-specific Protocol Unit functional descriptor. */
+			CDC_DSUBTYPE_CSInterface_ExtensionUnit    = 0x0C, /**< CDC class-specific Extension Unit functional descriptor. */
+			CDC_DSUBTYPE_CSInterface_MultiChannel     = 0x0D, /**< CDC class-specific Multi-Channel Management functional descriptor. */
+			CDC_DSUBTYPE_CSInterface_CAPI             = 0x0E, /**< CDC class-specific Common ISDN API functional descriptor. */
+			CDC_DSUBTYPE_CSInterface_Ethernet         = 0x0F, /**< CDC class-specific Ethernet functional descriptor. */
+			CDC_DSUBTYPE_CSInterface_ATM              = 0x10, /**< CDC class-specific Asynchronous Transfer Mode functional descriptor. */
+		};
+
+		/** Enum for the possible line encoding formats of a virtual serial port. */
+		enum CDC_LineEncodingFormats_t
+		{
+			CDC_LINEENCODING_OneStopBit          = 0, /**< Each frame contains one stop bit. */
+			CDC_LINEENCODING_OneAndAHalfStopBits = 1, /**< Each frame contains one and a half stop bits. */
+			CDC_LINEENCODING_TwoStopBits         = 2, /**< Each frame contains two stop bits. */
+		};
+
+		/** Enum for the possible line encoding parity settings of a virtual serial port. */
+		enum CDC_LineEncodingParity_t
+		{
+			CDC_PARITY_None  = 0, /**< No parity bit mode on each frame. */
+			CDC_PARITY_Odd   = 1, /**< Odd parity bit mode on each frame. */
+			CDC_PARITY_Even  = 2, /**< Even parity bit mode on each frame. */
+			CDC_PARITY_Mark  = 3, /**< Mark parity bit mode on each frame. */
+			CDC_PARITY_Space = 4, /**< Space parity bit mode on each frame. */
+		};
+
+	/* Type Defines: */
+		/** \brief CDC class-specific Functional Header Descriptor (LUFA naming conventions).
+		 *
+		 *  Type define for a CDC class-specific functional header descriptor. This indicates to the host that the device
+		 *  contains one or more CDC functional data descriptors, which give the CDC interface's capabilities and configuration.
+		 *  See the CDC class specification for more details.
+		 *
+		 *  \see \ref USB_CDC_StdDescriptor_FunctionalHeader_t for the version of this type with standard element names.
+		 *
+		 *  \note Regardless of CPU architecture, these values should be stored as little endian.
+		 */
+		typedef struct
+		{
+			USB_Descriptor_Header_t Header; /**< Regular descriptor header containing the descriptor's type and length. */
+			uint8_t                 Subtype; /**< Sub type value used to distinguish between CDC class-specific descriptors,
+			                                  *   must be \ref CDC_DSUBTYPE_CSInterface_Header.
+			                                  */
+			uint16_t                CDCSpecification; /**< Version number of the CDC specification implemented by the device,
+			                                           *   encoded in BCD format.
+			                                           *
+			                                           *   \see \ref VERSION_BCD() utility macro.
+			                                           */
+		} ATTR_PACKED USB_CDC_Descriptor_FunctionalHeader_t;
+
+		/** \brief CDC class-specific Functional Header Descriptor (USB-IF naming conventions).
+		 *
+		 *  Type define for a CDC class-specific functional header descriptor. This indicates to the host that the device
+		 *  contains one or more CDC functional data descriptors, which give the CDC interface's capabilities and configuration.
+		 *  See the CDC class specification for more details.
+		 *
+		 *  \see \ref USB_CDC_Descriptor_FunctionalHeader_t for the version of this type with non-standard LUFA specific
+		 *       element names.
+		 *
+		 *  \note Regardless of CPU architecture, these values should be stored as little endian.
+		 */
+		typedef struct
+		{
+			uint8_t  bFunctionLength; /**< Size of the descriptor, in bytes. */
+			uint8_t  bDescriptorType; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a value
+			                           *   given by the specific class.
+			                           */
+			uint8_t  bDescriptorSubType; /**< Sub type value used to distinguish between CDC class-specific descriptors,
+			                              *   must be \ref CDC_DSUBTYPE_CSInterface_Header.
+			                              */
+			uint16_t bcdCDC; /**< Version number of the CDC specification implemented by the device, encoded in BCD format.
+			                  *
+			                  *   \see \ref VERSION_BCD() utility macro.
+			                  */
+		} ATTR_PACKED USB_CDC_StdDescriptor_FunctionalHeader_t;
+
+		/** \brief CDC class-specific Functional ACM Descriptor (LUFA naming conventions).
+		 *
+		 *  Type define for a CDC class-specific functional ACM descriptor. This indicates to the host that the CDC interface
+		 *  supports the CDC ACM subclass of the CDC specification. See the CDC class specification for more details.
+		 *
+		 *  \see \ref USB_CDC_StdDescriptor_FunctionalACM_t for the version of this type with standard element names.
+		 *
+		 *  \note Regardless of CPU architecture, these values should be stored as little endian.
+		 */
+		typedef struct
+		{
+			USB_Descriptor_Header_t Header; /**< Regular descriptor header containing the descriptor's type and length. */
+			uint8_t                 Subtype; /**< Sub type value used to distinguish between CDC class-specific descriptors,
+			                                  *   must be \ref CDC_DSUBTYPE_CSInterface_ACM.
+			                                  */
+			uint8_t                 Capabilities; /**< Capabilities of the ACM interface, given as a bit mask. For most devices,
+			                                       *   this should be set to a fixed value of \c 0x06 - for other capabilities, refer
+			                                       *   to the CDC ACM specification.
+			                                       */
+		} ATTR_PACKED USB_CDC_Descriptor_FunctionalACM_t;
+
+		/** \brief CDC class-specific Functional ACM Descriptor (USB-IF naming conventions).
+		 *
+		 *  Type define for a CDC class-specific functional ACM descriptor. This indicates to the host that the CDC interface
+		 *  supports the CDC ACM subclass of the CDC specification. See the CDC class specification for more details.
+		 *
+		 *  \see \ref USB_CDC_Descriptor_FunctionalACM_t for the version of this type with non-standard LUFA specific
+		 *       element names.
+		 *
+		 *  \note Regardless of CPU architecture, these values should be stored as little endian.
+		 */
+		typedef struct
+		{
+			uint8_t bFunctionLength; /**< Size of the descriptor, in bytes. */
+			uint8_t bDescriptorType; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a value
+			                          *   given by the specific class.
+			                          */
+			uint8_t bDescriptorSubType; /**< Sub type value used to distinguish between CDC class-specific descriptors,
+			                             *   must be \ref CDC_DSUBTYPE_CSInterface_ACM.
+			                             */
+			uint8_t bmCapabilities; /**< Capabilities of the ACM interface, given as a bit mask. For most devices,
+			                         *   this should be set to a fixed value of 0x06 - for other capabilities, refer
+			                         *   to the CDC ACM specification.
+			                         */
+		} ATTR_PACKED USB_CDC_StdDescriptor_FunctionalACM_t;
+
+		/** \brief CDC class-specific Functional Union Descriptor (LUFA naming conventions).
+		 *
+		 *  Type define for a CDC class-specific functional Union descriptor. This indicates to the host that specific
+		 *  CDC control and data interfaces are related. See the CDC class specification for more details.
+		 *
+		 *  \see \ref USB_CDC_StdDescriptor_FunctionalUnion_t for the version of this type with standard element names.
+		 *
+		 *  \note Regardless of CPU architecture, these values should be stored as little endian.
+		 */
+		typedef struct
+		{
+			USB_Descriptor_Header_t Header; /**< Regular descriptor header containing the descriptor's type and length. */
+			uint8_t                 Subtype; /**< Sub type value used to distinguish between CDC class-specific descriptors,
+			                                  *   must be \ref CDC_DSUBTYPE_CSInterface_Union.
+			                                  */
+			uint8_t                 MasterInterfaceNumber; /**< Interface number of the CDC Control interface. */
+			uint8_t                 SlaveInterfaceNumber; /**< Interface number of the CDC Data interface. */
+		} ATTR_PACKED USB_CDC_Descriptor_FunctionalUnion_t;
+
+		/** \brief CDC class-specific Functional Union Descriptor (USB-IF naming conventions).
+		 *
+		 *  Type define for a CDC class-specific functional Union descriptor. This indicates to the host that specific
+		 *  CDC control and data interfaces are related. See the CDC class specification for more details.
+		 *
+		 *  \see \ref USB_CDC_Descriptor_FunctionalUnion_t for the version of this type with non-standard LUFA specific
+		 *       element names.
+		 *
+		 *  \note Regardless of CPU architecture, these values should be stored as little endian.
+		 */
+		typedef struct
+		{
+			uint8_t bFunctionLength; /**< Size of the descriptor, in bytes. */
+			uint8_t bDescriptorType; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a value
+			                          *   given by the specific class.
+			                          */
+			uint8_t bDescriptorSubType; /**< Sub type value used to distinguish between CDC class-specific descriptors,
+			                             *   must be \ref CDC_DSUBTYPE_CSInterface_Union.
+			                             */
+			uint8_t bMasterInterface; /**< Interface number of the CDC Control interface. */
+			uint8_t bSlaveInterface0; /**< Interface number of the CDC Data interface. */
+		} ATTR_PACKED USB_CDC_StdDescriptor_FunctionalUnion_t;
+
+		/** \brief CDC Virtual Serial Port Line Encoding Settings Structure.
+		 *
+		 *  Type define for a CDC Line Encoding structure, used to hold the various encoding parameters for a virtual
+		 *  serial port.
+		 *
+		 *  \note Regardless of CPU architecture, these values should be stored as little endian.
+		 */
+		typedef struct
+		{
+			uint32_t BaudRateBPS; /**< Baud rate of the virtual serial port, in bits per second. */
+			uint8_t  CharFormat; /**< Character format of the virtual serial port, a value from the
+								  *   \ref CDC_LineEncodingFormats_t enum.
+								  */
+			uint8_t  ParityType; /**< Parity setting of the virtual serial port, a value from the
+								  *   \ref CDC_LineEncodingParity_t enum.
+								  */
+			uint8_t  DataBits; /**< Bits of data per character of the virtual serial port. */
+		} ATTR_PACKED CDC_LineEncoding_t;
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Common/HIDClassCommon.h b/lib/lufa/LUFA/Drivers/USB/Class/Common/HIDClassCommon.h
new file mode 100644
index 0000000000..6e700a9b1e
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Class/Common/HIDClassCommon.h
@@ -0,0 +1,681 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Common definitions and declarations for the library USB HID Class driver.
+ *
+ *  Common definitions and declarations for the library USB HID Class driver.
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the USB module driver
+ *        dispatch header located in LUFA/Drivers/USB.h.
+ */
+
+/** \ingroup Group_USBClassHID
+ *  \defgroup Group_USBClassHIDCommon  Common Class Definitions
+ *
+ *  \section Sec_USBClassHIDCommon_ModDescription Module Description
+ *  Constants, Types and Enum definitions that are common to both Device and Host modes for the USB
+ *  HID Class.
+ *
+ *  @{
+ */
+
+#ifndef _HID_CLASS_COMMON_H_
+#define _HID_CLASS_COMMON_H_
+
+	/* Includes: */
+		#include "../../Core/StdDescriptors.h"
+		#include "HIDParser.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_HID_DRIVER)
+			#error Do not include this file directly. Include LUFA/Drivers/USB.h instead.
+		#endif
+
+	/* Macros: */
+		/** \name Keyboard Standard Report Modifier Masks */
+		//@{
+		/** Constant for a keyboard report modifier byte, indicating that the keyboard's left control key is currently pressed. */
+		#define HID_KEYBOARD_MODIFIER_LEFTCTRL                    (1 << 0)
+
+		/** Constant for a keyboard report modifier byte, indicating that the keyboard's left shift key is currently pressed. */
+		#define HID_KEYBOARD_MODIFIER_LEFTSHIFT                   (1 << 1)
+
+		/** Constant for a keyboard report modifier byte, indicating that the keyboard's left alt key is currently pressed. */
+		#define HID_KEYBOARD_MODIFIER_LEFTALT                     (1 << 2)
+
+		/** Constant for a keyboard report modifier byte, indicating that the keyboard's left GUI key is currently pressed. */
+		#define HID_KEYBOARD_MODIFIER_LEFTGUI                     (1 << 3)
+
+		/** Constant for a keyboard report modifier byte, indicating that the keyboard's right control key is currently pressed. */
+		#define HID_KEYBOARD_MODIFIER_RIGHTCTRL                   (1 << 4)
+
+		/** Constant for a keyboard report modifier byte, indicating that the keyboard's right shift key is currently pressed. */
+		#define HID_KEYBOARD_MODIFIER_RIGHTSHIFT                  (1 << 5)
+
+		/** Constant for a keyboard report modifier byte, indicating that the keyboard's right alt key is currently pressed. */
+		#define HID_KEYBOARD_MODIFIER_RIGHTALT                    (1 << 6)
+
+		/** Constant for a keyboard report modifier byte, indicating that the keyboard's right GUI key is currently pressed. */
+		#define HID_KEYBOARD_MODIFIER_RIGHTGUI                    (1 << 7)
+		//@}
+
+		/** \name Keyboard Standard Report LED Masks */
+		//@{
+		/** Constant for a keyboard output report LED byte, indicating that the host's NUM LOCK mode is currently set. */
+		#define HID_KEYBOARD_LED_NUMLOCK                          (1 << 0)
+
+		/** Constant for a keyboard output report LED byte, indicating that the host's CAPS LOCK mode is currently set. */
+		#define HID_KEYBOARD_LED_CAPSLOCK                         (1 << 1)
+
+		/** Constant for a keyboard output report LED byte, indicating that the host's SCROLL LOCK mode is currently set. */
+		#define HID_KEYBOARD_LED_SCROLLLOCK                       (1 << 2)
+
+		/** Constant for a keyboard output report LED byte, indicating that the host's COMPOSE mode is currently set. */
+		#define HID_KEYBOARD_LED_COMPOSE                          (1 << 3)
+
+		/** Constant for a keyboard output report LED byte, indicating that the host's KANA mode is currently set. */
+		#define HID_KEYBOARD_LED_KANA                             (1 << 4)
+		//@}
+
+		/** \name Keyboard Standard Report Key Scan-codes */
+		//@{
+		#define HID_KEYBOARD_SC_ERROR_ROLLOVER                    0x01
+		#define HID_KEYBOARD_SC_POST_FAIL                         0x02
+		#define HID_KEYBOARD_SC_ERROR_UNDEFINED                   0x03
+		#define HID_KEYBOARD_SC_A                                 0x04
+		#define HID_KEYBOARD_SC_B                                 0x05
+		#define HID_KEYBOARD_SC_C                                 0x06
+		#define HID_KEYBOARD_SC_D                                 0x07
+		#define HID_KEYBOARD_SC_E                                 0x08
+		#define HID_KEYBOARD_SC_F                                 0x09
+		#define HID_KEYBOARD_SC_G                                 0x0A
+		#define HID_KEYBOARD_SC_H                                 0x0B
+		#define HID_KEYBOARD_SC_I                                 0x0C
+		#define HID_KEYBOARD_SC_J                                 0x0D
+		#define HID_KEYBOARD_SC_K                                 0x0E
+		#define HID_KEYBOARD_SC_L                                 0x0F
+		#define HID_KEYBOARD_SC_M                                 0x10
+		#define HID_KEYBOARD_SC_N                                 0x11
+		#define HID_KEYBOARD_SC_O                                 0x12
+		#define HID_KEYBOARD_SC_P                                 0x13
+		#define HID_KEYBOARD_SC_Q                                 0x14
+		#define HID_KEYBOARD_SC_R                                 0x15
+		#define HID_KEYBOARD_SC_S                                 0x16
+		#define HID_KEYBOARD_SC_T                                 0x17
+		#define HID_KEYBOARD_SC_U                                 0x18
+		#define HID_KEYBOARD_SC_V                                 0x19
+		#define HID_KEYBOARD_SC_W                                 0x1A
+		#define HID_KEYBOARD_SC_X                                 0x1B
+		#define HID_KEYBOARD_SC_Y                                 0x1C
+		#define HID_KEYBOARD_SC_Z                                 0x1D
+		#define HID_KEYBOARD_SC_1_AND_EXCLAMATION                 0x1E
+		#define HID_KEYBOARD_SC_2_AND_AT                          0x1F
+		#define HID_KEYBOARD_SC_3_AND_HASHMARK                    0x20
+		#define HID_KEYBOARD_SC_4_AND_DOLLAR                      0x21
+		#define HID_KEYBOARD_SC_5_AND_PERCENTAGE                  0x22
+		#define HID_KEYBOARD_SC_6_AND_CARET                       0x23
+		#define HID_KEYBOARD_SC_7_AND_AMPERSAND                   0x24
+		#define HID_KEYBOARD_SC_8_AND_ASTERISK                    0x25
+		#define HID_KEYBOARD_SC_9_AND_OPENING_PARENTHESIS         0x26
+		#define HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS         0x27
+		#define HID_KEYBOARD_SC_ENTER                             0x28
+		#define HID_KEYBOARD_SC_ESCAPE                            0x29
+		#define HID_KEYBOARD_SC_BACKSPACE                         0x2A
+		#define HID_KEYBOARD_SC_TAB                               0x2B
+		#define HID_KEYBOARD_SC_SPACE                             0x2C
+		#define HID_KEYBOARD_SC_MINUS_AND_UNDERSCORE              0x2D
+		#define HID_KEYBOARD_SC_EQUAL_AND_PLUS                    0x2E
+		#define HID_KEYBOARD_SC_OPENING_BRACKET_AND_OPENING_BRACE 0x2F
+		#define HID_KEYBOARD_SC_CLOSING_BRACKET_AND_CLOSING_BRACE 0x30
+		#define HID_KEYBOARD_SC_BACKSLASH_AND_PIPE                0x31
+		#define HID_KEYBOARD_SC_NON_US_HASHMARK_AND_TILDE         0x32
+		#define HID_KEYBOARD_SC_SEMICOLON_AND_COLON               0x33
+		#define HID_KEYBOARD_SC_APOSTROPHE_AND_QUOTE              0x34
+		#define HID_KEYBOARD_SC_GRAVE_ACCENT_AND_TILDE            0x35
+		#define HID_KEYBOARD_SC_COMMA_AND_LESS_THAN_SIGN          0x36
+		#define HID_KEYBOARD_SC_DOT_AND_GREATER_THAN_SIGN         0x37
+		#define HID_KEYBOARD_SC_SLASH_AND_QUESTION_MARK           0x38
+		#define HID_KEYBOARD_SC_CAPS_LOCK                         0x39
+		#define HID_KEYBOARD_SC_F1                                0x3A
+		#define HID_KEYBOARD_SC_F2                                0x3B
+		#define HID_KEYBOARD_SC_F3                                0x3C
+		#define HID_KEYBOARD_SC_F4                                0x3D
+		#define HID_KEYBOARD_SC_F5                                0x3E
+		#define HID_KEYBOARD_SC_F6                                0x3F
+		#define HID_KEYBOARD_SC_F7                                0x40
+		#define HID_KEYBOARD_SC_F8                                0x41
+		#define HID_KEYBOARD_SC_F9                                0x42
+		#define HID_KEYBOARD_SC_F10                               0x43
+		#define HID_KEYBOARD_SC_F11                               0x44
+		#define HID_KEYBOARD_SC_F12                               0x45
+		#define HID_KEYBOARD_SC_PRINT_SCREEN                      0x46
+		#define HID_KEYBOARD_SC_SCROLL_LOCK                       0x47
+		#define HID_KEYBOARD_SC_PAUSE                             0x48
+		#define HID_KEYBOARD_SC_INSERT                            0x49
+		#define HID_KEYBOARD_SC_HOME                              0x4A
+		#define HID_KEYBOARD_SC_PAGE_UP                           0x4B
+		#define HID_KEYBOARD_SC_DELETE                            0x4C
+		#define HID_KEYBOARD_SC_END                               0x4D
+		#define HID_KEYBOARD_SC_PAGE_DOWN                         0x4E
+		#define HID_KEYBOARD_SC_RIGHT_ARROW                       0x4F
+		#define HID_KEYBOARD_SC_LEFT_ARROW                        0x50
+		#define HID_KEYBOARD_SC_DOWN_ARROW                        0x51
+		#define HID_KEYBOARD_SC_UP_ARROW                          0x52
+		#define HID_KEYBOARD_SC_NUM_LOCK                          0x53
+		#define HID_KEYBOARD_SC_KEYPAD_SLASH                      0x54
+		#define HID_KEYBOARD_SC_KEYPAD_ASTERISK                   0x55
+		#define HID_KEYBOARD_SC_KEYPAD_MINUS                      0x56
+		#define HID_KEYBOARD_SC_KEYPAD_PLUS                       0x57
+		#define HID_KEYBOARD_SC_KEYPAD_ENTER                      0x58
+		#define HID_KEYBOARD_SC_KEYPAD_1_AND_END                  0x59
+		#define HID_KEYBOARD_SC_KEYPAD_2_AND_DOWN_ARROW           0x5A
+		#define HID_KEYBOARD_SC_KEYPAD_3_AND_PAGE_DOWN            0x5B
+		#define HID_KEYBOARD_SC_KEYPAD_4_AND_LEFT_ARROW           0x5C
+		#define HID_KEYBOARD_SC_KEYPAD_5                          0x5D
+		#define HID_KEYBOARD_SC_KEYPAD_6_AND_RIGHT_ARROW          0x5E
+		#define HID_KEYBOARD_SC_KEYPAD_7_AND_HOME                 0x5F
+		#define HID_KEYBOARD_SC_KEYPAD_8_AND_UP_ARROW             0x60
+		#define HID_KEYBOARD_SC_KEYPAD_9_AND_PAGE_UP              0x61
+		#define HID_KEYBOARD_SC_KEYPAD_0_AND_INSERT               0x62
+		#define HID_KEYBOARD_SC_KEYPAD_DOT_AND_DELETE             0x63
+		#define HID_KEYBOARD_SC_NON_US_BACKSLASH_AND_PIPE         0x64
+		#define HID_KEYBOARD_SC_APPLICATION                       0x65
+		#define HID_KEYBOARD_SC_POWER                             0x66
+		#define HID_KEYBOARD_SC_KEYPAD_EQUAL_SIGN                 0x67
+		#define HID_KEYBOARD_SC_F13                               0x68
+		#define HID_KEYBOARD_SC_F14                               0x69
+		#define HID_KEYBOARD_SC_F15                               0x6A
+		#define HID_KEYBOARD_SC_F16                               0x6B
+		#define HID_KEYBOARD_SC_F17                               0x6C
+		#define HID_KEYBOARD_SC_F18                               0x6D
+		#define HID_KEYBOARD_SC_F19                               0x6E
+		#define HID_KEYBOARD_SC_F20                               0x6F
+		#define HID_KEYBOARD_SC_F21                               0x70
+		#define HID_KEYBOARD_SC_F22                               0x71
+		#define HID_KEYBOARD_SC_F23                               0x72
+		#define HID_KEYBOARD_SC_F24                               0x73
+		#define HID_KEYBOARD_SC_EXECUTE                           0x74
+		#define HID_KEYBOARD_SC_HELP                              0x75
+		#define HID_KEYBOARD_SC_MENU                              0x76
+		#define HID_KEYBOARD_SC_SELECT                            0x77
+		#define HID_KEYBOARD_SC_STOP                              0x78
+		#define HID_KEYBOARD_SC_AGAIN                             0x79
+		#define HID_KEYBOARD_SC_UNDO                              0x7A
+		#define HID_KEYBOARD_SC_CUT                               0x7B
+		#define HID_KEYBOARD_SC_COPY                              0x7C
+		#define HID_KEYBOARD_SC_PASTE                             0x7D
+		#define HID_KEYBOARD_SC_FIND                              0x7E
+		#define HID_KEYBOARD_SC_MUTE                              0x7F
+		#define HID_KEYBOARD_SC_VOLUME_UP                         0x80
+		#define HID_KEYBOARD_SC_VOLUME_DOWN                       0x81
+		#define HID_KEYBOARD_SC_LOCKING_CAPS_LOCK                 0x82
+		#define HID_KEYBOARD_SC_LOCKING_NUM_LOCK                  0x83
+		#define HID_KEYBOARD_SC_LOCKING_SCROLL_LOCK               0x84
+		#define HID_KEYBOARD_SC_KEYPAD_COMMA                      0x85
+		#define HID_KEYBOARD_SC_KEYPAD_EQUAL_SIGN_AS400           0x86
+		#define HID_KEYBOARD_SC_INTERNATIONAL1                    0x87
+		#define HID_KEYBOARD_SC_INTERNATIONAL2                    0x88
+		#define HID_KEYBOARD_SC_INTERNATIONAL3                    0x89
+		#define HID_KEYBOARD_SC_INTERNATIONAL4                    0x8A
+		#define HID_KEYBOARD_SC_INTERNATIONAL5                    0x8B
+		#define HID_KEYBOARD_SC_INTERNATIONAL6                    0x8C
+		#define HID_KEYBOARD_SC_INTERNATIONAL7                    0x8D
+		#define HID_KEYBOARD_SC_INTERNATIONAL8                    0x8E
+		#define HID_KEYBOARD_SC_INTERNATIONAL9                    0x8F
+		#define HID_KEYBOARD_SC_LANG1                             0x90
+		#define HID_KEYBOARD_SC_LANG2                             0x91
+		#define HID_KEYBOARD_SC_LANG3                             0x92
+		#define HID_KEYBOARD_SC_LANG4                             0x93
+		#define HID_KEYBOARD_SC_LANG5                             0x94
+		#define HID_KEYBOARD_SC_LANG6                             0x95
+		#define HID_KEYBOARD_SC_LANG7                             0x96
+		#define HID_KEYBOARD_SC_LANG8                             0x97
+		#define HID_KEYBOARD_SC_LANG9                             0x98
+		#define HID_KEYBOARD_SC_ALTERNATE_ERASE                   0x99
+		#define HID_KEYBOARD_SC_SYSREQ                            0x9A
+		#define HID_KEYBOARD_SC_CANCEL                            0x9B
+		#define HID_KEYBOARD_SC_CLEAR                             0x9C
+		#define HID_KEYBOARD_SC_PRIOR                             0x9D
+		#define HID_KEYBOARD_SC_RETURN                            0x9E
+		#define HID_KEYBOARD_SC_SEPARATOR                         0x9F
+		#define HID_KEYBOARD_SC_OUT                               0xA0
+		#define HID_KEYBOARD_SC_OPER                              0xA1
+		#define HID_KEYBOARD_SC_CLEAR_AND_AGAIN                   0xA2
+		#define HID_KEYBOARD_SC_CRSEL_AND_PROPS                   0xA3
+		#define HID_KEYBOARD_SC_EXSEL                             0xA4
+		#define HID_KEYBOARD_SC_KEYPAD_00                         0xB0
+		#define HID_KEYBOARD_SC_KEYPAD_000                        0xB1
+		#define HID_KEYBOARD_SC_THOUSANDS_SEPARATOR               0xB2
+		#define HID_KEYBOARD_SC_DECIMAL_SEPARATOR                 0xB3
+		#define HID_KEYBOARD_SC_CURRENCY_UNIT                     0xB4
+		#define HID_KEYBOARD_SC_CURRENCY_SUB_UNIT                 0xB5
+		#define HID_KEYBOARD_SC_KEYPAD_OPENING_PARENTHESIS        0xB6
+		#define HID_KEYBOARD_SC_KEYPAD_CLOSING_PARENTHESIS        0xB7
+		#define HID_KEYBOARD_SC_KEYPAD_OPENING_BRACE              0xB8
+		#define HID_KEYBOARD_SC_KEYPAD_CLOSING_BRACE              0xB9
+		#define HID_KEYBOARD_SC_KEYPAD_TAB                        0xBA
+		#define HID_KEYBOARD_SC_KEYPAD_BACKSPACE                  0xBB
+		#define HID_KEYBOARD_SC_KEYPAD_A                          0xBC
+		#define HID_KEYBOARD_SC_KEYPAD_B                          0xBD
+		#define HID_KEYBOARD_SC_KEYPAD_C                          0xBE
+		#define HID_KEYBOARD_SC_KEYPAD_D                          0xBF
+		#define HID_KEYBOARD_SC_KEYPAD_E                          0xC0
+		#define HID_KEYBOARD_SC_KEYPAD_F                          0xC1
+		#define HID_KEYBOARD_SC_KEYPAD_XOR                        0xC2
+		#define HID_KEYBOARD_SC_KEYPAD_CARET                      0xC3
+		#define HID_KEYBOARD_SC_KEYPAD_PERCENTAGE                 0xC4
+		#define HID_KEYBOARD_SC_KEYPAD_LESS_THAN_SIGN             0xC5
+		#define HID_KEYBOARD_SC_KEYPAD_GREATER_THAN_SIGN          0xC6
+		#define HID_KEYBOARD_SC_KEYPAD_AMP                        0xC7
+		#define HID_KEYBOARD_SC_KEYPAD_AMP_AMP                    0xC8
+		#define HID_KEYBOARD_SC_KEYPAD_PIPE                       0xC9
+		#define HID_KEYBOARD_SC_KEYPAD_PIPE_PIPE                  0xCA
+		#define HID_KEYBOARD_SC_KEYPAD_COLON                      0xCB
+		#define HID_KEYBOARD_SC_KEYPAD_HASHMARK                   0xCC
+		#define HID_KEYBOARD_SC_KEYPAD_SPACE                      0xCD
+		#define HID_KEYBOARD_SC_KEYPAD_AT                         0xCE
+		#define HID_KEYBOARD_SC_KEYPAD_EXCLAMATION_SIGN           0xCF
+		#define HID_KEYBOARD_SC_KEYPAD_MEMORY_STORE               0xD0
+		#define HID_KEYBOARD_SC_KEYPAD_MEMORY_RECALL              0xD1
+		#define HID_KEYBOARD_SC_KEYPAD_MEMORY_CLEAR               0xD2
+		#define HID_KEYBOARD_SC_KEYPAD_MEMORY_ADD                 0xD3
+		#define HID_KEYBOARD_SC_KEYPAD_MEMORY_SUBTRACT            0xD4
+		#define HID_KEYBOARD_SC_KEYPAD_MEMORY_MULTIPLY            0xD5
+		#define HID_KEYBOARD_SC_KEYPAD_MEMORY_DIVIDE              0xD6
+		#define HID_KEYBOARD_SC_KEYPAD_PLUS_AND_MINUS             0xD7
+		#define HID_KEYBOARD_SC_KEYPAD_CLEAR                      0xD8
+		#define HID_KEYBOARD_SC_KEYPAD_CLEAR_ENTRY                0xD9
+		#define HID_KEYBOARD_SC_KEYPAD_BINARY                     0xDA
+		#define HID_KEYBOARD_SC_KEYPAD_OCTAL                      0xDB
+		#define HID_KEYBOARD_SC_KEYPAD_DECIMAL                    0xDC
+		#define HID_KEYBOARD_SC_KEYPAD_HEXADECIMAL                0xDD
+		#define HID_KEYBOARD_SC_LEFT_CONTROL                      0xE0
+		#define HID_KEYBOARD_SC_LEFT_SHIFT                        0xE1
+		#define HID_KEYBOARD_SC_LEFT_ALT                          0xE2
+		#define HID_KEYBOARD_SC_LEFT_GUI                          0xE3
+		#define HID_KEYBOARD_SC_RIGHT_CONTROL                     0xE4
+		#define HID_KEYBOARD_SC_RIGHT_SHIFT                       0xE5
+		#define HID_KEYBOARD_SC_RIGHT_ALT                         0xE6
+		#define HID_KEYBOARD_SC_RIGHT_GUI                         0xE7
+		#define HID_KEYBOARD_SC_MEDIA_PLAY                        0xE8
+		#define HID_KEYBOARD_SC_MEDIA_STOP                        0xE9
+		#define HID_KEYBOARD_SC_MEDIA_PREVIOUS_TRACK              0xEA
+		#define HID_KEYBOARD_SC_MEDIA_NEXT_TRACK                  0xEB
+		#define HID_KEYBOARD_SC_MEDIA_EJECT                       0xEC
+		#define HID_KEYBOARD_SC_MEDIA_VOLUME_UP                   0xED
+		#define HID_KEYBOARD_SC_MEDIA_VOLUME_DOWN                 0xEE
+		#define HID_KEYBOARD_SC_MEDIA_MUTE                        0xEF
+		#define HID_KEYBOARD_SC_MEDIA_WWW                         0xF0
+		#define HID_KEYBOARD_SC_MEDIA_BACKWARD                    0xF1
+		#define HID_KEYBOARD_SC_MEDIA_FORWARD                     0xF2
+		#define HID_KEYBOARD_SC_MEDIA_CANCEL                      0xF3
+		#define HID_KEYBOARD_SC_MEDIA_SEARCH                      0xF4
+		#define HID_KEYBOARD_SC_MEDIA_SLEEP                       0xF8
+		#define HID_KEYBOARD_SC_MEDIA_LOCK                        0xF9
+		#define HID_KEYBOARD_SC_MEDIA_RELOAD                      0xFA
+		#define HID_KEYBOARD_SC_MEDIA_CALCULATOR                  0xFB
+		//@}
+
+		/** \name Common HID Device Report Descriptors */
+		//@{
+		/** \hideinitializer
+		 *  A list of HID report item array elements that describe a typical HID USB Joystick. The resulting report
+		 *  descriptor is structured according to the following layout:
+		 *
+		 *  \code
+		 *  struct
+		 *  {
+		 *      intA_t X; // Signed X axis value
+		 *      intA_t Y; // Signed Y axis value
+		 *      intA_t Z; // Signed Z axis value
+		 *      uintB_t Buttons; // Pressed buttons bitmask
+		 *  } Joystick_Report;
+		 *  \endcode
+		 *
+		 *  Where \c uintA_t is a type large enough to hold the ranges of the signed \c MinAxisVal and \c MaxAxisVal values,
+		 *  and \c intB_t is a type large enough to hold one bit per button.
+		 *
+		 *  \param[in] MinAxisVal      Minimum logical axis value (16-bit).
+		 *  \param[in] MaxAxisVal      Maximum logical axis value (16-bit).
+		 *  \param[in] MinPhysicalVal  Minimum physical axis value, for movement resolution calculations (16-bit).
+		 *  \param[in] MaxPhysicalVal  Maximum physical axis value, for movement resolution calculations (16-bit).
+		 *  \param[in] Buttons         Total number of buttons in the device (8-bit).
+		 */
+		#define HID_DESCRIPTOR_JOYSTICK(MinAxisVal, MaxAxisVal, MinPhysicalVal, MaxPhysicalVal, Buttons) \
+			HID_RI_USAGE_PAGE(8, 0x01),                     \
+			HID_RI_USAGE(8, 0x04),                          \
+			HID_RI_COLLECTION(8, 0x01),                     \
+				HID_RI_USAGE(8, 0x01),                      \
+				HID_RI_COLLECTION(8, 0x00),                 \
+					HID_RI_USAGE(8, 0x30),                  \
+					HID_RI_USAGE(8, 0x31),                  \
+					HID_RI_USAGE(8, 0x32),                  \
+					HID_RI_LOGICAL_MINIMUM(16, MinAxisVal), \
+					HID_RI_LOGICAL_MAXIMUM(16, MaxAxisVal), \
+					HID_RI_PHYSICAL_MINIMUM(16, MinPhysicalVal), \
+					HID_RI_PHYSICAL_MAXIMUM(16, MaxPhysicalVal), \
+					HID_RI_REPORT_COUNT(8, 3),              \
+					HID_RI_REPORT_SIZE(8, (((MinAxisVal >= -128) && (MaxAxisVal <= 127)) ? 8 : 16)), \
+					HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), \
+				HID_RI_END_COLLECTION(0),                   \
+				HID_RI_USAGE_PAGE(8, 0x09),                 \
+				HID_RI_USAGE_MINIMUM(8, 0x01),              \
+				HID_RI_USAGE_MAXIMUM(8, Buttons),           \
+				HID_RI_LOGICAL_MINIMUM(8, 0x00),            \
+				HID_RI_LOGICAL_MAXIMUM(8, 0x01),            \
+				HID_RI_REPORT_SIZE(8, 0x01),                \
+				HID_RI_REPORT_COUNT(8, Buttons),            \
+				HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), \
+				HID_RI_REPORT_SIZE(8, (Buttons % 8) ? (8 - (Buttons % 8)) : 0), \
+				HID_RI_REPORT_COUNT(8, 0x01),               \
+				HID_RI_INPUT(8, HID_IOF_CONSTANT),          \
+			HID_RI_END_COLLECTION(0)
+
+		/** \hideinitializer
+		 *  A list of HID report item array elements that describe a typical HID USB keyboard. The resulting report descriptor
+		 *  is compatible with \ref USB_KeyboardReport_Data_t when \c MaxKeys is equal to 6. For other values, the report will
+		 *  be structured according to the following layout:
+		 *
+		 *  \code
+		 *  struct
+		 *  {
+		 *      uint8_t Modifier; // Keyboard modifier byte indicating pressed modifier keys (\c HID_KEYBOARD_MODIFER_* masks)
+		 *      uint8_t Reserved; // Reserved for OEM use, always set to 0.
+		 *      uint8_t KeyCode[MaxKeys]; // Length determined by the number of keys that can be reported
+		 *  } Keyboard_Report;
+		 *  \endcode
+		 *
+		 *  \param[in] MaxKeys  Number of simultaneous keys that can be reported at the one time (8-bit).
+		 */
+		#define HID_DESCRIPTOR_KEYBOARD(MaxKeys)            \
+			HID_RI_USAGE_PAGE(8, 0x01),                     \
+			HID_RI_USAGE(8, 0x06),                          \
+			HID_RI_COLLECTION(8, 0x01),                     \
+				HID_RI_USAGE_PAGE(8, 0x07),                 \
+				HID_RI_USAGE_MINIMUM(8, 0xE0),              \
+				HID_RI_USAGE_MAXIMUM(8, 0xE7),              \
+				HID_RI_LOGICAL_MINIMUM(8, 0x00),            \
+				HID_RI_LOGICAL_MAXIMUM(8, 0x01),            \
+				HID_RI_REPORT_SIZE(8, 0x01),                \
+				HID_RI_REPORT_COUNT(8, 0x08),               \
+				HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), \
+				HID_RI_REPORT_COUNT(8, 0x01),               \
+				HID_RI_REPORT_SIZE(8, 0x08),                \
+				HID_RI_INPUT(8, HID_IOF_CONSTANT),          \
+				HID_RI_USAGE_PAGE(8, 0x08),                 \
+				HID_RI_USAGE_MINIMUM(8, 0x01),              \
+				HID_RI_USAGE_MAXIMUM(8, 0x05),              \
+				HID_RI_REPORT_COUNT(8, 0x05),               \
+				HID_RI_REPORT_SIZE(8, 0x01),                \
+				HID_RI_OUTPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE), \
+				HID_RI_REPORT_COUNT(8, 0x01),               \
+				HID_RI_REPORT_SIZE(8, 0x03),                \
+				HID_RI_OUTPUT(8, HID_IOF_CONSTANT),         \
+				HID_RI_LOGICAL_MINIMUM(8, 0x00),            \
+				HID_RI_LOGICAL_MAXIMUM(16, 0xFF),           \
+				HID_RI_USAGE_PAGE(8, 0x07),                 \
+				HID_RI_USAGE_MINIMUM(8, 0x00),              \
+				HID_RI_USAGE_MAXIMUM(8, 0xFF),              \
+				HID_RI_REPORT_COUNT(8, MaxKeys),            \
+				HID_RI_REPORT_SIZE(8, 0x08),                \
+				HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_ARRAY | HID_IOF_ABSOLUTE), \
+			HID_RI_END_COLLECTION(0)
+
+		/** \hideinitializer
+		 *  A list of HID report item array elements that describe a typical HID USB mouse. The resulting report descriptor
+		 *  is compatible with \ref USB_MouseReport_Data_t if the \c MinAxisVal and \c MaxAxisVal values fit within a \c int8_t range
+		 *  and the number of Buttons is less than 8. For other values, the report is structured according to the following layout:
+		 *
+		 *  \code
+		 *  struct
+		 *  {
+		 *      uintA_t Buttons; // Pressed buttons bitmask
+		 *      intB_t X; // X axis value
+		 *      intB_t Y; // Y axis value
+		 *  } Mouse_Report;
+		 *  \endcode
+		 *
+		 *  Where \c intA_t is a type large enough to hold one bit per button, and \c intB_t is a type large enough to hold the
+		 *  ranges of the signed \c MinAxisVal and \c MaxAxisVal values.
+		 *
+		 *  \param[in] MinAxisVal      Minimum X/Y logical axis value (16-bit).
+		 *  \param[in] MaxAxisVal      Maximum X/Y logical axis value (16-bit).
+		 *  \param[in] MinPhysicalVal  Minimum X/Y physical axis value, for movement resolution calculations (16-bit).
+		 *  \param[in] MaxPhysicalVal  Maximum X/Y physical axis value, for movement resolution calculations (16-bit).
+		 *  \param[in] Buttons         Total number of buttons in the device (8-bit).
+		 *  \param[in] AbsoluteCoords  Boolean \c true to use absolute X/Y coordinates (e.g. touchscreen).
+		 */
+		#define HID_DESCRIPTOR_MOUSE(MinAxisVal, MaxAxisVal, MinPhysicalVal, MaxPhysicalVal, Buttons, AbsoluteCoords) \
+			HID_RI_USAGE_PAGE(8, 0x01),                     \
+			HID_RI_USAGE(8, 0x02),                          \
+			HID_RI_COLLECTION(8, 0x01),                     \
+				HID_RI_USAGE(8, 0x01),                      \
+				HID_RI_COLLECTION(8, 0x00),                 \
+					HID_RI_USAGE_PAGE(8, 0x09),             \
+					HID_RI_USAGE_MINIMUM(8, 0x01),          \
+					HID_RI_USAGE_MAXIMUM(8, Buttons),       \
+					HID_RI_LOGICAL_MINIMUM(8, 0x00),        \
+					HID_RI_LOGICAL_MAXIMUM(8, 0x01),        \
+					HID_RI_REPORT_COUNT(8, Buttons),        \
+					HID_RI_REPORT_SIZE(8, 0x01),            \
+					HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), \
+					HID_RI_REPORT_COUNT(8, 0x01),           \
+					HID_RI_REPORT_SIZE(8, (Buttons % 8) ? (8 - (Buttons % 8)) : 0), \
+					HID_RI_INPUT(8, HID_IOF_CONSTANT),      \
+					HID_RI_USAGE_PAGE(8, 0x01),             \
+					HID_RI_USAGE(8, 0x30),                  \
+					HID_RI_USAGE(8, 0x31),                  \
+					HID_RI_LOGICAL_MINIMUM(16, MinAxisVal), \
+					HID_RI_LOGICAL_MAXIMUM(16, MaxAxisVal), \
+					HID_RI_PHYSICAL_MINIMUM(16, MinPhysicalVal), \
+					HID_RI_PHYSICAL_MAXIMUM(16, MaxPhysicalVal), \
+					HID_RI_REPORT_COUNT(8, 0x02),           \
+					HID_RI_REPORT_SIZE(8, (((MinAxisVal >= -128) && (MaxAxisVal <= 127)) ? 8 : 16)), \
+					HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | (AbsoluteCoords ? HID_IOF_ABSOLUTE : HID_IOF_RELATIVE)), \
+				HID_RI_END_COLLECTION(0),                   \
+			HID_RI_END_COLLECTION(0)
+
+		/** \hideinitializer
+		 *  A list of HID report item array elements that describe a typical Vendor Defined byte array HID report descriptor,
+		 *  used for transporting arbitrary data between the USB host and device via HID reports. The resulting report should be
+		 *  a \c uint8_t byte array of the specified length in both Device to Host (IN) and Host to Device (OUT) directions.
+		 *
+		 *  \param[in] VendorPageNum    Vendor Defined HID Usage Page index, ranging from 0x00 to 0xFF.
+		 *  \param[in] CollectionUsage  Vendor Usage for the encompassing report IN and OUT collection, ranging from 0x00 to 0xFF.
+		 *  \param[in] DataINUsage      Vendor Usage for the IN report data, ranging from 0x00 to 0xFF.
+		 *  \param[in] DataOUTUsage     Vendor Usage for the OUT report data, ranging from 0x00 to 0xFF.
+		 *  \param[in] NumBytes         Length of the data IN and OUT reports.
+		 */
+		#define HID_DESCRIPTOR_VENDOR(VendorPageNum, CollectionUsage, DataINUsage, DataOUTUsage, NumBytes) \
+			HID_RI_USAGE_PAGE(16, (0xFF00 | VendorPageNum)), \
+			HID_RI_USAGE(8, CollectionUsage),           \
+			HID_RI_COLLECTION(8, 0x01),                 \
+				HID_RI_USAGE(8, DataINUsage),           \
+				HID_RI_LOGICAL_MINIMUM(8, 0x00),        \
+				HID_RI_LOGICAL_MAXIMUM(8, 0xFF),        \
+				HID_RI_REPORT_SIZE(8, 0x08),            \
+				HID_RI_REPORT_COUNT(8, NumBytes),       \
+				HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), \
+				HID_RI_USAGE(8, DataOUTUsage),          \
+				HID_RI_LOGICAL_MINIMUM(8, 0x00),        \
+				HID_RI_LOGICAL_MAXIMUM(8, 0xFF),        \
+				HID_RI_REPORT_SIZE(8, 0x08),            \
+				HID_RI_REPORT_COUNT(8, NumBytes),       \
+				HID_RI_OUTPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE), \
+			HID_RI_END_COLLECTION(0)
+		//@}
+
+	/* Type Defines: */
+		/** Enum for possible Class, Subclass and Protocol values of device and interface descriptors relating to the HID
+		 *  device class.
+		 */
+		enum HID_Descriptor_ClassSubclassProtocol_t
+		{
+			HID_CSCP_HIDClass             = 0x03, /**< Descriptor Class value indicating that the device or interface
+			                                       *   belongs to the HID class.
+			                                       */
+			HID_CSCP_NonBootSubclass      = 0x00, /**< Descriptor Subclass value indicating that the device or interface
+			                                       *   does not implement a HID boot protocol.
+			                                       */
+			HID_CSCP_BootSubclass         = 0x01, /**< Descriptor Subclass value indicating that the device or interface
+			                                       *   implements a HID boot protocol.
+			                                       */
+			HID_CSCP_NonBootProtocol      = 0x00, /**< Descriptor Protocol value indicating that the device or interface
+			                                       *   does not belong to a HID boot protocol.
+			                                       */
+			HID_CSCP_KeyboardBootProtocol = 0x01, /**< Descriptor Protocol value indicating that the device or interface
+			                                       *   belongs to the Keyboard HID boot protocol.
+			                                       */
+			HID_CSCP_MouseBootProtocol    = 0x02, /**< Descriptor Protocol value indicating that the device or interface
+			                                       *   belongs to the Mouse HID boot protocol.
+			                                       */
+		};
+
+		/** Enum for the HID class specific control requests that can be issued by the USB bus host. */
+		enum HID_ClassRequests_t
+		{
+			HID_REQ_GetReport       = 0x01, /**< HID class-specific Request to get the current HID report from the device. */
+			HID_REQ_GetIdle         = 0x02, /**< HID class-specific Request to get the current device idle count. */
+			HID_REQ_GetProtocol     = 0x03, /**< HID class-specific Request to get the current HID report protocol mode. */
+			HID_REQ_SetReport       = 0x09, /**< HID class-specific Request to set the current HID report to the device. */
+			HID_REQ_SetIdle         = 0x0A, /**< HID class-specific Request to set the device's idle count. */
+			HID_REQ_SetProtocol     = 0x0B, /**< HID class-specific Request to set the current HID report protocol mode. */
+		};
+
+		/** Enum for the HID class specific descriptor types. */
+		enum HID_DescriptorTypes_t
+		{
+			HID_DTYPE_HID           = 0x21, /**< Descriptor header type value, to indicate a HID class HID descriptor. */
+			HID_DTYPE_Report        = 0x22, /**< Descriptor header type value, to indicate a HID class HID report descriptor. */
+		};
+
+		/** Enum for the different types of HID reports. */
+		enum HID_ReportItemTypes_t
+		{
+			HID_REPORT_ITEM_In      = 0, /**< Indicates that the item is an IN report type. */
+			HID_REPORT_ITEM_Out     = 1, /**< Indicates that the item is an OUT report type. */
+			HID_REPORT_ITEM_Feature = 2, /**< Indicates that the item is a FEATURE report type. */
+		};
+
+		/** \brief HID class-specific HID Descriptor (LUFA naming conventions).
+		 *
+		 *  Type define for the HID class-specific HID descriptor, to describe the HID device's specifications. Refer to the HID
+		 *  specification for details on the structure elements.
+		 *
+		 *  \see \ref USB_HID_StdDescriptor_HID_t for the version of this type with standard element names.
+		 *
+		 *  \note Regardless of CPU architecture, these values should be stored as little endian.
+		 */
+		typedef struct
+		{
+			USB_Descriptor_Header_t Header; /**< Regular descriptor header containing the descriptor's type and length. */
+
+			uint16_t                HIDSpec; /**< BCD encoded version that the HID descriptor and device complies to.
+			                                  *
+			                                  *   \see \ref VERSION_BCD() utility macro.
+			                                  */
+			uint8_t                 CountryCode; /**< Country code of the localized device, or zero if universal. */
+
+			uint8_t                 TotalReportDescriptors; /**< Total number of HID report descriptors for the interface. */
+
+			uint8_t                 HIDReportType; /**< Type of HID report, set to \ref HID_DTYPE_Report. */
+			uint16_t                HIDReportLength; /**< Length of the associated HID report descriptor, in bytes. */
+		} ATTR_PACKED USB_HID_Descriptor_HID_t;
+
+		/** \brief HID class-specific HID Descriptor (USB-IF naming conventions).
+		 *
+		 *  Type define for the HID class-specific HID descriptor, to describe the HID device's specifications. Refer to the HID
+		 *  specification for details on the structure elements.
+		 *
+		 *  \see \ref USB_HID_Descriptor_HID_t for the version of this type with non-standard LUFA specific
+		 *       element names.
+		 *
+		 *  \note Regardless of CPU architecture, these values should be stored as little endian.
+		 */
+		typedef struct
+		{
+			uint8_t  bLength; /**< Size of the descriptor, in bytes. */
+			uint8_t  bDescriptorType; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a value
+			                           *   given by the specific class.
+			                           */
+
+			uint16_t bcdHID; /**< BCD encoded version that the HID descriptor and device complies to.
+			                  *
+			                  *   \see \ref VERSION_BCD() utility macro.
+			                  */
+			uint8_t  bCountryCode; /**< Country code of the localized device, or zero if universal. */
+
+			uint8_t  bNumDescriptors; /**< Total number of HID report descriptors for the interface. */
+
+			uint8_t  bDescriptorType2; /**< Type of HID report, set to \ref HID_DTYPE_Report. */
+			uint16_t wDescriptorLength; /**< Length of the associated HID report descriptor, in bytes. */
+		} ATTR_PACKED USB_HID_StdDescriptor_HID_t;
+
+		/** \brief Standard HID Boot Protocol Mouse Report.
+		 *
+		 *  Type define for a standard Boot Protocol Mouse report
+		 */
+		typedef struct
+		{
+			uint8_t Button; /**< Button mask for currently pressed buttons in the mouse. */
+			int8_t  X; /**< Current delta X movement of the mouse. */
+			int8_t  Y; /**< Current delta Y movement on the mouse. */
+		} ATTR_PACKED USB_MouseReport_Data_t;
+
+		/** \brief Standard HID Boot Protocol Keyboard Report.
+		 *
+		 *  Type define for a standard Boot Protocol Keyboard report
+		 */
+		typedef struct
+		{
+			uint8_t Modifier; /**< Keyboard modifier byte, indicating pressed modifier keys (a combination of
+			                   *   \c HID_KEYBOARD_MODIFER_* masks).
+			                   */
+			uint8_t Reserved; /**< Reserved for OEM use, always set to 0. */
+			uint8_t KeyCode[6]; /**< Key codes of the currently pressed keys. */
+		} ATTR_PACKED USB_KeyboardReport_Data_t;
+
+		/** Type define for the data type used to store HID report descriptor elements. */
+		typedef uint8_t USB_Descriptor_HIDReport_Datatype_t;
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Common/HIDParser.c b/lib/lufa/LUFA/Drivers/USB/Class/Common/HIDParser.c
new file mode 100644
index 0000000000..62f10c4e22
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Class/Common/HIDParser.c
@@ -0,0 +1,389 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+#define  __INCLUDE_FROM_USB_DRIVER
+#define  __INCLUDE_FROM_HID_DRIVER
+#include "HIDParser.h"
+
+uint8_t USB_ProcessHIDReport(const uint8_t* ReportData,
+                             uint16_t ReportSize,
+                             HID_ReportInfo_t* const ParserData)
+{
+	HID_StateTable_t      StateTable[HID_STATETABLE_STACK_DEPTH];
+	HID_StateTable_t*     CurrStateTable     = &StateTable[0];
+	HID_CollectionPath_t* CurrCollectionPath = NULL;
+	HID_ReportSizeInfo_t* CurrReportIDInfo   = &ParserData->ReportIDSizes[0];
+	uint16_t              UsageList[HID_USAGE_STACK_DEPTH];
+	uint8_t               UsageListSize      = 0;
+	HID_MinMax_t          UsageMinMax        = {0, 0};
+
+	memset(ParserData,       0x00, sizeof(HID_ReportInfo_t));
+	memset(CurrStateTable,   0x00, sizeof(HID_StateTable_t));
+	memset(CurrReportIDInfo, 0x00, sizeof(HID_ReportSizeInfo_t));
+
+	ParserData->TotalDeviceReports = 1;
+
+	while (ReportSize)
+	{
+		uint8_t  HIDReportItem  = *ReportData;
+		uint32_t ReportItemData;
+
+		ReportData++;
+		ReportSize--;
+
+		switch (HIDReportItem & HID_RI_DATA_SIZE_MASK)
+		{
+			case HID_RI_DATA_BITS_32:
+				ReportItemData  = (((uint32_t)ReportData[3] << 24) | ((uint32_t)ReportData[2] << 16) |
+			                       ((uint16_t)ReportData[1] << 8)  | ReportData[0]);
+				ReportSize     -= 4;
+				ReportData     += 4;
+				break;
+
+			case HID_RI_DATA_BITS_16:
+				ReportItemData  = (((uint16_t)ReportData[1] << 8) | (ReportData[0]));
+				ReportSize     -= 2;
+				ReportData     += 2;
+				break;
+
+			case HID_RI_DATA_BITS_8:
+				ReportItemData  = ReportData[0];
+				ReportSize     -= 1;
+				ReportData     += 1;
+				break;
+
+			default:
+				ReportItemData  = 0;
+				break;
+		}
+
+		switch (HIDReportItem & (HID_RI_TYPE_MASK | HID_RI_TAG_MASK))
+		{
+			case HID_RI_PUSH(0):
+				if (CurrStateTable == &StateTable[HID_STATETABLE_STACK_DEPTH - 1])
+				  return HID_PARSE_HIDStackOverflow;
+
+				memcpy((CurrStateTable + 1),
+				       CurrStateTable,
+				       sizeof(HID_ReportItem_t));
+
+				CurrStateTable++;
+				break;
+
+			case HID_RI_POP(0):
+				if (CurrStateTable == &StateTable[0])
+				  return HID_PARSE_HIDStackUnderflow;
+
+				CurrStateTable--;
+				break;
+
+			case HID_RI_USAGE_PAGE(0):
+				if ((HIDReportItem & HID_RI_DATA_SIZE_MASK) == HID_RI_DATA_BITS_32)
+				  CurrStateTable->Attributes.Usage.Page = (ReportItemData >> 16);
+
+				CurrStateTable->Attributes.Usage.Page       = ReportItemData;
+				break;
+
+			case HID_RI_LOGICAL_MINIMUM(0):
+				CurrStateTable->Attributes.Logical.Minimum  = ReportItemData;
+				break;
+
+			case HID_RI_LOGICAL_MAXIMUM(0):
+				CurrStateTable->Attributes.Logical.Maximum  = ReportItemData;
+				break;
+
+			case HID_RI_PHYSICAL_MINIMUM(0):
+				CurrStateTable->Attributes.Physical.Minimum = ReportItemData;
+				break;
+
+			case HID_RI_PHYSICAL_MAXIMUM(0):
+				CurrStateTable->Attributes.Physical.Maximum = ReportItemData;
+				break;
+
+			case HID_RI_UNIT_EXPONENT(0):
+				CurrStateTable->Attributes.Unit.Exponent    = ReportItemData;
+				break;
+
+			case HID_RI_UNIT(0):
+				CurrStateTable->Attributes.Unit.Type        = ReportItemData;
+				break;
+
+			case HID_RI_REPORT_SIZE(0):
+				CurrStateTable->Attributes.BitSize          = ReportItemData;
+				break;
+
+			case HID_RI_REPORT_COUNT(0):
+				CurrStateTable->ReportCount                 = ReportItemData;
+				break;
+
+			case HID_RI_REPORT_ID(0):
+				CurrStateTable->ReportID                    = ReportItemData;
+
+				if (ParserData->UsingReportIDs)
+				{
+					CurrReportIDInfo = NULL;
+
+					for (uint8_t i = 0; i < ParserData->TotalDeviceReports; i++)
+					{
+						if (ParserData->ReportIDSizes[i].ReportID == CurrStateTable->ReportID)
+						{
+							CurrReportIDInfo = &ParserData->ReportIDSizes[i];
+							break;
+						}
+					}
+
+					if (CurrReportIDInfo == NULL)
+					{
+						if (ParserData->TotalDeviceReports == HID_MAX_REPORT_IDS)
+						  return HID_PARSE_InsufficientReportIDItems;
+
+						CurrReportIDInfo = &ParserData->ReportIDSizes[ParserData->TotalDeviceReports++];
+						memset(CurrReportIDInfo, 0x00, sizeof(HID_ReportSizeInfo_t));
+					}
+				}
+
+				ParserData->UsingReportIDs = true;
+
+				CurrReportIDInfo->ReportID = CurrStateTable->ReportID;
+				break;
+
+			case HID_RI_USAGE(0):
+				if (UsageListSize == HID_USAGE_STACK_DEPTH)
+				  return HID_PARSE_UsageListOverflow;
+
+				UsageList[UsageListSize++] = ReportItemData;
+				break;
+
+			case HID_RI_USAGE_MINIMUM(0):
+				UsageMinMax.Minimum = ReportItemData;
+				break;
+
+			case HID_RI_USAGE_MAXIMUM(0):
+				UsageMinMax.Maximum = ReportItemData;
+				break;
+
+			case HID_RI_COLLECTION(0):
+				if (CurrCollectionPath == NULL)
+				{
+					CurrCollectionPath = &ParserData->CollectionPaths[0];
+				}
+				else
+				{
+					HID_CollectionPath_t* ParentCollectionPath = CurrCollectionPath;
+
+					CurrCollectionPath = &ParserData->CollectionPaths[1];
+
+					while (CurrCollectionPath->Parent != NULL)
+					{
+						if (CurrCollectionPath == &ParserData->CollectionPaths[HID_MAX_COLLECTIONS - 1])
+						  return HID_PARSE_InsufficientCollectionPaths;
+
+						CurrCollectionPath++;
+					}
+
+					CurrCollectionPath->Parent = ParentCollectionPath;
+				}
+
+				CurrCollectionPath->Type       = ReportItemData;
+				CurrCollectionPath->Usage.Page = CurrStateTable->Attributes.Usage.Page;
+
+				if (UsageListSize)
+				{
+					CurrCollectionPath->Usage.Usage = UsageList[0];
+
+					for (uint8_t i = 1; i < UsageListSize; i++)
+					  UsageList[i - 1] = UsageList[i];
+
+					UsageListSize--;
+				}
+				else if (UsageMinMax.Minimum <= UsageMinMax.Maximum)
+				{
+					CurrCollectionPath->Usage.Usage = UsageMinMax.Minimum++;
+				}
+
+				break;
+
+			case HID_RI_END_COLLECTION(0):
+				if (CurrCollectionPath == NULL)
+				  return HID_PARSE_UnexpectedEndCollection;
+
+				CurrCollectionPath = CurrCollectionPath->Parent;
+				break;
+
+			case HID_RI_INPUT(0):
+			case HID_RI_OUTPUT(0):
+			case HID_RI_FEATURE(0):
+				for (uint8_t ReportItemNum = 0; ReportItemNum < CurrStateTable->ReportCount; ReportItemNum++)
+				{
+					HID_ReportItem_t NewReportItem;
+
+					memcpy(&NewReportItem.Attributes,
+					       &CurrStateTable->Attributes,
+					       sizeof(HID_ReportItem_Attributes_t));
+
+					NewReportItem.ItemFlags      = ReportItemData;
+					NewReportItem.CollectionPath = CurrCollectionPath;
+					NewReportItem.ReportID       = CurrStateTable->ReportID;
+
+					if (UsageListSize)
+					{
+						NewReportItem.Attributes.Usage.Usage = UsageList[0];
+
+						for (uint8_t i = 1; i < UsageListSize; i++)
+						  UsageList[i - 1] = UsageList[i];
+
+						UsageListSize--;
+					}
+					else if (UsageMinMax.Minimum <= UsageMinMax.Maximum)
+					{
+						NewReportItem.Attributes.Usage.Usage = UsageMinMax.Minimum++;
+					}
+
+					uint8_t ItemTypeTag = (HIDReportItem & (HID_RI_TYPE_MASK | HID_RI_TAG_MASK));
+
+					if (ItemTypeTag == HID_RI_INPUT(0))
+					  NewReportItem.ItemType = HID_REPORT_ITEM_In;
+					else if (ItemTypeTag == HID_RI_OUTPUT(0))
+					  NewReportItem.ItemType = HID_REPORT_ITEM_Out;
+					else
+					  NewReportItem.ItemType = HID_REPORT_ITEM_Feature;
+
+					NewReportItem.BitOffset = CurrReportIDInfo->ReportSizeBits[NewReportItem.ItemType];
+
+					CurrReportIDInfo->ReportSizeBits[NewReportItem.ItemType] += CurrStateTable->Attributes.BitSize;
+
+					ParserData->LargestReportSizeBits = MAX(ParserData->LargestReportSizeBits, CurrReportIDInfo->ReportSizeBits[NewReportItem.ItemType]);
+
+					if (ParserData->TotalReportItems == HID_MAX_REPORTITEMS)
+					  return HID_PARSE_InsufficientReportItems;
+
+					memcpy(&ParserData->ReportItems[ParserData->TotalReportItems],
+					       &NewReportItem, sizeof(HID_ReportItem_t));
+
+					if (!(ReportItemData & HID_IOF_CONSTANT) && CALLBACK_HIDParser_FilterHIDReportItem(&NewReportItem))
+					  ParserData->TotalReportItems++;
+				}
+
+				break;
+
+			default:
+				break;
+		}
+
+		if ((HIDReportItem & HID_RI_TYPE_MASK) == HID_RI_TYPE_MAIN)
+		{
+			UsageMinMax.Minimum = 0;
+			UsageMinMax.Maximum = 0;
+			UsageListSize       = 0;
+		}
+	}
+
+	if (!(ParserData->TotalReportItems))
+	  return HID_PARSE_NoUnfilteredReportItems;
+
+	return HID_PARSE_Successful;
+}
+
+bool USB_GetHIDReportItemInfo(const uint8_t* ReportData,
+                              HID_ReportItem_t* const ReportItem)
+{
+	if (ReportItem == NULL)
+	  return false;
+
+	uint16_t DataBitsRem  = ReportItem->Attributes.BitSize;
+	uint16_t CurrentBit   = ReportItem->BitOffset;
+	uint32_t BitMask      = (1 << 0);
+
+	if (ReportItem->ReportID)
+	{
+		if (ReportItem->ReportID != ReportData[0])
+		  return false;
+
+		ReportData++;
+	}
+
+	ReportItem->PreviousValue = ReportItem->Value;
+	ReportItem->Value = 0;
+
+	while (DataBitsRem--)
+	{
+		if (ReportData[CurrentBit / 8] & (1 << (CurrentBit % 8)))
+		  ReportItem->Value |= BitMask;
+
+		CurrentBit++;
+		BitMask <<= 1;
+	}
+
+	return true;
+}
+
+void USB_SetHIDReportItemInfo(uint8_t* ReportData,
+                              HID_ReportItem_t* const ReportItem)
+{
+	if (ReportItem == NULL)
+	  return;
+
+	uint16_t DataBitsRem  = ReportItem->Attributes.BitSize;
+	uint16_t CurrentBit   = ReportItem->BitOffset;
+	uint32_t BitMask      = (1 << 0);
+
+	if (ReportItem->ReportID)
+	{
+		ReportData[0] = ReportItem->ReportID;
+		ReportData++;
+	}
+
+	ReportItem->PreviousValue = ReportItem->Value;
+
+	while (DataBitsRem--)
+	{
+		if (ReportItem->Value & BitMask)
+		  ReportData[CurrentBit / 8] |= (1 << (CurrentBit % 8));
+
+		CurrentBit++;
+		BitMask <<= 1;
+	}
+}
+
+uint16_t USB_GetHIDReportSize(HID_ReportInfo_t* const ParserData,
+                              const uint8_t ReportID,
+                              const uint8_t ReportType)
+{
+	for (uint8_t i = 0; i < HID_MAX_REPORT_IDS; i++)
+	{
+		uint16_t ReportSizeBits = ParserData->ReportIDSizes[i].ReportSizeBits[ReportType];
+
+		if (ParserData->ReportIDSizes[i].ReportID == ReportID)
+		  return (ReportSizeBits / 8) + ((ReportSizeBits % 8) ? 1 : 0);
+	}
+
+	return 0;
+}
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Common/HIDParser.h b/lib/lufa/LUFA/Drivers/USB/Class/Common/HIDParser.h
new file mode 100644
index 0000000000..023316d7ea
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Class/Common/HIDParser.h
@@ -0,0 +1,364 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief USB Human Interface Device (HID) Class report descriptor parser.
+ *
+ *  This file allows for the easy parsing of complex HID report descriptors, which describes the data that
+ *  a HID device transmits to the host. It also provides an easy API for extracting and processing the data
+ *  elements inside a HID report sent from an attached HID device.
+ */
+
+/** \ingroup Group_USB
+ *  \defgroup Group_HIDParser HID Report Parser
+ *  \brief USB Human Interface Device (HID) Class report descriptor parser.
+ *
+ *  \section Sec_HIDParser_Dependencies Module Source Dependencies
+ *  The following files must be built with any user project that uses this module:
+ *    - LUFA/Drivers/USB/Class/Host/HIDParser.c <i>(Makefile source module name: LUFA_SRC_USB)</i>
+ *
+ *  \section Sec_HIDParser_ModDescription Module Description
+ *  Human Interface Device (HID) class report descriptor parser. This module implements a parser than is
+ *  capable of processing a complete HID report descriptor, and outputting a flat structure containing the
+ *  contents of the report in an a more friendly format. The parsed data may then be further processed and used
+ *  within an application to process sent and received HID reports to and from an attached HID device.
+ *
+ *  A HID report descriptor consists of a set of HID report items, which describe the function and layout
+ *  of data exchanged between a HID device and a host, including both the physical encoding of each item
+ *  (such as a button, key press or joystick axis) in the sent and received data packets - known as "reports" -
+ *  as well as other information about each item such as the usages, data range, physical location and other
+ *  characteristics. In this way a HID device can retain a high degree of flexibility in its capabilities, as it
+ *  is not forced to comply with a given report layout or feature-set.
+ *
+ *  This module also contains routines for the processing of data in an actual HID report, using the parsed report
+ *  descriptor data as a guide for the encoding.
+ *
+ *  @{
+ */
+
+#ifndef __HIDPARSER_H__
+#define __HIDPARSER_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+
+		#include "HIDReportData.h"
+		#include "HIDClassCommon.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Macros: */
+		#if !defined(HID_STATETABLE_STACK_DEPTH) || defined(__DOXYGEN__)
+			/** Constant indicating the maximum stack depth of the state table. A larger state table
+			 *  allows for more PUSH/POP report items to be nested, but consumes more memory. By default
+			 *  this is set to 2 levels (allowing non-nested PUSH items) but this can be overridden by
+			 *  defining \c HID_STATETABLE_STACK_DEPTH to another value in the user project makefile, passing the
+			 *  define to the compiler using the -D compiler switch.
+			 */
+			#define HID_STATETABLE_STACK_DEPTH    2
+		#endif
+
+		#if !defined(HID_USAGE_STACK_DEPTH) || defined(__DOXYGEN__)
+			/** Constant indicating the maximum stack depth of the usage table. A larger usage table
+			 *  allows for more USAGE items to be indicated sequentially for REPORT COUNT entries of more than
+			 *  one, but requires more stack space. By default this is set to 8 levels (allowing for a report
+			 *  item with a count of 8) but this can be overridden by defining \c HID_USAGE_STACK_DEPTH to another
+			 *  value in the user project makefile, passing the define to the compiler using the -D compiler
+			 *  switch.
+			 */
+			#define HID_USAGE_STACK_DEPTH         8
+		#endif
+
+		#if !defined(HID_MAX_COLLECTIONS) || defined(__DOXYGEN__)
+			/** Constant indicating the maximum number of COLLECTION items (nested or unnested) that can be
+			 *  processed in the report item descriptor. A large value allows for more COLLECTION items to be
+			 *  processed, but consumes more memory. By default this is set to 10 collections, but this can be
+			 *  overridden by defining \c HID_MAX_COLLECTIONS to another value in the user project makefile, passing
+			 *  the define to the compiler using the -D compiler switch.
+			 */
+			#define HID_MAX_COLLECTIONS           10
+		#endif
+
+		#if !defined(HID_MAX_REPORTITEMS) || defined(__DOXYGEN__)
+			/** Constant indicating the maximum number of report items (IN, OUT or FEATURE) that can be processed
+			 *  in the report item descriptor and stored in the user HID Report Info structure. A large value allows
+			 *  for more report items to be stored, but consumes more memory. By default this is set to 20 items,
+			 *  but this can be overridden by defining \c HID_MAX_REPORTITEMS to another value in the user project
+			 *  makefile, and passing the define to the compiler using the -D compiler switch.
+			 */
+			#define HID_MAX_REPORTITEMS           20
+		#endif
+
+		#if !defined(HID_MAX_REPORT_IDS) || defined(__DOXYGEN__)
+			/** Constant indicating the maximum number of unique report IDs that can be processed in the report item
+			 *  descriptor for the report size information array in the user HID Report Info structure. A large value
+			 *  allows for more report ID report sizes to be stored, but consumes more memory. By default this is set
+			 *  to 10 items, but this can be overridden by defining \c HID_MAX_REPORT_IDS to another value in the user project
+			 *  makefile, and passing the define to the compiler using the -D compiler switch. Note that IN, OUT and FEATURE
+			 *  items sharing the same report ID consume only one size item in the array.
+			 */
+			#define HID_MAX_REPORT_IDS            10
+		#endif
+
+		/** Returns the value a given HID report item (once its value has been fetched via \ref USB_GetHIDReportItemInfo())
+		 *  left-aligned to the given data type. This allows for signed data to be interpreted correctly, by shifting the data
+		 *  leftwards until the data's sign bit is in the correct position.
+		 *
+		 *  \param[in] ReportItem  HID Report Item whose retrieved value is to be aligned.
+		 *  \param[in] Type        Data type to align the HID report item's value to.
+		 *
+		 *  \return Left-aligned data of the given report item's pre-retrieved value for the given datatype.
+		 */
+		#define HID_ALIGN_DATA(ReportItem, Type) ((Type)(ReportItem->Value << ((8 * sizeof(Type)) - ReportItem->Attributes.BitSize)))
+
+	/* Public Interface - May be used in end-application: */
+		/* Enums: */
+			/** Enum for the possible error codes in the return value of the \ref USB_ProcessHIDReport() function. */
+			enum HID_Parse_ErrorCodes_t
+			{
+				HID_PARSE_Successful                  = 0, /**< Successful parse of the HID report descriptor, no error. */
+				HID_PARSE_HIDStackOverflow            = 1, /**< More than \ref HID_STATETABLE_STACK_DEPTH nested PUSHes in the report. */
+				HID_PARSE_HIDStackUnderflow           = 2, /**< A POP was found when the state table stack was empty. */
+				HID_PARSE_InsufficientReportItems     = 3, /**< More than \ref HID_MAX_REPORTITEMS report items in the report. */
+				HID_PARSE_UnexpectedEndCollection     = 4, /**< An END COLLECTION item found without matching COLLECTION item. */
+				HID_PARSE_InsufficientCollectionPaths = 5, /**< More than \ref HID_MAX_COLLECTIONS collections in the report. */
+				HID_PARSE_UsageListOverflow           = 6, /**< More than \ref HID_USAGE_STACK_DEPTH usages listed in a row. */
+				HID_PARSE_InsufficientReportIDItems   = 7, /**< More than \ref HID_MAX_REPORT_IDS report IDs in the device. */
+				HID_PARSE_NoUnfilteredReportItems     = 8, /**< All report items from the device were filtered by the filtering callback routine. */
+			};
+
+		/* Type Defines: */
+			/** \brief HID Parser Report Item Min/Max Structure.
+			 *
+			 *  Type define for an attribute with both minimum and maximum values (e.g. Logical Min/Max).
+			 */
+			typedef struct
+			{
+				uint32_t Minimum; /**< Minimum value for the attribute. */
+				uint32_t Maximum; /**< Maximum value for the attribute. */
+			} HID_MinMax_t;
+
+			/** \brief HID Parser Report Item Unit Structure.
+			 *
+			 *  Type define for the Unit attributes of a report item.
+			 */
+			typedef struct
+			{
+				uint32_t Type;     /**< Unit type (refer to HID specifications for details). */
+				uint8_t  Exponent; /**< Unit exponent (refer to HID specifications for details). */
+			} HID_Unit_t;
+
+			/** \brief HID Parser Report Item Usage Structure.
+			 *
+			 *  Type define for the Usage attributes of a report item.
+			 */
+			typedef struct
+			{
+				uint16_t Page;  /**< Usage page of the report item. */
+				uint16_t Usage; /**< Usage of the report item. */
+			} HID_Usage_t;
+
+			/** \brief HID Parser Report Item Collection Path Structure.
+			 *
+			 *  Type define for a COLLECTION object. Contains the collection attributes and a reference to the
+			 *  parent collection if any.
+			 */
+			typedef struct HID_CollectionPath
+			{
+				uint8_t                    Type;   /**< Collection type (e.g. "Generic Desktop"). */
+				HID_Usage_t                Usage;  /**< Collection usage. */
+				struct HID_CollectionPath* Parent; /**< Reference to parent collection, or \c NULL if root collection. */
+			} HID_CollectionPath_t;
+
+			/** \brief HID Parser Report Item Attributes Structure.
+			 *
+			 *  Type define for all the data attributes of a report item, except flags.
+			 */
+			typedef struct
+			{
+				uint8_t      BitSize;  /**< Size in bits of the report item's data. */
+
+				HID_Usage_t  Usage;    /**< Usage of the report item. */
+				HID_Unit_t   Unit;     /**< Unit type and exponent of the report item. */
+				HID_MinMax_t Logical;  /**< Logical minimum and maximum of the report item. */
+				HID_MinMax_t Physical; /**< Physical minimum and maximum of the report item. */
+			} HID_ReportItem_Attributes_t;
+
+			/** \brief HID Parser Report Item Details Structure.
+			 *
+			 *  Type define for a report item (IN, OUT or FEATURE) layout attributes and other details.
+			 */
+			typedef struct
+			{
+				uint16_t                    BitOffset;      /**< Bit offset in the IN, OUT or FEATURE report of the item. */
+				uint8_t                     ItemType;       /**< Report item type, a value in \ref HID_ReportItemTypes_t. */
+				uint16_t                    ItemFlags;      /**< Item data flags, a mask of \c HID_IOF_* constants. */
+				uint8_t                     ReportID;       /**< Report ID this item belongs to, or 0x00 if device has only one report */
+				HID_CollectionPath_t*       CollectionPath; /**< Collection path of the item. */
+
+				HID_ReportItem_Attributes_t Attributes;     /**< Report item attributes. */
+
+				uint32_t                    Value;          /**< Current value of the report item - use \ref HID_ALIGN_DATA() when processing
+				                                             *   a retrieved value so that it is aligned to a specific type.
+				                                             */
+				uint32_t                    PreviousValue;  /**< Previous value of the report item. */
+			} HID_ReportItem_t;
+
+			/** \brief HID Parser Report Size Structure.
+			 *
+			 *  Type define for a report item size information structure, to retain the size of a device's reports by ID.
+			 */
+			typedef struct
+			{
+				uint8_t  ReportID; /**< Report ID of the report within the HID interface. */
+				uint16_t ReportSizeBits[3]; /**< Total number of bits in each report type for the given Report ID,
+				                             *   indexed by the \ref HID_ReportItemTypes_t enum.
+				                             */
+			} HID_ReportSizeInfo_t;
+
+			/** \brief HID Parser State Structure.
+			 *
+			 *  Type define for a complete processed HID report, including all report item data and collections.
+			 */
+			typedef struct
+			{
+				uint8_t              TotalReportItems; /**< Total number of report items stored in the \c ReportItems array. */
+				HID_ReportItem_t     ReportItems[HID_MAX_REPORTITEMS]; /**< Report items array, including all IN, OUT
+			                                                            *   and FEATURE items.
+				                                                        */
+				HID_CollectionPath_t CollectionPaths[HID_MAX_COLLECTIONS]; /**< All collection items, referenced
+				                                                            *   by the report items.
+				                                                            */
+				uint8_t              TotalDeviceReports; /**< Number of reports within the HID interface */
+				HID_ReportSizeInfo_t ReportIDSizes[HID_MAX_REPORT_IDS]; /**< Report sizes for each report in the interface */
+				uint16_t             LargestReportSizeBits; /**< Largest report that the attached device will generate, in bits */
+				bool                 UsingReportIDs; /**< Indicates if the device has at least one REPORT ID
+				                                      *   element in its HID report descriptor.
+				                                      */
+			} HID_ReportInfo_t;
+
+		/* Function Prototypes: */
+			/** Function to process a given HID report returned from an attached device, and store it into a given
+			 *  \ref HID_ReportInfo_t structure.
+			 *
+			 *  \param[in]  ReportData  Buffer containing the device's HID report table.
+			 *  \param[in]  ReportSize  Size in bytes of the HID report table.
+			 *  \param[out] ParserData  Pointer to a \ref HID_ReportInfo_t instance for the parser output.
+			 *
+			 *  \return A value in the \ref HID_Parse_ErrorCodes_t enum.
+			 */
+			uint8_t USB_ProcessHIDReport(const uint8_t* ReportData,
+			                             uint16_t ReportSize,
+			                             HID_ReportInfo_t* const ParserData) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(3);
+
+			/** Extracts the given report item's value out of the given HID report and places it into the Value
+			 *  member of the report item's \ref HID_ReportItem_t structure.
+			 *
+			 *  When called on a report with an item that exists in that report, this copies the report item's \c Value
+			 *  to its \c PreviousValue element for easy checking to see if an item's value has changed before processing
+			 *  a report. If the given item does not exist in the report, the function does not modify the report item's
+			 *  data.
+			 *
+			 *  \param[in]     ReportData  Buffer containing an IN or FEATURE report from an attached device.
+			 *  \param[in,out] ReportItem  Pointer to the report item of interest in a \ref HID_ReportInfo_t ReportItem array.
+			 *
+			 *  \returns Boolean \c true if the item to retrieve was located in the given report, \c false otherwise.
+			 */
+			bool USB_GetHIDReportItemInfo(const uint8_t* ReportData,
+			                              HID_ReportItem_t* const ReportItem) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Retrieves the given report item's value out of the \c Value member of the report item's
+			 *  \ref HID_ReportItem_t structure and places it into the correct position in the HID report
+			 *  buffer. The report buffer is assumed to have the appropriate bits cleared before calling
+			 *  this function (i.e., the buffer should be explicitly cleared before report values are added).
+			 *
+			 *  When called, this copies the report item's \c Value element to its \c PreviousValue element for easy
+			 *  checking to see if an item's value has changed before sending a report.
+			 *
+			 *  If the device has multiple HID reports, the first byte in the report is set to the report ID of the given item.
+			 *
+			 *  \param[out] ReportData  Buffer holding the current OUT or FEATURE report data.
+			 *  \param[in]  ReportItem  Pointer to the report item of interest in a \ref HID_ReportInfo_t ReportItem array.
+			 */
+			void USB_SetHIDReportItemInfo(uint8_t* ReportData,
+			                              HID_ReportItem_t* const ReportItem) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Retrieves the size of a given HID report in bytes from its Report ID.
+			 *
+			 *  \param[in] ParserData  Pointer to a \ref HID_ReportInfo_t instance containing the parser output.
+			 *  \param[in] ReportID    Report ID of the report whose size is to be determined.
+			 *  \param[in] ReportType  Type of the report whose size is to be determined, a value from the
+			 *                         \ref HID_ReportItemTypes_t enum.
+			 *
+			 *  \return Size of the report in bytes, or \c 0 if the report does not exist.
+			 */
+			uint16_t USB_GetHIDReportSize(HID_ReportInfo_t* const ParserData,
+			                              const uint8_t ReportID,
+			                              const uint8_t ReportType) ATTR_CONST ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Callback routine for the HID Report Parser. This callback <b>must</b> be implemented by the user code when
+			 *  the parser is used, to determine what report IN, OUT and FEATURE item's information is stored into the user
+			 *  \ref HID_ReportInfo_t structure. This can be used to filter only those items the application will be using, so that
+			 *  no RAM is wasted storing the attributes for report items which will never be referenced by the application.
+			 *
+			 *  Report item pointers passed to this callback function may be cached by the user application for later use
+			 *  when processing report items. This provides faster report processing in the user application than would
+			 *  a search of the entire parsed report item table for each received or sent report.
+			 *
+			 *  \param[in] CurrentItem  Pointer to the current report item for user checking.
+			 *
+			 *  \return Boolean \c true if the item should be stored into the \ref HID_ReportInfo_t structure, \c false if
+			 *          it should be ignored.
+			 */
+			bool CALLBACK_HIDParser_FilterHIDReportItem(HID_ReportItem_t* const CurrentItem);
+
+	/* Private Interface - For use in library only: */
+	#if !defined(__DOXYGEN__)
+		/* Type Defines: */
+			typedef struct
+			{
+				 HID_ReportItem_Attributes_t Attributes;
+				 uint8_t                     ReportCount;
+				 uint8_t                     ReportID;
+			} HID_StateTable_t;
+	#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Common/HIDReportData.h b/lib/lufa/LUFA/Drivers/USB/Class/Common/HIDReportData.h
new file mode 100644
index 0000000000..fe1c4df943
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Class/Common/HIDReportData.h
@@ -0,0 +1,126 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Constants for HID report item attributes.
+ *
+ *  HID report item constants for report item attributes. Refer to the HID specification for
+ *  details on each flag's meaning when applied to an IN, OUT or FEATURE item.
+ */
+
+/** \ingroup Group_HIDParser
+ *  \defgroup Group_HIDReportItemConst HID Report Descriptor Item Constants
+ *
+ *  General HID constant definitions for HID Report Descriptor elements.
+ *
+ *  @{
+ */
+
+#ifndef __HIDREPORTDATA_H__
+#define __HIDREPORTDATA_H__
+
+	/* Private Interface - For use in library only: */
+	#if !defined(__DOXYGEN__)
+		/* Macros: */
+			#define HID_RI_DATA_SIZE_MASK                   0x03
+			#define HID_RI_TYPE_MASK                        0x0C
+			#define HID_RI_TAG_MASK                         0xF0
+
+			#define HID_RI_TYPE_MAIN                        0x00
+			#define HID_RI_TYPE_GLOBAL                      0x04
+			#define HID_RI_TYPE_LOCAL                       0x08
+
+			#define HID_RI_DATA_BITS_0                      0x00
+			#define HID_RI_DATA_BITS_8                      0x01
+			#define HID_RI_DATA_BITS_16                     0x02
+			#define HID_RI_DATA_BITS_32                     0x03
+			#define HID_RI_DATA_BITS(DataBits)              CONCAT_EXPANDED(HID_RI_DATA_BITS_, DataBits)
+
+			#define _HID_RI_ENCODE_0(Data)
+			#define _HID_RI_ENCODE_8(Data)                  , (Data & 0xFF)
+			#define _HID_RI_ENCODE_16(Data)                 _HID_RI_ENCODE_8(Data)  _HID_RI_ENCODE_8(Data >> 8)
+			#define _HID_RI_ENCODE_32(Data)                 _HID_RI_ENCODE_16(Data) _HID_RI_ENCODE_16(Data >> 16)
+			#define _HID_RI_ENCODE(DataBits, ...)           CONCAT_EXPANDED(_HID_RI_ENCODE_, DataBits(__VA_ARGS__))
+
+			#define _HID_RI_ENTRY(Type, Tag, DataBits, ...) (Type | Tag | HID_RI_DATA_BITS(DataBits)) _HID_RI_ENCODE(DataBits, (__VA_ARGS__))
+	#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+		/** \name HID Input, Output and Feature Report Descriptor Item Flags */
+		//@{
+			#define HID_IOF_CONSTANT                        (1 << 0)
+			#define HID_IOF_DATA                            (0 << 0)
+			#define HID_IOF_VARIABLE                        (1 << 1)
+			#define HID_IOF_ARRAY                           (0 << 1)
+			#define HID_IOF_RELATIVE                        (1 << 2)
+			#define HID_IOF_ABSOLUTE                        (0 << 2)
+			#define HID_IOF_WRAP                            (1 << 3)
+			#define HID_IOF_NO_WRAP                         (0 << 3)
+			#define HID_IOF_NON_LINEAR                      (1 << 4)
+			#define HID_IOF_LINEAR                          (0 << 4)
+			#define HID_IOF_NO_PREFERRED_STATE              (1 << 5)
+			#define HID_IOF_PREFERRED_STATE                 (0 << 5)
+			#define HID_IOF_NULLSTATE                       (1 << 6)
+			#define HID_IOF_NO_NULL_POSITION                (0 << 6)
+			#define HID_IOF_VOLATILE                        (1 << 7)
+			#define HID_IOF_NON_VOLATILE                    (0 << 7)
+			#define HID_IOF_BUFFERED_BYTES                  (1 << 8)
+			#define HID_IOF_BITFIELD                        (0 << 8)
+		//@}
+
+		/** \name HID Report Descriptor Item Macros */
+		//@{
+			#define HID_RI_INPUT(DataBits, ...)             _HID_RI_ENTRY(HID_RI_TYPE_MAIN  , 0x80, DataBits, __VA_ARGS__)
+			#define HID_RI_OUTPUT(DataBits, ...)            _HID_RI_ENTRY(HID_RI_TYPE_MAIN  , 0x90, DataBits, __VA_ARGS__)
+			#define HID_RI_COLLECTION(DataBits, ...)        _HID_RI_ENTRY(HID_RI_TYPE_MAIN  , 0xA0, DataBits, __VA_ARGS__)
+			#define HID_RI_FEATURE(DataBits, ...)           _HID_RI_ENTRY(HID_RI_TYPE_MAIN  , 0xB0, DataBits, __VA_ARGS__)
+			#define HID_RI_END_COLLECTION(DataBits, ...)    _HID_RI_ENTRY(HID_RI_TYPE_MAIN  , 0xC0, DataBits, __VA_ARGS__)
+			#define HID_RI_USAGE_PAGE(DataBits, ...)        _HID_RI_ENTRY(HID_RI_TYPE_GLOBAL, 0x00, DataBits, __VA_ARGS__)
+			#define HID_RI_LOGICAL_MINIMUM(DataBits, ...)   _HID_RI_ENTRY(HID_RI_TYPE_GLOBAL, 0x10, DataBits, __VA_ARGS__)
+			#define HID_RI_LOGICAL_MAXIMUM(DataBits, ...)   _HID_RI_ENTRY(HID_RI_TYPE_GLOBAL, 0x20, DataBits, __VA_ARGS__)
+			#define HID_RI_PHYSICAL_MINIMUM(DataBits, ...)  _HID_RI_ENTRY(HID_RI_TYPE_GLOBAL, 0x30, DataBits, __VA_ARGS__)
+			#define HID_RI_PHYSICAL_MAXIMUM(DataBits, ...)  _HID_RI_ENTRY(HID_RI_TYPE_GLOBAL, 0x40, DataBits, __VA_ARGS__)
+			#define HID_RI_UNIT_EXPONENT(DataBits, ...)     _HID_RI_ENTRY(HID_RI_TYPE_GLOBAL, 0x50, DataBits, __VA_ARGS__)
+			#define HID_RI_UNIT(DataBits, ...)              _HID_RI_ENTRY(HID_RI_TYPE_GLOBAL, 0x60, DataBits, __VA_ARGS__)
+			#define HID_RI_REPORT_SIZE(DataBits, ...)       _HID_RI_ENTRY(HID_RI_TYPE_GLOBAL, 0x70, DataBits, __VA_ARGS__)
+			#define HID_RI_REPORT_ID(DataBits, ...)         _HID_RI_ENTRY(HID_RI_TYPE_GLOBAL, 0x80, DataBits, __VA_ARGS__)
+			#define HID_RI_REPORT_COUNT(DataBits, ...)      _HID_RI_ENTRY(HID_RI_TYPE_GLOBAL, 0x90, DataBits, __VA_ARGS__)
+			#define HID_RI_PUSH(DataBits, ...)              _HID_RI_ENTRY(HID_RI_TYPE_GLOBAL, 0xA0, DataBits, __VA_ARGS__)
+			#define HID_RI_POP(DataBits, ...)               _HID_RI_ENTRY(HID_RI_TYPE_GLOBAL, 0xB0, DataBits, __VA_ARGS__)
+			#define HID_RI_USAGE(DataBits, ...)             _HID_RI_ENTRY(HID_RI_TYPE_LOCAL , 0x00, DataBits, __VA_ARGS__)
+			#define HID_RI_USAGE_MINIMUM(DataBits, ...)     _HID_RI_ENTRY(HID_RI_TYPE_LOCAL , 0x10, DataBits, __VA_ARGS__)
+			#define HID_RI_USAGE_MAXIMUM(DataBits, ...)     _HID_RI_ENTRY(HID_RI_TYPE_LOCAL , 0x20, DataBits, __VA_ARGS__)
+		//@}
+
+/** @} */
+
+#endif
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Common/MIDIClassCommon.h b/lib/lufa/LUFA/Drivers/USB/Class/Common/MIDIClassCommon.h
new file mode 100644
index 0000000000..b6414bc06b
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Class/Common/MIDIClassCommon.h
@@ -0,0 +1,363 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Common definitions and declarations for the library USB MIDI Class driver.
+ *
+ *  Common definitions and declarations for the library USB MIDI Class driver.
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the USB module driver
+ *        dispatch header located in LUFA/Drivers/USB.h.
+ */
+
+/** \ingroup Group_USBClassMIDI
+ *  \defgroup Group_USBClassMIDICommon  Common Class Definitions
+ *
+ *  \section Sec_USBClassMIDICommon_ModDescription Module Description
+ *  Constants, Types and Enum definitions that are common to both Device and Host modes for the USB
+ *  MIDI Class.
+ *
+ *  @{
+ */
+
+#ifndef _MIDI_CLASS_COMMON_H_
+#define _MIDI_CLASS_COMMON_H_
+
+	/* Macros: */
+		#define __INCLUDE_FROM_AUDIO_DRIVER
+
+	/* Includes: */
+		#include "../../Core/StdDescriptors.h"
+		#include "AudioClassCommon.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_MIDI_DRIVER)
+			#error Do not include this file directly. Include LUFA/Drivers/USB.h instead.
+		#endif
+
+	/* Macros: */
+		/** \name MIDI Command Values
+		 *  See http://www.midi.org/techspecs/midimessages.php for more information.
+		 */
+		//@{
+		/** MIDI command for System Exclusive (SysEx) single event that has one byte of data total. */
+		#define MIDI_COMMAND_SYSEX_1BYTE           MIDI_COMMAND_SYSEX_END_1BYTE
+
+		/** MIDI command for System Exclusive (SysEx) single event that has two bytes of data total. */
+		#define MIDI_COMMAND_SYSEX_2BYTE           0x20
+
+		/** MIDI command for System Exclusive (SysEx) single event that has three bytes of data total. */
+		#define MIDI_COMMAND_SYSEX_3BYTE           0x30
+
+		/** MIDI command for System Exclusive (SysEx) stream event that has at least four bytes of data total. */
+		#define MIDI_COMMAND_SYSEX_START_3BYTE     0x40
+
+		/** MIDI command for System Exclusive (SysEx) stream event terminator with one remaining data byte. */
+		#define MIDI_COMMAND_SYSEX_END_1BYTE       0x50
+
+		/** MIDI command for System Exclusive (SysEx) stream event terminator with two remaining data bytes. */
+		#define MIDI_COMMAND_SYSEX_END_2BYTE       0x60
+
+		/** MIDI command for System Exclusive (SysEx) stream event terminator with three remaining data bytes. */
+		#define MIDI_COMMAND_SYSEX_END_3BYTE       0x70
+
+		/** MIDI command for a note off (deactivation) event. */
+		#define MIDI_COMMAND_NOTE_OFF              0x80
+
+		/** MIDI command for a note on (activation) event. */
+		#define MIDI_COMMAND_NOTE_ON               0x90
+
+		/** MIDI command for a note pressure change event. */
+		#define MIDI_COMMAND_NOTE_PRESSURE         0xA0
+
+		/** MIDI command for a control change event. */
+		#define MIDI_COMMAND_CONTROL_CHANGE        0xB0
+
+		/** MIDI command for a control change event. */
+		#define MIDI_COMMAND_PROGRAM_CHANGE        0xC0
+
+		/** MIDI command for a channel pressure change event. */
+		#define MIDI_COMMAND_CHANNEL_PRESSURE      0xD0
+
+		/** MIDI command for a pitch change event. */
+		#define MIDI_COMMAND_PITCH_WHEEL_CHANGE    0xE0
+		//@}
+
+		/** Standard key press velocity value used for all note events. */
+		#define MIDI_STANDARD_VELOCITY             64
+
+		/** Convenience macro. MIDI channels are numbered from 1-10 (natural numbers) however the logical channel
+		 *  addresses are zero-indexed. This converts a natural MIDI channel number into the logical channel address.
+		 *
+		 *  \param[in] channel  MIDI channel number to address.
+		 *
+		 *  \return Constructed MIDI channel ID.
+		 */
+		#define MIDI_CHANNEL(channel)              ((channel) - 1)
+
+		/** Constructs a MIDI event ID from a given MIDI command and a virtual MIDI cable index. This can then be
+		 *  used to create and decode \ref MIDI_EventPacket_t MIDI event packets.
+		 *
+		 *  \param[in] virtualcable  Index of the virtual MIDI cable the event relates to
+		 *  \param[in] command       MIDI command to send through the virtual MIDI cable
+		 *
+		 *  \return Constructed MIDI event ID.
+		 */
+		#define MIDI_EVENT(virtualcable, command)  (((virtualcable) << 4) | ((command) >> 4))
+
+	/* Enums: */
+		/** Enum for the possible MIDI jack types in a MIDI device jack descriptor. */
+		enum MIDI_JackTypes_t
+		{
+			MIDI_JACKTYPE_Embedded = 0x01, /**< MIDI class descriptor jack type value for an embedded (logical) MIDI input or output jack. */
+			MIDI_JACKTYPE_External = 0x02, /**< MIDI class descriptor jack type value for an external (physical) MIDI input or output jack. */
+		};
+
+	/* Type Defines: */
+		/** \brief MIDI class-specific Streaming Interface Descriptor (LUFA naming conventions).
+		 *
+		 *  Type define for an Audio class-specific MIDI streaming interface descriptor. This indicates to the host
+		 *  how MIDI the specification compliance of the device and the total length of the Audio class-specific descriptors.
+		 *  See the USB Audio specification for more details.
+		 *
+		 *  \see \ref USB_MIDI_StdDescriptor_AudioInterface_AS_t for the version of this type with standard element names.
+		 *
+		 *  \note Regardless of CPU architecture, these values should be stored as little endian.
+		 */
+		typedef struct
+		{
+			USB_Descriptor_Header_t Header; /**< Regular descriptor header containing the descriptor's type and length. */
+			uint8_t                 Subtype; /**< Sub type value used to distinguish between audio class-specific descriptors. */
+
+			uint16_t                AudioSpecification; /**< Binary coded decimal value, indicating the supported Audio Class
+			                                             *   specification version.
+			                                             *
+			                                             *   \see \ref VERSION_BCD() utility macro.
+			                                             */
+			uint16_t                TotalLength; /**< Total length of the Audio class-specific descriptors, including this descriptor. */
+		} ATTR_PACKED USB_MIDI_Descriptor_AudioInterface_AS_t;
+
+		/** \brief MIDI class-specific Streaming Interface Descriptor (USB-IF naming conventions).
+		 *
+		 *  Type define for an Audio class-specific MIDI streaming interface descriptor. This indicates to the host
+		 *  how MIDI the specification compliance of the device and the total length of the Audio class-specific descriptors.
+		 *  See the USB Audio specification for more details.
+		 *
+		 *  \see \ref USB_MIDI_Descriptor_AudioInterface_AS_t for the version of this type with non-standard LUFA specific
+		 *       element names.
+		 *
+		 *  \note Regardless of CPU architecture, these values should be stored as little endian.
+		 */
+		typedef struct
+		{
+			uint8_t  bLength; /**< Size of the descriptor, in bytes. */
+			uint8_t  bDescriptorType; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a value
+			                           *   given by the specific class.
+			                           */
+
+			uint8_t  bDescriptorSubtype; /**< Sub type value used to distinguish between audio class-specific descriptors. */
+
+			uint16_t bcdMSC; /**< Binary coded decimal value, indicating the supported MIDI Class specification version.
+			                  *
+			                  *   \see \ref VERSION_BCD() utility macro.
+			                  */
+			uint16_t wTotalLength; /**< Total length of the Audio class-specific descriptors, including this descriptor. */
+		} ATTR_PACKED USB_MIDI_StdDescriptor_AudioInterface_AS_t;
+
+		/** \brief MIDI class-specific Input Jack Descriptor (LUFA naming conventions).
+		 *
+		 *  Type define for an Audio class-specific MIDI IN jack. This gives information to the host on a MIDI input, either
+		 *  a physical input jack, or a logical jack (receiving input data internally, or from the host via an endpoint).
+		 *
+		 *  \see \ref USB_MIDI_StdDescriptor_InputJack_t for the version of this type with standard element names.
+		 *
+		 *  \note Regardless of CPU architecture, these values should be stored as little endian.
+		 */
+		typedef struct
+		{
+			USB_Descriptor_Header_t Header; /**< Regular descriptor header containing the descriptor's type and length. */
+			uint8_t                 Subtype; /**< Sub type value used to distinguish between audio class-specific descriptors. */
+
+			uint8_t                 JackType; /**< Type of jack, one of the \c JACKTYPE_* mask values. */
+			uint8_t                 JackID; /**< ID value of this jack - must be a unique value within the device. */
+
+			uint8_t                 JackStrIndex; /**< Index of a string descriptor describing this descriptor within the device. */
+		} ATTR_PACKED USB_MIDI_Descriptor_InputJack_t;
+
+		/** \brief MIDI class-specific Input Jack Descriptor (USB-IF naming conventions).
+		 *
+		 *  Type define for an Audio class-specific MIDI IN jack. This gives information to the host on a MIDI input, either
+		 *  a physical input jack, or a logical jack (receiving input data internally, or from the host via an endpoint).
+		 *
+		 *  \see \ref USB_MIDI_Descriptor_InputJack_t for the version of this type with non-standard LUFA specific
+		 *       element names.
+		 *
+		 *  \note Regardless of CPU architecture, these values should be stored as little endian.
+		 */
+		typedef struct
+		{
+			uint8_t  bLength; /**< Size of the descriptor, in bytes. */
+			uint8_t  bDescriptorType; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a value
+			                           *   given by the specific class.
+			                           */
+
+			uint8_t  bDescriptorSubtype; /**< Sub type value used to distinguish between audio class-specific descriptors. */
+
+			uint8_t  bJackType; /**< Type of jack, one of the \c JACKTYPE_* mask values. */
+			uint8_t  bJackID; /**< ID value of this jack - must be a unique value within the device. */
+
+			uint8_t  iJack; /**< Index of a string descriptor describing this descriptor within the device. */
+		} ATTR_PACKED USB_MIDI_StdDescriptor_InputJack_t;
+
+		/** \brief MIDI class-specific Output Jack Descriptor (LUFA naming conventions).
+		 *
+		 *  Type define for an Audio class-specific MIDI OUT jack. This gives information to the host on a MIDI output, either
+		 *  a physical output jack, or a logical jack (sending output data internally, or to the host via an endpoint).
+		 *
+		 *  \see \ref USB_MIDI_StdDescriptor_OutputJack_t for the version of this type with standard element names.
+		 *
+		 *  \note Regardless of CPU architecture, these values should be stored as little endian.
+		 */
+		typedef struct
+		{
+			USB_Descriptor_Header_t   Header; /**< Regular descriptor header containing the descriptor's type and length. */
+			uint8_t                   Subtype; /**< Sub type value used to distinguish between audio class-specific descriptors. */
+
+			uint8_t                   JackType; /**< Type of jack, one of the \c JACKTYPE_* mask values. */
+			uint8_t                   JackID; /**< ID value of this jack - must be a unique value within the device. */
+
+			uint8_t                   NumberOfPins; /**< Number of output channels within the jack, either physical or logical. */
+			uint8_t                   SourceJackID[1]; /**< ID of each output pin's source data jack. */
+			uint8_t                   SourcePinID[1]; /**< Pin number in the input jack of each output pin's source data. */
+
+			uint8_t                   JackStrIndex; /**< Index of a string descriptor describing this descriptor within the device. */
+		} ATTR_PACKED USB_MIDI_Descriptor_OutputJack_t;
+
+		/** \brief MIDI class-specific Output Jack Descriptor (USB-IF naming conventions).
+		 *
+		 *  Type define for an Audio class-specific MIDI OUT jack. This gives information to the host on a MIDI output, either
+		 *  a physical output jack, or a logical jack (sending output data internally, or to the host via an endpoint).
+		 *
+		 *  \see \ref USB_MIDI_Descriptor_OutputJack_t for the version of this type with non-standard LUFA specific
+		 *       element names.
+		 *
+		 *  \note Regardless of CPU architecture, these values should be stored as little endian.
+		 */
+		typedef struct
+		{
+			uint8_t  bLength; /**< Size of the descriptor, in bytes. */
+			uint8_t  bDescriptorType; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a value
+			                           *   given by the specific class.
+			                           */
+
+			uint8_t  bDescriptorSubtype; /**< Sub type value used to distinguish between audio class-specific descriptors. */
+
+			uint8_t  bJackType; /**< Type of jack, one of the \c JACKTYPE_* mask values. */
+			uint8_t  bJackID; /**< ID value of this jack - must be a unique value within the device. */
+
+			uint8_t  bNrInputPins; /**< Number of output channels within the jack, either physical or logical. */
+			uint8_t  baSourceID[1]; /**< ID of each output pin's source data jack. */
+			uint8_t  baSourcePin[1]; /**< Pin number in the input jack of each output pin's source data. */
+
+			uint8_t  iJack; /**< Index of a string descriptor describing this descriptor within the device. */
+		} ATTR_PACKED USB_MIDI_StdDescriptor_OutputJack_t;
+
+		/** \brief Audio class-specific Jack Endpoint Descriptor (LUFA naming conventions).
+		 *
+		 *  Type define for an Audio class-specific extended MIDI jack endpoint descriptor. This contains extra information
+		 *  on the usage of MIDI endpoints used to stream MIDI events in and out of the USB Audio device, and follows an Audio
+		 *  class-specific extended MIDI endpoint descriptor. See the USB Audio specification for more details.
+		 *
+		 *  \see \ref USB_MIDI_StdDescriptor_Jack_Endpoint_t for the version of this type with standard element names.
+		 *
+		 *  \note Regardless of CPU architecture, these values should be stored as little endian.
+		 */
+		typedef struct
+		{
+			USB_Descriptor_Header_t   Header; /**< Regular descriptor header containing the descriptor's type and length. */
+			uint8_t                   Subtype; /**< Sub type value used to distinguish between audio class-specific descriptors. */
+
+			uint8_t                   TotalEmbeddedJacks; /**< Total number of jacks inside this endpoint. */
+			uint8_t                   AssociatedJackID[1]; /**< IDs of each jack inside the endpoint. */
+		} ATTR_PACKED USB_MIDI_Descriptor_Jack_Endpoint_t;
+
+		/** \brief Audio class-specific Jack Endpoint Descriptor (USB-IF naming conventions).
+		 *
+		 *  Type define for an Audio class-specific extended MIDI jack endpoint descriptor. This contains extra information
+		 *  on the usage of MIDI endpoints used to stream MIDI events in and out of the USB Audio device, and follows an Audio
+		 *  class-specific extended MIDI endpoint descriptor. See the USB Audio specification for more details.
+		 *
+		 *  \see \ref USB_MIDI_Descriptor_Jack_Endpoint_t for the version of this type with non-standard LUFA specific
+		 *       element names.
+		 *
+		 *  \note Regardless of CPU architecture, these values should be stored as little endian.
+		 */
+		typedef struct
+		{
+			uint8_t  bLength; /**< Size of the descriptor, in bytes. */
+			uint8_t  bDescriptorType; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a value
+			                           *   given by the specific class.
+			                           */
+
+			uint8_t  bDescriptorSubtype; /**< Sub type value used to distinguish between audio class-specific descriptors. */
+
+			uint8_t  bNumEmbMIDIJack; /**< Total number of jacks inside this endpoint. */
+			uint8_t  bAssocJackID[1]; /**< IDs of each jack inside the endpoint. */
+		} ATTR_PACKED USB_MIDI_StdDescriptor_Jack_Endpoint_t;
+
+		/** \brief MIDI Class Driver Event Packet.
+		 *
+		 *  Type define for a USB MIDI event packet, used to encapsulate sent and received MIDI messages from a USB MIDI interface.
+		 *
+		 *  \note Regardless of CPU architecture, these values should be stored as little endian.
+		 */
+		typedef struct
+		{
+			uint8_t  Event; /**< MIDI event type, constructed with the \ref MIDI_EVENT() macro. */
+
+			uint8_t  Data1; /**< First byte of data in the MIDI event. */
+			uint8_t  Data2; /**< Second byte of data in the MIDI event. */
+			uint8_t  Data3; /**< Third byte of data in the MIDI event. */
+		} ATTR_PACKED MIDI_EventPacket_t;
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Common/MassStorageClassCommon.h b/lib/lufa/LUFA/Drivers/USB/Class/Common/MassStorageClassCommon.h
new file mode 100644
index 0000000000..d2ea37a82a
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Class/Common/MassStorageClassCommon.h
@@ -0,0 +1,368 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Common definitions and declarations for the library USB Mass Storage Class driver.
+ *
+ *  Common definitions and declarations for the library USB Mass Storage Class driver.
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the USB module driver
+ *        dispatch header located in LUFA/Drivers/USB.h.
+ */
+
+/** \ingroup Group_USBClassMS
+ *  \defgroup Group_USBClassMSCommon  Common Class Definitions
+ *
+ *  \section Sec_USBClassMSCommon_ModDescription Module Description
+ *  Constants, Types and Enum definitions that are common to both Device and Host modes for the USB
+ *  Mass Storage Class.
+ *
+ *  @{
+ */
+
+#ifndef _MS_CLASS_COMMON_H_
+#define _MS_CLASS_COMMON_H_
+
+	/* Includes: */
+		#include "../../Core/StdDescriptors.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_MS_DRIVER)
+			#error Do not include this file directly. Include LUFA/Drivers/USB.h instead.
+		#endif
+
+	/* Macros: */
+		/** Magic signature for a Command Block Wrapper used in the Mass Storage Bulk-Only transport protocol. */
+		#define MS_CBW_SIGNATURE                               0x43425355UL
+
+		/** Magic signature for a Command Status Wrapper used in the Mass Storage Bulk-Only transport protocol. */
+		#define MS_CSW_SIGNATURE                               0x53425355UL
+
+		/** Mask for a Command Block Wrapper's flags attribute to specify a command with data sent from host-to-device. */
+		#define MS_COMMAND_DIR_DATA_OUT                        (0 << 7)
+
+		/** Mask for a Command Block Wrapper's flags attribute to specify a command with data sent from device-to-host. */
+		#define MS_COMMAND_DIR_DATA_IN                         (1 << 7)
+
+		/** \name SCSI Commands*/
+		//@{
+		/** SCSI Command Code for an INQUIRY command. */
+		#define SCSI_CMD_INQUIRY                               0x12
+
+		/** SCSI Command Code for a REQUEST SENSE command. */
+		#define SCSI_CMD_REQUEST_SENSE                         0x03
+
+		/** SCSI Command Code for a TEST UNIT READY command. */
+		#define SCSI_CMD_TEST_UNIT_READY                       0x00
+
+		/** SCSI Command Code for a READ CAPACITY (10) command. */
+		#define SCSI_CMD_READ_CAPACITY_10                      0x25
+
+		/** SCSI Command Code for a START STOP UNIT command. */
+		#define SCSI_CMD_START_STOP_UNIT                       0x1B
+
+		/** SCSI Command Code for a SEND DIAGNOSTIC command. */
+		#define SCSI_CMD_SEND_DIAGNOSTIC                       0x1D
+
+		/** SCSI Command Code for a PREVENT ALLOW MEDIUM REMOVAL command. */
+		#define SCSI_CMD_PREVENT_ALLOW_MEDIUM_REMOVAL          0x1E
+
+		/** SCSI Command Code for a WRITE (10) command. */
+		#define SCSI_CMD_WRITE_10                              0x2A
+
+		/** SCSI Command Code for a READ (10) command. */
+		#define SCSI_CMD_READ_10                               0x28
+
+		/** SCSI Command Code for a WRITE (6) command. */
+		#define SCSI_CMD_WRITE_6                               0x0A
+
+		/** SCSI Command Code for a READ (6) command. */
+		#define SCSI_CMD_READ_6                                0x08
+
+		/** SCSI Command Code for a VERIFY (10) command. */
+		#define SCSI_CMD_VERIFY_10                             0x2F
+
+		/** SCSI Command Code for a MODE SENSE (6) command. */
+		#define SCSI_CMD_MODE_SENSE_6                          0x1A
+
+		/** SCSI Command Code for a MODE SENSE (10) command. */
+		#define SCSI_CMD_MODE_SENSE_10                         0x5A
+		//@}
+
+		/** \name SCSI Sense Key Values */
+		//@{
+		/** SCSI Sense Code to indicate no error has occurred. */
+		#define SCSI_SENSE_KEY_GOOD                            0x00
+
+		/** SCSI Sense Code to indicate that the device has recovered from an error. */
+		#define SCSI_SENSE_KEY_RECOVERED_ERROR                 0x01
+
+		/** SCSI Sense Code to indicate that the device is not ready for a new command. */
+		#define SCSI_SENSE_KEY_NOT_READY                       0x02
+
+		/** SCSI Sense Code to indicate an error whilst accessing the medium. */
+		#define SCSI_SENSE_KEY_MEDIUM_ERROR                    0x03
+
+		/** SCSI Sense Code to indicate a hardware error has occurred. */
+		#define SCSI_SENSE_KEY_HARDWARE_ERROR                  0x04
+
+		/** SCSI Sense Code to indicate that an illegal request has been issued. */
+		#define SCSI_SENSE_KEY_ILLEGAL_REQUEST                 0x05
+
+		/** SCSI Sense Code to indicate that the unit requires attention from the host to indicate
+		 *  a reset event, medium removal or other condition.
+		 */
+		#define SCSI_SENSE_KEY_UNIT_ATTENTION                  0x06
+
+		/** SCSI Sense Code to indicate that a write attempt on a protected block has been made. */
+		#define SCSI_SENSE_KEY_DATA_PROTECT                    0x07
+
+		/** SCSI Sense Code to indicate an error while trying to write to a write-once medium. */
+		#define SCSI_SENSE_KEY_BLANK_CHECK                     0x08
+
+		/** SCSI Sense Code to indicate a vendor specific error has occurred. */
+		#define SCSI_SENSE_KEY_VENDOR_SPECIFIC                 0x09
+
+		/** SCSI Sense Code to indicate that an EXTENDED COPY command has aborted due to an error. */
+		#define SCSI_SENSE_KEY_COPY_ABORTED                    0x0A
+
+		/** SCSI Sense Code to indicate that the device has aborted the issued command. */
+		#define SCSI_SENSE_KEY_ABORTED_COMMAND                 0x0B
+
+		/** SCSI Sense Code to indicate an attempt to write past the end of a partition has been made. */
+		#define SCSI_SENSE_KEY_VOLUME_OVERFLOW                 0x0D
+
+		/** SCSI Sense Code to indicate that the source data did not match the data read from the medium. */
+		#define SCSI_SENSE_KEY_MISCOMPARE                      0x0E
+		//@}
+
+		/** \name SCSI Additional Sense Codes */
+		//@{
+		/** SCSI Additional Sense Code to indicate no additional sense information is available. */
+		#define SCSI_ASENSE_NO_ADDITIONAL_INFORMATION          0x00
+
+		/** SCSI Additional Sense Code to indicate that the logical unit (LUN) addressed is not ready. */
+		#define SCSI_ASENSE_LOGICAL_UNIT_NOT_READY             0x04
+
+		/** SCSI Additional Sense Code to indicate an invalid field was encountered while processing the issued command. */
+		#define SCSI_ASENSE_INVALID_FIELD_IN_CDB               0x24
+
+		/** SCSI Additional Sense Code to indicate that a medium that was previously indicated as not ready has now
+		 *  become ready for use.
+		 */
+		#define SCSI_ASENSE_NOT_READY_TO_READY_CHANGE          0x28
+
+		/** SCSI Additional Sense Code to indicate that an attempt to write to a protected area was made. */
+		#define SCSI_ASENSE_WRITE_PROTECTED                    0x27
+
+		/** SCSI Additional Sense Code to indicate an error whilst formatting the device medium. */
+		#define SCSI_ASENSE_FORMAT_ERROR                       0x31
+
+		/** SCSI Additional Sense Code to indicate an invalid command was issued. */
+		#define SCSI_ASENSE_INVALID_COMMAND                    0x20
+
+		/** SCSI Additional Sense Code to indicate a write to a block out outside of the medium's range was issued. */
+		#define SCSI_ASENSE_LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE 0x21
+
+		/** SCSI Additional Sense Code to indicate that no removable medium is inserted into the device. */
+		#define SCSI_ASENSE_MEDIUM_NOT_PRESENT                 0x3A
+		//@}
+
+		/** \name SCSI Additional Sense Key Code Qualifiers */
+		//@{
+		/** SCSI Additional Sense Qualifier Code to indicate no additional sense qualifier information is available. */
+		#define SCSI_ASENSEQ_NO_QUALIFIER                      0x00
+
+		/** SCSI Additional Sense Qualifier Code to indicate that a medium format command failed to complete. */
+		#define SCSI_ASENSEQ_FORMAT_COMMAND_FAILED             0x01
+
+		/** SCSI Additional Sense Qualifier Code to indicate that an initializing command must be issued before the issued
+		 *  command can be executed.
+		 */
+		#define SCSI_ASENSEQ_INITIALIZING_COMMAND_REQUIRED     0x02
+
+		/** SCSI Additional Sense Qualifier Code to indicate that an operation is currently in progress. */
+		#define SCSI_ASENSEQ_OPERATION_IN_PROGRESS             0x07
+		//@}
+
+	/* Enums: */
+		/** Enum for possible Class, Subclass and Protocol values of device and interface descriptors relating to the Mass
+		 *  Storage device class.
+		 */
+		enum MS_Descriptor_ClassSubclassProtocol_t
+		{
+			MS_CSCP_MassStorageClass          = 0x08, /**< Descriptor Class value indicating that the device or interface
+			                                           *   belongs to the Mass Storage class.
+			                                           */
+			MS_CSCP_SCSITransparentSubclass   = 0x06, /**< Descriptor Subclass value indicating that the device or interface
+			                                           *   belongs to the SCSI Transparent Command Set subclass of the Mass
+			                                           *   storage class.
+			                                           */
+			MS_CSCP_BulkOnlyTransportProtocol = 0x50, /**< Descriptor Protocol value indicating that the device or interface
+			                                           *   belongs to the Bulk Only Transport protocol of the Mass Storage class.
+			                                           */
+		};
+
+		/** Enum for the Mass Storage class specific control requests that can be issued by the USB bus host. */
+		enum MS_ClassRequests_t
+		{
+			MS_REQ_GetMaxLUN                  = 0xFE, /**< Mass Storage class-specific request to retrieve the total number of Logical
+			                                           *   Units (drives) in the SCSI device.
+			                                           */
+			MS_REQ_MassStorageReset           = 0xFF, /**< Mass Storage class-specific request to reset the Mass Storage interface,
+			                                           *   ready for the next command.
+		                                               */
+		};
+
+		/** Enum for the possible command status wrapper return status codes. */
+		enum MS_CommandStatusCodes_t
+		{
+			MS_SCSI_COMMAND_Pass              = 0, /**< Command completed with no error */
+			MS_SCSI_COMMAND_Fail              = 1, /**< Command failed to complete - host may check the exact error via a
+			                                        *   SCSI REQUEST SENSE command.
+			                                        */
+			MS_SCSI_COMMAND_PhaseError        = 2, /**< Command failed due to being invalid in the current phase. */
+		};
+
+	/* Type Defines: */
+		/** \brief Mass Storage Class Command Block Wrapper.
+		 *
+		 *  Type define for a Command Block Wrapper, used in the Mass Storage Bulk-Only Transport protocol.
+		 *
+		 *  \note Regardless of CPU architecture, these values should be stored as little endian.
+		 */
+		typedef struct
+		{
+			uint32_t Signature; /**< Command block signature, must be \ref MS_CBW_SIGNATURE to indicate a valid Command Block. */
+			uint32_t Tag; /**< Unique command ID value, to associate a command block wrapper with its command status wrapper. */
+			uint32_t DataTransferLength; /**< Length of the optional data portion of the issued command, in bytes. */
+			uint8_t  Flags; /**< Command block flags, indicating command data direction. */
+			uint8_t  LUN; /**< Logical Unit number this command is issued to. */
+			uint8_t  SCSICommandLength; /**< Length of the issued SCSI command within the SCSI command data array. */
+			uint8_t  SCSICommandData[16]; /**< Issued SCSI command in the Command Block. */
+		} ATTR_PACKED MS_CommandBlockWrapper_t;
+
+		/** \brief Mass Storage Class Command Status Wrapper.
+		 *
+		 *  Type define for a Command Status Wrapper, used in the Mass Storage Bulk-Only Transport protocol.
+		 *
+		 *  \note Regardless of CPU architecture, these values should be stored as little endian.
+		 */
+		typedef struct
+		{
+			uint32_t Signature; /**< Status block signature, must be \ref MS_CSW_SIGNATURE to indicate a valid Command Status. */
+			uint32_t Tag; /**< Unique command ID value, to associate a command block wrapper with its command status wrapper. */
+			uint32_t DataTransferResidue; /**< Number of bytes of data not processed in the SCSI command. */
+			uint8_t  Status; /**< Status code of the issued command - a value from the \ref MS_CommandStatusCodes_t enum. */
+		} ATTR_PACKED MS_CommandStatusWrapper_t;
+
+		/** \brief Mass Storage Class SCSI Sense Structure
+		 *
+		 *  Type define for a SCSI Sense structure. Structures of this type are filled out by the
+		 *  device via the \ref MS_Host_RequestSense() function, indicating the current sense data of the
+		 *  device (giving explicit error codes for the last issued command). For details of the
+		 *  structure contents, refer to the SCSI specifications.
+		 */
+		typedef struct
+		{
+			uint8_t  ResponseCode;
+
+			uint8_t  SegmentNumber;
+
+			unsigned SenseKey            : 4;
+			unsigned Reserved            : 1;
+			unsigned ILI                 : 1;
+			unsigned EOM                 : 1;
+			unsigned FileMark            : 1;
+
+			uint8_t  Information[4];
+			uint8_t  AdditionalLength;
+			uint8_t  CmdSpecificInformation[4];
+			uint8_t  AdditionalSenseCode;
+			uint8_t  AdditionalSenseQualifier;
+			uint8_t  FieldReplaceableUnitCode;
+			uint8_t  SenseKeySpecific[3];
+		} ATTR_PACKED SCSI_Request_Sense_Response_t;
+
+		/** \brief Mass Storage Class SCSI Inquiry Structure.
+		 *
+		 *  Type define for a SCSI Inquiry structure. Structures of this type are filled out by the
+		 *  device via the \ref MS_Host_GetInquiryData() function, retrieving the attached device's
+		 *  information.
+		 *
+		 *  For details of the structure contents, refer to the SCSI specifications.
+		 */
+		typedef struct
+		{
+			unsigned DeviceType          : 5;
+			unsigned PeripheralQualifier : 3;
+
+			unsigned Reserved            : 7;
+			unsigned Removable           : 1;
+
+			uint8_t  Version;
+
+			unsigned ResponseDataFormat  : 4;
+			unsigned Reserved2           : 1;
+			unsigned NormACA             : 1;
+			unsigned TrmTsk              : 1;
+			unsigned AERC                : 1;
+
+			uint8_t  AdditionalLength;
+			uint8_t  Reserved3[2];
+
+			unsigned SoftReset           : 1;
+			unsigned CmdQue              : 1;
+			unsigned Reserved4           : 1;
+			unsigned Linked              : 1;
+			unsigned Sync                : 1;
+			unsigned WideBus16Bit        : 1;
+			unsigned WideBus32Bit        : 1;
+			unsigned RelAddr             : 1;
+
+			uint8_t  VendorID[8];
+			uint8_t  ProductID[16];
+			uint8_t  RevisionID[4];
+		} ATTR_PACKED SCSI_Inquiry_Response_t;
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Common/PrinterClassCommon.h b/lib/lufa/LUFA/Drivers/USB/Class/Common/PrinterClassCommon.h
new file mode 100644
index 0000000000..2db830e048
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Class/Common/PrinterClassCommon.h
@@ -0,0 +1,119 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Common definitions and declarations for the library USB Printer Class driver.
+ *
+ *  Common definitions and declarations for the library USB Printer Class driver.
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the USB module driver
+ *        dispatch header located in LUFA/Drivers/USB.h.
+ */
+
+/** \ingroup Group_USBClassPrinter
+ *  \defgroup Group_USBClassPrinterCommon  Common Class Definitions
+ *
+ *  \section Sec_USBClassPrinterCommon_ModDescription Module Description
+ *  Constants, Types and Enum definitions that are common to both Device and Host modes for the USB
+ *  Printer Class.
+ *
+ *  @{
+ */
+
+#ifndef _PRINTER_CLASS_COMMON_H_
+#define _PRINTER_CLASS_COMMON_H_
+
+	/* Includes: */
+		#include "../../Core/StdDescriptors.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_PRINTER_DRIVER)
+			#error Do not include this file directly. Include LUFA/Drivers/USB.h instead.
+		#endif
+
+	/* Macros: */
+		/** \name Virtual Printer Status Line Masks */
+		//@{
+		/** Port status mask for a printer device, indicating that an error has *not* occurred. */
+		#define PRNT_PORTSTATUS_NOTERROR    (1 << 3)
+
+		/** Port status mask for a printer device, indicating that the device is currently selected. */
+		#define PRNT_PORTSTATUS_SELECT      (1 << 4)
+
+		/** Port status mask for a printer device, indicating that the device is currently out of paper. */
+		#define PRNT_PORTSTATUS_PAPEREMPTY  (1 << 5)
+		//@}
+
+	/* Enums: */
+		/** Enum for possible Class, Subclass and Protocol values of device and interface descriptors relating to the Printer
+		 *  device class.
+		 */
+		enum PRNT_Descriptor_ClassSubclassProtocol_t
+		{
+			PRNT_CSCP_PrinterClass          = 0x07, /**< Descriptor Class value indicating that the device or interface
+			                                         *   belongs to the Printer class.
+			                                         */
+			PRNT_CSCP_PrinterSubclass       = 0x01, /**< Descriptor Subclass value indicating that the device or interface
+			                                         *   belongs to the Printer subclass.
+			                                         */
+			PRNT_CSCP_BidirectionalProtocol = 0x02, /**< Descriptor Protocol value indicating that the device or interface
+			                                         *   belongs to the Bidirectional protocol of the Printer class.
+			                                         */
+		};
+
+		/** Enum for the Printer class specific control requests that can be issued by the USB bus host. */
+		enum PRNT_ClassRequests_t
+		{
+			PRNT_REQ_GetDeviceID            = 0x00, /**< Printer class-specific request to retrieve the Unicode ID
+			                                         *   string of the device, containing the device's name, manufacturer
+			                                         *   and supported printer languages.
+			                                         */
+			PRNT_REQ_GetPortStatus          = 0x01, /**< Printer class-specific request to get the current status of the
+			                                         *   virtual printer port, for device selection and ready states.
+			                                         */
+			PRNT_REQ_SoftReset              = 0x02, /**< Printer class-specific request to reset the device, ready for new
+			                                         *   printer commands.
+			                                         */
+		};
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Common/RNDISClassCommon.h b/lib/lufa/LUFA/Drivers/USB/Class/Common/RNDISClassCommon.h
new file mode 100644
index 0000000000..ade1af0673
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Class/Common/RNDISClassCommon.h
@@ -0,0 +1,411 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Common definitions and declarations for the library USB RNDIS Class driver.
+ *
+ *  Common definitions and declarations for the library USB RNDIS Class driver.
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the USB module driver
+ *        dispatch header located in LUFA/Drivers/USB.h.
+ */
+
+/** \ingroup Group_USBClassRNDIS
+ *  \defgroup Group_USBClassRNDISCommon  Common Class Definitions
+ *
+ *  \section Sec_USBClassRNDISCommon_ModDescription Module Description
+ *  Constants, Types and Enum definitions that are common to both Device and Host modes for the USB
+ *  RNDIS Class.
+ *
+ *  @{
+ */
+
+#ifndef _RNDIS_CLASS_COMMON_H_
+#define _RNDIS_CLASS_COMMON_H_
+
+	/* Macros: */
+		#define __INCLUDE_FROM_CDC_DRIVER
+
+	/* Includes: */
+		#include "../../Core/StdDescriptors.h"
+		#include "CDCClassCommon.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_RNDIS_DRIVER)
+			#error Do not include this file directly. Include LUFA/Drivers/USB.h instead.
+		#endif
+
+	/* Macros: */
+		/** Additional error code for RNDIS functions when a device returns a logical command failure. */
+		#define RNDIS_ERROR_LOGICAL_CMD_FAILED        0x80
+
+		/** Implemented RNDIS Version Major. */
+		#define REMOTE_NDIS_VERSION_MAJOR             0x01
+
+		/** Implemented RNDIS Version Minor. */
+		#define REMOTE_NDIS_VERSION_MINOR             0x00
+
+		/** \name RNDIS Message Values */
+		//@{
+		#define REMOTE_NDIS_PACKET_MSG                0x00000001UL
+		#define REMOTE_NDIS_INITIALIZE_MSG            0x00000002UL
+		#define REMOTE_NDIS_HALT_MSG                  0x00000003UL
+		#define REMOTE_NDIS_QUERY_MSG                 0x00000004UL
+		#define REMOTE_NDIS_SET_MSG                   0x00000005UL
+		#define REMOTE_NDIS_RESET_MSG                 0x00000006UL
+		#define REMOTE_NDIS_INDICATE_STATUS_MSG       0x00000007UL
+		#define REMOTE_NDIS_KEEPALIVE_MSG             0x00000008UL
+		//@}
+
+		/** \name RNDIS Response Values */
+		//@{
+		#define REMOTE_NDIS_INITIALIZE_CMPLT          0x80000002UL
+		#define REMOTE_NDIS_QUERY_CMPLT               0x80000004UL
+		#define REMOTE_NDIS_SET_CMPLT                 0x80000005UL
+		#define REMOTE_NDIS_RESET_CMPLT               0x80000006UL
+		#define REMOTE_NDIS_KEEPALIVE_CMPLT           0x80000008UL
+		//@}
+
+		/** \name RNDIS Status Values */
+		//@{
+		#define REMOTE_NDIS_STATUS_SUCCESS            0x00000000UL
+		#define REMOTE_NDIS_STATUS_FAILURE            0xC0000001UL
+		#define REMOTE_NDIS_STATUS_INVALID_DATA       0xC0010015UL
+		#define REMOTE_NDIS_STATUS_NOT_SUPPORTED      0xC00000BBUL
+		#define REMOTE_NDIS_STATUS_MEDIA_CONNECT      0x4001000BUL
+		#define REMOTE_NDIS_STATUS_MEDIA_DISCONNECT   0x4001000CUL
+		//@}
+
+		/** \name RNDIS Media States */
+		//@{
+		#define REMOTE_NDIS_MEDIA_STATE_CONNECTED     0x00000000UL
+		#define REMOTE_NDIS_MEDIA_STATE_DISCONNECTED  0x00000001UL
+		//@}
+
+		/** \name RNDIS Media Types */
+		//@{
+		#define REMOTE_NDIS_MEDIUM_802_3              0x00000000UL
+		//@}
+
+		/** \name RNDIS Connection Types */
+		//@{
+		#define REMOTE_NDIS_DF_CONNECTIONLESS	      0x00000001UL
+		#define REMOTE_NDIS_DF_CONNECTION_ORIENTED    0x00000002UL
+		//@}
+
+		/** \name RNDIS Packet Types */
+		//@{
+		#define REMOTE_NDIS_PACKET_DIRECTED           0x00000001UL
+		#define REMOTE_NDIS_PACKET_MULTICAST          0x00000002UL
+		#define REMOTE_NDIS_PACKET_ALL_MULTICAST      0x00000004UL
+		#define REMOTE_NDIS_PACKET_BROADCAST          0x00000008UL
+		#define REMOTE_NDIS_PACKET_SOURCE_ROUTING     0x00000010UL
+		#define REMOTE_NDIS_PACKET_PROMISCUOUS        0x00000020UL
+		#define REMOTE_NDIS_PACKET_SMT                0x00000040UL
+		#define REMOTE_NDIS_PACKET_ALL_LOCAL          0x00000080UL
+		#define REMOTE_NDIS_PACKET_GROUP              0x00001000UL
+		#define REMOTE_NDIS_PACKET_ALL_FUNCTIONAL     0x00002000UL
+		#define REMOTE_NDIS_PACKET_FUNCTIONAL         0x00004000UL
+		#define REMOTE_NDIS_PACKET_MAC_FRAME          0x00008000UL
+		//@}
+
+		/** \name RNDIS OID Values */
+		//@{
+		#define OID_GEN_SUPPORTED_LIST                0x00010101UL
+		#define OID_GEN_HARDWARE_STATUS               0x00010102UL
+		#define OID_GEN_MEDIA_SUPPORTED               0x00010103UL
+		#define OID_GEN_MEDIA_IN_USE                  0x00010104UL
+		#define OID_GEN_MAXIMUM_FRAME_SIZE            0x00010106UL
+		#define OID_GEN_MAXIMUM_TOTAL_SIZE            0x00010111UL
+		#define OID_GEN_LINK_SPEED                    0x00010107UL
+		#define OID_GEN_TRANSMIT_BLOCK_SIZE           0x0001010AUL
+		#define OID_GEN_RECEIVE_BLOCK_SIZE            0x0001010BUL
+		#define OID_GEN_VENDOR_ID                     0x0001010CUL
+		#define OID_GEN_VENDOR_DESCRIPTION            0x0001010DUL
+		#define OID_GEN_CURRENT_PACKET_FILTER         0x0001010EUL
+		#define OID_GEN_MAXIMUM_TOTAL_SIZE            0x00010111UL
+		#define OID_GEN_MEDIA_CONNECT_STATUS          0x00010114UL
+		#define OID_GEN_PHYSICAL_MEDIUM               0x00010202UL
+		#define OID_GEN_XMIT_OK                       0x00020101UL
+		#define OID_GEN_RCV_OK                        0x00020102UL
+		#define OID_GEN_XMIT_ERROR                    0x00020103UL
+		#define OID_GEN_RCV_ERROR                     0x00020104UL
+		#define OID_GEN_RCV_NO_BUFFER                 0x00020105UL
+		#define OID_802_3_PERMANENT_ADDRESS           0x01010101UL
+		#define OID_802_3_CURRENT_ADDRESS             0x01010102UL
+		#define OID_802_3_MULTICAST_LIST              0x01010103UL
+		#define OID_802_3_MAXIMUM_LIST_SIZE           0x01010104UL
+		#define OID_802_3_RCV_ERROR_ALIGNMENT         0x01020101UL
+		#define OID_802_3_XMIT_ONE_COLLISION          0x01020102UL
+		#define OID_802_3_XMIT_MORE_COLLISIONS        0x01020103UL
+		//@}
+
+		/** Maximum size in bytes of an Ethernet frame according to the Ethernet standard. */
+		#define ETHERNET_FRAME_SIZE_MAX               1500
+
+	/* Enums: */
+		/** Enum for the RNDIS class specific control requests that can be issued by the USB bus host. */
+		enum RNDIS_ClassRequests_t
+		{
+			RNDIS_REQ_SendEncapsulatedCommand = 0x00, /**< RNDIS request to issue a host-to-device NDIS command. */
+			RNDIS_REQ_GetEncapsulatedResponse = 0x01, /**< RNDIS request to issue a device-to-host NDIS response. */
+		};
+
+		/** Enum for the possible NDIS adapter states. */
+		enum RNDIS_States_t
+		{
+			RNDIS_Uninitialized    = 0, /**< Adapter currently uninitialized. */
+			RNDIS_Initialized      = 1, /**< Adapter currently initialized but not ready for data transfers. */
+			RNDIS_Data_Initialized = 2, /**< Adapter currently initialized and ready for data transfers. */
+		};
+
+		/** Enum for the RNDIS class specific notification requests that can be issued by a RNDIS device to a host. */
+		enum RNDIS_ClassNotifications_t
+		{
+			RNDIS_NOTIF_ResponseAvailable = 0x01, /**< Notification request value for a RNDIS Response Available notification. */
+		};
+
+		/** Enum for the NDIS hardware states. */
+		enum NDIS_Hardware_Status_t
+		{
+			NDIS_HardwareStatus_Ready, /**< Hardware Ready to accept commands from the host. */
+			NDIS_HardwareStatus_Initializing, /**< Hardware busy initializing. */
+			NDIS_HardwareStatus_Reset, /**< Hardware reset. */
+			NDIS_HardwareStatus_Closing, /**< Hardware currently closing. */
+			NDIS_HardwareStatus_NotReady /**< Hardware not ready to accept commands from the host. */
+		};
+
+	/* Type Defines: */
+		/** \brief MAC Address Structure.
+		 *
+		 *  Type define for a physical MAC address of a device on a network.
+		 */
+		typedef struct
+		{
+			uint8_t Octets[6]; /**< Individual bytes of a MAC address */
+		} ATTR_PACKED MAC_Address_t;
+
+		/** \brief RNDIS Common Message Header Structure.
+		 *
+		 *  Type define for a RNDIS message header, sent before RNDIS messages.
+		 *
+		 *  \note Regardless of CPU architecture, these values should be stored as little endian.
+		 */
+		typedef struct
+		{
+			uint32_t MessageType; /**< RNDIS message type, a \c REMOTE_NDIS_*_MSG constant */
+			uint32_t MessageLength; /**< Total length of the RNDIS message, in bytes */
+		} ATTR_PACKED RNDIS_Message_Header_t;
+
+		/** \brief RNDIS Message Structure.
+		 *
+		 *  Type define for a RNDIS packet message, used to encapsulate Ethernet packets sent to and from the adapter.
+		 *
+		 *  \note Regardless of CPU architecture, these values should be stored as little endian.
+		 */
+		typedef struct
+		{
+			uint32_t MessageType;
+			uint32_t MessageLength;
+			uint32_t DataOffset;
+			uint32_t DataLength;
+			uint32_t OOBDataOffset;
+			uint32_t OOBDataLength;
+			uint32_t NumOOBDataElements;
+			uint32_t PerPacketInfoOffset;
+			uint32_t PerPacketInfoLength;
+			uint32_t VcHandle;
+			uint32_t Reserved;
+		} ATTR_PACKED RNDIS_Packet_Message_t;
+
+		/** \brief RNDIS Initialization Message Structure.
+		 *
+		 *  Type define for a RNDIS Initialize command message.
+		 *
+		 *  \note Regardless of CPU architecture, these values should be stored as little endian.
+		 */
+		typedef struct
+		{
+			uint32_t MessageType;
+			uint32_t MessageLength;
+			uint32_t RequestId;
+
+			uint32_t MajorVersion;
+			uint32_t MinorVersion;
+			uint32_t MaxTransferSize;
+		} ATTR_PACKED RNDIS_Initialize_Message_t;
+
+		/** \brief RNDIS Initialize Complete Message Structure.
+		 *
+		 *  Type define for a RNDIS Initialize Complete response message.
+		 *
+		 *  \note Regardless of CPU architecture, these values should be stored as little endian.
+		 */
+		typedef struct
+		{
+			uint32_t MessageType;
+			uint32_t MessageLength;
+			uint32_t RequestId;
+			uint32_t Status;
+
+			uint32_t MajorVersion;
+			uint32_t MinorVersion;
+			uint32_t DeviceFlags;
+			uint32_t Medium;
+			uint32_t MaxPacketsPerTransfer;
+			uint32_t MaxTransferSize;
+			uint32_t PacketAlignmentFactor;
+			uint32_t AFListOffset;
+			uint32_t AFListSize;
+		} ATTR_PACKED RNDIS_Initialize_Complete_t;
+
+		/** \brief RNDIS Keep Alive Message Structure.
+		 *
+		 *  Type define for a RNDIS Keep Alive command message.
+		 *
+		 *  \note Regardless of CPU architecture, these values should be stored as little endian.
+		 */
+		typedef struct
+		{
+			uint32_t MessageType;
+			uint32_t MessageLength;
+			uint32_t RequestId;
+		} ATTR_PACKED RNDIS_KeepAlive_Message_t;
+
+		/** \brief RNDIS Keep Alive Complete Message Structure.
+		 *
+		 *  Type define for a RNDIS Keep Alive Complete response message.
+		 *
+		 *  \note Regardless of CPU architecture, these values should be stored as little endian.
+		 */
+		typedef struct
+		{
+			uint32_t MessageType;
+			uint32_t MessageLength;
+			uint32_t RequestId;
+			uint32_t Status;
+		} ATTR_PACKED RNDIS_KeepAlive_Complete_t;
+
+		/** \brief RNDIS Reset Complete Message Structure.
+		 *
+		 *  Type define for a RNDIS Reset Complete response message.
+		 *
+		 *  \note Regardless of CPU architecture, these values should be stored as little endian.
+		 */
+		typedef struct
+		{
+			uint32_t MessageType;
+			uint32_t MessageLength;
+			uint32_t Status;
+
+			uint32_t AddressingReset;
+		} ATTR_PACKED RNDIS_Reset_Complete_t;
+
+		/** \brief RNDIS OID Property Set Message Structure.
+		 *
+		 *  Type define for a RNDIS OID Property Set command message.
+		 *
+		 *  \note Regardless of CPU architecture, these values should be stored as little endian.
+		 */
+		typedef struct
+		{
+			uint32_t MessageType;
+			uint32_t MessageLength;
+			uint32_t RequestId;
+
+			uint32_t Oid;
+			uint32_t InformationBufferLength;
+			uint32_t InformationBufferOffset;
+			uint32_t DeviceVcHandle;
+		} ATTR_PACKED RNDIS_Set_Message_t;
+
+		/** \brief RNDIS OID Property Set Complete Message Structure.
+		 *
+		 *  Type define for a RNDIS OID Property Set Complete response message.
+		 *
+		 *  \note Regardless of CPU architecture, these values should be stored as little endian.
+		 */
+		typedef struct
+		{
+			uint32_t MessageType;
+			uint32_t MessageLength;
+			uint32_t RequestId;
+			uint32_t Status;
+		} ATTR_PACKED RNDIS_Set_Complete_t;
+
+		/** \brief RNDIS OID Property Query Message Structure.
+		 *
+		 *  Type define for a RNDIS OID Property Query command message.
+		 *
+		 *  \note Regardless of CPU architecture, these values should be stored as little endian.
+		 */
+		typedef struct
+		{
+			uint32_t MessageType;
+			uint32_t MessageLength;
+			uint32_t RequestId;
+
+			uint32_t Oid;
+			uint32_t InformationBufferLength;
+			uint32_t InformationBufferOffset;
+			uint32_t DeviceVcHandle;
+		} ATTR_PACKED RNDIS_Query_Message_t;
+
+		/** \brief RNDIS OID Property Query Complete Message Structure.
+		 *
+		 *  Type define for a RNDIS OID Property Query Complete response message.
+		 *
+		 *  \note Regardless of CPU architecture, these values should be stored as little endian.
+		 */
+		typedef struct
+		{
+			uint32_t MessageType;
+			uint32_t MessageLength;
+			uint32_t RequestId;
+			uint32_t Status;
+
+			uint32_t InformationBufferLength;
+			uint32_t InformationBufferOffset;
+		} ATTR_PACKED RNDIS_Query_Complete_t;
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Common/StillImageClassCommon.h b/lib/lufa/LUFA/Drivers/USB/Class/Common/StillImageClassCommon.h
new file mode 100644
index 0000000000..7608b18cc4
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Class/Common/StillImageClassCommon.h
@@ -0,0 +1,161 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Common definitions and declarations for the library USB Still Image Class driver.
+ *
+ *  Common definitions and declarations for the library USB Still Image Class driver.
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the USB module driver
+ *        dispatch header located in LUFA/Drivers/USB.h.
+ */
+
+/** \ingroup Group_USBClassSI
+ *  \defgroup Group_USBClassSICommon  Common Class Definitions
+ *
+ *  \section Sec_USBClassSICommon_ModDescription Module Description
+ *  Constants, Types and Enum definitions that are common to both Device and Host modes for the USB
+ *  Still Image Class.
+ *
+ *  @{
+ */
+
+#ifndef _SI_CLASS_COMMON_H_
+#define _SI_CLASS_COMMON_H_
+
+	/* Includes: */
+		#include "../../Core/StdDescriptors.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_SI_DRIVER)
+			#error Do not include this file directly. Include LUFA/Drivers/USB.h instead.
+		#endif
+
+	/* Macros: */
+		/** Length in bytes of a given Unicode string's character length.
+		 *
+		 *  \param[in] Chars  Total number of Unicode characters in the string.
+		 *
+		 *  \return Number of bytes of the given unicode string.
+		 */
+		#define UNICODE_STRING_LENGTH(Chars)  ((Chars) << 1)
+
+		/** Used in the DataLength field of a PIMA container, to give the total container size in bytes for
+		 *  a command container.
+		 *
+		 *  \param[in] Params  Number of parameters which are to be sent in the \c Param field of the container.
+		 */
+		#define PIMA_COMMAND_SIZE(Params)     ((sizeof(PIMA_Container_t) - 12) + ((Params) * sizeof(uint32_t)))
+
+		/** Used in the DataLength field of a PIMA container, to give the total container size in bytes for
+		 *  a data container.
+		 *
+		 *  \param[in] DataLen  Length in bytes of the data in the container.
+		 */
+		#define PIMA_DATA_SIZE(DataLen)       ((sizeof(PIMA_Container_t) - 12) + (DataLen))
+
+	/* Enums: */
+		/** Enum for the possible PIMA contains types. */
+		enum PIMA_Container_Types_t
+		{
+			PIMA_CONTAINER_Undefined     = 0, /**< Undefined container type. */
+			PIMA_CONTAINER_CommandBlock  = 1, /**< Command Block container type. */
+			PIMA_CONTAINER_DataBlock     = 2, /**< Data Block container type. */
+			PIMA_CONTAINER_ResponseBlock = 3, /**< Response container type. */
+			PIMA_CONTAINER_EventBlock    = 4, /**< Event Block container type. */
+		};
+
+	/* Enums: */
+		/** Enum for possible Class, Subclass and Protocol values of device and interface descriptors relating to the
+		 *  Still Image device class.
+		 */
+		enum SI_Descriptor_ClassSubclassProtocol_t
+		{
+			SI_CSCP_StillImageClass             = 0x06, /**< Descriptor Class value indicating that the device or interface
+			                                             *   belongs to the Still Image class.
+			                                             */
+			SI_CSCP_StillImageSubclass          = 0x01, /**< Descriptor Subclass value indicating that the device or interface
+			                                             *   belongs to the Still Image subclass.
+			                                             */
+			SI_CSCP_BulkOnlyProtocol            = 0x01, /**< Descriptor Protocol value indicating that the device or interface
+			                                             *   belongs to the Bulk Only Transport protocol of the Still Image class.
+			                                             */
+		};
+
+		/** Enums for the possible status codes of a returned Response Block from an attached PIMA compliant Still Image device. */
+		enum PIMA_ResponseCodes_t
+		{
+			PIMA_RESPONSE_OK                    = 1, /**< Response code indicating no error in the issued command. */
+			PIMA_RESPONSE_GeneralError          = 2, /**< Response code indicating a general error while processing the
+			                                          *  issued command.
+			                                          */
+			PIMA_RESPONSE_SessionNotOpen        = 3, /**< Response code indicating that the sent command requires an open
+			                                          *   session before being issued.
+			                                          */
+			PIMA_RESPONSE_InvalidTransaction    = 4, /**< Response code indicating an invalid transaction occurred. */
+			PIMA_RESPONSE_OperationNotSupported = 5, /**< Response code indicating that the issued command is not supported
+			                                          *   by the attached device.
+			                                          */
+			PIMA_RESPONSE_ParameterNotSupported = 6, /**< Response code indicating that one or more of the issued command's
+			                                          *   parameters are not supported by the device.
+			                                          */
+		};
+
+	/* Type Defines: */
+		/** \brief PIMA Still Image Device Command/Response Container.
+		 *
+		 *  Type define for a PIMA container, use to send commands and receive responses to and from an
+		 *  attached Still Image device.
+		 *
+		 *  \note Regardless of CPU architecture, these values should be stored as little endian.
+		 */
+		typedef struct
+		{
+			uint32_t DataLength; /**< Length of the container and data, in bytes. */
+			uint16_t Type; /**< Container type, a value from the \ref PIMA_Container_Types_t enum. */
+			uint16_t Code; /**< Command, event or response code of the container. */
+			uint32_t TransactionID; /**< Unique container ID to link blocks together. */
+			uint32_t Params[3]; /**< Block parameters to be issued along with the block code (command blocks only). */
+		} ATTR_PACKED PIMA_Container_t;
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Device/AudioClassDevice.c b/lib/lufa/LUFA/Drivers/USB/Class/Device/AudioClassDevice.c
new file mode 100644
index 0000000000..08cbeb7061
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Class/Device/AudioClassDevice.c
@@ -0,0 +1,197 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+#define  __INCLUDE_FROM_USB_DRIVER
+#include "../../Core/USBMode.h"
+
+#if defined(USB_CAN_BE_DEVICE)
+
+#define  __INCLUDE_FROM_AUDIO_DRIVER
+#define  __INCLUDE_FROM_AUDIO_DEVICE_C
+#include "AudioClassDevice.h"
+
+void Audio_Device_ProcessControlRequest(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo)
+{
+	if (!(Endpoint_IsSETUPReceived()))
+	  return;
+
+	if ((USB_ControlRequest.bmRequestType & CONTROL_REQTYPE_RECIPIENT) == REQREC_INTERFACE)
+	{
+		uint8_t InterfaceIndex = (USB_ControlRequest.wIndex & 0xFF);
+
+		if ((InterfaceIndex != AudioInterfaceInfo->Config.ControlInterfaceNumber) &&
+		    (InterfaceIndex != AudioInterfaceInfo->Config.StreamingInterfaceNumber))
+		{
+			return;
+		}
+	}
+	else if ((USB_ControlRequest.bmRequestType & CONTROL_REQTYPE_RECIPIENT) == REQREC_ENDPOINT)
+	{
+		uint8_t EndpointAddress = (USB_ControlRequest.wIndex & 0xFF);
+
+		if ((EndpointAddress != AudioInterfaceInfo->Config.DataINEndpoint.Address) &&
+		    (EndpointAddress != AudioInterfaceInfo->Config.DataOUTEndpoint.Address))
+		{
+			return;
+		}
+	}
+
+	switch (USB_ControlRequest.bRequest)
+	{
+		case REQ_SetInterface:
+			if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_INTERFACE))
+			{
+				Endpoint_ClearSETUP();
+				Endpoint_ClearStatusStage();
+
+				AudioInterfaceInfo->State.InterfaceEnabled = ((USB_ControlRequest.wValue & 0xFF) != 0);
+				EVENT_Audio_Device_StreamStartStop(AudioInterfaceInfo);
+			}
+
+			break;
+		case AUDIO_REQ_GetStatus:
+			if ((USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) ||
+			    (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_ENDPOINT)))
+			{
+				Endpoint_ClearSETUP();
+				Endpoint_ClearStatusStage();
+			}
+
+			break;
+		case AUDIO_REQ_SetCurrent:
+		case AUDIO_REQ_SetMinimum:
+		case AUDIO_REQ_SetMaximum:
+		case AUDIO_REQ_SetResolution:
+			if ((USB_ControlRequest.bmRequestType & CONTROL_REQTYPE_RECIPIENT) == REQREC_ENDPOINT)
+			{
+				uint8_t EndpointProperty = USB_ControlRequest.bRequest;
+				uint8_t EndpointAddress  = (uint8_t)USB_ControlRequest.wIndex;
+				uint8_t EndpointControl  = (USB_ControlRequest.wValue >> 8);
+
+				if (CALLBACK_Audio_Device_GetSetEndpointProperty(AudioInterfaceInfo, EndpointProperty, EndpointAddress,
+				                                                 EndpointControl, NULL, NULL))
+				{
+					uint16_t ValueLength = USB_ControlRequest.wLength;
+					uint8_t  Value[ValueLength];
+
+					Endpoint_ClearSETUP();
+					Endpoint_Read_Control_Stream_LE(Value, ValueLength);
+					Endpoint_ClearIN();
+
+					CALLBACK_Audio_Device_GetSetEndpointProperty(AudioInterfaceInfo, EndpointProperty, EndpointAddress,
+					                                             EndpointControl, &ValueLength, Value);
+				}
+			}
+			else if ((USB_ControlRequest.bmRequestType & CONTROL_REQTYPE_RECIPIENT) == REQREC_INTERFACE)
+			{
+				uint8_t  Property  = USB_ControlRequest.bRequest;
+				uint8_t  Entity    = (USB_ControlRequest.wIndex >> 8);
+				uint16_t Parameter = USB_ControlRequest.wValue;
+
+				if (CALLBACK_Audio_Device_GetSetInterfaceProperty(AudioInterfaceInfo, Property, Entity,
+				                                                  Parameter, NULL, NULL))
+				{
+					uint16_t ValueLength = USB_ControlRequest.wLength;
+					uint8_t  Value[ValueLength];
+
+					Endpoint_ClearSETUP();
+					Endpoint_Read_Control_Stream_LE(Value, ValueLength);
+					Endpoint_ClearIN();
+
+					CALLBACK_Audio_Device_GetSetInterfaceProperty(AudioInterfaceInfo, Property, Entity,
+				                                                  Parameter, &ValueLength, Value);
+				}
+			}
+
+			break;
+		case AUDIO_REQ_GetCurrent:
+		case AUDIO_REQ_GetMinimum:
+		case AUDIO_REQ_GetMaximum:
+		case AUDIO_REQ_GetResolution:
+			if ((USB_ControlRequest.bmRequestType & CONTROL_REQTYPE_RECIPIENT) == REQREC_ENDPOINT)
+			{
+				uint8_t  EndpointProperty = USB_ControlRequest.bRequest;
+				uint8_t  EndpointAddress  = (uint8_t)USB_ControlRequest.wIndex;
+				uint8_t  EndpointControl  = (USB_ControlRequest.wValue >> 8);
+				uint16_t ValueLength      = USB_ControlRequest.wLength;
+				uint8_t  Value[ValueLength];
+
+				if (CALLBACK_Audio_Device_GetSetEndpointProperty(AudioInterfaceInfo, EndpointProperty, EndpointAddress,
+				                                                 EndpointControl, &ValueLength, Value))
+				{
+					Endpoint_ClearSETUP();
+					Endpoint_Write_Control_Stream_LE(Value, ValueLength);
+					Endpoint_ClearOUT();
+				}
+			}
+			else if ((USB_ControlRequest.bmRequestType & CONTROL_REQTYPE_RECIPIENT) == REQREC_INTERFACE)
+			{
+				uint8_t  Property    = USB_ControlRequest.bRequest;
+				uint8_t  Entity      = (USB_ControlRequest.wIndex >> 8);
+				uint16_t Parameter   = USB_ControlRequest.wValue;
+				uint16_t ValueLength = USB_ControlRequest.wLength;
+				uint8_t  Value[ValueLength];
+
+				if (CALLBACK_Audio_Device_GetSetInterfaceProperty(AudioInterfaceInfo, Property, Entity,
+				                                                  Parameter, &ValueLength, Value))
+				{
+					Endpoint_ClearSETUP();
+					Endpoint_Write_Control_Stream_LE(Value, ValueLength);
+					Endpoint_ClearOUT();
+				}
+			}
+
+			break;
+	}
+}
+
+bool Audio_Device_ConfigureEndpoints(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo)
+{
+	memset(&AudioInterfaceInfo->State, 0x00, sizeof(AudioInterfaceInfo->State));
+
+	AudioInterfaceInfo->Config.DataINEndpoint.Type  = EP_TYPE_ISOCHRONOUS;
+	AudioInterfaceInfo->Config.DataOUTEndpoint.Type = EP_TYPE_ISOCHRONOUS;
+
+	if (!(Endpoint_ConfigureEndpointTable(&AudioInterfaceInfo->Config.DataINEndpoint, 1)))
+	  return false;
+
+	if (!(Endpoint_ConfigureEndpointTable(&AudioInterfaceInfo->Config.DataOUTEndpoint, 1)))
+	  return false;
+
+	return true;
+}
+
+void Audio_Device_Event_Stub(void)
+{
+
+}
+
+#endif
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Device/AudioClassDevice.h b/lib/lufa/LUFA/Drivers/USB/Class/Device/AudioClassDevice.h
new file mode 100644
index 0000000000..ca63511b20
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Class/Device/AudioClassDevice.h
@@ -0,0 +1,396 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Device mode driver for the library USB Audio 1.0 Class driver.
+ *
+ *  Device mode driver for the library USB Audio 1.0 Class driver.
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the USB module driver
+ *        dispatch header located in LUFA/Drivers/USB.h.
+ */
+
+/** \ingroup Group_USBClassAudio
+ *  \defgroup Group_USBClassAudioDevice Audio 1.0 Class Device Mode Driver
+ *
+ *  \section Sec_USBClassAudioDevice_Dependencies Module Source Dependencies
+ *  The following files must be built with any user project that uses this module:
+ *    - LUFA/Drivers/USB/Class/Device/AudioClassDevice.c <i>(Makefile source module name: LUFA_SRC_USBCLASS)</i>
+ *
+ *  \section Sec_USBClassAudioDevice_ModDescription Module Description
+ *  Device Mode USB Class driver framework interface, for the Audio 1.0 USB Class driver.
+ *
+ *  @{
+ */
+
+#ifndef _AUDIO_CLASS_DEVICE_H_
+#define _AUDIO_CLASS_DEVICE_H_
+
+	/* Includes: */
+		#include "../../USB.h"
+		#include "../Common/AudioClassCommon.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_AUDIO_DRIVER)
+			#error Do not include this file directly. Include LUFA/Drivers/USB.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Type Defines: */
+			/** \brief Audio Class Device Mode Configuration and State Structure.
+			 *
+			 *  Class state structure. An instance of this structure should be made for each Audio interface
+			 *  within the user application, and passed to each of the Audio class driver functions as the
+			 *  \c AudioInterfaceInfo parameter. This stores each Audio interface's configuration and state information.
+			 */
+			typedef struct
+			{
+				struct
+				{
+					uint8_t  ControlInterfaceNumber; /**< Index of the Audio Control interface within the device this
+					                                  *   structure controls.
+					                                  */
+					uint8_t  StreamingInterfaceNumber; /**< Index of the Audio Streaming interface within the device this
+														*   structure controls.
+														*/
+
+					USB_Endpoint_Table_t DataINEndpoint; /**< Data IN endpoint configuration table. */
+					USB_Endpoint_Table_t DataOUTEndpoint; /**< Data OUT endpoint configuration table. */
+				} Config; /**< Config data for the USB class interface within the device. All elements in this section
+				           *   <b>must</b> be set or the interface will fail to enumerate and operate correctly.
+				           */
+				struct
+				{
+					bool InterfaceEnabled; /**< Set and cleared by the class driver to indicate if the host has enabled the streaming endpoints
+					                        *   of the Audio Streaming interface.
+					                        */
+				} State; /**< State data for the USB class interface within the device. All elements in this section
+				          *   are reset to their defaults when the interface is enumerated.
+				          */
+			} USB_ClassInfo_Audio_Device_t;
+
+		/* Function Prototypes: */
+			/** Configures the endpoints of a given Audio interface, ready for use. This should be linked to the library
+			 *  \ref EVENT_USB_Device_ConfigurationChanged() event so that the endpoints are configured when the configuration containing the
+			 *  given Audio interface is selected.
+			 *
+			 *  \param[in,out] AudioInterfaceInfo  Pointer to a structure containing an Audio Class configuration and state.
+			 *
+			 *  \return Boolean \c true if the endpoints were successfully configured, \c false otherwise.
+			 */
+			bool Audio_Device_ConfigureEndpoints(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Processes incoming control requests from the host, that are directed to the given Audio class interface. This should be
+			 *  linked to the library \ref EVENT_USB_Device_ControlRequest() event.
+			 *
+			 *  \param[in,out] AudioInterfaceInfo  Pointer to a structure containing an Audio Class configuration and state.
+			 */
+			void Audio_Device_ProcessControlRequest(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Audio class driver callback for the setting and retrieval of streaming endpoint properties. This callback must be implemented
+			 *  in the user application to handle property manipulations on streaming audio endpoints.
+			 *
+			 *  When the DataLength parameter is NULL, this callback should only indicate whether the specified operation is valid for
+			 *  the given endpoint index, and should return as fast as possible. When non-NULL, this value may be altered for GET operations
+			 *  to indicate the size of the retrieved data.
+			 *
+			 *  \note The length of the retrieved data stored into the Data buffer on GET operations should not exceed the initial value
+			 *        of the \c DataLength parameter.
+			 *
+			 *  \param[in,out] AudioInterfaceInfo  Pointer to a structure containing an Audio Class configuration and state.
+			 *  \param[in]     EndpointProperty    Property of the endpoint to get or set, a value from \ref Audio_ClassRequests_t.
+			 *  \param[in]     EndpointAddress     Address of the streaming endpoint whose property is being referenced.
+			 *  \param[in]     EndpointControl     Parameter of the endpoint to get or set, a value from \ref Audio_EndpointControls_t.
+			 *  \param[in,out] DataLength          For SET operations, the length of the parameter data to set. For GET operations, the maximum
+			 *                                     length of the retrieved data. When NULL, the function should return whether the given property
+			 *                                     and parameter is valid for the requested endpoint without reading or modifying the Data buffer.
+			 *  \param[in,out] Data                Pointer to a location where the parameter data is stored for SET operations, or where
+			 *                                     the retrieved data is to be stored for GET operations.
+			 *
+			 *  \return Boolean \c true if the property GET/SET was successful, \c false otherwise
+			 */
+			bool CALLBACK_Audio_Device_GetSetEndpointProperty(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo,
+			                                                  const uint8_t EndpointProperty,
+			                                                  const uint8_t EndpointAddress,
+			                                                  const uint8_t EndpointControl,
+			                                                  uint16_t* const DataLength,
+			                                                  uint8_t* Data) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Audio class driver callback for the setting and retrieval of streaming interface properties. This callback must be implemented
+			 *  in the user application to handle property manipulations on streaming audio interfaces.
+			 *
+			 *  When the DataLength parameter is NULL, this callback should only indicate whether the specified operation is valid for
+			 *  the given entity and should return as fast as possible. When non-NULL, this value may be altered for GET operations
+			 *  to indicate the size of the retrieved data.
+			 *
+			 *  \note The length of the retrieved data stored into the Data buffer on GET operations should not exceed the initial value
+			 *        of the \c DataLength parameter.
+			 *
+			 *  \param[in,out] AudioInterfaceInfo  Pointer to a structure containing an Audio Class configuration and state.
+			 *  \param[in]     Property            Property of the interface to get or set, a value from \ref Audio_ClassRequests_t.
+			 *  \param[in]     EntityAddress       Address of the audio entity whose property is being referenced.
+			 *  \param[in]     Parameter           Parameter of the entity to get or set, specific to each type of entity (see USB Audio specification).
+			 *  \param[in,out] DataLength          For SET operations, the length of the parameter data to set. For GET operations, the maximum
+			 *                                     length of the retrieved data. When NULL, the function should return whether the given property
+			 *                                     and parameter is valid for the requested endpoint without reading or modifying the Data buffer.
+			 *  \param[in,out] Data                Pointer to a location where the parameter data is stored for SET operations, or where
+			 *                                     the retrieved data is to be stored for GET operations.
+			 *
+			 *  \return Boolean \c true if the property GET/SET was successful, \c false otherwise
+			 */
+			bool CALLBACK_Audio_Device_GetSetInterfaceProperty(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo,
+			                                                   const uint8_t Property,
+			                                                   const uint8_t EntityAddress,
+			                                                   const uint16_t Parameter,
+			                                                   uint16_t* const DataLength,
+			                                                   uint8_t* Data) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Audio class driver event for an Audio Stream start/stop change. This event fires each time the device receives a stream enable or
+			 *  disable control request from the host, to start and stop the audio stream. The current state of the stream can be determined by the
+			 *  State.InterfaceEnabled value inside the Audio interface structure passed as a parameter.
+			 *
+			 *  \param[in,out] AudioInterfaceInfo  Pointer to a structure containing an Audio Class configuration and state.
+			 */
+			void EVENT_Audio_Device_StreamStartStop(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo);
+
+		/* Inline Functions: */
+			/** General management task for a given Audio class interface, required for the correct operation of the interface. This should
+			 *  be called frequently in the main program loop, before the master USB management task \ref USB_USBTask().
+			 *
+			 *  \param[in,out] AudioInterfaceInfo  Pointer to a structure containing an Audio Class configuration and state.
+			 */
+			static inline void Audio_Device_USBTask(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo)
+			                                        ATTR_NON_NULL_PTR_ARG(1) ATTR_ALWAYS_INLINE;
+			static inline void Audio_Device_USBTask(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo)
+			{
+				(void)AudioInterfaceInfo;
+			}
+
+			/** Determines if the given audio interface is ready for a sample to be read from it, and selects the streaming
+			 *  OUT endpoint ready for reading.
+			 *
+			 *  \pre This function must only be called when the Device state machine is in the \ref DEVICE_STATE_Configured state or
+			 *       the call will fail.
+			 *
+			 *  \param[in,out] AudioInterfaceInfo  Pointer to a structure containing an Audio Class configuration and state.
+			 *
+			 *  \return Boolean \c true if the given Audio interface has a sample to be read, \c false otherwise.
+			 */
+			static inline bool Audio_Device_IsSampleReceived(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo)
+			                                                 ATTR_NON_NULL_PTR_ARG(1) ATTR_ALWAYS_INLINE;
+			static inline bool Audio_Device_IsSampleReceived(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo)
+			{
+				if ((USB_DeviceState != DEVICE_STATE_Configured) || !(AudioInterfaceInfo->State.InterfaceEnabled))
+				  return false;
+
+				Endpoint_SelectEndpoint(AudioInterfaceInfo->Config.DataOUTEndpoint.Address);
+				return Endpoint_IsOUTReceived();
+			}
+
+			/** Determines if the given audio interface is ready to accept the next sample to be written to it, and selects
+			 *  the streaming IN endpoint ready for writing.
+			 *
+			 *  \pre This function must only be called when the Device state machine is in the \ref DEVICE_STATE_Configured state or
+			 *       the call will fail.
+			 *
+			 *  \param[in,out] AudioInterfaceInfo  Pointer to a structure containing an Audio Class configuration and state.
+			 *
+			 *  \return Boolean \c true if the given Audio interface is ready to accept the next sample, \c false otherwise.
+			 */
+			static inline bool Audio_Device_IsReadyForNextSample(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo)
+			                                                     ATTR_NON_NULL_PTR_ARG(1) ATTR_ALWAYS_INLINE;
+			static inline bool Audio_Device_IsReadyForNextSample(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo)
+			{
+				if ((USB_DeviceState != DEVICE_STATE_Configured) || !(AudioInterfaceInfo->State.InterfaceEnabled))
+				  return false;
+
+				Endpoint_SelectEndpoint(AudioInterfaceInfo->Config.DataINEndpoint.Address);
+				return Endpoint_IsINReady();
+			}
+
+			/** Reads the next 8-bit audio sample from the current audio interface.
+			 *
+			 *  \pre This should be preceded immediately by a call to the \ref Audio_Device_IsSampleReceived() function to ensure
+			 *       that the correct endpoint is selected and ready for data.
+			 *
+			 *  \param[in,out] AudioInterfaceInfo  Pointer to a structure containing an Audio Class configuration and state.
+			 *
+			 *  \return  Signed 8-bit audio sample from the audio interface.
+			 */
+			static inline int8_t Audio_Device_ReadSample8(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo)
+			                                              ATTR_NON_NULL_PTR_ARG(1) ATTR_ALWAYS_INLINE;
+			static inline int8_t Audio_Device_ReadSample8(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo)
+			{
+				int8_t Sample;
+
+				(void)AudioInterfaceInfo;
+
+				Sample = Endpoint_Read_8();
+
+				if (!(Endpoint_BytesInEndpoint()))
+				  Endpoint_ClearOUT();
+
+				return Sample;
+			}
+
+			/** Reads the next 16-bit audio sample from the current audio interface.
+			 *
+			 *  \pre This should be preceded immediately by a call to the \ref Audio_Device_IsSampleReceived() function to ensure
+			 *       that the correct endpoint is selected and ready for data.
+			 *
+			 *  \param[in,out] AudioInterfaceInfo  Pointer to a structure containing an Audio Class configuration and state.
+			 *
+			 *  \return  Signed 16-bit audio sample from the audio interface.
+			 */
+			static inline int16_t Audio_Device_ReadSample16(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo)
+			                                                ATTR_NON_NULL_PTR_ARG(1) ATTR_ALWAYS_INLINE;
+			static inline int16_t Audio_Device_ReadSample16(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo)
+			{
+				int16_t Sample;
+
+				(void)AudioInterfaceInfo;
+
+				Sample = (int16_t)Endpoint_Read_16_LE();
+
+				if (!(Endpoint_BytesInEndpoint()))
+				  Endpoint_ClearOUT();
+
+				return Sample;
+			}
+
+			/** Reads the next 24-bit audio sample from the current audio interface.
+			 *
+			 *  \pre This should be preceded immediately by a call to the \ref Audio_Device_IsSampleReceived() function to ensure
+			 *       that the correct endpoint is selected and ready for data.
+			 *
+			 *  \param[in,out] AudioInterfaceInfo  Pointer to a structure containing an Audio Class configuration and state.
+			 *
+			 *  \return Signed 24-bit audio sample from the audio interface.
+			 */
+			static inline int32_t Audio_Device_ReadSample24(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo)
+			                                                ATTR_NON_NULL_PTR_ARG(1) ATTR_ALWAYS_INLINE;
+			static inline int32_t Audio_Device_ReadSample24(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo)
+			{
+				int32_t Sample;
+
+				(void)AudioInterfaceInfo;
+
+				Sample = (((uint32_t)Endpoint_Read_8() << 16) | Endpoint_Read_16_LE());
+
+				if (!(Endpoint_BytesInEndpoint()))
+				  Endpoint_ClearOUT();
+
+				return Sample;
+			}
+
+			/** Writes the next 8-bit audio sample to the current audio interface.
+			 *
+			 *  \pre This should be preceded immediately by a call to the \ref Audio_Device_IsReadyForNextSample() function to
+			 *       ensure that the correct endpoint is selected and ready for data.
+			 *
+			 *  \param[in,out] AudioInterfaceInfo  Pointer to a structure containing an Audio Class configuration and state.
+			 *  \param[in]     Sample              Signed 8-bit audio sample.
+			 */
+			static inline void Audio_Device_WriteSample8(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo,
+			                                             const int8_t Sample) ATTR_NON_NULL_PTR_ARG(1) ATTR_ALWAYS_INLINE;
+			static inline void Audio_Device_WriteSample8(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo,
+			                                             const int8_t Sample)
+			{
+				Endpoint_Write_8(Sample);
+
+				if (Endpoint_BytesInEndpoint() == AudioInterfaceInfo->Config.DataINEndpoint.Size)
+				  Endpoint_ClearIN();
+			}
+
+			/** Writes the next 16-bit audio sample to the current audio interface.
+			 *
+			 *  \pre This should be preceded immediately by a call to the \ref Audio_Device_IsReadyForNextSample() function to
+			 *       ensure that the correct endpoint is selected and ready for data.
+			 *
+			 *  \param[in,out] AudioInterfaceInfo  Pointer to a structure containing an Audio Class configuration and state.
+			 *  \param[in]     Sample              Signed 16-bit audio sample.
+			 */
+			static inline void Audio_Device_WriteSample16(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo,
+			                                              const int16_t Sample) ATTR_NON_NULL_PTR_ARG(1) ATTR_ALWAYS_INLINE;
+			static inline void Audio_Device_WriteSample16(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo,
+			                                              const int16_t Sample)
+			{
+				Endpoint_Write_16_LE(Sample);
+
+				if (Endpoint_BytesInEndpoint() == AudioInterfaceInfo->Config.DataINEndpoint.Size)
+				  Endpoint_ClearIN();
+			}
+
+			/** Writes the next 24-bit audio sample to the current audio interface.
+			 *
+			 *  \pre This should be preceded immediately by a call to the \ref Audio_Device_IsReadyForNextSample() function to
+			 *       ensure that the correct endpoint is selected and ready for data.
+			 *
+			 *  \param[in,out] AudioInterfaceInfo  Pointer to a structure containing an Audio Class configuration and state.
+			 *  \param[in]     Sample              Signed 24-bit audio sample.
+			 */
+			static inline void Audio_Device_WriteSample24(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo,
+			                                              const int32_t Sample) ATTR_NON_NULL_PTR_ARG(1) ATTR_ALWAYS_INLINE;
+			static inline void Audio_Device_WriteSample24(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo,
+			                                              const int32_t Sample)
+			{
+				Endpoint_Write_16_LE(Sample);
+				Endpoint_Write_8(Sample >> 16);
+
+				if (Endpoint_BytesInEndpoint() == AudioInterfaceInfo->Config.DataINEndpoint.Size)
+				  Endpoint_ClearIN();
+			}
+
+	/* Private Interface - For use in library only: */
+	#if !defined(__DOXYGEN__)
+		/* Function Prototypes: */
+			#if defined(__INCLUDE_FROM_AUDIO_DEVICE_C)
+				void Audio_Device_Event_Stub(void) ATTR_CONST;
+
+				void EVENT_Audio_Device_StreamStartStop(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo)
+				                                        ATTR_WEAK ATTR_NON_NULL_PTR_ARG(1) ATTR_ALIAS(Audio_Device_Event_Stub);
+			#endif
+
+	#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Device/CDCClassDevice.c b/lib/lufa/LUFA/Drivers/USB/Class/Device/CDCClassDevice.c
new file mode 100644
index 0000000000..867548c00b
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Class/Device/CDCClassDevice.c
@@ -0,0 +1,362 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+#define  __INCLUDE_FROM_USB_DRIVER
+#include "../../Core/USBMode.h"
+
+#if defined(USB_CAN_BE_DEVICE)
+
+#define  __INCLUDE_FROM_CDC_DRIVER
+#define  __INCLUDE_FROM_CDC_DEVICE_C
+#include "CDCClassDevice.h"
+
+void CDC_Device_ProcessControlRequest(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo)
+{
+	if (!(Endpoint_IsSETUPReceived()))
+	  return;
+
+	if (USB_ControlRequest.wIndex != CDCInterfaceInfo->Config.ControlInterfaceNumber)
+	  return;
+
+	switch (USB_ControlRequest.bRequest)
+	{
+		case CDC_REQ_GetLineEncoding:
+			if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))
+			{
+				Endpoint_ClearSETUP();
+
+				while (!(Endpoint_IsINReady()));
+
+				Endpoint_Write_32_LE(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS);
+				Endpoint_Write_8(CDCInterfaceInfo->State.LineEncoding.CharFormat);
+				Endpoint_Write_8(CDCInterfaceInfo->State.LineEncoding.ParityType);
+				Endpoint_Write_8(CDCInterfaceInfo->State.LineEncoding.DataBits);
+
+				Endpoint_ClearIN();
+				Endpoint_ClearStatusStage();
+			}
+
+			break;
+		case CDC_REQ_SetLineEncoding:
+			if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
+			{
+				Endpoint_ClearSETUP();
+
+				while (!(Endpoint_IsOUTReceived()))
+				{
+					if (USB_DeviceState == DEVICE_STATE_Unattached)
+					  return;
+				}
+
+				CDCInterfaceInfo->State.LineEncoding.BaudRateBPS = Endpoint_Read_32_LE();
+				CDCInterfaceInfo->State.LineEncoding.CharFormat  = Endpoint_Read_8();
+				CDCInterfaceInfo->State.LineEncoding.ParityType  = Endpoint_Read_8();
+				CDCInterfaceInfo->State.LineEncoding.DataBits    = Endpoint_Read_8();
+
+				Endpoint_ClearOUT();
+				Endpoint_ClearStatusStage();
+
+				EVENT_CDC_Device_LineEncodingChanged(CDCInterfaceInfo);
+			}
+
+			break;
+		case CDC_REQ_SetControlLineState:
+			if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
+			{
+				Endpoint_ClearSETUP();
+				Endpoint_ClearStatusStage();
+
+				CDCInterfaceInfo->State.ControlLineStates.HostToDevice = USB_ControlRequest.wValue;
+
+				EVENT_CDC_Device_ControLineStateChanged(CDCInterfaceInfo);
+			}
+
+			break;
+		case CDC_REQ_SendBreak:
+			if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
+			{
+				Endpoint_ClearSETUP();
+				Endpoint_ClearStatusStage();
+
+				EVENT_CDC_Device_BreakSent(CDCInterfaceInfo, (uint8_t)USB_ControlRequest.wValue);
+			}
+
+			break;
+	}
+}
+
+bool CDC_Device_ConfigureEndpoints(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo)
+{
+	memset(&CDCInterfaceInfo->State, 0x00, sizeof(CDCInterfaceInfo->State));
+
+	CDCInterfaceInfo->Config.DataINEndpoint.Type       = EP_TYPE_BULK;
+	CDCInterfaceInfo->Config.DataOUTEndpoint.Type      = EP_TYPE_BULK;
+	CDCInterfaceInfo->Config.NotificationEndpoint.Type = EP_TYPE_INTERRUPT;
+
+	if (!(Endpoint_ConfigureEndpointTable(&CDCInterfaceInfo->Config.DataINEndpoint, 1)))
+	  return false;
+
+	if (!(Endpoint_ConfigureEndpointTable(&CDCInterfaceInfo->Config.DataOUTEndpoint, 1)))
+	  return false;
+
+	if (!(Endpoint_ConfigureEndpointTable(&CDCInterfaceInfo->Config.NotificationEndpoint, 1)))
+	  return false;
+
+	return true;
+}
+
+void CDC_Device_USBTask(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo)
+{
+	if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS))
+	  return;
+
+	#if !defined(NO_CLASS_DRIVER_AUTOFLUSH)
+	Endpoint_SelectEndpoint(CDCInterfaceInfo->Config.DataINEndpoint.Address);
+
+	if (Endpoint_IsINReady())
+	  CDC_Device_Flush(CDCInterfaceInfo);
+	#endif
+}
+
+uint8_t CDC_Device_SendString(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo,
+                              const char* const String)
+{
+	if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS))
+	  return ENDPOINT_RWSTREAM_DeviceDisconnected;
+
+	Endpoint_SelectEndpoint(CDCInterfaceInfo->Config.DataINEndpoint.Address);
+	return Endpoint_Write_Stream_LE(String, strlen(String), NULL);
+}
+
+uint8_t CDC_Device_SendString_P(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo,
+                              const char* const String)
+{
+	if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS))
+	  return ENDPOINT_RWSTREAM_DeviceDisconnected;
+
+	Endpoint_SelectEndpoint(CDCInterfaceInfo->Config.DataINEndpoint.Address);
+	return Endpoint_Write_PStream_LE(String, strlen_P(String), NULL);
+}
+
+uint8_t CDC_Device_SendData(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo,
+                            const void* const Buffer,
+                            const uint16_t Length)
+{
+	if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS))
+	  return ENDPOINT_RWSTREAM_DeviceDisconnected;
+
+	Endpoint_SelectEndpoint(CDCInterfaceInfo->Config.DataINEndpoint.Address);
+	return Endpoint_Write_Stream_LE(Buffer, Length, NULL);
+}
+
+uint8_t CDC_Device_SendData_P(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo,
+                            const void* const Buffer,
+                            const uint16_t Length)
+{
+	if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS))
+	  return ENDPOINT_RWSTREAM_DeviceDisconnected;
+
+	Endpoint_SelectEndpoint(CDCInterfaceInfo->Config.DataINEndpoint.Address);
+	return Endpoint_Write_PStream_LE(Buffer, Length, NULL);
+}
+
+uint8_t CDC_Device_SendByte(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo,
+                            const uint8_t Data)
+{
+	if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS))
+	  return ENDPOINT_RWSTREAM_DeviceDisconnected;
+
+	Endpoint_SelectEndpoint(CDCInterfaceInfo->Config.DataINEndpoint.Address);
+
+	if (!(Endpoint_IsReadWriteAllowed()))
+	{
+		Endpoint_ClearIN();
+
+		uint8_t ErrorCode;
+
+		if ((ErrorCode = Endpoint_WaitUntilReady()) != ENDPOINT_READYWAIT_NoError)
+		  return ErrorCode;
+	}
+
+	Endpoint_Write_8(Data);
+	return ENDPOINT_READYWAIT_NoError;
+}
+
+uint8_t CDC_Device_Flush(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo)
+{
+	if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS))
+	  return ENDPOINT_RWSTREAM_DeviceDisconnected;
+
+	uint8_t ErrorCode;
+
+	Endpoint_SelectEndpoint(CDCInterfaceInfo->Config.DataINEndpoint.Address);
+
+	if (!(Endpoint_BytesInEndpoint()))
+	  return ENDPOINT_READYWAIT_NoError;
+
+	bool BankFull = !(Endpoint_IsReadWriteAllowed());
+
+	Endpoint_ClearIN();
+
+	if (BankFull)
+	{
+		if ((ErrorCode = Endpoint_WaitUntilReady()) != ENDPOINT_READYWAIT_NoError)
+		  return ErrorCode;
+
+		Endpoint_ClearIN();
+	}
+
+	return ENDPOINT_READYWAIT_NoError;
+}
+
+uint16_t CDC_Device_BytesReceived(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo)
+{
+	if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS))
+	  return 0;
+
+	Endpoint_SelectEndpoint(CDCInterfaceInfo->Config.DataOUTEndpoint.Address);
+
+	if (Endpoint_IsOUTReceived())
+	{
+		if (!(Endpoint_BytesInEndpoint()))
+		{
+			Endpoint_ClearOUT();
+			return 0;
+		}
+		else
+		{
+			return Endpoint_BytesInEndpoint();
+		}
+	}
+	else
+	{
+		return 0;
+	}
+}
+
+int16_t CDC_Device_ReceiveByte(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo)
+{
+	if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS))
+	  return -1;
+
+	int16_t ReceivedByte = -1;
+
+	Endpoint_SelectEndpoint(CDCInterfaceInfo->Config.DataOUTEndpoint.Address);
+
+	if (Endpoint_IsOUTReceived())
+	{
+		if (Endpoint_BytesInEndpoint())
+		  ReceivedByte = Endpoint_Read_8();
+
+		if (!(Endpoint_BytesInEndpoint()))
+		  Endpoint_ClearOUT();
+	}
+
+	return ReceivedByte;
+}
+
+void CDC_Device_SendControlLineStateChange(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo)
+{
+	if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS))
+	  return;
+
+	Endpoint_SelectEndpoint(CDCInterfaceInfo->Config.NotificationEndpoint.Address);
+
+	USB_Request_Header_t Notification = (USB_Request_Header_t)
+		{
+			.bmRequestType = (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE),
+			.bRequest      = CDC_NOTIF_SerialState,
+			.wValue        = CPU_TO_LE16(0),
+			.wIndex        = CPU_TO_LE16(0),
+			.wLength       = CPU_TO_LE16(sizeof(CDCInterfaceInfo->State.ControlLineStates.DeviceToHost)),
+		};
+
+	Endpoint_Write_Stream_LE(&Notification, sizeof(USB_Request_Header_t), NULL);
+	Endpoint_Write_Stream_LE(&CDCInterfaceInfo->State.ControlLineStates.DeviceToHost,
+	                         sizeof(CDCInterfaceInfo->State.ControlLineStates.DeviceToHost),
+	                         NULL);
+	Endpoint_ClearIN();
+}
+
+#if defined(FDEV_SETUP_STREAM)
+void CDC_Device_CreateStream(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo,
+                             FILE* const Stream)
+{
+	*Stream = (FILE)FDEV_SETUP_STREAM(CDC_Device_putchar, CDC_Device_getchar, _FDEV_SETUP_RW);
+	fdev_set_udata(Stream, CDCInterfaceInfo);
+}
+
+void CDC_Device_CreateBlockingStream(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo,
+                                     FILE* const Stream)
+{
+	*Stream = (FILE)FDEV_SETUP_STREAM(CDC_Device_putchar, CDC_Device_getchar_Blocking, _FDEV_SETUP_RW);
+	fdev_set_udata(Stream, CDCInterfaceInfo);
+}
+
+static int CDC_Device_putchar(char c,
+                              FILE* Stream)
+{
+	return CDC_Device_SendByte((USB_ClassInfo_CDC_Device_t*)fdev_get_udata(Stream), c) ? _FDEV_ERR : 0;
+}
+
+static int CDC_Device_getchar(FILE* Stream)
+{
+	int16_t ReceivedByte = CDC_Device_ReceiveByte((USB_ClassInfo_CDC_Device_t*)fdev_get_udata(Stream));
+
+	if (ReceivedByte < 0)
+	  return _FDEV_EOF;
+
+	return ReceivedByte;
+}
+
+static int CDC_Device_getchar_Blocking(FILE* Stream)
+{
+	int16_t ReceivedByte;
+
+	while ((ReceivedByte = CDC_Device_ReceiveByte((USB_ClassInfo_CDC_Device_t*)fdev_get_udata(Stream))) < 0)
+	{
+		if (USB_DeviceState == DEVICE_STATE_Unattached)
+		  return _FDEV_EOF;
+
+		CDC_Device_USBTask((USB_ClassInfo_CDC_Device_t*)fdev_get_udata(Stream));
+		USB_USBTask();
+	}
+
+	return ReceivedByte;
+}
+#endif
+
+void CDC_Device_Event_Stub(void)
+{
+
+}
+
+#endif
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Device/CDCClassDevice.h b/lib/lufa/LUFA/Drivers/USB/Class/Device/CDCClassDevice.h
new file mode 100644
index 0000000000..9d5c4e5a0a
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Class/Device/CDCClassDevice.h
@@ -0,0 +1,386 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Device mode driver for the library USB CDC Class driver.
+ *
+ *  Device mode driver for the library USB CDC Class driver.
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the USB module driver
+ *        dispatch header located in LUFA/Drivers/USB.h.
+ */
+
+/** \ingroup Group_USBClassCDC
+ *  \defgroup Group_USBClassCDCDevice CDC Class Device Mode Driver
+ *
+ *  \section Sec_USBClassCDCDevice_Dependencies Module Source Dependencies
+ *  The following files must be built with any user project that uses this module:
+ *    - LUFA/Drivers/USB/Class/Device/CDCClassDevice.c <i>(Makefile source module name: LUFA_SRC_USBCLASS)</i>
+ *
+ *  \section Sec_USBClassCDCDevice_ModDescription Module Description
+ *  Device Mode USB Class driver framework interface, for the CDC USB Class driver.
+ *
+ *  \note There are several major drawbacks to the CDC-ACM standard USB class, however
+ *        it is very standardized and thus usually available as a built-in driver on
+ *        most platforms, and so is a better choice than a proprietary serial class.
+ *
+ *        One major issue with CDC-ACM is that it requires two Interface descriptors,
+ *        which will upset most hosts when part of a multi-function "Composite" USB
+ *        device. This is because each interface will be loaded into a separate driver
+ *        instance, causing the two interfaces be become unlinked. To prevent this, you
+ *        should use the "Interface Association Descriptor" addendum to the USB 2.0 standard
+ *        which is available on most OSes when creating Composite devices.
+ *
+ *        Another major oversight is that there is no mechanism for the host to notify the
+ *        device that there is a data sink on the host side ready to accept data. This
+ *        means that the device may try to send data while the host isn't listening, causing
+ *        lengthy blocking timeouts in the transmission routines. It is thus highly recommended
+ *        that the virtual serial line DTR (Data Terminal Ready) signal be used where possible
+ *        to determine if a host application is ready for data.
+ *
+ *  @{
+ */
+
+#ifndef _CDC_CLASS_DEVICE_H_
+#define _CDC_CLASS_DEVICE_H_
+
+	/* Includes: */
+		#include "../../USB.h"
+		#include "../Common/CDCClassCommon.h"
+
+		#include <stdio.h>
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_CDC_DRIVER)
+			#error Do not include this file directly. Include LUFA/Drivers/USB.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Type Defines: */
+			/** \brief CDC Class Device Mode Configuration and State Structure.
+			 *
+			 *  Class state structure. An instance of this structure should be made for each CDC interface
+			 *  within the user application, and passed to each of the CDC class driver functions as the
+			 *  CDCInterfaceInfo parameter. This stores each CDC interface's configuration and state information.
+			 */
+			typedef struct
+			{
+				struct
+				{
+					uint8_t ControlInterfaceNumber; /**< Interface number of the CDC control interface within the device. */
+
+					USB_Endpoint_Table_t DataINEndpoint; /**< Data IN endpoint configuration table. */
+					USB_Endpoint_Table_t DataOUTEndpoint; /**< Data OUT endpoint configuration table. */
+					USB_Endpoint_Table_t NotificationEndpoint; /**< Notification IN Endpoint configuration table. */
+				} Config; /**< Config data for the USB class interface within the device. All elements in this section
+				           *   <b>must</b> be set or the interface will fail to enumerate and operate correctly.
+				           */
+				struct
+				{
+					struct
+					{
+						uint16_t HostToDevice; /**< Control line states from the host to device, as a set of \c CDC_CONTROL_LINE_OUT_*
+											    *   masks. This value is updated each time \ref CDC_Device_USBTask() is called.
+											    */
+						uint16_t DeviceToHost; /**< Control line states from the device to host, as a set of \c CDC_CONTROL_LINE_IN_*
+											    *   masks - to notify the host of changes to these values, call the
+											    *   \ref CDC_Device_SendControlLineStateChange() function.
+											    */
+					} ControlLineStates; /**< Current states of the virtual serial port's control lines between the device and host. */
+
+					CDC_LineEncoding_t LineEncoding; /**< Line encoding used in the virtual serial port, for the device's information.
+					                                  *   This is generally only used if the virtual serial port data is to be
+					                                  *   reconstructed on a physical UART.
+					                                  */
+				} State; /**< State data for the USB class interface within the device. All elements in this section
+				          *   are reset to their defaults when the interface is enumerated.
+				          */
+			} USB_ClassInfo_CDC_Device_t;
+
+		/* Function Prototypes: */
+			/** Configures the endpoints of a given CDC interface, ready for use. This should be linked to the library
+			 *  \ref EVENT_USB_Device_ConfigurationChanged() event so that the endpoints are configured when the configuration containing
+			 *  the given CDC interface is selected.
+			 *
+			 *  \param[in,out] CDCInterfaceInfo  Pointer to a structure containing a CDC Class configuration and state.
+			 *
+			 *  \return Boolean \c true if the endpoints were successfully configured, \c false otherwise.
+			 */
+			bool CDC_Device_ConfigureEndpoints(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Processes incoming control requests from the host, that are directed to the given CDC class interface. This should be
+			 *  linked to the library \ref EVENT_USB_Device_ControlRequest() event.
+			 *
+			 *  \param[in,out] CDCInterfaceInfo  Pointer to a structure containing a CDC Class configuration and state.
+			 */
+			void CDC_Device_ProcessControlRequest(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** General management task for a given CDC class interface, required for the correct operation of the interface. This should
+			 *  be called frequently in the main program loop, before the master USB management task \ref USB_USBTask().
+			 *
+			 *  \param[in,out] CDCInterfaceInfo  Pointer to a structure containing a CDC Class configuration and state.
+			 */
+			void CDC_Device_USBTask(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** CDC class driver event for a line encoding change on a CDC interface. This event fires each time the host requests a
+			 *  line encoding change (containing the serial parity, baud and other configuration information) and may be hooked in the
+			 *  user program by declaring a handler function with the same name and parameters listed here. The new line encoding
+			 *  settings are available in the \c LineEncoding structure inside the CDC interface structure passed as a parameter.
+			 *
+			 *  \param[in,out] CDCInterfaceInfo  Pointer to a structure containing a CDC Class configuration and state.
+			 */
+			void EVENT_CDC_Device_LineEncodingChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** CDC class driver event for a control line state change on a CDC interface. This event fires each time the host requests a
+			 *  control line state change (containing the virtual serial control line states, such as DTR) and may be hooked in the
+			 *  user program by declaring a handler function with the same name and parameters listed here. The new control line states
+			 *  are available in the \c ControlLineStates.HostToDevice value inside the CDC interface structure passed as a parameter, set as
+			 *  a mask of \c CDC_CONTROL_LINE_OUT_* masks.
+			 *
+			 *  \param[in,out] CDCInterfaceInfo  Pointer to a structure containing a CDC Class configuration and state.
+			 */
+			void EVENT_CDC_Device_ControLineStateChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** CDC class driver event for a send break request sent to the device from the host. This is generally used to separate
+			 *  data or to indicate a special condition to the receiving device.
+			 *
+			 *  \param[in,out] CDCInterfaceInfo  Pointer to a structure containing a CDC Class configuration and state.
+			 *  \param[in]     Duration          Duration of the break that has been sent by the host, in milliseconds.
+			 */
+			void EVENT_CDC_Device_BreakSent(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo,
+			                                const uint8_t Duration) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Sends a given data buffer to the attached USB host, if connected. If a host is not connected when the function is
+			 *  called, the string is discarded. Bytes will be queued for transmission to the host until either the endpoint bank
+			 *  becomes full, or the \ref CDC_Device_Flush() function is called to flush the pending data to the host. This allows
+			 *  for multiple bytes to be packed into a single endpoint packet, increasing data throughput.
+			 *
+			 *  \pre This function must only be called when the Device state machine is in the \ref DEVICE_STATE_Configured state or
+			 *       the call will fail.
+			 *
+			 *  \param[in,out] CDCInterfaceInfo  Pointer to a structure containing a CDC Class configuration and state.
+			 *  \param[in]     Buffer            Pointer to a buffer containing the data to send to the device.
+			 *  \param[in]     Length            Length of the data to send to the host.
+			 *
+			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t CDC_Device_SendData(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo,
+			                            const void* const Buffer,
+			                            const uint16_t Length) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2);
+
+			/** Sends a given data buffer from PROGMEM space to the attached USB host, if connected. If a host is not connected when the
+			 *  function is called, the string is discarded. Bytes will be queued for transmission to the host until either the endpoint
+			 *  bank becomes full, or the \ref CDC_Device_Flush() function is called to flush the pending data to the host. This allows
+			 *  for multiple bytes to be packed into a single endpoint packet, increasing data throughput.
+			 *
+			 *  \pre This function must only be called when the Device state machine is in the \ref DEVICE_STATE_Configured state or
+			 *       the call will fail.
+			 *
+			 *  \param[in,out] CDCInterfaceInfo  Pointer to a structure containing a CDC Class configuration and state.
+			 *  \param[in]     Buffer            Pointer to a buffer containing the data to send to the device.
+			 *  \param[in]     Length            Length of the data to send to the host.
+			 *
+			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t CDC_Device_SendData_P(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo,
+			                            const void* const Buffer,
+			                            const uint16_t Length) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2);
+
+			/** Sends a given null terminated string to the attached USB host, if connected. If a host is not connected when
+			 *  the function is called, the string is discarded. Bytes will be queued for transmission to the host until either
+			 *  the endpoint bank becomes full, or the \ref CDC_Device_Flush() function is called to flush the pending data to
+			 *  the host. This allows for multiple bytes to be packed into a single endpoint packet, increasing data throughput.
+			 *
+			 *  \pre This function must only be called when the Device state machine is in the \ref DEVICE_STATE_Configured state or
+			 *       the call will fail.
+			 *
+			 *  \param[in,out] CDCInterfaceInfo  Pointer to a structure containing a CDC Class configuration and state.
+			 *  \param[in]     String            Pointer to the null terminated string to send to the host.
+			 *
+			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t CDC_Device_SendString(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo,
+			                              const char* const String) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2);
+
+			/** Sends a given null terminated string from PROGMEM space to the attached USB host, if connected. If a host is not connected
+			 *  when the function is called, the string is discarded. Bytes will be queued for transmission to the host until either
+			 *  the endpoint bank becomes full, or the \ref CDC_Device_Flush() function is called to flush the pending data to
+			 *  the host. This allows for multiple bytes to be packed into a single endpoint packet, increasing data throughput.
+			 *
+			 *  \pre This function must only be called when the Device state machine is in the \ref DEVICE_STATE_Configured state or
+			 *       the call will fail.
+			 *
+			 *  \param[in,out] CDCInterfaceInfo  Pointer to a structure containing a CDC Class configuration and state.
+			 *  \param[in]     String            Pointer to the null terminated string to send to the host.
+			 *
+			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t CDC_Device_SendString_P(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo,
+			                              const char* const String) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2);
+
+			/** Sends a given byte to the attached USB host, if connected. If a host is not connected when the function is called, the
+			 *  byte is discarded. Bytes will be queued for transmission to the host until either the endpoint bank becomes full, or the
+			 *  \ref CDC_Device_Flush() function is called to flush the pending data to the host. This allows for multiple bytes to be
+			 *  packed into a single endpoint packet, increasing data throughput.
+			 *
+			 *  \pre This function must only be called when the Device state machine is in the \ref DEVICE_STATE_Configured state or
+			 *       the call will fail.
+			 *
+			 *  \param[in,out] CDCInterfaceInfo  Pointer to a structure containing a CDC Class configuration and state.
+			 *  \param[in]     Data              Byte of data to send to the host.
+			 *
+			 *  \return A value from the \ref Endpoint_WaitUntilReady_ErrorCodes_t enum.
+			 */
+			uint8_t CDC_Device_SendByte(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo,
+			                            const uint8_t Data) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Determines the number of bytes received by the CDC interface from the host, waiting to be read. This indicates the number
+			 *  of bytes in the OUT endpoint bank only, and thus the number of calls to \ref CDC_Device_ReceiveByte() which are guaranteed to
+			 *  succeed immediately. If multiple bytes are to be received, they should be buffered by the user application, as the endpoint
+			 *  bank will not be released back to the USB controller until all bytes are read.
+			 *
+			 *  \pre This function must only be called when the Device state machine is in the \ref DEVICE_STATE_Configured state or
+			 *       the call will fail.
+			 *
+			 *  \param[in,out] CDCInterfaceInfo  Pointer to a structure containing a CDC Class configuration and state.
+			 *
+			 *  \return Total number of buffered bytes received from the host.
+			 */
+			uint16_t CDC_Device_BytesReceived(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Reads a byte of data from the host. If no data is waiting to be read of if a USB host is not connected, the function
+			 *  returns a negative value. The \ref CDC_Device_BytesReceived() function may be queried in advance to determine how many
+			 *  bytes are currently buffered in the CDC interface's data receive endpoint bank, and thus how many repeated calls to this
+			 *  function which are guaranteed to succeed.
+			 *
+			 *  \pre This function must only be called when the Device state machine is in the \ref DEVICE_STATE_Configured state or
+			 *       the call will fail.
+			 *
+			 *  \param[in,out] CDCInterfaceInfo  Pointer to a structure containing a CDC Class configuration and state.
+			 *
+			 *  \return Next received byte from the host, or a negative value if no data received.
+			 */
+			int16_t CDC_Device_ReceiveByte(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Flushes any data waiting to be sent, ensuring that the send buffer is cleared.
+			 *
+			 *  \pre This function must only be called when the Device state machine is in the \ref DEVICE_STATE_Configured state or
+			 *       the call will fail.
+			 *
+			 *  \param[in,out] CDCInterfaceInfo  Pointer to a structure containing a CDC Class configuration and state.
+			 *
+			 *  \return A value from the \ref Endpoint_WaitUntilReady_ErrorCodes_t enum.
+			 */
+			uint8_t CDC_Device_Flush(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Sends a Serial Control Line State Change notification to the host. This should be called when the virtual serial
+			 *  control lines (DCD, DSR, etc.) have changed states, or to give BREAK notifications to the host. Line states persist
+			 *  until they are cleared via a second notification. This should be called each time the CDC class driver's
+			 *  \c ControlLineStates.DeviceToHost value is updated to push the new states to the USB host.
+			 *
+			 *  \pre This function must only be called when the Device state machine is in the \ref DEVICE_STATE_Configured state or
+			 *       the call will fail.
+			 *
+			 *  \param[in,out] CDCInterfaceInfo  Pointer to a structure containing a CDC Class configuration and state.
+			 */
+			void CDC_Device_SendControlLineStateChange(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
+
+			#if defined(FDEV_SETUP_STREAM) || defined(__DOXYGEN__)
+			/** Creates a standard character stream for the given CDC Device instance so that it can be used with all the regular
+			 *  functions in the standard <stdio.h> library that accept a \c FILE stream as a destination (e.g. \c fprintf()). The created
+			 *  stream is bidirectional and can be used for both input and output functions.
+			 *
+			 *  Reading data from this stream is non-blocking, i.e. in most instances, complete strings cannot be read in by a single
+			 *  fetch, as the endpoint will not be ready at some point in the transmission, aborting the transfer. However, this may
+			 *  be used when the read data is processed byte-per-bye (via \c getc()) or when the user application will implement its own
+			 *  line buffering.
+			 *
+			 *  \note The created stream can be given as \c stdout if desired to direct the standard output from all \c <stdio.h> functions
+			 *        to the given CDC interface.
+			 *        \n\n
+			 *
+			 *  \note This function is not available on all microcontroller architectures.
+			 *
+			 *  \param[in,out] CDCInterfaceInfo  Pointer to a structure containing a CDC Class configuration and state.
+			 *  \param[in,out] Stream            Pointer to a FILE structure where the created stream should be placed.
+			 */
+			void CDC_Device_CreateStream(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo,
+			                             FILE* const Stream) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2);
+
+			/** Identical to \ref CDC_Device_CreateStream(), except that reads are blocking until the calling stream function terminates
+			 *  the transfer. While blocking, the USB and CDC service tasks are called repeatedly to maintain USB communications.
+			 *
+			 *  \note This function is not available on all microcontroller architectures.
+			 *
+			 *  \param[in,out] CDCInterfaceInfo  Pointer to a structure containing a CDC Class configuration and state.
+			 *  \param[in,out] Stream            Pointer to a FILE structure where the created stream should be placed.
+			 */
+			void CDC_Device_CreateBlockingStream(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo,
+			                                     FILE* const Stream) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2);
+			#endif
+
+	/* Private Interface - For use in library only: */
+	#if !defined(__DOXYGEN__)
+		/* Function Prototypes: */
+			#if defined(__INCLUDE_FROM_CDC_DEVICE_C)
+				#if defined(FDEV_SETUP_STREAM)
+				static int CDC_Device_putchar(char c,
+				                              FILE* Stream) ATTR_NON_NULL_PTR_ARG(2);
+				static int CDC_Device_getchar(FILE* Stream) ATTR_NON_NULL_PTR_ARG(1);
+				static int CDC_Device_getchar_Blocking(FILE* Stream) ATTR_NON_NULL_PTR_ARG(1);
+				#endif
+
+				void CDC_Device_Event_Stub(void) ATTR_CONST;
+
+				void EVENT_CDC_Device_LineEncodingChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo)
+				                                          ATTR_WEAK ATTR_NON_NULL_PTR_ARG(1) ATTR_ALIAS(CDC_Device_Event_Stub);
+				void EVENT_CDC_Device_ControLineStateChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo)
+				                                             ATTR_WEAK ATTR_NON_NULL_PTR_ARG(1) ATTR_ALIAS(CDC_Device_Event_Stub);
+				void EVENT_CDC_Device_BreakSent(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo,
+				                                const uint8_t Duration) ATTR_WEAK ATTR_NON_NULL_PTR_ARG(1)
+				                                ATTR_ALIAS(CDC_Device_Event_Stub);
+			#endif
+
+	#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Device/HIDClassDevice.c b/lib/lufa/LUFA/Drivers/USB/Class/Device/HIDClassDevice.c
new file mode 100644
index 0000000000..a8a6e8b50e
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Class/Device/HIDClassDevice.c
@@ -0,0 +1,211 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+#define  __INCLUDE_FROM_USB_DRIVER
+#include "../../Core/USBMode.h"
+
+#if defined(USB_CAN_BE_DEVICE)
+
+#define  __INCLUDE_FROM_HID_DRIVER
+#define  __INCLUDE_FROM_HID_DEVICE_C
+#include "HIDClassDevice.h"
+
+void HID_Device_ProcessControlRequest(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo)
+{
+	if (!(Endpoint_IsSETUPReceived()))
+	  return;
+
+	if (USB_ControlRequest.wIndex != HIDInterfaceInfo->Config.InterfaceNumber)
+	  return;
+
+	switch (USB_ControlRequest.bRequest)
+	{
+		case HID_REQ_GetReport:
+			if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))
+			{
+				uint16_t ReportSize = 0;
+				uint8_t  ReportID   = (USB_ControlRequest.wValue & 0xFF);
+				uint8_t  ReportType = (USB_ControlRequest.wValue >> 8) - 1;
+				uint8_t  ReportData[HIDInterfaceInfo->Config.PrevReportINBufferSize];
+
+				memset(ReportData, 0, sizeof(ReportData));
+
+				CALLBACK_HID_Device_CreateHIDReport(HIDInterfaceInfo, &ReportID, ReportType, ReportData, &ReportSize);
+
+				if (HIDInterfaceInfo->Config.PrevReportINBuffer != NULL)
+				{
+					memcpy(HIDInterfaceInfo->Config.PrevReportINBuffer, ReportData,
+					       HIDInterfaceInfo->Config.PrevReportINBufferSize);
+				}
+
+				Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP);
+
+				Endpoint_ClearSETUP();
+
+				if (ReportID)
+				  Endpoint_Write_8(ReportID);
+
+				Endpoint_Write_Control_Stream_LE(ReportData, ReportSize);
+				Endpoint_ClearOUT();
+			}
+
+			break;
+		case HID_REQ_SetReport:
+			if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
+			{
+				uint16_t ReportSize = USB_ControlRequest.wLength;
+				uint8_t  ReportID   = (USB_ControlRequest.wValue & 0xFF);
+				uint8_t  ReportType = (USB_ControlRequest.wValue >> 8) - 1;
+				uint8_t  ReportData[ReportSize];
+
+				Endpoint_ClearSETUP();
+				Endpoint_Read_Control_Stream_LE(ReportData, ReportSize);
+				Endpoint_ClearIN();
+
+				CALLBACK_HID_Device_ProcessHIDReport(HIDInterfaceInfo, ReportID, ReportType,
+				                                     &ReportData[ReportID ? 1 : 0], ReportSize - (ReportID ? 1 : 0));
+			}
+
+			break;
+		case HID_REQ_GetProtocol:
+			if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))
+			{
+				Endpoint_ClearSETUP();
+				while (!(Endpoint_IsINReady()));
+				Endpoint_Write_8(HIDInterfaceInfo->State.UsingReportProtocol);
+				Endpoint_ClearIN();
+				Endpoint_ClearStatusStage();
+			}
+
+			break;
+		case HID_REQ_SetProtocol:
+			if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
+			{
+				Endpoint_ClearSETUP();
+				Endpoint_ClearStatusStage();
+
+				HIDInterfaceInfo->State.UsingReportProtocol = ((USB_ControlRequest.wValue & 0xFF) != 0x00);
+			}
+
+			break;
+		case HID_REQ_SetIdle:
+			if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
+			{
+				Endpoint_ClearSETUP();
+				Endpoint_ClearStatusStage();
+
+				HIDInterfaceInfo->State.IdleCount = ((USB_ControlRequest.wValue & 0xFF00) >> 6);
+			}
+
+			break;
+		case HID_REQ_GetIdle:
+			if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))
+			{
+				Endpoint_ClearSETUP();
+				while (!(Endpoint_IsINReady()));
+				Endpoint_Write_8(HIDInterfaceInfo->State.IdleCount >> 2);
+				Endpoint_ClearIN();
+				Endpoint_ClearStatusStage();
+			}
+
+			break;
+	}
+}
+
+bool HID_Device_ConfigureEndpoints(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo)
+{
+	memset(&HIDInterfaceInfo->State, 0x00, sizeof(HIDInterfaceInfo->State));
+	HIDInterfaceInfo->State.UsingReportProtocol = true;
+	HIDInterfaceInfo->State.IdleCount           = 500;
+
+	HIDInterfaceInfo->Config.ReportINEndpoint.Type = EP_TYPE_INTERRUPT;
+
+	if (!(Endpoint_ConfigureEndpointTable(&HIDInterfaceInfo->Config.ReportINEndpoint, 1)))
+	  return false;
+
+	return true;
+}
+
+void HID_Device_USBTask(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo)
+{
+	if (USB_DeviceState != DEVICE_STATE_Configured)
+	  return;
+
+	if (HIDInterfaceInfo->State.PrevFrameNum == USB_Device_GetFrameNumber())
+	{
+		#if defined(USB_DEVICE_OPT_LOWSPEED)
+		if (!(USB_Options & USB_DEVICE_OPT_LOWSPEED))
+		  return;
+		#else
+		return;
+		#endif
+	}
+
+	Endpoint_SelectEndpoint(HIDInterfaceInfo->Config.ReportINEndpoint.Address);
+
+	if (Endpoint_IsReadWriteAllowed())
+	{
+		uint8_t  ReportINData[HIDInterfaceInfo->Config.PrevReportINBufferSize];
+		uint8_t  ReportID     = 0;
+		uint16_t ReportINSize = 0;
+
+		memset(ReportINData, 0, sizeof(ReportINData));
+
+		bool ForceSend         = CALLBACK_HID_Device_CreateHIDReport(HIDInterfaceInfo, &ReportID, HID_REPORT_ITEM_In,
+		                                                             ReportINData, &ReportINSize);
+		bool StatesChanged     = false;
+		bool IdlePeriodElapsed = (HIDInterfaceInfo->State.IdleCount && !(HIDInterfaceInfo->State.IdleMSRemaining));
+
+		if (HIDInterfaceInfo->Config.PrevReportINBuffer != NULL)
+		{
+			StatesChanged = (memcmp(ReportINData, HIDInterfaceInfo->Config.PrevReportINBuffer, ReportINSize) != 0);
+			memcpy(HIDInterfaceInfo->Config.PrevReportINBuffer, ReportINData, HIDInterfaceInfo->Config.PrevReportINBufferSize);
+		}
+
+		if (ReportINSize && (ForceSend || StatesChanged || IdlePeriodElapsed))
+		{
+			HIDInterfaceInfo->State.IdleMSRemaining = HIDInterfaceInfo->State.IdleCount;
+
+			Endpoint_SelectEndpoint(HIDInterfaceInfo->Config.ReportINEndpoint.Address);
+
+			if (ReportID)
+			  Endpoint_Write_8(ReportID);
+
+			Endpoint_Write_Stream_LE(ReportINData, ReportINSize, NULL);
+
+			Endpoint_ClearIN();
+		}
+
+		HIDInterfaceInfo->State.PrevFrameNum = USB_Device_GetFrameNumber();
+	}
+}
+
+#endif
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Device/HIDClassDevice.h b/lib/lufa/LUFA/Drivers/USB/Class/Device/HIDClassDevice.h
new file mode 100644
index 0000000000..ae628c87d4
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Class/Device/HIDClassDevice.h
@@ -0,0 +1,210 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Device mode driver for the library USB HID Class driver.
+ *
+ *  Device mode driver for the library USB HID Class driver.
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the USB module driver
+ *        dispatch header located in LUFA/Drivers/USB.h.
+ */
+
+/** \ingroup Group_USBClassHID
+ *  \defgroup Group_USBClassHIDDevice HID Class Device Mode Driver
+ *
+ *  \section Sec_USBClassHIDDevice_Dependencies Module Source Dependencies
+ *  The following files must be built with any user project that uses this module:
+ *    - LUFA/Drivers/USB/Class/Device/HIDClassDevice.c <i>(Makefile source module name: LUFA_SRC_USBCLASS)</i>
+ *
+ *  \section Sec_USBClassHIDDevice_ModDescription Module Description
+ *  Device Mode USB Class driver framework interface, for the HID USB Class driver.
+ *
+ *  @{
+ */
+
+#ifndef _HID_CLASS_DEVICE_H_
+#define _HID_CLASS_DEVICE_H_
+
+	/* Includes: */
+		#include "../../USB.h"
+		#include "../Common/HIDClassCommon.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_HID_DRIVER)
+			#error Do not include this file directly. Include LUFA/Drivers/USB.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Type Defines: */
+			/** \brief HID Class Device Mode Configuration and State Structure.
+			 *
+			 *  Class state structure. An instance of this structure should be made for each HID interface
+			 *  within the user application, and passed to each of the HID class driver functions as the
+			 *  \c HIDInterfaceInfo parameter. This stores each HID interface's configuration and state information.
+			 *
+			 *  \note Due to technical limitations, the HID device class driver does not utilize a separate OUT
+			 *        endpoint for host->device communications. Instead, the host->device data (if any) is sent to
+			 *        the device via the control endpoint.
+			 */
+			typedef struct
+			{
+				struct
+				{
+					uint8_t  InterfaceNumber; /**< Interface number of the HID interface within the device. */
+
+					USB_Endpoint_Table_t ReportINEndpoint; /**< Data IN HID report endpoint configuration table. */
+
+					void*    PrevReportINBuffer; /**< Pointer to a buffer where the previously created HID input report can be
+					                              *  stored by the driver, for comparison purposes to detect report changes that
+					                              *  must be sent immediately to the host. This should point to a buffer big enough
+					                              *  to hold the largest HID input report sent from the HID interface. If this is set
+					                              *  to \c NULL, it is up to the user to force transfers when needed in the
+					                              *  \ref CALLBACK_HID_Device_CreateHIDReport() callback function.
+					                              *
+					                              *  \note Due to the single buffer, the internal driver can only correctly compare
+					                              *        subsequent reports with identical report IDs. In multiple report devices,
+					                              *        this buffer should be set to \c NULL and the decision to send reports made
+					                              *        by the user application instead.
+					                              */
+					uint8_t  PrevReportINBufferSize; /**< Size in bytes of the given input report buffer. This is used to create a
+					                                  *  second buffer of the same size within the driver so that subsequent reports
+					                                  *  can be compared. If the user app is to determine when reports are to be sent
+					                                  *  exclusively (i.e. \c PrevReportINBuffer is \c NULL) this value must still be
+					                                  *  set to the size of the largest report the device can issue to the host.
+					                                  */
+				} Config; /**< Config data for the USB class interface within the device. All elements in this section
+				           *   <b>must</b> be set or the interface will fail to enumerate and operate correctly.
+				           */
+				struct
+				{
+					bool     UsingReportProtocol; /**< Indicates if the HID interface is set to Boot or Report protocol mode. */
+					uint16_t PrevFrameNum; /**< Frame number of the previous HID report packet opportunity. */
+					uint16_t IdleCount; /**< Report idle period, in milliseconds, set by the host. */
+					uint16_t IdleMSRemaining; /**< Total number of milliseconds remaining before the idle period elapsed - this
+				                               *   should be decremented by the user application if non-zero each millisecond. */
+				} State; /**< State data for the USB class interface within the device. All elements in this section
+				          *   are reset to their defaults when the interface is enumerated.
+				          */
+			} USB_ClassInfo_HID_Device_t;
+
+		/* Function Prototypes: */
+			/** Configures the endpoints of a given HID interface, ready for use. This should be linked to the library
+			 *  \ref EVENT_USB_Device_ConfigurationChanged() event so that the endpoints are configured when the configuration
+			 *  containing the given HID interface is selected.
+			 *
+			 *  \param[in,out] HIDInterfaceInfo  Pointer to a structure containing a HID Class configuration and state.
+			 *
+			 *  \return Boolean \c true if the endpoints were successfully configured, \c false otherwise.
+			 */
+			bool HID_Device_ConfigureEndpoints(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Processes incoming control requests from the host, that are directed to the given HID class interface. This should be
+			 *  linked to the library \ref EVENT_USB_Device_ControlRequest() event.
+			 *
+			 *  \param[in,out] HIDInterfaceInfo  Pointer to a structure containing a HID Class configuration and state.
+			 */
+			void HID_Device_ProcessControlRequest(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** General management task for a given HID class interface, required for the correct operation of the interface. This should
+			 *  be called frequently in the main program loop, before the master USB management task \ref USB_USBTask().
+			 *
+			 *  \param[in,out] HIDInterfaceInfo  Pointer to a structure containing a HID Class configuration and state.
+			 */
+			void HID_Device_USBTask(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** HID class driver callback for the user creation of a HID IN report. This callback may fire in response to either
+			 *  HID class control requests from the host, or by the normal HID endpoint polling procedure. Inside this callback the
+			 *  user is responsible for the creation of the next HID input report to be sent to the host.
+			 *
+			 *  \param[in,out] HIDInterfaceInfo  Pointer to a structure containing a HID Class configuration and state.
+			 *  \param[in,out] ReportID          If preset to a non-zero value, this is the report ID being requested by the host. If zero,
+			 *                                   this should be set to the report ID of the generated HID input report (if any). If multiple
+			 *                                   reports are not sent via the given HID interface, this parameter should be ignored.
+			 *  \param[in]     ReportType        Type of HID report to generate, either \ref HID_REPORT_ITEM_In or \ref HID_REPORT_ITEM_Feature.
+			 *  \param[out]    ReportData        Pointer to a buffer where the generated HID report should be stored.
+			 *  \param[out]    ReportSize        Number of bytes in the generated input report, or zero if no report is to be sent.
+			 *
+			 *  \return Boolean \c true to force the sending of the report even if it is identical to the previous report and still within
+			 *          the idle period (useful for devices which report relative movement), \c false otherwise.
+			 */
+			bool CALLBACK_HID_Device_CreateHIDReport(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo,
+			                                         uint8_t* const ReportID,
+			                                         const uint8_t ReportType,
+			                                         void* ReportData,
+			                                         uint16_t* const ReportSize) ATTR_NON_NULL_PTR_ARG(1)
+			                                         ATTR_NON_NULL_PTR_ARG(2) ATTR_NON_NULL_PTR_ARG(4) ATTR_NON_NULL_PTR_ARG(5);
+
+			/** HID class driver callback for the user processing of a received HID OUT report. This callback may fire in response to
+			 *  either HID class control requests from the host, or by the normal HID endpoint polling procedure. Inside this callback
+			 *  the user is responsible for the processing of the received HID output report from the host.
+			 *
+			 *  \param[in,out] HIDInterfaceInfo  Pointer to a structure containing a HID Class configuration and state.
+			 *  \param[in]     ReportID          Report ID of the received output report. If multiple reports are not received via the given HID
+			 *                                   interface, this parameter should be ignored.
+			 *  \param[in]     ReportType        Type of received HID report, either \ref HID_REPORT_ITEM_Out or \ref HID_REPORT_ITEM_Feature.
+			 *  \param[in]     ReportData        Pointer to a buffer where the received HID report is stored.
+			 *  \param[in]     ReportSize        Size in bytes of the received report from the host.
+			 */
+			void CALLBACK_HID_Device_ProcessHIDReport(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo,
+			                                          const uint8_t ReportID,
+			                                          const uint8_t ReportType,
+			                                          const void* ReportData,
+			                                          const uint16_t ReportSize) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(4);
+
+		/* Inline Functions: */
+			/** Indicates that a millisecond of idle time has elapsed on the given HID interface, and the interface's idle count should be
+			 *  decremented. This should be called once per millisecond so that hardware key-repeats function correctly. It is recommended
+			 *  that this be called by the \ref EVENT_USB_Device_StartOfFrame() event, once SOF events have been enabled via
+			 *  \ref USB_Device_EnableSOFEvents().
+			 *
+			 *  \param[in,out] HIDInterfaceInfo  Pointer to a structure containing a HID Class configuration and state.
+			 */
+			static inline void HID_Device_MillisecondElapsed(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo) ATTR_ALWAYS_INLINE ATTR_NON_NULL_PTR_ARG(1);
+			static inline void HID_Device_MillisecondElapsed(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo)
+			{
+				if (HIDInterfaceInfo->State.IdleMSRemaining)
+				  HIDInterfaceInfo->State.IdleMSRemaining--;
+			}
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Device/MIDIClassDevice.c b/lib/lufa/LUFA/Drivers/USB/Class/Device/MIDIClassDevice.c
new file mode 100644
index 0000000000..a35c4082bc
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Class/Device/MIDIClassDevice.c
@@ -0,0 +1,131 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+#define  __INCLUDE_FROM_USB_DRIVER
+#include "../../Core/USBMode.h"
+
+#if defined(USB_CAN_BE_DEVICE)
+
+#define  __INCLUDE_FROM_MIDI_DRIVER
+#define  __INCLUDE_FROM_MIDI_DEVICE_C
+#include "MIDIClassDevice.h"
+
+bool MIDI_Device_ConfigureEndpoints(USB_ClassInfo_MIDI_Device_t* const MIDIInterfaceInfo)
+{
+	memset(&MIDIInterfaceInfo->State, 0x00, sizeof(MIDIInterfaceInfo->State));
+
+	MIDIInterfaceInfo->Config.DataINEndpoint.Type  = EP_TYPE_BULK;
+	MIDIInterfaceInfo->Config.DataOUTEndpoint.Type = EP_TYPE_BULK;
+
+	if (!(Endpoint_ConfigureEndpointTable(&MIDIInterfaceInfo->Config.DataINEndpoint, 1)))
+	  return false;
+
+	if (!(Endpoint_ConfigureEndpointTable(&MIDIInterfaceInfo->Config.DataOUTEndpoint, 1)))
+	  return false;
+
+	return true;
+}
+
+void MIDI_Device_USBTask(USB_ClassInfo_MIDI_Device_t* const MIDIInterfaceInfo)
+{
+	if (USB_DeviceState != DEVICE_STATE_Configured)
+	  return;
+
+	#if !defined(NO_CLASS_DRIVER_AUTOFLUSH)
+	Endpoint_SelectEndpoint(MIDIInterfaceInfo->Config.DataINEndpoint.Address);
+
+	if (Endpoint_IsINReady())
+	  MIDI_Device_Flush(MIDIInterfaceInfo);
+	#endif
+}
+
+uint8_t MIDI_Device_SendEventPacket(USB_ClassInfo_MIDI_Device_t* const MIDIInterfaceInfo,
+                                    const MIDI_EventPacket_t* const Event)
+{
+	if (USB_DeviceState != DEVICE_STATE_Configured)
+	  return ENDPOINT_RWSTREAM_DeviceDisconnected;
+
+	uint8_t ErrorCode;
+
+	Endpoint_SelectEndpoint(MIDIInterfaceInfo->Config.DataINEndpoint.Address);
+
+	if ((ErrorCode = Endpoint_Write_Stream_LE(Event, sizeof(MIDI_EventPacket_t), NULL)) != ENDPOINT_RWSTREAM_NoError)
+	  return ErrorCode;
+
+	if (!(Endpoint_IsReadWriteAllowed()))
+	  Endpoint_ClearIN();
+
+	return ENDPOINT_RWSTREAM_NoError;
+}
+
+uint8_t MIDI_Device_Flush(USB_ClassInfo_MIDI_Device_t* const MIDIInterfaceInfo)
+{
+	if (USB_DeviceState != DEVICE_STATE_Configured)
+	  return ENDPOINT_RWSTREAM_DeviceDisconnected;
+
+	uint8_t ErrorCode;
+
+	Endpoint_SelectEndpoint(MIDIInterfaceInfo->Config.DataINEndpoint.Address);
+
+	if (Endpoint_BytesInEndpoint())
+	{
+		Endpoint_ClearIN();
+
+		if ((ErrorCode = Endpoint_WaitUntilReady()) != ENDPOINT_READYWAIT_NoError)
+		  return ErrorCode;
+	}
+
+	return ENDPOINT_READYWAIT_NoError;
+}
+
+bool MIDI_Device_ReceiveEventPacket(USB_ClassInfo_MIDI_Device_t* const MIDIInterfaceInfo,
+                                    MIDI_EventPacket_t* const Event)
+{
+	if (USB_DeviceState != DEVICE_STATE_Configured)
+	  return false;
+
+	Endpoint_SelectEndpoint(MIDIInterfaceInfo->Config.DataOUTEndpoint.Address);
+
+	if (!(Endpoint_IsOUTReceived()))
+		return false;
+
+	if (!(Endpoint_IsReadWriteAllowed()))
+	  return false;
+
+	Endpoint_Read_Stream_LE(Event, sizeof(MIDI_EventPacket_t), NULL);
+
+	if (!(Endpoint_IsReadWriteAllowed()))
+	  Endpoint_ClearOUT();
+
+	return true;
+}
+
+#endif
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Device/MIDIClassDevice.h b/lib/lufa/LUFA/Drivers/USB/Class/Device/MIDIClassDevice.h
new file mode 100644
index 0000000000..ee2efd7c18
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Class/Device/MIDIClassDevice.h
@@ -0,0 +1,175 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Device mode driver for the library USB MIDI Class driver.
+ *
+ *  Device mode driver for the library USB MIDI Class driver.
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the USB module driver
+ *        dispatch header located in LUFA/Drivers/USB.h.
+ */
+
+/** \ingroup Group_USBClassMIDI
+ *  \defgroup Group_USBClassMIDIDevice MIDI Class Device Mode Driver
+ *
+ *  \section Sec_USBClassMIDIDevice_Dependencies Module Source Dependencies
+ *  The following files must be built with any user project that uses this module:
+ *    - LUFA/Drivers/USB/Class/Device/MIDIClassDevice.c <i>(Makefile source module name: LUFA_SRC_USBCLASS)</i>
+ *
+ *  \section Sec_USBClassMIDIDevice_ModDescription Module Description
+ *  Device Mode USB Class driver framework interface, for the MIDI USB Class driver.
+ *
+ *  @{
+ */
+
+#ifndef _MIDI_CLASS_DEVICE_H_
+#define _MIDI_CLASS_DEVICE_H_
+
+	/* Includes: */
+		#include "../../USB.h"
+		#include "../Common/MIDIClassCommon.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_MIDI_DRIVER)
+			#error Do not include this file directly. Include LUFA/Drivers/USB.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Type Define: */
+			/** \brief MIDI Class Device Mode Configuration and State Structure.
+			 *
+			 *  Class state structure. An instance of this structure should be made for each MIDI interface
+			 *  within the user application, and passed to each of the MIDI class driver functions as the
+			 *  \c MIDIInterfaceInfo parameter. This stores each MIDI interface's configuration and state information.
+			 */
+			typedef struct
+			{
+				struct
+				{
+					uint8_t  StreamingInterfaceNumber; /**< Index of the Audio Streaming interface within the device this structure controls. */
+
+					USB_Endpoint_Table_t DataINEndpoint; /**< Data IN endpoint configuration table. */
+					USB_Endpoint_Table_t DataOUTEndpoint; /**< Data OUT endpoint configuration table. */
+				} Config; /**< Config data for the USB class interface within the device. All elements in this section
+				           *   <b>must</b> be set or the interface will fail to enumerate and operate correctly.
+				           */
+
+				struct
+				{
+					uint8_t RESERVED; // No state information for this class
+				} State; /**< State data for the USB class interface within the device. All elements in this section
+				          *   are reset to their defaults when the interface is enumerated.
+				          */
+			} USB_ClassInfo_MIDI_Device_t;
+
+		/* Function Prototypes: */
+			/** Configures the endpoints of a given MIDI interface, ready for use. This should be linked to the library
+			 *  \ref EVENT_USB_Device_ConfigurationChanged() event so that the endpoints are configured when the configuration
+			 *  containing the given MIDI interface is selected.
+			 *
+			 *  \param[in,out] MIDIInterfaceInfo  Pointer to a structure containing a MIDI Class configuration and state.
+			 *
+			 *  \return Boolean \c true if the endpoints were successfully configured, \c false otherwise.
+			 */
+			bool MIDI_Device_ConfigureEndpoints(USB_ClassInfo_MIDI_Device_t* const MIDIInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** General management task for a given MIDI class interface, required for the correct operation of the interface. This should
+			 *  be called frequently in the main program loop, before the master USB management task \ref USB_USBTask().
+			 *
+			 *  \param[in,out] MIDIInterfaceInfo  Pointer to a structure containing a MIDI Class configuration and state.
+			 */
+			void MIDI_Device_USBTask(USB_ClassInfo_MIDI_Device_t* const MIDIInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Sends a MIDI event packet to the host. If no host is connected, the event packet is discarded. Events are queued into the
+			 *  endpoint bank until either the endpoint bank is full, or \ref MIDI_Device_Flush() is called. This allows for multiple
+			 *  MIDI events to be packed into a single endpoint packet, increasing data throughput.
+			 *
+			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the
+			 *       call will fail.
+			 *
+			 *  \param[in,out] MIDIInterfaceInfo  Pointer to a structure containing a MIDI Class configuration and state.
+			 *  \param[in]     Event              Pointer to a populated \ref MIDI_EventPacket_t structure containing the MIDI event to send.
+			 *
+			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t MIDI_Device_SendEventPacket(USB_ClassInfo_MIDI_Device_t* const MIDIInterfaceInfo,
+			                                    const MIDI_EventPacket_t* const Event) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2);
+
+
+			/** Flushes the MIDI send buffer, sending any queued MIDI events to the host. This should be called to override the
+			 *  \ref MIDI_Device_SendEventPacket() function's packing behavior, to flush queued events.
+			 *
+			 *  \param[in,out] MIDIInterfaceInfo  Pointer to a structure containing a MIDI Class configuration and state.
+			 *
+			 *  \return A value from the \ref Endpoint_WaitUntilReady_ErrorCodes_t enum.
+			 */
+			uint8_t MIDI_Device_Flush(USB_ClassInfo_MIDI_Device_t* const MIDIInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Receives a MIDI event packet from the host. Events are unpacked from the endpoint, thus if the endpoint bank contains
+			 *  multiple MIDI events from the host in the one packet, multiple calls to this function will return each individual event.
+			 *
+			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the
+			 *       call will fail.
+			 *
+			 *  \param[in,out] MIDIInterfaceInfo  Pointer to a structure containing a MIDI Class configuration and state.
+			 *  \param[out]    Event              Pointer to a USB_MIDI_EventPacket_t structure where the received MIDI event is to be placed.
+			 *
+			 *  \return Boolean \c true if a MIDI event packet was received, \c false otherwise.
+			 */
+			bool MIDI_Device_ReceiveEventPacket(USB_ClassInfo_MIDI_Device_t* const MIDIInterfaceInfo,
+			                                    MIDI_EventPacket_t* const Event) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2);
+
+		/* Inline Functions: */
+			/** Processes incoming control requests from the host, that are directed to the given MIDI class interface. This should be
+			 *  linked to the library \ref EVENT_USB_Device_ControlRequest() event.
+			 *
+			 *  \param[in,out] MIDIInterfaceInfo  Pointer to a structure containing a MIDI Class configuration and state.
+			 */
+			static inline void MIDI_Device_ProcessControlRequest(USB_ClassInfo_MIDI_Device_t* const MIDIInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
+			static inline void MIDI_Device_ProcessControlRequest(USB_ClassInfo_MIDI_Device_t* const MIDIInterfaceInfo)
+			{
+				(void)MIDIInterfaceInfo;
+			}
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.c b/lib/lufa/LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.c
new file mode 100644
index 0000000000..1ea30f7cbc
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.c
@@ -0,0 +1,215 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+#define  __INCLUDE_FROM_USB_DRIVER
+#include "../../Core/USBMode.h"
+
+#if defined(USB_CAN_BE_DEVICE)
+
+#define  __INCLUDE_FROM_MS_DRIVER
+#define  __INCLUDE_FROM_MASSSTORAGE_DEVICE_C
+#include "MassStorageClassDevice.h"
+
+void MS_Device_ProcessControlRequest(USB_ClassInfo_MS_Device_t* const MSInterfaceInfo)
+{
+	if (!(Endpoint_IsSETUPReceived()))
+	  return;
+
+	if (USB_ControlRequest.wIndex != MSInterfaceInfo->Config.InterfaceNumber)
+	  return;
+
+	switch (USB_ControlRequest.bRequest)
+	{
+		case MS_REQ_MassStorageReset:
+			if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
+			{
+				Endpoint_ClearSETUP();
+				Endpoint_ClearStatusStage();
+
+				MSInterfaceInfo->State.IsMassStoreReset = true;
+			}
+
+			break;
+		case MS_REQ_GetMaxLUN:
+			if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))
+			{
+				Endpoint_ClearSETUP();
+				while (!(Endpoint_IsINReady()));
+				Endpoint_Write_8(MSInterfaceInfo->Config.TotalLUNs - 1);
+				Endpoint_ClearIN();
+				Endpoint_ClearStatusStage();
+			}
+
+			break;
+	}
+}
+
+bool MS_Device_ConfigureEndpoints(USB_ClassInfo_MS_Device_t* const MSInterfaceInfo)
+{
+	memset(&MSInterfaceInfo->State, 0x00, sizeof(MSInterfaceInfo->State));
+
+	MSInterfaceInfo->Config.DataINEndpoint.Type  = EP_TYPE_BULK;
+	MSInterfaceInfo->Config.DataOUTEndpoint.Type = EP_TYPE_BULK;
+
+	if (!(Endpoint_ConfigureEndpointTable(&MSInterfaceInfo->Config.DataINEndpoint, 1)))
+	  return false;
+
+	if (!(Endpoint_ConfigureEndpointTable(&MSInterfaceInfo->Config.DataOUTEndpoint, 1)))
+	  return false;
+
+	return true;
+}
+
+void MS_Device_USBTask(USB_ClassInfo_MS_Device_t* const MSInterfaceInfo)
+{
+	if (USB_DeviceState != DEVICE_STATE_Configured)
+	  return;
+
+	Endpoint_SelectEndpoint(MSInterfaceInfo->Config.DataOUTEndpoint.Address);
+
+	if (Endpoint_IsOUTReceived())
+	{
+		if (MS_Device_ReadInCommandBlock(MSInterfaceInfo))
+		{
+			if (MSInterfaceInfo->State.CommandBlock.Flags & MS_COMMAND_DIR_DATA_IN)
+			  Endpoint_SelectEndpoint(MSInterfaceInfo->Config.DataINEndpoint.Address);
+
+			bool SCSICommandResult = CALLBACK_MS_Device_SCSICommandReceived(MSInterfaceInfo);
+
+			MSInterfaceInfo->State.CommandStatus.Status              = (SCSICommandResult) ? MS_SCSI_COMMAND_Pass : MS_SCSI_COMMAND_Fail;
+			MSInterfaceInfo->State.CommandStatus.Signature           = CPU_TO_LE32(MS_CSW_SIGNATURE);
+			MSInterfaceInfo->State.CommandStatus.Tag                 = MSInterfaceInfo->State.CommandBlock.Tag;
+			MSInterfaceInfo->State.CommandStatus.DataTransferResidue = MSInterfaceInfo->State.CommandBlock.DataTransferLength;
+
+			if (!(SCSICommandResult) && (le32_to_cpu(MSInterfaceInfo->State.CommandStatus.DataTransferResidue)))
+			  Endpoint_StallTransaction();
+
+			MS_Device_ReturnCommandStatus(MSInterfaceInfo);
+		}
+	}
+
+	if (MSInterfaceInfo->State.IsMassStoreReset)
+	{
+		Endpoint_ResetEndpoint(MSInterfaceInfo->Config.DataOUTEndpoint.Address);
+		Endpoint_ResetEndpoint(MSInterfaceInfo->Config.DataINEndpoint.Address);
+
+		Endpoint_SelectEndpoint(MSInterfaceInfo->Config.DataOUTEndpoint.Address);
+		Endpoint_ClearStall();
+		Endpoint_ResetDataToggle();
+		Endpoint_SelectEndpoint(MSInterfaceInfo->Config.DataINEndpoint.Address);
+		Endpoint_ClearStall();
+		Endpoint_ResetDataToggle();
+
+		MSInterfaceInfo->State.IsMassStoreReset = false;
+	}
+}
+
+static bool MS_Device_ReadInCommandBlock(USB_ClassInfo_MS_Device_t* const MSInterfaceInfo)
+{
+	uint16_t BytesProcessed;
+
+	Endpoint_SelectEndpoint(MSInterfaceInfo->Config.DataOUTEndpoint.Address);
+
+	BytesProcessed = 0;
+	while (Endpoint_Read_Stream_LE(&MSInterfaceInfo->State.CommandBlock,
+	                               (sizeof(MS_CommandBlockWrapper_t) - 16), &BytesProcessed) ==
+	                               ENDPOINT_RWSTREAM_IncompleteTransfer)
+	{
+		if (MSInterfaceInfo->State.IsMassStoreReset)
+		  return false;
+	}
+
+	if ((MSInterfaceInfo->State.CommandBlock.Signature         != CPU_TO_LE32(MS_CBW_SIGNATURE))     ||
+	    (MSInterfaceInfo->State.CommandBlock.LUN               >= MSInterfaceInfo->Config.TotalLUNs) ||
+		(MSInterfaceInfo->State.CommandBlock.Flags              & 0x1F)                              ||
+		(MSInterfaceInfo->State.CommandBlock.SCSICommandLength == 0)                                 ||
+		(MSInterfaceInfo->State.CommandBlock.SCSICommandLength >  16))
+	{
+		Endpoint_StallTransaction();
+		Endpoint_SelectEndpoint(MSInterfaceInfo->Config.DataINEndpoint.Address);
+		Endpoint_StallTransaction();
+
+		return false;
+	}
+
+	BytesProcessed = 0;
+	while (Endpoint_Read_Stream_LE(&MSInterfaceInfo->State.CommandBlock.SCSICommandData,
+	                                MSInterfaceInfo->State.CommandBlock.SCSICommandLength, &BytesProcessed) ==
+	                                ENDPOINT_RWSTREAM_IncompleteTransfer)
+	{
+		if (MSInterfaceInfo->State.IsMassStoreReset)
+		  return false;
+	}
+
+	Endpoint_ClearOUT();
+
+	return true;
+}
+
+static void MS_Device_ReturnCommandStatus(USB_ClassInfo_MS_Device_t* const MSInterfaceInfo)
+{
+	Endpoint_SelectEndpoint(MSInterfaceInfo->Config.DataOUTEndpoint.Address);
+
+	while (Endpoint_IsStalled())
+	{
+		#if !defined(INTERRUPT_CONTROL_ENDPOINT)
+		USB_USBTask();
+		#endif
+
+		if (MSInterfaceInfo->State.IsMassStoreReset)
+		  return;
+	}
+
+	Endpoint_SelectEndpoint(MSInterfaceInfo->Config.DataINEndpoint.Address);
+
+	while (Endpoint_IsStalled())
+	{
+		#if !defined(INTERRUPT_CONTROL_ENDPOINT)
+		USB_USBTask();
+		#endif
+
+		if (MSInterfaceInfo->State.IsMassStoreReset)
+		  return;
+	}
+
+	uint16_t BytesProcessed = 0;
+	while (Endpoint_Write_Stream_LE(&MSInterfaceInfo->State.CommandStatus,
+	                                sizeof(MS_CommandStatusWrapper_t), &BytesProcessed) ==
+	                                ENDPOINT_RWSTREAM_IncompleteTransfer)
+	{
+		if (MSInterfaceInfo->State.IsMassStoreReset)
+		  return;
+	}
+
+	Endpoint_ClearIN();
+}
+
+#endif
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.h b/lib/lufa/LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.h
new file mode 100644
index 0000000000..12b54f8dfb
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.h
@@ -0,0 +1,161 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Device mode driver for the library USB Mass Storage Class driver.
+ *
+ *  Device mode driver for the library USB Mass Storage Class driver.
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the USB module driver
+ *        dispatch header located in LUFA/Drivers/USB.h.
+ */
+
+/** \ingroup Group_USBClassMS
+ *  \defgroup Group_USBClassMSDevice Mass Storage Class Device Mode Driver
+ *
+ *  \section Sec_USBClassMSDevice_Dependencies Module Source Dependencies
+ *  The following files must be built with any user project that uses this module:
+ *    - LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.c <i>(Makefile source module name: LUFA_SRC_USBCLASS)</i>
+ *
+ *  \section Sec_USBClassMSDevice_ModDescription Module Description
+ *  Device Mode USB Class driver framework interface, for the Mass Storage USB Class driver.
+ *
+ *  @{
+ */
+
+#ifndef _MS_CLASS_DEVICE_H_
+#define _MS_CLASS_DEVICE_H_
+
+	/* Includes: */
+		#include "../../USB.h"
+		#include "../Common/MassStorageClassCommon.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_MS_DRIVER)
+			#error Do not include this file directly. Include LUFA/Drivers/USB.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Type Defines: */
+			/** \brief Mass Storage Class Device Mode Configuration and State Structure.
+			 *
+			 *  Class state structure. An instance of this structure should be made for each Mass Storage interface
+			 *  within the user application, and passed to each of the Mass Storage class driver functions as the
+			 *  \c MSInterfaceInfo parameter. This stores each Mass Storage interface's configuration and state information.
+			 */
+			typedef struct
+			{
+				struct
+				{
+					uint8_t  InterfaceNumber; /**< Interface number of the Mass Storage interface within the device. */
+
+					USB_Endpoint_Table_t DataINEndpoint; /**< Data IN endpoint configuration table. */
+					USB_Endpoint_Table_t DataOUTEndpoint; /**< Data OUT endpoint configuration table. */
+
+					uint8_t  TotalLUNs; /**< Total number of logical drives in the Mass Storage interface. */
+				} Config; /**< Config data for the USB class interface within the device. All elements in this section
+				           *   <b>must</b> be set or the interface will fail to enumerate and operate correctly.
+				           */
+				struct
+				{
+					MS_CommandBlockWrapper_t  CommandBlock; /**< Mass Storage class command block structure, stores the received SCSI
+															 *   command from the host which is to be processed.
+															 */
+					MS_CommandStatusWrapper_t CommandStatus; /**< Mass Storage class command status structure, set elements to indicate
+															  *   the issued command's success or failure to the host.
+															  */
+					volatile bool IsMassStoreReset; /**< Flag indicating that the host has requested that the Mass Storage interface be reset
+											         *   and that all current Mass Storage operations should immediately abort.
+											         */
+				} State; /**< State data for the USB class interface within the device. All elements in this section
+				          *   are reset to their defaults when the interface is enumerated.
+				          */
+			} USB_ClassInfo_MS_Device_t;
+
+		/* Function Prototypes: */
+			/** Configures the endpoints of a given Mass Storage interface, ready for use. This should be linked to the library
+			 *  \ref EVENT_USB_Device_ConfigurationChanged() event so that the endpoints are configured when the configuration
+			 *  containing the given Mass Storage interface is selected.
+			 *
+			 *  \param[in,out] MSInterfaceInfo  Pointer to a structure containing a Mass Storage Class configuration and state.
+			 *
+			 *  \return Boolean \c true if the endpoints were successfully configured, \c false otherwise.
+			 */
+			bool MS_Device_ConfigureEndpoints(USB_ClassInfo_MS_Device_t* const MSInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Processes incoming control requests from the host, that are directed to the given Mass Storage class interface. This should be
+			 *  linked to the library \ref EVENT_USB_Device_ControlRequest() event.
+			 *
+			 *  \param[in,out] MSInterfaceInfo  Pointer to a structure containing a Mass Storage Class configuration and state.
+			 */
+			void MS_Device_ProcessControlRequest(USB_ClassInfo_MS_Device_t* const MSInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** General management task for a given Mass Storage class interface, required for the correct operation of the interface. This should
+			 *  be called frequently in the main program loop, before the master USB management task \ref USB_USBTask().
+			 *
+			 *  \param[in,out] MSInterfaceInfo  Pointer to a structure containing a Mass Storage configuration and state.
+			 */
+			void MS_Device_USBTask(USB_ClassInfo_MS_Device_t* const MSInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Mass Storage class driver callback for the user processing of a received SCSI command. This callback will fire each time the
+			 *  host sends a SCSI command which requires processing by the user application. Inside this callback the user is responsible
+			 *  for the processing of the received SCSI command from the host. The SCSI command is available in the CommandBlock structure
+			 *  inside the Mass Storage class state structure passed as a parameter to the callback function.
+			 *
+			 *  \param[in,out] MSInterfaceInfo  Pointer to a structure containing a Mass Storage Class configuration and state.
+			 *
+			 *  \return Boolean \c true if the SCSI command was successfully processed, \c false otherwise.
+			 */
+			bool CALLBACK_MS_Device_SCSICommandReceived(USB_ClassInfo_MS_Device_t* const MSInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
+
+	/* Private Interface - For use in library only: */
+	#if !defined(__DOXYGEN__)
+		/* Function Prototypes: */
+			#if defined(__INCLUDE_FROM_MASSSTORAGE_DEVICE_C)
+				static void MS_Device_ReturnCommandStatus(USB_ClassInfo_MS_Device_t* const MSInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
+				static bool MS_Device_ReadInCommandBlock(USB_ClassInfo_MS_Device_t* const MSInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
+			#endif
+
+	#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Device/PrinterClassDevice.c b/lib/lufa/LUFA/Drivers/USB/Class/Device/PrinterClassDevice.c
new file mode 100644
index 0000000000..7209c452dc
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Class/Device/PrinterClassDevice.c
@@ -0,0 +1,314 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+#define  __INCLUDE_FROM_USB_DRIVER
+#include "../../Core/USBMode.h"
+
+#if defined(USB_CAN_BE_DEVICE)
+
+#define  __INCLUDE_FROM_PRINTER_DRIVER
+#define  __INCLUDE_FROM_PRINTER_DEVICE_C
+#include "PrinterClassDevice.h"
+
+void PRNT_Device_ProcessControlRequest(USB_ClassInfo_PRNT_Device_t* const PRNTInterfaceInfo)
+{
+	if (!(Endpoint_IsSETUPReceived()))
+	  return;
+
+	if (USB_ControlRequest.wIndex != PRNTInterfaceInfo->Config.InterfaceNumber)
+	  return;
+
+	switch (USB_ControlRequest.bRequest)
+	{
+		case PRNT_REQ_GetDeviceID:
+			if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))
+			{
+				Endpoint_ClearSETUP();
+
+				while (!(Endpoint_IsINReady()))
+				{
+					if (USB_DeviceState == DEVICE_STATE_Unattached)
+					  return;
+				}
+
+				uint16_t IEEEStringLen = strlen(PRNTInterfaceInfo->Config.IEEE1284String);
+				Endpoint_Write_16_BE(IEEEStringLen);
+				Endpoint_Write_Control_Stream_LE(PRNTInterfaceInfo->Config.IEEE1284String, IEEEStringLen);
+				Endpoint_ClearStatusStage();
+			}
+
+			break;
+		case PRNT_REQ_GetPortStatus:
+			if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))
+			{
+				Endpoint_ClearSETUP();
+
+				while (!(Endpoint_IsINReady()))
+				{
+					if (USB_DeviceState == DEVICE_STATE_Unattached)
+					  return;
+				}
+
+				Endpoint_Write_8(PRNTInterfaceInfo->State.PortStatus);
+				Endpoint_ClearStatusStage();
+			}
+
+			break;
+		case PRNT_REQ_SoftReset:
+			if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
+			{
+				Endpoint_ClearSETUP();
+				Endpoint_ClearStatusStage();
+
+				PRNTInterfaceInfo->State.IsPrinterReset = true;
+
+				EVENT_PRNT_Device_SoftReset(PRNTInterfaceInfo);
+			}
+
+			break;
+	}
+}
+
+bool PRNT_Device_ConfigureEndpoints(USB_ClassInfo_PRNT_Device_t* const PRNTInterfaceInfo)
+{
+	memset(&PRNTInterfaceInfo->State, 0x00, sizeof(PRNTInterfaceInfo->State));
+	PRNTInterfaceInfo->State.PortStatus = PRNT_PORTSTATUS_NOTERROR | PRNT_PORTSTATUS_SELECT;
+
+	PRNTInterfaceInfo->Config.DataINEndpoint.Type  = EP_TYPE_BULK;
+	PRNTInterfaceInfo->Config.DataOUTEndpoint.Type = EP_TYPE_BULK;
+
+	if (!(Endpoint_ConfigureEndpointTable(&PRNTInterfaceInfo->Config.DataINEndpoint, 1)))
+	  return false;
+
+	if (!(Endpoint_ConfigureEndpointTable(&PRNTInterfaceInfo->Config.DataOUTEndpoint, 1)))
+	  return false;
+
+	return true;
+}
+
+void PRNT_Device_USBTask(USB_ClassInfo_PRNT_Device_t* const PRNTInterfaceInfo)
+{
+	if (USB_DeviceState != DEVICE_STATE_Configured)
+	  return;
+
+	#if !defined(NO_CLASS_DRIVER_AUTOFLUSH)
+	Endpoint_SelectEndpoint(PRNTInterfaceInfo->Config.DataINEndpoint.Address);
+
+	if (Endpoint_IsINReady())
+	  PRNT_Device_Flush(PRNTInterfaceInfo);
+	#endif
+
+	if (PRNTInterfaceInfo->State.IsPrinterReset)
+	{
+		Endpoint_ResetEndpoint(PRNTInterfaceInfo->Config.DataOUTEndpoint.Address);
+		Endpoint_ResetEndpoint(PRNTInterfaceInfo->Config.DataINEndpoint.Address);
+
+		Endpoint_SelectEndpoint(PRNTInterfaceInfo->Config.DataOUTEndpoint.Address);
+		Endpoint_ClearStall();
+		Endpoint_ResetDataToggle();
+		Endpoint_SelectEndpoint(PRNTInterfaceInfo->Config.DataINEndpoint.Address);
+		Endpoint_ClearStall();
+		Endpoint_ResetDataToggle();
+
+		PRNTInterfaceInfo->State.IsPrinterReset = false;
+	}
+}
+
+uint8_t PRNT_Device_SendString(USB_ClassInfo_PRNT_Device_t* const PRNTInterfaceInfo,
+                               const char* const String)
+{
+	if (USB_DeviceState != DEVICE_STATE_Configured)
+	  return ENDPOINT_RWSTREAM_DeviceDisconnected;
+
+	Endpoint_SelectEndpoint(PRNTInterfaceInfo->Config.DataINEndpoint.Address);
+	return Endpoint_Write_Stream_LE(String, strlen(String), NULL);
+}
+
+uint8_t PRNT_Device_SendData(USB_ClassInfo_PRNT_Device_t* const PRNTInterfaceInfo,
+                             const void* const Buffer,
+                             const uint16_t Length)
+{
+	if (USB_DeviceState != DEVICE_STATE_Configured)
+	  return ENDPOINT_RWSTREAM_DeviceDisconnected;
+
+	Endpoint_SelectEndpoint(PRNTInterfaceInfo->Config.DataINEndpoint.Address);
+	return Endpoint_Write_Stream_LE(Buffer, Length, NULL);
+}
+
+uint8_t PRNT_Device_SendByte(USB_ClassInfo_PRNT_Device_t* const PRNTInterfaceInfo,
+                             const uint8_t Data)
+{
+	if (USB_DeviceState != DEVICE_STATE_Configured)
+	  return ENDPOINT_RWSTREAM_DeviceDisconnected;
+
+	Endpoint_SelectEndpoint(PRNTInterfaceInfo->Config.DataINEndpoint.Address);
+
+	if (!(Endpoint_IsReadWriteAllowed()))
+	{
+		Endpoint_ClearIN();
+
+		uint8_t ErrorCode;
+
+		if ((ErrorCode = Endpoint_WaitUntilReady()) != ENDPOINT_READYWAIT_NoError)
+		  return ErrorCode;
+	}
+
+	Endpoint_Write_8(Data);
+	return ENDPOINT_READYWAIT_NoError;
+}
+
+uint8_t PRNT_Device_Flush(USB_ClassInfo_PRNT_Device_t* const PRNTInterfaceInfo)
+{
+	if (USB_DeviceState != DEVICE_STATE_Configured)
+	  return ENDPOINT_RWSTREAM_DeviceDisconnected;
+
+	uint8_t ErrorCode;
+
+	Endpoint_SelectEndpoint(PRNTInterfaceInfo->Config.DataINEndpoint.Address);
+
+	if (!(Endpoint_BytesInEndpoint()))
+	  return ENDPOINT_READYWAIT_NoError;
+
+	bool BankFull = !(Endpoint_IsReadWriteAllowed());
+
+	Endpoint_ClearIN();
+
+	if (BankFull)
+	{
+		if ((ErrorCode = Endpoint_WaitUntilReady()) != ENDPOINT_READYWAIT_NoError)
+		  return ErrorCode;
+
+		Endpoint_ClearIN();
+	}
+
+	return ENDPOINT_READYWAIT_NoError;
+}
+
+uint16_t PRNT_Device_BytesReceived(USB_ClassInfo_PRNT_Device_t* const PRNTInterfaceInfo)
+{
+	if (USB_DeviceState != DEVICE_STATE_Configured)
+	  return 0;
+
+	Endpoint_SelectEndpoint(PRNTInterfaceInfo->Config.DataOUTEndpoint.Address);
+
+	if (Endpoint_IsOUTReceived())
+	{
+		if (!(Endpoint_BytesInEndpoint()))
+		{
+			Endpoint_ClearOUT();
+			return 0;
+		}
+		else
+		{
+			return Endpoint_BytesInEndpoint();
+		}
+	}
+	else
+	{
+		return 0;
+	}
+}
+
+int16_t PRNT_Device_ReceiveByte(USB_ClassInfo_PRNT_Device_t* const PRNTInterfaceInfo)
+{
+	if (USB_DeviceState != DEVICE_STATE_Configured)
+	  return -1;
+
+	int16_t ReceivedByte = -1;
+
+	Endpoint_SelectEndpoint(PRNTInterfaceInfo->Config.DataOUTEndpoint.Address);
+
+	if (Endpoint_IsOUTReceived())
+	{
+		if (Endpoint_BytesInEndpoint())
+		  ReceivedByte = Endpoint_Read_8();
+
+		if (!(Endpoint_BytesInEndpoint()))
+		  Endpoint_ClearOUT();
+	}
+
+	return ReceivedByte;
+}
+
+#if defined(FDEV_SETUP_STREAM)
+void PRNT_Device_CreateStream(USB_ClassInfo_PRNT_Device_t* const PRNTInterfaceInfo,
+                              FILE* const Stream)
+{
+	*Stream = (FILE)FDEV_SETUP_STREAM(PRNT_Device_putchar, PRNT_Device_getchar, _FDEV_SETUP_RW);
+	fdev_set_udata(Stream, PRNTInterfaceInfo);
+}
+
+void PRNT_Device_CreateBlockingStream(USB_ClassInfo_PRNT_Device_t* const PRNTInterfaceInfo,
+                                      FILE* const Stream)
+{
+	*Stream = (FILE)FDEV_SETUP_STREAM(PRNT_Device_putchar, PRNT_Device_getchar_Blocking, _FDEV_SETUP_RW);
+	fdev_set_udata(Stream, PRNTInterfaceInfo);
+}
+
+static int PRNT_Device_putchar(char c,
+                               FILE* Stream)
+{
+	return PRNT_Device_SendByte((USB_ClassInfo_PRNT_Device_t*)fdev_get_udata(Stream), c) ? _FDEV_ERR : 0;
+}
+
+static int PRNT_Device_getchar(FILE* Stream)
+{
+	int16_t ReceivedByte = PRNT_Device_ReceiveByte((USB_ClassInfo_PRNT_Device_t*)fdev_get_udata(Stream));
+
+	if (ReceivedByte < 0)
+	  return _FDEV_EOF;
+
+	return ReceivedByte;
+}
+
+static int PRNT_Device_getchar_Blocking(FILE* Stream)
+{
+	int16_t ReceivedByte;
+
+	while ((ReceivedByte = PRNT_Device_ReceiveByte((USB_ClassInfo_PRNT_Device_t*)fdev_get_udata(Stream))) < 0)
+	{
+		if (USB_DeviceState == DEVICE_STATE_Unattached)
+		  return _FDEV_EOF;
+
+		PRNT_Device_USBTask((USB_ClassInfo_PRNT_Device_t*)fdev_get_udata(Stream));
+		USB_USBTask();
+	}
+
+	return ReceivedByte;
+}
+#endif
+
+void PRNT_Device_Event_Stub(void)
+{
+
+}
+
+#endif
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Device/PrinterClassDevice.h b/lib/lufa/LUFA/Drivers/USB/Class/Device/PrinterClassDevice.h
new file mode 100644
index 0000000000..802c5912d3
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Class/Device/PrinterClassDevice.h
@@ -0,0 +1,293 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Device mode driver for the library USB Printer Class driver.
+ *
+ *  Device mode driver for the library USB Printer Class driver.
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the USB module driver
+ *        dispatch header located in LUFA/Drivers/USB.h.
+ */
+
+/** \ingroup Group_USBClassPrinter
+ *  \defgroup Group_USBClassPrinterDevice Printer Class Device Mode Driver
+ *
+ *  \section Sec_USBClassPrinterDevice_Dependencies Module Source Dependencies
+ *  The following files must be built with any user project that uses this module:
+ *    - LUFA/Drivers/USB/Class/Device/PrinterClassDevice.c <i>(Makefile source module name: LUFA_SRC_USBCLASS)</i>
+ *
+ *  \section Sec_USBClassPrinterDevice_ModDescription Module Description
+ *  Device Mode USB Class driver framework interface, for the Printer USB Class driver.
+ *
+ *  @{
+ */
+
+#ifndef _PRINTER_CLASS_DEVICE_H_
+#define _PRINTER_CLASS_DEVICE_H_
+
+	/* Includes: */
+		#include "../../USB.h"
+		#include "../Common/PrinterClassCommon.h"
+
+		#include <stdio.h>
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_PRINTER_DRIVER)
+			#error Do not include this file directly. Include LUFA/Drivers/USB.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Type Defines: */
+			/** \brief Printer Class Device Mode Configuration and State Structure.
+			 *
+			 *  Class state structure. An instance of this structure should be made for each Printer interface
+			 *  within the user application, and passed to each of the Printer class driver functions as the
+			 *  PRNTInterfaceInfo parameter. This stores each Printer interface's configuration and state information.
+			 */
+			typedef struct
+			{
+				struct
+				{
+					uint8_t InterfaceNumber; /**< Interface number of the Printer interface within the device. */
+
+					USB_Endpoint_Table_t DataINEndpoint; /**< Data IN endpoint configuration table. */
+					USB_Endpoint_Table_t DataOUTEndpoint; /**< Data OUT endpoint configuration table. */
+
+					char* IEEE1284String; /**< IEEE 1284 identification string, sent to the host during enumeration
+					                       *   to identify the printer model, manufacturer and other characteristics.
+					                       */
+				} Config; /**< Config data for the USB class interface within the device. All elements in this section
+				           *   <b>must</b> be set or the interface will fail to enumerate and operate correctly.
+				           */
+				struct
+				{
+					uint8_t PortStatus; /**< Current status of the Printer virtual port, a collection of \c PRNT_PORTSTATUS_*
+					                     *   bitmask values.
+					                     */
+
+					volatile bool IsPrinterReset; /**< Flag indicating that the host has requested that the Printer interface be reset
+											       *   and that all current Mass Storage operations should immediately abort.
+											       */
+				} State; /**< State data for the USB class interface within the device. All elements in this section
+				          *   are reset to their defaults when the interface is enumerated.
+				          */
+			} USB_ClassInfo_PRNT_Device_t;
+
+		/* Function Prototypes: */
+			/** Configures the endpoints of a given Printer interface, ready for use. This should be linked to the library
+			 *  \ref EVENT_USB_Device_ConfigurationChanged() event so that the endpoints are configured when the configuration containing
+			 *  the given Printer interface is selected.
+			 *
+			 *  \param[in,out] PRNTInterfaceInfo  Pointer to a structure containing a Printer Class configuration and state.
+			 *
+			 *  \return Boolean \c true if the endpoints were successfully configured, \c false otherwise.
+			 */
+			bool PRNT_Device_ConfigureEndpoints(USB_ClassInfo_PRNT_Device_t* const PRNTInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Processes incoming control requests from the host, that are directed to the given Printer class interface. This should be
+			 *  linked to the library \ref EVENT_USB_Device_ControlRequest() event.
+			 *
+			 *  \param[in,out] PRNTInterfaceInfo  Pointer to a structure containing a Printer Class configuration and state.
+			 */
+			void PRNT_Device_ProcessControlRequest(USB_ClassInfo_PRNT_Device_t* const PRNTInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** General management task for a given Printer class interface, required for the correct operation of the interface. This should
+			 *  be called frequently in the main program loop, before the master USB management task \ref USB_USBTask().
+			 *
+			 *  \param[in,out] PRNTInterfaceInfo  Pointer to a structure containing a Printer Class configuration and state.
+			 */
+			void PRNT_Device_USBTask(USB_ClassInfo_PRNT_Device_t* const PRNTInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Printer class driver event for a soft reset request on a Printer interface. This event fires each time the host
+			 *  requests a reset of the printer interface's internal state, and may be hooked in the user program by declaring a
+			 *  handler function with the same name and parameters listed here.
+			 *
+			 *  \param[in,out] PRNTInterfaceInfo  Pointer to a structure containing a Printer Class configuration and state.
+			 */
+			void EVENT_PRNT_Device_SoftReset(USB_ClassInfo_PRNT_Device_t* const PRNTInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Sends a given data buffer to the attached USB host, if connected. If a host is not connected when the function is
+			 *  called, the string is discarded. Bytes will be queued for transmission to the host until either the endpoint bank
+			 *  becomes full, or the \ref PRNT_Device_Flush() function is called to flush the pending data to the host. This allows
+			 *  for multiple bytes to be packed into a single endpoint packet, increasing data throughput.
+			 *
+			 *  \pre This function must only be called when the Device state machine is in the \ref DEVICE_STATE_Configured state or
+			 *       the call will fail.
+			 *
+			 *  \param[in,out] PRNTInterfaceInfo  Pointer to a structure containing a Printer Class configuration and state.
+			 *  \param[in]     Buffer            Pointer to a buffer containing the data to send to the device.
+			 *  \param[in]     Length            Length of the data to send to the host.
+			 *
+			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t PRNT_Device_SendData(USB_ClassInfo_PRNT_Device_t* const PRNTInterfaceInfo,
+			                             const void* const Buffer,
+			                             const uint16_t Length) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2);
+
+			/** Sends a given null terminated string to the attached USB host, if connected. If a host is not connected when
+			 *  the function is called, the string is discarded. Bytes will be queued for transmission to the host until either
+			 *  the endpoint bank becomes full, or the \ref PRNT_Device_Flush() function is called to flush the pending data to
+			 *  the host. This allows for multiple bytes to be packed into a single endpoint packet, increasing data throughput.
+			 *
+			 *  \pre This function must only be called when the Device state machine is in the \ref DEVICE_STATE_Configured state or
+			 *       the call will fail.
+			 *
+			 *  \param[in,out] PRNTInterfaceInfo  Pointer to a structure containing a Printer Class configuration and state.
+			 *  \param[in]     String            Pointer to the null terminated string to send to the host.
+			 *
+			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t PRNT_Device_SendString(USB_ClassInfo_PRNT_Device_t* const PRNTInterfaceInfo,
+			                               const char* const String) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2);
+
+			/** Sends a given byte to the attached USB host, if connected. If a host is not connected when the function is called, the
+			 *  byte is discarded. Bytes will be queued for transmission to the host until either the endpoint bank becomes full, or the
+			 *  \ref PRNT_Device_Flush() function is called to flush the pending data to the host. This allows for multiple bytes to be
+			 *  packed into a single endpoint packet, increasing data throughput.
+			 *
+			 *  \pre This function must only be called when the Device state machine is in the \ref DEVICE_STATE_Configured state or
+			 *       the call will fail.
+			 *
+			 *  \param[in,out] PRNTInterfaceInfo  Pointer to a structure containing a Printer Class configuration and state.
+			 *  \param[in]     Data              Byte of data to send to the host.
+			 *
+			 *  \return A value from the \ref Endpoint_WaitUntilReady_ErrorCodes_t enum.
+			 */
+			uint8_t PRNT_Device_SendByte(USB_ClassInfo_PRNT_Device_t* const PRNTInterfaceInfo,
+			                             const uint8_t Data) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Determines the number of bytes received by the Printer interface from the host, waiting to be read. This indicates the number
+			 *  of bytes in the OUT endpoint bank only, and thus the number of calls to \ref PRNT_Device_ReceiveByte() which are guaranteed to
+			 *  succeed immediately. If multiple bytes are to be received, they should be buffered by the user application, as the endpoint
+			 *  bank will not be released back to the USB controller until all bytes are read.
+			 *
+			 *  \pre This function must only be called when the Device state machine is in the \ref DEVICE_STATE_Configured state or
+			 *       the call will fail.
+			 *
+			 *  \param[in,out] PRNTInterfaceInfo  Pointer to a structure containing a Printer Class configuration and state.
+			 *
+			 *  \return Total number of buffered bytes received from the host.
+			 */
+			uint16_t PRNT_Device_BytesReceived(USB_ClassInfo_PRNT_Device_t* const PRNTInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Reads a byte of data from the host. If no data is waiting to be read of if a USB host is not connected, the function
+			 *  returns a negative value. The \ref PRNT_Device_BytesReceived() function may be queried in advance to determine how many
+			 *  bytes are currently buffered in the Printer interface's data receive endpoint bank, and thus how many repeated calls to this
+			 *  function which are guaranteed to succeed.
+			 *
+			 *  \pre This function must only be called when the Device state machine is in the \ref DEVICE_STATE_Configured state or
+			 *       the call will fail.
+			 *
+			 *  \param[in,out] PRNTInterfaceInfo  Pointer to a structure containing a Printer Class configuration and state.
+			 *
+			 *  \return Next received byte from the host, or a negative value if no data received.
+			 */
+			int16_t PRNT_Device_ReceiveByte(USB_ClassInfo_PRNT_Device_t* const PRNTInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Flushes any data waiting to be sent, ensuring that the send buffer is cleared.
+			 *
+			 *  \pre This function must only be called when the Device state machine is in the \ref DEVICE_STATE_Configured state or
+			 *       the call will fail.
+			 *
+			 *  \param[in,out] PRNTInterfaceInfo  Pointer to a structure containing a Printer Class configuration and state.
+			 *
+			 *  \return A value from the \ref Endpoint_WaitUntilReady_ErrorCodes_t enum.
+			 */
+			uint8_t PRNT_Device_Flush(USB_ClassInfo_PRNT_Device_t* const PRNTInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
+
+			#if defined(FDEV_SETUP_STREAM) || defined(__DOXYGEN__)
+			/** Creates a standard character stream for the given Printer Device instance so that it can be used with all the regular
+			 *  functions in the standard <stdio.h> library that accept a \c FILE stream as a destination (e.g. \c fprintf()). The created
+			 *  stream is bidirectional and can be used for both input and output functions.
+			 *
+			 *  Reading data from this stream is non-blocking, i.e. in most instances, complete strings cannot be read in by a single
+			 *  fetch, as the endpoint will not be ready at some point in the transmission, aborting the transfer. However, this may
+			 *  be used when the read data is processed byte-per-bye (via \c getc()) or when the user application will implement its own
+			 *  line buffering.
+			 *
+			 *  \note The created stream can be given as \c stdout if desired to direct the standard output from all \c <stdio.h> functions
+			 *        to the given Printer interface.
+			 *        \n\n
+			 *
+			 *  \note This function is not available on all microcontroller architectures.
+			 *
+			 *  \param[in,out] PRNTInterfaceInfo  Pointer to a structure containing a Printer Class configuration and state.
+			 *  \param[in,out] Stream            Pointer to a FILE structure where the created stream should be placed.
+			 */
+			void PRNT_Device_CreateStream(USB_ClassInfo_PRNT_Device_t* const PRNTInterfaceInfo,
+			                              FILE* const Stream) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2);
+
+			/** Identical to \ref PRNT_Device_CreateStream(), except that reads are blocking until the calling stream function terminates
+			 *  the transfer. While blocking, the USB and Printer service tasks are called repeatedly to maintain USB communications.
+			 *
+			 *  \note This function is not available on all microcontroller architectures.
+			 *
+			 *  \param[in,out] PRNTInterfaceInfo  Pointer to a structure containing a Printer Class configuration and state.
+			 *  \param[in,out] Stream            Pointer to a FILE structure where the created stream should be placed.
+			 */
+			void PRNT_Device_CreateBlockingStream(USB_ClassInfo_PRNT_Device_t* const PRNTInterfaceInfo,
+			                                      FILE* const Stream) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2);
+			#endif
+
+	/* Private Interface - For use in library only: */
+	#if !defined(__DOXYGEN__)
+		/* Function Prototypes: */
+			#if defined(__INCLUDE_FROM_PRINTER_DEVICE_C)
+				#if defined(FDEV_SETUP_STREAM)
+				static int PRNT_Device_putchar(char c,
+				                               FILE* Stream) ATTR_NON_NULL_PTR_ARG(2);
+				static int PRNT_Device_getchar(FILE* Stream) ATTR_NON_NULL_PTR_ARG(1);
+				static int PRNT_Device_getchar_Blocking(FILE* Stream) ATTR_NON_NULL_PTR_ARG(1);
+				#endif
+
+				void PRNT_Device_Event_Stub(void) ATTR_CONST;
+
+				void EVENT_PRNT_Device_SoftReset(USB_ClassInfo_PRNT_Device_t* const PRNTInterfaceInfo)
+				                                 ATTR_WEAK ATTR_NON_NULL_PTR_ARG(1) ATTR_ALIAS(PRNT_Device_Event_Stub);
+
+			#endif
+
+	#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Device/RNDISClassDevice.c b/lib/lufa/LUFA/Drivers/USB/Class/Device/RNDISClassDevice.c
new file mode 100644
index 0000000000..45293b12fc
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Class/Device/RNDISClassDevice.c
@@ -0,0 +1,508 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+#define  __INCLUDE_FROM_USB_DRIVER
+#include "../../Core/USBMode.h"
+
+#if defined(USB_CAN_BE_DEVICE)
+
+#define  __INCLUDE_FROM_RNDIS_DRIVER
+#define  __INCLUDE_FROM_RNDIS_DEVICE_C
+#include "RNDISClassDevice.h"
+
+static const uint32_t PROGMEM AdapterSupportedOIDList[]  =
+	{
+		CPU_TO_LE32(OID_GEN_SUPPORTED_LIST),
+		CPU_TO_LE32(OID_GEN_PHYSICAL_MEDIUM),
+		CPU_TO_LE32(OID_GEN_HARDWARE_STATUS),
+		CPU_TO_LE32(OID_GEN_MEDIA_SUPPORTED),
+		CPU_TO_LE32(OID_GEN_MEDIA_IN_USE),
+		CPU_TO_LE32(OID_GEN_MAXIMUM_FRAME_SIZE),
+		CPU_TO_LE32(OID_GEN_MAXIMUM_TOTAL_SIZE),
+		CPU_TO_LE32(OID_GEN_LINK_SPEED),
+		CPU_TO_LE32(OID_GEN_TRANSMIT_BLOCK_SIZE),
+		CPU_TO_LE32(OID_GEN_RECEIVE_BLOCK_SIZE),
+		CPU_TO_LE32(OID_GEN_VENDOR_ID),
+		CPU_TO_LE32(OID_GEN_VENDOR_DESCRIPTION),
+		CPU_TO_LE32(OID_GEN_CURRENT_PACKET_FILTER),
+		CPU_TO_LE32(OID_GEN_MAXIMUM_TOTAL_SIZE),
+		CPU_TO_LE32(OID_GEN_MEDIA_CONNECT_STATUS),
+		CPU_TO_LE32(OID_GEN_XMIT_OK),
+		CPU_TO_LE32(OID_GEN_RCV_OK),
+		CPU_TO_LE32(OID_GEN_XMIT_ERROR),
+		CPU_TO_LE32(OID_GEN_RCV_ERROR),
+		CPU_TO_LE32(OID_GEN_RCV_NO_BUFFER),
+		CPU_TO_LE32(OID_802_3_PERMANENT_ADDRESS),
+		CPU_TO_LE32(OID_802_3_CURRENT_ADDRESS),
+		CPU_TO_LE32(OID_802_3_MULTICAST_LIST),
+		CPU_TO_LE32(OID_802_3_MAXIMUM_LIST_SIZE),
+		CPU_TO_LE32(OID_802_3_RCV_ERROR_ALIGNMENT),
+		CPU_TO_LE32(OID_802_3_XMIT_ONE_COLLISION),
+		CPU_TO_LE32(OID_802_3_XMIT_MORE_COLLISIONS),
+	};
+
+void RNDIS_Device_ProcessControlRequest(USB_ClassInfo_RNDIS_Device_t* const RNDISInterfaceInfo)
+{
+	if (!(Endpoint_IsSETUPReceived()))
+	  return;
+
+	if (USB_ControlRequest.wIndex != RNDISInterfaceInfo->Config.ControlInterfaceNumber)
+	  return;
+
+	switch (USB_ControlRequest.bRequest)
+	{
+		case RNDIS_REQ_SendEncapsulatedCommand:
+			if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
+			{
+				Endpoint_ClearSETUP();
+				Endpoint_Read_Control_Stream_LE(RNDISInterfaceInfo->Config.MessageBuffer, USB_ControlRequest.wLength);
+				Endpoint_ClearIN();
+
+				RNDIS_Device_ProcessRNDISControlMessage(RNDISInterfaceInfo);
+			}
+
+			break;
+		case RNDIS_REQ_GetEncapsulatedResponse:
+			if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))
+			{
+				RNDIS_Message_Header_t* MessageHeader = (RNDIS_Message_Header_t*)RNDISInterfaceInfo->Config.MessageBuffer;
+
+				if (!(MessageHeader->MessageLength))
+				{
+					RNDISInterfaceInfo->Config.MessageBuffer[0] = 0;
+					MessageHeader->MessageLength                = CPU_TO_LE32(1);
+				}
+
+				Endpoint_ClearSETUP();
+				Endpoint_Write_Control_Stream_LE(RNDISInterfaceInfo->Config.MessageBuffer, le32_to_cpu(MessageHeader->MessageLength));
+				Endpoint_ClearOUT();
+
+				MessageHeader->MessageLength = CPU_TO_LE32(0);
+			}
+
+			break;
+	}
+}
+
+bool RNDIS_Device_ConfigureEndpoints(USB_ClassInfo_RNDIS_Device_t* const RNDISInterfaceInfo)
+{
+	memset(&RNDISInterfaceInfo->State, 0x00, sizeof(RNDISInterfaceInfo->State));
+
+	RNDISInterfaceInfo->Config.DataINEndpoint.Type       = EP_TYPE_BULK;
+	RNDISInterfaceInfo->Config.DataOUTEndpoint.Type      = EP_TYPE_BULK;
+	RNDISInterfaceInfo->Config.NotificationEndpoint.Type = EP_TYPE_INTERRUPT;
+
+	if (RNDISInterfaceInfo->Config.MessageBuffer == NULL)
+	  return false;
+
+	if (RNDISInterfaceInfo->Config.MessageBufferLength < RNDIS_DEVICE_MIN_MESSAGE_BUFFER_LENGTH)
+	  return false;
+
+	if (!(Endpoint_ConfigureEndpointTable(&RNDISInterfaceInfo->Config.DataINEndpoint, 1)))
+	  return false;
+
+	if (!(Endpoint_ConfigureEndpointTable(&RNDISInterfaceInfo->Config.DataOUTEndpoint, 1)))
+	  return false;
+
+	if (!(Endpoint_ConfigureEndpointTable(&RNDISInterfaceInfo->Config.NotificationEndpoint, 1)))
+	  return false;
+
+	return true;
+}
+
+void RNDIS_Device_USBTask(USB_ClassInfo_RNDIS_Device_t* const RNDISInterfaceInfo)
+{
+	if (USB_DeviceState != DEVICE_STATE_Configured)
+	  return;
+
+	Endpoint_SelectEndpoint(RNDISInterfaceInfo->Config.NotificationEndpoint.Address);
+
+	if (Endpoint_IsINReady() && RNDISInterfaceInfo->State.ResponseReady)
+	{
+		USB_Request_Header_t Notification = (USB_Request_Header_t)
+			{
+				.bmRequestType = (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE),
+				.bRequest      = RNDIS_NOTIF_ResponseAvailable,
+				.wValue        = CPU_TO_LE16(0),
+				.wIndex        = CPU_TO_LE16(0),
+				.wLength       = CPU_TO_LE16(0),
+			};
+
+		Endpoint_Write_Stream_LE(&Notification, sizeof(USB_Request_Header_t), NULL);
+
+		Endpoint_ClearIN();
+
+		RNDISInterfaceInfo->State.ResponseReady = false;
+	}
+}
+
+void RNDIS_Device_ProcessRNDISControlMessage(USB_ClassInfo_RNDIS_Device_t* const RNDISInterfaceInfo)
+{
+	/* Note: Only a single buffer is used for both the received message and its response to save SRAM. Because of
+	         this, response bytes should be filled in order so that they do not clobber unread data in the buffer. */
+
+	RNDIS_Message_Header_t* MessageHeader = (RNDIS_Message_Header_t*)RNDISInterfaceInfo->Config.MessageBuffer;
+
+	switch (le32_to_cpu(MessageHeader->MessageType))
+	{
+		case REMOTE_NDIS_INITIALIZE_MSG:
+			RNDISInterfaceInfo->State.ResponseReady     = true;
+
+			RNDIS_Initialize_Message_t*  INITIALIZE_Message  =
+			               (RNDIS_Initialize_Message_t*)RNDISInterfaceInfo->Config.MessageBuffer;
+			RNDIS_Initialize_Complete_t* INITIALIZE_Response =
+			               (RNDIS_Initialize_Complete_t*)RNDISInterfaceInfo->Config.MessageBuffer;
+
+			INITIALIZE_Response->MessageType            = CPU_TO_LE32(REMOTE_NDIS_INITIALIZE_CMPLT);
+			INITIALIZE_Response->MessageLength          = CPU_TO_LE32(sizeof(RNDIS_Initialize_Complete_t));
+			INITIALIZE_Response->RequestId              = INITIALIZE_Message->RequestId;
+			INITIALIZE_Response->Status                 = CPU_TO_LE32(REMOTE_NDIS_STATUS_SUCCESS);
+
+			INITIALIZE_Response->MajorVersion           = CPU_TO_LE32(REMOTE_NDIS_VERSION_MAJOR);
+			INITIALIZE_Response->MinorVersion           = CPU_TO_LE32(REMOTE_NDIS_VERSION_MINOR);
+			INITIALIZE_Response->DeviceFlags            = CPU_TO_LE32(REMOTE_NDIS_DF_CONNECTIONLESS);
+			INITIALIZE_Response->Medium                 = CPU_TO_LE32(REMOTE_NDIS_MEDIUM_802_3);
+			INITIALIZE_Response->MaxPacketsPerTransfer  = CPU_TO_LE32(1);
+			INITIALIZE_Response->MaxTransferSize        = CPU_TO_LE32(sizeof(RNDIS_Packet_Message_t) + ETHERNET_FRAME_SIZE_MAX);
+			INITIALIZE_Response->PacketAlignmentFactor  = CPU_TO_LE32(0);
+			INITIALIZE_Response->AFListOffset           = CPU_TO_LE32(0);
+			INITIALIZE_Response->AFListSize             = CPU_TO_LE32(0);
+
+			RNDISInterfaceInfo->State.CurrRNDISState    = RNDIS_Initialized;
+			break;
+		case REMOTE_NDIS_HALT_MSG:
+			RNDISInterfaceInfo->State.ResponseReady     = false;
+
+			MessageHeader->MessageLength                = CPU_TO_LE32(0);
+
+			RNDISInterfaceInfo->State.CurrRNDISState    = RNDIS_Uninitialized;
+			break;
+		case REMOTE_NDIS_QUERY_MSG:
+			RNDISInterfaceInfo->State.ResponseReady     = true;
+
+			RNDIS_Query_Message_t*  QUERY_Message       = (RNDIS_Query_Message_t*)RNDISInterfaceInfo->Config.MessageBuffer;
+			RNDIS_Query_Complete_t* QUERY_Response      = (RNDIS_Query_Complete_t*)RNDISInterfaceInfo->Config.MessageBuffer;
+			uint32_t                Query_Oid           = CPU_TO_LE32(QUERY_Message->Oid);
+
+			void*    QueryData    = &RNDISInterfaceInfo->Config.MessageBuffer[sizeof(RNDIS_Message_Header_t) +
+			                                                                  le32_to_cpu(QUERY_Message->InformationBufferOffset)];
+			void*    ResponseData = &RNDISInterfaceInfo->Config.MessageBuffer[sizeof(RNDIS_Query_Complete_t)];
+			uint16_t ResponseSize;
+
+			QUERY_Response->MessageType                 = CPU_TO_LE32(REMOTE_NDIS_QUERY_CMPLT);
+
+			if (RNDIS_Device_ProcessNDISQuery(RNDISInterfaceInfo, Query_Oid, QueryData, le32_to_cpu(QUERY_Message->InformationBufferLength),
+			                                  ResponseData, &ResponseSize))
+			{
+				QUERY_Response->Status                  = CPU_TO_LE32(REMOTE_NDIS_STATUS_SUCCESS);
+				QUERY_Response->MessageLength           = cpu_to_le32(sizeof(RNDIS_Query_Complete_t) + ResponseSize);
+
+				QUERY_Response->InformationBufferLength = CPU_TO_LE32(ResponseSize);
+				QUERY_Response->InformationBufferOffset = CPU_TO_LE32(sizeof(RNDIS_Query_Complete_t) - sizeof(RNDIS_Message_Header_t));
+			}
+			else
+			{
+				QUERY_Response->Status                  = CPU_TO_LE32(REMOTE_NDIS_STATUS_NOT_SUPPORTED);
+				QUERY_Response->MessageLength           = CPU_TO_LE32(sizeof(RNDIS_Query_Complete_t));
+
+				QUERY_Response->InformationBufferLength = CPU_TO_LE32(0);
+				QUERY_Response->InformationBufferOffset = CPU_TO_LE32(0);
+			}
+
+			break;
+		case REMOTE_NDIS_SET_MSG:
+			RNDISInterfaceInfo->State.ResponseReady     = true;
+
+			RNDIS_Set_Message_t*  SET_Message           = (RNDIS_Set_Message_t*)RNDISInterfaceInfo->Config.MessageBuffer;
+			RNDIS_Set_Complete_t* SET_Response          = (RNDIS_Set_Complete_t*)RNDISInterfaceInfo->Config.MessageBuffer;
+			uint32_t              SET_Oid               = le32_to_cpu(SET_Message->Oid);
+
+			SET_Response->MessageType                   = CPU_TO_LE32(REMOTE_NDIS_SET_CMPLT);
+			SET_Response->MessageLength                 = CPU_TO_LE32(sizeof(RNDIS_Set_Complete_t));
+			SET_Response->RequestId                     = SET_Message->RequestId;
+
+			void* SetData = &RNDISInterfaceInfo->Config.MessageBuffer[sizeof(RNDIS_Message_Header_t) +
+			                                                              le32_to_cpu(SET_Message->InformationBufferOffset)];
+
+			SET_Response->Status = RNDIS_Device_ProcessNDISSet(RNDISInterfaceInfo, SET_Oid, SetData,
+			                                                   le32_to_cpu(SET_Message->InformationBufferLength)) ?
+			                                                   REMOTE_NDIS_STATUS_SUCCESS : REMOTE_NDIS_STATUS_NOT_SUPPORTED;
+			break;
+		case REMOTE_NDIS_RESET_MSG:
+			RNDISInterfaceInfo->State.ResponseReady     = true;
+
+			RNDIS_Reset_Complete_t* RESET_Response      = (RNDIS_Reset_Complete_t*)RNDISInterfaceInfo->Config.MessageBuffer;
+
+			RESET_Response->MessageType                 = CPU_TO_LE32(REMOTE_NDIS_RESET_CMPLT);
+			RESET_Response->MessageLength               = CPU_TO_LE32(sizeof(RNDIS_Reset_Complete_t));
+			RESET_Response->Status                      = CPU_TO_LE32(REMOTE_NDIS_STATUS_SUCCESS);
+			RESET_Response->AddressingReset             = CPU_TO_LE32(0);
+
+			break;
+		case REMOTE_NDIS_KEEPALIVE_MSG:
+			RNDISInterfaceInfo->State.ResponseReady     = true;
+
+			RNDIS_KeepAlive_Message_t*  KEEPALIVE_Message  =
+			                (RNDIS_KeepAlive_Message_t*)RNDISInterfaceInfo->Config.MessageBuffer;
+			RNDIS_KeepAlive_Complete_t* KEEPALIVE_Response =
+			                (RNDIS_KeepAlive_Complete_t*)RNDISInterfaceInfo->Config.MessageBuffer;
+
+			KEEPALIVE_Response->MessageType             = CPU_TO_LE32(REMOTE_NDIS_KEEPALIVE_CMPLT);
+			KEEPALIVE_Response->MessageLength           = CPU_TO_LE32(sizeof(RNDIS_KeepAlive_Complete_t));
+			KEEPALIVE_Response->RequestId               = KEEPALIVE_Message->RequestId;
+			KEEPALIVE_Response->Status                  = CPU_TO_LE32(REMOTE_NDIS_STATUS_SUCCESS);
+
+			break;
+	}
+}
+
+static bool RNDIS_Device_ProcessNDISQuery(USB_ClassInfo_RNDIS_Device_t* const RNDISInterfaceInfo,
+                                          const uint32_t OId,
+                                          void* const QueryData,
+                                          const uint16_t QuerySize,
+                                          void* ResponseData,
+                                          uint16_t* const ResponseSize)
+{
+	(void)QueryData;
+	(void)QuerySize;
+
+	switch (OId)
+	{
+		case OID_GEN_SUPPORTED_LIST:
+			*ResponseSize = sizeof(AdapterSupportedOIDList);
+
+			memcpy_P(ResponseData, AdapterSupportedOIDList, sizeof(AdapterSupportedOIDList));
+
+			return true;
+		case OID_GEN_PHYSICAL_MEDIUM:
+			*ResponseSize = sizeof(uint32_t);
+
+			/* Indicate that the device is a true ethernet link */
+			*((uint32_t*)ResponseData) = CPU_TO_LE32(0);
+
+			return true;
+		case OID_GEN_HARDWARE_STATUS:
+			*ResponseSize = sizeof(uint32_t);
+
+			*((uint32_t*)ResponseData) = CPU_TO_LE32(NDIS_HardwareStatus_Ready);
+
+			return true;
+		case OID_GEN_MEDIA_SUPPORTED:
+		case OID_GEN_MEDIA_IN_USE:
+			*ResponseSize = sizeof(uint32_t);
+
+			*((uint32_t*)ResponseData) = CPU_TO_LE32(REMOTE_NDIS_MEDIUM_802_3);
+
+			return true;
+		case OID_GEN_VENDOR_ID:
+			*ResponseSize = sizeof(uint32_t);
+
+			/* Vendor ID 0x0xFFFFFF is reserved for vendors who have not purchased a NDIS VID */
+			*((uint32_t*)ResponseData) = CPU_TO_LE32(0x00FFFFFF);
+
+			return true;
+		case OID_GEN_MAXIMUM_FRAME_SIZE:
+		case OID_GEN_TRANSMIT_BLOCK_SIZE:
+		case OID_GEN_RECEIVE_BLOCK_SIZE:
+			*ResponseSize = sizeof(uint32_t);
+
+			*((uint32_t*)ResponseData) = CPU_TO_LE32(ETHERNET_FRAME_SIZE_MAX);
+
+			return true;
+		case OID_GEN_VENDOR_DESCRIPTION:
+			*ResponseSize = (strlen(RNDISInterfaceInfo->Config.AdapterVendorDescription) + 1);
+
+			memcpy(ResponseData, RNDISInterfaceInfo->Config.AdapterVendorDescription, *ResponseSize);
+
+			return true;
+		case OID_GEN_MEDIA_CONNECT_STATUS:
+			*ResponseSize = sizeof(uint32_t);
+
+			*((uint32_t*)ResponseData) = CPU_TO_LE32(REMOTE_NDIS_MEDIA_STATE_CONNECTED);
+
+			return true;
+		case OID_GEN_LINK_SPEED:
+			*ResponseSize = sizeof(uint32_t);
+
+			/* Indicate 10Mb/s link speed */
+			*((uint32_t*)ResponseData) = CPU_TO_LE32(100000);
+
+			return true;
+		case OID_802_3_PERMANENT_ADDRESS:
+		case OID_802_3_CURRENT_ADDRESS:
+			*ResponseSize = sizeof(MAC_Address_t);
+
+			memcpy(ResponseData, &RNDISInterfaceInfo->Config.AdapterMACAddress, sizeof(MAC_Address_t));
+
+			return true;
+		case OID_802_3_MAXIMUM_LIST_SIZE:
+			*ResponseSize = sizeof(uint32_t);
+
+			/* Indicate only one multicast address supported */
+			*((uint32_t*)ResponseData) = CPU_TO_LE32(1);
+
+			return true;
+		case OID_GEN_CURRENT_PACKET_FILTER:
+			*ResponseSize = sizeof(uint32_t);
+
+			*((uint32_t*)ResponseData) = cpu_to_le32(RNDISInterfaceInfo->State.CurrPacketFilter);
+
+			return true;
+		case OID_GEN_XMIT_OK:
+		case OID_GEN_RCV_OK:
+		case OID_GEN_XMIT_ERROR:
+		case OID_GEN_RCV_ERROR:
+		case OID_GEN_RCV_NO_BUFFER:
+		case OID_802_3_RCV_ERROR_ALIGNMENT:
+		case OID_802_3_XMIT_ONE_COLLISION:
+		case OID_802_3_XMIT_MORE_COLLISIONS:
+			*ResponseSize = sizeof(uint32_t);
+
+			/* Unused statistic OIDs - always return 0 for each */
+			*((uint32_t*)ResponseData) = CPU_TO_LE32(0);
+
+			return true;
+		case OID_GEN_MAXIMUM_TOTAL_SIZE:
+			*ResponseSize = sizeof(uint32_t);
+
+			/* Indicate maximum overall buffer (Ethernet frame and RNDIS header) the adapter can handle */
+			*((uint32_t*)ResponseData) = CPU_TO_LE32(RNDISInterfaceInfo->Config.MessageBufferLength + ETHERNET_FRAME_SIZE_MAX);
+
+			return true;
+		default:
+			return false;
+	}
+}
+
+static bool RNDIS_Device_ProcessNDISSet(USB_ClassInfo_RNDIS_Device_t* const RNDISInterfaceInfo,
+                                        const uint32_t OId,
+                                        const void* SetData,
+                                        const uint16_t SetSize)
+{
+	(void)SetSize;
+
+	switch (OId)
+	{
+		case OID_GEN_CURRENT_PACKET_FILTER:
+			RNDISInterfaceInfo->State.CurrPacketFilter = le32_to_cpu(*((uint32_t*)SetData));
+			RNDISInterfaceInfo->State.CurrRNDISState   = (RNDISInterfaceInfo->State.CurrPacketFilter) ? RNDIS_Data_Initialized : RNDIS_Initialized;
+
+			return true;
+		case OID_802_3_MULTICAST_LIST:
+			/* Do nothing - throw away the value from the host as it is unused */
+
+			return true;
+		default:
+			return false;
+	}
+}
+
+bool RNDIS_Device_IsPacketReceived(USB_ClassInfo_RNDIS_Device_t* const RNDISInterfaceInfo)
+{
+	if ((USB_DeviceState != DEVICE_STATE_Configured) ||
+	    (RNDISInterfaceInfo->State.CurrRNDISState != RNDIS_Data_Initialized))
+	{
+		return false;
+	}
+
+	Endpoint_SelectEndpoint(RNDISInterfaceInfo->Config.DataOUTEndpoint.Address);
+	return Endpoint_IsOUTReceived();
+}
+
+uint8_t RNDIS_Device_ReadPacket(USB_ClassInfo_RNDIS_Device_t* const RNDISInterfaceInfo,
+                                void* Buffer,
+                                uint16_t* const PacketLength)
+{
+	if ((USB_DeviceState != DEVICE_STATE_Configured) ||
+	    (RNDISInterfaceInfo->State.CurrRNDISState != RNDIS_Data_Initialized))
+	{
+		return ENDPOINT_RWSTREAM_DeviceDisconnected;
+	}
+
+	Endpoint_SelectEndpoint(RNDISInterfaceInfo->Config.DataOUTEndpoint.Address);
+
+	*PacketLength = 0;
+
+	if (!(Endpoint_IsOUTReceived()))
+		return ENDPOINT_RWSTREAM_NoError;
+
+	RNDIS_Packet_Message_t RNDISPacketHeader;
+	Endpoint_Read_Stream_LE(&RNDISPacketHeader, sizeof(RNDIS_Packet_Message_t), NULL);
+
+	if (le32_to_cpu(RNDISPacketHeader.DataLength) > ETHERNET_FRAME_SIZE_MAX)
+	{
+		Endpoint_StallTransaction();
+
+		return RNDIS_ERROR_LOGICAL_CMD_FAILED;
+	}
+
+	*PacketLength = (uint16_t)le32_to_cpu(RNDISPacketHeader.DataLength);
+
+	Endpoint_Read_Stream_LE(Buffer, *PacketLength, NULL);
+	Endpoint_ClearOUT();
+
+	return ENDPOINT_RWSTREAM_NoError;
+}
+
+uint8_t RNDIS_Device_SendPacket(USB_ClassInfo_RNDIS_Device_t* const RNDISInterfaceInfo,
+                                void* Buffer,
+                                const uint16_t PacketLength)
+{
+	uint8_t ErrorCode;
+
+	if ((USB_DeviceState != DEVICE_STATE_Configured) ||
+	    (RNDISInterfaceInfo->State.CurrRNDISState != RNDIS_Data_Initialized))
+	{
+		return ENDPOINT_RWSTREAM_DeviceDisconnected;
+	}
+
+	Endpoint_SelectEndpoint(RNDISInterfaceInfo->Config.DataINEndpoint.Address);
+
+	if ((ErrorCode = Endpoint_WaitUntilReady()) != ENDPOINT_READYWAIT_NoError)
+	  return ErrorCode;
+
+	RNDIS_Packet_Message_t RNDISPacketHeader;
+
+	memset(&RNDISPacketHeader, 0, sizeof(RNDIS_Packet_Message_t));
+
+	RNDISPacketHeader.MessageType   = CPU_TO_LE32(REMOTE_NDIS_PACKET_MSG);
+	RNDISPacketHeader.MessageLength = cpu_to_le32(sizeof(RNDIS_Packet_Message_t) + PacketLength);
+	RNDISPacketHeader.DataOffset    = CPU_TO_LE32(sizeof(RNDIS_Packet_Message_t) - sizeof(RNDIS_Message_Header_t));
+	RNDISPacketHeader.DataLength    = cpu_to_le32(PacketLength);
+
+	Endpoint_Write_Stream_LE(&RNDISPacketHeader, sizeof(RNDIS_Packet_Message_t), NULL);
+	Endpoint_Write_Stream_LE(Buffer, PacketLength, NULL);
+	Endpoint_ClearIN();
+
+	return ENDPOINT_RWSTREAM_NoError;
+}
+
+#endif
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Device/RNDISClassDevice.h b/lib/lufa/LUFA/Drivers/USB/Class/Device/RNDISClassDevice.h
new file mode 100644
index 0000000000..761bc2790f
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Class/Device/RNDISClassDevice.h
@@ -0,0 +1,207 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Device mode driver for the library USB RNDIS Class driver.
+ *
+ *  Device mode driver for the library USB RNDIS Class driver.
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the USB module driver
+ *        dispatch header located in LUFA/Drivers/USB.h.
+ */
+
+/** \ingroup Group_USBClassRNDIS
+ *  \defgroup Group_USBClassRNDISDevice RNDIS Class Device Mode Driver
+ *
+ *  \section Sec_USBClassRNDISDevice_Dependencies Module Source Dependencies
+ *  The following files must be built with any user project that uses this module:
+ *    - LUFA/Drivers/USB/Class/Device/RNDISClassDevice.c <i>(Makefile source module name: LUFA_SRC_USBCLASS)</i>
+ *
+ *  \section Sec_USBClassRNDISDevice_ModDescription Module Description
+ *  Device Mode USB Class driver framework interface, for the RNDIS USB Class driver.
+ *
+ *  @{
+ */
+
+#ifndef _RNDIS_CLASS_DEVICE_H_
+#define _RNDIS_CLASS_DEVICE_H_
+
+	/* Includes: */
+		#include "../../USB.h"
+		#include "../Common/RNDISClassCommon.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_RNDIS_DRIVER)
+			#error Do not include this file directly. Include LUFA/Drivers/USB.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Type Defines: */
+			/** \brief RNDIS Class Device Mode Configuration and State Structure.
+			 *
+			 *  Class state structure. An instance of this structure should be made for each RNDIS interface
+			 *  within the user application, and passed to each of the RNDIS class driver functions as the
+			 *  \c RNDISInterfaceInfo parameter. This stores each RNDIS interface's configuration and state information.
+			 */
+			typedef struct
+			{
+				struct
+				{
+					uint8_t  ControlInterfaceNumber; /**< Interface number of the RNDIS control interface within the device. */
+
+					USB_Endpoint_Table_t DataINEndpoint; /**< Data IN endpoint configuration table. */
+					USB_Endpoint_Table_t DataOUTEndpoint; /**< Data OUT endpoint configuration table. */
+					USB_Endpoint_Table_t NotificationEndpoint; /**< Notification IN Endpoint configuration table. */
+
+					char*         AdapterVendorDescription; /**< String description of the adapter vendor. */
+					MAC_Address_t AdapterMACAddress; /**< MAC address of the adapter. */
+
+					uint8_t*      MessageBuffer; /**< Buffer where RNDIS messages can be stored by the internal driver. This
+					                              *   should be at least 132 bytes in length for minimal functionality. */
+					uint16_t      MessageBufferLength; /**< Length in bytes of the \ref MessageBuffer RNDIS buffer. */
+				} Config; /**< Config data for the USB class interface within the device. All elements in this section
+				           *   <b>must</b> be set or the interface will fail to enumerate and operate correctly.
+				           */
+				struct
+				{
+					bool     ResponseReady; /**< Internal flag indicating if a RNDIS message is waiting to be returned to the host. */
+					uint8_t  CurrRNDISState; /**< Current RNDIS state of the adapter, a value from the \ref RNDIS_States_t enum. */
+					uint32_t CurrPacketFilter; /**< Current packet filter mode, used internally by the class driver. */
+				} State; /**< State data for the USB class interface within the device. All elements in this section
+				          *   are reset to their defaults when the interface is enumerated.
+				          */
+			} USB_ClassInfo_RNDIS_Device_t;
+
+		/* Function Prototypes: */
+			/** Configures the endpoints of a given RNDIS interface, ready for use. This should be linked to the library
+			 *  \ref EVENT_USB_Device_ConfigurationChanged() event so that the endpoints are configured when the configuration
+			 *  containing the given RNDIS interface is selected.
+			 *
+			 *  \param[in,out] RNDISInterfaceInfo  Pointer to a structure containing a RNDIS Class configuration and state.
+			 *
+			 *  \return Boolean \c true if the endpoints were successfully configured, \c false otherwise.
+			 */
+			bool RNDIS_Device_ConfigureEndpoints(USB_ClassInfo_RNDIS_Device_t* const RNDISInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Processes incoming control requests from the host, that are directed to the given RNDIS class interface. This should be
+			 *  linked to the library \ref EVENT_USB_Device_ControlRequest() event.
+			 *
+			 *  \param[in,out] RNDISInterfaceInfo  Pointer to a structure containing a RNDIS Class configuration and state.
+			 */
+			void RNDIS_Device_ProcessControlRequest(USB_ClassInfo_RNDIS_Device_t* const RNDISInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** General management task for a given RNDIS class interface, required for the correct operation of the interface. This should
+			 *  be called frequently in the main program loop, before the master USB management task \ref USB_USBTask().
+			 *
+			 *  \param[in,out] RNDISInterfaceInfo  Pointer to a structure containing a RNDIS Class configuration and state.
+			 */
+			void RNDIS_Device_USBTask(USB_ClassInfo_RNDIS_Device_t* const RNDISInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Determines if a packet is currently waiting for the device to read in and process.
+			 *
+			 *  \pre This function must only be called when the Device state machine is in the \ref DEVICE_STATE_Configured state or the
+			 *       call will fail.
+			 *
+			 *  \param[in,out] RNDISInterfaceInfo  Pointer to a structure containing an RNDIS Class configuration and state.
+			 *
+			 *  \return Boolean \c true if a packet is waiting to be read in by the host, \c false otherwise.
+			 */
+			bool RNDIS_Device_IsPacketReceived(USB_ClassInfo_RNDIS_Device_t* const RNDISInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Retrieves the next pending packet from the device, discarding the remainder of the RNDIS packet header to leave
+			 *  only the packet contents for processing by the device in the nominated buffer.
+			 *
+			 *  \pre This function must only be called when the Device state machine is in the \ref DEVICE_STATE_Configured state or the
+			 *       call will fail.
+			 *
+			 *  \param[in,out] RNDISInterfaceInfo  Pointer to a structure containing an RNDIS Class configuration and state.
+			 *  \param[out]    Buffer              Pointer to a buffer where the packer data is to be written to.
+			 *  \param[out]    PacketLength        Pointer to where the length in bytes of the read packet is to be stored.
+			 *
+			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t RNDIS_Device_ReadPacket(USB_ClassInfo_RNDIS_Device_t* const RNDISInterfaceInfo,
+											void* Buffer,
+											uint16_t* const PacketLength) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Sends the given packet to the attached RNDIS device, after adding a RNDIS packet message header.
+			 *
+			 *  \pre This function must only be called when the Device state machine is in the \ref DEVICE_STATE_Configured state or the
+			 *       call will fail.
+			 *
+			 *  \param[in,out] RNDISInterfaceInfo  Pointer to a structure containing an RNDIS Class configuration and state.
+			 *  \param[in]     Buffer              Pointer to a buffer where the packer data is to be read from.
+			 *  \param[in]     PacketLength        Length in bytes of the packet to send.
+			 *
+			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t RNDIS_Device_SendPacket(USB_ClassInfo_RNDIS_Device_t* const RNDISInterfaceInfo,
+											void* Buffer,
+											const uint16_t PacketLength) ATTR_NON_NULL_PTR_ARG(1);
+
+	/* Private Interface - For use in library only: */
+	#if !defined(__DOXYGEN__)
+		/* Macros: */
+			#define RNDIS_DEVICE_MIN_MESSAGE_BUFFER_LENGTH  sizeof(AdapterSupportedOIDList) + sizeof(RNDIS_Query_Complete_t)
+
+		/* Function Prototypes: */
+		#if defined(__INCLUDE_FROM_RNDIS_DEVICE_C)
+			static void RNDIS_Device_ProcessRNDISControlMessage(USB_ClassInfo_RNDIS_Device_t* const RNDISInterfaceInfo)
+			                                                    ATTR_NON_NULL_PTR_ARG(1);
+			static bool RNDIS_Device_ProcessNDISQuery(USB_ClassInfo_RNDIS_Device_t* const RNDISInterfaceInfo,
+			                                          const uint32_t OId,
+                                                      void* const QueryData,
+                                                      const uint16_t QuerySize,
+										              void* ResponseData,
+                                                      uint16_t* const ResponseSize) ATTR_NON_NULL_PTR_ARG(1)
+			                                          ATTR_NON_NULL_PTR_ARG(5) ATTR_NON_NULL_PTR_ARG(6);
+			static bool RNDIS_Device_ProcessNDISSet(USB_ClassInfo_RNDIS_Device_t* const RNDISInterfaceInfo,
+                                                    const uint32_t OId,
+			                                        const void* SetData,
+                                                    const uint16_t SetSize) ATTR_NON_NULL_PTR_ARG(1)
+			                                        ATTR_NON_NULL_PTR_ARG(3);
+		#endif
+
+	#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Class/HIDClass.h b/lib/lufa/LUFA/Drivers/USB/Class/HIDClass.h
new file mode 100644
index 0000000000..158eb256b6
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Class/HIDClass.h
@@ -0,0 +1,82 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Master include file for the library USB HID Class driver.
+ *
+ *  Master include file for the library USB HID Class driver, for both host and device modes, where available.
+ *
+ *  This file should be included in all user projects making use of this optional class driver, instead of
+ *  including any headers in the USB/ClassDriver/Device, USB/ClassDriver/Host or USB/ClassDriver/Common subdirectories.
+ */
+
+/** \ingroup Group_USBClassDrivers
+ *  \defgroup Group_USBClassHID HID Class Driver
+ *  \brief USB class driver for the USB-IF Human Interface Device (HID) class standard.
+ *
+ *  \section Sec_USBClassHID_Dependencies Module Source Dependencies
+ *  The following files must be built with any user project that uses this module:
+ *    - LUFA/Drivers/USB/Class/Device/HIDClassDevice.c <i>(Makefile source module name: LUFA_SRC_USBCLASS)</i>
+ *    - LUFA/Drivers/USB/Class/Host/HIDClassHost.c <i>(Makefile source module name: LUFA_SRC_USBCLASS)</i>
+ *    - LUFA/Drivers/USB/Class/Host/HIDParser.c <i>(Makefile source module name: LUFA_SRC_USB)</i>
+ *
+ *  \section Sec_USBClassHID_ModDescription Module Description
+ *  HID Class Driver module. This module contains an internal implementation of the USB HID Class, for both Device
+ *  and Host USB modes. User applications can use this class driver instead of implementing the HID class manually
+ *  via the low-level LUFA APIs.
+ *
+ *  This module is designed to simplify the user code by exposing only the required interface needed to interface with
+ *  Hosts or Devices using the USB HID Class.
+ *
+ *  @{
+ */
+
+#ifndef _HID_CLASS_H_
+#define _HID_CLASS_H_
+
+	/* Macros: */
+		#define __INCLUDE_FROM_USB_DRIVER
+		#define __INCLUDE_FROM_HID_DRIVER
+
+	/* Includes: */
+		#include "../Core/USBMode.h"
+
+		#if defined(USB_CAN_BE_DEVICE)
+			#include "Device/HIDClassDevice.h"
+		#endif
+
+		#if defined(USB_CAN_BE_HOST)
+			#include "Host/HIDClassHost.h"
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Host/AndroidAccessoryClassHost.c b/lib/lufa/LUFA/Drivers/USB/Class/Host/AndroidAccessoryClassHost.c
new file mode 100644
index 0000000000..ea89033668
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Class/Host/AndroidAccessoryClassHost.c
@@ -0,0 +1,422 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+#define  __INCLUDE_FROM_USB_DRIVER
+#include "../../Core/USBMode.h"
+
+#if defined(USB_CAN_BE_HOST)
+
+#define  __INCLUDE_FROM_AOA_DRIVER
+#define  __INCLUDE_FROM_ANDROIDACCESSORY_HOST_C
+#include "AndroidAccessoryClassHost.h"
+
+bool AOA_Host_ValidateAccessoryDevice(USB_ClassInfo_AOA_Host_t* const AOAInterfaceInfo,
+                                      const USB_Descriptor_Device_t* const DeviceDescriptor,
+                                      bool* const NeedModeSwitch)
+{
+	(void)AOAInterfaceInfo;
+
+	if (DeviceDescriptor->Header.Type != DTYPE_Device)
+	  return false;
+
+	*NeedModeSwitch = ((DeviceDescriptor->ProductID != ANDROID_ACCESSORY_PRODUCT_ID) &&
+	                   (DeviceDescriptor->ProductID != ANDROID_ACCESSORY_ADB_PRODUCT_ID));
+
+	return true;
+}
+
+uint8_t AOA_Host_ConfigurePipes(USB_ClassInfo_AOA_Host_t* const AOAInterfaceInfo,
+                                uint16_t ConfigDescriptorSize,
+                                void* ConfigDescriptorData)
+{
+	USB_Descriptor_Endpoint_t*  DataINEndpoint  = NULL;
+	USB_Descriptor_Endpoint_t*  DataOUTEndpoint = NULL;
+	USB_Descriptor_Interface_t* AOAInterface    = NULL;
+
+	memset(&AOAInterfaceInfo->State, 0x00, sizeof(AOAInterfaceInfo->State));
+
+	if (DESCRIPTOR_TYPE(ConfigDescriptorData) != DTYPE_Configuration)
+	  return AOA_ENUMERROR_InvalidConfigDescriptor;
+
+	if (USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData,
+	                              DCOMP_AOA_Host_NextAndroidAccessoryInterface) != DESCRIPTOR_SEARCH_COMP_Found)
+	{
+		return AOA_ENUMERROR_NoCompatibleInterfaceFound;
+	}
+
+	AOAInterface = DESCRIPTOR_PCAST(ConfigDescriptorData, USB_Descriptor_Interface_t);
+
+	while (!(DataINEndpoint) || !(DataOUTEndpoint))
+	{
+		if (USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData,
+		                              DCOMP_AOA_Host_NextInterfaceBulkEndpoint) != DESCRIPTOR_SEARCH_COMP_Found)
+		{
+			return AOA_ENUMERROR_NoCompatibleInterfaceFound;
+		}
+
+		USB_Descriptor_Endpoint_t* EndpointData = DESCRIPTOR_PCAST(ConfigDescriptorData, USB_Descriptor_Endpoint_t);
+
+		if ((EndpointData->EndpointAddress & ENDPOINT_DIR_MASK) == ENDPOINT_DIR_IN)
+		  DataINEndpoint  = EndpointData;
+		else
+		  DataOUTEndpoint = EndpointData;
+	}
+
+	AOAInterfaceInfo->Config.DataINPipe.Size  = le16_to_cpu(DataINEndpoint->EndpointSize);
+	AOAInterfaceInfo->Config.DataINPipe.EndpointAddress = DataINEndpoint->EndpointAddress;
+	AOAInterfaceInfo->Config.DataINPipe.Type  = EP_TYPE_BULK;
+
+	AOAInterfaceInfo->Config.DataOUTPipe.Size = le16_to_cpu(DataOUTEndpoint->EndpointSize);
+	AOAInterfaceInfo->Config.DataOUTPipe.EndpointAddress = DataOUTEndpoint->EndpointAddress;
+	AOAInterfaceInfo->Config.DataOUTPipe.Type = EP_TYPE_BULK;
+
+	if (!(Pipe_ConfigurePipeTable(&AOAInterfaceInfo->Config.DataINPipe, 1)))
+	  return AOA_ENUMERROR_PipeConfigurationFailed;
+
+	if (!(Pipe_ConfigurePipeTable(&AOAInterfaceInfo->Config.DataOUTPipe, 1)))
+	  return AOA_ENUMERROR_PipeConfigurationFailed;
+
+	AOAInterfaceInfo->State.IsActive        = true;
+	AOAInterfaceInfo->State.InterfaceNumber = AOAInterface->InterfaceNumber;
+
+	return AOA_ENUMERROR_NoError;
+}
+
+static uint8_t DCOMP_AOA_Host_NextAndroidAccessoryInterface(void* const CurrentDescriptor)
+{
+	USB_Descriptor_Header_t* Header = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Header_t);
+
+	if (Header->Type == DTYPE_Interface)
+	{
+		USB_Descriptor_Interface_t* Interface = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Interface_t);
+
+		if ((Interface->Class    == AOA_CSCP_AOADataClass)    &&
+		    (Interface->SubClass == AOA_CSCP_AOADataSubclass) &&
+		    (Interface->Protocol == AOA_CSCP_AOADataProtocol))
+		{
+			return DESCRIPTOR_SEARCH_Found;
+		}
+	}
+
+	return DESCRIPTOR_SEARCH_NotFound;
+}
+
+static uint8_t DCOMP_AOA_Host_NextInterfaceBulkEndpoint(void* const CurrentDescriptor)
+{
+	USB_Descriptor_Header_t* Header = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Header_t);
+
+	if (Header->Type == DTYPE_Endpoint)
+	{
+		USB_Descriptor_Endpoint_t* Endpoint = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Endpoint_t);
+
+		uint8_t EndpointType = (Endpoint->Attributes & EP_TYPE_MASK);
+
+		if ((EndpointType == EP_TYPE_BULK) && (!(Pipe_IsEndpointBound(Endpoint->EndpointAddress))))
+		  return DESCRIPTOR_SEARCH_Found;
+	}
+	else if (Header->Type == DTYPE_Interface)
+	{
+		return DESCRIPTOR_SEARCH_Fail;
+	}
+
+	return DESCRIPTOR_SEARCH_NotFound;
+}
+
+void AOA_Host_USBTask(USB_ClassInfo_AOA_Host_t* const AOAInterfaceInfo)
+{
+	if ((USB_HostState != HOST_STATE_Configured) || !(AOAInterfaceInfo->State.IsActive))
+	  return;
+
+	#if !defined(NO_CLASS_DRIVER_AUTOFLUSH)
+	AOA_Host_Flush(AOAInterfaceInfo);
+	#endif
+}
+
+uint8_t AOA_Host_StartAccessoryMode(USB_ClassInfo_AOA_Host_t* const AOAInterfaceInfo)
+{
+	uint8_t ErrorCode;
+
+	uint16_t AccessoryProtocol;
+	if ((ErrorCode = AOA_Host_GetAccessoryProtocol(&AccessoryProtocol)) != HOST_WAITERROR_Successful)
+	  return ErrorCode;
+
+	if ((AccessoryProtocol != CPU_TO_LE16(AOA_PROTOCOL_AccessoryV1)) && (AccessoryProtocol != CPU_TO_LE16(AOA_PROTOCOL_AccessoryV2)))
+	  return AOA_ERROR_LOGICAL_CMD_FAILED;
+
+	for (uint8_t PropertyIndex = 0; PropertyIndex < AOA_STRING_TOTAL_STRINGS; PropertyIndex++)
+	{
+		if ((ErrorCode = AOA_Host_SendPropertyString(AOAInterfaceInfo, PropertyIndex)) != HOST_WAITERROR_Successful)
+		  return ErrorCode;
+	}
+
+	USB_ControlRequest = (USB_Request_Header_t)
+	{
+		.bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_VENDOR | REQREC_DEVICE),
+		.bRequest      = AOA_REQ_StartAccessoryMode,
+		.wValue        = 0,
+		.wIndex        = 0,
+		.wLength       = 0,
+	};
+
+	Pipe_SelectPipe(PIPE_CONTROLPIPE);
+	return USB_Host_SendControlRequest(NULL);
+}
+
+static uint8_t AOA_Host_GetAccessoryProtocol(uint16_t* const Protocol)
+{
+	USB_ControlRequest = (USB_Request_Header_t)
+	{
+		.bmRequestType = (REQDIR_DEVICETOHOST | REQTYPE_VENDOR | REQREC_DEVICE),
+		.bRequest      = AOA_REQ_GetAccessoryProtocol,
+		.wValue        = 0,
+		.wIndex        = 0,
+		.wLength       = sizeof(uint16_t),
+	};
+
+	Pipe_SelectPipe(PIPE_CONTROLPIPE);
+	return USB_Host_SendControlRequest(Protocol);
+}
+
+static uint8_t AOA_Host_SendPropertyString(USB_ClassInfo_AOA_Host_t* const AOAInterfaceInfo,
+                                           const uint8_t StringIndex)
+{
+	const char* String = AOAInterfaceInfo->Config.PropertyStrings[StringIndex];
+
+	if (String == NULL)
+	  String = "";
+
+	USB_ControlRequest = (USB_Request_Header_t)
+	{
+		.bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_VENDOR | REQREC_DEVICE),
+		.bRequest      = AOA_REQ_SendString,
+		.wValue        = 0,
+		.wIndex        = StringIndex,
+		.wLength       = (strlen(String) + 1),
+	};
+
+	Pipe_SelectPipe(PIPE_CONTROLPIPE);
+	return USB_Host_SendControlRequest((char*)String);
+}
+
+uint8_t AOA_Host_SendData(USB_ClassInfo_AOA_Host_t* const AOAInterfaceInfo,
+                          const void* const Buffer,
+                          const uint16_t Length)
+{
+	if ((USB_HostState != HOST_STATE_Configured) || !(AOAInterfaceInfo->State.IsActive))
+	  return PIPE_READYWAIT_DeviceDisconnected;
+
+	uint8_t ErrorCode;
+
+	Pipe_SelectPipe(AOAInterfaceInfo->Config.DataOUTPipe.Address);
+
+	Pipe_Unfreeze();
+	ErrorCode = Pipe_Write_Stream_LE(Buffer, Length, NULL);
+	Pipe_Freeze();
+
+	return ErrorCode;
+}
+
+uint8_t AOA_Host_SendString(USB_ClassInfo_AOA_Host_t* const AOAInterfaceInfo,
+                            const char* const String)
+{
+	if ((USB_HostState != HOST_STATE_Configured) || !(AOAInterfaceInfo->State.IsActive))
+	  return PIPE_READYWAIT_DeviceDisconnected;
+
+	uint8_t ErrorCode;
+
+	Pipe_SelectPipe(AOAInterfaceInfo->Config.DataOUTPipe.Address);
+
+	Pipe_Unfreeze();
+	ErrorCode = Pipe_Write_Stream_LE(String, strlen(String), NULL);
+	Pipe_Freeze();
+
+	return ErrorCode;
+}
+
+uint8_t AOA_Host_SendByte(USB_ClassInfo_AOA_Host_t* const AOAInterfaceInfo,
+                          const uint8_t Data)
+{
+	if ((USB_HostState != HOST_STATE_Configured) || !(AOAInterfaceInfo->State.IsActive))
+	  return PIPE_READYWAIT_DeviceDisconnected;
+
+	uint8_t ErrorCode;
+
+	Pipe_SelectPipe(AOAInterfaceInfo->Config.DataOUTPipe.Address);
+	Pipe_Unfreeze();
+
+	if (!(Pipe_IsReadWriteAllowed()))
+	{
+		Pipe_ClearOUT();
+
+		if ((ErrorCode = Pipe_WaitUntilReady()) != PIPE_READYWAIT_NoError)
+		  return ErrorCode;
+	}
+
+	Pipe_Write_8(Data);
+	Pipe_Freeze();
+
+	return PIPE_READYWAIT_NoError;
+}
+
+uint16_t AOA_Host_BytesReceived(USB_ClassInfo_AOA_Host_t* const AOAInterfaceInfo)
+{
+	if ((USB_HostState != HOST_STATE_Configured) || !(AOAInterfaceInfo->State.IsActive))
+	  return 0;
+
+	Pipe_SelectPipe(AOAInterfaceInfo->Config.DataINPipe.Address);
+	Pipe_Unfreeze();
+
+	if (Pipe_IsINReceived())
+	{
+		if (!(Pipe_BytesInPipe()))
+		{
+			Pipe_ClearIN();
+			Pipe_Freeze();
+			return 0;
+		}
+		else
+		{
+			Pipe_Freeze();
+			return Pipe_BytesInPipe();
+		}
+	}
+	else
+	{
+		Pipe_Freeze();
+
+		return 0;
+	}
+}
+
+int16_t AOA_Host_ReceiveByte(USB_ClassInfo_AOA_Host_t* const AOAInterfaceInfo)
+{
+	if ((USB_HostState != HOST_STATE_Configured) || !(AOAInterfaceInfo->State.IsActive))
+	  return -1;
+
+	int16_t ReceivedByte = -1;
+
+	Pipe_SelectPipe(AOAInterfaceInfo->Config.DataINPipe.Address);
+	Pipe_Unfreeze();
+
+	if (Pipe_IsINReceived())
+	{
+		if (Pipe_BytesInPipe())
+		  ReceivedByte = Pipe_Read_8();
+
+		if (!(Pipe_BytesInPipe()))
+		  Pipe_ClearIN();
+	}
+
+	Pipe_Freeze();
+
+	return ReceivedByte;
+}
+
+uint8_t AOA_Host_Flush(USB_ClassInfo_AOA_Host_t* const AOAInterfaceInfo)
+{
+	if ((USB_HostState != HOST_STATE_Configured) || !(AOAInterfaceInfo->State.IsActive))
+	  return PIPE_READYWAIT_DeviceDisconnected;
+
+	uint8_t ErrorCode;
+
+	Pipe_SelectPipe(AOAInterfaceInfo->Config.DataOUTPipe.Address);
+	Pipe_Unfreeze();
+
+	if (!(Pipe_BytesInPipe()))
+	  return PIPE_READYWAIT_NoError;
+
+	bool BankFull = !(Pipe_IsReadWriteAllowed());
+
+	Pipe_ClearOUT();
+
+	if (BankFull)
+	{
+		if ((ErrorCode = Pipe_WaitUntilReady()) != PIPE_READYWAIT_NoError)
+		  return ErrorCode;
+
+		Pipe_ClearOUT();
+	}
+
+	Pipe_Freeze();
+
+	return PIPE_READYWAIT_NoError;
+}
+
+#if defined(FDEV_SETUP_STREAM)
+void AOA_Host_CreateStream(USB_ClassInfo_AOA_Host_t* const AOAInterfaceInfo,
+                           FILE* const Stream)
+{
+	*Stream = (FILE)FDEV_SETUP_STREAM(AOA_Host_putchar, AOA_Host_getchar, _FDEV_SETUP_RW);
+	fdev_set_udata(Stream, AOAInterfaceInfo);
+}
+
+void AOA_Host_CreateBlockingStream(USB_ClassInfo_AOA_Host_t* const AOAInterfaceInfo,
+                                   FILE* const Stream)
+{
+	*Stream = (FILE)FDEV_SETUP_STREAM(AOA_Host_putchar, AOA_Host_getchar_Blocking, _FDEV_SETUP_RW);
+	fdev_set_udata(Stream, AOAInterfaceInfo);
+}
+
+static int AOA_Host_putchar(char c,
+                            FILE* Stream)
+{
+	return AOA_Host_SendByte((USB_ClassInfo_AOA_Host_t*)fdev_get_udata(Stream), c) ? _FDEV_ERR : 0;
+}
+
+static int AOA_Host_getchar(FILE* Stream)
+{
+	int16_t ReceivedByte = AOA_Host_ReceiveByte((USB_ClassInfo_AOA_Host_t*)fdev_get_udata(Stream));
+
+	if (ReceivedByte < 0)
+	  return _FDEV_EOF;
+
+	return ReceivedByte;
+}
+
+static int AOA_Host_getchar_Blocking(FILE* Stream)
+{
+	int16_t ReceivedByte;
+
+	while ((ReceivedByte = AOA_Host_ReceiveByte((USB_ClassInfo_AOA_Host_t*)fdev_get_udata(Stream))) < 0)
+	{
+		if (USB_HostState == HOST_STATE_Unattached)
+		  return _FDEV_EOF;
+
+		AOA_Host_USBTask((USB_ClassInfo_AOA_Host_t*)fdev_get_udata(Stream));
+		USB_USBTask();
+	}
+
+	return ReceivedByte;
+}
+#endif
+
+#endif
+
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Host/AndroidAccessoryClassHost.h b/lib/lufa/LUFA/Drivers/USB/Class/Host/AndroidAccessoryClassHost.h
new file mode 100644
index 0000000000..f4f04e445a
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Class/Host/AndroidAccessoryClassHost.h
@@ -0,0 +1,314 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Host mode driver for the library USB Android Open Accessory Class driver.
+ *
+ *  Host mode driver for the library USB Android Open Accessory Class driver.
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the USB module driver
+ *        dispatch header located in LUFA/Drivers/USB.h.
+ */
+
+/** \ingroup Group_USBClassAOA
+ *  \defgroup Group_USBClassAndroidAccessoryHost Android Open Accessory Class Host Mode Driver
+ *
+ *  \section Sec_USBClassAndroidAccessoryHost_Dependencies Module Source Dependencies
+ *  The following files must be built with any user project that uses this module:
+ *    - LUFA/Drivers/USB/Class/Host/AndroidAccessoryClassHost.c <i>(Makefile source module name: LUFA_SRC_USBCLASS)</i>
+ *
+ *  \section Sec_USBClassAndroidAccessoryHost_ModDescription Module Description
+ *  Host Mode USB Class driver framework interface, for the Android Open Accessory USB Class driver.
+ *
+ *  @{
+ */
+
+#ifndef __AOA_CLASS_HOST_H__
+#define __AOA_CLASS_HOST_H__
+
+	/* Includes: */
+		#include "../../USB.h"
+		#include "../Common/AndroidAccessoryClassCommon.h"
+
+		#include <stdio.h>
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_AOA_DRIVER)
+			#error Do not include this file directly. Include LUFA/Drivers/USB.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Error code for some Android Open Accessory Host functions, indicating a logical (and not hardware) error. */
+			#define AOA_ERROR_LOGICAL_CMD_FAILED              0x80
+
+		/* Type Defines: */
+			/** \brief Android Open Accessory Class Host Mode Configuration and State Structure.
+			 *
+			 *  Class state structure. An instance of this structure should be made within the user application,
+			 *  and passed to each of the Android Open Accessory class driver functions as the \c AOAInterfaceInfo
+			 *  parameter. This stores each Android Open Accessory interface's configuration and state information.
+			 */
+			typedef struct
+			{
+				struct
+				{
+					USB_Pipe_Table_t DataINPipe; /**< Data IN Pipe configuration table. */
+					USB_Pipe_Table_t DataOUTPipe; /**< Data OUT Pipe configuration table. */
+
+					char*    PropertyStrings[AOA_STRING_TOTAL_STRINGS]; /**< Android Accessory property strings, sent to identify the accessory when the
+					                                                     *   Android device is switched into Open Accessory mode. */
+				} Config; /**< Config data for the USB class interface within the device. All elements in this section
+				           *   <b>must</b> be set or the interface will fail to enumerate and operate correctly.
+				           */
+				struct
+				{
+					bool IsActive; /**< Indicates if the current interface instance is connected to an attached device, valid
+					                *   after \ref AOA_Host_ConfigurePipes() is called and the Host state machine is in the
+					                *   Configured state.
+					                */
+					uint8_t  InterfaceNumber; /**< Interface index of the AOA interface within the attached device. */
+				} State; /**< State data for the USB class interface within the device. All elements in this section
+						  *   <b>may</b> be set to initial values, but may also be ignored to default to sane values when
+						  *   the interface is enumerated.
+						  */
+			} USB_ClassInfo_AOA_Host_t;
+
+		/* Enums: */
+			/** Enum for the possible error codes returned by the \ref AOA_Host_ConfigurePipes() function. */
+			enum AOA_Host_EnumerationFailure_ErrorCodes_t
+			{
+				AOA_ENUMERROR_NoError                    = 0, /**< Configuration Descriptor was processed successfully. */
+				AOA_ENUMERROR_InvalidConfigDescriptor    = 1, /**< The device returned an invalid Configuration Descriptor. */
+				AOA_ENUMERROR_NoCompatibleInterfaceFound = 2, /**< A compatible Android Open Accessory interface was not found in the device's Configuration Descriptor. */
+				AOA_ENUMERROR_PipeConfigurationFailed    = 3, /**< One or more pipes for the specified interface could not be configured correctly. */
+			};
+
+		/* Function Prototypes: */
+			/** General management task for a given Android Open Accessory host class interface, required for the correct operation of the interface.
+			 *  This should be called frequently in the main program loop, before the master USB management task \ref USB_USBTask().
+			 *
+			 *  \param[in,out] AOAInterfaceInfo  Pointer to a structure containing an Android Open Accessory Class host configuration and state.
+			 */
+			void AOA_Host_USBTask(USB_ClassInfo_AOA_Host_t* const AOAInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Validates a device descriptor, to check if the device is a valid Android device, and if it is currently in Android Open Accessory mode.
+			 *
+			 *  \param[in,out] AOAInterfaceInfo  Pointer to a structure containing an AOA Class host configuration and state.
+			 *  \param[in]     DeviceDescriptor  Pointer a buffer containing the attached device's Device Descriptor.
+			 *  \param[out]    NeedModeSwitch    Pointer to a boolean where the mode switch requirement of the attached device is to be stored.
+			 *
+			 *  \return Boolean \c true if the attached device is a valid Android device, \c false otherwise.
+			 */
+			bool AOA_Host_ValidateAccessoryDevice(USB_ClassInfo_AOA_Host_t* const AOAInterfaceInfo,
+                                                  const USB_Descriptor_Device_t* const DeviceDescriptor,
+			                                      bool* const NeedModeSwitch) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2) ATTR_NON_NULL_PTR_ARG(3);
+
+			/** Host interface configuration routine, to configure a given Android Open Accessory host interface instance using the Configuration
+			 *  Descriptor read from an attached USB device. This function automatically updates the given Android Open Accessory Host instance's
+			 *  state values and configures the pipes required to communicate with the interface if it is found within the device. This should be
+			 *  called once after the stack has enumerated the attached device, while the host state machine is in the Addressed state.
+			 *
+			 *  \param[in,out] AOAInterfaceInfo      Pointer to a structure containing an AOA Class host configuration and state.
+			 *  \param[in]     ConfigDescriptorSize  Length of the attached device's Configuration Descriptor.
+			 *  \param[in]     ConfigDescriptorData  Pointer to a buffer containing the attached device's Configuration Descriptor.
+			 *
+			 *  \return A value from the \ref AOA_Host_EnumerationFailure_ErrorCodes_t enum.
+			 */
+			uint8_t AOA_Host_ConfigurePipes(USB_ClassInfo_AOA_Host_t* const AOAInterfaceInfo,
+			                                uint16_t ConfigDescriptorSize,
+			                                void* ConfigDescriptorData) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(3);
+
+			/** Starts Accessory Mode in the attached Android device. This function will validate the device's Android Open Accessory protocol
+			 *  version, send the configured property strings, and request a switch to Android Open Accessory mode.
+			 *
+			 *  \param[in,out] AOAInterfaceInfo  Pointer to a structure containing an AOA Class host configuration and state.
+			 *
+			 *  \return A value from the \ref USB_Host_SendControlErrorCodes_t enum, or \ref AOA_ERROR_LOGICAL_CMD_FAILED if a logical error occurred..
+			 */
+			uint8_t AOA_Host_StartAccessoryMode(USB_ClassInfo_AOA_Host_t* const AOAInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Sends a given data buffer to the attached USB device, if connected. If a device is not connected when the function is
+			 *  called, the data will be discarded. Bytes will be queued for transmission to the device until either the pipe bank
+			 *  becomes full, or the \ref AOA_Host_Flush() function is called to flush the pending data to the device. This allows for
+			 *  multiple bytes to be packed into a single pipe packet, increasing data throughput.
+			 *
+			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the
+			 *       call will fail.
+			 *
+			 *  \param[in,out] AOAInterfaceInfo  Pointer to a structure containing a AOA Class host configuration and state.
+			 *  \param[in]     Buffer            Pointer to a buffer containing the data to send to the device.
+			 *  \param[in]     Length            Length of the data to send to the device.
+			 *
+			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t AOA_Host_SendData(USB_ClassInfo_AOA_Host_t* const AOAInterfaceInfo,
+			                          const void* const Buffer,
+			                          const uint16_t Length) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Sends a given null-terminated string to the attached USB device, if connected. If a device is not connected when the
+			 *  function is called, the string is discarded. Bytes will be queued for transmission to the device until either the pipe
+			 *  bank becomes full, or the \ref AOA_Host_Flush() function is called to flush the pending data to the device. This allows
+			 *  for multiple bytes to be packed into a single pipe packet, increasing data throughput.
+			 *
+			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the
+			 *       call will fail.
+			 *
+			 *  \param[in,out] AOAInterfaceInfo  Pointer to a structure containing a AOA Class host configuration and state.
+			 *  \param[in]     String            Pointer to the null terminated string to send to the device.
+			 *
+			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t AOA_Host_SendString(USB_ClassInfo_AOA_Host_t* const AOAInterfaceInfo,
+			                            const char* const String) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2);
+
+			/** Sends a given byte to the attached USB device, if connected. If a device is not connected when the function is called, the
+			 *  byte is discarded. Bytes will be queued for transmission to the device until either the pipe bank becomes full, or the
+			 *  \ref AOA_Host_Flush() function is called to flush the pending data to the host. This allows for multiple bytes to be
+			 *  packed into a single pipe packet, increasing data throughput.
+			 *
+			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the
+			 *       call will fail.
+			 *
+			 *  \param[in,out] AOAInterfaceInfo  Pointer to a structure containing a AOA Class host configuration and state.
+			 *  \param[in]     Data              Byte of data to send to the device.
+			 *
+			 *  \return A value from the \ref Pipe_WaitUntilReady_ErrorCodes_t enum.
+			 */
+			uint8_t AOA_Host_SendByte(USB_ClassInfo_AOA_Host_t* const AOAInterfaceInfo,
+			                          const uint8_t Data) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Determines the number of bytes received by the AOA interface from the device, waiting to be read. This indicates the number
+			 *  of bytes in the IN pipe bank only, and thus the number of calls to \ref AOA_Host_ReceiveByte() which are guaranteed to succeed
+			 *  immediately. If multiple bytes are to be received, they should be buffered by the user application, as the pipe bank will not be
+			 *  released back to the USB controller until all bytes are read.
+			 *
+			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the
+			 *       call will fail.
+			 *
+			 *  \param[in,out] AOAInterfaceInfo  Pointer to a structure containing a AOA Class host configuration and state.
+			 *
+			 *  \return Total number of buffered bytes received from the device.
+			 */
+			uint16_t AOA_Host_BytesReceived(USB_ClassInfo_AOA_Host_t* const AOAInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Reads a byte of data from the device. If no data is waiting to be read of if a USB device is not connected, the function
+			 *  returns a negative value. The \ref AOA_Host_BytesReceived() function may be queried in advance to determine how many bytes
+			 *  are currently buffered in the AOA interface's data receive pipe.
+			 *
+			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the
+			 *       call will fail.
+			 *
+			 *  \param[in,out] AOAInterfaceInfo  Pointer to a structure containing a AOA Class host configuration and state.
+			 *
+			 *  \return Next received byte from the device, or a negative value if no data received.
+			 */
+			int16_t AOA_Host_ReceiveByte(USB_ClassInfo_AOA_Host_t* const AOAInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Flushes any data waiting to be sent, ensuring that the send buffer is cleared.
+			 *
+			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the
+			 *       call will fail.
+			 *
+			 *  \param[in,out] AOAInterfaceInfo  Pointer to a structure containing a AOA Class host configuration and state.
+			 *
+			 *  \return A value from the \ref Pipe_WaitUntilReady_ErrorCodes_t enum.
+			 */
+			uint8_t AOA_Host_Flush(USB_ClassInfo_AOA_Host_t* const AOAInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Creates a standard character stream for the given AOA Device instance so that it can be used with all the regular
+			 *  functions in the standard \c <stdio.h> library that accept a \c FILE stream as a destination (e.g. \c fprintf). The created
+			 *  stream is bidirectional and can be used for both input and output functions.
+			 *
+			 *  Reading data from this stream is non-blocking, i.e. in most instances, complete strings cannot be read in by a single
+			 *  fetch, as the endpoint will not be ready at some point in the transmission, aborting the transfer. However, this may
+			 *  be used when the read data is processed byte-per-bye (via \c getc()) or when the user application will implement its own
+			 *  line buffering.
+			 *
+			 *  \note The created stream can be given as \c stdout if desired to direct the standard output from all \c <stdio.h> functions
+			 *        to the given AOA interface.
+			 *        \n\n
+			 *
+			 *  \note This function is not available on all microcontroller architectures.
+			 *
+			 *  \param[in,out] AOAInterfaceInfo  Pointer to a structure containing a AOA Class configuration and state.
+			 *  \param[in,out] Stream            Pointer to a FILE structure where the created stream should be placed.
+			 */
+			void AOA_Host_CreateStream(USB_ClassInfo_AOA_Host_t* const AOAInterfaceInfo,
+			                           FILE* const Stream) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2);
+
+			/** Identical to \ref AOA_Host_CreateStream(), except that reads are blocking until the calling stream function terminates
+			 *  the transfer. While blocking, the USB and AOA service tasks are called repeatedly to maintain USB communications.
+			 *
+			 *  \note This function is not available on all microcontroller architectures.
+			 *
+			 *  \param[in,out] AOAInterfaceInfo  Pointer to a structure containing a AOA Class configuration and state.
+			 *  \param[in,out] Stream            Pointer to a FILE structure where the created stream should be placed.
+			 */
+			void AOA_Host_CreateBlockingStream(USB_ClassInfo_AOA_Host_t* const AOAInterfaceInfo,
+			                                   FILE* const Stream) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2);
+
+	/* Private Interface - For use in library only: */
+	#if !defined(__DOXYGEN__)
+		/* Function Prototypes: */
+			#if defined(__INCLUDE_FROM_ANDROIDACCESSORY_HOST_C)
+				#if defined(FDEV_SETUP_STREAM)
+				static int AOA_Host_putchar(char c,
+				                            FILE* Stream) ATTR_NON_NULL_PTR_ARG(2);
+				static int AOA_Host_getchar(FILE* Stream) ATTR_NON_NULL_PTR_ARG(1);
+				static int AOA_Host_getchar_Blocking(FILE* Stream) ATTR_NON_NULL_PTR_ARG(1);
+				#endif
+
+				static uint8_t AOA_Host_GetAccessoryProtocol(uint16_t* const Protocol) ATTR_NON_NULL_PTR_ARG(1);
+				static uint8_t AOA_Host_SendPropertyString(USB_ClassInfo_AOA_Host_t* const AOAInterfaceInfo,
+			                                               const uint8_t StringIndex) ATTR_NON_NULL_PTR_ARG(1);
+
+				static uint8_t DCOMP_AOA_Host_NextAndroidAccessoryInterface(void* const CurrentDescriptor)
+				                                                            ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(1);
+				static uint8_t DCOMP_AOA_Host_NextInterfaceBulkEndpoint(void* const CurrentDescriptor)
+				                                                        ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(1);
+			#endif
+	#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Host/AudioClassHost.c b/lib/lufa/LUFA/Drivers/USB/Class/Host/AudioClassHost.c
new file mode 100644
index 0000000000..9f1a6dc2c8
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Class/Host/AudioClassHost.c
@@ -0,0 +1,223 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+#define  __INCLUDE_FROM_USB_DRIVER
+#include "../../Core/USBMode.h"
+
+#if defined(USB_CAN_BE_HOST)
+
+#define  __INCLUDE_FROM_AUDIO_DRIVER
+#define  __INCLUDE_FROM_AUDIO_HOST_C
+#include "AudioClassHost.h"
+
+uint8_t Audio_Host_ConfigurePipes(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo,
+                                  uint16_t ConfigDescriptorSize,
+                                  void* ConfigDescriptorData)
+{
+	USB_Descriptor_Endpoint_t*  DataINEndpoint          = NULL;
+	USB_Descriptor_Endpoint_t*  DataOUTEndpoint         = NULL;
+	USB_Descriptor_Interface_t* AudioControlInterface   = NULL;
+	USB_Descriptor_Interface_t* AudioStreamingInterface = NULL;
+
+	memset(&AudioInterfaceInfo->State, 0x00, sizeof(AudioInterfaceInfo->State));
+
+	if (DESCRIPTOR_TYPE(ConfigDescriptorData) != DTYPE_Configuration)
+	  return AUDIO_ENUMERROR_InvalidConfigDescriptor;
+
+	while ((AudioInterfaceInfo->Config.DataINPipe.Address  && !(DataINEndpoint)) ||
+	       (AudioInterfaceInfo->Config.DataOUTPipe.Address && !(DataOUTEndpoint)))
+	{
+		if (!(AudioControlInterface) ||
+		    USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData,
+		                              DCOMP_Audio_Host_NextAudioInterfaceDataEndpoint) != DESCRIPTOR_SEARCH_COMP_Found)
+		{
+			if (!(AudioControlInterface) ||
+			    USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData,
+			                              DCOMP_Audio_Host_NextAudioStreamInterface) != DESCRIPTOR_SEARCH_COMP_Found)
+			{
+				if (USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData,
+				                              DCOMP_Audio_Host_NextAudioControlInterface) != DESCRIPTOR_SEARCH_COMP_Found)
+				{
+					return AUDIO_ENUMERROR_NoCompatibleInterfaceFound;
+				}
+
+				AudioControlInterface = DESCRIPTOR_PCAST(ConfigDescriptorData, USB_Descriptor_Interface_t);
+
+				if (USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData,
+				                              DCOMP_Audio_Host_NextAudioStreamInterface) != DESCRIPTOR_SEARCH_COMP_Found)
+				{
+					return AUDIO_ENUMERROR_NoCompatibleInterfaceFound;
+				}
+			}
+
+			AudioStreamingInterface = DESCRIPTOR_PCAST(ConfigDescriptorData, USB_Descriptor_Interface_t);
+
+			DataINEndpoint  = NULL;
+			DataOUTEndpoint = NULL;
+
+			continue;
+		}
+
+		USB_Descriptor_Endpoint_t* EndpointData = DESCRIPTOR_PCAST(ConfigDescriptorData, USB_Descriptor_Endpoint_t);
+
+		if ((EndpointData->EndpointAddress & ENDPOINT_DIR_MASK) == ENDPOINT_DIR_IN)
+		  DataINEndpoint  = EndpointData;
+		else
+		  DataOUTEndpoint = EndpointData;
+	}
+
+	AudioInterfaceInfo->Config.DataINPipe.Size   = le16_to_cpu(DataINEndpoint->EndpointSize);
+	AudioInterfaceInfo->Config.DataINPipe.EndpointAddress = DataINEndpoint->EndpointAddress;
+	AudioInterfaceInfo->Config.DataINPipe.Type   = EP_TYPE_ISOCHRONOUS;
+	AudioInterfaceInfo->Config.DataINPipe.Banks  = 2;
+
+	AudioInterfaceInfo->Config.DataOUTPipe.Size  = le16_to_cpu(DataOUTEndpoint->EndpointSize);
+	AudioInterfaceInfo->Config.DataOUTPipe.EndpointAddress = DataOUTEndpoint->EndpointAddress;
+	AudioInterfaceInfo->Config.DataOUTPipe.Type  = EP_TYPE_ISOCHRONOUS;
+	AudioInterfaceInfo->Config.DataOUTPipe.Banks = 2;
+
+	if (!(Pipe_ConfigurePipeTable(&AudioInterfaceInfo->Config.DataINPipe, 1)))
+	  return AUDIO_ENUMERROR_PipeConfigurationFailed;
+
+	if (!(Pipe_ConfigurePipeTable(&AudioInterfaceInfo->Config.DataOUTPipe, 1)))
+	  return AUDIO_ENUMERROR_PipeConfigurationFailed;
+
+	AudioInterfaceInfo->State.ControlInterfaceNumber    = AudioControlInterface->InterfaceNumber;
+	AudioInterfaceInfo->State.StreamingInterfaceNumber  = AudioStreamingInterface->InterfaceNumber;
+	AudioInterfaceInfo->State.EnabledStreamingAltIndex  = AudioStreamingInterface->AlternateSetting;
+	AudioInterfaceInfo->State.IsActive = true;
+
+	return AUDIO_ENUMERROR_NoError;
+}
+
+static uint8_t DCOMP_Audio_Host_NextAudioControlInterface(void* CurrentDescriptor)
+{
+	USB_Descriptor_Header_t* Header = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Header_t);
+
+	if (Header->Type == DTYPE_Interface)
+	{
+		USB_Descriptor_Interface_t* Interface = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Interface_t);
+
+		if ((Interface->Class    == AUDIO_CSCP_AudioClass) &&
+		    (Interface->SubClass == AUDIO_CSCP_ControlSubclass) &&
+		    (Interface->Protocol == AUDIO_CSCP_ControlProtocol))
+		{
+			return DESCRIPTOR_SEARCH_Found;
+		}
+	}
+
+	return DESCRIPTOR_SEARCH_NotFound;
+}
+
+static uint8_t DCOMP_Audio_Host_NextAudioStreamInterface(void* CurrentDescriptor)
+{
+	USB_Descriptor_Header_t* Header = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Header_t);
+
+	if (Header->Type == DTYPE_Interface)
+	{
+		USB_Descriptor_Interface_t* Interface = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Interface_t);
+
+		if ((Interface->Class    == AUDIO_CSCP_AudioClass) &&
+		    (Interface->SubClass == AUDIO_CSCP_AudioStreamingSubclass) &&
+		    (Interface->Protocol == AUDIO_CSCP_StreamingProtocol))
+		{
+			return DESCRIPTOR_SEARCH_Found;
+		}
+	}
+
+	return DESCRIPTOR_SEARCH_NotFound;
+}
+
+static uint8_t DCOMP_Audio_Host_NextAudioInterfaceDataEndpoint(void* CurrentDescriptor)
+{
+	USB_Descriptor_Header_t* Header = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Header_t);
+
+	if (Header->Type == DTYPE_Endpoint)
+	{
+		USB_Descriptor_Endpoint_t* Endpoint = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Endpoint_t);
+
+		if ((Endpoint->Attributes & EP_TYPE_MASK) == EP_TYPE_ISOCHRONOUS)
+		  return DESCRIPTOR_SEARCH_Found;
+	}
+	else if (Header->Type == DTYPE_Interface)
+	{
+		return DESCRIPTOR_SEARCH_Fail;
+	}
+
+	return DESCRIPTOR_SEARCH_NotFound;
+}
+
+uint8_t Audio_Host_StartStopStreaming(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo,
+			                          const bool EnableStreaming)
+{
+	if (!(AudioInterfaceInfo->State.IsActive))
+	  return HOST_SENDCONTROL_DeviceDisconnected;
+
+	return USB_Host_SetInterfaceAltSetting(AudioInterfaceInfo->State.StreamingInterfaceNumber,
+	                                       EnableStreaming ? AudioInterfaceInfo->State.EnabledStreamingAltIndex : 0);
+}
+
+uint8_t Audio_Host_GetSetEndpointProperty(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo,
+			                              const uint8_t DataPipeIndex,
+			                              const uint8_t EndpointProperty,
+			                              const uint8_t EndpointControl,
+			                              const uint16_t DataLength,
+			                              void* const Data)
+{
+	if (!(AudioInterfaceInfo->State.IsActive))
+	  return HOST_SENDCONTROL_DeviceDisconnected;
+
+	uint8_t RequestType;
+	uint8_t EndpointAddress;
+
+	if (EndpointProperty & 0x80)
+	  RequestType = (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_ENDPOINT);
+	else
+	  RequestType = (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_ENDPOINT);
+
+	Pipe_SelectPipe(DataPipeIndex);
+	EndpointAddress = Pipe_GetBoundEndpointAddress();
+
+	USB_ControlRequest = (USB_Request_Header_t)
+		{
+			.bmRequestType = RequestType,
+			.bRequest      = EndpointProperty,
+			.wValue        = ((uint16_t)EndpointControl << 8),
+			.wIndex        = EndpointAddress,
+			.wLength       = DataLength,
+		};
+
+	Pipe_SelectPipe(PIPE_CONTROLPIPE);
+
+	return USB_Host_SendControlRequest(Data);
+}
+
+#endif
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Host/AudioClassHost.h b/lib/lufa/LUFA/Drivers/USB/Class/Host/AudioClassHost.h
new file mode 100644
index 0000000000..f1f4207f19
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Class/Host/AudioClassHost.h
@@ -0,0 +1,411 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Host mode driver for the library USB Audio 1.0 Class driver.
+ *
+ *  Host mode driver for the library USB Audio 1.0 Class driver.
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the USB module driver
+ *        dispatch header located in LUFA/Drivers/USB.h.
+ */
+
+/** \ingroup Group_USBClassAudio
+ *  \defgroup Group_USBClassAudioHost Audio 1.0 Class Host Mode Driver
+ *
+ *  \section Sec_USBClassAudioHost_Dependencies Module Source Dependencies
+ *  The following files must be built with any user project that uses this module:
+ *    - LUFA/Drivers/USB/Class/Host/AudioClassHost.c <i>(Makefile source module name: LUFA_SRC_USBCLASS)</i>
+ *
+ *  \section Sec_USBClassAudioHost_ModDescription Module Description
+ *  Host Mode USB Class driver framework interface, for the Audio 1.0 USB Class driver.
+ *
+ *  @{
+ */
+
+#ifndef __AUDIO_CLASS_HOST_H__
+#define __AUDIO_CLASS_HOST_H__
+
+	/* Includes: */
+		#include "../../USB.h"
+		#include "../Common/AudioClassCommon.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_AUDIO_DRIVER)
+			#error Do not include this file directly. Include LUFA/Drivers/USB.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Type Defines: */
+			/** \brief Audio Class Host Mode Configuration and State Structure.
+			 *
+			 *  Class state structure. An instance of this structure should be made within the user application,
+			 *  and passed to each of the Audio class driver functions as the \c AudioInterfaceInfo parameter. This
+			 *  stores each Audio interface's configuration and state information.
+			 */
+			typedef struct
+			{
+				struct
+				{
+					USB_Pipe_Table_t DataINPipe; /**< Data IN Pipe configuration table. */
+					USB_Pipe_Table_t DataOUTPipe; /**< Data OUT Pipe configuration table. */
+				} Config; /**< Config data for the USB class interface within the device. All elements in this section
+				           *   <b>must</b> be set or the interface will fail to enumerate and operate correctly.
+				           */
+				struct
+				{
+					bool IsActive; /**< Indicates if the current interface instance is connected to an attached device, valid
+					                *   after \ref Audio_Host_ConfigurePipes() is called and the Host state machine is in the
+					                *   Configured state.
+					                */
+					uint8_t ControlInterfaceNumber; /**< Interface index of the Audio Control interface within the attached device. */
+					uint8_t StreamingInterfaceNumber; /**< Interface index of the Audio Streaming interface within the attached device. */
+
+					uint8_t EnabledStreamingAltIndex; /**< Alternative setting index of the Audio Streaming interface when the stream is enabled. */
+				} State; /**< State data for the USB class interface within the device. All elements in this section
+						  *   <b>may</b> be set to initial values, but may also be ignored to default to sane values when
+						  *   the interface is enumerated.
+						  */
+			} USB_ClassInfo_Audio_Host_t;
+
+		/* Enums: */
+			/** Enum for the possible error codes returned by the \ref Audio_Host_ConfigurePipes() function. */
+			enum AUDIO_Host_EnumerationFailure_ErrorCodes_t
+			{
+				AUDIO_ENUMERROR_NoError                    = 0, /**< Configuration Descriptor was processed successfully. */
+				AUDIO_ENUMERROR_InvalidConfigDescriptor    = 1, /**< The device returned an invalid Configuration Descriptor. */
+				AUDIO_ENUMERROR_NoCompatibleInterfaceFound = 2, /**< A compatible AUDIO interface was not found in the device's Configuration Descriptor. */
+				AUDIO_ENUMERROR_PipeConfigurationFailed    = 3, /**< One or more pipes for the specified interface could not be configured correctly. */
+			};
+
+		/* Function Prototypes: */
+			/** Host interface configuration routine, to configure a given Audio host interface instance using the Configuration
+			 *  Descriptor read from an attached USB device. This function automatically updates the given Audio Host instance's
+			 *  state values and configures the pipes required to communicate with the interface if it is found within the
+			 *  device. This should be called once after the stack has enumerated the attached device, while the host state
+			 *  machine is in the Addressed state.
+			 *
+			 *  \param[in,out] AudioInterfaceInfo    Pointer to a structure containing an Audio Class host configuration and state.
+			 *  \param[in]     ConfigDescriptorSize  Length of the attached device's Configuration Descriptor.
+			 *  \param[in]     ConfigDescriptorData  Pointer to a buffer containing the attached device's Configuration Descriptor.
+			 *
+			 *  \return A value from the \ref AUDIO_Host_EnumerationFailure_ErrorCodes_t enum.
+			 */
+			uint8_t Audio_Host_ConfigurePipes(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo,
+			                                  uint16_t ConfigDescriptorSize,
+			                                  void* ConfigDescriptorData) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(3);
+
+			/** Starts or stops the audio streaming for the given configured Audio Host interface, allowing for audio samples to be
+			 *  send and/or received.
+			 *
+			 *  \param[in,out] AudioInterfaceInfo  Pointer to a structure containing an Audio Class host configuration and state.
+			 *  \param[in]     EnableStreaming     Boolean true to enable streaming of the specified interface, \c false to disable
+			 *
+			 *  \return A value from the \ref USB_Host_SendControlErrorCodes_t enum.
+			 */
+			uint8_t Audio_Host_StartStopStreaming(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo,
+			                                      const bool EnableStreaming) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Gets or sets the specified property of a streaming audio class endpoint that is bound to a pipe in the given
+			 *  class instance.
+			 *
+			 *  \param[in,out] AudioInterfaceInfo  Pointer to a structure containing an Audio Class host configuration and state.
+			 *  \param[in]     DataPipeIndex       Index of the data pipe whose bound endpoint is to be altered.
+			 *  \param[in]     EndpointProperty    Property of the endpoint to get or set, a value from \ref Audio_ClassRequests_t.
+			 *  \param[in]     EndpointControl     Parameter of the endpoint to get or set, a value from \ref Audio_EndpointControls_t.
+			 *  \param[in,out] DataLength          For SET operations, the length of the parameter data to set. For GET operations, the maximum
+			 *                                     length of the retrieved data.
+			 *  \param[in,out] Data                Pointer to a location where the parameter data is stored for SET operations, or where
+			 *                                     the retrieved data is to be stored for GET operations.
+			 *
+			 *  \return A value from the \ref USB_Host_SendControlErrorCodes_t enum.
+			 */
+			uint8_t Audio_Host_GetSetEndpointProperty(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo,
+			                                          const uint8_t DataPipeIndex,
+			                                          const uint8_t EndpointProperty,
+			                                          const uint8_t EndpointControl,
+			                                          const uint16_t DataLength,
+			                                          void* const Data) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(6);
+
+		/* Inline Functions: */
+			/** General management task for a given Audio host class interface, required for the correct operation of
+			 *  the interface. This should be called frequently in the main program loop, before the master USB management task
+			 *  \ref USB_USBTask().
+			 *
+			 *  \param[in,out] AudioInterfaceInfo  Pointer to a structure containing an Audio Class host configuration and state.
+			 */
+			static inline void Audio_Host_USBTask(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo)
+			                                      ATTR_NON_NULL_PTR_ARG(1) ATTR_ALWAYS_INLINE;
+			static inline void Audio_Host_USBTask(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo)
+			{
+				(void)AudioInterfaceInfo;
+			}
+
+			/** Determines if the given audio interface is ready for a sample to be read from it, and selects the streaming
+			 *  IN pipe ready for reading.
+			 *
+			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or
+			 *       the call will fail.
+			 *
+			 *  \param[in,out] AudioInterfaceInfo  Pointer to a structure containing an Audio Class configuration and state.
+			 *
+			 *  \return Boolean \c true if the given Audio interface has a sample to be read, \c false otherwise.
+			 */
+			static inline bool Audio_Host_IsSampleReceived(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo)
+			                                               ATTR_NON_NULL_PTR_ARG(1) ATTR_ALWAYS_INLINE;
+			static inline bool Audio_Host_IsSampleReceived(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo)
+			{
+				if ((USB_HostState != HOST_STATE_Configured) || !(AudioInterfaceInfo->State.IsActive))
+				  return false;
+
+				bool SampleReceived = false;
+
+				Pipe_SelectPipe(AudioInterfaceInfo->Config.DataINPipe.Address);
+				Pipe_Unfreeze();
+				SampleReceived = Pipe_IsINReceived();
+				Pipe_Freeze();
+
+				return SampleReceived;
+			}
+
+			/** Determines if the given audio interface is ready to accept the next sample to be written to it, and selects
+			 *  the streaming OUT pipe ready for writing.
+			 *
+			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or
+			 *       the call will fail.
+			 *
+			 *  \param[in,out] AudioInterfaceInfo  Pointer to a structure containing an Audio Class configuration and state.
+			 *
+			 *  \return Boolean \c true if the given Audio interface is ready to accept the next sample, \c false otherwise.
+			 */
+			static inline bool Audio_Host_IsReadyForNextSample(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo)
+			                                                   ATTR_NON_NULL_PTR_ARG(1) ATTR_ALWAYS_INLINE;
+			static inline bool Audio_Host_IsReadyForNextSample(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo)
+			{
+				if ((USB_HostState != HOST_STATE_Configured) || !(AudioInterfaceInfo->State.IsActive))
+				  return false;
+
+				Pipe_SelectPipe(AudioInterfaceInfo->Config.DataOUTPipe.Address);
+				return Pipe_IsOUTReady();
+			}
+
+			/** Reads the next 8-bit audio sample from the current audio interface.
+			 *
+			 *  \pre This should be preceded immediately by a call to the \ref Audio_Host_IsSampleReceived() function to ensure
+			 *       that the correct pipe is selected and ready for data.
+			 *
+			 *  \param[in,out] AudioInterfaceInfo  Pointer to a structure containing an Audio Class configuration and state.
+			 *
+			 *  \return  Signed 8-bit audio sample from the audio interface.
+			 */
+			static inline int8_t Audio_Host_ReadSample8(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo)
+			                                            ATTR_NON_NULL_PTR_ARG(1) ATTR_ALWAYS_INLINE;
+			static inline int8_t Audio_Host_ReadSample8(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo)
+			{
+				int8_t Sample;
+
+				(void)AudioInterfaceInfo;
+
+				Sample = Pipe_Read_8();
+
+				if (!(Pipe_BytesInPipe()))
+				{
+					Pipe_Unfreeze();
+					Pipe_ClearIN();
+					Pipe_Freeze();
+				}
+
+				return Sample;
+			}
+
+			/** Reads the next 16-bit audio sample from the current audio interface.
+			 *
+			 *  \pre This should be preceded immediately by a call to the \ref Audio_Host_IsSampleReceived() function to ensure
+			 *       that the correct pipe is selected and ready for data.
+			 *
+			 *  \param[in,out] AudioInterfaceInfo  Pointer to a structure containing an Audio Class configuration and state.
+			 *
+			 *  \return  Signed 16-bit audio sample from the audio interface.
+			 */
+			static inline int16_t Audio_Host_ReadSample16(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo)
+			                                              ATTR_NON_NULL_PTR_ARG(1) ATTR_ALWAYS_INLINE;
+			static inline int16_t Audio_Host_ReadSample16(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo)
+			{
+				int16_t Sample;
+
+				(void)AudioInterfaceInfo;
+
+				Sample = (int16_t)Pipe_Read_16_LE();
+
+				if (!(Pipe_BytesInPipe()))
+				{
+					Pipe_Unfreeze();
+					Pipe_ClearIN();
+					Pipe_Freeze();
+				}
+
+				return Sample;
+			}
+
+			/** Reads the next 24-bit audio sample from the current audio interface.
+			 *
+			 *  \pre This should be preceded immediately by a call to the \ref Audio_Host_IsSampleReceived() function to ensure
+			 *       that the correct pipe is selected and ready for data.
+			 *
+			 *  \param[in,out] AudioInterfaceInfo  Pointer to a structure containing an Audio Class configuration and state.
+			 *
+			 *  \return Signed 24-bit audio sample from the audio interface.
+			 */
+			static inline int32_t Audio_Host_ReadSample24(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo)
+			                                              ATTR_NON_NULL_PTR_ARG(1) ATTR_ALWAYS_INLINE;
+			static inline int32_t Audio_Host_ReadSample24(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo)
+			{
+				int32_t Sample;
+
+				(void)AudioInterfaceInfo;
+
+				Sample = (((uint32_t)Pipe_Read_8() << 16) | Pipe_Read_16_LE());
+
+				if (!(Pipe_BytesInPipe()))
+				{
+					Pipe_Unfreeze();
+					Pipe_ClearIN();
+					Pipe_Freeze();
+				}
+
+				return Sample;
+			}
+
+			/** Writes the next 8-bit audio sample to the current audio interface.
+			 *
+			 *  \pre This should be preceded immediately by a call to the \ref Audio_Host_IsReadyForNextSample() function to
+			 *       ensure that the correct pipe is selected and ready for data.
+			 *
+			 *  \param[in,out] AudioInterfaceInfo  Pointer to a structure containing an Audio Class configuration and state.
+			 *  \param[in]     Sample              Signed 8-bit audio sample.
+			 */
+			static inline void Audio_Host_WriteSample8(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo,
+			                                           const int8_t Sample) ATTR_NON_NULL_PTR_ARG(1) ATTR_ALWAYS_INLINE;
+			static inline void Audio_Host_WriteSample8(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo,
+			                                           const int8_t Sample)
+			{
+				(void)AudioInterfaceInfo;
+
+				Pipe_Write_8(Sample);
+
+				if (!(Pipe_IsReadWriteAllowed()))
+				{
+					Pipe_Unfreeze();
+					Pipe_ClearOUT();
+					Pipe_WaitUntilReady();
+					Pipe_Freeze();
+				}
+			}
+
+			/** Writes the next 16-bit audio sample to the current audio interface.
+			 *
+			 *  \pre This should be preceded immediately by a call to the \ref Audio_Host_IsReadyForNextSample() function to
+			 *       ensure that the correct pipe is selected and ready for data.
+			 *
+			 *  \param[in,out] AudioInterfaceInfo  Pointer to a structure containing an Audio Class configuration and state.
+			 *  \param[in]     Sample              Signed 16-bit audio sample.
+			 */
+			static inline void Audio_Host_WriteSample16(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo,
+			                                            const int16_t Sample) ATTR_NON_NULL_PTR_ARG(1) ATTR_ALWAYS_INLINE;
+			static inline void Audio_Host_WriteSample16(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo,
+			                                            const int16_t Sample)
+			{
+				(void)AudioInterfaceInfo;
+
+				Pipe_Write_16_LE(Sample);
+
+				if (!(Pipe_IsReadWriteAllowed()))
+				{
+					Pipe_Unfreeze();
+					Pipe_ClearOUT();
+					Pipe_WaitUntilReady();
+					Pipe_Freeze();
+				}
+			}
+
+			/** Writes the next 24-bit audio sample to the current audio interface.
+			 *
+			 *  \pre This should be preceded immediately by a call to the \ref Audio_Host_IsReadyForNextSample() function to
+			 *       ensure that the correct pipe is selected and ready for data.
+			 *
+			 *  \param[in,out] AudioInterfaceInfo  Pointer to a structure containing an Audio Class configuration and state.
+			 *  \param[in]     Sample              Signed 24-bit audio sample.
+			 */
+			static inline void Audio_Host_WriteSample24(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo,
+			                                            const int32_t Sample) ATTR_NON_NULL_PTR_ARG(1) ATTR_ALWAYS_INLINE;
+			static inline void Audio_Host_WriteSample24(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo,
+			                                            const int32_t Sample)
+			{
+				(void)AudioInterfaceInfo;
+
+				Pipe_Write_16_LE(Sample);
+				Pipe_Write_8(Sample >> 16);
+
+				if (!(Pipe_IsReadWriteAllowed()))
+				{
+					Pipe_Unfreeze();
+					Pipe_ClearOUT();
+					Pipe_WaitUntilReady();
+					Pipe_Freeze();
+				}
+			}
+
+	/* Private Interface - For use in library only: */
+	#if !defined(__DOXYGEN__)
+		/* Function Prototypes: */
+			#if defined(__INCLUDE_FROM_AUDIO_HOST_C)
+				static uint8_t DCOMP_Audio_Host_NextAudioControlInterface(void* CurrentDescriptor)
+				                                                          ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(1);
+				static uint8_t DCOMP_Audio_Host_NextAudioStreamInterface(void* CurrentDescriptor)
+				                                                         ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(1);
+				static uint8_t DCOMP_Audio_Host_NextAudioInterfaceDataEndpoint(void* CurrentDescriptor)
+				                                                               ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(1);
+			#endif
+	#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Host/CDCClassHost.c b/lib/lufa/LUFA/Drivers/USB/Class/Host/CDCClassHost.c
new file mode 100644
index 0000000000..af9ed96e24
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Class/Host/CDCClassHost.c
@@ -0,0 +1,512 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+#define  __INCLUDE_FROM_USB_DRIVER
+#include "../../Core/USBMode.h"
+
+#if defined(USB_CAN_BE_HOST)
+
+#define  __INCLUDE_FROM_CDC_DRIVER
+#define  __INCLUDE_FROM_CDC_HOST_C
+#include "CDCClassHost.h"
+
+uint8_t CDC_Host_ConfigurePipes(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo,
+                                uint16_t ConfigDescriptorSize,
+                                void* ConfigDescriptorData)
+{
+	USB_Descriptor_Endpoint_t*  DataINEndpoint       = NULL;
+	USB_Descriptor_Endpoint_t*  DataOUTEndpoint      = NULL;
+	USB_Descriptor_Endpoint_t*  NotificationEndpoint = NULL;
+	USB_Descriptor_Interface_t* CDCControlInterface  = NULL;
+
+	memset(&CDCInterfaceInfo->State, 0x00, sizeof(CDCInterfaceInfo->State));
+
+	if (DESCRIPTOR_TYPE(ConfigDescriptorData) != DTYPE_Configuration)
+	  return CDC_ENUMERROR_InvalidConfigDescriptor;
+
+	while (!(DataINEndpoint) || !(DataOUTEndpoint) || !(NotificationEndpoint))
+	{
+		if (!(CDCControlInterface) ||
+		    USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData,
+		                              DCOMP_CDC_Host_NextCDCInterfaceEndpoint) != DESCRIPTOR_SEARCH_COMP_Found)
+		{
+			if (NotificationEndpoint)
+			{
+				if (USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData,
+				                              DCOMP_CDC_Host_NextCDCDataInterface) != DESCRIPTOR_SEARCH_COMP_Found)
+				{
+					return CDC_ENUMERROR_NoCompatibleInterfaceFound;
+				}
+
+				DataINEndpoint  = NULL;
+				DataOUTEndpoint = NULL;
+			}
+			else
+			{
+				if (USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData,
+				                              DCOMP_CDC_Host_NextCDCControlInterface) != DESCRIPTOR_SEARCH_COMP_Found)
+				{
+					return CDC_ENUMERROR_NoCompatibleInterfaceFound;
+				}
+
+				CDCControlInterface = DESCRIPTOR_PCAST(ConfigDescriptorData, USB_Descriptor_Interface_t);
+
+				NotificationEndpoint = NULL;
+			}
+
+			continue;
+		}
+
+		USB_Descriptor_Endpoint_t* EndpointData = DESCRIPTOR_PCAST(ConfigDescriptorData, USB_Descriptor_Endpoint_t);
+
+		if ((EndpointData->EndpointAddress & ENDPOINT_DIR_MASK) == ENDPOINT_DIR_IN)
+		{
+			if ((EndpointData->Attributes & EP_TYPE_MASK) == EP_TYPE_INTERRUPT)
+			  NotificationEndpoint = EndpointData;
+			else
+			  DataINEndpoint = EndpointData;
+		}
+		else
+		{
+			DataOUTEndpoint = EndpointData;
+		}
+	}
+
+	CDCInterfaceInfo->Config.DataINPipe.Size  = le16_to_cpu(DataINEndpoint->EndpointSize);
+	CDCInterfaceInfo->Config.DataINPipe.EndpointAddress = DataINEndpoint->EndpointAddress;
+	CDCInterfaceInfo->Config.DataINPipe.Type  = EP_TYPE_BULK;
+
+	CDCInterfaceInfo->Config.DataOUTPipe.Size = le16_to_cpu(DataOUTEndpoint->EndpointSize);
+	CDCInterfaceInfo->Config.DataOUTPipe.EndpointAddress = DataOUTEndpoint->EndpointAddress;
+	CDCInterfaceInfo->Config.DataOUTPipe.Type = EP_TYPE_BULK;
+
+	CDCInterfaceInfo->Config.NotificationPipe.Size = le16_to_cpu(NotificationEndpoint->EndpointSize);
+	CDCInterfaceInfo->Config.NotificationPipe.EndpointAddress = NotificationEndpoint->EndpointAddress;
+	CDCInterfaceInfo->Config.NotificationPipe.Type = EP_TYPE_INTERRUPT;
+
+	if (!(Pipe_ConfigurePipeTable(&CDCInterfaceInfo->Config.DataINPipe, 1)))
+	  return CDC_ENUMERROR_PipeConfigurationFailed;
+
+	if (!(Pipe_ConfigurePipeTable(&CDCInterfaceInfo->Config.DataOUTPipe, 1)))
+	  return CDC_ENUMERROR_PipeConfigurationFailed;
+
+	if (!(Pipe_ConfigurePipeTable(&CDCInterfaceInfo->Config.NotificationPipe, 1)))
+	  return CDC_ENUMERROR_PipeConfigurationFailed;
+
+	CDCInterfaceInfo->State.ControlInterfaceNumber = CDCControlInterface->InterfaceNumber;
+	CDCInterfaceInfo->State.ControlLineStates.HostToDevice = (CDC_CONTROL_LINE_OUT_RTS | CDC_CONTROL_LINE_OUT_DTR);
+	CDCInterfaceInfo->State.ControlLineStates.DeviceToHost = (CDC_CONTROL_LINE_IN_DCD  | CDC_CONTROL_LINE_IN_DSR);
+	CDCInterfaceInfo->State.IsActive = true;
+
+	return CDC_ENUMERROR_NoError;
+}
+
+static uint8_t DCOMP_CDC_Host_NextCDCControlInterface(void* const CurrentDescriptor)
+{
+	USB_Descriptor_Header_t* Header = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Header_t);
+
+	if (Header->Type == DTYPE_Interface)
+	{
+		USB_Descriptor_Interface_t* Interface = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Interface_t);
+
+		if ((Interface->Class    == CDC_CSCP_CDCClass)    &&
+		    (Interface->SubClass == CDC_CSCP_ACMSubclass) &&
+		    (Interface->Protocol == CDC_CSCP_ATCommandProtocol))
+		{
+			return DESCRIPTOR_SEARCH_Found;
+		}
+	}
+
+	return DESCRIPTOR_SEARCH_NotFound;
+}
+
+static uint8_t DCOMP_CDC_Host_NextCDCDataInterface(void* const CurrentDescriptor)
+{
+	USB_Descriptor_Header_t* Header = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Header_t);
+
+	if (Header->Type == DTYPE_Interface)
+	{
+		USB_Descriptor_Interface_t* Interface = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Interface_t);
+
+		if ((Interface->Class    == CDC_CSCP_CDCDataClass)   &&
+		    (Interface->SubClass == CDC_CSCP_NoDataSubclass) &&
+		    (Interface->Protocol == CDC_CSCP_NoDataProtocol))
+		{
+			return DESCRIPTOR_SEARCH_Found;
+		}
+	}
+
+	return DESCRIPTOR_SEARCH_NotFound;
+}
+
+static uint8_t DCOMP_CDC_Host_NextCDCInterfaceEndpoint(void* const CurrentDescriptor)
+{
+	USB_Descriptor_Header_t* Header = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Header_t);
+
+	if (Header->Type == DTYPE_Endpoint)
+	{
+		USB_Descriptor_Endpoint_t* Endpoint = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Endpoint_t);
+
+		uint8_t EndpointType = (Endpoint->Attributes & EP_TYPE_MASK);
+
+		if (((EndpointType == EP_TYPE_BULK) || (EndpointType == EP_TYPE_INTERRUPT)) &&
+		    !(Pipe_IsEndpointBound(Endpoint->EndpointAddress)))
+		{
+			return DESCRIPTOR_SEARCH_Found;
+		}
+	}
+	else if (Header->Type == DTYPE_Interface)
+	{
+		return DESCRIPTOR_SEARCH_Fail;
+	}
+
+	return DESCRIPTOR_SEARCH_NotFound;
+}
+
+void CDC_Host_USBTask(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo)
+{
+	if ((USB_HostState != HOST_STATE_Configured) || !(CDCInterfaceInfo->State.IsActive))
+	  return;
+
+	Pipe_SelectPipe(CDCInterfaceInfo->Config.NotificationPipe.Address);
+	Pipe_Unfreeze();
+
+	if (Pipe_IsINReceived())
+	{
+		USB_Request_Header_t Notification;
+		Pipe_Read_Stream_LE(&Notification, sizeof(USB_Request_Header_t), NULL);
+
+		if ((Notification.bRequest      == CDC_NOTIF_SerialState) &&
+		    (Notification.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE)))
+		{
+			Pipe_Read_Stream_LE(&CDCInterfaceInfo->State.ControlLineStates.DeviceToHost,
+			                    sizeof(CDCInterfaceInfo->State.ControlLineStates.DeviceToHost),
+			                    NULL);
+
+			Pipe_ClearIN();
+
+			EVENT_CDC_Host_ControLineStateChanged(CDCInterfaceInfo);
+		}
+		else
+		{
+			Pipe_ClearIN();
+		}
+	}
+
+	Pipe_Freeze();
+
+	#if !defined(NO_CLASS_DRIVER_AUTOFLUSH)
+	CDC_Host_Flush(CDCInterfaceInfo);
+	#endif
+}
+
+uint8_t CDC_Host_SetLineEncoding(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo)
+{
+	USB_ControlRequest = (USB_Request_Header_t)
+	{
+		.bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE),
+		.bRequest      = CDC_REQ_SetLineEncoding,
+		.wValue        = 0,
+		.wIndex        = CDCInterfaceInfo->State.ControlInterfaceNumber,
+		.wLength       = sizeof(CDCInterfaceInfo->State.LineEncoding),
+	};
+
+	Pipe_SelectPipe(PIPE_CONTROLPIPE);
+
+	return USB_Host_SendControlRequest(&CDCInterfaceInfo->State.LineEncoding);
+}
+
+uint8_t CDC_Host_SendControlLineStateChange(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo)
+{
+	USB_ControlRequest = (USB_Request_Header_t)
+	{
+		.bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE),
+		.bRequest      = CDC_REQ_SetControlLineState,
+		.wValue        = CDCInterfaceInfo->State.ControlLineStates.HostToDevice,
+		.wIndex        = CDCInterfaceInfo->State.ControlInterfaceNumber,
+		.wLength       = 0,
+	};
+
+	Pipe_SelectPipe(PIPE_CONTROLPIPE);
+
+	return USB_Host_SendControlRequest(NULL);
+}
+
+uint8_t CDC_Host_SendBreak(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo,
+                           const uint8_t Duration)
+{
+	USB_ControlRequest = (USB_Request_Header_t)
+	{
+		.bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE),
+		.bRequest      = CDC_REQ_SendBreak,
+		.wValue        = Duration,
+		.wIndex        = CDCInterfaceInfo->State.ControlInterfaceNumber,
+		.wLength       = 0,
+	};
+
+	Pipe_SelectPipe(PIPE_CONTROLPIPE);
+
+	return USB_Host_SendControlRequest(NULL);
+}
+
+uint8_t CDC_Host_SendData(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo,
+                          const void* const Buffer,
+                          const uint16_t Length)
+{
+	if ((USB_HostState != HOST_STATE_Configured) || !(CDCInterfaceInfo->State.IsActive))
+	  return PIPE_READYWAIT_DeviceDisconnected;
+
+	uint8_t ErrorCode;
+
+	Pipe_SelectPipe(CDCInterfaceInfo->Config.DataOUTPipe.Address);
+
+	Pipe_Unfreeze();
+	ErrorCode = Pipe_Write_Stream_LE(Buffer, Length, NULL);
+	Pipe_Freeze();
+
+	return ErrorCode;
+}
+
+uint8_t CDC_Host_SendData_P(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo,
+                          const void* const Buffer,
+                          const uint16_t Length)
+{
+	if ((USB_HostState != HOST_STATE_Configured) || !(CDCInterfaceInfo->State.IsActive))
+	  return PIPE_READYWAIT_DeviceDisconnected;
+
+	uint8_t ErrorCode;
+
+	Pipe_SelectPipe(CDCInterfaceInfo->Config.DataOUTPipe.Address);
+
+	Pipe_Unfreeze();
+	ErrorCode = Pipe_Write_PStream_LE(Buffer, Length, NULL);
+	Pipe_Freeze();
+
+	return ErrorCode;
+}
+
+uint8_t CDC_Host_SendString(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo,
+                            const char* const String)
+{
+	if ((USB_HostState != HOST_STATE_Configured) || !(CDCInterfaceInfo->State.IsActive))
+	  return PIPE_READYWAIT_DeviceDisconnected;
+
+	uint8_t ErrorCode;
+
+	Pipe_SelectPipe(CDCInterfaceInfo->Config.DataOUTPipe.Address);
+
+	Pipe_Unfreeze();
+	ErrorCode = Pipe_Write_Stream_LE(String, strlen(String), NULL);
+	Pipe_Freeze();
+
+	return ErrorCode;
+}
+
+uint8_t CDC_Host_SendString_P(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo,
+                            const char* const String)
+{
+	if ((USB_HostState != HOST_STATE_Configured) || !(CDCInterfaceInfo->State.IsActive))
+	  return PIPE_READYWAIT_DeviceDisconnected;
+
+	uint8_t ErrorCode;
+
+	Pipe_SelectPipe(CDCInterfaceInfo->Config.DataOUTPipe.Address);
+
+	Pipe_Unfreeze();
+	ErrorCode = Pipe_Write_PStream_LE(String, strlen_P(String), NULL);
+	Pipe_Freeze();
+
+	return ErrorCode;
+}
+
+uint8_t CDC_Host_SendByte(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo,
+                          const uint8_t Data)
+{
+	if ((USB_HostState != HOST_STATE_Configured) || !(CDCInterfaceInfo->State.IsActive))
+	  return PIPE_READYWAIT_DeviceDisconnected;
+
+	uint8_t ErrorCode;
+
+	Pipe_SelectPipe(CDCInterfaceInfo->Config.DataOUTPipe.Address);
+	Pipe_Unfreeze();
+
+	if (!(Pipe_IsReadWriteAllowed()))
+	{
+		Pipe_ClearOUT();
+
+		if ((ErrorCode = Pipe_WaitUntilReady()) != PIPE_READYWAIT_NoError)
+		  return ErrorCode;
+	}
+
+	Pipe_Write_8(Data);
+	Pipe_Freeze();
+
+	return PIPE_READYWAIT_NoError;
+}
+
+uint16_t CDC_Host_BytesReceived(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo)
+{
+	if ((USB_HostState != HOST_STATE_Configured) || !(CDCInterfaceInfo->State.IsActive))
+	  return 0;
+
+	Pipe_SelectPipe(CDCInterfaceInfo->Config.DataINPipe.Address);
+	Pipe_Unfreeze();
+
+	if (Pipe_IsINReceived())
+	{
+		if (!(Pipe_BytesInPipe()))
+		{
+			Pipe_ClearIN();
+			Pipe_Freeze();
+			return 0;
+		}
+		else
+		{
+			Pipe_Freeze();
+			return Pipe_BytesInPipe();
+		}
+	}
+	else
+	{
+		Pipe_Freeze();
+
+		return 0;
+	}
+}
+
+int16_t CDC_Host_ReceiveByte(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo)
+{
+	if ((USB_HostState != HOST_STATE_Configured) || !(CDCInterfaceInfo->State.IsActive))
+	  return -1;
+
+	int16_t ReceivedByte = -1;
+
+	Pipe_SelectPipe(CDCInterfaceInfo->Config.DataINPipe.Address);
+	Pipe_Unfreeze();
+
+	if (Pipe_IsINReceived())
+	{
+		if (Pipe_BytesInPipe())
+		  ReceivedByte = Pipe_Read_8();
+
+		if (!(Pipe_BytesInPipe()))
+		  Pipe_ClearIN();
+	}
+
+	Pipe_Freeze();
+
+	return ReceivedByte;
+}
+
+uint8_t CDC_Host_Flush(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo)
+{
+	if ((USB_HostState != HOST_STATE_Configured) || !(CDCInterfaceInfo->State.IsActive))
+	  return PIPE_READYWAIT_DeviceDisconnected;
+
+	uint8_t ErrorCode;
+
+	Pipe_SelectPipe(CDCInterfaceInfo->Config.DataOUTPipe.Address);
+	Pipe_Unfreeze();
+
+	if (!(Pipe_BytesInPipe()))
+	  return PIPE_READYWAIT_NoError;
+
+	bool BankFull = !(Pipe_IsReadWriteAllowed());
+
+	Pipe_ClearOUT();
+
+	if (BankFull)
+	{
+		if ((ErrorCode = Pipe_WaitUntilReady()) != PIPE_READYWAIT_NoError)
+		  return ErrorCode;
+
+		Pipe_ClearOUT();
+	}
+
+	Pipe_Freeze();
+
+	return PIPE_READYWAIT_NoError;
+}
+
+#if defined(FDEV_SETUP_STREAM)
+void CDC_Host_CreateStream(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo,
+                           FILE* const Stream)
+{
+	*Stream = (FILE)FDEV_SETUP_STREAM(CDC_Host_putchar, CDC_Host_getchar, _FDEV_SETUP_RW);
+	fdev_set_udata(Stream, CDCInterfaceInfo);
+}
+
+void CDC_Host_CreateBlockingStream(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo,
+                                   FILE* const Stream)
+{
+	*Stream = (FILE)FDEV_SETUP_STREAM(CDC_Host_putchar, CDC_Host_getchar_Blocking, _FDEV_SETUP_RW);
+	fdev_set_udata(Stream, CDCInterfaceInfo);
+}
+
+static int CDC_Host_putchar(char c,
+                            FILE* Stream)
+{
+	return CDC_Host_SendByte((USB_ClassInfo_CDC_Host_t*)fdev_get_udata(Stream), c) ? _FDEV_ERR : 0;
+}
+
+static int CDC_Host_getchar(FILE* Stream)
+{
+	int16_t ReceivedByte = CDC_Host_ReceiveByte((USB_ClassInfo_CDC_Host_t*)fdev_get_udata(Stream));
+
+	if (ReceivedByte < 0)
+	  return _FDEV_EOF;
+
+	return ReceivedByte;
+}
+
+static int CDC_Host_getchar_Blocking(FILE* Stream)
+{
+	int16_t ReceivedByte;
+
+	while ((ReceivedByte = CDC_Host_ReceiveByte((USB_ClassInfo_CDC_Host_t*)fdev_get_udata(Stream))) < 0)
+	{
+		if (USB_HostState == HOST_STATE_Unattached)
+		  return _FDEV_EOF;
+
+		CDC_Host_USBTask((USB_ClassInfo_CDC_Host_t*)fdev_get_udata(Stream));
+		USB_USBTask();
+	}
+
+	return ReceivedByte;
+}
+#endif
+
+void CDC_Host_Event_Stub(void)
+{
+
+}
+
+#endif
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Host/CDCClassHost.h b/lib/lufa/LUFA/Drivers/USB/Class/Host/CDCClassHost.h
new file mode 100644
index 0000000000..86ce6def38
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Class/Host/CDCClassHost.h
@@ -0,0 +1,385 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Host mode driver for the library USB CDC Class driver.
+ *
+ *  Host mode driver for the library USB CDC Class driver.
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the USB module driver
+ *        dispatch header located in LUFA/Drivers/USB.h.
+ */
+
+/** \ingroup Group_USBClassCDC
+ *  \defgroup Group_USBClassCDCHost CDC Class Host Mode Driver
+ *
+ *  \section Sec_USBClassCDCHost_Dependencies Module Source Dependencies
+ *  The following files must be built with any user project that uses this module:
+ *    - LUFA/Drivers/USB/Class/Host/CDCClassHost.c <i>(Makefile source module name: LUFA_SRC_USBCLASS)</i>
+ *
+ *  \section Sec_USBClassCDCHost_ModDescription Module Description
+ *  Host Mode USB Class driver framework interface, for the CDC USB Class driver.
+ *
+ *  @{
+ */
+
+#ifndef __CDC_CLASS_HOST_H__
+#define __CDC_CLASS_HOST_H__
+
+	/* Includes: */
+		#include "../../USB.h"
+		#include "../Common/CDCClassCommon.h"
+
+		#include <stdio.h>
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_CDC_DRIVER)
+			#error Do not include this file directly. Include LUFA/Drivers/USB.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Type Defines: */
+			/** \brief CDC Class Host Mode Configuration and State Structure.
+			 *
+			 *  Class state structure. An instance of this structure should be made within the user application,
+			 *  and passed to each of the CDC class driver functions as the \c CDCInterfaceInfo parameter. This
+			 *  stores each CDC interface's configuration and state information.
+			 */
+			typedef struct
+			{
+				struct
+				{
+					USB_Pipe_Table_t DataINPipe; /**< Data IN Pipe configuration table. */
+					USB_Pipe_Table_t DataOUTPipe; /**< Data OUT Pipe configuration table. */
+					USB_Pipe_Table_t NotificationPipe; /**< Notification IN Pipe configuration table. */
+				} Config; /**< Config data for the USB class interface within the device. All elements in this section
+				           *   <b>must</b> be set or the interface will fail to enumerate and operate correctly.
+				           */
+				struct
+				{
+					bool IsActive; /**< Indicates if the current interface instance is connected to an attached device, valid
+					                *   after \ref CDC_Host_ConfigurePipes() is called and the Host state machine is in the
+					                *   Configured state.
+					                */
+					uint8_t  ControlInterfaceNumber; /**< Interface index of the CDC-ACM control interface within the attached device. */
+
+					struct
+					{
+						uint16_t HostToDevice; /**< Control line states from the host to device, as a set of \c CDC_CONTROL_LINE_OUT_*
+						                        *   masks - to notify the device of changes to these values, call the
+						                        *   \ref CDC_Host_SendControlLineStateChange() function.
+						                        */
+						uint16_t DeviceToHost; /**< Control line states from the device to host, as a set of \c CDC_CONTROL_LINE_IN_*
+						                        *   masks. This value is updated each time \ref CDC_Host_USBTask() is called.
+						                        */
+					} ControlLineStates; /**< Current states of the virtual serial port's control lines between the device and host. */
+
+					CDC_LineEncoding_t LineEncoding; /**< Line encoding used in the virtual serial port, for the device's information.
+					                                  *   This is generally only used if the virtual serial port data is to be
+					                                  *   reconstructed on a physical UART. When set by the host application, the
+					                                  *   \ref CDC_Host_SetLineEncoding() function must be called to push the changes
+					                                  *   to the device.
+					                                  */
+				} State; /**< State data for the USB class interface within the device. All elements in this section
+						  *   <b>may</b> be set to initial values, but may also be ignored to default to sane values when
+						  *   the interface is enumerated.
+						  */
+			} USB_ClassInfo_CDC_Host_t;
+
+		/* Enums: */
+			/** Enum for the possible error codes returned by the \ref CDC_Host_ConfigurePipes() function. */
+			enum CDC_Host_EnumerationFailure_ErrorCodes_t
+			{
+				CDC_ENUMERROR_NoError                    = 0, /**< Configuration Descriptor was processed successfully. */
+				CDC_ENUMERROR_InvalidConfigDescriptor    = 1, /**< The device returned an invalid Configuration Descriptor. */
+				CDC_ENUMERROR_NoCompatibleInterfaceFound = 2, /**< A compatible CDC interface was not found in the device's Configuration Descriptor. */
+				CDC_ENUMERROR_PipeConfigurationFailed    = 3, /**< One or more pipes for the specified interface could not be configured correctly. */
+			};
+
+		/* Function Prototypes: */
+			/** General management task for a given CDC host class interface, required for the correct operation of the interface. This should
+			 *  be called frequently in the main program loop, before the master USB management task \ref USB_USBTask().
+			 *
+			 *  \param[in,out] CDCInterfaceInfo  Pointer to a structure containing an CDC Class host configuration and state.
+			 */
+			void CDC_Host_USBTask(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Host interface configuration routine, to configure a given CDC host interface instance using the Configuration
+			 *  Descriptor read from an attached USB device. This function automatically updates the given CDC Host instance's
+			 *  state values and configures the pipes required to communicate with the interface if it is found within the device.
+			 *  This should be called once after the stack has enumerated the attached device, while the host state machine is in
+			 *  the Addressed state.
+			 *
+			 *  \param[in,out] CDCInterfaceInfo      Pointer to a structure containing an CDC Class host configuration and state.
+			 *  \param[in]     ConfigDescriptorSize  Length of the attached device's Configuration Descriptor.
+			 *  \param[in]     ConfigDescriptorData  Pointer to a buffer containing the attached device's Configuration Descriptor.
+			 *
+			 *  \return A value from the \ref CDC_Host_EnumerationFailure_ErrorCodes_t enum.
+			 */
+			uint8_t CDC_Host_ConfigurePipes(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo,
+			                                uint16_t ConfigDescriptorSize,
+			                                void* ConfigDescriptorData) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(3);
+
+			/** Sets the line encoding for the attached device's virtual serial port. This should be called when the \c LineEncoding
+			 *  values of the interface have been changed to push the new settings to the USB device.
+			 *
+			 *  \param[in,out] CDCInterfaceInfo  Pointer to a structure containing a CDC Class host configuration and state.
+			 *
+			 *  \return A value from the \ref USB_Host_SendControlErrorCodes_t enum.
+			 */
+			uint8_t CDC_Host_SetLineEncoding(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Sends a Serial Control Line State Change notification to the device. This should be called when the virtual serial
+			 *  control lines (DTR, RTS, etc.) have changed states. Line states persist until they are cleared via a second
+			 *  notification. This should be called each time the CDC class driver's \c ControlLineStates.HostToDevice value is updated
+			 *  to push the new states to the USB device.
+			 *
+			 *  \param[in,out] CDCInterfaceInfo  Pointer to a structure containing a CDC Class host configuration and state.
+			 *
+			 *  \return A value from the \ref USB_Host_SendControlErrorCodes_t enum.
+			 */
+			uint8_t CDC_Host_SendControlLineStateChange(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Sends a Send Break request to the device. This is generally used to separate data or to indicate a special condition
+			 *  to the receiving device.
+			 *
+			 *  \param[in,out] CDCInterfaceInfo  Pointer to a structure containing a CDC Class host configuration and state.
+			 *  \param[in]     Duration          Duration of the break, in milliseconds.
+			 *
+			 *  \return A value from the \ref USB_Host_SendControlErrorCodes_t enum.
+			 */
+			uint8_t CDC_Host_SendBreak(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo,
+			                           const uint8_t Duration) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Sends a given data buffer to the attached USB device, if connected. If a device is not connected when the function is
+			 *  called, the data will be discarded. Bytes will be queued for transmission to the device until either the pipe bank
+			 *  becomes full, or the \ref CDC_Host_Flush() function is called to flush the pending data to the device. This allows for
+			 *  multiple bytes to be packed into a single pipe packet, increasing data throughput.
+			 *
+			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the
+			 *       call will fail.
+			 *
+			 *  \param[in,out] CDCInterfaceInfo  Pointer to a structure containing a CDC Class host configuration and state.
+			 *  \param[in]     Buffer            Pointer to a buffer containing the data to send to the device.
+			 *  \param[in]     Length            Length of the data to send to the device.
+			 *
+			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t CDC_Host_SendData(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo,
+			                          const void* const Buffer,
+			                          const uint16_t Length) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Sends a given data buffer from PROGMEM space to the attached USB device, if connected. If a device is not connected when the
+			 *  function is called, the string is discarded. Bytes will be queued for transmission to the host until either the pipe
+			 *  bank becomes full, or the \ref CDC_Host_Flush() function is called to flush the pending data to the device. This allows
+			 *  for multiple bytes to be packed into a single pipe packet, increasing data throughput.
+			 *
+			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or
+			 *       the call will fail.
+			 *
+			 *  \param[in,out] CDCInterfaceInfo  Pointer to a structure containing a CDC Class host configuration and state.
+			 *  \param[in]     Buffer            Pointer to a buffer containing the data to send to the device.
+			 *  \param[in]     Length            Length of the data to send to the host.
+			 *
+			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t CDC_Host_SendData_P(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo,
+			                            const void* const Buffer,
+			                            const uint16_t Length) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Sends a given null-terminated string to the attached USB device, if connected. If a device is not connected when the
+			 *  function is called, the string is discarded. Bytes will be queued for transmission to the device until either the pipe
+			 *  bank becomes full, or the \ref CDC_Host_Flush() function is called to flush the pending data to the device. This allows
+			 *  for multiple bytes to be packed into a single pipe packet, increasing data throughput.
+			 *
+			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the
+			 *       call will fail.
+			 *
+			 *  \param[in,out] CDCInterfaceInfo  Pointer to a structure containing a CDC Class host configuration and state.
+			 *  \param[in]     String            Pointer to the null terminated string to send to the device.
+			 *
+			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t CDC_Host_SendString(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo,
+			                            const char* const String) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2);
+
+			/** Sends a given null terminated string from PROGMEM space to the attached USB device, if connected. If a device is not connected
+			 *  when the function is called, the string is discarded. Bytes will be queued for transmission to the device until either
+			 *  the pipe bank becomes full, or the \ref CDC_Host_Flush() function is called to flush the pending data to
+			 *  the device. This allows for multiple bytes to be packed into a single pipe packet, increasing data throughput.
+			 *
+			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or
+			 *       the call will fail.
+			 *
+			 *  \param[in,out] CDCInterfaceInfo  Pointer to a structure containing a CDC Class host configuration and state.
+			 *  \param[in]     String            Pointer to the null terminated string to send to the host.
+			 *
+			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t CDC_Host_SendString_P(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo,
+			                              const char* const String) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2);
+
+			/** Sends a given byte to the attached USB device, if connected. If a device is not connected when the function is called, the
+			 *  byte is discarded. Bytes will be queued for transmission to the device until either the pipe bank becomes full, or the
+			 *  \ref CDC_Host_Flush() function is called to flush the pending data to the host. This allows for multiple bytes to be
+			 *  packed into a single pipe packet, increasing data throughput.
+			 *
+			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the
+			 *       call will fail.
+			 *
+			 *  \param[in,out] CDCInterfaceInfo  Pointer to a structure containing a CDC Class host configuration and state.
+			 *  \param[in]     Data              Byte of data to send to the device.
+			 *
+			 *  \return A value from the \ref Pipe_WaitUntilReady_ErrorCodes_t enum.
+			 */
+			uint8_t CDC_Host_SendByte(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo,
+			                          const uint8_t Data) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Determines the number of bytes received by the CDC interface from the device, waiting to be read. This indicates the number
+			 *  of bytes in the IN pipe bank only, and thus the number of calls to \ref CDC_Host_ReceiveByte() which are guaranteed to succeed
+			 *  immediately. If multiple bytes are to be received, they should be buffered by the user application, as the pipe bank will not be
+			 *  released back to the USB controller until all bytes are read.
+			 *
+			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the
+			 *       call will fail.
+			 *
+			 *  \param[in,out] CDCInterfaceInfo  Pointer to a structure containing a CDC Class host configuration and state.
+			 *
+			 *  \return Total number of buffered bytes received from the device.
+			 */
+			uint16_t CDC_Host_BytesReceived(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Reads a byte of data from the device. If no data is waiting to be read of if a USB device is not connected, the function
+			 *  returns a negative value. The \ref CDC_Host_BytesReceived() function may be queried in advance to determine how many bytes
+			 *  are currently buffered in the CDC interface's data receive pipe.
+			 *
+			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the
+			 *       call will fail.
+			 *
+			 *  \param[in,out] CDCInterfaceInfo  Pointer to a structure containing a CDC Class host configuration and state.
+			 *
+			 *  \return Next received byte from the device, or a negative value if no data received.
+			 */
+			int16_t CDC_Host_ReceiveByte(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Flushes any data waiting to be sent, ensuring that the send buffer is cleared.
+			 *
+			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the
+			 *       call will fail.
+			 *
+			 *  \param[in,out] CDCInterfaceInfo  Pointer to a structure containing a CDC Class host configuration and state.
+			 *
+			 *  \return A value from the \ref Pipe_WaitUntilReady_ErrorCodes_t enum.
+			 */
+			uint8_t CDC_Host_Flush(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
+
+			#if defined(FDEV_SETUP_STREAM) || defined(__DOXYGEN__)
+			/** Creates a standard character stream for the given CDC Device instance so that it can be used with all the regular
+			 *  functions in the standard \c <stdio.h> library that accept a \c FILE stream as a destination (e.g. \c fprintf). The created
+			 *  stream is bidirectional and can be used for both input and output functions.
+			 *
+			 *  Reading data from this stream is non-blocking, i.e. in most instances, complete strings cannot be read in by a single
+			 *  fetch, as the endpoint will not be ready at some point in the transmission, aborting the transfer. However, this may
+			 *  be used when the read data is processed byte-per-bye (via \c getc()) or when the user application will implement its own
+			 *  line buffering.
+			 *
+			 *  \note The created stream can be given as \c stdout if desired to direct the standard output from all \c <stdio.h> functions
+			 *        to the given CDC interface.
+			 *        \n\n
+			 *
+			 *  \note This function is not available on all microcontroller architectures.
+			 *
+			 *  \param[in,out] CDCInterfaceInfo  Pointer to a structure containing a CDC Class configuration and state.
+			 *  \param[in,out] Stream            Pointer to a FILE structure where the created stream should be placed.
+			 */
+			void CDC_Host_CreateStream(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo,
+			                           FILE* const Stream) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2);
+
+			/** Identical to \ref CDC_Host_CreateStream(), except that reads are blocking until the calling stream function terminates
+			 *  the transfer. While blocking, the USB and CDC service tasks are called repeatedly to maintain USB communications.
+			 *
+			 *  \note This function is not available on all microcontroller architectures.
+			 *
+			 *  \param[in,out] CDCInterfaceInfo  Pointer to a structure containing a CDC Class configuration and state.
+			 *  \param[in,out] Stream            Pointer to a FILE structure where the created stream should be placed.
+			 */
+			void CDC_Host_CreateBlockingStream(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo,
+			                                   FILE* const Stream) ATTR_NON_NULL_PTR_ARG(1)  ATTR_NON_NULL_PTR_ARG(2);
+			#endif
+
+			/** CDC class driver event for a control line state change on a CDC host interface. This event fires each time the device notifies
+			 *  the host of a control line state change (containing the virtual serial control line states, such as DCD) and may be hooked in the
+			 *  user program by declaring a handler function with the same name and parameters listed here. The new control line states
+			 *  are available in the \c ControlLineStates.DeviceToHost value inside the CDC host interface structure passed as a parameter, set as
+			 *  a mask of \c CDC_CONTROL_LINE_IN_* masks.
+			 *
+			 *  \param[in,out] CDCInterfaceInfo  Pointer to a structure containing a CDC Class host configuration and state.
+			 */
+			void EVENT_CDC_Host_ControLineStateChanged(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
+
+	/* Private Interface - For use in library only: */
+	#if !defined(__DOXYGEN__)
+		/* Function Prototypes: */
+			#if defined(__INCLUDE_FROM_CDC_HOST_C)
+				#if defined(FDEV_SETUP_STREAM)
+				static int CDC_Host_putchar(char c,
+				                            FILE* Stream) ATTR_NON_NULL_PTR_ARG(2);
+				static int CDC_Host_getchar(FILE* Stream) ATTR_NON_NULL_PTR_ARG(1);
+				static int CDC_Host_getchar_Blocking(FILE* Stream) ATTR_NON_NULL_PTR_ARG(1);
+				#endif
+
+				void CDC_Host_Event_Stub(void) ATTR_CONST;
+
+				void EVENT_CDC_Host_ControLineStateChanged(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo)
+				                                           ATTR_WEAK ATTR_NON_NULL_PTR_ARG(1) ATTR_ALIAS(CDC_Host_Event_Stub);
+
+				static uint8_t DCOMP_CDC_Host_NextCDCControlInterface(void* const CurrentDescriptor)
+				                                                      ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(1);
+				static uint8_t DCOMP_CDC_Host_NextCDCDataInterface(void* const CurrentDescriptor)
+				                                                   ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(1);
+				static uint8_t DCOMP_CDC_Host_NextCDCInterfaceEndpoint(void* const CurrentDescriptor)
+				                                                       ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(1);
+			#endif
+	#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Host/HIDClassHost.c b/lib/lufa/LUFA/Drivers/USB/Class/Host/HIDClassHost.c
new file mode 100644
index 0000000000..32591ffd74
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Class/Host/HIDClassHost.c
@@ -0,0 +1,399 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+#define  __INCLUDE_FROM_USB_DRIVER
+#include "../../Core/USBMode.h"
+
+#if defined(USB_CAN_BE_HOST)
+
+#define  __INCLUDE_FROM_HID_DRIVER
+#define  __INCLUDE_FROM_HID_HOST_C
+#include "HIDClassHost.h"
+
+uint8_t HID_Host_ConfigurePipes(USB_ClassInfo_HID_Host_t* const HIDInterfaceInfo,
+                                uint16_t ConfigDescriptorSize,
+                                void* ConfigDescriptorData)
+{
+	USB_Descriptor_Endpoint_t*  DataINEndpoint  = NULL;
+	USB_Descriptor_Endpoint_t*  DataOUTEndpoint = NULL;
+	USB_Descriptor_Interface_t* HIDInterface    = NULL;
+	USB_HID_Descriptor_HID_t*   HIDDescriptor   = NULL;
+
+	memset(&HIDInterfaceInfo->State, 0x00, sizeof(HIDInterfaceInfo->State));
+
+	if (DESCRIPTOR_TYPE(ConfigDescriptorData) != DTYPE_Configuration)
+	  return HID_ENUMERROR_InvalidConfigDescriptor;
+
+	while (!(DataINEndpoint) || !(DataOUTEndpoint))
+	{
+		if (!(HIDInterface) ||
+		    USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData,
+		                              DCOMP_HID_Host_NextHIDInterfaceEndpoint) != DESCRIPTOR_SEARCH_COMP_Found)
+		{
+			if (DataINEndpoint)
+			  break;
+
+			do
+			{
+				if (USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData,
+				                              DCOMP_HID_Host_NextHIDInterface) != DESCRIPTOR_SEARCH_COMP_Found)
+				{
+					return HID_ENUMERROR_NoCompatibleInterfaceFound;
+				}
+
+				HIDInterface = DESCRIPTOR_PCAST(ConfigDescriptorData, USB_Descriptor_Interface_t);
+			} while (HIDInterfaceInfo->Config.HIDInterfaceProtocol &&
+					 (HIDInterface->Protocol != HIDInterfaceInfo->Config.HIDInterfaceProtocol));
+
+			if (USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData,
+			                              DCOMP_HID_Host_NextHIDDescriptor) != DESCRIPTOR_SEARCH_COMP_Found)
+			{
+				return HID_ENUMERROR_NoCompatibleInterfaceFound;
+			}
+
+			HIDDescriptor = DESCRIPTOR_PCAST(ConfigDescriptorData, USB_HID_Descriptor_HID_t);
+
+			DataINEndpoint  = NULL;
+			DataOUTEndpoint = NULL;
+
+			continue;
+		}
+
+		USB_Descriptor_Endpoint_t* EndpointData = DESCRIPTOR_PCAST(ConfigDescriptorData, USB_Descriptor_Endpoint_t);
+
+		if ((EndpointData->EndpointAddress & ENDPOINT_DIR_MASK) == ENDPOINT_DIR_IN)
+		  DataINEndpoint  = EndpointData;
+		else
+		  DataOUTEndpoint = EndpointData;
+	}
+
+	HIDInterfaceInfo->Config.DataINPipe.Size  = le16_to_cpu(DataINEndpoint->EndpointSize);
+	HIDInterfaceInfo->Config.DataINPipe.EndpointAddress = DataINEndpoint->EndpointAddress;
+	HIDInterfaceInfo->Config.DataINPipe.Type  = EP_TYPE_INTERRUPT;
+
+	if (!(Pipe_ConfigurePipeTable(&HIDInterfaceInfo->Config.DataINPipe, 1)))
+	  return HID_ENUMERROR_PipeConfigurationFailed;
+
+	if (DataOUTEndpoint)
+	{
+		HIDInterfaceInfo->Config.DataOUTPipe.Size = le16_to_cpu(DataOUTEndpoint->EndpointSize);
+		HIDInterfaceInfo->Config.DataOUTPipe.EndpointAddress = DataOUTEndpoint->EndpointAddress;
+		HIDInterfaceInfo->Config.DataOUTPipe.Type = EP_TYPE_INTERRUPT;
+
+		if (!(Pipe_ConfigurePipeTable(&HIDInterfaceInfo->Config.DataOUTPipe, 1)))
+		  return HID_ENUMERROR_PipeConfigurationFailed;
+	}
+
+	HIDInterfaceInfo->State.InterfaceNumber      = HIDInterface->InterfaceNumber;
+	HIDInterfaceInfo->State.HIDReportSize        = LE16_TO_CPU(HIDDescriptor->HIDReportLength);
+	HIDInterfaceInfo->State.SupportsBootProtocol = (HIDInterface->SubClass != HID_CSCP_NonBootProtocol);
+	HIDInterfaceInfo->State.LargestReportSize    = 8;
+	HIDInterfaceInfo->State.IsActive             = true;
+
+	return HID_ENUMERROR_NoError;
+}
+
+static uint8_t DCOMP_HID_Host_NextHIDInterface(void* const CurrentDescriptor)
+{
+	USB_Descriptor_Header_t* Header = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Header_t);
+
+	if (Header->Type == DTYPE_Interface)
+	{
+		USB_Descriptor_Interface_t* Interface = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Interface_t);
+
+		if (Interface->Class == HID_CSCP_HIDClass)
+		  return DESCRIPTOR_SEARCH_Found;
+	}
+
+	return DESCRIPTOR_SEARCH_NotFound;
+}
+
+static uint8_t DCOMP_HID_Host_NextHIDDescriptor(void* const CurrentDescriptor)
+{
+	USB_Descriptor_Header_t* Header = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Header_t);
+
+	if (Header->Type == HID_DTYPE_HID)
+	  return DESCRIPTOR_SEARCH_Found;
+	else if (Header->Type == DTYPE_Interface)
+	  return DESCRIPTOR_SEARCH_Fail;
+	else
+	  return DESCRIPTOR_SEARCH_NotFound;
+}
+
+static uint8_t DCOMP_HID_Host_NextHIDInterfaceEndpoint(void* const CurrentDescriptor)
+{
+	USB_Descriptor_Header_t* Header = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Header_t);
+
+	if (Header->Type == DTYPE_Endpoint)
+	{
+		USB_Descriptor_Endpoint_t* Endpoint = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Endpoint_t);
+
+		if (!(Pipe_IsEndpointBound(Endpoint->EndpointAddress)))
+		  return DESCRIPTOR_SEARCH_Found;
+	}
+	else if (Header->Type == DTYPE_Interface)
+	{
+		return DESCRIPTOR_SEARCH_Fail;
+	}
+
+	return DESCRIPTOR_SEARCH_NotFound;
+}
+
+#if !defined(HID_HOST_BOOT_PROTOCOL_ONLY)
+uint8_t HID_Host_ReceiveReportByID(USB_ClassInfo_HID_Host_t* const HIDInterfaceInfo,
+                                   const uint8_t ReportID,
+                                   void* Buffer)
+{
+	USB_ControlRequest = (USB_Request_Header_t)
+	{
+		.bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE),
+		.bRequest      = HID_REQ_SetReport,
+		.wValue        = ((HID_REPORT_ITEM_In + 1) << 8) | ReportID,
+		.wIndex        = HIDInterfaceInfo->State.InterfaceNumber,
+		.wLength       = USB_GetHIDReportSize(HIDInterfaceInfo->Config.HIDParserData, ReportID, HID_REPORT_ITEM_In),
+	};
+
+	Pipe_SelectPipe(PIPE_CONTROLPIPE);
+
+	return USB_Host_SendControlRequest(Buffer);
+}
+#endif
+
+uint8_t HID_Host_ReceiveReport(USB_ClassInfo_HID_Host_t* const HIDInterfaceInfo,
+                               void* Buffer)
+{
+	if ((USB_HostState != HOST_STATE_Configured) || !(HIDInterfaceInfo->State.IsActive))
+	  return PIPE_READYWAIT_DeviceDisconnected;
+
+	uint8_t ErrorCode;
+
+	Pipe_SelectPipe(HIDInterfaceInfo->Config.DataINPipe.Address);
+	Pipe_Unfreeze();
+
+	uint16_t ReportSize;
+	uint8_t* BufferPos = Buffer;
+
+#if !defined(HID_HOST_BOOT_PROTOCOL_ONLY)
+	if (!(HIDInterfaceInfo->State.UsingBootProtocol))
+	{
+		uint8_t ReportID = 0;
+
+		if (HIDInterfaceInfo->Config.HIDParserData->UsingReportIDs)
+		{
+			ReportID = Pipe_Read_8();
+			*(BufferPos++) = ReportID;
+		}
+
+		ReportSize = USB_GetHIDReportSize(HIDInterfaceInfo->Config.HIDParserData, ReportID, HID_REPORT_ITEM_In);
+	}
+	else
+#endif
+	{
+		ReportSize = Pipe_BytesInPipe();
+	}
+
+	if ((ErrorCode = Pipe_Read_Stream_LE(BufferPos, ReportSize, NULL)) != PIPE_RWSTREAM_NoError)
+	  return ErrorCode;
+
+	Pipe_ClearIN();
+	Pipe_Freeze();
+
+	return PIPE_RWSTREAM_NoError;
+}
+
+uint8_t HID_Host_SendReportByID(USB_ClassInfo_HID_Host_t* const HIDInterfaceInfo,
+#if !defined(HID_HOST_BOOT_PROTOCOL_ONLY)
+                                const uint8_t ReportID,
+#endif
+                                const uint8_t ReportType,
+                                void* Buffer,
+                                const uint16_t ReportSize)
+{
+#if !defined(HID_HOST_BOOT_PROTOCOL_ONLY)
+	if ((USB_HostState != HOST_STATE_Configured) || !(HIDInterfaceInfo->State.IsActive))
+	  return PIPE_RWSTREAM_NoError;
+
+	if (HIDInterfaceInfo->State.DeviceUsesOUTPipe && (ReportType == HID_REPORT_ITEM_Out))
+	{
+		uint8_t ErrorCode;
+
+		Pipe_SelectPipe(HIDInterfaceInfo->Config.DataOUTPipe.Address);
+		Pipe_Unfreeze();
+
+		if (ReportID)
+		  Pipe_Write_Stream_LE(&ReportID, sizeof(ReportID), NULL);
+
+		if ((ErrorCode = Pipe_Write_Stream_LE(Buffer, ReportSize, NULL)) != PIPE_RWSTREAM_NoError)
+		  return ErrorCode;
+
+		Pipe_ClearOUT();
+		Pipe_Freeze();
+
+		return PIPE_RWSTREAM_NoError;
+	}
+	else
+#endif
+	{
+		USB_ControlRequest = (USB_Request_Header_t)
+		{
+			.bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE),
+			.bRequest      = HID_REQ_SetReport,
+#if !defined(HID_HOST_BOOT_PROTOCOL_ONLY)
+			.wValue        = ((ReportType + 1) << 8) | ReportID,
+#else
+			.wValue        = ((ReportType + 1) << 8),
+#endif
+			.wIndex        = HIDInterfaceInfo->State.InterfaceNumber,
+			.wLength       = ReportSize,
+		};
+
+		Pipe_SelectPipe(PIPE_CONTROLPIPE);
+
+		return USB_Host_SendControlRequest(Buffer);
+	}
+}
+
+bool HID_Host_IsReportReceived(USB_ClassInfo_HID_Host_t* const HIDInterfaceInfo)
+{
+	if ((USB_HostState != HOST_STATE_Configured) || !(HIDInterfaceInfo->State.IsActive))
+	  return false;
+
+	bool ReportReceived;
+
+	Pipe_SelectPipe(HIDInterfaceInfo->Config.DataINPipe.Address);
+	Pipe_Unfreeze();
+
+	ReportReceived = Pipe_IsINReceived();
+
+	Pipe_Freeze();
+
+	return ReportReceived;
+}
+
+uint8_t HID_Host_SetBootProtocol(USB_ClassInfo_HID_Host_t* const HIDInterfaceInfo)
+{
+	uint8_t ErrorCode;
+
+	if (!(HIDInterfaceInfo->State.SupportsBootProtocol))
+	  return HID_ERROR_LOGICAL;
+
+	USB_ControlRequest = (USB_Request_Header_t)
+		{
+			.bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE),
+			.bRequest      = HID_REQ_SetProtocol,
+			.wValue        = 0,
+			.wIndex        = HIDInterfaceInfo->State.InterfaceNumber,
+			.wLength       = 0,
+		};
+
+	Pipe_SelectPipe(PIPE_CONTROLPIPE);
+
+	if ((ErrorCode = USB_Host_SendControlRequest(NULL)) != HOST_SENDCONTROL_Successful)
+	  return ErrorCode;
+
+	HIDInterfaceInfo->State.LargestReportSize = 8;
+	HIDInterfaceInfo->State.UsingBootProtocol = true;
+
+	return HOST_SENDCONTROL_Successful;
+}
+
+uint8_t HID_Host_SetIdlePeriod(USB_ClassInfo_HID_Host_t* const HIDInterfaceInfo,
+                               const uint16_t MS)
+{
+	USB_ControlRequest = (USB_Request_Header_t)
+		{
+			.bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE),
+			.bRequest      = HID_REQ_SetIdle,
+			.wValue        = ((MS << 6) & 0xFF00),
+			.wIndex        = HIDInterfaceInfo->State.InterfaceNumber,
+			.wLength       = 0,
+		};
+
+	Pipe_SelectPipe(PIPE_CONTROLPIPE);
+
+	return USB_Host_SendControlRequest(NULL);
+}
+
+#if !defined(HID_HOST_BOOT_PROTOCOL_ONLY)
+uint8_t HID_Host_SetReportProtocol(USB_ClassInfo_HID_Host_t* const HIDInterfaceInfo)
+{
+	uint8_t ErrorCode;
+
+	uint8_t HIDReportData[HIDInterfaceInfo->State.HIDReportSize];
+
+	USB_ControlRequest = (USB_Request_Header_t)
+		{
+			.bmRequestType = (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_INTERFACE),
+			.bRequest      = REQ_GetDescriptor,
+			.wValue        = (HID_DTYPE_Report << 8),
+			.wIndex        = HIDInterfaceInfo->State.InterfaceNumber,
+			.wLength       = HIDInterfaceInfo->State.HIDReportSize,
+		};
+
+	Pipe_SelectPipe(PIPE_CONTROLPIPE);
+
+	if ((ErrorCode = USB_Host_SendControlRequest(HIDReportData)) != HOST_SENDCONTROL_Successful)
+	  return ErrorCode;
+
+	if (HIDInterfaceInfo->State.UsingBootProtocol)
+	{
+		USB_ControlRequest = (USB_Request_Header_t)
+			{
+				.bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE),
+				.bRequest      = HID_REQ_SetProtocol,
+				.wValue        = 1,
+				.wIndex        = HIDInterfaceInfo->State.InterfaceNumber,
+				.wLength       = 0,
+			};
+
+		if ((ErrorCode = USB_Host_SendControlRequest(NULL)) != HOST_SENDCONTROL_Successful)
+		  return ErrorCode;
+
+		HIDInterfaceInfo->State.UsingBootProtocol = false;
+	}
+
+	if (HIDInterfaceInfo->Config.HIDParserData == NULL)
+	  return HID_ERROR_LOGICAL;
+
+	if ((ErrorCode = USB_ProcessHIDReport(HIDReportData, HIDInterfaceInfo->State.HIDReportSize,
+	                                      HIDInterfaceInfo->Config.HIDParserData)) != HID_PARSE_Successful)
+	{
+		return HID_ERROR_LOGICAL | ErrorCode;
+	}
+
+	uint16_t LargestReportSizeBits = HIDInterfaceInfo->Config.HIDParserData->LargestReportSizeBits;
+	HIDInterfaceInfo->State.LargestReportSize = (LargestReportSizeBits >> 3) + ((LargestReportSizeBits & 0x07) != 0);
+
+	return 0;
+}
+#endif
+
+#endif
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Host/HIDClassHost.h b/lib/lufa/LUFA/Drivers/USB/Class/Host/HIDClassHost.h
new file mode 100644
index 0000000000..73b5abb1ba
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Class/Host/HIDClassHost.h
@@ -0,0 +1,313 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Host mode driver for the library USB HID Class driver.
+ *
+ *  Host mode driver for the library USB HID Class driver.
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the USB module driver
+ *        dispatch header located in LUFA/Drivers/USB.h.
+ */
+
+/** \ingroup Group_USBClassHID
+ *  \defgroup Group_USBClassHIDHost HID Class Host Mode Driver
+ *
+ *  \section Sec_USBClassHIDHost_Dependencies Module Source Dependencies
+ *  The following files must be built with any user project that uses this module:
+ *    - LUFA/Drivers/USB/Class/Host/HIDClassHost.c <i>(Makefile source module name: LUFA_SRC_USBCLASS)</i>
+ *
+ *  \section Sec_USBClassHIDHost_ModDescription Module Description
+ *  Host Mode USB Class driver framework interface, for the HID USB Class driver.
+ *
+ *  @{
+ */
+
+#ifndef __HID_CLASS_HOST_H__
+#define __HID_CLASS_HOST_H__
+
+	/* Includes: */
+		#include "../../USB.h"
+		#include "../Common/HIDClassCommon.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_HID_DRIVER)
+			#error Do not include this file directly. Include LUFA/Drivers/USB.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Error code for some HID Host functions, indicating a logical (and not hardware) error. */
+			#define HID_ERROR_LOGICAL              0x80
+
+		/* Type Defines: */
+			/** \brief HID Class Host Mode Configuration and State Structure.
+			 *
+			 *  Class state structure. An instance of this structure should be made within the user application,
+			 *  and passed to each of the HID class driver functions as the \c HIDInterfaceInfo parameter. This
+			 *  stores each HID interface's configuration and state information.
+			 */
+			typedef struct
+			{
+				struct
+				{
+					USB_Pipe_Table_t DataINPipe; /**< Data IN Pipe configuration table. */
+					USB_Pipe_Table_t DataOUTPipe; /**< Data OUT Pipe configuration table. */
+
+					uint8_t  HIDInterfaceProtocol; /**< HID interface protocol value to match against if a specific
+					                                *   boot subclass protocol is required, a protocol value from the
+					                                *   \ref HID_Descriptor_ClassSubclassProtocol_t enum.
+					                                */
+					#if !defined(HID_HOST_BOOT_PROTOCOL_ONLY)
+					HID_ReportInfo_t* HIDParserData; /**< HID parser data to store the parsed HID report data, when boot protocol
+					                                  *   is not used.
+					                                  *
+					                                  *  \note When the \c HID_HOST_BOOT_PROTOCOL_ONLY compile time token is defined,
+					                                  *        this field is unavailable.
+					                                  */
+					#endif
+				} Config; /**< Config data for the USB class interface within the device. All elements in this section
+				           *   <b>must</b> be set or the interface will fail to enumerate and operate correctly.
+				           */
+				struct
+				{
+					bool IsActive; /**< Indicates if the current interface instance is connected to an attached device, valid
+					                *   after \ref HID_Host_ConfigurePipes() is called and the Host state machine is in the
+					                *   Configured state.
+					                */
+					uint8_t InterfaceNumber; /**< Interface index of the HID interface within the attached device. */
+
+					bool SupportsBootProtocol; /**< Indicates if the current interface instance supports the HID Boot
+					                            *   Protocol when enabled via \ref HID_Host_SetBootProtocol().
+					                            */
+					bool DeviceUsesOUTPipe; /**< Indicates if the current interface instance uses a separate OUT data pipe for
+					                         *   OUT reports, or if OUT reports are sent via the control pipe instead.
+					                         */
+					bool UsingBootProtocol; /**< Indicates that the interface is currently initialized in Boot Protocol mode */
+					uint16_t HIDReportSize; /**< Size in bytes of the HID report descriptor in the device. */
+
+					uint8_t LargestReportSize; /**< Largest report the device will send, in bytes. */
+				} State; /**< State data for the USB class interface within the device. All elements in this section
+				          *   <b>may</b> be set to initial values, but may also be ignored to default to sane values when
+				          *   the interface is enumerated.
+				          */
+			} USB_ClassInfo_HID_Host_t;
+
+		/* Enums: */
+			/** Enum for the possible error codes returned by the \ref HID_Host_ConfigurePipes() function. */
+			enum HID_Host_EnumerationFailure_ErrorCodes_t
+			{
+				HID_ENUMERROR_NoError                    = 0, /**< Configuration Descriptor was processed successfully. */
+				HID_ENUMERROR_InvalidConfigDescriptor    = 1, /**< The device returned an invalid Configuration Descriptor. */
+				HID_ENUMERROR_NoCompatibleInterfaceFound = 2, /**< A compatible HID interface was not found in the device's Configuration Descriptor. */
+				HID_ENUMERROR_PipeConfigurationFailed    = 3, /**< One or more pipes for the specified interface could not be configured correctly. */
+			};
+
+		/* Function Prototypes: */
+			/** Host interface configuration routine, to configure a given HID host interface instance using the Configuration
+			 *  Descriptor read from an attached USB device. This function automatically updates the given HID Host instance's
+			 *  state values and configures the pipes required to communicate with the interface if it is found within the
+			 *  device. This should be called once after the stack has enumerated the attached device, while the host state
+			 *  machine is in the Addressed state.
+			 *
+			 *  \attention Once the device pipes are configured, the HID device's reporting protocol <b>must</b> be set via a call
+			 *             to either the \ref HID_Host_SetBootProtocol() or \ref HID_Host_SetReportProtocol() function.
+			 *
+			 *  \param[in,out] HIDInterfaceInfo      Pointer to a structure containing a HID Class host configuration and state.
+			 *  \param[in]     ConfigDescriptorSize  Length of the attached device's Configuration Descriptor.
+			 *  \param[in]     ConfigDescriptorData  Pointer to a buffer containing the attached device's Configuration Descriptor.
+			 *
+			 *  \return A value from the \ref HID_Host_EnumerationFailure_ErrorCodes_t enum.
+			 */
+			uint8_t HID_Host_ConfigurePipes(USB_ClassInfo_HID_Host_t* const HIDInterfaceInfo,
+			                                uint16_t ConfigDescriptorSize,
+			                                void* ConfigDescriptorData) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(3);
+
+
+			/** Receives a HID IN report from the attached HID device, when a report has been received on the HID IN Data pipe.
+			 *
+			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the
+			 *       call will fail.
+			 *
+			 *  \attention The destination buffer should be large enough to accommodate the largest report that the attached device
+			 *             can generate.
+			 *
+			 *  \param[in,out] HIDInterfaceInfo  Pointer to a structure containing a HID Class host configuration and state.
+			 *  \param[in]     Buffer            Buffer to store the received report into.
+			 *
+			 *  \return An error code from the \ref Pipe_Stream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t HID_Host_ReceiveReport(USB_ClassInfo_HID_Host_t* const HIDInterfaceInfo,
+			                               void* Buffer) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2);
+
+			#if !defined(HID_HOST_BOOT_PROTOCOL_ONLY)
+			/** Receives a HID IN report from the attached device, by the report ID.
+			 *
+			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the
+			 *       call will fail.
+			 *
+			 *  \note When the \c HID_HOST_BOOT_PROTOCOL_ONLY compile time token is defined, this method is unavailable.
+			 *
+			 *  \param[in,out] HIDInterfaceInfo  Pointer to a structure containing a HID Class host configuration and state.
+			 *  \param[in]     ReportID          Report ID of the received report if ControlRequest is false, set by the to the Report ID to fetch.
+			 *  \param[in]     Buffer            Buffer to store the received report into.
+			 *
+			 *  \return A value from the \ref USB_Host_SendControlErrorCodes_t enum.
+			 */
+			uint8_t HID_Host_ReceiveReportByID(USB_ClassInfo_HID_Host_t* const HIDInterfaceInfo,
+			                                   const uint8_t ReportID,
+			                                   void* Buffer) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(3);
+			#endif
+
+			/** Sends an OUT or FEATURE report to the currently attached HID device, using the device's OUT pipe if available,
+			 *  or the device's Control pipe if not.
+			 *
+			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the
+			 *       call will fail.
+			 *
+			 *  \note When the \c HID_HOST_BOOT_PROTOCOL_ONLY compile time token is defined, the ReportID parameter is removed
+			 *        from the parameter list of this function.
+			 *
+			 *  \param[in,out] HIDInterfaceInfo  Pointer to a structure containing a HID Class host configuration and state.
+			 *  \param[in]     ReportID          Report ID of the report to send to the device, or 0 if the device does not use report IDs.
+			 *  \param[in]     ReportType        Type of report to issue to the device, either \ref HID_REPORT_ITEM_Out or \ref HID_REPORT_ITEM_Feature.
+			 *  \param[in]     Buffer            Buffer containing the report to send to the attached device.
+			 *  \param[in]     ReportSize        Report size in bytes to send to the attached device.
+			 *
+			 *  \return An error code from the \ref USB_Host_SendControlErrorCodes_t enum if the DeviceUsesOUTPipe flag is set in
+			 *          the interface's state structure, a value from the \ref Pipe_Stream_RW_ErrorCodes_t enum otherwise.
+			 */
+			uint8_t HID_Host_SendReportByID(USB_ClassInfo_HID_Host_t* const HIDInterfaceInfo,
+			#if !defined(HID_HOST_BOOT_PROTOCOL_ONLY)
+			                                const uint8_t ReportID,
+			#endif
+			                                const uint8_t ReportType,
+			                                void* Buffer,
+			                                const uint16_t ReportSize) ATTR_NON_NULL_PTR_ARG(1)
+			#if !defined(HID_HOST_BOOT_PROTOCOL_ONLY)
+			                                ATTR_NON_NULL_PTR_ARG(4);
+			#else
+			                                ATTR_NON_NULL_PTR_ARG(3);
+			#endif
+
+			/** Determines if a HID IN report has been received from the attached device on the data IN pipe.
+			 *
+			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the
+			 *       call will fail.
+			 *
+			 *  \param[in,out] HIDInterfaceInfo  Pointer to a structure containing a HID Class host configuration and state.
+			 *
+			 *  \return Boolean \c true if a report has been received, \c false otherwise.
+			 */
+			bool HID_Host_IsReportReceived(USB_ClassInfo_HID_Host_t* const HIDInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Switches the attached HID device's reporting protocol over to the Boot Report protocol mode, on supported devices.
+			 *
+			 *  \note When the \c HID_HOST_BOOT_PROTOCOL_ONLY compile time token is defined, this method must still be called
+			 *        to explicitly place the attached device into boot protocol mode before use.
+			 *
+			 *  \param[in,out] HIDInterfaceInfo  Pointer to a structure containing a HID Class host configuration and state.
+			 *
+			 *  \return \ref HID_ERROR_LOGICAL if the device does not support Boot Protocol mode, a value from the
+			 *          \ref USB_Host_SendControlErrorCodes_t enum otherwise.
+			 */
+			uint8_t HID_Host_SetBootProtocol(USB_ClassInfo_HID_Host_t* const HIDInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Sets the idle period for the attached HID device to the specified interval. The HID idle period determines the rate
+			 *  at which the device should send a report, when no state changes have occurred; i.e. on HID keyboards, this sets the
+			 *  hardware key repeat interval.
+			 *
+			 *  \param[in,out] HIDInterfaceInfo  Pointer to a structure containing a HID Class host configuration and state.
+			 *  \param[in]     MS                Idle period as a multiple of four milliseconds, zero to disable hardware repeats
+			 *
+			 *  \return A value from the \ref USB_Host_SendControlErrorCodes_t enum.
+			 */
+			uint8_t HID_Host_SetIdlePeriod(USB_ClassInfo_HID_Host_t* const HIDInterfaceInfo,
+			                               const uint16_t MS) ATTR_NON_NULL_PTR_ARG(1);
+
+			#if !defined(HID_HOST_BOOT_PROTOCOL_ONLY)
+			/** Switches the attached HID device's reporting protocol over to the standard Report protocol mode. This also retrieves
+			 *  and parses the device's HID report descriptor, so that the size of each report can be determined in advance.
+			 *
+			 *  \attention Whether this function is used or not, the \ref CALLBACK_HIDParser_FilterHIDReportItem() callback from the HID
+			 *             Report Parser this function references <b>must</b> be implemented in the user code.
+			 *
+			 *  \note When the \c HID_HOST_BOOT_PROTOCOL_ONLY compile time token is defined, this method is unavailable.
+			 *
+			 *  \param[in,out] HIDInterfaceInfo  Pointer to a structure containing a HID Class host configuration and state.
+			 *
+			 *  \return A value from the \ref USB_Host_SendControlErrorCodes_t enum if an error occurs while retrieving the HID
+			 *          Report descriptor or the setting of the Report protocol, \ref HID_ERROR_LOGICAL if the HID interface does
+			 *          not have a valid \ref HID_ReportInfo_t structure set in its configuration, a mask of \ref HID_ERROR_LOGICAL
+			 *          and a value from the \ref HID_Parse_ErrorCodes_t otherwise.
+			 */
+			uint8_t HID_Host_SetReportProtocol(USB_ClassInfo_HID_Host_t* const HIDInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
+			#endif
+
+		/* Inline Functions: */
+			/** General management task for a given Human Interface Class host class interface, required for the correct operation of
+			 *  the interface. This should be called frequently in the main program loop, before the master USB management task
+			 *  \ref USB_USBTask().
+			 *
+			 *  \param[in,out] HIDInterfaceInfo  Pointer to a structure containing a HID Class host configuration and state.
+			 */
+			static inline void HID_Host_USBTask(USB_ClassInfo_HID_Host_t* const HIDInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
+			static inline void HID_Host_USBTask(USB_ClassInfo_HID_Host_t* const HIDInterfaceInfo)
+			{
+				(void)HIDInterfaceInfo;
+			}
+
+	/* Private Interface - For use in library only: */
+	#if !defined(__DOXYGEN__)
+		/* Function Prototypes: */
+			#if defined(__INCLUDE_FROM_HID_HOST_C)
+				static uint8_t DCOMP_HID_Host_NextHIDInterface(void* const CurrentDescriptor)
+				                                               ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(1);
+				static uint8_t DCOMP_HID_Host_NextHIDDescriptor(void* const CurrentDescriptor)
+				                                                ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(1);
+				static uint8_t DCOMP_HID_Host_NextHIDInterfaceEndpoint(void* const CurrentDescriptor)
+				                                                       ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(1);
+			#endif
+	#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Host/MIDIClassHost.c b/lib/lufa/LUFA/Drivers/USB/Class/Host/MIDIClassHost.c
new file mode 100644
index 0000000000..635148f5e2
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Class/Host/MIDIClassHost.c
@@ -0,0 +1,231 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+#define  __INCLUDE_FROM_USB_DRIVER
+#include "../../Core/USBMode.h"
+
+#if defined(USB_CAN_BE_HOST)
+
+#define  __INCLUDE_FROM_MIDI_DRIVER
+#define  __INCLUDE_FROM_MIDI_HOST_C
+#include "MIDIClassHost.h"
+
+uint8_t MIDI_Host_ConfigurePipes(USB_ClassInfo_MIDI_Host_t* const MIDIInterfaceInfo,
+                                 uint16_t ConfigDescriptorSize,
+                                 void* ConfigDescriptorData)
+{
+	USB_Descriptor_Endpoint_t*  DataINEndpoint  = NULL;
+	USB_Descriptor_Endpoint_t*  DataOUTEndpoint = NULL;
+	USB_Descriptor_Interface_t* MIDIInterface   = NULL;
+
+	memset(&MIDIInterfaceInfo->State, 0x00, sizeof(MIDIInterfaceInfo->State));
+
+	if (DESCRIPTOR_TYPE(ConfigDescriptorData) != DTYPE_Configuration)
+	  return MIDI_ENUMERROR_InvalidConfigDescriptor;
+
+	while (!(DataINEndpoint) || !(DataOUTEndpoint))
+	{
+		if (!(MIDIInterface) ||
+		    USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData,
+		                              DCOMP_MIDI_Host_NextMIDIStreamingDataEndpoint) != DESCRIPTOR_SEARCH_COMP_Found)
+		{
+			if (USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData,
+			                              DCOMP_MIDI_Host_NextMIDIStreamingInterface) != DESCRIPTOR_SEARCH_COMP_Found)
+			{
+				return MIDI_ENUMERROR_NoCompatibleInterfaceFound;
+			}
+
+			MIDIInterface = DESCRIPTOR_PCAST(ConfigDescriptorData, USB_Descriptor_Interface_t);
+
+			DataINEndpoint  = NULL;
+			DataOUTEndpoint = NULL;
+
+			continue;
+		}
+
+		USB_Descriptor_Endpoint_t* EndpointData = DESCRIPTOR_PCAST(ConfigDescriptorData, USB_Descriptor_Endpoint_t);
+
+		if ((EndpointData->EndpointAddress & ENDPOINT_DIR_MASK) == ENDPOINT_DIR_IN)
+		  DataINEndpoint  = EndpointData;
+		else
+		  DataOUTEndpoint = EndpointData;
+	}
+
+	MIDIInterfaceInfo->Config.DataINPipe.Size  = le16_to_cpu(DataINEndpoint->EndpointSize);
+	MIDIInterfaceInfo->Config.DataINPipe.EndpointAddress = DataINEndpoint->EndpointAddress;
+	MIDIInterfaceInfo->Config.DataINPipe.Type  = EP_TYPE_BULK;
+
+	MIDIInterfaceInfo->Config.DataOUTPipe.Size = le16_to_cpu(DataOUTEndpoint->EndpointSize);
+	MIDIInterfaceInfo->Config.DataOUTPipe.EndpointAddress = DataOUTEndpoint->EndpointAddress;
+	MIDIInterfaceInfo->Config.DataOUTPipe.Type = EP_TYPE_BULK;
+
+	if (!(Pipe_ConfigurePipeTable(&MIDIInterfaceInfo->Config.DataINPipe, 1)))
+	  return MIDI_ENUMERROR_PipeConfigurationFailed;
+
+	if (!(Pipe_ConfigurePipeTable(&MIDIInterfaceInfo->Config.DataOUTPipe, 1)))
+	  return MIDI_ENUMERROR_PipeConfigurationFailed;
+
+	MIDIInterfaceInfo->State.InterfaceNumber = MIDIInterface->InterfaceNumber;
+	MIDIInterfaceInfo->State.IsActive = true;
+
+	return MIDI_ENUMERROR_NoError;
+}
+
+static uint8_t DCOMP_MIDI_Host_NextMIDIStreamingInterface(void* const CurrentDescriptor)
+{
+	USB_Descriptor_Header_t* Header = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Header_t);
+
+	if (Header->Type == DTYPE_Interface)
+	{
+		USB_Descriptor_Interface_t* Interface = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Interface_t);
+
+		if ((Interface->Class    == AUDIO_CSCP_AudioClass)            &&
+		    (Interface->SubClass == AUDIO_CSCP_MIDIStreamingSubclass) &&
+		    (Interface->Protocol == AUDIO_CSCP_StreamingProtocol))
+		{
+			return DESCRIPTOR_SEARCH_Found;
+		}
+	}
+
+	return DESCRIPTOR_SEARCH_NotFound;
+}
+
+static uint8_t DCOMP_MIDI_Host_NextMIDIStreamingDataEndpoint(void* const CurrentDescriptor)
+{
+	USB_Descriptor_Header_t* Header = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Header_t);
+
+	if (Header->Type == DTYPE_Endpoint)
+	{
+		USB_Descriptor_Endpoint_t* Endpoint = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Endpoint_t);
+
+		uint8_t EndpointType = (Endpoint->Attributes & EP_TYPE_MASK);
+
+		if ((EndpointType == EP_TYPE_BULK) && !(Pipe_IsEndpointBound(Endpoint->EndpointAddress)))
+		  return DESCRIPTOR_SEARCH_Found;
+	}
+	else if (Header->Type == DTYPE_Interface)
+	{
+		return DESCRIPTOR_SEARCH_Fail;
+	}
+
+	return DESCRIPTOR_SEARCH_NotFound;
+}
+
+void MIDI_Host_USBTask(USB_ClassInfo_MIDI_Host_t* const MIDIInterfaceInfo)
+{
+	if ((USB_HostState != HOST_STATE_Configured) || !(MIDIInterfaceInfo->State.IsActive))
+	  return;
+
+	#if !defined(NO_CLASS_DRIVER_AUTOFLUSH)
+	MIDI_Host_Flush(MIDIInterfaceInfo);
+	#endif
+}
+
+uint8_t MIDI_Host_Flush(USB_ClassInfo_MIDI_Host_t* const MIDIInterfaceInfo)
+{
+	if ((USB_HostState != HOST_STATE_Configured) || !(MIDIInterfaceInfo->State.IsActive))
+	  return PIPE_RWSTREAM_DeviceDisconnected;
+
+	uint8_t ErrorCode;
+
+	Pipe_SelectPipe(MIDIInterfaceInfo->Config.DataOUTPipe.Address);
+	Pipe_Unfreeze();
+
+	if (Pipe_BytesInPipe())
+	{
+		Pipe_ClearOUT();
+
+		if ((ErrorCode = Pipe_WaitUntilReady()) != PIPE_READYWAIT_NoError)
+		{
+			Pipe_Freeze();
+			return ErrorCode;
+		}
+	}
+
+	Pipe_Freeze();
+
+	return PIPE_READYWAIT_NoError;
+}
+
+uint8_t MIDI_Host_SendEventPacket(USB_ClassInfo_MIDI_Host_t* const MIDIInterfaceInfo,
+                                  MIDI_EventPacket_t* const Event)
+{
+	if ((USB_HostState != HOST_STATE_Configured) || !(MIDIInterfaceInfo->State.IsActive))
+	  return HOST_SENDCONTROL_DeviceDisconnected;
+
+	uint8_t ErrorCode;
+
+	Pipe_SelectPipe(MIDIInterfaceInfo->Config.DataOUTPipe.Address);
+	Pipe_Unfreeze();
+
+	if ((ErrorCode = Pipe_Write_Stream_LE(Event, sizeof(MIDI_EventPacket_t), NULL)) != PIPE_RWSTREAM_NoError)
+	{
+		Pipe_Freeze();
+		return ErrorCode;
+	}
+
+	if (!(Pipe_IsReadWriteAllowed()))
+	  Pipe_ClearOUT();
+
+	Pipe_Freeze();
+
+	return PIPE_RWSTREAM_NoError;
+}
+
+bool MIDI_Host_ReceiveEventPacket(USB_ClassInfo_MIDI_Host_t* const MIDIInterfaceInfo,
+                                  MIDI_EventPacket_t* const Event)
+{
+	if ((USB_HostState != HOST_STATE_Configured) || !(MIDIInterfaceInfo->State.IsActive))
+	  return HOST_SENDCONTROL_DeviceDisconnected;
+
+	bool DataReady = false;
+
+	Pipe_SelectPipe(MIDIInterfaceInfo->Config.DataINPipe.Address);
+	Pipe_Unfreeze();
+
+	if (Pipe_IsINReceived())
+	{
+		if (Pipe_BytesInPipe())
+		{
+			Pipe_Read_Stream_LE(Event, sizeof(MIDI_EventPacket_t), NULL);
+			DataReady = true;
+		}
+
+		if (!(Pipe_BytesInPipe()))
+		  Pipe_ClearIN();
+	}
+
+	Pipe_Freeze();
+
+	return DataReady;
+}
+
+#endif
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Host/MIDIClassHost.h b/lib/lufa/LUFA/Drivers/USB/Class/Host/MIDIClassHost.h
new file mode 100644
index 0000000000..9cae21a1b6
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Class/Host/MIDIClassHost.h
@@ -0,0 +1,190 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Host mode driver for the library USB MIDI Class driver.
+ *
+ *  Host mode driver for the library USB MIDI Class driver.
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the USB module driver
+ *        dispatch header located in LUFA/Drivers/USB.h.
+ */
+
+/** \ingroup Group_USBClassMIDI
+ *  \defgroup Group_USBClassMIDIHost MIDI Class Host Mode Driver
+ *
+ *  \section Sec_USBClassMIDIHost_Dependencies Module Source Dependencies
+ *  The following files must be built with any user project that uses this module:
+ *    - LUFA/Drivers/USB/Class/Host/MIDIClassHost.c <i>(Makefile source module name: LUFA_SRC_USBCLASS)</i>
+ *
+ *  \section Sec_USBClassMIDIHost_ModDescription Module Description
+ *  Host Mode USB Class driver framework interface, for the MIDI USB Class driver.
+ *
+ *  @{
+ */
+
+#ifndef __MIDI_CLASS_HOST_H__
+#define __MIDI_CLASS_HOST_H__
+
+	/* Includes: */
+		#include "../../USB.h"
+		#include "../Common/MIDIClassCommon.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_MIDI_DRIVER)
+			#error Do not include this file directly. Include LUFA/Drivers/USB.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Type Defines: */
+			/** \brief MIDI Class Host Mode Configuration and State Structure.
+			 *
+			 *  Class state structure. An instance of this structure should be made within the user application,
+			 *  and passed to each of the MIDI class driver functions as the \c MIDIInterfaceInfo parameter. This
+			 *  stores each MIDI interface's configuration and state information.
+			 */
+			typedef struct
+			{
+				struct
+				{
+					USB_Pipe_Table_t DataINPipe; /**< Data IN Pipe configuration table. */
+					USB_Pipe_Table_t DataOUTPipe; /**< Data OUT Pipe configuration table. */
+				} Config; /**< Config data for the USB class interface within the device. All elements in this section
+				           *   <b>must</b> be set or the interface will fail to enumerate and operate correctly.
+				           */
+				struct
+				{
+					bool     IsActive; /**< Indicates if the current interface instance is connected to an attached device, valid
+					                    *   after \ref MIDI_Host_ConfigurePipes() is called and the Host state machine is in the
+					                    *   Configured state.
+					                    */
+					uint8_t  InterfaceNumber; /**< Interface index of the MIDI interface within the attached device. */
+				} State; /**< State data for the USB class interface within the device. All elements in this section
+						  *   <b>may</b> be set to initial values, but may also be ignored to default to sane values when
+						  *   the interface is enumerated.
+						  */
+			} USB_ClassInfo_MIDI_Host_t;
+
+		/* Enums: */
+			/** Enum for the possible error codes returned by the \ref MIDI_Host_ConfigurePipes() function. */
+			enum MIDI_Host_EnumerationFailure_ErrorCodes_t
+			{
+				MIDI_ENUMERROR_NoError                    = 0, /**< Configuration Descriptor was processed successfully. */
+				MIDI_ENUMERROR_InvalidConfigDescriptor    = 1, /**< The device returned an invalid Configuration Descriptor. */
+				MIDI_ENUMERROR_NoCompatibleInterfaceFound = 2, /**< A compatible MIDI interface was not found in the device's Configuration Descriptor. */
+				MIDI_ENUMERROR_PipeConfigurationFailed    = 3, /**< One or more pipes for the specified interface could not be configured correctly. */
+			};
+
+		/* Function Prototypes: */
+			/** Host interface configuration routine, to configure a given MIDI host interface instance using the Configuration
+			 *  Descriptor read from an attached USB device. This function automatically updates the given MIDI Host instance's
+			 *  state values and configures the pipes required to communicate with the interface if it is found within the device.
+			 *  This should be called once after the stack has enumerated the attached device, while the host state machine is in
+			 *  the Addressed state.
+			 *
+			 *  \param[in,out] MIDIInterfaceInfo     Pointer to a structure containing an MIDI Class host configuration and state.
+			 *  \param[in]     ConfigDescriptorSize  Length of the attached device's Configuration Descriptor.
+			 *  \param[in]     ConfigDescriptorData  Pointer to a buffer containing the attached device's Configuration Descriptor.
+			 *
+			 *  \return A value from the \ref MIDI_Host_EnumerationFailure_ErrorCodes_t enum.
+			 */
+			uint8_t MIDI_Host_ConfigurePipes(USB_ClassInfo_MIDI_Host_t* const MIDIInterfaceInfo,
+			                                 uint16_t ConfigDescriptorSize,
+			                                 void* ConfigDescriptorData) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(3);
+
+			/** General management task for a given MIDI host class interface, required for the correct operation of the interface. This should
+			 *  be called frequently in the main program loop, before the master USB management task \ref USB_USBTask().
+			 *
+			 *  \param[in,out] MIDIInterfaceInfo  Pointer to a structure containing an MIDI Class host configuration and state.
+			 */
+			void MIDI_Host_USBTask(USB_ClassInfo_MIDI_Host_t* const MIDIInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Sends a MIDI event packet to the device. If no device is connected, the event packet is discarded.
+			 *
+			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the
+			 *       call will fail.
+			 *
+			 *  \param[in,out] MIDIInterfaceInfo  Pointer to a structure containing a MIDI Class configuration and state.
+			 *  \param[in]     Event              Pointer to a populated USB_MIDI_EventPacket_t structure containing the MIDI event to send.
+			 *
+			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t MIDI_Host_SendEventPacket(USB_ClassInfo_MIDI_Host_t* const MIDIInterfaceInfo,
+			                                  MIDI_EventPacket_t* const Event) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2);
+
+			/** Flushes the MIDI send buffer, sending any queued MIDI events to the device. This should be called to override the
+			 *  \ref MIDI_Host_SendEventPacket() function's packing behavior, to flush queued events. Events are queued into the
+			 *  pipe bank until either the pipe bank is full, or \ref MIDI_Host_Flush() is called. This allows for multiple MIDI
+			 *  events to be packed into a single pipe packet, increasing data throughput.
+			 *
+			 *  \param[in,out] MIDIInterfaceInfo  Pointer to a structure containing a MIDI Class configuration and state.
+			 *
+			 *  \return A value from the \ref Pipe_WaitUntilReady_ErrorCodes_t enum.
+			 */
+			 uint8_t MIDI_Host_Flush(USB_ClassInfo_MIDI_Host_t* const MIDIInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Receives a MIDI event packet from the device.
+			 *
+			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the
+			 *       call will fail.
+			 *
+			 *  \param[in,out] MIDIInterfaceInfo  Pointer to a structure containing a MIDI Class configuration and state.
+			 *  \param[out]    Event              Pointer to a USB_MIDI_EventPacket_t structure where the received MIDI event is to be placed.
+			 *
+			 *  \return Boolean \c true if a MIDI event packet was received, \c false otherwise.
+			 */
+			bool MIDI_Host_ReceiveEventPacket(USB_ClassInfo_MIDI_Host_t* const MIDIInterfaceInfo,
+			                                  MIDI_EventPacket_t* const Event) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2);
+
+	/* Private Interface - For use in library only: */
+	#if !defined(__DOXYGEN__)
+		/* Function Prototypes: */
+			#if defined(__INCLUDE_FROM_MIDI_HOST_C)
+				static uint8_t DCOMP_MIDI_Host_NextMIDIStreamingInterface(void* const CurrentDescriptor)
+				                                                          ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(1);
+				static uint8_t DCOMP_MIDI_Host_NextMIDIStreamingDataEndpoint(void* const CurrentDescriptor)
+				                                                             ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(1);
+			#endif
+	#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Host/MassStorageClassHost.c b/lib/lufa/LUFA/Drivers/USB/Class/Host/MassStorageClassHost.c
new file mode 100644
index 0000000000..f7c5a6a738
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Class/Host/MassStorageClassHost.c
@@ -0,0 +1,579 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+#define  __INCLUDE_FROM_USB_DRIVER
+#include "../../Core/USBMode.h"
+
+#if defined(USB_CAN_BE_HOST)
+
+#define  __INCLUDE_FROM_MS_DRIVER
+#define  __INCLUDE_FROM_MASSSTORAGE_HOST_C
+#include "MassStorageClassHost.h"
+
+uint8_t MS_Host_ConfigurePipes(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo,
+                               uint16_t ConfigDescriptorSize,
+							   void* ConfigDescriptorData)
+{
+	USB_Descriptor_Endpoint_t*  DataINEndpoint       = NULL;
+	USB_Descriptor_Endpoint_t*  DataOUTEndpoint      = NULL;
+	USB_Descriptor_Interface_t* MassStorageInterface = NULL;
+
+	memset(&MSInterfaceInfo->State, 0x00, sizeof(MSInterfaceInfo->State));
+
+	if (DESCRIPTOR_TYPE(ConfigDescriptorData) != DTYPE_Configuration)
+	  return MS_ENUMERROR_InvalidConfigDescriptor;
+
+	while (!(DataINEndpoint) || !(DataOUTEndpoint))
+	{
+		if (!(MassStorageInterface) ||
+		    USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData,
+		                              DCOMP_MS_Host_NextMSInterfaceEndpoint) != DESCRIPTOR_SEARCH_COMP_Found)
+		{
+			if (USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData,
+			                              DCOMP_MS_Host_NextMSInterface) != DESCRIPTOR_SEARCH_COMP_Found)
+			{
+				return MS_ENUMERROR_NoCompatibleInterfaceFound;
+			}
+
+			MassStorageInterface = DESCRIPTOR_PCAST(ConfigDescriptorData, USB_Descriptor_Interface_t);
+
+			DataINEndpoint  = NULL;
+			DataOUTEndpoint = NULL;
+
+			continue;
+		}
+
+		USB_Descriptor_Endpoint_t* EndpointData = DESCRIPTOR_PCAST(ConfigDescriptorData, USB_Descriptor_Endpoint_t);
+
+		if ((EndpointData->EndpointAddress & ENDPOINT_DIR_MASK) == ENDPOINT_DIR_IN)
+		  DataINEndpoint  = EndpointData;
+		else
+		  DataOUTEndpoint = EndpointData;
+	}
+
+	MSInterfaceInfo->Config.DataINPipe.Size  = le16_to_cpu(DataINEndpoint->EndpointSize);
+	MSInterfaceInfo->Config.DataINPipe.EndpointAddress = DataINEndpoint->EndpointAddress;
+	MSInterfaceInfo->Config.DataINPipe.Type  = EP_TYPE_BULK;
+
+	MSInterfaceInfo->Config.DataOUTPipe.Size = le16_to_cpu(DataOUTEndpoint->EndpointSize);
+	MSInterfaceInfo->Config.DataOUTPipe.EndpointAddress = DataOUTEndpoint->EndpointAddress;
+	MSInterfaceInfo->Config.DataOUTPipe.Type = EP_TYPE_BULK;
+
+	if (!(Pipe_ConfigurePipeTable(&MSInterfaceInfo->Config.DataINPipe, 1)))
+	  return MS_ENUMERROR_PipeConfigurationFailed;
+
+	if (!(Pipe_ConfigurePipeTable(&MSInterfaceInfo->Config.DataOUTPipe, 1)))
+	  return MS_ENUMERROR_PipeConfigurationFailed;
+
+	MSInterfaceInfo->State.InterfaceNumber = MassStorageInterface->InterfaceNumber;
+	MSInterfaceInfo->State.IsActive = true;
+
+	return MS_ENUMERROR_NoError;
+}
+
+static uint8_t DCOMP_MS_Host_NextMSInterface(void* const CurrentDescriptor)
+{
+	USB_Descriptor_Header_t* Header = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Header_t);
+
+	if (Header->Type == DTYPE_Interface)
+	{
+		USB_Descriptor_Interface_t* Interface = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Interface_t);
+
+		if ((Interface->Class    == MS_CSCP_MassStorageClass)        &&
+		    (Interface->SubClass == MS_CSCP_SCSITransparentSubclass) &&
+		    (Interface->Protocol == MS_CSCP_BulkOnlyTransportProtocol))
+		{
+			return DESCRIPTOR_SEARCH_Found;
+		}
+	}
+
+	return DESCRIPTOR_SEARCH_NotFound;
+}
+
+static uint8_t DCOMP_MS_Host_NextMSInterfaceEndpoint(void* const CurrentDescriptor)
+{
+	USB_Descriptor_Header_t* Header = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Header_t);
+
+	if (Header->Type == DTYPE_Endpoint)
+	{
+		USB_Descriptor_Endpoint_t* Endpoint = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Endpoint_t);
+
+		uint8_t EndpointType = (Endpoint->Attributes & EP_TYPE_MASK);
+
+		if ((EndpointType == EP_TYPE_BULK) && (!(Pipe_IsEndpointBound(Endpoint->EndpointAddress))))
+		{
+			return DESCRIPTOR_SEARCH_Found;
+		}
+	}
+	else if (Header->Type == DTYPE_Interface)
+	{
+		return DESCRIPTOR_SEARCH_Fail;
+	}
+
+	return DESCRIPTOR_SEARCH_NotFound;
+}
+
+static uint8_t MS_Host_SendCommand(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo,
+                                   MS_CommandBlockWrapper_t* const SCSICommandBlock,
+                                   const void* const BufferPtr)
+{
+	uint8_t ErrorCode = PIPE_RWSTREAM_NoError;
+
+	if (++MSInterfaceInfo->State.TransactionTag == 0xFFFFFFFF)
+	  MSInterfaceInfo->State.TransactionTag = 1;
+
+	SCSICommandBlock->Signature = CPU_TO_LE32(MS_CBW_SIGNATURE);
+	SCSICommandBlock->Tag       = cpu_to_le32(MSInterfaceInfo->State.TransactionTag);
+
+	Pipe_SelectPipe(MSInterfaceInfo->Config.DataOUTPipe.Address);
+	Pipe_Unfreeze();
+
+	if ((ErrorCode = Pipe_Write_Stream_LE(SCSICommandBlock, sizeof(MS_CommandBlockWrapper_t),
+	                                      NULL)) != PIPE_RWSTREAM_NoError)
+	{
+		return ErrorCode;
+	}
+
+	Pipe_ClearOUT();
+	Pipe_WaitUntilReady();
+
+	Pipe_Freeze();
+
+	if (BufferPtr != NULL)
+	{
+		ErrorCode = MS_Host_SendReceiveData(MSInterfaceInfo, SCSICommandBlock, (void*)BufferPtr);
+
+		if ((ErrorCode != PIPE_RWSTREAM_NoError) && (ErrorCode != PIPE_RWSTREAM_PipeStalled))
+		{
+			Pipe_Freeze();
+			return ErrorCode;
+		}
+	}
+
+	MS_CommandStatusWrapper_t SCSIStatusBlock;
+	return MS_Host_GetReturnedStatus(MSInterfaceInfo, &SCSIStatusBlock);
+}
+
+static uint8_t MS_Host_WaitForDataReceived(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo)
+{
+	uint16_t TimeoutMSRem        = MS_COMMAND_DATA_TIMEOUT_MS;
+	uint16_t PreviousFrameNumber = USB_Host_GetFrameNumber();
+
+	Pipe_SelectPipe(MSInterfaceInfo->Config.DataINPipe.Address);
+	Pipe_Unfreeze();
+
+	while (!(Pipe_IsINReceived()))
+	{
+		uint16_t CurrentFrameNumber = USB_Host_GetFrameNumber();
+
+		if (CurrentFrameNumber != PreviousFrameNumber)
+		{
+			PreviousFrameNumber = CurrentFrameNumber;
+
+			if (!(TimeoutMSRem--))
+			  return PIPE_RWSTREAM_Timeout;
+		}
+
+		Pipe_Freeze();
+		Pipe_SelectPipe(MSInterfaceInfo->Config.DataOUTPipe.Address);
+		Pipe_Unfreeze();
+
+		if (Pipe_IsStalled())
+		{
+			USB_Host_ClearEndpointStall(Pipe_GetBoundEndpointAddress());
+			return PIPE_RWSTREAM_PipeStalled;
+		}
+
+		Pipe_Freeze();
+		Pipe_SelectPipe(MSInterfaceInfo->Config.DataINPipe.Address);
+		Pipe_Unfreeze();
+
+		if (Pipe_IsStalled())
+		{
+			USB_Host_ClearEndpointStall(Pipe_GetBoundEndpointAddress());
+			return PIPE_RWSTREAM_PipeStalled;
+		}
+
+		if (USB_HostState == HOST_STATE_Unattached)
+		  return PIPE_RWSTREAM_DeviceDisconnected;
+	};
+
+	Pipe_SelectPipe(MSInterfaceInfo->Config.DataINPipe.Address);
+	Pipe_Freeze();
+
+	Pipe_SelectPipe(MSInterfaceInfo->Config.DataOUTPipe.Address);
+	Pipe_Freeze();
+
+	return PIPE_RWSTREAM_NoError;
+}
+
+static uint8_t MS_Host_SendReceiveData(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo,
+                                       MS_CommandBlockWrapper_t* const SCSICommandBlock,
+                                       void* BufferPtr)
+{
+	uint8_t  ErrorCode = PIPE_RWSTREAM_NoError;
+	uint16_t BytesRem  = le32_to_cpu(SCSICommandBlock->DataTransferLength);
+
+	if (SCSICommandBlock->Flags & MS_COMMAND_DIR_DATA_IN)
+	{
+		if ((ErrorCode = MS_Host_WaitForDataReceived(MSInterfaceInfo)) != PIPE_RWSTREAM_NoError)
+		{
+			Pipe_Freeze();
+			return ErrorCode;
+		}
+
+		Pipe_SelectPipe(MSInterfaceInfo->Config.DataINPipe.Address);
+		Pipe_Unfreeze();
+
+		if ((ErrorCode = Pipe_Read_Stream_LE(BufferPtr, BytesRem, NULL)) != PIPE_RWSTREAM_NoError)
+		  return ErrorCode;
+
+		Pipe_ClearIN();
+	}
+	else
+	{
+		Pipe_SelectPipe(MSInterfaceInfo->Config.DataOUTPipe.Address);
+		Pipe_Unfreeze();
+
+		if ((ErrorCode = Pipe_Write_Stream_LE(BufferPtr, BytesRem, NULL)) != PIPE_RWSTREAM_NoError)
+		  return ErrorCode;
+
+		Pipe_ClearOUT();
+
+		while (!(Pipe_IsOUTReady()))
+		{
+			if (USB_HostState == HOST_STATE_Unattached)
+			  return PIPE_RWSTREAM_DeviceDisconnected;
+		}
+	}
+
+	Pipe_Freeze();
+
+	return ErrorCode;
+}
+
+static uint8_t MS_Host_GetReturnedStatus(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo,
+                                         MS_CommandStatusWrapper_t* const SCSICommandStatus)
+{
+	uint8_t ErrorCode = PIPE_RWSTREAM_NoError;
+
+	if ((ErrorCode = MS_Host_WaitForDataReceived(MSInterfaceInfo)) != PIPE_RWSTREAM_NoError)
+	  return ErrorCode;
+
+	Pipe_SelectPipe(MSInterfaceInfo->Config.DataINPipe.Address);
+	Pipe_Unfreeze();
+
+	if ((ErrorCode = Pipe_Read_Stream_LE(SCSICommandStatus, sizeof(MS_CommandStatusWrapper_t),
+	                                     NULL)) != PIPE_RWSTREAM_NoError)
+	{
+		return ErrorCode;
+	}
+
+	Pipe_ClearIN();
+	Pipe_Freeze();
+
+	if (SCSICommandStatus->Status != MS_SCSI_COMMAND_Pass)
+	  ErrorCode = MS_ERROR_LOGICAL_CMD_FAILED;
+
+	return ErrorCode;
+}
+
+uint8_t MS_Host_ResetMSInterface(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo)
+{
+	uint8_t ErrorCode;
+
+	USB_ControlRequest = (USB_Request_Header_t)
+		{
+			.bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE),
+			.bRequest      = MS_REQ_MassStorageReset,
+			.wValue        = 0,
+			.wIndex        = MSInterfaceInfo->State.InterfaceNumber,
+			.wLength       = 0,
+		};
+
+	Pipe_SelectPipe(PIPE_CONTROLPIPE);
+
+	if ((ErrorCode = USB_Host_SendControlRequest(NULL)) != HOST_SENDCONTROL_Successful)
+	  return ErrorCode;
+
+	Pipe_SelectPipe(MSInterfaceInfo->Config.DataINPipe.Address);
+
+	if ((ErrorCode = USB_Host_ClearEndpointStall(Pipe_GetBoundEndpointAddress())) != HOST_SENDCONTROL_Successful)
+	  return ErrorCode;
+
+	Pipe_SelectPipe(MSInterfaceInfo->Config.DataOUTPipe.Address);
+
+	if ((ErrorCode = USB_Host_ClearEndpointStall(Pipe_GetBoundEndpointAddress())) != HOST_SENDCONTROL_Successful)
+	  return ErrorCode;
+
+	return HOST_SENDCONTROL_Successful;
+}
+
+uint8_t MS_Host_GetMaxLUN(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo,
+                          uint8_t* const MaxLUNIndex)
+{
+	uint8_t ErrorCode;
+
+	USB_ControlRequest = (USB_Request_Header_t)
+		{
+			.bmRequestType = (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE),
+			.bRequest      = MS_REQ_GetMaxLUN,
+			.wValue        = 0,
+			.wIndex        = MSInterfaceInfo->State.InterfaceNumber,
+			.wLength       = 1,
+		};
+
+	Pipe_SelectPipe(PIPE_CONTROLPIPE);
+
+	if ((ErrorCode = USB_Host_SendControlRequest(MaxLUNIndex)) == HOST_SENDCONTROL_SetupStalled)
+	{
+		*MaxLUNIndex = 0;
+		ErrorCode    = HOST_SENDCONTROL_Successful;
+	}
+
+	return ErrorCode;
+}
+
+uint8_t MS_Host_GetInquiryData(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo,
+                               const uint8_t LUNIndex,
+                               SCSI_Inquiry_Response_t* const InquiryData)
+{
+	if ((USB_HostState != HOST_STATE_Configured) || !(MSInterfaceInfo->State.IsActive))
+	  return HOST_SENDCONTROL_DeviceDisconnected;
+
+	MS_CommandBlockWrapper_t SCSICommandBlock = (MS_CommandBlockWrapper_t)
+		{
+			.DataTransferLength = CPU_TO_LE32(sizeof(SCSI_Inquiry_Response_t)),
+			.Flags              = MS_COMMAND_DIR_DATA_IN,
+			.LUN                = LUNIndex,
+			.SCSICommandLength  = 6,
+			.SCSICommandData    =
+				{
+					SCSI_CMD_INQUIRY,
+					0x00,                            // Reserved
+					0x00,                            // Reserved
+					0x00,                            // Reserved
+					sizeof(SCSI_Inquiry_Response_t), // Allocation Length
+					0x00                             // Unused (control)
+				}
+		};
+
+	return MS_Host_SendCommand(MSInterfaceInfo, &SCSICommandBlock, InquiryData);
+}
+
+uint8_t MS_Host_TestUnitReady(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo,
+                              const uint8_t LUNIndex)
+{
+	if ((USB_HostState != HOST_STATE_Configured) || !(MSInterfaceInfo->State.IsActive))
+	  return HOST_SENDCONTROL_DeviceDisconnected;
+
+	MS_CommandBlockWrapper_t SCSICommandBlock = (MS_CommandBlockWrapper_t)
+		{
+			.DataTransferLength = CPU_TO_LE32(0),
+			.Flags              = MS_COMMAND_DIR_DATA_IN,
+			.LUN                = LUNIndex,
+			.SCSICommandLength  = 6,
+			.SCSICommandData    =
+				{
+					SCSI_CMD_TEST_UNIT_READY,
+					0x00,                   // Reserved
+					0x00,                   // Reserved
+					0x00,                   // Reserved
+					0x00,                   // Reserved
+					0x00                    // Unused (control)
+				}
+		};
+
+	return MS_Host_SendCommand(MSInterfaceInfo, &SCSICommandBlock, NULL);
+}
+
+uint8_t MS_Host_ReadDeviceCapacity(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo,
+                                   const uint8_t LUNIndex,
+                                   SCSI_Capacity_t* const DeviceCapacity)
+{
+	if ((USB_HostState != HOST_STATE_Configured) || !(MSInterfaceInfo->State.IsActive))
+	  return HOST_SENDCONTROL_DeviceDisconnected;
+
+	uint8_t ErrorCode;
+
+	MS_CommandBlockWrapper_t SCSICommandBlock = (MS_CommandBlockWrapper_t)
+		{
+			.DataTransferLength = CPU_TO_LE32(sizeof(SCSI_Capacity_t)),
+			.Flags              = MS_COMMAND_DIR_DATA_IN,
+			.LUN                = LUNIndex,
+			.SCSICommandLength  = 10,
+			.SCSICommandData    =
+				{
+					SCSI_CMD_READ_CAPACITY_10,
+					0x00,                   // Reserved
+					0x00,                   // MSB of Logical block address
+					0x00,
+					0x00,
+					0x00,                   // LSB of Logical block address
+					0x00,                   // Reserved
+					0x00,                   // Reserved
+					0x00,                   // Partial Medium Indicator
+					0x00                    // Unused (control)
+				}
+		};
+
+	if ((ErrorCode = MS_Host_SendCommand(MSInterfaceInfo, &SCSICommandBlock, DeviceCapacity)) != PIPE_RWSTREAM_NoError)
+	  return ErrorCode;
+
+	DeviceCapacity->Blocks    = BE32_TO_CPU(DeviceCapacity->Blocks);
+	DeviceCapacity->BlockSize = BE32_TO_CPU(DeviceCapacity->BlockSize);
+
+	return PIPE_RWSTREAM_NoError;
+}
+
+uint8_t MS_Host_RequestSense(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo,
+                             const uint8_t LUNIndex,
+                             SCSI_Request_Sense_Response_t* const SenseData)
+{
+	if ((USB_HostState != HOST_STATE_Configured) || !(MSInterfaceInfo->State.IsActive))
+	  return HOST_SENDCONTROL_DeviceDisconnected;
+
+	MS_CommandBlockWrapper_t SCSICommandBlock = (MS_CommandBlockWrapper_t)
+		{
+			.DataTransferLength = CPU_TO_LE32(sizeof(SCSI_Request_Sense_Response_t)),
+			.Flags              = MS_COMMAND_DIR_DATA_IN,
+			.LUN                = LUNIndex,
+			.SCSICommandLength  = 6,
+			.SCSICommandData    =
+				{
+					SCSI_CMD_REQUEST_SENSE,
+					0x00,                                  // Reserved
+					0x00,                                  // Reserved
+					0x00,                                  // Reserved
+					sizeof(SCSI_Request_Sense_Response_t), // Allocation Length
+					0x00                                   // Unused (control)
+				}
+		};
+
+	return MS_Host_SendCommand(MSInterfaceInfo, &SCSICommandBlock, SenseData);
+}
+
+uint8_t MS_Host_PreventAllowMediumRemoval(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo,
+                                          const uint8_t LUNIndex,
+                                          const bool PreventRemoval)
+{
+	if ((USB_HostState != HOST_STATE_Configured) || !(MSInterfaceInfo->State.IsActive))
+	  return HOST_SENDCONTROL_DeviceDisconnected;
+
+	MS_CommandBlockWrapper_t SCSICommandBlock = (MS_CommandBlockWrapper_t)
+		{
+			.DataTransferLength = CPU_TO_LE32(0),
+			.Flags              = MS_COMMAND_DIR_DATA_OUT,
+			.LUN                = LUNIndex,
+			.SCSICommandLength  = 6,
+			.SCSICommandData    =
+				{
+					SCSI_CMD_PREVENT_ALLOW_MEDIUM_REMOVAL,
+					0x00,                   // Reserved
+					0x00,                   // Reserved
+					PreventRemoval,         // Prevent flag
+					0x00,                   // Reserved
+					0x00                    // Unused (control)
+				}
+		};
+
+	return MS_Host_SendCommand(MSInterfaceInfo, &SCSICommandBlock, NULL);
+}
+
+uint8_t MS_Host_ReadDeviceBlocks(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo,
+                                 const uint8_t LUNIndex,
+                                 const uint32_t BlockAddress,
+                                 const uint8_t Blocks,
+                                 const uint16_t BlockSize,
+                                 void* BlockBuffer)
+{
+	if ((USB_HostState != HOST_STATE_Configured) || !(MSInterfaceInfo->State.IsActive))
+	  return HOST_SENDCONTROL_DeviceDisconnected;
+
+	MS_CommandBlockWrapper_t SCSICommandBlock = (MS_CommandBlockWrapper_t)
+		{
+			.DataTransferLength = cpu_to_le32((uint32_t)Blocks * BlockSize),
+			.Flags              = MS_COMMAND_DIR_DATA_IN,
+			.LUN                = LUNIndex,
+			.SCSICommandLength  = 10,
+			.SCSICommandData    =
+				{
+					SCSI_CMD_READ_10,
+					0x00,                   // Unused (control bits, all off)
+					(BlockAddress >> 24),   // MSB of Block Address
+					(BlockAddress >> 16),
+					(BlockAddress >> 8),
+					(BlockAddress & 0xFF),  // LSB of Block Address
+					0x00,                   // Reserved
+					0x00,                   // MSB of Total Blocks to Read
+					Blocks,                 // LSB of Total Blocks to Read
+					0x00                    // Unused (control)
+				}
+		};
+
+	return MS_Host_SendCommand(MSInterfaceInfo, &SCSICommandBlock, BlockBuffer);
+}
+
+uint8_t MS_Host_WriteDeviceBlocks(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo,
+                                  const uint8_t LUNIndex,
+                                  const uint32_t BlockAddress,
+                                  const uint8_t Blocks,
+                                  const uint16_t BlockSize,
+                                  const void* BlockBuffer)
+{
+	if ((USB_HostState != HOST_STATE_Configured) || !(MSInterfaceInfo->State.IsActive))
+	  return HOST_SENDCONTROL_DeviceDisconnected;
+
+	MS_CommandBlockWrapper_t SCSICommandBlock = (MS_CommandBlockWrapper_t)
+		{
+			.DataTransferLength = cpu_to_le32((uint32_t)Blocks * BlockSize),
+			.Flags              = MS_COMMAND_DIR_DATA_OUT,
+			.LUN                = LUNIndex,
+			.SCSICommandLength  = 10,
+			.SCSICommandData    =
+				{
+					SCSI_CMD_WRITE_10,
+					0x00,                   // Unused (control bits, all off)
+					(BlockAddress >> 24),   // MSB of Block Address
+					(BlockAddress >> 16),
+					(BlockAddress >> 8),
+					(BlockAddress & 0xFF),  // LSB of Block Address
+					0x00,                   // Reserved
+					0x00,                   // MSB of Total Blocks to Write
+					Blocks,                 // LSB of Total Blocks to Write
+					0x00                    // Unused (control)
+				}
+		};
+
+	return MS_Host_SendCommand(MSInterfaceInfo, &SCSICommandBlock, BlockBuffer);
+}
+
+#endif
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Host/MassStorageClassHost.h b/lib/lufa/LUFA/Drivers/USB/Class/Host/MassStorageClassHost.h
new file mode 100644
index 0000000000..348050f8f5
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Class/Host/MassStorageClassHost.h
@@ -0,0 +1,335 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Host mode driver for the library USB Mass Storage Class driver.
+ *
+ *  Host mode driver for the library USB Mass Storage Class driver.
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the USB module driver
+ *        dispatch header located in LUFA/Drivers/USB.h.
+ */
+
+/** \ingroup Group_USBClassMS
+ *  \defgroup Group_USBClassMassStorageHost Mass Storage Class Host Mode Driver
+ *
+ *  \section Sec_USBClassMassStorageHost_Dependencies Module Source Dependencies
+ *  The following files must be built with any user project that uses this module:
+ *    - LUFA/Drivers/USB/Class/Host/MassStorageClassHost.c <i>(Makefile source module name: LUFA_SRC_USBCLASS)</i>
+ *
+ *  \section Sec_USBClassMassStorageHost_ModDescription Module Description
+ *  Host Mode USB Class driver framework interface, for the Mass Storage USB Class driver.
+ *
+ *  @{
+ */
+
+#ifndef __MS_CLASS_HOST_H__
+#define __MS_CLASS_HOST_H__
+
+	/* Includes: */
+		#include "../../USB.h"
+		#include "../Common/MassStorageClassCommon.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_MS_DRIVER)
+			#error Do not include this file directly. Include LUFA/Drivers/USB.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Error code for some Mass Storage Host functions, indicating a logical (and not hardware) error. */
+			#define MS_ERROR_LOGICAL_CMD_FAILED              0x80
+
+		/* Type Defines: */
+			/** \brief Mass Storage Class Host Mode Configuration and State Structure.
+			 *
+			 *  Class state structure. An instance of this structure should be made within the user application,
+			 *  and passed to each of the Mass Storage class driver functions as the \c MSInterfaceInfo parameter. This
+			 *  stores each Mass Storage interface's configuration and state information.
+			 */
+			typedef struct
+			{
+				struct
+				{
+					USB_Pipe_Table_t DataINPipe; /**< Data IN Pipe configuration table. */
+					USB_Pipe_Table_t DataOUTPipe; /**< Data OUT Pipe configuration table. */
+				} Config; /**< Config data for the USB class interface within the device. All elements in this section
+				           *   <b>must</b> be set or the interface will fail to enumerate and operate correctly.
+				           */
+				struct
+				{
+					bool     IsActive; /**< Indicates if the current interface instance is connected to an attached device, valid
+					                    *   after \ref MS_Host_ConfigurePipes() is called and the Host state machine is in the
+					                    *   Configured state.
+					                    */
+					uint8_t  InterfaceNumber; /**< Interface index of the Mass Storage interface within the attached device. */
+
+					uint32_t TransactionTag; /**< Current transaction tag for data synchronizing of packets. */
+				} State; /**< State data for the USB class interface within the device. All elements in this section
+						  *   <b>may</b> be set to initial values, but may also be ignored to default to sane values when
+						  *   the interface is enumerated.
+						  */
+			} USB_ClassInfo_MS_Host_t;
+
+			/** \brief SCSI Device LUN Capacity Structure.
+			 *
+			 *  SCSI capacity structure, to hold the total capacity of the device in both the number
+			 *  of blocks in the current LUN, and the size of each block. This structure is filled by
+			 *  the device when the \ref MS_Host_ReadDeviceCapacity() function is called.
+			 */
+			typedef struct
+			{
+				uint32_t Blocks; /**< Number of blocks in the addressed LUN of the device. */
+				uint32_t BlockSize; /**< Number of bytes in each block in the addressed LUN. */
+			} SCSI_Capacity_t;
+
+		/* Enums: */
+			/** Enum for the possible error codes returned by the \ref MS_Host_ConfigurePipes() function. */
+			enum MS_Host_EnumerationFailure_ErrorCodes_t
+			{
+				MS_ENUMERROR_NoError                    = 0, /**< Configuration Descriptor was processed successfully. */
+				MS_ENUMERROR_InvalidConfigDescriptor    = 1, /**< The device returned an invalid Configuration Descriptor. */
+				MS_ENUMERROR_NoCompatibleInterfaceFound = 2, /**< A compatible Mass Storage interface was not found in the device's Configuration Descriptor. */
+				MS_ENUMERROR_PipeConfigurationFailed    = 3, /**< One or more pipes for the specified interface could not be configured correctly. */
+			};
+
+		/* Function Prototypes: */
+			/** Host interface configuration routine, to configure a given Mass Storage host interface instance using the
+			 *  Configuration Descriptor read from an attached USB device. This function automatically updates the given Mass
+			 *  Storage Host instance's state values and configures the pipes required to communicate with the interface if it
+			 *  is found within the device. This should be called once after the stack has enumerated the attached device, while
+			 *  the host state machine is in the Addressed state.
+			 *
+			 *  \param[in,out] MSInterfaceInfo         Pointer to a structure containing an MS Class host configuration and state.
+			 *  \param[in]     ConfigDescriptorSize    Length of the attached device's Configuration Descriptor.
+			 *  \param[in]     DeviceConfigDescriptor  Pointer to a buffer containing the attached device's Configuration Descriptor.
+			 *
+			 *  \return A value from the \ref MS_Host_EnumerationFailure_ErrorCodes_t enum.
+			 */
+			uint8_t MS_Host_ConfigurePipes(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo,
+			                               uint16_t ConfigDescriptorSize,
+			                               void* DeviceConfigDescriptor) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(3);
+
+			/** Sends a MASS STORAGE RESET control request to the attached device, resetting the Mass Storage Interface
+			 *  and readying it for the next Mass Storage command. This should be called after a failed SCSI request to
+			 *  ensure the attached Mass Storage device is ready to receive the next command.
+			 *
+			 *  \param[in,out] MSInterfaceInfo  Pointer to a structure containing a MS Class host configuration and state.
+			 *
+			 *  \return A value from the \ref USB_Host_SendControlErrorCodes_t enum.
+			 */
+			uint8_t MS_Host_ResetMSInterface(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Sends a GET MAX LUN control request to the attached device, retrieving the index of the highest LUN (Logical
+			 *  UNit, a logical drive) in the device. This value can then be used in the other functions of the Mass Storage
+			 *  Host mode Class driver to address a specific LUN within the device.
+			 *
+			 *  \note Some devices do not support this request, and will STALL it when issued. To get around this,
+			 *        on unsupported devices the max LUN index will be reported as zero and no error will be returned
+			 *        if the device STALLs the request.
+			 *
+			 *  \param[in,out] MSInterfaceInfo  Pointer to a structure containing a MS Class host configuration and state.
+			 *  \param[out]    MaxLUNIndex      Pointer to a location where the highest LUN index value should be stored.
+			 *
+			 *  \return A value from the \ref USB_Host_SendControlErrorCodes_t enum.
+			 */
+			uint8_t MS_Host_GetMaxLUN(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo,
+			                          uint8_t* const MaxLUNIndex) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2);
+
+			/** Retrieves the Mass Storage device's inquiry data for the specified LUN, indicating the device characteristics and
+			 *  properties.
+			 *
+			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the
+			 *       call will fail.
+			 *
+			 *  \param[in,out] MSInterfaceInfo  Pointer to a structure containing a MS Class host configuration and state.
+			 *  \param[in]     LUNIndex         LUN index within the device the command is being issued to.
+			 *  \param[out]    InquiryData      Location where the read inquiry data should be stored.
+			 *
+			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum or \ref MS_ERROR_LOGICAL_CMD_FAILED.
+			 */
+			uint8_t MS_Host_GetInquiryData(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo,
+			                               const uint8_t LUNIndex,
+			                               SCSI_Inquiry_Response_t* const InquiryData) ATTR_NON_NULL_PTR_ARG(1)
+			                               ATTR_NON_NULL_PTR_ARG(3);
+
+			/** Sends a TEST UNIT READY command to the device, to determine if it is ready to accept other SCSI commands.
+			 *
+			 *  \param[in,out] MSInterfaceInfo  Pointer to a structure containing a MS Class host configuration and state.
+			 *  \param[in]     LUNIndex         LUN index within the device the command is being issued to.
+			 *
+			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum or \ref MS_ERROR_LOGICAL_CMD_FAILED if not ready.
+			 */
+			uint8_t MS_Host_TestUnitReady(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo,
+			                              const uint8_t LUNIndex) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Retrieves the total capacity of the attached USB Mass Storage device, in blocks, and block size.
+			 *
+			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the
+			 *       call will fail.
+			 *
+			 *  \param[in,out] MSInterfaceInfo  Pointer to a structure containing a MS Class host configuration and state.
+			 *  \param[in]     LUNIndex         LUN index within the device the command is being issued to.
+			 *  \param[out]    DeviceCapacity   Pointer to the location where the capacity information should be stored.
+			 *
+			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum or \ref MS_ERROR_LOGICAL_CMD_FAILED if not ready.
+			 */
+			uint8_t MS_Host_ReadDeviceCapacity(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo,
+			                                   const uint8_t LUNIndex,
+			                                   SCSI_Capacity_t* const DeviceCapacity) ATTR_NON_NULL_PTR_ARG(1)
+			                                   ATTR_NON_NULL_PTR_ARG(3);
+
+			/** Retrieves the device sense data, indicating the current device state and error codes for the previously
+			 *  issued command.
+			 *
+			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the
+			 *       call will fail.
+			 *
+			 *  \param[in,out] MSInterfaceInfo  Pointer to a structure containing a MS Class host configuration and state.
+			 *  \param[in]     LUNIndex         LUN index within the device the command is being issued to.
+			 *  \param[out]    SenseData        Pointer to the location where the sense information should be stored.
+			 *
+			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum or \ref MS_ERROR_LOGICAL_CMD_FAILED if not ready.
+			 */
+			uint8_t MS_Host_RequestSense(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo,
+			                             const uint8_t LUNIndex,
+			                             SCSI_Request_Sense_Response_t* const SenseData) ATTR_NON_NULL_PTR_ARG(1)
+			                             ATTR_NON_NULL_PTR_ARG(3);
+
+			/** Issues a PREVENT MEDIUM REMOVAL command, to logically (or, depending on the type of device, physically) lock
+			 *  the device from removal so that blocks of data on the medium can be read or altered.
+			 *
+			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the
+			 *       call will fail.
+			 *
+			 *  \param[in,out] MSInterfaceInfo  Pointer to a structure containing a MS Class host configuration and state.
+			 *  \param[in]     LUNIndex         LUN index within the device the command is being issued to.
+			 *  \param[in]     PreventRemoval   Boolean \c true if the device should be locked from removal, \c false otherwise.
+			 *
+			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum or \ref MS_ERROR_LOGICAL_CMD_FAILED if not ready.
+			 */
+			uint8_t MS_Host_PreventAllowMediumRemoval(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo,
+			                                          const uint8_t LUNIndex,
+			                                          const bool PreventRemoval) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Reads blocks of data from the attached Mass Storage device's medium.
+			 *
+			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the
+			 *       call will fail.
+			 *
+			 *  \param[in,out] MSInterfaceInfo  Pointer to a structure containing a MS Class host configuration and state.
+			 *  \param[in]     LUNIndex         LUN index within the device the command is being issued to.
+			 *  \param[in]     BlockAddress     Starting block address within the device to read from.
+			 *  \param[in]     Blocks           Total number of blocks to read.
+			 *  \param[in]     BlockSize        Size in bytes of each block within the device.
+			 *  \param[out]    BlockBuffer      Pointer to where the read data from the device should be stored.
+			 *
+			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum or \ref MS_ERROR_LOGICAL_CMD_FAILED if not ready.
+			 */
+			uint8_t MS_Host_ReadDeviceBlocks(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo,
+			                                 const uint8_t LUNIndex,
+			                                 const uint32_t BlockAddress,
+			                                 const uint8_t Blocks,
+			                                 const uint16_t BlockSize,
+			                                 void* BlockBuffer) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(6);
+
+			/** Writes blocks of data to the attached Mass Storage device's medium.
+			 *
+			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the
+			 *       call will fail.
+			 *
+			 *  \param[in,out] MSInterfaceInfo  Pointer to a structure containing a MS Class host configuration and state.
+			 *  \param[in]     LUNIndex         LUN index within the device the command is being issued to.
+			 *  \param[in]     BlockAddress     Starting block address within the device to write to.
+			 *  \param[in]     Blocks           Total number of blocks to read.
+			 *  \param[in]     BlockSize        Size in bytes of each block within the device.
+			 *  \param[in]     BlockBuffer      Pointer to where the data to write should be sourced from.
+			 *
+			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum or \ref MS_ERROR_LOGICAL_CMD_FAILED if not ready.
+			 */
+			uint8_t MS_Host_WriteDeviceBlocks(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo,
+			                                  const uint8_t LUNIndex,
+			                                  const uint32_t BlockAddress,
+			                                  const uint8_t Blocks,
+			                                  const uint16_t BlockSize,
+			                                  const void* BlockBuffer) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(6);
+
+		/* Inline Functions: */
+			/** General management task for a given Mass Storage host class interface, required for the correct operation of
+			 *  the interface. This should be called frequently in the main program loop, before the master USB management task
+			 *  \ref USB_USBTask().
+			 *
+			 *  \param[in,out] MSInterfaceInfo  Pointer to a structure containing an Mass Storage Class host configuration and state.
+			 */
+			static inline void MS_Host_USBTask(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1) ATTR_ALWAYS_INLINE;
+			static inline void MS_Host_USBTask(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo)
+			{
+				(void)MSInterfaceInfo;
+			}
+
+	/* Private Interface - For use in library only: */
+	#if !defined(__DOXYGEN__)
+		/* Macros: */
+			#define MS_COMMAND_DATA_TIMEOUT_MS        10000
+
+		/* Function Prototypes: */
+			#if defined(__INCLUDE_FROM_MASSSTORAGE_HOST_C)
+				static uint8_t MS_Host_SendCommand(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo,
+				                                   MS_CommandBlockWrapper_t* const SCSICommandBlock,
+				                                   const void* const BufferPtr) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2);
+				static uint8_t MS_Host_WaitForDataReceived(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
+				static uint8_t MS_Host_SendReceiveData(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo,
+				                                       MS_CommandBlockWrapper_t* const SCSICommandBlock,
+				                                       void* BufferPtr) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2);
+				static uint8_t MS_Host_GetReturnedStatus(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo,
+				                                         MS_CommandStatusWrapper_t* const SCSICommandStatus)
+				                                         ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2);
+
+				static uint8_t DCOMP_MS_Host_NextMSInterface(void* const CurrentDescriptor)
+				                                             ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(1);
+				static uint8_t DCOMP_MS_Host_NextMSInterfaceEndpoint(void* const CurrentDescriptor)
+				                                                     ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(1);
+			#endif
+	#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Host/PrinterClassHost.c b/lib/lufa/LUFA/Drivers/USB/Class/Host/PrinterClassHost.c
new file mode 100644
index 0000000000..8a04d0ab8b
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Class/Host/PrinterClassHost.c
@@ -0,0 +1,400 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+#define  __INCLUDE_FROM_USB_DRIVER
+#include "../../Core/USBMode.h"
+
+#if defined(USB_CAN_BE_HOST)
+
+#define  __INCLUDE_FROM_PRINTER_DRIVER
+#define  __INCLUDE_FROM_PRINTER_HOST_C
+#include "PrinterClassHost.h"
+
+uint8_t PRNT_Host_ConfigurePipes(USB_ClassInfo_PRNT_Host_t* const PRNTInterfaceInfo,
+                                 uint16_t ConfigDescriptorSize,
+							     void* ConfigDescriptorData)
+{
+	USB_Descriptor_Endpoint_t*  DataINEndpoint   = NULL;
+	USB_Descriptor_Endpoint_t*  DataOUTEndpoint  = NULL;
+	USB_Descriptor_Interface_t* PrinterInterface = NULL;
+
+	memset(&PRNTInterfaceInfo->State, 0x00, sizeof(PRNTInterfaceInfo->State));
+
+	if (DESCRIPTOR_TYPE(ConfigDescriptorData) != DTYPE_Configuration)
+	  return PRNT_ENUMERROR_InvalidConfigDescriptor;
+
+	while (!(DataINEndpoint) || !(DataOUTEndpoint))
+	{
+		if (!(PrinterInterface) ||
+		    USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData,
+		                              DCOMP_PRNT_Host_NextPRNTInterfaceEndpoint) != DESCRIPTOR_SEARCH_COMP_Found)
+		{
+			if (USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData,
+			                              DCOMP_PRNT_Host_NextPRNTInterface) != DESCRIPTOR_SEARCH_COMP_Found)
+			{
+				return PRNT_ENUMERROR_NoCompatibleInterfaceFound;
+			}
+
+			PrinterInterface = DESCRIPTOR_PCAST(ConfigDescriptorData, USB_Descriptor_Interface_t);
+
+			DataINEndpoint  = NULL;
+			DataOUTEndpoint = NULL;
+
+			continue;
+		}
+
+		USB_Descriptor_Endpoint_t* EndpointData = DESCRIPTOR_PCAST(ConfigDescriptorData, USB_Descriptor_Endpoint_t);
+
+		if ((EndpointData->EndpointAddress & ENDPOINT_DIR_MASK) == ENDPOINT_DIR_IN)
+		  DataINEndpoint  = EndpointData;
+		else
+		  DataOUTEndpoint = EndpointData;
+	}
+
+	PRNTInterfaceInfo->Config.DataINPipe.Size  = le16_to_cpu(DataINEndpoint->EndpointSize);
+	PRNTInterfaceInfo->Config.DataINPipe.EndpointAddress = DataINEndpoint->EndpointAddress;
+	PRNTInterfaceInfo->Config.DataINPipe.Type  = EP_TYPE_BULK;
+
+	PRNTInterfaceInfo->Config.DataOUTPipe.Size = le16_to_cpu(DataOUTEndpoint->EndpointSize);
+	PRNTInterfaceInfo->Config.DataOUTPipe.EndpointAddress = DataOUTEndpoint->EndpointAddress;
+	PRNTInterfaceInfo->Config.DataOUTPipe.Type = EP_TYPE_BULK;
+
+	if (!(Pipe_ConfigurePipeTable(&PRNTInterfaceInfo->Config.DataINPipe, 1)))
+	  return PRNT_ENUMERROR_PipeConfigurationFailed;
+
+	if (!(Pipe_ConfigurePipeTable(&PRNTInterfaceInfo->Config.DataOUTPipe, 1)))
+	  return PRNT_ENUMERROR_PipeConfigurationFailed;
+
+	PRNTInterfaceInfo->State.InterfaceNumber  = PrinterInterface->InterfaceNumber;
+	PRNTInterfaceInfo->State.AlternateSetting = PrinterInterface->AlternateSetting;
+	PRNTInterfaceInfo->State.IsActive = true;
+
+	return PRNT_ENUMERROR_NoError;
+}
+
+static uint8_t DCOMP_PRNT_Host_NextPRNTInterface(void* CurrentDescriptor)
+{
+	USB_Descriptor_Header_t* Header = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Header_t);
+
+	if (Header->Type == DTYPE_Interface)
+	{
+		USB_Descriptor_Interface_t* Interface = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Interface_t);
+
+		if ((Interface->Class    == PRNT_CSCP_PrinterClass)    &&
+		    (Interface->SubClass == PRNT_CSCP_PrinterSubclass) &&
+		    (Interface->Protocol == PRNT_CSCP_BidirectionalProtocol))
+		{
+			return DESCRIPTOR_SEARCH_Found;
+		}
+	}
+
+	return DESCRIPTOR_SEARCH_NotFound;
+}
+
+static uint8_t DCOMP_PRNT_Host_NextPRNTInterfaceEndpoint(void* CurrentDescriptor)
+{
+	USB_Descriptor_Header_t* Header = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Header_t);
+
+	if (Header->Type == DTYPE_Endpoint)
+	{
+		USB_Descriptor_Endpoint_t* Endpoint = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Endpoint_t);
+
+		uint8_t EndpointType = (Endpoint->Attributes & EP_TYPE_MASK);
+
+		if (EndpointType == EP_TYPE_BULK)
+		  return DESCRIPTOR_SEARCH_Found;
+	}
+	else if (Header->Type == DTYPE_Interface)
+	{
+		return DESCRIPTOR_SEARCH_Fail;
+	}
+
+	return DESCRIPTOR_SEARCH_NotFound;
+}
+
+void PRNT_Host_USBTask(USB_ClassInfo_PRNT_Host_t* const PRNTInterfaceInfo)
+{
+	if ((USB_HostState != HOST_STATE_Configured) || !(PRNTInterfaceInfo->State.IsActive))
+	  return;
+
+	#if !defined(NO_CLASS_DRIVER_AUTOFLUSH)
+	PRNT_Host_Flush(PRNTInterfaceInfo);
+	#endif
+}
+
+uint8_t PRNT_Host_SetBidirectionalMode(USB_ClassInfo_PRNT_Host_t* const PRNTInterfaceInfo)
+{
+	if (PRNTInterfaceInfo->State.AlternateSetting)
+	{
+		uint8_t ErrorCode;
+
+		if ((ErrorCode = USB_Host_SetInterfaceAltSetting(PRNTInterfaceInfo->State.InterfaceNumber,
+		                                                 PRNTInterfaceInfo->State.AlternateSetting)) != HOST_SENDCONTROL_Successful)
+		{
+			return ErrorCode;
+		}
+	}
+
+	return HOST_SENDCONTROL_Successful;
+}
+
+uint8_t PRNT_Host_GetPortStatus(USB_ClassInfo_PRNT_Host_t* const PRNTInterfaceInfo,
+                                uint8_t* const PortStatus)
+{
+	USB_ControlRequest = (USB_Request_Header_t)
+		{
+			.bmRequestType = (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE),
+			.bRequest      = PRNT_REQ_GetPortStatus,
+			.wValue        = 0,
+			.wIndex        = PRNTInterfaceInfo->State.InterfaceNumber,
+			.wLength       = sizeof(uint8_t),
+		};
+
+	Pipe_SelectPipe(PIPE_CONTROLPIPE);
+	return USB_Host_SendControlRequest(PortStatus);
+}
+
+uint8_t PRNT_Host_SoftReset(USB_ClassInfo_PRNT_Host_t* const PRNTInterfaceInfo)
+{
+	USB_ControlRequest = (USB_Request_Header_t)
+		{
+			.bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE),
+			.bRequest      = PRNT_REQ_SoftReset,
+			.wValue        = 0,
+			.wIndex        = PRNTInterfaceInfo->State.InterfaceNumber,
+			.wLength       = 0,
+		};
+
+	Pipe_SelectPipe(PIPE_CONTROLPIPE);
+	return USB_Host_SendControlRequest(NULL);
+}
+
+uint8_t PRNT_Host_Flush(USB_ClassInfo_PRNT_Host_t* const PRNTInterfaceInfo)
+{
+	if ((USB_HostState != HOST_STATE_Configured) || !(PRNTInterfaceInfo->State.IsActive))
+	  return PIPE_READYWAIT_DeviceDisconnected;
+
+	uint8_t ErrorCode;
+
+	Pipe_SelectPipe(PRNTInterfaceInfo->Config.DataOUTPipe.Address);
+	Pipe_Unfreeze();
+
+	if (!(Pipe_BytesInPipe()))
+	  return PIPE_READYWAIT_NoError;
+
+	bool BankFull = !(Pipe_IsReadWriteAllowed());
+
+	Pipe_ClearOUT();
+
+	if (BankFull)
+	{
+		if ((ErrorCode = Pipe_WaitUntilReady()) != PIPE_READYWAIT_NoError)
+		  return ErrorCode;
+
+		Pipe_ClearOUT();
+	}
+
+	Pipe_Freeze();
+
+	return PIPE_READYWAIT_NoError;
+}
+
+uint8_t PRNT_Host_SendByte(USB_ClassInfo_PRNT_Host_t* const PRNTInterfaceInfo,
+                           const uint8_t Data)
+{
+	if ((USB_HostState != HOST_STATE_Configured) || !(PRNTInterfaceInfo->State.IsActive))
+	  return PIPE_READYWAIT_DeviceDisconnected;
+
+	uint8_t ErrorCode;
+
+	Pipe_SelectPipe(PRNTInterfaceInfo->Config.DataOUTPipe.Address);
+	Pipe_Unfreeze();
+
+	if (!(Pipe_IsReadWriteAllowed()))
+	{
+		Pipe_ClearOUT();
+
+		if ((ErrorCode = Pipe_WaitUntilReady()) != PIPE_READYWAIT_NoError)
+		  return ErrorCode;
+	}
+
+	Pipe_Write_8(Data);
+	Pipe_Freeze();
+
+	return PIPE_READYWAIT_NoError;
+}
+
+uint8_t PRNT_Host_SendString(USB_ClassInfo_PRNT_Host_t* const PRNTInterfaceInfo,
+                             const char* const String)
+{
+	uint8_t ErrorCode;
+
+	if ((USB_HostState != HOST_STATE_Configured) || !(PRNTInterfaceInfo->State.IsActive))
+	  return PIPE_RWSTREAM_DeviceDisconnected;
+
+	Pipe_SelectPipe(PRNTInterfaceInfo->Config.DataOUTPipe.Address);
+	Pipe_Unfreeze();
+
+	if ((ErrorCode = Pipe_Write_Stream_LE(String, strlen(String), NULL)) != PIPE_RWSTREAM_NoError)
+	  return ErrorCode;
+
+	Pipe_ClearOUT();
+
+	ErrorCode = Pipe_WaitUntilReady();
+
+	Pipe_Freeze();
+
+	return ErrorCode;
+}
+
+uint8_t PRNT_Host_SendData(USB_ClassInfo_PRNT_Host_t* const PRNTInterfaceInfo,
+                           const void* Buffer,
+                           const uint16_t Length)
+{
+	uint8_t ErrorCode;
+
+	if ((USB_HostState != HOST_STATE_Configured) || !(PRNTInterfaceInfo->State.IsActive))
+	  return PIPE_RWSTREAM_DeviceDisconnected;
+
+	Pipe_SelectPipe(PRNTInterfaceInfo->Config.DataOUTPipe.Address);
+	Pipe_Unfreeze();
+
+	if ((ErrorCode = Pipe_Write_Stream_LE(Buffer, Length, NULL)) != PIPE_RWSTREAM_NoError)
+	  return ErrorCode;
+
+	Pipe_ClearOUT();
+
+	ErrorCode = Pipe_WaitUntilReady();
+
+	Pipe_Freeze();
+
+	return ErrorCode;
+}
+
+uint16_t PRNT_Host_BytesReceived(USB_ClassInfo_PRNT_Host_t* const PRNTInterfaceInfo)
+{
+	if ((USB_HostState != HOST_STATE_Configured) || !(PRNTInterfaceInfo->State.IsActive))
+	  return 0;
+
+	Pipe_SelectPipe(PRNTInterfaceInfo->Config.DataINPipe.Address);
+	Pipe_Unfreeze();
+
+	if (Pipe_IsINReceived())
+	{
+		if (!(Pipe_BytesInPipe()))
+		{
+			Pipe_ClearIN();
+			Pipe_Freeze();
+			return 0;
+		}
+		else
+		{
+			Pipe_Freeze();
+			return Pipe_BytesInPipe();
+		}
+	}
+	else
+	{
+		Pipe_Freeze();
+
+		return 0;
+	}
+}
+
+int16_t PRNT_Host_ReceiveByte(USB_ClassInfo_PRNT_Host_t* const PRNTInterfaceInfo)
+{
+	if ((USB_HostState != HOST_STATE_Configured) || !(PRNTInterfaceInfo->State.IsActive))
+	  return PIPE_RWSTREAM_DeviceDisconnected;
+
+	int16_t ReceivedByte = -1;
+
+	Pipe_SelectPipe(PRNTInterfaceInfo->Config.DataINPipe.Address);
+	Pipe_Unfreeze();
+
+	if (Pipe_IsINReceived())
+	{
+		if (Pipe_BytesInPipe())
+		  ReceivedByte = Pipe_Read_8();
+
+		if (!(Pipe_BytesInPipe()))
+		  Pipe_ClearIN();
+	}
+
+	Pipe_Freeze();
+
+	return ReceivedByte;
+}
+
+uint8_t PRNT_Host_GetDeviceID(USB_ClassInfo_PRNT_Host_t* const PRNTInterfaceInfo,
+                              char* const DeviceIDString,
+                              const uint16_t BufferSize)
+{
+	uint8_t  ErrorCode;
+	uint16_t DeviceIDStringLength = 0;
+
+	USB_ControlRequest = (USB_Request_Header_t)
+		{
+			.bmRequestType = (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE),
+			.bRequest      = PRNT_REQ_GetDeviceID,
+			.wValue        = 0,
+			.wIndex        = PRNTInterfaceInfo->State.InterfaceNumber,
+			.wLength       = sizeof(DeviceIDStringLength),
+		};
+
+	Pipe_SelectPipe(PIPE_CONTROLPIPE);
+
+	if ((ErrorCode = USB_Host_SendControlRequest(&DeviceIDStringLength)) != HOST_SENDCONTROL_Successful)
+	  return ErrorCode;
+
+	if (!(DeviceIDStringLength))
+	{
+		DeviceIDString[0] = 0x00;
+		return HOST_SENDCONTROL_Successful;
+	}
+
+	DeviceIDStringLength = be16_to_cpu(DeviceIDStringLength);
+
+	if (DeviceIDStringLength > BufferSize)
+	  DeviceIDStringLength = BufferSize;
+
+	USB_ControlRequest.wLength = DeviceIDStringLength;
+
+	if ((ErrorCode = USB_Host_SendControlRequest(DeviceIDString)) != HOST_SENDCONTROL_Successful)
+	  return ErrorCode;
+
+	memmove(&DeviceIDString[0], &DeviceIDString[2], DeviceIDStringLength - 2);
+
+	DeviceIDString[DeviceIDStringLength - 2] = 0x00;
+
+	return HOST_SENDCONTROL_Successful;
+}
+
+#endif
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Host/PrinterClassHost.h b/lib/lufa/LUFA/Drivers/USB/Class/Host/PrinterClassHost.h
new file mode 100644
index 0000000000..511dab4b40
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Class/Host/PrinterClassHost.h
@@ -0,0 +1,285 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Host mode driver for the library USB Printer Class driver.
+ *
+ *  Host mode driver for the library USB Printer Class driver.
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the USB module driver
+ *        dispatch header located in LUFA/Drivers/USB.h.
+ */
+
+/** \ingroup Group_USBClassPrinter
+ *  \defgroup Group_USBClassPrinterHost Printer Class Host Mode Driver
+ *
+ *  \section Sec_USBClassPrinterHost_Dependencies Module Source Dependencies
+ *  The following files must be built with any user project that uses this module:
+ *    - LUFA/Drivers/USB/Class/Host/PrinterClassHost.c <i>(Makefile source module name: LUFA_SRC_USBCLASS)</i>
+ *
+ *  \section Sec_USBClassPrinterHost_ModDescription Module Description
+ *  Host Mode USB Class driver framework interface, for the Printer USB Class driver.
+ *
+ *  @{
+ */
+
+#ifndef __PRINTER_CLASS_HOST_H__
+#define __PRINTER_CLASS_HOST_H__
+
+	/* Includes: */
+		#include "../../USB.h"
+		#include "../Common/PrinterClassCommon.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_PRINTER_DRIVER)
+			#error Do not include this file directly. Include LUFA/Drivers/USB.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Type Defines: */
+			/** \brief Printer Class Host Mode Configuration and State Structure.
+			 *
+			 *  Class state structure. An instance of this structure should be made within the user application,
+			 *  and passed to each of the Printer class driver functions as the \c PRNTInterfaceInfo parameter. This
+			 *  stores each Printer interface's configuration and state information.
+			 */
+			typedef struct
+			{
+				struct
+				{
+					USB_Pipe_Table_t DataINPipe; /**< Data IN Pipe configuration table. */
+					USB_Pipe_Table_t DataOUTPipe; /**< Data OUT Pipe configuration table. */
+				} Config; /**< Config data for the USB class interface within the device. All elements in this section
+				           *   <b>must</b> be set or the interface will fail to enumerate and operate correctly.
+				           */
+				struct
+				{
+					bool IsActive; /**< Indicates if the current interface instance is connected to an attached device, valid
+					                *   after \ref PRNT_Host_ConfigurePipes() is called and the Host state machine is in the
+					                *   Configured state.
+					                */
+					uint8_t InterfaceNumber; /**< Interface index of the Printer interface within the attached device. */
+					uint8_t AlternateSetting; /**< Alternate setting within the Printer Interface in the attached device. */
+				} State; /**< State data for the USB class interface within the device. All elements in this section
+						  *   <b>may</b> be set to initial values, but may also be ignored to default to sane values when
+						  *   the interface is enumerated.
+						  */
+			} USB_ClassInfo_PRNT_Host_t;
+
+		/* Enums: */
+			/** Enum for the possible error codes returned by the \ref PRNT_Host_ConfigurePipes() function. */
+			enum PRNT_Host_EnumerationFailure_ErrorCodes_t
+			{
+				PRNT_ENUMERROR_NoError                    = 0, /**< Configuration Descriptor was processed successfully. */
+				PRNT_ENUMERROR_InvalidConfigDescriptor    = 1, /**< The device returned an invalid Configuration Descriptor. */
+				PRNT_ENUMERROR_NoCompatibleInterfaceFound = 2, /**< A compatible Printer interface was not found in the device's Configuration Descriptor. */
+				PRNT_ENUMERROR_PipeConfigurationFailed    = 3, /**< One or more pipes for the specified interface could not be configured correctly. */
+			};
+
+		/* Function Prototypes: */
+			/** Host interface configuration routine, to configure a given Printer host interface instance using the
+			 *  Configuration Descriptor read from an attached USB device. This function automatically updates the given Printer
+			 *  instance's state values and configures the pipes required to communicate with the interface if it is found within
+			 *  the device. This should be called once after the stack has enumerated the attached device, while the host state
+			 *  machine is in the Addressed state.
+			 *
+			 *  \param[in,out] PRNTInterfaceInfo     Pointer to a structure containing a Printer Class host configuration and state.
+			 *  \param[in]     ConfigDescriptorSize  Length of the attached device's Configuration Descriptor.
+			 *  \param[in]     ConfigDescriptorData  Pointer to a buffer containing the attached device's Configuration Descriptor.
+			 *
+			 *  \return A value from the \ref PRNT_Host_EnumerationFailure_ErrorCodes_t enum.
+			 */
+			uint8_t PRNT_Host_ConfigurePipes(USB_ClassInfo_PRNT_Host_t* const PRNTInterfaceInfo,
+			                                 uint16_t ConfigDescriptorSize,
+			                                 void* ConfigDescriptorData) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(3);
+
+			/** General management task for a given Printer host class interface, required for the correct operation of
+			 *  the interface. This should be called frequently in the main program loop, before the master USB management task
+			 *  \ref USB_USBTask().
+			 *
+			 *  \param[in,out] PRNTInterfaceInfo  Pointer to a structure containing a Printer Class host configuration and state.
+			 */
+			void PRNT_Host_USBTask(USB_ClassInfo_PRNT_Host_t* const PRNTInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Configures the printer to enable Bidirectional mode, if it is not already in this mode. This should be called
+			 *  once the connected device's configuration has been set, to ensure the printer is ready to accept commands.
+			 *
+			 *  \param[in,out] PRNTInterfaceInfo  Pointer to a structure containing a Printer Class host configuration and state.
+			 *
+			 *  \return A value from the \ref USB_Host_SendControlErrorCodes_t enum.
+			 */
+			uint8_t PRNT_Host_SetBidirectionalMode(USB_ClassInfo_PRNT_Host_t* const PRNTInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Retrieves the status of the virtual Printer port's inbound status lines. The result can then be masked against the
+			 *  \c PRNT_PORTSTATUS_* macros to determine the printer port's status.
+			 *
+			 *  \param[in,out] PRNTInterfaceInfo  Pointer to a structure containing a Printer Class host configuration and state.
+			 *  \param[out]    PortStatus         Location where the retrieved port status should be stored.
+			 *
+			 *  \return A value from the \ref USB_Host_SendControlErrorCodes_t enum.
+			 */
+			uint8_t PRNT_Host_GetPortStatus(USB_ClassInfo_PRNT_Host_t* const PRNTInterfaceInfo,
+			                                uint8_t* const PortStatus)
+			                                ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2);
+
+			/** Soft-resets the attached printer, readying it for new commands.
+			 *
+			 *  \param[in,out] PRNTInterfaceInfo  Pointer to a structure containing a Printer Class host configuration and state.
+			 *
+			 *  \return A value from the \ref USB_Host_SendControlErrorCodes_t enum.
+			 */
+			uint8_t PRNT_Host_SoftReset(USB_ClassInfo_PRNT_Host_t* const PRNTInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Flushes any data waiting to be sent, ensuring that the send buffer is cleared.
+			 *
+			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the
+			 *       call will fail.
+			 *
+			 *  \param[in,out] PRNTInterfaceInfo  Pointer to a structure containing a Printer Class host configuration and state.
+			 *
+			 *  \return A value from the \ref Pipe_WaitUntilReady_ErrorCodes_t enum.
+			 */
+			uint8_t PRNT_Host_Flush(USB_ClassInfo_PRNT_Host_t* const PRNTInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Sends the given null terminated string to the attached printer's input endpoint.
+			 *
+			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the
+			 *       call will fail.
+			 *
+			 *  \param[in,out] PRNTInterfaceInfo  Pointer to a structure containing a Printer Class host configuration and state.
+			 *  \param[in]     String             Pointer to a null terminated string to send.
+			 *
+			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t PRNT_Host_SendString(USB_ClassInfo_PRNT_Host_t* const PRNTInterfaceInfo,
+			                             const char* const String) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2);
+
+			/** Sends the given raw data stream to the attached printer's input endpoint. This should contain commands that the
+			 *  printer is able to understand - for example, PCL data. Not all printers accept all printer languages; see
+			 *  \ref PRNT_Host_GetDeviceID() for details on determining acceptable languages for an attached printer.
+			 *
+			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the
+			 *       call will fail.
+			 *
+			 *  \param[in,out] PRNTInterfaceInfo  Pointer to a structure containing a Printer Class host configuration and state.
+			 *  \param[in]     Buffer             Pointer to a buffer containing the raw command stream to send to the printer.
+			 *  \param[in]     Length             Size in bytes of the command stream to be sent.
+			 *
+			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t PRNT_Host_SendData(USB_ClassInfo_PRNT_Host_t* const PRNTInterfaceInfo,
+			                           const void* Buffer,
+			                           const uint16_t Length) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2);
+
+			/** Sends a given byte to the attached USB device, if connected. If a device is not connected when the function is called, the
+			 *  byte is discarded. Bytes will be queued for transmission to the device until either the pipe bank becomes full, or the
+			 *  \ref PRNT_Host_Flush() function is called to flush the pending data to the host. This allows for multiple bytes to be
+			 *  packed into a single pipe packet, increasing data throughput.
+			 *
+			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the
+			 *       call will fail.
+			 *
+			 *  \param[in,out] PRNTInterfaceInfo  Pointer to a structure containing a Printer Class host configuration and state.
+			 *  \param[in]     Data               Byte of data to send to the device.
+			 *
+			 *  \return A value from the \ref Pipe_WaitUntilReady_ErrorCodes_t enum.
+			 */
+			uint8_t PRNT_Host_SendByte(USB_ClassInfo_PRNT_Host_t* const PRNTInterfaceInfo,
+			                           const uint8_t Data) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Determines the number of bytes received by the printer interface from the device, waiting to be read. This indicates the number
+			 *  of bytes in the IN pipe bank only, and thus the number of calls to \ref PRNT_Host_ReceiveByte() which are guaranteed to succeed
+			 *  immediately. If multiple bytes are to be received, they should be buffered by the user application, as the pipe bank will not be
+			 *  released back to the USB controller until all bytes are read.
+			 *
+			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the
+			 *       call will fail.
+			 *
+			 *  \param[in,out] PRNTInterfaceInfo  Pointer to a structure containing a Printer Class host configuration and state.
+			 *
+			 *  \return Total number of buffered bytes received from the device.
+			 */
+			uint16_t PRNT_Host_BytesReceived(USB_ClassInfo_PRNT_Host_t* const PRNTInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Reads a byte of data from the device. If no data is waiting to be read of if a USB device is not connected, the function
+			 *  returns a negative value. The \ref PRNT_Host_BytesReceived() function may be queried in advance to determine how many bytes
+			 *  are currently buffered in the Printer interface's data receive pipe.
+			 *
+			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the
+			 *       call will fail.
+			 *
+			 *  \param[in,out] PRNTInterfaceInfo  Pointer to a structure containing a Printer Class host configuration and state.
+			 *
+			 *  \return Next received byte from the device, or a negative value if no data received.
+			 */
+			int16_t PRNT_Host_ReceiveByte(USB_ClassInfo_PRNT_Host_t* const PRNTInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Retrieves the attached printer device's ID string, formatted according to IEEE 1284. This string is sent as a
+			 *  Unicode string from the device and is automatically converted to an ASCII encoded C string by this function, thus
+			 *  the maximum reportable string length is two less than the size given (to accommodate the Unicode string length
+			 *  bytes which are removed).
+			 *
+			 *  This string, when supported, contains the model, manufacturer and acceptable printer languages for the attached device.
+			 *
+			 *  \param[in,out] PRNTInterfaceInfo  Pointer to a structure containing a Printer Class host configuration and state.
+			 *  \param[out]    DeviceIDString     Pointer to a buffer where the Device ID string should be stored, in ASCII format.
+			 *  \param[in]     BufferSize         Size in bytes of the buffer allocated for the Device ID string.
+			 *
+			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t PRNT_Host_GetDeviceID(USB_ClassInfo_PRNT_Host_t* const PRNTInterfaceInfo,
+			                              char* const DeviceIDString,
+			                              const uint16_t BufferSize) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2);
+
+	/* Private Interface - For use in library only: */
+	#if !defined(__DOXYGEN__)
+		/* Function Prototypes: */
+			#if defined(__INCLUDE_FROM_PRINTER_HOST_C)
+				static uint8_t DCOMP_PRNT_Host_NextPRNTInterface(void* const CurrentDescriptor)
+				                                                 ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(1);
+				static uint8_t DCOMP_PRNT_Host_NextPRNTInterfaceEndpoint(void* const CurrentDescriptor)
+				                                                         ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(1);
+			#endif
+	#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Host/RNDISClassHost.c b/lib/lufa/LUFA/Drivers/USB/Class/Host/RNDISClassHost.c
new file mode 100644
index 0000000000..6fb09fdab2
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Class/Host/RNDISClassHost.c
@@ -0,0 +1,476 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+#define  __INCLUDE_FROM_USB_DRIVER
+#include "../../Core/USBMode.h"
+
+#if defined(USB_CAN_BE_HOST)
+
+#define  __INCLUDE_FROM_RNDIS_DRIVER
+#define  __INCLUDE_FROM_RNDIS_HOST_C
+#include "RNDISClassHost.h"
+
+uint8_t RNDIS_Host_ConfigurePipes(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfaceInfo,
+                                  uint16_t ConfigDescriptorSize,
+                                  void* ConfigDescriptorData)
+{
+	USB_Descriptor_Endpoint_t*  DataINEndpoint        = NULL;
+	USB_Descriptor_Endpoint_t*  DataOUTEndpoint       = NULL;
+	USB_Descriptor_Endpoint_t*  NotificationEndpoint  = NULL;
+	USB_Descriptor_Interface_t* RNDISControlInterface = NULL;
+
+	memset(&RNDISInterfaceInfo->State, 0x00, sizeof(RNDISInterfaceInfo->State));
+
+	if (DESCRIPTOR_TYPE(ConfigDescriptorData) != DTYPE_Configuration)
+	  return RNDIS_ENUMERROR_InvalidConfigDescriptor;
+
+	RNDISControlInterface = DESCRIPTOR_PCAST(ConfigDescriptorData, USB_Descriptor_Interface_t);
+
+	while (!(DataINEndpoint) || !(DataOUTEndpoint) || !(NotificationEndpoint))
+	{
+		if (!(RNDISControlInterface) ||
+		    USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData,
+		                              DCOMP_RNDIS_Host_NextRNDISInterfaceEndpoint) != DESCRIPTOR_SEARCH_COMP_Found)
+		{
+			if (NotificationEndpoint)
+			{
+				if (USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData,
+											  DCOMP_RNDIS_Host_NextRNDISDataInterface) != DESCRIPTOR_SEARCH_COMP_Found)
+				{
+					return RNDIS_ENUMERROR_NoCompatibleInterfaceFound;
+				}
+
+				DataINEndpoint  = NULL;
+				DataOUTEndpoint = NULL;
+			}
+			else
+			{
+				if (USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData,
+											  DCOMP_RNDIS_Host_NextRNDISControlInterface) != DESCRIPTOR_SEARCH_COMP_Found)
+				{
+					return RNDIS_ENUMERROR_NoCompatibleInterfaceFound;
+				}
+
+				RNDISControlInterface = DESCRIPTOR_PCAST(ConfigDescriptorData, USB_Descriptor_Interface_t);
+
+				NotificationEndpoint = NULL;
+			}
+
+			continue;
+		}
+
+		USB_Descriptor_Endpoint_t* EndpointData = DESCRIPTOR_PCAST(ConfigDescriptorData, USB_Descriptor_Endpoint_t);
+
+		if ((EndpointData->EndpointAddress & ENDPOINT_DIR_MASK) == ENDPOINT_DIR_IN)
+		{
+			if ((EndpointData->Attributes & EP_TYPE_MASK) == EP_TYPE_INTERRUPT)
+			  NotificationEndpoint = EndpointData;
+			else
+			  DataINEndpoint = EndpointData;
+		}
+		else
+		{
+			DataOUTEndpoint = EndpointData;
+		}
+	}
+
+	RNDISInterfaceInfo->Config.DataINPipe.Size  = le16_to_cpu(DataINEndpoint->EndpointSize);
+	RNDISInterfaceInfo->Config.DataINPipe.EndpointAddress = DataINEndpoint->EndpointAddress;
+	RNDISInterfaceInfo->Config.DataINPipe.Type  = EP_TYPE_BULK;
+
+	RNDISInterfaceInfo->Config.DataOUTPipe.Size = le16_to_cpu(DataOUTEndpoint->EndpointSize);
+	RNDISInterfaceInfo->Config.DataOUTPipe.EndpointAddress = DataOUTEndpoint->EndpointAddress;
+	RNDISInterfaceInfo->Config.DataOUTPipe.Type = EP_TYPE_BULK;
+
+	RNDISInterfaceInfo->Config.NotificationPipe.Size = le16_to_cpu(NotificationEndpoint->EndpointSize);
+	RNDISInterfaceInfo->Config.NotificationPipe.EndpointAddress = NotificationEndpoint->EndpointAddress;
+	RNDISInterfaceInfo->Config.NotificationPipe.Type = EP_TYPE_INTERRUPT;
+
+	if (!(Pipe_ConfigurePipeTable(&RNDISInterfaceInfo->Config.DataINPipe, 1)))
+	  return RNDIS_ENUMERROR_PipeConfigurationFailed;
+
+	if (!(Pipe_ConfigurePipeTable(&RNDISInterfaceInfo->Config.DataOUTPipe, 1)))
+	  return RNDIS_ENUMERROR_PipeConfigurationFailed;
+
+	if (!(Pipe_ConfigurePipeTable(&RNDISInterfaceInfo->Config.NotificationPipe, 1)))
+	  return RNDIS_ENUMERROR_PipeConfigurationFailed;
+
+	RNDISInterfaceInfo->State.ControlInterfaceNumber = RNDISControlInterface->InterfaceNumber;
+	RNDISInterfaceInfo->State.IsActive = true;
+
+	return RNDIS_ENUMERROR_NoError;
+}
+
+static uint8_t DCOMP_RNDIS_Host_NextRNDISControlInterface(void* const CurrentDescriptor)
+{
+	USB_Descriptor_Header_t* Header = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Header_t);
+
+	if (Header->Type == DTYPE_Interface)
+	{
+		USB_Descriptor_Interface_t* Interface = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Interface_t);
+
+		if ((Interface->Class    == CDC_CSCP_CDCClass)    &&
+		    (Interface->SubClass == CDC_CSCP_ACMSubclass) &&
+		    (Interface->Protocol == CDC_CSCP_VendorSpecificProtocol))
+		{
+			return DESCRIPTOR_SEARCH_Found;
+		}
+	}
+
+	return DESCRIPTOR_SEARCH_NotFound;
+}
+
+static uint8_t DCOMP_RNDIS_Host_NextRNDISDataInterface(void* const CurrentDescriptor)
+{
+	USB_Descriptor_Header_t* Header = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Header_t);
+
+	if (Header->Type == DTYPE_Interface)
+	{
+		USB_Descriptor_Interface_t* Interface = DESCRIPTOR_PCAST(CurrentDescriptor,
+		                                                         USB_Descriptor_Interface_t);
+
+		if ((Interface->Class    == CDC_CSCP_CDCDataClass)   &&
+		    (Interface->SubClass == CDC_CSCP_NoDataSubclass) &&
+		    (Interface->Protocol == CDC_CSCP_NoDataProtocol))
+		{
+			return DESCRIPTOR_SEARCH_Found;
+		}
+	}
+
+	return DESCRIPTOR_SEARCH_NotFound;
+}
+
+static uint8_t DCOMP_RNDIS_Host_NextRNDISInterfaceEndpoint(void* const CurrentDescriptor)
+{
+	USB_Descriptor_Header_t* Header = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Header_t);
+
+	if (Header->Type == DTYPE_Endpoint)
+	{
+		USB_Descriptor_Endpoint_t* Endpoint = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Endpoint_t);
+
+		uint8_t EndpointType = (Endpoint->Attributes & EP_TYPE_MASK);
+
+		if (((EndpointType == EP_TYPE_BULK) || (EndpointType == EP_TYPE_INTERRUPT)) &&
+		    !(Pipe_IsEndpointBound(Endpoint->EndpointAddress)))
+		{
+			return DESCRIPTOR_SEARCH_Found;
+		}
+	}
+	else if (Header->Type == DTYPE_Interface)
+	{
+		return DESCRIPTOR_SEARCH_Fail;
+	}
+
+	return DESCRIPTOR_SEARCH_NotFound;
+}
+
+static uint8_t RNDIS_SendEncapsulatedCommand(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfaceInfo,
+                                             void* Buffer,
+                                             const uint16_t Length)
+{
+	USB_ControlRequest = (USB_Request_Header_t)
+		{
+			.bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE),
+			.bRequest      = RNDIS_REQ_SendEncapsulatedCommand,
+			.wValue        = 0,
+			.wIndex        = RNDISInterfaceInfo->State.ControlInterfaceNumber,
+			.wLength       = Length,
+		};
+
+	Pipe_SelectPipe(PIPE_CONTROLPIPE);
+
+	return USB_Host_SendControlRequest(Buffer);
+}
+
+static uint8_t RNDIS_GetEncapsulatedResponse(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfaceInfo,
+                                             void* Buffer,
+                                             const uint16_t Length)
+{
+	USB_ControlRequest = (USB_Request_Header_t)
+		{
+			.bmRequestType = (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE),
+			.bRequest      = RNDIS_REQ_GetEncapsulatedResponse,
+			.wValue        = 0,
+			.wIndex        = RNDISInterfaceInfo->State.ControlInterfaceNumber,
+			.wLength       = Length,
+		};
+
+	Pipe_SelectPipe(PIPE_CONTROLPIPE);
+
+	return USB_Host_SendControlRequest(Buffer);
+}
+
+uint8_t RNDIS_Host_SendKeepAlive(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfaceInfo)
+{
+	uint8_t ErrorCode;
+
+	RNDIS_KeepAlive_Message_t  KeepAliveMessage;
+	RNDIS_KeepAlive_Complete_t KeepAliveMessageResponse;
+
+	KeepAliveMessage.MessageType     = CPU_TO_LE32(REMOTE_NDIS_KEEPALIVE_MSG);
+	KeepAliveMessage.MessageLength   = CPU_TO_LE32(sizeof(RNDIS_KeepAlive_Message_t));
+	KeepAliveMessage.RequestId       = cpu_to_le32(RNDISInterfaceInfo->State.RequestID++);
+
+	if ((ErrorCode = RNDIS_SendEncapsulatedCommand(RNDISInterfaceInfo, &KeepAliveMessage,
+	                                               sizeof(RNDIS_KeepAlive_Message_t))) != HOST_SENDCONTROL_Successful)
+	{
+		return ErrorCode;
+	}
+
+	if ((ErrorCode = RNDIS_GetEncapsulatedResponse(RNDISInterfaceInfo, &KeepAliveMessageResponse,
+	                                               sizeof(RNDIS_KeepAlive_Complete_t))) != HOST_SENDCONTROL_Successful)
+	{
+		return ErrorCode;
+	}
+
+	return HOST_SENDCONTROL_Successful;
+}
+
+uint8_t RNDIS_Host_InitializeDevice(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfaceInfo)
+{
+	uint8_t ErrorCode;
+
+	RNDIS_Initialize_Message_t  InitMessage;
+	RNDIS_Initialize_Complete_t InitMessageResponse;
+
+	InitMessage.MessageType     = CPU_TO_LE32(REMOTE_NDIS_INITIALIZE_MSG);
+	InitMessage.MessageLength   = CPU_TO_LE32(sizeof(RNDIS_Initialize_Message_t));
+	InitMessage.RequestId       = cpu_to_le32(RNDISInterfaceInfo->State.RequestID++);
+
+	InitMessage.MajorVersion    = CPU_TO_LE32(REMOTE_NDIS_VERSION_MAJOR);
+	InitMessage.MinorVersion    = CPU_TO_LE32(REMOTE_NDIS_VERSION_MINOR);
+	InitMessage.MaxTransferSize = cpu_to_le32(RNDISInterfaceInfo->Config.HostMaxPacketSize);
+
+	if ((ErrorCode = RNDIS_SendEncapsulatedCommand(RNDISInterfaceInfo, &InitMessage,
+	                                               sizeof(RNDIS_Initialize_Message_t))) != HOST_SENDCONTROL_Successful)
+	{
+		return ErrorCode;
+	}
+
+	if ((ErrorCode = RNDIS_GetEncapsulatedResponse(RNDISInterfaceInfo, &InitMessageResponse,
+	                                               sizeof(RNDIS_Initialize_Complete_t))) != HOST_SENDCONTROL_Successful)
+	{
+		return ErrorCode;
+	}
+
+	if (InitMessageResponse.Status != CPU_TO_LE32(REMOTE_NDIS_STATUS_SUCCESS))
+	  return RNDIS_ERROR_LOGICAL_CMD_FAILED;
+
+	RNDISInterfaceInfo->State.DeviceMaxPacketSize = le32_to_cpu(InitMessageResponse.MaxTransferSize);
+
+	return HOST_SENDCONTROL_Successful;
+}
+
+uint8_t RNDIS_Host_SetRNDISProperty(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfaceInfo,
+                                    const uint32_t Oid,
+                                    void* Buffer,
+                                    const uint16_t Length)
+{
+	uint8_t ErrorCode;
+
+	struct
+	{
+		RNDIS_Set_Message_t SetMessage;
+		uint8_t             ContiguousBuffer[Length];
+	} SetMessageData;
+
+	RNDIS_Set_Complete_t SetMessageResponse;
+
+	SetMessageData.SetMessage.MessageType    = CPU_TO_LE32(REMOTE_NDIS_SET_MSG);
+	SetMessageData.SetMessage.MessageLength  = cpu_to_le32(sizeof(RNDIS_Set_Message_t) + Length);
+	SetMessageData.SetMessage.RequestId      = cpu_to_le32(RNDISInterfaceInfo->State.RequestID++);
+
+	SetMessageData.SetMessage.Oid            = cpu_to_le32(Oid);
+	SetMessageData.SetMessage.InformationBufferLength = cpu_to_le32(Length);
+	SetMessageData.SetMessage.InformationBufferOffset = CPU_TO_LE32(sizeof(RNDIS_Set_Message_t) - sizeof(RNDIS_Message_Header_t));
+	SetMessageData.SetMessage.DeviceVcHandle = CPU_TO_LE32(0);
+
+	memcpy(&SetMessageData.ContiguousBuffer, Buffer, Length);
+
+	if ((ErrorCode = RNDIS_SendEncapsulatedCommand(RNDISInterfaceInfo, &SetMessageData,
+	                                               (sizeof(RNDIS_Set_Message_t) + Length))) != HOST_SENDCONTROL_Successful)
+	{
+		return ErrorCode;
+	}
+
+	if ((ErrorCode = RNDIS_GetEncapsulatedResponse(RNDISInterfaceInfo, &SetMessageResponse,
+	                                               sizeof(RNDIS_Set_Complete_t))) != HOST_SENDCONTROL_Successful)
+	{
+		return ErrorCode;
+	}
+
+	if (SetMessageResponse.Status != CPU_TO_LE32(REMOTE_NDIS_STATUS_SUCCESS))
+	  return RNDIS_ERROR_LOGICAL_CMD_FAILED;
+
+	return HOST_SENDCONTROL_Successful;
+}
+
+uint8_t RNDIS_Host_QueryRNDISProperty(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfaceInfo,
+                                      const uint32_t Oid,
+                                      void* Buffer,
+                                      const uint16_t MaxLength)
+{
+	uint8_t ErrorCode;
+
+	RNDIS_Query_Message_t QueryMessage;
+
+	struct
+	{
+		RNDIS_Query_Complete_t QueryMessageResponse;
+		uint8_t                ContiguousBuffer[MaxLength];
+	} QueryMessageResponseData;
+
+	QueryMessage.MessageType    = CPU_TO_LE32(REMOTE_NDIS_QUERY_MSG);
+	QueryMessage.MessageLength  = CPU_TO_LE32(sizeof(RNDIS_Query_Message_t));
+	QueryMessage.RequestId      = cpu_to_le32(RNDISInterfaceInfo->State.RequestID++);
+
+	QueryMessage.Oid            = cpu_to_le32(Oid);
+	QueryMessage.InformationBufferLength = CPU_TO_LE32(0);
+	QueryMessage.InformationBufferOffset = CPU_TO_LE32(0);
+	QueryMessage.DeviceVcHandle = CPU_TO_LE32(0);
+
+	if ((ErrorCode = RNDIS_SendEncapsulatedCommand(RNDISInterfaceInfo, &QueryMessage,
+	                                               sizeof(RNDIS_Query_Message_t))) != HOST_SENDCONTROL_Successful)
+	{
+		return ErrorCode;
+	}
+
+	if ((ErrorCode = RNDIS_GetEncapsulatedResponse(RNDISInterfaceInfo, &QueryMessageResponseData,
+	                                               sizeof(QueryMessageResponseData))) != HOST_SENDCONTROL_Successful)
+	{
+		return ErrorCode;
+	}
+
+	if (QueryMessageResponseData.QueryMessageResponse.Status != CPU_TO_LE32(REMOTE_NDIS_STATUS_SUCCESS))
+	  return RNDIS_ERROR_LOGICAL_CMD_FAILED;
+
+	memcpy(Buffer, &QueryMessageResponseData.ContiguousBuffer, MaxLength);
+
+	return HOST_SENDCONTROL_Successful;
+}
+
+bool RNDIS_Host_IsPacketReceived(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfaceInfo)
+{
+	bool PacketWaiting;
+
+	if ((USB_HostState != HOST_STATE_Configured) || !(RNDISInterfaceInfo->State.IsActive))
+	  return false;
+
+	Pipe_SelectPipe(RNDISInterfaceInfo->Config.DataINPipe.Address);
+
+	Pipe_Unfreeze();
+	PacketWaiting = Pipe_IsINReceived();
+	Pipe_Freeze();
+
+	return PacketWaiting;
+}
+
+uint8_t RNDIS_Host_ReadPacket(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfaceInfo,
+                              void* Buffer,
+                              uint16_t* const PacketLength)
+{
+	uint8_t ErrorCode;
+
+	if ((USB_HostState != HOST_STATE_Configured) || !(RNDISInterfaceInfo->State.IsActive))
+	  return PIPE_READYWAIT_DeviceDisconnected;
+
+	Pipe_SelectPipe(RNDISInterfaceInfo->Config.DataINPipe.Address);
+	Pipe_Unfreeze();
+
+	if (!(Pipe_IsReadWriteAllowed()))
+	{
+		if (Pipe_IsINReceived())
+		  Pipe_ClearIN();
+
+		*PacketLength = 0;
+		Pipe_Freeze();
+		return PIPE_RWSTREAM_NoError;
+	}
+
+	RNDIS_Packet_Message_t DeviceMessage;
+
+	if ((ErrorCode = Pipe_Read_Stream_LE(&DeviceMessage, sizeof(RNDIS_Packet_Message_t),
+	                                     NULL)) != PIPE_RWSTREAM_NoError)
+	{
+		return ErrorCode;
+	}
+
+	*PacketLength = (uint16_t)le32_to_cpu(DeviceMessage.DataLength);
+
+	Pipe_Discard_Stream(le32_to_cpu(DeviceMessage.DataOffset) -
+	                    (sizeof(RNDIS_Packet_Message_t) - sizeof(RNDIS_Message_Header_t)),
+	                    NULL);
+
+	Pipe_Read_Stream_LE(Buffer, *PacketLength, NULL);
+
+	if (!(Pipe_BytesInPipe()))
+	  Pipe_ClearIN();
+
+	Pipe_Freeze();
+
+	return PIPE_RWSTREAM_NoError;
+}
+
+uint8_t RNDIS_Host_SendPacket(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfaceInfo,
+                              void* Buffer,
+                              const uint16_t PacketLength)
+{
+	uint8_t ErrorCode;
+
+	if ((USB_HostState != HOST_STATE_Configured) || !(RNDISInterfaceInfo->State.IsActive))
+	  return PIPE_READYWAIT_DeviceDisconnected;
+
+	RNDIS_Packet_Message_t DeviceMessage;
+
+	memset(&DeviceMessage, 0, sizeof(RNDIS_Packet_Message_t));
+	DeviceMessage.MessageType   = CPU_TO_LE32(REMOTE_NDIS_PACKET_MSG);
+	DeviceMessage.MessageLength = CPU_TO_LE32(sizeof(RNDIS_Packet_Message_t) + PacketLength);
+	DeviceMessage.DataOffset    = CPU_TO_LE32(sizeof(RNDIS_Packet_Message_t) - sizeof(RNDIS_Message_Header_t));
+	DeviceMessage.DataLength    = cpu_to_le32(PacketLength);
+
+	Pipe_SelectPipe(RNDISInterfaceInfo->Config.DataOUTPipe.Address);
+	Pipe_Unfreeze();
+
+	if ((ErrorCode = Pipe_Write_Stream_LE(&DeviceMessage, sizeof(RNDIS_Packet_Message_t),
+	                                      NULL)) != PIPE_RWSTREAM_NoError)
+	{
+		return ErrorCode;
+	}
+
+	Pipe_Write_Stream_LE(Buffer, PacketLength, NULL);
+	Pipe_ClearOUT();
+
+	Pipe_Freeze();
+
+	return PIPE_RWSTREAM_NoError;
+}
+
+#endif
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Host/RNDISClassHost.h b/lib/lufa/LUFA/Drivers/USB/Class/Host/RNDISClassHost.h
new file mode 100644
index 0000000000..bddbc247a8
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Class/Host/RNDISClassHost.h
@@ -0,0 +1,270 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Host mode driver for the library USB RNDIS Class driver.
+ *
+ *  Host mode driver for the library USB RNDIS Class driver.
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the USB module driver
+ *        dispatch header located in LUFA/Drivers/USB.h.
+ */
+
+/** \ingroup Group_USBClassRNDIS
+ *  \defgroup Group_USBClassRNDISHost RNDIS Class Host Mode Driver
+ *
+ *  \section Sec_USBClassRNDISHost_Dependencies Module Source Dependencies
+ *  The following files must be built with any user project that uses this module:
+ *    - LUFA/Drivers/USB/Class/Host/RNDISClassHost.c <i>(Makefile source module name: LUFA_SRC_USBCLASS)</i>
+ *
+ *  \section Sec_USBClassRNDISHost_ModDescription Module Description
+ *  Host Mode USB Class driver framework interface, for the Microsoft RNDIS Ethernet
+ *  USB Class driver.
+ *
+ *  @{
+ */
+
+#ifndef __RNDIS_CLASS_HOST_H__
+#define __RNDIS_CLASS_HOST_H__
+
+	/* Includes: */
+		#include "../../USB.h"
+		#include "../Common/RNDISClassCommon.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_RNDIS_DRIVER)
+			#error Do not include this file directly. Include LUFA/Drivers/USB.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Type Defines: */
+			/** \brief RNDIS Class Host Mode Configuration and State Structure.
+			 *
+			 *  Class state structure. An instance of this structure should be made within the user application,
+			 *  and passed to each of the RNDIS class driver functions as the \c RNDISInterfaceInfo parameter. This
+			 *  stores each RNDIS interface's configuration and state information.
+			 */
+			typedef struct
+			{
+				struct
+				{
+					USB_Pipe_Table_t DataINPipe; /**< Data IN Pipe configuration table. */
+					USB_Pipe_Table_t DataOUTPipe; /**< Data OUT Pipe configuration table. */
+					USB_Pipe_Table_t NotificationPipe; /**< Notification IN Pipe configuration table. */
+
+					uint32_t HostMaxPacketSize; /**< Maximum size of a packet which can be buffered by the host. */
+				} Config; /**< Config data for the USB class interface within the device. All elements in this section
+				           *   <b>must</b> be set or the interface will fail to enumerate and operate correctly.
+				           */
+				struct
+				{
+					bool IsActive; /**< Indicates if the current interface instance is connected to an attached device, valid
+					                *   after \ref RNDIS_Host_ConfigurePipes() is called and the Host state machine is in the
+					                *   Configured state.
+					                */
+					uint8_t ControlInterfaceNumber; /**< Interface index of the RNDIS control interface within the attached device. */
+
+					uint32_t DeviceMaxPacketSize; /**< Maximum size of a packet which can be buffered by the attached RNDIS device. */
+
+					uint32_t RequestID; /**< Request ID counter to give a unique ID for each command/response pair. */
+				} State; /**< State data for the USB class interface within the device. All elements in this section
+						  *   <b>may</b> be set to initial values, but may also be ignored to default to sane values when
+						  *   the interface is enumerated.
+						  */
+			} USB_ClassInfo_RNDIS_Host_t;
+
+		/* Enums: */
+			/** Enum for the possible error codes returned by the \ref RNDIS_Host_ConfigurePipes() function. */
+			enum RNDIS_Host_EnumerationFailure_ErrorCodes_t
+			{
+				RNDIS_ENUMERROR_NoError                    = 0, /**< Configuration Descriptor was processed successfully. */
+				RNDIS_ENUMERROR_InvalidConfigDescriptor    = 1, /**< The device returned an invalid Configuration Descriptor. */
+				RNDIS_ENUMERROR_NoCompatibleInterfaceFound = 2, /**< A compatible RNDIS interface was not found in the device's Configuration Descriptor. */
+				RNDIS_ENUMERROR_PipeConfigurationFailed    = 3, /**< One or more pipes for the specified interface could not be configured correctly. */
+			};
+
+		/* Function Prototypes: */
+			/** Host interface configuration routine, to configure a given RNDIS host interface instance using the Configuration
+			 *  Descriptor read from an attached USB device. This function automatically updates the given RNDIS Host instance's
+			 *  state values and configures the pipes required to communicate with the interface if it is found within the device.
+			 *  This should be called once after the stack has enumerated the attached device, while the host state machine is in
+			 *  the Addressed state.
+			 *
+			 *  \param[in,out] RNDISInterfaceInfo    Pointer to a structure containing an RNDIS Class host configuration and state.
+			 *  \param[in]     ConfigDescriptorSize  Length of the attached device's Configuration Descriptor.
+			 *  \param[in]     ConfigDescriptorData  Pointer to a buffer containing the attached device's Configuration Descriptor.
+			 *
+			 *  \return A value from the \ref RNDIS_Host_EnumerationFailure_ErrorCodes_t enum.
+			 */
+			uint8_t RNDIS_Host_ConfigurePipes(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfaceInfo,
+			                                  uint16_t ConfigDescriptorSize,
+			                                  void* ConfigDescriptorData) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(3);
+
+			/** Sends a RNDIS KEEPALIVE command to the device, to ensure that it does not enter standby mode after periods
+			 *  of long inactivity.
+			 *
+			 *  \param[in,out] RNDISInterfaceInfo  Pointer to a structure containing an RNDIS Class host configuration and state.
+			 *
+			 *  \return A value from the \ref USB_Host_SendControlErrorCodes_t enum or \ref RNDIS_ERROR_LOGICAL_CMD_FAILED if the device returned a
+			 *          logical command failure.
+			 */
+			uint8_t RNDIS_Host_SendKeepAlive(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Initializes the attached RNDIS device's RNDIS interface. This should be called after the device's pipes have been
+			 *  configured via the call to \ref RNDIS_Host_ConfigurePipes().
+			 *
+			 *  \param[in,out] RNDISInterfaceInfo  Pointer to a structure containing an RNDIS Class host configuration and state.
+			 *
+			 *  \return A value from the \ref USB_Host_SendControlErrorCodes_t enum or \ref RNDIS_ERROR_LOGICAL_CMD_FAILED if the
+			 *          device returned a logical command failure.
+			 */
+			uint8_t RNDIS_Host_InitializeDevice(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Sets a given RNDIS property of an attached RNDIS device.
+			 *
+			 *  \param[in,out] RNDISInterfaceInfo  Pointer to a structure containing an RNDIS Class host configuration and state.
+			 *  \param[in]     Oid                 OID number of the parameter to set.
+			 *  \param[in]     Buffer              Pointer to where the property data is to be sourced from.
+			 *  \param[in]     Length              Length in bytes of the property data to sent to the device.
+			 *
+			 *  \return A value from the \ref USB_Host_SendControlErrorCodes_t enum or \ref RNDIS_ERROR_LOGICAL_CMD_FAILED if the
+			 *          device returned a logical command failure.
+			 */
+			uint8_t RNDIS_Host_SetRNDISProperty(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfaceInfo,
+			                                    const uint32_t Oid,
+			                                    void* Buffer,
+			                                    const uint16_t Length) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(3);
+
+			/** Gets a given RNDIS property of an attached RNDIS device.
+			 *
+			 *  \param[in,out] RNDISInterfaceInfo  Pointer to a structure containing an RNDIS Class host configuration and state.
+			 *  \param[in]     Oid                 OID number of the parameter to get.
+			 *  \param[in]     Buffer              Pointer to where the property data is to be written to.
+			 *  \param[in]     MaxLength           Length in bytes of the destination buffer size.
+			 *
+			 *  \return A value from the \ref USB_Host_SendControlErrorCodes_t enum or \ref RNDIS_ERROR_LOGICAL_CMD_FAILED if the
+			 *          device returned a logical command failure.
+			 */
+			uint8_t RNDIS_Host_QueryRNDISProperty(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfaceInfo,
+			                                      const uint32_t Oid,
+			                                      void* Buffer,
+			                                      const uint16_t MaxLength) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(3);
+
+			/** Determines if a packet is currently waiting for the host to read in and process.
+			 *
+			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the
+			 *       call will fail.
+			 *
+			 *  \param[in,out] RNDISInterfaceInfo  Pointer to a structure containing an RNDIS Class host configuration and state.
+			 *
+			 *  \return Boolean \c true if a packet is waiting to be read in by the host, \c false otherwise.
+			 */
+			bool RNDIS_Host_IsPacketReceived(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Retrieves the next pending packet from the device, discarding the remainder of the RNDIS packet header to leave
+			 *  only the packet contents for processing by the host in the nominated buffer.
+			 *
+			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the
+			 *       call will fail.
+			 *
+			 *  \param[in,out] RNDISInterfaceInfo  Pointer to a structure containing an RNDIS Class host configuration and state.
+			 *  \param[out]    Buffer              Pointer to a buffer where the packer data is to be written to.
+			 *  \param[out]    PacketLength        Pointer to where the length in bytes of the read packet is to be stored.
+			 *
+			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t RNDIS_Host_ReadPacket(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfaceInfo,
+			                              void* Buffer,
+			                              uint16_t* const PacketLength) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2)
+			                              ATTR_NON_NULL_PTR_ARG(3);
+
+			/** Sends the given packet to the attached RNDIS device, after adding a RNDIS packet message header.
+			 *
+			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the
+			 *       call will fail.
+			 *
+			 *  \param[in,out] RNDISInterfaceInfo  Pointer to a structure containing an RNDIS Class host configuration and state.
+			 *  \param[in]     Buffer              Pointer to a buffer where the packer data is to be read from.
+			 *  \param[in]     PacketLength        Length in bytes of the packet to send.
+			 *
+			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t RNDIS_Host_SendPacket(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfaceInfo,
+			                              void* Buffer,
+			                              const uint16_t PacketLength) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2);
+
+		/* Inline Functions: */
+			/** General management task for a given RNDIS host class interface, required for the correct operation of the interface. This should
+			 *  be called frequently in the main program loop, before the master USB management task \ref USB_USBTask().
+			 *
+			 *  \param[in,out] RNDISInterfaceInfo  Pointer to a structure containing an RNDIS Class host configuration and state.
+			 */
+			static inline void RNDIS_Host_USBTask(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1) ATTR_ALWAYS_INLINE;
+			static inline void RNDIS_Host_USBTask(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfaceInfo)
+			{
+				(void)RNDISInterfaceInfo;
+			}
+
+	/* Private Interface - For use in library only: */
+	#if !defined(__DOXYGEN__)
+		/* Function Prototypes: */
+			#if defined(__INCLUDE_FROM_RNDIS_HOST_C)
+				static uint8_t RNDIS_SendEncapsulatedCommand(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfaceInfo,
+				                                             void* Buffer,
+				                                             const uint16_t Length) ATTR_NON_NULL_PTR_ARG(1)
+				                                             ATTR_NON_NULL_PTR_ARG(2);
+				static uint8_t RNDIS_GetEncapsulatedResponse(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfaceInfo,
+				                                             void* Buffer,
+				                                             const uint16_t Length) ATTR_NON_NULL_PTR_ARG(1)
+				                                             ATTR_NON_NULL_PTR_ARG(2);
+
+				static uint8_t DCOMP_RNDIS_Host_NextRNDISControlInterface(void* const CurrentDescriptor)
+				                                                          ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(1);
+				static uint8_t DCOMP_RNDIS_Host_NextRNDISDataInterface(void* const CurrentDescriptor)
+				                                                       ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(1);
+				static uint8_t DCOMP_RNDIS_Host_NextRNDISInterfaceEndpoint(void* const CurrentDescriptor)
+				                                                           ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(1);
+			#endif
+	#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Host/StillImageClassHost.c b/lib/lufa/LUFA/Drivers/USB/Class/Host/StillImageClassHost.c
new file mode 100644
index 0000000000..ef33d9be40
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Class/Host/StillImageClassHost.c
@@ -0,0 +1,436 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+#define  __INCLUDE_FROM_USB_DRIVER
+#include "../../Core/USBMode.h"
+
+#if defined(USB_CAN_BE_HOST)
+
+#define  __INCLUDE_FROM_SI_DRIVER
+#define  __INCLUDE_FROM_STILLIMAGE_HOST_C
+#include "StillImageClassHost.h"
+
+uint8_t SI_Host_ConfigurePipes(USB_ClassInfo_SI_Host_t* const SIInterfaceInfo,
+                               uint16_t ConfigDescriptorSize,
+                               void* ConfigDescriptorData)
+{
+	USB_Descriptor_Endpoint_t*  DataINEndpoint      = NULL;
+	USB_Descriptor_Endpoint_t*  DataOUTEndpoint     = NULL;
+	USB_Descriptor_Endpoint_t*  EventsEndpoint      = NULL;
+	USB_Descriptor_Interface_t* StillImageInterface = NULL;
+
+	memset(&SIInterfaceInfo->State, 0x00, sizeof(SIInterfaceInfo->State));
+
+	if (DESCRIPTOR_TYPE(ConfigDescriptorData) != DTYPE_Configuration)
+	  return SI_ENUMERROR_InvalidConfigDescriptor;
+
+	while (!(DataINEndpoint) || !(DataOUTEndpoint) || !(EventsEndpoint))
+	{
+		if (!(StillImageInterface) ||
+		    USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData,
+		                              DCOMP_SI_Host_NextSIInterfaceEndpoint) != DESCRIPTOR_SEARCH_COMP_Found)
+		{
+			if (USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData,
+			                              DCOMP_SI_Host_NextSIInterface) != DESCRIPTOR_SEARCH_COMP_Found)
+			{
+				return SI_ENUMERROR_NoCompatibleInterfaceFound;
+			}
+
+			StillImageInterface = DESCRIPTOR_PCAST(ConfigDescriptorData, USB_Descriptor_Interface_t);
+
+			DataINEndpoint  = NULL;
+			DataOUTEndpoint = NULL;
+			EventsEndpoint  = NULL;
+
+			continue;
+		}
+
+		USB_Descriptor_Endpoint_t* EndpointData = DESCRIPTOR_PCAST(ConfigDescriptorData, USB_Descriptor_Endpoint_t);
+
+		if ((EndpointData->EndpointAddress & ENDPOINT_DIR_MASK) == ENDPOINT_DIR_IN)
+		{
+			if ((EndpointData->Attributes & EP_TYPE_MASK) == EP_TYPE_INTERRUPT)
+			  EventsEndpoint = EndpointData;
+			else
+			  DataINEndpoint = EndpointData;
+		}
+		else
+		{
+			DataOUTEndpoint = EndpointData;
+		}
+	}
+
+	SIInterfaceInfo->Config.DataINPipe.Size  = le16_to_cpu(DataINEndpoint->EndpointSize);
+	SIInterfaceInfo->Config.DataINPipe.EndpointAddress = DataINEndpoint->EndpointAddress;
+	SIInterfaceInfo->Config.DataINPipe.Type  = EP_TYPE_BULK;
+
+	SIInterfaceInfo->Config.DataOUTPipe.Size = le16_to_cpu(DataOUTEndpoint->EndpointSize);
+	SIInterfaceInfo->Config.DataOUTPipe.EndpointAddress = DataOUTEndpoint->EndpointAddress;
+	SIInterfaceInfo->Config.DataOUTPipe.Type = EP_TYPE_BULK;
+
+	SIInterfaceInfo->Config.EventsPipe.Size = le16_to_cpu(EventsEndpoint->EndpointSize);
+	SIInterfaceInfo->Config.EventsPipe.EndpointAddress = EventsEndpoint->EndpointAddress;
+	SIInterfaceInfo->Config.EventsPipe.Type = EP_TYPE_INTERRUPT;
+
+	if (!(Pipe_ConfigurePipeTable(&SIInterfaceInfo->Config.DataINPipe, 1)))
+	  return SI_ENUMERROR_PipeConfigurationFailed;
+
+	if (!(Pipe_ConfigurePipeTable(&SIInterfaceInfo->Config.DataOUTPipe, 1)))
+	  return SI_ENUMERROR_PipeConfigurationFailed;
+
+	if (!(Pipe_ConfigurePipeTable(&SIInterfaceInfo->Config.EventsPipe, 1)))
+	  return SI_ENUMERROR_PipeConfigurationFailed;
+
+	SIInterfaceInfo->State.InterfaceNumber = StillImageInterface->InterfaceNumber;
+	SIInterfaceInfo->State.IsActive = true;
+
+	return SI_ENUMERROR_NoError;
+}
+
+uint8_t DCOMP_SI_Host_NextSIInterface(void* const CurrentDescriptor)
+{
+	USB_Descriptor_Header_t* Header = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Header_t);
+
+	if (Header->Type == DTYPE_Interface)
+	{
+		USB_Descriptor_Interface_t* Interface = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Interface_t);
+
+		if ((Interface->Class    == SI_CSCP_StillImageClass)    &&
+		    (Interface->SubClass == SI_CSCP_StillImageSubclass) &&
+		    (Interface->Protocol == SI_CSCP_BulkOnlyProtocol))
+		{
+			return DESCRIPTOR_SEARCH_Found;
+		}
+	}
+
+	return DESCRIPTOR_SEARCH_NotFound;
+}
+
+uint8_t DCOMP_SI_Host_NextSIInterfaceEndpoint(void* const CurrentDescriptor)
+{
+	USB_Descriptor_Header_t* Header = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Header_t);
+
+	if (Header->Type == DTYPE_Endpoint)
+	{
+		USB_Descriptor_Endpoint_t* Endpoint = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Endpoint_t);
+
+		uint8_t EndpointType = (Endpoint->Attributes & EP_TYPE_MASK);
+
+		if (((EndpointType == EP_TYPE_BULK) || (EndpointType == EP_TYPE_INTERRUPT)) &&
+		    (!(Pipe_IsEndpointBound(Endpoint->EndpointAddress))))
+		{
+			return DESCRIPTOR_SEARCH_Found;
+		}
+	}
+	else if (Header->Type == DTYPE_Interface)
+	{
+		return DESCRIPTOR_SEARCH_Fail;
+	}
+
+	return DESCRIPTOR_SEARCH_NotFound;
+}
+
+uint8_t SI_Host_SendBlockHeader(USB_ClassInfo_SI_Host_t* const SIInterfaceInfo,
+                                PIMA_Container_t* const PIMAHeader)
+{
+	uint8_t ErrorCode;
+
+	if ((USB_HostState != HOST_STATE_Configured) || !(SIInterfaceInfo->State.IsActive))
+	  return PIPE_RWSTREAM_DeviceDisconnected;
+
+	if (SIInterfaceInfo->State.IsSessionOpen)
+	  PIMAHeader->TransactionID = cpu_to_le32(SIInterfaceInfo->State.TransactionID++);
+
+	Pipe_SelectPipe(SIInterfaceInfo->Config.DataOUTPipe.Address);
+	Pipe_Unfreeze();
+
+	if ((ErrorCode = Pipe_Write_Stream_LE(PIMAHeader, PIMA_COMMAND_SIZE(0), NULL)) != PIPE_RWSTREAM_NoError)
+	  return ErrorCode;
+
+	uint8_t ParamBytes = (PIMAHeader->DataLength - PIMA_COMMAND_SIZE(0));
+
+	if (ParamBytes)
+	{
+		if ((ErrorCode = Pipe_Write_Stream_LE(&PIMAHeader->Params, ParamBytes, NULL)) != PIPE_RWSTREAM_NoError)
+		  return ErrorCode;
+	}
+
+	Pipe_ClearOUT();
+	Pipe_Freeze();
+
+	return PIPE_RWSTREAM_NoError;
+}
+
+uint8_t SI_Host_ReceiveBlockHeader(USB_ClassInfo_SI_Host_t* const SIInterfaceInfo,
+                                   PIMA_Container_t* const PIMAHeader)
+{
+	uint16_t TimeoutMSRem        = SI_COMMAND_DATA_TIMEOUT_MS;
+	uint16_t PreviousFrameNumber = USB_Host_GetFrameNumber();
+
+	if ((USB_HostState != HOST_STATE_Configured) || !(SIInterfaceInfo->State.IsActive))
+	  return PIPE_RWSTREAM_DeviceDisconnected;
+
+	Pipe_SelectPipe(SIInterfaceInfo->Config.DataINPipe.Address);
+	Pipe_Unfreeze();
+
+	while (!(Pipe_IsINReceived()))
+	{
+		uint16_t CurrentFrameNumber = USB_Host_GetFrameNumber();
+
+		if (CurrentFrameNumber != PreviousFrameNumber)
+		{
+			PreviousFrameNumber = CurrentFrameNumber;
+
+			if (!(TimeoutMSRem--))
+			  return PIPE_RWSTREAM_Timeout;
+		}
+
+		Pipe_Freeze();
+		Pipe_SelectPipe(SIInterfaceInfo->Config.DataOUTPipe.Address);
+		Pipe_Unfreeze();
+
+		if (Pipe_IsStalled())
+		{
+			USB_Host_ClearEndpointStall(Pipe_GetBoundEndpointAddress());
+			return PIPE_RWSTREAM_PipeStalled;
+		}
+
+		Pipe_Freeze();
+		Pipe_SelectPipe(SIInterfaceInfo->Config.DataINPipe.Address);
+		Pipe_Unfreeze();
+
+		if (Pipe_IsStalled())
+		{
+			USB_Host_ClearEndpointStall(Pipe_GetBoundEndpointAddress());
+			return PIPE_RWSTREAM_PipeStalled;
+		}
+
+		if (USB_HostState == HOST_STATE_Unattached)
+		  return PIPE_RWSTREAM_DeviceDisconnected;
+	}
+
+	Pipe_Read_Stream_LE(PIMAHeader, PIMA_COMMAND_SIZE(0), NULL);
+
+	if (PIMAHeader->Type == CPU_TO_LE16(PIMA_CONTAINER_ResponseBlock))
+	{
+		uint8_t ParamBytes = (PIMAHeader->DataLength - PIMA_COMMAND_SIZE(0));
+
+		if (ParamBytes)
+		  Pipe_Read_Stream_LE(&PIMAHeader->Params, ParamBytes, NULL);
+
+		Pipe_ClearIN();
+	}
+
+	Pipe_Freeze();
+
+	return PIPE_RWSTREAM_NoError;
+}
+
+uint8_t SI_Host_SendData(USB_ClassInfo_SI_Host_t* const SIInterfaceInfo,
+                         const void* Buffer,
+                         const uint16_t Bytes)
+{
+	uint8_t ErrorCode;
+
+	if ((USB_HostState != HOST_STATE_Configured) || !(SIInterfaceInfo->State.IsActive))
+	  return PIPE_RWSTREAM_DeviceDisconnected;
+
+	Pipe_SelectPipe(SIInterfaceInfo->Config.DataOUTPipe.Address);
+	Pipe_Unfreeze();
+
+	ErrorCode = Pipe_Write_Stream_LE(Buffer, Bytes, NULL);
+
+	Pipe_ClearOUT();
+	Pipe_Freeze();
+
+	return ErrorCode;
+}
+
+uint8_t SI_Host_ReadData(USB_ClassInfo_SI_Host_t* const SIInterfaceInfo,
+                         void* Buffer,
+                         const uint16_t Bytes)
+{
+	uint8_t ErrorCode;
+
+	if ((USB_HostState != HOST_STATE_Configured) || !(SIInterfaceInfo->State.IsActive))
+	  return PIPE_RWSTREAM_DeviceDisconnected;
+
+	Pipe_SelectPipe(SIInterfaceInfo->Config.DataINPipe.Address);
+	Pipe_Unfreeze();
+
+	ErrorCode = Pipe_Read_Stream_LE(Buffer, Bytes, NULL);
+
+	Pipe_Freeze();
+
+	return ErrorCode;
+}
+
+bool SI_Host_IsEventReceived(USB_ClassInfo_SI_Host_t* const SIInterfaceInfo)
+{
+	bool IsEventReceived = false;
+
+	if ((USB_HostState != HOST_STATE_Configured) || !(SIInterfaceInfo->State.IsActive))
+	  return false;
+
+	Pipe_SelectPipe(SIInterfaceInfo->Config.EventsPipe.Address);
+	Pipe_Unfreeze();
+
+	if (Pipe_IsINReceived())
+	  IsEventReceived = true;
+
+	Pipe_Freeze();
+
+	return IsEventReceived;
+}
+
+uint8_t SI_Host_ReceiveEventHeader(USB_ClassInfo_SI_Host_t* const SIInterfaceInfo,
+                                   PIMA_Container_t* const PIMAHeader)
+{
+	uint8_t ErrorCode;
+
+	if ((USB_HostState != HOST_STATE_Configured) || !(SIInterfaceInfo->State.IsActive))
+	  return PIPE_RWSTREAM_DeviceDisconnected;
+
+	Pipe_SelectPipe(SIInterfaceInfo->Config.EventsPipe.Address);
+	Pipe_Unfreeze();
+
+	ErrorCode = Pipe_Read_Stream_LE(PIMAHeader, sizeof(PIMA_Container_t), NULL);
+
+	Pipe_ClearIN();
+	Pipe_Freeze();
+
+	return ErrorCode;
+}
+
+uint8_t SI_Host_OpenSession(USB_ClassInfo_SI_Host_t* const SIInterfaceInfo)
+{
+	if ((USB_HostState != HOST_STATE_Configured) || !(SIInterfaceInfo->State.IsActive))
+	  return PIPE_RWSTREAM_DeviceDisconnected;
+
+	uint8_t ErrorCode;
+
+	SIInterfaceInfo->State.TransactionID = 0;
+	SIInterfaceInfo->State.IsSessionOpen = false;
+
+	PIMA_Container_t PIMABlock = (PIMA_Container_t)
+		{
+			.DataLength    = CPU_TO_LE32(PIMA_COMMAND_SIZE(1)),
+			.Type          = CPU_TO_LE16(PIMA_CONTAINER_CommandBlock),
+			.Code          = CPU_TO_LE16(0x1002),
+			.Params        = {CPU_TO_LE32(1)},
+		};
+
+	if ((ErrorCode = SI_Host_SendBlockHeader(SIInterfaceInfo, &PIMABlock)) != PIPE_RWSTREAM_NoError)
+	  return ErrorCode;
+
+	if ((ErrorCode = SI_Host_ReceiveBlockHeader(SIInterfaceInfo, &PIMABlock)) != PIPE_RWSTREAM_NoError)
+	  return ErrorCode;
+
+	if ((PIMABlock.Type != CPU_TO_LE16(PIMA_CONTAINER_ResponseBlock)) || (PIMABlock.Code != CPU_TO_LE16(0x2001)))
+	  return SI_ERROR_LOGICAL_CMD_FAILED;
+
+	SIInterfaceInfo->State.IsSessionOpen = true;
+
+	return PIPE_RWSTREAM_NoError;
+}
+
+uint8_t SI_Host_CloseSession(USB_ClassInfo_SI_Host_t* const SIInterfaceInfo)
+{
+	if ((USB_HostState != HOST_STATE_Configured) || !(SIInterfaceInfo->State.IsActive))
+	  return PIPE_RWSTREAM_DeviceDisconnected;
+
+	uint8_t ErrorCode;
+
+	PIMA_Container_t PIMABlock = (PIMA_Container_t)
+		{
+			.DataLength    = CPU_TO_LE32(PIMA_COMMAND_SIZE(1)),
+			.Type          = CPU_TO_LE16(PIMA_CONTAINER_CommandBlock),
+			.Code          = CPU_TO_LE16(0x1003),
+			.Params        = {CPU_TO_LE32(1)},
+		};
+
+	if ((ErrorCode = SI_Host_SendBlockHeader(SIInterfaceInfo, &PIMABlock)) != PIPE_RWSTREAM_NoError)
+	  return ErrorCode;
+
+	if ((ErrorCode = SI_Host_ReceiveBlockHeader(SIInterfaceInfo, &PIMABlock)) != PIPE_RWSTREAM_NoError)
+	  return ErrorCode;
+
+	SIInterfaceInfo->State.IsSessionOpen = false;
+
+	if ((PIMABlock.Type != CPU_TO_LE16(PIMA_CONTAINER_ResponseBlock)) || (PIMABlock.Code != CPU_TO_LE16(0x2001)))
+	  return SI_ERROR_LOGICAL_CMD_FAILED;
+
+	return PIPE_RWSTREAM_NoError;
+}
+
+uint8_t SI_Host_SendCommand(USB_ClassInfo_SI_Host_t* const SIInterfaceInfo,
+                            const uint16_t Operation,
+                            const uint8_t TotalParams,
+                            uint32_t* const Params)
+{
+	if ((USB_HostState != HOST_STATE_Configured) || !(SIInterfaceInfo->State.IsActive))
+	  return PIPE_RWSTREAM_DeviceDisconnected;
+
+	uint8_t ErrorCode;
+
+	PIMA_Container_t PIMABlock = (PIMA_Container_t)
+		{
+			.DataLength    = cpu_to_le32(PIMA_COMMAND_SIZE(TotalParams)),
+			.Type          = CPU_TO_LE16(PIMA_CONTAINER_CommandBlock),
+			.Code          = cpu_to_le16(Operation),
+		};
+
+	memcpy(&PIMABlock.Params, Params, sizeof(uint32_t) * TotalParams);
+
+	if ((ErrorCode = SI_Host_SendBlockHeader(SIInterfaceInfo, &PIMABlock)) != PIPE_RWSTREAM_NoError)
+	  return ErrorCode;
+
+	return PIPE_RWSTREAM_NoError;
+}
+
+uint8_t SI_Host_ReceiveResponse(USB_ClassInfo_SI_Host_t* const SIInterfaceInfo)
+{
+	uint8_t ErrorCode;
+	PIMA_Container_t PIMABlock;
+
+	if ((USB_HostState != HOST_STATE_Configured) || !(SIInterfaceInfo->State.IsActive))
+	  return PIPE_RWSTREAM_DeviceDisconnected;
+
+	if ((ErrorCode = SI_Host_ReceiveBlockHeader(SIInterfaceInfo, &PIMABlock)) != PIPE_RWSTREAM_NoError)
+	  return ErrorCode;
+
+	if ((PIMABlock.Type != CPU_TO_LE16(PIMA_CONTAINER_ResponseBlock)) || (PIMABlock.Code != CPU_TO_LE16(0x2001)))
+	  return SI_ERROR_LOGICAL_CMD_FAILED;
+
+	return PIPE_RWSTREAM_NoError;
+}
+
+#endif
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Host/StillImageClassHost.h b/lib/lufa/LUFA/Drivers/USB/Class/Host/StillImageClassHost.h
new file mode 100644
index 0000000000..ababdb09a6
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Class/Host/StillImageClassHost.h
@@ -0,0 +1,317 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Host mode driver for the library USB Still Image Class driver.
+ *
+ *  Host mode driver for the library USB Still Image Class driver.
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the USB module driver
+ *        dispatch header located in LUFA/Drivers/USB.h.
+ */
+
+/** \ingroup Group_USBClassSI
+ *  \defgroup Group_USBClassStillImageHost Still Image Class Host Mode Driver
+ *
+ *  \section Sec_USBClassStillImageHost_Dependencies Module Source Dependencies
+ *  The following files must be built with any user project that uses this module:
+ *    - LUFA/Drivers/USB/Class/Host/StillImageClassHost.c <i>(Makefile source module name: LUFA_SRC_USBCLASS)</i>
+ *
+ *  \section Sec_USBClassStillImageHost_ModDescription Module Description
+ *  Host Mode USB Class driver framework interface, for the Still Image USB Class driver.
+ *
+ *  @{
+ */
+
+#ifndef __SI_CLASS_HOST_H__
+#define __SI_CLASS_HOST_H__
+
+	/* Includes: */
+		#include "../../USB.h"
+		#include "../Common/StillImageClassCommon.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_SI_DRIVER)
+			#error Do not include this file directly. Include LUFA/Drivers/USB.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Error code for some Still Image Host functions, indicating a logical (and not hardware) error. */
+			#define SI_ERROR_LOGICAL_CMD_FAILED              0x80
+
+		/* Type Defines: */
+			/** \brief Still Image Class Host Mode Configuration and State Structure.
+			 *
+			 *  Class state structure. An instance of this structure should be made within the user application,
+			 *  and passed to each of the Still Image class driver functions as the \c SIInterfaceInfo parameter. This
+			 *  stores each Still Image interface's configuration and state information.
+			 */
+			typedef struct
+			{
+				struct
+				{
+					USB_Pipe_Table_t DataINPipe; /**< Data IN Pipe configuration table. */
+					USB_Pipe_Table_t DataOUTPipe; /**< Data OUT Pipe configuration table. */
+					USB_Pipe_Table_t EventsPipe; /**< Event notification IN Pipe configuration table. */
+				} Config; /**< Config data for the USB class interface within the device. All elements in this section
+				           *   <b>must</b> be set or the interface will fail to enumerate and operate correctly.
+				           */
+				struct
+				{
+					bool     IsActive; /**< Indicates if the current interface instance is connected to an attached device, valid
+					                    *   after \ref SI_Host_ConfigurePipes() is called and the Host state machine is in the
+					                    *   Configured state.
+					                    */
+					uint8_t  InterfaceNumber; /**< Interface index of the Still Image interface within the attached device. */
+
+					bool IsSessionOpen; /**< Indicates if a PIMA session is currently open with the attached device. */
+					uint32_t TransactionID; /**< Transaction ID for the next transaction to send to the device. */
+				} State; /**< State data for the USB class interface within the device. All elements in this section
+						  *   <b>may</b> be set to initial values, but may also be ignored to default to sane values when
+						  *   the interface is enumerated.
+						  */
+			} USB_ClassInfo_SI_Host_t;
+
+		/* Enums: */
+			/** Enum for the possible error codes returned by the \ref SI_Host_ConfigurePipes() function. */
+			enum SI_Host_EnumerationFailure_ErrorCodes_t
+			{
+				SI_ENUMERROR_NoError                    = 0, /**< Configuration Descriptor was processed successfully. */
+				SI_ENUMERROR_InvalidConfigDescriptor    = 1, /**< The device returned an invalid Configuration Descriptor. */
+				SI_ENUMERROR_NoCompatibleInterfaceFound = 2, /**< A compatible Still Image interface was not found in the device's
+				                                              *   Configuration Descriptor.
+				                                              */
+				SI_ENUMERROR_PipeConfigurationFailed    = 3, /**< One or more pipes for the specified interface could not be configured correctly. */
+			};
+
+		/* Function Prototypes: */
+			/** Host interface configuration routine, to configure a given Still Image host interface instance using the
+			 *  Configuration Descriptor read from an attached USB device. This function automatically updates the given Still
+			 *  Image Host instance's state values and configures the pipes required to communicate with the interface if it is
+			 *  found within the device. This should be called once after the stack has enumerated the attached device, while
+			 *  the host state machine is in the Addressed state.
+			 *
+			 *  \param[in,out] SIInterfaceInfo       Pointer to a structure containing a Still Image Class host configuration and state.
+			 *  \param[in]     ConfigDescriptorSize  Length of the attached device's Configuration Descriptor.
+			 *  \param[in]     ConfigDescriptorData  Pointer to a buffer containing the attached device's Configuration Descriptor.
+			 *
+			 *  \return A value from the \ref SI_Host_EnumerationFailure_ErrorCodes_t enum.
+			 */
+			uint8_t SI_Host_ConfigurePipes(USB_ClassInfo_SI_Host_t* const SIInterfaceInfo,
+			                               uint16_t ConfigDescriptorSize,
+			                               void* ConfigDescriptorData) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(3);
+
+			/** Opens a new PIMA session with the attached device. This should be used before any session-orientated PIMA commands
+			 *  are issued to the device. Only one session can be open at the one time.
+			 *
+			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the
+			 *       call will fail.
+			 *
+			 *  \param[in,out] SIInterfaceInfo  Pointer to a structure containing a Still Image Class host configuration and state.
+			 *
+			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum, or \ref SI_ERROR_LOGICAL_CMD_FAILED if the device
+			 *          returned a logical command failure.
+			 */
+			uint8_t SI_Host_OpenSession(USB_ClassInfo_SI_Host_t* const SIInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Closes an already opened PIMA session with the attached device. This should be used after all session-orientated
+			 *  PIMA commands have been issued to the device.
+			 *
+			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the
+			 *       call will fail.
+			 *
+			 *  \param[in,out] SIInterfaceInfo  Pointer to a structure containing a Still Image Class host configuration and state.
+			 *
+			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum, or \ref SI_ERROR_LOGICAL_CMD_FAILED if the device
+			 *          returned a logical command failure.
+			 */
+			uint8_t SI_Host_CloseSession(USB_ClassInfo_SI_Host_t* const SIInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Sends a raw PIMA block header to the device, filling out the transaction ID automatically. This can be used to send
+			 *  arbitrary PIMA blocks to the device with or without parameters.
+			 *
+			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the
+			 *       call will fail.
+			 *
+			 *  \param[in,out] SIInterfaceInfo  Pointer to a structure containing a Still Image Class host configuration and state.
+			 *  \param[in]     PIMAHeader       Pointer to a PIMA container structure that is to be sent.
+			 *
+			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t SI_Host_SendBlockHeader(USB_ClassInfo_SI_Host_t* const SIInterfaceInfo,
+			                                PIMA_Container_t* const PIMAHeader) ATTR_NON_NULL_PTR_ARG(1)
+			                                ATTR_NON_NULL_PTR_ARG(2);
+
+			/** Receives a raw PIMA block header from the device. This can be used to receive arbitrary PIMA blocks from the device with
+			 *  or without parameters.
+			 *
+			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the
+			 *       call will fail.
+			 *
+			 *  \param[in,out] SIInterfaceInfo  Pointer to a structure containing a Still Image Class host configuration and state.
+			 *  \param[out]    PIMAHeader       Pointer to a PIMA container structure where the received block is to be stored.
+			 *
+			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t SI_Host_ReceiveBlockHeader(USB_ClassInfo_SI_Host_t* const SIInterfaceInfo,
+			                                   PIMA_Container_t* const PIMAHeader) ATTR_NON_NULL_PTR_ARG(1)
+			                                   ATTR_NON_NULL_PTR_ARG(2);
+
+			/** Sends a given PIMA command to the attached device, filling out the PIMA command header's Transaction ID automatically.
+			 *
+			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the
+			 *       call will fail.
+			 *
+			 *  \param[in,out] SIInterfaceInfo  Pointer to a structure containing a Still Image Class host configuration and state.
+			 *  \param[in]     Operation        PIMA operation code to issue to the device.
+			 *  \param[in]     TotalParams      Total number of 32-bit parameters to send to the device in the issued command block.
+			 *  \param[in]     Params           Pointer to an array of 32-bit values containing the parameters to send in the command block.
+			 *
+			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum, or \ref SI_ERROR_LOGICAL_CMD_FAILED if the device
+			 *          returned a logical command failure.
+			 */
+			uint8_t SI_Host_SendCommand(USB_ClassInfo_SI_Host_t* const SIInterfaceInfo,
+			                            const uint16_t Operation,
+			                            const uint8_t TotalParams,
+			                            uint32_t* const Params) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Receives and checks a response block from the attached Still Image device, once a command has been issued and all data
+			 *  associated with the command has been transferred.
+			 *
+			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the
+			 *       call will fail.
+			 *
+			 *  \param[in,out] SIInterfaceInfo  Pointer to a structure containing a Still Image Class host configuration and state.
+			 *
+			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum, or \ref SI_ERROR_LOGICAL_CMD_FAILED if the device
+			 *          returned a logical command failure.
+			 */
+			uint8_t SI_Host_ReceiveResponse(USB_ClassInfo_SI_Host_t* const SIInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Indicates if the device has issued a PIMA event block to the host via the asynchronous events pipe.
+			 *
+			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the
+			 *       call will fail.
+			 *
+			 *  \param[in,out] SIInterfaceInfo  Pointer to a structure containing a Still Image Class host configuration and state.
+			 *
+			 *  \return Boolean \c true if an event is waiting to be read, \c false otherwise.
+			 */
+			bool SI_Host_IsEventReceived(USB_ClassInfo_SI_Host_t* const SIInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Receives an asynchronous event block from the device via the asynchronous events pipe.
+			 *
+			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the
+			 *       call will fail.
+			 *
+			 *  \param[in,out] SIInterfaceInfo  Pointer to a structure containing a Still Image Class host configuration and state.
+			 *  \param[out]    PIMAHeader       Pointer to a PIMA container structure where the event should be stored.
+			 *
+			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum, or \ref SI_ERROR_LOGICAL_CMD_FAILED if the device
+			 *          returned a logical command failure.
+			 */
+			uint8_t SI_Host_ReceiveEventHeader(USB_ClassInfo_SI_Host_t* const SIInterfaceInfo,
+			                                   PIMA_Container_t* const PIMAHeader) ATTR_NON_NULL_PTR_ARG(1)
+			                                   ATTR_NON_NULL_PTR_ARG(2);
+
+			/** Sends arbitrary data to the attached device, for use in the data phase of PIMA commands which require data
+			 *  transfer beyond the regular PIMA command block parameters.
+			 *
+			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the
+			 *       call will fail.
+			 *
+			 *  \param[in,out] SIInterfaceInfo  Pointer to a structure containing a Still Image Class host configuration and state.
+			 *  \param[in]     Buffer           Pointer to a buffer where the data to send has been stored.
+			 *  \param[in]     Bytes            Length in bytes of the data in the buffer to send to the attached device.
+			 *
+			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t SI_Host_SendData(USB_ClassInfo_SI_Host_t* const SIInterfaceInfo,
+			                         const void* Buffer,
+			                         const uint16_t Bytes) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2);
+
+			/** Receives arbitrary data from the attached device, for use in the data phase of PIMA commands which require data
+			 *  transfer beyond the regular PIMA command block parameters.
+			 *
+			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the
+			 *       call will fail.
+			 *
+			 *  \param[in,out] SIInterfaceInfo  Pointer to a structure containing a Still Image Class host configuration and state.
+			 *  \param[out]    Buffer           Pointer to a buffer where the received data is to be stored.
+			 *  \param[in]     Bytes            Length in bytes of the data to read.
+			 *
+			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t SI_Host_ReadData(USB_ClassInfo_SI_Host_t* const SIInterfaceInfo,
+			                         void* Buffer,
+			                         const uint16_t Bytes) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2);
+
+		/* Inline Functions: */
+			/** General management task for a given Still Image host class interface, required for the correct operation of the
+			 *  interface. This should be called frequently in the main program loop, before the master USB management task
+			 *  \ref USB_USBTask().
+			 *
+			 *  \param[in,out] SIInterfaceInfo  Pointer to a structure containing a Still Image Class host configuration and state.
+			 */
+			static inline void SI_Host_USBTask(USB_ClassInfo_SI_Host_t* const SIInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1) ATTR_ALWAYS_INLINE;
+			static inline void SI_Host_USBTask(USB_ClassInfo_SI_Host_t* const SIInterfaceInfo)
+			{
+				(void)SIInterfaceInfo;
+			}
+
+	/* Private Interface - For use in library only: */
+	#if !defined(__DOXYGEN__)
+		/* Macros: */
+			#define SI_COMMAND_DATA_TIMEOUT_MS        10000
+
+		/* Function Prototypes: */
+			#if defined(__INCLUDE_FROM_STILLIMAGE_HOST_C)
+				static uint8_t DCOMP_SI_Host_NextSIInterface(void* const CurrentDescriptor)
+				                                             ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(1);
+				static uint8_t DCOMP_SI_Host_NextSIInterfaceEndpoint(void* const CurrentDescriptor)
+				                                                     ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(1);
+			#endif
+	#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Class/MIDIClass.h b/lib/lufa/LUFA/Drivers/USB/Class/MIDIClass.h
new file mode 100644
index 0000000000..a35ae13aa0
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Class/MIDIClass.h
@@ -0,0 +1,84 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Master include file for the library USB MIDI Class driver.
+ *
+ *  Master include file for the library USB MIDI Class driver, for both host and device modes, where available.
+ *
+ *  This file should be included in all user projects making use of this optional class driver, instead of
+ *  including any headers in the USB/ClassDriver/Device, USB/ClassDriver/Host or USB/ClassDriver/Common subdirectories.
+ */
+
+/** \ingroup Group_USBClassDrivers
+ *  \defgroup Group_USBClassMIDI MIDI Class Driver
+ *  \brief USB class driver for the USB-IF MIDI class standard.
+ *
+ *  \section Sec_USBClassMIDI_Dependencies Module Source Dependencies
+ *  The following files must be built with any user project that uses this module:
+ *    - LUFA/Drivers/USB/Class/Device/MIDIClassDevice.c <i>(Makefile source module name: LUFA_SRC_USBCLASS)</i>
+ *    - LUFA/Drivers/USB/Class/Host/MIDIClassHost.c <i>(Makefile source module name: LUFA_SRC_USBCLASS)</i>
+ *
+ *  \section Sec_USBClassMIDI_ModDescription Module Description
+ *  MIDI Class Driver module. This module contains an internal implementation of the USB MIDI Class, for both Device
+ *  and Host USB modes. User applications can use this class driver instead of implementing the MIDI class manually
+ *  via the low-level LUFA APIs.
+ *
+ *  This module is designed to simplify the user code by exposing only the required interface needed to interface with
+ *  Hosts or Devices using the USB MIDI Class.
+ *
+ *  \note The USB MIDI class is actually a special case of the regular Audio class, thus this module depends on
+ *        structure definitions from the \ref Group_USBClassAudioDevice class driver module.
+ *
+ *  @{
+ */
+
+#ifndef _MIDI_CLASS_H_
+#define _MIDI_CLASS_H_
+
+	/* Macros: */
+		#define __INCLUDE_FROM_USB_DRIVER
+		#define __INCLUDE_FROM_MIDI_DRIVER
+
+	/* Includes: */
+		#include "../Core/USBMode.h"
+
+		#if defined(USB_CAN_BE_DEVICE)
+			#include "Device/MIDIClassDevice.h"
+		#endif
+
+		#if defined(USB_CAN_BE_HOST)
+			#include "Host/MIDIClassHost.h"
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Class/MassStorageClass.h b/lib/lufa/LUFA/Drivers/USB/Class/MassStorageClass.h
new file mode 100644
index 0000000000..fa41fbf817
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Class/MassStorageClass.h
@@ -0,0 +1,81 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Master include file for the library USB Mass Storage Class driver.
+ *
+ *  Master include file for the library USB Mass Storage Class driver, for both host and device modes, where available.
+ *
+ *  This file should be included in all user projects making use of this optional class driver, instead of
+ *  including any headers in the USB/ClassDriver/Device, USB/ClassDriver/Host or USB/ClassDriver/Common subdirectories.
+ */
+
+/** \ingroup Group_USBClassDrivers
+ *  \defgroup Group_USBClassMS Mass Storage Class Driver
+ *  \brief USB class driver for the USB-IF Bulk-Only Transport Mass Storage class standard.
+ *
+ *  \section Sec_USBClassMS_Dependencies Module Source Dependencies
+ *  The following files must be built with any user project that uses this module:
+ *    - LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.c <i>(Makefile source module name: LUFA_SRC_USBCLASS)</i>
+ *    - LUFA/Drivers/USB/Class/Host/MassStorageClassHost.c <i>(Makefile source module name: LUFA_SRC_USBCLASS)</i>
+ *
+ *  \section Sec_USBClassMS_ModDescription Module Description
+ *  Mass Storage Class Driver module. This module contains an internal implementation of the USB Mass Storage Class, for both
+ *  Device and Host USB modes. User applications can use this class driver instead of implementing the Mass Storage class
+ *  manually via the low-level LUFA APIs.
+ *
+ *  This module is designed to simplify the user code by exposing only the required interface needed to interface with
+ *  Hosts or Devices using the USB Mass Storage Class.
+ *
+ *  @{
+ */
+
+#ifndef _MS_CLASS_H_
+#define _MS_CLASS_H_
+
+	/* Macros: */
+		#define __INCLUDE_FROM_USB_DRIVER
+		#define __INCLUDE_FROM_MS_DRIVER
+
+	/* Includes: */
+		#include "../Core/USBMode.h"
+
+		#if defined(USB_CAN_BE_DEVICE)
+			#include "Device/MassStorageClassDevice.h"
+		#endif
+
+		#if defined(USB_CAN_BE_HOST)
+			#include "Host/MassStorageClassHost.h"
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Class/PrinterClass.h b/lib/lufa/LUFA/Drivers/USB/Class/PrinterClass.h
new file mode 100644
index 0000000000..78ad52068a
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Class/PrinterClass.h
@@ -0,0 +1,83 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Master include file for the library USB Printer Class driver.
+ *
+ *  Master include file for the library USB Printer Class driver, for both host and device modes, where available.
+ *
+ *  This file should be included in all user projects making use of this optional class driver, instead of
+ *  including any headers in the USB/ClassDriver/Device, USB/ClassDriver/Host or USB/ClassDriver/Common subdirectories.
+ */
+
+/** \ingroup Group_USBClassDrivers
+ *  \defgroup Group_USBClassPrinter Printer Class Driver
+ *  \brief USB class driver for the USB-IF Printer class standard.
+ *
+ *  \section Sec_USBClassPrinter_Dependencies Module Source Dependencies
+ *  The following files must be built with any user project that uses this module:
+ *    - LUFA/Drivers/USB/Class/Host/PrinterClassDevice.c <i>(Makefile source module name: LUFA_SRC_USBCLASS)</i>
+ *    - LUFA/Drivers/USB/Class/Host/PrinterClassHost.c <i>(Makefile source module name: LUFA_SRC_USBCLASS)</i>
+ *
+ *  \section Sec_USBClassPrinter_ModDescription Module Description
+ *  Printer Class Driver module. This module contains an internal implementation of the USB Printer Class, for the base
+ *  USB Printer transport layer for USB Host mode only. Note that printers are free to implement whatever printer language
+ *  they choose on top of this (e.g. Postscript), and so this driver exposes low level data transport functions only rather
+ *  than high level raster or text functions. User applications can use this class driver instead of implementing the Printer
+ *  class manually via the low-level LUFA APIs.
+ *
+ *  This module is designed to simplify the user code by exposing only the required interface needed to interface with
+ *  Devices using the USB Printer Class.
+ *
+ *  @{
+ */
+
+#ifndef _PRINTER_CLASS_H_
+#define _PRINTER_CLASS_H_
+
+	/* Macros: */
+		#define __INCLUDE_FROM_USB_DRIVER
+		#define __INCLUDE_FROM_PRINTER_DRIVER
+
+	/* Includes: */
+		#include "../Core/USBMode.h"
+
+		#if defined(USB_CAN_BE_DEVICE)
+			#include "Device/PrinterClassDevice.h"
+		#endif
+
+		#if defined(USB_CAN_BE_HOST)
+			#include "Host/PrinterClassHost.h"
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Class/RNDISClass.h b/lib/lufa/LUFA/Drivers/USB/Class/RNDISClass.h
new file mode 100644
index 0000000000..07b4f56270
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Class/RNDISClass.h
@@ -0,0 +1,81 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Master include file for the library USB RNDIS Class driver.
+ *
+ *  Master include file for the library USB RNDIS Class driver, for both host and device modes, where available.
+ *
+ *  This file should be included in all user projects making use of this optional class driver, instead of
+ *  including any headers in the USB/ClassDriver/Device, USB/ClassDriver/Host or USB/ClassDriver/Common subdirectories.
+ */
+
+/** \ingroup Group_USBClassDrivers
+ *  \defgroup Group_USBClassRNDIS RNDIS (Networking) Class Driver
+ *  \brief USB class driver for the Microsoft Remote Network Driver Interface Specification (RNDIS) class standard.
+ *
+ *  \section Sec_USBClassRNDIS_Dependencies Module Source Dependencies
+ *  The following files must be built with any user project that uses this module:
+ *    - LUFA/Drivers/USB/Class/Device/RNDISClassDevice.c <i>(Makefile source module name: LUFA_SRC_USBCLASS)</i>
+ *    - LUFA/Drivers/USB/Class/Host/RNDISClassHost.c <i>(Makefile source module name: LUFA_SRC_USBCLASS)</i>
+ *
+ *  \section Sec_USBClassRNDIS_ModDescription Module Description
+ *  RNDIS Class Driver module. This module contains an internal implementation of the Microsoft USB RNDIS Networking
+ *  Class, for both Device and Host USB modes. User applications can use this class driver instead of implementing the
+ *  RNDIS class manually via the low-level LUFA APIs.
+ *
+ *  This module is designed to simplify the user code by exposing only the required interface needed to interface with
+ *  Hosts using the USB RNDIS Class.
+ *
+ *  @{
+ */
+
+#ifndef _RNDIS_CLASS_H_
+#define _RNDIS_CLASS_H_
+
+	/* Macros: */
+		#define __INCLUDE_FROM_USB_DRIVER
+		#define __INCLUDE_FROM_RNDIS_DRIVER
+
+	/* Includes: */
+		#include "../Core/USBMode.h"
+
+		#if defined(USB_CAN_BE_DEVICE)
+			#include "Device/RNDISClassDevice.h"
+		#endif
+
+		#if defined(USB_CAN_BE_HOST)
+			#include "Host/RNDISClassHost.h"
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Class/StillImageClass.h b/lib/lufa/LUFA/Drivers/USB/Class/StillImageClass.h
new file mode 100644
index 0000000000..7cb8b4fcf6
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Class/StillImageClass.h
@@ -0,0 +1,76 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Master include file for the library USB Still Image Class driver.
+ *
+ *  Master include file for the library USB Still Image Class driver, for both host and device modes, where available.
+ *
+ *  This file should be included in all user projects making use of this optional class driver, instead of
+ *  including any headers in the USB/ClassDriver/Device, USB/ClassDriver/Host or USB/ClassDriver/Common subdirectories.
+ */
+
+/** \ingroup Group_USBClassDrivers
+ *  \defgroup Group_USBClassSI Still Image Class Driver
+ *  \brief USB class driver for the USB-IF Still Image (PIMA-compliant) class standard.
+ *
+ *  \section Sec_USBClassSI_Dependencies Module Source Dependencies
+ *  The following files must be built with any user project that uses this module:
+ *    - LUFA/Drivers/USB/Class/Host/StillImageClassHost.c <i>(Makefile source module name: LUFA_SRC_USBCLASS)</i>
+ *
+ *  \section Sec_USBClassSI_ModDescription Module Description
+ *  Still Image Class Driver module. This module contains an internal implementation of the USB Still Image Class,
+ *  for USB Host mode only. User applications can use this class driver instead of implementing the Still Image class
+ *  manually via the low-level LUFA APIs.
+ *
+ *  This module is designed to simplify the user code by exposing only the required interface needed to interface with
+ *  Devices using the USB Still Image Class.
+ *
+ *  @{
+ */
+
+#ifndef _SI_CLASS_H_
+#define _SI_CLASS_H_
+
+	/* Macros: */
+		#define __INCLUDE_FROM_USB_DRIVER
+		#define __INCLUDE_FROM_SI_DRIVER
+
+	/* Includes: */
+		#include "../Core/USBMode.h"
+
+		#if defined(USB_CAN_BE_HOST)
+			#include "Host/StillImageClassHost.h"
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Core/AVR8/Device_AVR8.c b/lib/lufa/LUFA/Drivers/USB/Core/AVR8/Device_AVR8.c
new file mode 100644
index 0000000000..f972b0bcc5
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Core/AVR8/Device_AVR8.c
@@ -0,0 +1,57 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+#include "../../../../Common/Common.h"
+#if (ARCH == ARCH_AVR8)
+
+#define  __INCLUDE_FROM_USB_DRIVER
+#include "../USBMode.h"
+
+#if defined(USB_CAN_BE_DEVICE)
+
+#include "../Device.h"
+
+void USB_Device_SendRemoteWakeup(void)
+{
+	if (!(USB_Options & USB_OPT_MANUAL_PLL))
+	{
+		USB_PLL_On();
+		while (!(USB_PLL_IsReady()));
+	}
+
+	USB_CLK_Unfreeze();
+
+	UDCON |= (1 << RMWKUP);
+	while (UDCON & (1 << RMWKUP));
+}
+
+#endif
+
+#endif
diff --git a/lib/lufa/LUFA/Drivers/USB/Core/AVR8/Device_AVR8.h b/lib/lufa/LUFA/Drivers/USB/Core/AVR8/Device_AVR8.h
new file mode 100644
index 0000000000..69f9be593e
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Core/AVR8/Device_AVR8.h
@@ -0,0 +1,269 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief USB Device definitions for the AVR8 microcontrollers.
+ *  \copydetails Group_Device_AVR8
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the USB driver
+ *        dispatch header located in LUFA/Drivers/USB/USB.h.
+ */
+
+/** \ingroup Group_Device
+ *  \defgroup Group_Device_AVR8 Device Management (AVR8)
+ *  \brief USB Device definitions for the AVR8 microcontrollers.
+ *
+ *  Architecture specific USB Device definitions for the Atmel 8-bit AVR microcontrollers.
+ *
+ *  @{
+ */
+
+#ifndef __USBDEVICE_AVR8_H__
+#define __USBDEVICE_AVR8_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+		#include "../USBController.h"
+		#include "../StdDescriptors.h"
+		#include "../USBInterrupt.h"
+		#include "../Endpoint.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_USB_DRIVER)
+			#error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.
+		#endif
+
+		#if (defined(USE_RAM_DESCRIPTORS) && defined(USE_EEPROM_DESCRIPTORS))
+			#error USE_RAM_DESCRIPTORS and USE_EEPROM_DESCRIPTORS are mutually exclusive.
+		#endif
+
+		#if (defined(USE_FLASH_DESCRIPTORS) && defined(USE_EEPROM_DESCRIPTORS))
+			#error USE_FLASH_DESCRIPTORS and USE_EEPROM_DESCRIPTORS are mutually exclusive.
+		#endif
+
+		#if (defined(USE_FLASH_DESCRIPTORS) && defined(USE_RAM_DESCRIPTORS))
+			#error USE_FLASH_DESCRIPTORS and USE_RAM_DESCRIPTORS are mutually exclusive.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** \name USB Device Mode Option Masks */
+			//@{
+			#if defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR) || defined(__DOXYGEN__)
+				/** Mask for the Options parameter of the \ref USB_Init() function. This indicates that the
+				 *  USB interface should be initialized in low speed (1.5Mb/s) mode.
+				 *
+				 *  \note Low Speed mode is not available on all USB AVR models.
+				 *        \n
+				 *
+				 *  \note Restrictions apply on the number, size and type of endpoints which can be used
+				 *        when running in low speed mode - please refer to the USB 2.0 specification.
+				 */
+				#define USB_DEVICE_OPT_LOWSPEED            (1 << 0)
+			#endif
+
+			/** Mask for the Options parameter of the \ref USB_Init() function. This indicates that the
+			 *  USB interface should be initialized in full speed (12Mb/s) mode.
+			 */
+			#define USB_DEVICE_OPT_FULLSPEED               (0 << 0)
+			//@}
+
+			#if (!defined(NO_INTERNAL_SERIAL) && \
+			     (defined(USB_SERIES_7_AVR) || defined(USB_SERIES_6_AVR) || \
+			      defined(USB_SERIES_4_AVR) || defined(USB_SERIES_2_AVR) || \
+				  defined(__DOXYGEN__)))
+				/** String descriptor index for the device's unique serial number string descriptor within the device.
+				 *  This unique serial number is used by the host to associate resources to the device (such as drivers or COM port
+				 *  number allocations) to a device regardless of the port it is plugged in to on the host. Some microcontrollers contain
+				 *  a unique serial number internally, and setting the device descriptors serial number string index to this value
+				 *  will cause it to use the internal serial number.
+				 *
+				 *  On unsupported devices, this will evaluate to \ref NO_DESCRIPTOR and so will force the host to create a pseudo-serial
+				 *  number for the device.
+				 */
+				#define USE_INTERNAL_SERIAL            0xDC
+
+				/** Length of the device's unique internal serial number, in bits, if present on the selected microcontroller
+				 *  model.
+				 */
+				#define INTERNAL_SERIAL_LENGTH_BITS    80
+
+				/** Start address of the internal serial number, in the appropriate address space, if present on the selected microcontroller
+				 *  model.
+				 */
+				#define INTERNAL_SERIAL_START_ADDRESS  0x0E
+			#else
+				#define USE_INTERNAL_SERIAL            NO_DESCRIPTOR
+
+				#define INTERNAL_SERIAL_LENGTH_BITS    0
+				#define INTERNAL_SERIAL_START_ADDRESS  0
+			#endif
+
+		/* Function Prototypes: */
+			/** Sends a Remote Wakeup request to the host. This signals to the host that the device should
+			 *  be taken out of suspended mode, and communications should resume.
+			 *
+			 *  Typically, this is implemented so that HID devices (mice, keyboards, etc.) can wake up the
+			 *  host computer when the host has suspended all USB devices to enter a low power state.
+			 *
+			 *  \attention This function should only be used if the device has indicated to the host that it
+			 *             supports the Remote Wakeup feature in the device descriptors, and should only be
+			 *             issued if the host is currently allowing remote wakeup events from the device (i.e.,
+			 *             the \ref USB_Device_RemoteWakeupEnabled flag is set). When the \c NO_DEVICE_REMOTE_WAKEUP
+			 *             compile time option is used, this function is unavailable.
+			 *             \n\n
+			 *
+			 *  \attention The USB clock must be running for this function to operate. If the stack is initialized with
+			 *             the \ref USB_OPT_MANUAL_PLL option enabled, the user must ensure that the PLL is running
+			 *             before attempting to call this function.
+			 *
+			 *  \see \ref Group_StdDescriptors for more information on the RMWAKEUP feature and device descriptors.
+			 */
+			void USB_Device_SendRemoteWakeup(void);
+
+		/* Inline Functions: */
+			/** Returns the current USB frame number, when in device mode. Every millisecond the USB bus is active (i.e. enumerated to a host)
+			 *  the frame number is incremented by one.
+			 *
+			 *  \return Current USB frame number from the USB controller.
+			 */
+			static inline uint16_t USB_Device_GetFrameNumber(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT;
+			static inline uint16_t USB_Device_GetFrameNumber(void)
+			{
+				return UDFNUM;
+			}
+
+			#if !defined(NO_SOF_EVENTS)
+				/** Enables the device mode Start Of Frame events. When enabled, this causes the
+				 *  \ref EVENT_USB_Device_StartOfFrame() event to fire once per millisecond, synchronized to the USB bus,
+				 *  at the start of each USB frame when enumerated in device mode.
+				 *
+				 *  \note This function is not available when the \c NO_SOF_EVENTS compile time token is defined.
+				 */
+				static inline void USB_Device_EnableSOFEvents(void) ATTR_ALWAYS_INLINE;
+				static inline void USB_Device_EnableSOFEvents(void)
+				{
+					USB_INT_Enable(USB_INT_SOFI);
+				}
+
+				/** Disables the device mode Start Of Frame events. When disabled, this stops the firing of the
+				 *  \ref EVENT_USB_Device_StartOfFrame() event when enumerated in device mode.
+				 *
+				 *  \note This function is not available when the \c NO_SOF_EVENTS compile time token is defined.
+				 */
+				static inline void USB_Device_DisableSOFEvents(void) ATTR_ALWAYS_INLINE;
+				static inline void USB_Device_DisableSOFEvents(void)
+				{
+					USB_INT_Disable(USB_INT_SOFI);
+				}
+			#endif
+
+	/* Private Interface - For use in library only: */
+	#if !defined(__DOXYGEN__)
+		/* Inline Functions: */
+			#if defined(USB_DEVICE_OPT_LOWSPEED)
+			static inline void USB_Device_SetLowSpeed(void) ATTR_ALWAYS_INLINE;
+			static inline void USB_Device_SetLowSpeed(void)
+			{
+				UDCON |=  (1 << LSM);
+			}
+
+			static inline void USB_Device_SetFullSpeed(void) ATTR_ALWAYS_INLINE;
+			static inline void USB_Device_SetFullSpeed(void)
+			{
+				UDCON &= ~(1 << LSM);
+			}
+			#endif
+
+			static inline void USB_Device_SetDeviceAddress(const uint8_t Address) ATTR_ALWAYS_INLINE;
+			static inline void USB_Device_SetDeviceAddress(const uint8_t Address)
+			{
+				UDADDR = (UDADDR & (1 << ADDEN)) | (Address & 0x7F);
+			}
+
+			static inline void USB_Device_EnableDeviceAddress(const uint8_t Address) ATTR_ALWAYS_INLINE;
+			static inline void USB_Device_EnableDeviceAddress(const uint8_t Address)
+			{
+				(void)Address;
+
+				UDADDR |= (1 << ADDEN);
+			}
+
+			static inline bool USB_Device_IsAddressSet(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT;
+			static inline bool USB_Device_IsAddressSet(void)
+			{
+				return (UDADDR & (1 << ADDEN));
+			}
+
+			#if (USE_INTERNAL_SERIAL != NO_DESCRIPTOR)
+			static inline void USB_Device_GetSerialString(uint16_t* const UnicodeString) ATTR_NON_NULL_PTR_ARG(1);
+			static inline void USB_Device_GetSerialString(uint16_t* const UnicodeString)
+			{
+				uint_reg_t CurrentGlobalInt = GetGlobalInterruptMask();
+				GlobalInterruptDisable();
+
+				uint8_t SigReadAddress = INTERNAL_SERIAL_START_ADDRESS;
+
+				for (uint8_t SerialCharNum = 0; SerialCharNum < (INTERNAL_SERIAL_LENGTH_BITS / 4); SerialCharNum++)
+				{
+					uint8_t SerialByte = boot_signature_byte_get(SigReadAddress);
+
+					if (SerialCharNum & 0x01)
+					{
+						SerialByte >>= 4;
+						SigReadAddress++;
+					}
+
+					SerialByte &= 0x0F;
+
+					UnicodeString[SerialCharNum] = cpu_to_le16((SerialByte >= 10) ?
+															   (('A' - 10) + SerialByte) : ('0' + SerialByte));
+				}
+
+				SetGlobalInterruptMask(CurrentGlobalInt);
+			}
+			#endif
+
+	#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.c b/lib/lufa/LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.c
new file mode 100644
index 0000000000..8ffae15e19
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.c
@@ -0,0 +1,275 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+#include "../../../../Common/Common.h"
+#if (ARCH == ARCH_AVR8)
+
+#define  __INCLUDE_FROM_USB_DRIVER
+#include "../USBMode.h"
+
+#if defined(USB_CAN_BE_DEVICE)
+
+#include "EndpointStream_AVR8.h"
+
+#if !defined(CONTROL_ONLY_DEVICE)
+uint8_t Endpoint_Discard_Stream(uint16_t Length,
+                                uint16_t* const BytesProcessed)
+{
+	uint8_t  ErrorCode;
+	uint16_t BytesInTransfer = 0;
+
+	if ((ErrorCode = Endpoint_WaitUntilReady()))
+	  return ErrorCode;
+
+	if (BytesProcessed != NULL)
+	  Length -= *BytesProcessed;
+
+	while (Length)
+	{
+		if (!(Endpoint_IsReadWriteAllowed()))
+		{
+			Endpoint_ClearOUT();
+
+			if (BytesProcessed != NULL)
+			{
+				*BytesProcessed += BytesInTransfer;
+				return ENDPOINT_RWSTREAM_IncompleteTransfer;
+			}
+
+			if ((ErrorCode = Endpoint_WaitUntilReady()))
+			  return ErrorCode;
+		}
+		else
+		{
+			Endpoint_Discard_8();
+
+			Length--;
+			BytesInTransfer++;
+		}
+	}
+
+	return ENDPOINT_RWSTREAM_NoError;
+}
+
+uint8_t Endpoint_Null_Stream(uint16_t Length,
+                             uint16_t* const BytesProcessed)
+{
+	uint8_t  ErrorCode;
+	uint16_t BytesInTransfer = 0;
+
+	if ((ErrorCode = Endpoint_WaitUntilReady()))
+	  return ErrorCode;
+
+	if (BytesProcessed != NULL)
+	  Length -= *BytesProcessed;
+
+	while (Length)
+	{
+		if (!(Endpoint_IsReadWriteAllowed()))
+		{
+			Endpoint_ClearIN();
+
+			if (BytesProcessed != NULL)
+			{
+				*BytesProcessed += BytesInTransfer;
+				return ENDPOINT_RWSTREAM_IncompleteTransfer;
+			}
+
+			if ((ErrorCode = Endpoint_WaitUntilReady()))
+			  return ErrorCode;
+		}
+		else
+		{
+			Endpoint_Write_8(0);
+
+			Length--;
+			BytesInTransfer++;
+		}
+	}
+
+	return ENDPOINT_RWSTREAM_NoError;
+}
+
+/* The following abuses the C preprocessor in order to copy-paste common code with slight alterations,
+ * so that the code needs to be written once. It is a crude form of templating to reduce code maintenance. */
+
+#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_Stream_LE
+#define  TEMPLATE_BUFFER_TYPE                      const void*
+#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearIN()
+#define  TEMPLATE_BUFFER_OFFSET(Length)            0
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_8(*BufferPtr)
+#include "Template/Template_Endpoint_RW.c"
+
+#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_Stream_BE
+#define  TEMPLATE_BUFFER_TYPE                      const void*
+#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearIN()
+#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_8(*BufferPtr)
+#include "Template/Template_Endpoint_RW.c"
+
+#define  TEMPLATE_FUNC_NAME                        Endpoint_Read_Stream_LE
+#define  TEMPLATE_BUFFER_TYPE                      void*
+#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearOUT()
+#define  TEMPLATE_BUFFER_OFFSET(Length)            0
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         *BufferPtr = Endpoint_Read_8()
+#include "Template/Template_Endpoint_RW.c"
+
+#define  TEMPLATE_FUNC_NAME                        Endpoint_Read_Stream_BE
+#define  TEMPLATE_BUFFER_TYPE                      void*
+#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearOUT()
+#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         *BufferPtr = Endpoint_Read_8()
+#include "Template/Template_Endpoint_RW.c"
+
+#if defined(ARCH_HAS_FLASH_ADDRESS_SPACE)
+	#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_PStream_LE
+	#define  TEMPLATE_BUFFER_TYPE                      const void*
+	#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearIN()
+	#define  TEMPLATE_BUFFER_OFFSET(Length)            0
+	#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount
+	#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_8(pgm_read_byte(BufferPtr))
+	#include "Template/Template_Endpoint_RW.c"
+
+	#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_PStream_BE
+	#define  TEMPLATE_BUFFER_TYPE                      const void*
+	#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearIN()
+	#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)
+	#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount
+	#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_8(pgm_read_byte(BufferPtr))
+	#include "Template/Template_Endpoint_RW.c"
+#endif
+
+#if defined(ARCH_HAS_EEPROM_ADDRESS_SPACE)
+	#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_EStream_LE
+	#define  TEMPLATE_BUFFER_TYPE                      const void*
+	#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearIN()
+	#define  TEMPLATE_BUFFER_OFFSET(Length)            0
+	#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount
+	#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_8(eeprom_read_byte(BufferPtr))
+	#include "Template/Template_Endpoint_RW.c"
+
+	#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_EStream_BE
+	#define  TEMPLATE_BUFFER_TYPE                      const void*
+	#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearIN()
+	#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)
+	#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount
+	#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_8(eeprom_read_byte(BufferPtr))
+	#include "Template/Template_Endpoint_RW.c"
+
+	#define  TEMPLATE_FUNC_NAME                        Endpoint_Read_EStream_LE
+	#define  TEMPLATE_BUFFER_TYPE                      void*
+	#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearOUT()
+	#define  TEMPLATE_BUFFER_OFFSET(Length)            0
+	#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount
+	#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         eeprom_update_byte(BufferPtr, Endpoint_Read_8())
+	#include "Template/Template_Endpoint_RW.c"
+
+	#define  TEMPLATE_FUNC_NAME                        Endpoint_Read_EStream_BE
+	#define  TEMPLATE_BUFFER_TYPE                      void*
+	#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearOUT()
+	#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)
+	#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount
+	#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         eeprom_update_byte(BufferPtr, Endpoint_Read_8())
+	#include "Template/Template_Endpoint_RW.c"
+#endif
+
+#endif
+
+#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_Control_Stream_LE
+#define  TEMPLATE_BUFFER_OFFSET(Length)            0
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_8(*BufferPtr)
+#include "Template/Template_Endpoint_Control_W.c"
+
+#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_Control_Stream_BE
+#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_8(*BufferPtr)
+#include "Template/Template_Endpoint_Control_W.c"
+
+#define  TEMPLATE_FUNC_NAME                        Endpoint_Read_Control_Stream_LE
+#define  TEMPLATE_BUFFER_OFFSET(Length)            0
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         *BufferPtr = Endpoint_Read_8()
+#include "Template/Template_Endpoint_Control_R.c"
+
+#define  TEMPLATE_FUNC_NAME                        Endpoint_Read_Control_Stream_BE
+#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         *BufferPtr = Endpoint_Read_8()
+#include "Template/Template_Endpoint_Control_R.c"
+
+#if defined(ARCH_HAS_FLASH_ADDRESS_SPACE)
+	#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_Control_PStream_LE
+	#define  TEMPLATE_BUFFER_OFFSET(Length)            0
+	#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount
+	#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_8(pgm_read_byte(BufferPtr))
+	#include "Template/Template_Endpoint_Control_W.c"
+
+	#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_Control_PStream_BE
+	#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)
+	#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount
+	#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_8(pgm_read_byte(BufferPtr))
+	#include "Template/Template_Endpoint_Control_W.c"
+#endif
+
+#if defined(ARCH_HAS_EEPROM_ADDRESS_SPACE)
+	#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_Control_EStream_LE
+	#define  TEMPLATE_BUFFER_OFFSET(Length)            0
+	#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount
+	#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_8(eeprom_read_byte(BufferPtr))
+	#include "Template/Template_Endpoint_Control_W.c"
+
+	#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_Control_EStream_BE
+	#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)
+	#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount
+	#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_8(eeprom_read_byte(BufferPtr))
+	#include "Template/Template_Endpoint_Control_W.c"
+
+	#define  TEMPLATE_FUNC_NAME                        Endpoint_Read_Control_EStream_LE
+	#define  TEMPLATE_BUFFER_OFFSET(Length)            0
+	#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount
+	#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         eeprom_update_byte(BufferPtr, Endpoint_Read_8())
+	#include "Template/Template_Endpoint_Control_R.c"
+
+	#define  TEMPLATE_FUNC_NAME                        Endpoint_Read_Control_EStream_BE
+	#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)
+	#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount
+	#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         eeprom_update_byte(BufferPtr, Endpoint_Read_8())
+	#include "Template/Template_Endpoint_Control_R.c"
+#endif
+
+#endif
+
+#endif
diff --git a/lib/lufa/LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.h b/lib/lufa/LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.h
new file mode 100644
index 0000000000..80e78df1b4
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.h
@@ -0,0 +1,658 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Endpoint data stream transmission and reception management for the AVR8 microcontrollers.
+ *  \copydetails Group_EndpointStreamRW_AVR8
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the USB driver
+ *        dispatch header located in LUFA/Drivers/USB/USB.h.
+ */
+
+/** \ingroup Group_EndpointStreamRW
+ *  \defgroup Group_EndpointStreamRW_AVR8 Read/Write of Multi-Byte Streams (AVR8)
+ *  \brief Endpoint data stream transmission and reception management for the Atmel AVR8 architecture.
+ *
+ *  Functions, macros, variables, enums and types related to data reading and writing of data streams from
+ *  and to endpoints.
+ *
+ *  @{
+ */
+
+#ifndef __ENDPOINT_STREAM_AVR8_H__
+#define __ENDPOINT_STREAM_AVR8_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+		#include "../USBMode.h"
+		#include "../USBTask.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_USB_DRIVER)
+			#error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Function Prototypes: */
+			/** \name Stream functions for null data */
+			//@{
+
+			/** Reads and discards the given number of bytes from the currently selected endpoint's bank,
+			 *  discarding fully read packets from the host as needed. The last packet is not automatically
+			 *  discarded once the remaining bytes has been read; the user is responsible for manually
+			 *  discarding the last packet from the host via the \ref Endpoint_ClearOUT() macro.
+			 *
+			 *  If the BytesProcessed parameter is \c NULL, the entire stream transfer is attempted at once,
+			 *  failing or succeeding as a single unit. If the BytesProcessed parameter points to a valid
+			 *  storage location, the transfer will instead be performed as a series of chunks. Each time
+			 *  the endpoint bank becomes empty while there is still data to process (and after the current
+			 *  packet has been acknowledged) the BytesProcessed location will be updated with the total number
+			 *  of bytes processed in the stream, and the function will exit with an error code of
+			 *  \ref ENDPOINT_RWSTREAM_IncompleteTransfer. This allows for any abort checking to be performed
+			 *  in the user code - to continue the transfer, call the function again with identical parameters
+			 *  and it will resume until the BytesProcessed value reaches the total transfer length.
+			 *
+			 *  <b>Single Stream Transfer Example:</b>
+			 *  \code
+			 *  uint8_t ErrorCode;
+			 *
+			 *  if ((ErrorCode = Endpoint_Discard_Stream(512, NULL)) != ENDPOINT_RWSTREAM_NoError)
+			 *  {
+			 *       // Stream failed to complete - check ErrorCode here
+			 *  }
+			 *  \endcode
+			 *
+			 *  <b>Partial Stream Transfers Example:</b>
+			 *  \code
+			 *  uint8_t  ErrorCode;
+			 *  uint16_t BytesProcessed;
+			 *
+			 *  BytesProcessed = 0;
+			 *  while ((ErrorCode = Endpoint_Discard_Stream(512, &BytesProcessed)) == ENDPOINT_RWSTREAM_IncompleteTransfer)
+			 *  {
+			 *      // Stream not yet complete - do other actions here, abort if required
+			 *  }
+			 *
+			 *  if (ErrorCode != ENDPOINT_RWSTREAM_NoError)
+			 *  {
+			 *      // Stream failed to complete - check ErrorCode here
+			 *  }
+			 *  \endcode
+			 *
+			 *  \note This routine should not be used on CONTROL type endpoints.
+			 *
+			 *  \param[in] Length          Number of bytes to discard via the currently selected endpoint.
+			 *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes processed in the current
+			 *                             transaction should be updated, \c NULL if the entire stream should be read at once.
+			 *
+			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t Endpoint_Discard_Stream(uint16_t Length,
+			                                uint16_t* const BytesProcessed);
+
+			/** Writes a given number of zeroed bytes to the currently selected endpoint's bank, sending
+			 *  full packets to the host as needed. The last packet is not automatically sent once the
+			 *  remaining bytes have been written; the user is responsible for manually sending the last
+			 *  packet to the host via the \ref Endpoint_ClearIN() macro.
+			 *
+			 *  If the BytesProcessed parameter is \c NULL, the entire stream transfer is attempted at once,
+			 *  failing or succeeding as a single unit. If the BytesProcessed parameter points to a valid
+			 *  storage location, the transfer will instead be performed as a series of chunks. Each time
+			 *  the endpoint bank becomes full while there is still data to process (and after the current
+			 *  packet transmission has been initiated) the BytesProcessed location will be updated with the
+			 *  total number of bytes processed in the stream, and the function will exit with an error code of
+			 *  \ref ENDPOINT_RWSTREAM_IncompleteTransfer. This allows for any abort checking to be performed
+			 *  in the user code - to continue the transfer, call the function again with identical parameters
+			 *  and it will resume until the BytesProcessed value reaches the total transfer length.
+			 *
+			 *  <b>Single Stream Transfer Example:</b>
+			 *  \code
+			 *  uint8_t ErrorCode;
+			 *
+			 *  if ((ErrorCode = Endpoint_Null_Stream(512, NULL)) != ENDPOINT_RWSTREAM_NoError)
+			 *  {
+			 *       // Stream failed to complete - check ErrorCode here
+			 *  }
+			 *  \endcode
+			 *
+			 *  <b>Partial Stream Transfers Example:</b>
+			 *  \code
+			 *  uint8_t  ErrorCode;
+			 *  uint16_t BytesProcessed;
+			 *
+			 *  BytesProcessed = 0;
+			 *  while ((ErrorCode = Endpoint_Null_Stream(512, &BytesProcessed)) == ENDPOINT_RWSTREAM_IncompleteTransfer)
+			 *  {
+			 *      // Stream not yet complete - do other actions here, abort if required
+			 *  }
+			 *
+			 *  if (ErrorCode != ENDPOINT_RWSTREAM_NoError)
+			 *  {
+			 *      // Stream failed to complete - check ErrorCode here
+			 *  }
+			 *  \endcode
+			 *
+			 *  \note This routine should not be used on CONTROL type endpoints.
+			 *
+			 *  \param[in] Length          Number of zero bytes to send via the currently selected endpoint.
+			 *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes processed in the current
+			 *                             transaction should be updated, \c NULL if the entire stream should be read at once.
+			 *
+			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t Endpoint_Null_Stream(uint16_t Length,
+			                             uint16_t* const BytesProcessed);
+
+			//@}
+
+			/** \name Stream functions for RAM source/destination data */
+			//@{
+
+			/** Writes the given number of bytes to the endpoint from the given buffer in little endian,
+			 *  sending full packets to the host as needed. The last packet filled is not automatically sent;
+			 *  the user is responsible for manually sending the last written packet to the host via the
+			 *  \ref Endpoint_ClearIN() macro.
+			 *
+			 *  If the BytesProcessed parameter is \c NULL, the entire stream transfer is attempted at once,
+			 *  failing or succeeding as a single unit. If the BytesProcessed parameter points to a valid
+			 *  storage location, the transfer will instead be performed as a series of chunks. Each time
+			 *  the endpoint bank becomes full while there is still data to process (and after the current
+			 *  packet transmission has been initiated) the BytesProcessed location will be updated with the
+			 *  total number of bytes processed in the stream, and the function will exit with an error code of
+			 *  \ref ENDPOINT_RWSTREAM_IncompleteTransfer. This allows for any abort checking to be performed
+			 *  in the user code - to continue the transfer, call the function again with identical parameters
+			 *  and it will resume until the BytesProcessed value reaches the total transfer length.
+			 *
+			 *  <b>Single Stream Transfer Example:</b>
+			 *  \code
+			 *  uint8_t DataStream[512];
+			 *  uint8_t ErrorCode;
+			 *
+			 *  if ((ErrorCode = Endpoint_Write_Stream_LE(DataStream, sizeof(DataStream),
+			 *                                            NULL)) != ENDPOINT_RWSTREAM_NoError)
+			 *  {
+			 *       // Stream failed to complete - check ErrorCode here
+			 *  }
+			 *  \endcode
+			 *
+			 *  <b>Partial Stream Transfers Example:</b>
+			 *  \code
+			 *  uint8_t  DataStream[512];
+			 *  uint8_t  ErrorCode;
+			 *  uint16_t BytesProcessed;
+			 *
+			 *  BytesProcessed = 0;
+			 *  while ((ErrorCode = Endpoint_Write_Stream_LE(DataStream, sizeof(DataStream),
+			 *                                               &BytesProcessed)) == ENDPOINT_RWSTREAM_IncompleteTransfer)
+			 *  {
+			 *      // Stream not yet complete - do other actions here, abort if required
+			 *  }
+			 *
+			 *  if (ErrorCode != ENDPOINT_RWSTREAM_NoError)
+			 *  {
+			 *      // Stream failed to complete - check ErrorCode here
+			 *  }
+			 *  \endcode
+			 *
+			 *  \note This routine should not be used on CONTROL type endpoints.
+			 *
+			 *  \param[in] Buffer          Pointer to the source data buffer to read from.
+			 *  \param[in] Length          Number of bytes to read for the currently selected endpoint into the buffer.
+			 *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes processed in the current
+			 *                             transaction should be updated, \c NULL if the entire stream should be written at once.
+			 *
+			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t Endpoint_Write_Stream_LE(const void* const Buffer,
+			                                 uint16_t Length,
+			                                 uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Writes the given number of bytes to the endpoint from the given buffer in big endian,
+			 *  sending full packets to the host as needed. The last packet filled is not automatically sent;
+			 *  the user is responsible for manually sending the last written packet to the host via the
+			 *  \ref Endpoint_ClearIN() macro.
+			 *
+			 *  \note This routine should not be used on CONTROL type endpoints.
+			 *
+			 *  \param[in] Buffer          Pointer to the source data buffer to read from.
+			 *  \param[in] Length          Number of bytes to read for the currently selected endpoint into the buffer.
+			 *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes processed in the current
+			 *                             transaction should be updated, \c NULL if the entire stream should be written at once.
+			 *
+			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t Endpoint_Write_Stream_BE(const void* const Buffer,
+			                                 uint16_t Length,
+			                                 uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Reads the given number of bytes from the endpoint from the given buffer in little endian,
+			 *  discarding fully read packets from the host as needed. The last packet is not automatically
+			 *  discarded once the remaining bytes has been read; the user is responsible for manually
+			 *  discarding the last packet from the host via the \ref Endpoint_ClearOUT() macro.
+			 *
+			 *  If the BytesProcessed parameter is \c NULL, the entire stream transfer is attempted at once,
+			 *  failing or succeeding as a single unit. If the BytesProcessed parameter points to a valid
+			 *  storage location, the transfer will instead be performed as a series of chunks. Each time
+			 *  the endpoint bank becomes empty while there is still data to process (and after the current
+			 *  packet has been acknowledged) the BytesProcessed location will be updated with the total number
+			 *  of bytes processed in the stream, and the function will exit with an error code of
+			 *  \ref ENDPOINT_RWSTREAM_IncompleteTransfer. This allows for any abort checking to be performed
+			 *  in the user code - to continue the transfer, call the function again with identical parameters
+			 *  and it will resume until the BytesProcessed value reaches the total transfer length.
+			 *
+			 *  <b>Single Stream Transfer Example:</b>
+			 *  \code
+			 *  uint8_t DataStream[512];
+			 *  uint8_t ErrorCode;
+			 *
+			 *  if ((ErrorCode = Endpoint_Read_Stream_LE(DataStream, sizeof(DataStream),
+			 *                                           NULL)) != ENDPOINT_RWSTREAM_NoError)
+			 *  {
+			 *       // Stream failed to complete - check ErrorCode here
+			 *  }
+			 *  \endcode
+			 *
+			 *  <b>Partial Stream Transfers Example:</b>
+			 *  \code
+			 *  uint8_t  DataStream[512];
+			 *  uint8_t  ErrorCode;
+			 *  uint16_t BytesProcessed;
+			 *
+			 *  BytesProcessed = 0;
+			 *  while ((ErrorCode = Endpoint_Read_Stream_LE(DataStream, sizeof(DataStream),
+			 *                                              &BytesProcessed)) == ENDPOINT_RWSTREAM_IncompleteTransfer)
+			 *  {
+			 *      // Stream not yet complete - do other actions here, abort if required
+			 *  }
+			 *
+			 *  if (ErrorCode != ENDPOINT_RWSTREAM_NoError)
+			 *  {
+			 *      // Stream failed to complete - check ErrorCode here
+			 *  }
+			 *  \endcode
+			 *
+			 *  \note This routine should not be used on CONTROL type endpoints.
+			 *
+			 *  \param[out] Buffer          Pointer to the destination data buffer to write to.
+			 *  \param[in]  Length          Number of bytes to send via the currently selected endpoint.
+			 *  \param[in]  BytesProcessed  Pointer to a location where the total number of bytes processed in the current
+			 *                              transaction should be updated, \c NULL if the entire stream should be read at once.
+			 *
+			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t Endpoint_Read_Stream_LE(void* const Buffer,
+			                                uint16_t Length,
+			                                uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Reads the given number of bytes from the endpoint from the given buffer in big endian,
+			 *  discarding fully read packets from the host as needed. The last packet is not automatically
+			 *  discarded once the remaining bytes has been read; the user is responsible for manually
+			 *  discarding the last packet from the host via the \ref Endpoint_ClearOUT() macro.
+			 *
+			 *  \note This routine should not be used on CONTROL type endpoints.
+			 *
+			 *  \param[out] Buffer          Pointer to the destination data buffer to write to.
+			 *  \param[in]  Length          Number of bytes to send via the currently selected endpoint.
+			 *  \param[in]  BytesProcessed  Pointer to a location where the total number of bytes processed in the current
+			 *                              transaction should be updated, \c NULL if the entire stream should be read at once.
+			 *
+			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t Endpoint_Read_Stream_BE(void* const Buffer,
+			                                uint16_t Length,
+			                                uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Writes the given number of bytes to the CONTROL type endpoint from the given buffer in little endian,
+			 *  sending full packets to the host as needed. The host OUT acknowledgement is not automatically cleared
+			 *  in both failure and success states; the user is responsible for manually clearing the status OUT packet
+			 *  to finalize the transfer's status stage via the \ref Endpoint_ClearOUT() macro.
+			 *
+			 *  \note This function automatically sends the last packet in the data stage of the transaction; when the
+			 *        function returns, the user is responsible for clearing the <b>status</b> stage of the transaction.
+			 *        Note that the status stage packet is sent or received in the opposite direction of the data flow.
+			 *        \n\n
+			 *
+			 *  \note This routine should only be used on CONTROL type endpoints.
+			 *
+			 *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained
+			 *           together; i.e. the entire stream data must be read or written at the one time.
+			 *
+			 *  \param[in] Buffer  Pointer to the source data buffer to read from.
+			 *  \param[in] Length  Number of bytes to read for the currently selected endpoint into the buffer.
+			 *
+			 *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t Endpoint_Write_Control_Stream_LE(const void* const Buffer,
+			                                         uint16_t Length) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Writes the given number of bytes to the CONTROL type endpoint from the given buffer in big endian,
+			 *  sending full packets to the host as needed. The host OUT acknowledgement is not automatically cleared
+			 *  in both failure and success states; the user is responsible for manually clearing the status OUT packet
+			 *  to finalize the transfer's status stage via the \ref Endpoint_ClearOUT() macro.
+			 *
+			 *  \note This function automatically sends the last packet in the data stage of the transaction; when the
+			 *        function returns, the user is responsible for clearing the <b>status</b> stage of the transaction.
+			 *        Note that the status stage packet is sent or received in the opposite direction of the data flow.
+			 *        \n\n
+			 *
+			 *  \note This routine should only be used on CONTROL type endpoints.
+			 *
+			 *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained
+			 *           together; i.e. the entire stream data must be read or written at the one time.
+			 *
+			 *  \param[in] Buffer  Pointer to the source data buffer to read from.
+			 *  \param[in] Length  Number of bytes to read for the currently selected endpoint into the buffer.
+			 *
+			 *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t Endpoint_Write_Control_Stream_BE(const void* const Buffer,
+			                                         uint16_t Length) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Reads the given number of bytes from the CONTROL endpoint from the given buffer in little endian,
+			 *  discarding fully read packets from the host as needed. The device IN acknowledgement is not
+			 *  automatically sent after success or failure states; the user is responsible for manually sending the
+			 *  status IN packet to finalize the transfer's status stage via the \ref Endpoint_ClearIN() macro.
+			 *
+			 *  \note This function automatically sends the last packet in the data stage of the transaction; when the
+			 *        function returns, the user is responsible for clearing the <b>status</b> stage of the transaction.
+			 *        Note that the status stage packet is sent or received in the opposite direction of the data flow.
+			 *        \n\n
+			 *
+			 *  \note This routine should only be used on CONTROL type endpoints.
+			 *
+			 *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained
+			 *           together; i.e. the entire stream data must be read or written at the one time.
+			 *
+			 *  \param[out] Buffer  Pointer to the destination data buffer to write to.
+			 *  \param[in]  Length  Number of bytes to send via the currently selected endpoint.
+			 *
+			 *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t Endpoint_Read_Control_Stream_LE(void* const Buffer,
+			                                        uint16_t Length) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Reads the given number of bytes from the CONTROL endpoint from the given buffer in big endian,
+			 *  discarding fully read packets from the host as needed. The device IN acknowledgement is not
+			 *  automatically sent after success or failure states; the user is responsible for manually sending the
+			 *  status IN packet to finalize the transfer's status stage via the \ref Endpoint_ClearIN() macro.
+			 *
+			 *  \note This function automatically sends the last packet in the data stage of the transaction; when the
+			 *        function returns, the user is responsible for clearing the <b>status</b> stage of the transaction.
+			 *        Note that the status stage packet is sent or received in the opposite direction of the data flow.
+			 *        \n\n
+			 *
+			 *  \note This routine should only be used on CONTROL type endpoints.
+			 *
+			 *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained
+			 *           together; i.e. the entire stream data must be read or written at the one time.
+			 *
+			 *  \param[out] Buffer  Pointer to the destination data buffer to write to.
+			 *  \param[in]  Length  Number of bytes to send via the currently selected endpoint.
+			 *
+			 *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t Endpoint_Read_Control_Stream_BE(void* const Buffer,
+			                                        uint16_t Length) ATTR_NON_NULL_PTR_ARG(1);
+			//@}
+
+			/** \name Stream functions for EEPROM source/destination data */
+			//@{
+
+			/** EEPROM buffer source version of \ref Endpoint_Write_Stream_LE().
+			 *
+			 *  \param[in] Buffer          Pointer to the source data buffer to read from.
+			 *  \param[in] Length          Number of bytes to read for the currently selected endpoint into the buffer.
+			 *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes processed in the current
+			 *                             transaction should be updated, \c NULL if the entire stream should be written at once.
+			 *
+			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t Endpoint_Write_EStream_LE(const void* const Buffer,
+			                                  uint16_t Length,
+			                                  uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** EEPROM buffer source version of \ref Endpoint_Write_Stream_BE().
+			 *
+			 *  \param[in] Buffer          Pointer to the source data buffer to read from.
+			 *  \param[in] Length          Number of bytes to read for the currently selected endpoint into the buffer.
+			 *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes processed in the current
+			 *                             transaction should be updated, \c NULL if the entire stream should be written at once.
+			 *
+			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t Endpoint_Write_EStream_BE(const void* const Buffer,
+			                                  uint16_t Length,
+			                                  uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** EEPROM buffer destination version of \ref Endpoint_Read_Stream_LE().
+			 *
+			 *  \param[out] Buffer          Pointer to the destination data buffer to write to, located in EEPROM memory space.
+			 *  \param[in]  Length          Number of bytes to send via the currently selected endpoint.
+			 *  \param[in]  BytesProcessed  Pointer to a location where the total number of bytes processed in the current
+			 *                              transaction should be updated, \c NULL if the entire stream should be read at once.
+			 *
+			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t Endpoint_Read_EStream_LE(void* const Buffer,
+			                                 uint16_t Length,
+			                                 uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** EEPROM buffer destination version of \ref Endpoint_Read_Stream_BE().
+			 *
+			 *  \param[out] Buffer          Pointer to the destination data buffer to write to, located in EEPROM memory space.
+			 *  \param[in]  Length          Number of bytes to send via the currently selected endpoint.
+			 *  \param[in]  BytesProcessed  Pointer to a location where the total number of bytes processed in the current
+			 *                              transaction should be updated, \c NULL if the entire stream should be read at once.
+			 *
+			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t Endpoint_Read_EStream_BE(void* const Buffer,
+			                                 uint16_t Length,
+			                                 uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** EEPROM buffer source version of Endpoint_Write_Control_Stream_LE.
+			 *
+			 *  \note This function automatically sends the last packet in the data stage of the transaction; when the
+			 *        function returns, the user is responsible for clearing the <b>status</b> stage of the transaction.
+			 *        Note that the status stage packet is sent or received in the opposite direction of the data flow.
+			 *        \n\n
+			 *
+			 *  \note This routine should only be used on CONTROL type endpoints.
+			 *        \n\n
+			 *
+			 *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained
+			 *           together; i.e. the entire stream data must be read or written at the one time.
+			 *
+			 *  \param[in] Buffer  Pointer to the source data buffer to read from.
+			 *  \param[in] Length  Number of bytes to read for the currently selected endpoint into the buffer.
+			 *
+			 *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t Endpoint_Write_Control_EStream_LE(const void* const Buffer,
+			                                          uint16_t Length) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** EEPROM buffer source version of \ref Endpoint_Write_Control_Stream_BE().
+			 *
+			 *  \note This function automatically sends the last packet in the data stage of the transaction; when the
+			 *        function returns, the user is responsible for clearing the <b>status</b> stage of the transaction.
+			 *        Note that the status stage packet is sent or received in the opposite direction of the data flow.
+			 *        \n\n
+			 *
+			 *  \note This routine should only be used on CONTROL type endpoints.
+			 *        \n\n
+			 *
+			 *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained
+			 *           together; i.e. the entire stream data must be read or written at the one time.
+			 *
+			 *  \param[in] Buffer  Pointer to the source data buffer to read from.
+			 *  \param[in] Length  Number of bytes to read for the currently selected endpoint into the buffer.
+			 *
+			 *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t Endpoint_Write_Control_EStream_BE(const void* const Buffer,
+			                                          uint16_t Length) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** EEPROM buffer source version of \ref Endpoint_Read_Control_Stream_LE().
+			 *
+			 *  \note This function automatically sends the last packet in the data stage of the transaction; when the
+			 *        function returns, the user is responsible for clearing the <b>status</b> stage of the transaction.
+			 *        Note that the status stage packet is sent or received in the opposite direction of the data flow.
+			 *        \n\n
+			 *
+			 *  \note This routine should only be used on CONTROL type endpoints.
+			 *        \n\n
+			 *
+			 *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained
+			 *           together; i.e. the entire stream data must be read or written at the one time.
+			 *
+			 *  \param[out] Buffer  Pointer to the destination data buffer to write to.
+			 *  \param[in]  Length  Number of bytes to send via the currently selected endpoint.
+			 *
+			 *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t Endpoint_Read_Control_EStream_LE(void* const Buffer,
+			                                         uint16_t Length) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** EEPROM buffer source version of \ref Endpoint_Read_Control_Stream_BE().
+			 *
+			 *  \note This function automatically sends the last packet in the data stage of the transaction; when the
+			 *        function returns, the user is responsible for clearing the <b>status</b> stage of the transaction.
+			 *        Note that the status stage packet is sent or received in the opposite direction of the data flow.
+			 *        \n\n
+			 *
+			 *  \note This routine should only be used on CONTROL type endpoints.
+			 *        \n\n
+			 *
+			 *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained
+			 *           together; i.e. the entire stream data must be read or written at the one time.
+			 *
+			 *  \param[out] Buffer  Pointer to the destination data buffer to write to.
+			 *  \param[in]  Length  Number of bytes to send via the currently selected endpoint.
+			 *
+			 *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t Endpoint_Read_Control_EStream_BE(void* const Buffer,
+			                                         uint16_t Length) ATTR_NON_NULL_PTR_ARG(1);
+			//@}
+
+			/** \name Stream functions for PROGMEM source/destination data */
+			//@{
+
+			/** FLASH buffer source version of \ref Endpoint_Write_Stream_LE().
+			 *
+			 *  \pre The FLASH data must be located in the first 64KB of FLASH for this function to work correctly.
+			 *
+			 *  \param[in] Buffer          Pointer to the source data buffer to read from.
+			 *  \param[in] Length          Number of bytes to read for the currently selected endpoint into the buffer.
+			 *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes processed in the current
+			 *                             transaction should be updated, \c NULL if the entire stream should be written at once.
+			 *
+			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t Endpoint_Write_PStream_LE(const void* const Buffer,
+			                                  uint16_t Length,
+			                                  uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** FLASH buffer source version of \ref Endpoint_Write_Stream_BE().
+			 *
+			 *  \pre The FLASH data must be located in the first 64KB of FLASH for this function to work correctly.
+			 *
+			 *  \param[in] Buffer          Pointer to the source data buffer to read from.
+			 *  \param[in] Length          Number of bytes to read for the currently selected endpoint into the buffer.
+			 *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes processed in the current
+			 *                             transaction should be updated, \c NULL if the entire stream should be written at once.
+			 *
+			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t Endpoint_Write_PStream_BE(const void* const Buffer,
+			                                  uint16_t Length,
+			                                  uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** FLASH buffer source version of \ref Endpoint_Write_Control_Stream_LE().
+			 *
+			 *  \pre The FLASH data must be located in the first 64KB of FLASH for this function to work correctly.
+			 *
+			 *  \note This function automatically sends the last packet in the data stage of the transaction; when the
+			 *        function returns, the user is responsible for clearing the <b>status</b> stage of the transaction.
+			 *        Note that the status stage packet is sent or received in the opposite direction of the data flow.
+			 *        \n\n
+			 *
+			 *  \note This routine should only be used on CONTROL type endpoints.
+			 *        \n\n
+			 *
+			 *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained
+			 *           together; i.e. the entire stream data must be read or written at the one time.
+			 *
+			 *  \param[in] Buffer  Pointer to the source data buffer to read from.
+			 *  \param[in] Length  Number of bytes to read for the currently selected endpoint into the buffer.
+			 *
+			 *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t Endpoint_Write_Control_PStream_LE(const void* const Buffer,
+			                                          uint16_t Length) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** FLASH buffer source version of \ref Endpoint_Write_Control_Stream_BE().
+			 *
+			 *  \pre The FLASH data must be located in the first 64KB of FLASH for this function to work correctly.
+			 *
+			 *  \note This function automatically sends the last packet in the data stage of the transaction; when the
+			 *        function returns, the user is responsible for clearing the <b>status</b> stage of the transaction.
+			 *        Note that the status stage packet is sent or received in the opposite direction of the data flow.
+			 *        \n\n
+			 *
+			 *  \note This routine should only be used on CONTROL type endpoints.
+			 *        \n\n
+			 *
+			 *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained
+			 *           together; i.e. the entire stream data must be read or written at the one time.
+			 *
+			 *  \param[in] Buffer  Pointer to the source data buffer to read from.
+			 *  \param[in] Length  Number of bytes to read for the currently selected endpoint into the buffer.
+			 *
+			 *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t Endpoint_Write_Control_PStream_BE(const void* const Buffer,
+			                                          uint16_t Length) ATTR_NON_NULL_PTR_ARG(1);
+			//@}
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.c b/lib/lufa/LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.c
new file mode 100644
index 0000000000..92cf8360de
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.c
@@ -0,0 +1,201 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+#include "../../../../Common/Common.h"
+#if (ARCH == ARCH_AVR8)
+
+#define  __INCLUDE_FROM_USB_DRIVER
+#include "../USBMode.h"
+
+#if defined(USB_CAN_BE_DEVICE)
+
+#include "../Endpoint.h"
+
+#if !defined(FIXED_CONTROL_ENDPOINT_SIZE)
+uint8_t USB_Device_ControlEndpointSize = ENDPOINT_CONTROLEP_DEFAULT_SIZE;
+#endif
+
+bool Endpoint_ConfigureEndpointTable(const USB_Endpoint_Table_t* const Table,
+                                     const uint8_t Entries)
+{
+	for (uint8_t i = 0; i < Entries; i++)
+	{
+		if (!(Table[i].Address))
+		  continue;
+
+		if (!(Endpoint_ConfigureEndpoint(Table[i].Address, Table[i].Type, Table[i].Size, Table[i].Banks)))
+		  return false;
+	}
+
+	return true;
+}
+
+bool Endpoint_ConfigureEndpoint_Prv(const uint8_t Number,
+                                    const uint8_t UECFG0XData,
+                                    const uint8_t UECFG1XData)
+{
+#if defined(CONTROL_ONLY_DEVICE) || defined(ORDERED_EP_CONFIG)
+	Endpoint_SelectEndpoint(Number);
+	Endpoint_EnableEndpoint();
+
+	UECFG1X = 0;
+	UECFG0X = UECFG0XData;
+	UECFG1X = UECFG1XData;
+
+	return Endpoint_IsConfigured();
+#else
+	for (uint8_t EPNum = Number; EPNum < ENDPOINT_TOTAL_ENDPOINTS; EPNum++)
+	{
+		uint8_t UECFG0XTemp;
+		uint8_t UECFG1XTemp;
+		uint8_t UEIENXTemp;
+
+		Endpoint_SelectEndpoint(EPNum);
+
+		if (EPNum == Number)
+		{
+			UECFG0XTemp = UECFG0XData;
+			UECFG1XTemp = UECFG1XData;
+			UEIENXTemp  = 0;
+		}
+		else
+		{
+			UECFG0XTemp = UECFG0X;
+			UECFG1XTemp = UECFG1X;
+			UEIENXTemp  = UEIENX;
+		}
+
+		if (!(UECFG1XTemp & (1 << ALLOC)))
+		  continue;
+
+		Endpoint_DisableEndpoint();
+		UECFG1X &= ~(1 << ALLOC);
+
+		Endpoint_EnableEndpoint();
+		UECFG0X = UECFG0XTemp;
+		UECFG1X = UECFG1XTemp;
+		UEIENX  = UEIENXTemp;
+
+		if (!(Endpoint_IsConfigured()))
+		  return false;
+	}
+
+	Endpoint_SelectEndpoint(Number);
+	return true;
+#endif
+}
+
+void Endpoint_ClearEndpoints(void)
+{
+	UEINT = 0;
+
+	for (uint8_t EPNum = 0; EPNum < ENDPOINT_TOTAL_ENDPOINTS; EPNum++)
+	{
+		Endpoint_SelectEndpoint(EPNum);
+		UEIENX  = 0;
+		UEINTX  = 0;
+		UECFG1X = 0;
+		Endpoint_DisableEndpoint();
+	}
+}
+
+void Endpoint_ClearStatusStage(void)
+{
+	if (USB_ControlRequest.bmRequestType & REQDIR_DEVICETOHOST)
+	{
+		while (!(Endpoint_IsOUTReceived()))
+		{
+			if (USB_DeviceState == DEVICE_STATE_Unattached)
+			  return;
+		}
+
+		Endpoint_ClearOUT();
+	}
+	else
+	{
+		while (!(Endpoint_IsINReady()))
+		{
+			if (USB_DeviceState == DEVICE_STATE_Unattached)
+			  return;
+		}
+
+		Endpoint_ClearIN();
+	}
+}
+
+#if !defined(CONTROL_ONLY_DEVICE)
+uint8_t Endpoint_WaitUntilReady(void)
+{
+	#if (USB_STREAM_TIMEOUT_MS < 0xFF)
+	uint8_t  TimeoutMSRem = USB_STREAM_TIMEOUT_MS;
+	#else
+	uint16_t TimeoutMSRem = USB_STREAM_TIMEOUT_MS;
+	#endif
+
+	uint16_t PreviousFrameNumber = USB_Device_GetFrameNumber();
+
+	for (;;)
+	{
+		if (Endpoint_GetEndpointDirection() == ENDPOINT_DIR_IN)
+		{
+			if (Endpoint_IsINReady())
+			  return ENDPOINT_READYWAIT_NoError;
+		}
+		else
+		{
+			if (Endpoint_IsOUTReceived())
+			  return ENDPOINT_READYWAIT_NoError;
+		}
+
+		uint8_t USB_DeviceState_LCL = USB_DeviceState;
+
+		if (USB_DeviceState_LCL == DEVICE_STATE_Unattached)
+		  return ENDPOINT_READYWAIT_DeviceDisconnected;
+		else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended)
+		  return ENDPOINT_READYWAIT_BusSuspended;
+		else if (Endpoint_IsStalled())
+		  return ENDPOINT_READYWAIT_EndpointStalled;
+
+		uint16_t CurrentFrameNumber = USB_Device_GetFrameNumber();
+
+		if (CurrentFrameNumber != PreviousFrameNumber)
+		{
+			PreviousFrameNumber = CurrentFrameNumber;
+
+			if (!(TimeoutMSRem--))
+			  return ENDPOINT_READYWAIT_Timeout;
+		}
+	}
+}
+#endif
+
+#endif
+
+#endif
diff --git a/lib/lufa/LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.h b/lib/lufa/LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.h
new file mode 100644
index 0000000000..6d8375230e
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.h
@@ -0,0 +1,819 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief USB Endpoint definitions for the AVR8 microcontrollers.
+ *  \copydetails Group_EndpointManagement_AVR8
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the USB driver
+ *        dispatch header located in LUFA/Drivers/USB/USB.h.
+ */
+
+/** \ingroup Group_EndpointRW
+ *  \defgroup Group_EndpointRW_AVR8 Endpoint Data Reading and Writing (AVR8)
+ *  \brief Endpoint data read/write definitions for the Atmel AVR8 architecture.
+ *
+ *  Functions, macros, variables, enums and types related to data reading and writing from and to endpoints.
+ */
+
+/** \ingroup Group_EndpointPrimitiveRW
+ *  \defgroup Group_EndpointPrimitiveRW_AVR8 Read/Write of Primitive Data Types (AVR8)
+ *  \brief Endpoint primitive read/write definitions for the Atmel AVR8 architecture.
+ *
+ *  Functions, macros, variables, enums and types related to data reading and writing of primitive data types
+ *  from and to endpoints.
+ */
+
+/** \ingroup Group_EndpointPacketManagement
+ *  \defgroup Group_EndpointPacketManagement_AVR8 Endpoint Packet Management (AVR8)
+ *  \brief Endpoint packet management definitions for the Atmel AVR8 architecture.
+ *
+ *  Functions, macros, variables, enums and types related to packet management of endpoints.
+ */
+
+/** \ingroup Group_EndpointManagement
+ *  \defgroup Group_EndpointManagement_AVR8 Endpoint Management (AVR8)
+ *  \brief Endpoint management definitions for the Atmel AVR8 architecture.
+ *
+ *  Functions, macros and enums related to endpoint management when in USB Device mode. This
+ *  module contains the endpoint management macros, as well as endpoint interrupt and data
+ *  send/receive functions for various data types.
+ *
+ *  @{
+ */
+
+#ifndef __ENDPOINT_AVR8_H__
+#define __ENDPOINT_AVR8_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+		#include "../USBTask.h"
+		#include "../USBInterrupt.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_USB_DRIVER)
+			#error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.
+		#endif
+
+	/* Private Interface - For use in library only: */
+	#if !defined(__DOXYGEN__)
+		/* Inline Functions: */
+			static inline uint8_t Endpoint_BytesToEPSizeMask(const uint16_t Bytes) ATTR_WARN_UNUSED_RESULT ATTR_CONST
+			                                                                       ATTR_ALWAYS_INLINE;
+			static inline uint8_t Endpoint_BytesToEPSizeMask(const uint16_t Bytes)
+			{
+				uint8_t  MaskVal    = 0;
+				uint16_t CheckBytes = 8;
+
+				while (CheckBytes < Bytes)
+				{
+					MaskVal++;
+					CheckBytes <<= 1;
+				}
+
+				return (MaskVal << EPSIZE0);
+			}
+
+		/* Function Prototypes: */
+			void Endpoint_ClearEndpoints(void);
+			bool Endpoint_ConfigureEndpoint_Prv(const uint8_t Number,
+			                                    const uint8_t UECFG0XData,
+			                                    const uint8_t UECFG1XData);
+
+	#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			#if (!defined(FIXED_CONTROL_ENDPOINT_SIZE) || defined(__DOXYGEN__))
+				/** Default size of the default control endpoint's bank, until altered by the control endpoint bank size
+				 *  value in the device descriptor. Not available if the \c FIXED_CONTROL_ENDPOINT_SIZE token is defined.
+				 */
+				#define ENDPOINT_CONTROLEP_DEFAULT_SIZE     8
+			#endif
+
+			#if !defined(CONTROL_ONLY_DEVICE) || defined(__DOXYGEN__)
+				#if defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR) || defined(__DOXYGEN__)
+					/** Total number of endpoints (including the default control endpoint at address 0) which may
+					 *  be used in the device. Different USB AVR models support different amounts of endpoints,
+					 *  this value reflects the maximum number of endpoints for the currently selected AVR model.
+					 */
+					#define ENDPOINT_TOTAL_ENDPOINTS        7
+				#else
+					#define ENDPOINT_TOTAL_ENDPOINTS        5
+				#endif
+			#else
+				#define ENDPOINT_TOTAL_ENDPOINTS            1
+			#endif
+
+		/* Enums: */
+			/** Enum for the possible error return codes of the \ref Endpoint_WaitUntilReady() function.
+			 *
+			 *  \ingroup Group_EndpointRW_AVR8
+			 */
+			enum Endpoint_WaitUntilReady_ErrorCodes_t
+			{
+				ENDPOINT_READYWAIT_NoError                 = 0, /**< Endpoint is ready for next packet, no error. */
+				ENDPOINT_READYWAIT_EndpointStalled         = 1, /**< The endpoint was stalled during the stream
+				                                                 *   transfer by the host or device.
+				                                                 */
+				ENDPOINT_READYWAIT_DeviceDisconnected      = 2,	/**< Device was disconnected from the host while
+				                                                 *   waiting for the endpoint to become ready.
+				                                                 */
+				ENDPOINT_READYWAIT_BusSuspended            = 3, /**< The USB bus has been suspended by the host and
+				                                                 *   no USB endpoint traffic can occur until the bus
+				                                                 *   has resumed.
+				                                                 */
+				ENDPOINT_READYWAIT_Timeout                 = 4, /**< The host failed to accept or send the next packet
+				                                                 *   within the software timeout period set by the
+				                                                 *   \ref USB_STREAM_TIMEOUT_MS macro.
+				                                                 */
+			};
+
+		/* Inline Functions: */
+			/** Configures the specified endpoint address with the given endpoint type, bank size and number of hardware
+			 *  banks. Once configured, the endpoint may be read from or written to, depending on its direction.
+			 *
+			 *  \param[in] Address    Endpoint address to configure.
+			 *
+			 *  \param[in] Type       Type of endpoint to configure, a \c EP_TYPE_* mask. Not all endpoint types
+			 *                        are available on Low Speed USB devices - refer to the USB 2.0 specification.
+			 *
+			 *  \param[in] Size       Size of the endpoint's bank, where packets are stored before they are transmitted
+			 *                        to the USB host, or after they have been received from the USB host (depending on
+			 *                        the endpoint's data direction). The bank size must indicate the maximum packet size
+			 *                        that the endpoint can handle.
+			 *
+			 *  \param[in] Banks      Number of banks to use for the endpoint being configured.
+			 *
+			 *  \attention When the \c ORDERED_EP_CONFIG compile time option is used, Endpoints <b>must</b> be configured in
+			 *             ascending order, or bank corruption will occur.
+			 *
+			 *  \note Different endpoints may have different maximum packet sizes based on the endpoint's index - please
+			 *        refer to the chosen microcontroller model's datasheet to determine the maximum bank size for each endpoint.
+			 *        \n\n
+			 *
+			 *  \note The default control endpoint should not be manually configured by the user application, as
+			 *        it is automatically configured by the library internally.
+			 *        \n\n
+			 *
+			 *  \note This routine will automatically select the specified endpoint upon success. Upon failure, the endpoint
+			 *        which failed to reconfigure correctly will be selected.
+			 *
+			 *  \return Boolean \c true if the configuration succeeded, \c false otherwise.
+			 */
+			static inline bool Endpoint_ConfigureEndpoint(const uint8_t Address,
+			                                              const uint8_t Type,
+			                                              const uint16_t Size,
+			                                              const uint8_t Banks) ATTR_ALWAYS_INLINE;
+			static inline bool Endpoint_ConfigureEndpoint(const uint8_t Address,
+			                                              const uint8_t Type,
+			                                              const uint16_t Size,
+			                                              const uint8_t Banks)
+			{
+				uint8_t Number = (Address & ENDPOINT_EPNUM_MASK);
+
+				if (Number >= ENDPOINT_TOTAL_ENDPOINTS)
+				  return false;
+
+				return Endpoint_ConfigureEndpoint_Prv(Number,
+				                                      ((Type << EPTYPE0) | ((Address & ENDPOINT_DIR_IN) ? (1 << EPDIR) : 0)),
+				                                      ((1 << ALLOC) | ((Banks > 1) ? (1 << EPBK0) : 0) | Endpoint_BytesToEPSizeMask(Size)));
+			}
+
+			/** Indicates the number of bytes currently stored in the current endpoint's selected bank.
+			 *
+			 *  \ingroup Group_EndpointRW_AVR8
+			 *
+			 *  \return Total number of bytes in the currently selected Endpoint's FIFO buffer.
+			 */
+			static inline uint16_t Endpoint_BytesInEndpoint(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline uint16_t Endpoint_BytesInEndpoint(void)
+			{
+				#if (defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR))
+					return UEBCX;
+				#elif defined(USB_SERIES_4_AVR)
+					return (((uint16_t)UEBCHX << 8) | UEBCLX);
+				#elif defined(USB_SERIES_2_AVR)
+					return UEBCLX;
+				#endif
+			}
+
+			/** Determines the currently selected endpoint's direction.
+			 *
+			 *  \return The currently selected endpoint's direction, as a \c ENDPOINT_DIR_* mask.
+			 */
+			static inline uint8_t Endpoint_GetEndpointDirection(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline uint8_t Endpoint_GetEndpointDirection(void)
+			{
+				return (UECFG0X & (1 << EPDIR)) ? ENDPOINT_DIR_IN : ENDPOINT_DIR_OUT;
+			}
+
+			/** Get the endpoint address of the currently selected endpoint. This is typically used to save
+			 *  the currently selected endpoint so that it can be restored after another endpoint has been
+			 *  manipulated.
+			 *
+			 *  \return Index of the currently selected endpoint.
+			 */
+			static inline uint8_t Endpoint_GetCurrentEndpoint(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline uint8_t Endpoint_GetCurrentEndpoint(void)
+			{
+				#if !defined(CONTROL_ONLY_DEVICE)
+					return ((UENUM & ENDPOINT_EPNUM_MASK) | Endpoint_GetEndpointDirection());
+				#else
+					return ENDPOINT_CONTROLEP;
+				#endif
+			}
+
+			/** Selects the given endpoint address.
+			 *
+			 *  Any endpoint operations which do not require the endpoint address to be indicated will operate on
+			 *  the currently selected endpoint.
+			 *
+			 *  \param[in] Address Endpoint address to select.
+			 */
+			static inline void Endpoint_SelectEndpoint(const uint8_t Address) ATTR_ALWAYS_INLINE;
+			static inline void Endpoint_SelectEndpoint(const uint8_t Address)
+			{
+				#if !defined(CONTROL_ONLY_DEVICE)
+					UENUM = (Address & ENDPOINT_EPNUM_MASK);
+				#endif
+			}
+
+			/** Resets the endpoint bank FIFO. This clears all the endpoint banks and resets the USB controller's
+			 *  data In and Out pointers to the bank's contents.
+			 *
+			 *  \param[in] Address  Endpoint address whose FIFO buffers are to be reset.
+			 */
+			static inline void Endpoint_ResetEndpoint(const uint8_t Address) ATTR_ALWAYS_INLINE;
+			static inline void Endpoint_ResetEndpoint(const uint8_t Address)
+			{
+				UERST = (1 << (Address & ENDPOINT_EPNUM_MASK));
+				UERST = 0;
+			}
+
+			/** Enables the currently selected endpoint so that data can be sent and received through it to
+			 *  and from a host.
+			 *
+			 *  \note Endpoints must first be configured properly via \ref Endpoint_ConfigureEndpoint().
+			 */
+			static inline void Endpoint_EnableEndpoint(void) ATTR_ALWAYS_INLINE;
+			static inline void Endpoint_EnableEndpoint(void)
+			{
+				UECONX |= (1 << EPEN);
+			}
+
+			/** Disables the currently selected endpoint so that data cannot be sent and received through it
+			 *  to and from a host.
+			 */
+			static inline void Endpoint_DisableEndpoint(void) ATTR_ALWAYS_INLINE;
+			static inline void Endpoint_DisableEndpoint(void)
+			{
+				UECONX &= ~(1 << EPEN);
+			}
+
+			/** Determines if the currently selected endpoint is enabled, but not necessarily configured.
+			 *
+			 * \return Boolean \c true if the currently selected endpoint is enabled, \c false otherwise.
+			 */
+			static inline bool Endpoint_IsEnabled(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline bool Endpoint_IsEnabled(void)
+			{
+				return ((UECONX & (1 << EPEN)) ? true : false);
+			}
+
+			/** Retrieves the number of busy banks in the currently selected endpoint, which have been queued for
+			 *  transmission via the \ref Endpoint_ClearIN() command, or are awaiting acknowledgment via the
+			 *  \ref Endpoint_ClearOUT() command.
+			 *
+			 *  \ingroup Group_EndpointPacketManagement_AVR8
+			 *
+			 *  \return Total number of busy banks in the selected endpoint.
+			 */
+			static inline uint8_t Endpoint_GetBusyBanks(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t Endpoint_GetBusyBanks(void)
+			{
+				return (UESTA0X & (0x03 << NBUSYBK0));
+			}
+
+			/** Aborts all pending IN transactions on the currently selected endpoint, once the bank
+			 *  has been queued for transmission to the host via \ref Endpoint_ClearIN(). This function
+			 *  will terminate all queued transactions, resetting the endpoint banks ready for a new
+			 *  packet.
+			 *
+			 *  \ingroup Group_EndpointPacketManagement_AVR8
+			 */
+			static inline void Endpoint_AbortPendingIN(void)
+			{
+				while (Endpoint_GetBusyBanks() != 0)
+				{
+					UEINTX |= (1 << RXOUTI);
+					while (UEINTX & (1 << RXOUTI));
+				}
+			}
+
+			/** Determines if the currently selected endpoint may be read from (if data is waiting in the endpoint
+			 *  bank and the endpoint is an OUT direction, or if the bank is not yet full if the endpoint is an IN
+			 *  direction). This function will return false if an error has occurred in the endpoint, if the endpoint
+			 *  is an OUT direction and no packet (or an empty packet) has been received, or if the endpoint is an IN
+			 *  direction and the endpoint bank is full.
+			 *
+			 *  \ingroup Group_EndpointPacketManagement_AVR8
+			 *
+			 *  \return Boolean \c true if the currently selected endpoint may be read from or written to, depending
+			 *          on its direction.
+			 */
+			static inline bool Endpoint_IsReadWriteAllowed(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline bool Endpoint_IsReadWriteAllowed(void)
+			{
+				return ((UEINTX & (1 << RWAL)) ? true : false);
+			}
+
+			/** Determines if the currently selected endpoint is configured.
+			 *
+			 *  \return Boolean \c true if the currently selected endpoint has been configured, \c false otherwise.
+			 */
+			static inline bool Endpoint_IsConfigured(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline bool Endpoint_IsConfigured(void)
+			{
+				return ((UESTA0X & (1 << CFGOK)) ? true : false);
+			}
+
+			/** Returns a mask indicating which INTERRUPT type endpoints have interrupted - i.e. their
+			 *  interrupt duration has elapsed. Which endpoints have interrupted can be determined by
+			 *  masking the return value against <tt>(1 << <i>{Endpoint Number}</i>)</tt>.
+			 *
+			 *  \return Mask whose bits indicate which endpoints have interrupted.
+			 */
+			static inline uint8_t Endpoint_GetEndpointInterrupts(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline uint8_t Endpoint_GetEndpointInterrupts(void)
+			{
+				return UEINT;
+			}
+
+			/** Determines if the specified endpoint number has interrupted (valid only for INTERRUPT type
+			 *  endpoints).
+			 *
+			 *  \param[in] Address  Address of the endpoint whose interrupt flag should be tested.
+			 *
+			 *  \return Boolean \c true if the specified endpoint has interrupted, \c false otherwise.
+			 */
+			static inline bool Endpoint_HasEndpointInterrupted(const uint8_t Address) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline bool Endpoint_HasEndpointInterrupted(const uint8_t Address)
+			{
+				return ((Endpoint_GetEndpointInterrupts() & (1 << (Address & ENDPOINT_EPNUM_MASK))) ? true : false);
+			}
+
+			/** Determines if the selected IN endpoint is ready for a new packet to be sent to the host.
+			 *
+			 *  \ingroup Group_EndpointPacketManagement_AVR8
+			 *
+			 *  \return Boolean \c true if the current endpoint is ready for an IN packet, \c false otherwise.
+			 */
+			static inline bool Endpoint_IsINReady(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline bool Endpoint_IsINReady(void)
+			{
+				return ((UEINTX & (1 << TXINI)) ? true : false);
+			}
+
+			/** Determines if the selected OUT endpoint has received new packet from the host.
+			 *
+			 *  \ingroup Group_EndpointPacketManagement_AVR8
+			 *
+			 *  \return Boolean \c true if current endpoint is has received an OUT packet, \c false otherwise.
+			 */
+			static inline bool Endpoint_IsOUTReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline bool Endpoint_IsOUTReceived(void)
+			{
+				return ((UEINTX & (1 << RXOUTI)) ? true : false);
+			}
+
+			/** Determines if the current CONTROL type endpoint has received a SETUP packet.
+			 *
+			 *  \ingroup Group_EndpointPacketManagement_AVR8
+			 *
+			 *  \return Boolean \c true if the selected endpoint has received a SETUP packet, \c false otherwise.
+			 */
+			static inline bool Endpoint_IsSETUPReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline bool Endpoint_IsSETUPReceived(void)
+			{
+				return ((UEINTX & (1 << RXSTPI)) ? true : false);
+			}
+
+			/** Clears a received SETUP packet on the currently selected CONTROL type endpoint, freeing up the
+			 *  endpoint for the next packet.
+			 *
+			 *  \ingroup Group_EndpointPacketManagement_AVR8
+			 *
+			 *  \note This is not applicable for non CONTROL type endpoints.
+			 */
+			static inline void Endpoint_ClearSETUP(void) ATTR_ALWAYS_INLINE;
+			static inline void Endpoint_ClearSETUP(void)
+			{
+				UEINTX &= ~(1 << RXSTPI);
+			}
+
+			/** Sends an IN packet to the host on the currently selected endpoint, freeing up the endpoint for the
+			 *  next packet and switching to the alternative endpoint bank if double banked.
+			 *
+			 *  \ingroup Group_EndpointPacketManagement_AVR8
+			 */
+			static inline void Endpoint_ClearIN(void) ATTR_ALWAYS_INLINE;
+			static inline void Endpoint_ClearIN(void)
+			{
+				#if !defined(CONTROL_ONLY_DEVICE)
+					UEINTX &= ~((1 << TXINI) | (1 << FIFOCON));
+				#else
+					UEINTX &= ~(1 << TXINI);
+				#endif
+			}
+
+			/** Acknowledges an OUT packet to the host on the currently selected endpoint, freeing up the endpoint
+			 *  for the next packet and switching to the alternative endpoint bank if double banked.
+			 *
+			 *  \ingroup Group_EndpointPacketManagement_AVR8
+			 */
+			static inline void Endpoint_ClearOUT(void) ATTR_ALWAYS_INLINE;
+			static inline void Endpoint_ClearOUT(void)
+			{
+				#if !defined(CONTROL_ONLY_DEVICE)
+					UEINTX &= ~((1 << RXOUTI) | (1 << FIFOCON));
+				#else
+					UEINTX &= ~(1 << RXOUTI);
+				#endif
+			}
+
+			/** Stalls the current endpoint, indicating to the host that a logical problem occurred with the
+			 *  indicated endpoint and that the current transfer sequence should be aborted. This provides a
+			 *  way for devices to indicate invalid commands to the host so that the current transfer can be
+			 *  aborted and the host can begin its own recovery sequence.
+			 *
+			 *  The currently selected endpoint remains stalled until either the \ref Endpoint_ClearStall() macro
+			 *  is called, or the host issues a CLEAR FEATURE request to the device for the currently selected
+			 *  endpoint.
+			 *
+			 *  \ingroup Group_EndpointPacketManagement_AVR8
+			 */
+			static inline void Endpoint_StallTransaction(void) ATTR_ALWAYS_INLINE;
+			static inline void Endpoint_StallTransaction(void)
+			{
+				UECONX |= (1 << STALLRQ);
+			}
+
+			/** Clears the STALL condition on the currently selected endpoint.
+			 *
+			 *  \ingroup Group_EndpointPacketManagement_AVR8
+			 */
+			static inline void Endpoint_ClearStall(void) ATTR_ALWAYS_INLINE;
+			static inline void Endpoint_ClearStall(void)
+			{
+				UECONX |= (1 << STALLRQC);
+			}
+
+			/** Determines if the currently selected endpoint is stalled, \c false otherwise.
+			 *
+			 *  \ingroup Group_EndpointPacketManagement_AVR8
+			 *
+			 *  \return Boolean \c true if the currently selected endpoint is stalled, \c false otherwise.
+			 */
+			static inline bool Endpoint_IsStalled(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline bool Endpoint_IsStalled(void)
+			{
+				return ((UECONX & (1 << STALLRQ)) ? true : false);
+			}
+
+			/** Resets the data toggle of the currently selected endpoint. */
+			static inline void Endpoint_ResetDataToggle(void) ATTR_ALWAYS_INLINE;
+			static inline void Endpoint_ResetDataToggle(void)
+			{
+				UECONX |= (1 << RSTDT);
+			}
+
+			/** Sets the direction of the currently selected endpoint.
+			 *
+			 *  \param[in] DirectionMask  New endpoint direction, as a \c ENDPOINT_DIR_* mask.
+			 */
+			static inline void Endpoint_SetEndpointDirection(const uint8_t DirectionMask) ATTR_ALWAYS_INLINE;
+			static inline void Endpoint_SetEndpointDirection(const uint8_t DirectionMask)
+			{
+				UECFG0X = ((UECFG0X & ~(1 << EPDIR)) | (DirectionMask ? (1 << EPDIR) : 0));
+			}
+
+			/** Reads one byte from the currently selected endpoint's bank, for OUT direction endpoints.
+			 *
+			 *  \ingroup Group_EndpointPrimitiveRW_AVR8
+			 *
+			 *  \return Next byte in the currently selected endpoint's FIFO buffer.
+			 */
+			static inline uint8_t Endpoint_Read_8(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline uint8_t Endpoint_Read_8(void)
+			{
+				return UEDATX;
+			}
+
+			/** Writes one byte to the currently selected endpoint's bank, for IN direction endpoints.
+			 *
+			 *  \ingroup Group_EndpointPrimitiveRW_AVR8
+			 *
+			 *  \param[in] Data  Data to write into the the currently selected endpoint's FIFO buffer.
+			 */
+			static inline void Endpoint_Write_8(const uint8_t Data) ATTR_ALWAYS_INLINE;
+			static inline void Endpoint_Write_8(const uint8_t Data)
+			{
+				UEDATX = Data;
+			}
+
+			/** Discards one byte from the currently selected endpoint's bank, for OUT direction endpoints.
+			 *
+			 *  \ingroup Group_EndpointPrimitiveRW_AVR8
+			 */
+			static inline void Endpoint_Discard_8(void) ATTR_ALWAYS_INLINE;
+			static inline void Endpoint_Discard_8(void)
+			{
+				uint8_t Dummy;
+
+				Dummy = UEDATX;
+
+				(void)Dummy;
+			}
+
+			/** Reads two bytes from the currently selected endpoint's bank in little endian format, for OUT
+			 *  direction endpoints.
+			 *
+			 *  \ingroup Group_EndpointPrimitiveRW_AVR8
+			 *
+			 *  \return Next two bytes in the currently selected endpoint's FIFO buffer.
+			 */
+			static inline uint16_t Endpoint_Read_16_LE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline uint16_t Endpoint_Read_16_LE(void)
+			{
+				union
+				{
+					uint16_t Value;
+					uint8_t  Bytes[2];
+				} Data;
+
+				Data.Bytes[0] = UEDATX;
+				Data.Bytes[1] = UEDATX;
+
+				return Data.Value;
+			}
+
+			/** Reads two bytes from the currently selected endpoint's bank in big endian format, for OUT
+			 *  direction endpoints.
+			 *
+			 *  \ingroup Group_EndpointPrimitiveRW_AVR8
+			 *
+			 *  \return Next two bytes in the currently selected endpoint's FIFO buffer.
+			 */
+			static inline uint16_t Endpoint_Read_16_BE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline uint16_t Endpoint_Read_16_BE(void)
+			{
+				union
+				{
+					uint16_t Value;
+					uint8_t  Bytes[2];
+				} Data;
+
+				Data.Bytes[1] = UEDATX;
+				Data.Bytes[0] = UEDATX;
+
+				return Data.Value;
+			}
+
+			/** Writes two bytes to the currently selected endpoint's bank in little endian format, for IN
+			 *  direction endpoints.
+			 *
+			 *  \ingroup Group_EndpointPrimitiveRW_AVR8
+			 *
+			 *  \param[in] Data  Data to write to the currently selected endpoint's FIFO buffer.
+			 */
+			static inline void Endpoint_Write_16_LE(const uint16_t Data) ATTR_ALWAYS_INLINE;
+			static inline void Endpoint_Write_16_LE(const uint16_t Data)
+			{
+				UEDATX = (Data & 0xFF);
+				UEDATX = (Data >> 8);
+			}
+
+			/** Writes two bytes to the currently selected endpoint's bank in big endian format, for IN
+			 *  direction endpoints.
+			 *
+			 *  \ingroup Group_EndpointPrimitiveRW_AVR8
+			 *
+			 *  \param[in] Data  Data to write to the currently selected endpoint's FIFO buffer.
+			 */
+			static inline void Endpoint_Write_16_BE(const uint16_t Data) ATTR_ALWAYS_INLINE;
+			static inline void Endpoint_Write_16_BE(const uint16_t Data)
+			{
+				UEDATX = (Data >> 8);
+				UEDATX = (Data & 0xFF);
+			}
+
+			/** Discards two bytes from the currently selected endpoint's bank, for OUT direction endpoints.
+			 *
+			 *  \ingroup Group_EndpointPrimitiveRW_AVR8
+			 */
+			static inline void Endpoint_Discard_16(void) ATTR_ALWAYS_INLINE;
+			static inline void Endpoint_Discard_16(void)
+			{
+				uint8_t Dummy;
+
+				Dummy = UEDATX;
+				Dummy = UEDATX;
+
+				(void)Dummy;
+			}
+
+			/** Reads four bytes from the currently selected endpoint's bank in little endian format, for OUT
+			 *  direction endpoints.
+			 *
+			 *  \ingroup Group_EndpointPrimitiveRW_AVR8
+			 *
+			 *  \return Next four bytes in the currently selected endpoint's FIFO buffer.
+			 */
+			static inline uint32_t Endpoint_Read_32_LE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline uint32_t Endpoint_Read_32_LE(void)
+			{
+				union
+				{
+					uint32_t Value;
+					uint8_t  Bytes[4];
+				} Data;
+
+				Data.Bytes[0] = UEDATX;
+				Data.Bytes[1] = UEDATX;
+				Data.Bytes[2] = UEDATX;
+				Data.Bytes[3] = UEDATX;
+
+				return Data.Value;
+			}
+
+			/** Reads four bytes from the currently selected endpoint's bank in big endian format, for OUT
+			 *  direction endpoints.
+			 *
+			 *  \ingroup Group_EndpointPrimitiveRW_AVR8
+			 *
+			 *  \return Next four bytes in the currently selected endpoint's FIFO buffer.
+			 */
+			static inline uint32_t Endpoint_Read_32_BE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline uint32_t Endpoint_Read_32_BE(void)
+			{
+				union
+				{
+					uint32_t Value;
+					uint8_t  Bytes[4];
+				} Data;
+
+				Data.Bytes[3] = UEDATX;
+				Data.Bytes[2] = UEDATX;
+				Data.Bytes[1] = UEDATX;
+				Data.Bytes[0] = UEDATX;
+
+				return Data.Value;
+			}
+
+			/** Writes four bytes to the currently selected endpoint's bank in little endian format, for IN
+			 *  direction endpoints.
+			 *
+			 *  \ingroup Group_EndpointPrimitiveRW_AVR8
+			 *
+			 *  \param[in] Data  Data to write to the currently selected endpoint's FIFO buffer.
+			 */
+			static inline void Endpoint_Write_32_LE(const uint32_t Data) ATTR_ALWAYS_INLINE;
+			static inline void Endpoint_Write_32_LE(const uint32_t Data)
+			{
+				UEDATX = (Data &  0xFF);
+				UEDATX = (Data >> 8);
+				UEDATX = (Data >> 16);
+				UEDATX = (Data >> 24);
+			}
+
+			/** Writes four bytes to the currently selected endpoint's bank in big endian format, for IN
+			 *  direction endpoints.
+			 *
+			 *  \ingroup Group_EndpointPrimitiveRW_AVR8
+			 *
+			 *  \param[in] Data  Data to write to the currently selected endpoint's FIFO buffer.
+			 */
+			static inline void Endpoint_Write_32_BE(const uint32_t Data) ATTR_ALWAYS_INLINE;
+			static inline void Endpoint_Write_32_BE(const uint32_t Data)
+			{
+				UEDATX = (Data >> 24);
+				UEDATX = (Data >> 16);
+				UEDATX = (Data >> 8);
+				UEDATX = (Data &  0xFF);
+			}
+
+			/** Discards four bytes from the currently selected endpoint's bank, for OUT direction endpoints.
+			 *
+			 *  \ingroup Group_EndpointPrimitiveRW_AVR8
+			 */
+			static inline void Endpoint_Discard_32(void) ATTR_ALWAYS_INLINE;
+			static inline void Endpoint_Discard_32(void)
+			{
+				uint8_t Dummy;
+
+				Dummy = UEDATX;
+				Dummy = UEDATX;
+				Dummy = UEDATX;
+				Dummy = UEDATX;
+
+				(void)Dummy;
+			}
+
+		/* External Variables: */
+			/** Global indicating the maximum packet size of the default control endpoint located at address
+			 *  0 in the device. This value is set to the value indicated in the device descriptor in the user
+			 *  project once the USB interface is initialized into device mode.
+			 *
+			 *  If space is an issue, it is possible to fix this to a static value by defining the control
+			 *  endpoint size in the \c FIXED_CONTROL_ENDPOINT_SIZE token passed to the compiler in the makefile
+			 *  via the -D switch. When a fixed control endpoint size is used, the size is no longer dynamically
+			 *  read from the descriptors at runtime and instead fixed to the given value. When used, it is
+			 *  important that the descriptor control endpoint size value matches the size given as the
+			 *  \c FIXED_CONTROL_ENDPOINT_SIZE token - it is recommended that the \c FIXED_CONTROL_ENDPOINT_SIZE token
+			 *  be used in the device descriptors to ensure this.
+			 *
+			 *  \attention This variable should be treated as read-only in the user application, and never manually
+			 *             changed in value.
+			 */
+			#if (!defined(FIXED_CONTROL_ENDPOINT_SIZE) || defined(__DOXYGEN__))
+				extern uint8_t USB_Device_ControlEndpointSize;
+			#else
+				#define USB_Device_ControlEndpointSize FIXED_CONTROL_ENDPOINT_SIZE
+			#endif
+
+		/* Function Prototypes: */
+			/** Configures a table of endpoint descriptions, in sequence. This function can be used to configure multiple
+			 *  endpoints at the same time.
+			 *
+			 *  \note Endpoints with a zero address will be ignored, thus this function cannot be used to configure the
+			 *        control endpoint.
+			 *
+			 *  \param[in] Table    Pointer to a table of endpoint descriptions.
+			 *  \param[in] Entries  Number of entries in the endpoint table to configure.
+			 *
+			 *  \return Boolean \c true if all endpoints configured successfully, \c false otherwise.
+			 */
+			bool Endpoint_ConfigureEndpointTable(const USB_Endpoint_Table_t* const Table,
+			                                     const uint8_t Entries);
+
+			/** Completes the status stage of a control transfer on a CONTROL type endpoint automatically,
+			 *  with respect to the data direction. This is a convenience function which can be used to
+			 *  simplify user control request handling.
+			 *
+			 *  \note This routine should not be called on non CONTROL type endpoints.
+			 */
+			void Endpoint_ClearStatusStage(void);
+
+			/** Spin-loops until the currently selected non-control endpoint is ready for the next packet of data
+			 *  to be read or written to it.
+			 *
+			 *  \note This routine should not be called on CONTROL type endpoints.
+			 *
+			 *  \ingroup Group_EndpointRW_AVR8
+			 *
+			 *  \return A value from the \ref Endpoint_WaitUntilReady_ErrorCodes_t enum.
+			 */
+			uint8_t Endpoint_WaitUntilReady(void);
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Core/AVR8/Host_AVR8.c b/lib/lufa/LUFA/Drivers/USB/Core/AVR8/Host_AVR8.c
new file mode 100644
index 0000000000..cbb7735e1c
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Core/AVR8/Host_AVR8.c
@@ -0,0 +1,297 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+#include "../../../../Common/Common.h"
+#if (ARCH == ARCH_AVR8)
+
+#define  __INCLUDE_FROM_USB_DRIVER
+#include "../USBMode.h"
+
+#if defined(USB_CAN_BE_HOST)
+
+#define  __INCLUDE_FROM_HOST_C
+#include "../Host.h"
+
+void USB_Host_ProcessNextHostState(void)
+{
+	uint8_t ErrorCode    = HOST_ENUMERROR_NoError;
+	uint8_t SubErrorCode = HOST_ENUMERROR_NoError;
+
+	static uint16_t WaitMSRemaining;
+	static uint8_t  PostWaitState;
+
+	switch (USB_HostState)
+	{
+		case HOST_STATE_WaitForDevice:
+			if (WaitMSRemaining)
+			{
+				if ((SubErrorCode = USB_Host_WaitMS(1)) != HOST_WAITERROR_Successful)
+				{
+					USB_HostState = PostWaitState;
+					ErrorCode     = HOST_ENUMERROR_WaitStage;
+					break;
+				}
+
+				if (!(--WaitMSRemaining))
+				  USB_HostState = PostWaitState;
+			}
+
+			break;
+		case HOST_STATE_Powered:
+			WaitMSRemaining = HOST_DEVICE_SETTLE_DELAY_MS;
+
+			USB_HostState = HOST_STATE_Powered_WaitForDeviceSettle;
+			break;
+		case HOST_STATE_Powered_WaitForDeviceSettle:
+			if (WaitMSRemaining--)
+			{
+				Delay_MS(1);
+				break;
+			}
+			else
+			{
+				USB_Host_VBUS_Manual_Off();
+
+				USB_OTGPAD_On();
+				USB_Host_VBUS_Auto_Enable();
+				USB_Host_VBUS_Auto_On();
+
+				#if defined(NO_AUTO_VBUS_MANAGEMENT)
+				USB_Host_VBUS_Manual_Enable();
+				USB_Host_VBUS_Manual_On();
+				#endif
+
+				USB_HostState = HOST_STATE_Powered_WaitForConnect;
+			}
+
+			break;
+		case HOST_STATE_Powered_WaitForConnect:
+			if (USB_INT_HasOccurred(USB_INT_DCONNI))
+			{
+				USB_INT_Clear(USB_INT_DCONNI);
+				USB_INT_Clear(USB_INT_DDISCI);
+
+				USB_INT_Clear(USB_INT_VBERRI);
+				USB_INT_Enable(USB_INT_VBERRI);
+
+				USB_Host_ResumeBus();
+				Pipe_ClearPipes();
+
+				HOST_TASK_NONBLOCK_WAIT(100, HOST_STATE_Powered_DoReset);
+			}
+
+			break;
+		case HOST_STATE_Powered_DoReset:
+			USB_Host_ResetDevice();
+
+			HOST_TASK_NONBLOCK_WAIT(200, HOST_STATE_Powered_ConfigPipe);
+			break;
+		case HOST_STATE_Powered_ConfigPipe:
+			if (!(Pipe_ConfigurePipe(PIPE_CONTROLPIPE, EP_TYPE_CONTROL, ENDPOINT_CONTROLEP, PIPE_CONTROLPIPE_DEFAULT_SIZE, 1)))
+			{
+				ErrorCode    = HOST_ENUMERROR_PipeConfigError;
+				SubErrorCode = 0;
+				break;
+			}
+
+			USB_HostState = HOST_STATE_Default;
+			break;
+		case HOST_STATE_Default:
+			USB_ControlRequest = (USB_Request_Header_t)
+				{
+					.bmRequestType = (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE),
+					.bRequest      = REQ_GetDescriptor,
+					.wValue        = (DTYPE_Device << 8),
+					.wIndex        = 0,
+					.wLength       = 8,
+				};
+
+			uint8_t DataBuffer[8];
+
+			Pipe_SelectPipe(PIPE_CONTROLPIPE);
+			if ((SubErrorCode = USB_Host_SendControlRequest(DataBuffer)) != HOST_SENDCONTROL_Successful)
+			{
+				ErrorCode = HOST_ENUMERROR_ControlError;
+				break;
+			}
+
+			USB_Host_ControlPipeSize = DataBuffer[offsetof(USB_Descriptor_Device_t, Endpoint0Size)];
+
+			USB_Host_ResetDevice();
+
+			HOST_TASK_NONBLOCK_WAIT(200, HOST_STATE_Default_PostReset);
+			break;
+		case HOST_STATE_Default_PostReset:
+			if (!(Pipe_ConfigurePipe(PIPE_CONTROLPIPE, EP_TYPE_CONTROL, ENDPOINT_CONTROLEP, USB_Host_ControlPipeSize, 1)))
+			{
+				ErrorCode    = HOST_ENUMERROR_PipeConfigError;
+				SubErrorCode = 0;
+				break;
+			}
+
+			USB_ControlRequest = (USB_Request_Header_t)
+				{
+					.bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE),
+					.bRequest      = REQ_SetAddress,
+					.wValue        = USB_HOST_DEVICEADDRESS,
+					.wIndex        = 0,
+					.wLength       = 0,
+				};
+
+			if ((SubErrorCode = USB_Host_SendControlRequest(NULL)) != HOST_SENDCONTROL_Successful)
+			{
+				ErrorCode = HOST_ENUMERROR_ControlError;
+				break;
+			}
+
+			HOST_TASK_NONBLOCK_WAIT(100, HOST_STATE_Default_PostAddressSet);
+			break;
+		case HOST_STATE_Default_PostAddressSet:
+			USB_Host_SetDeviceAddress(USB_HOST_DEVICEADDRESS);
+
+			USB_HostState = HOST_STATE_Addressed;
+
+			EVENT_USB_Host_DeviceEnumerationComplete();
+			break;
+
+		default:
+			break;
+	}
+
+	if ((ErrorCode != HOST_ENUMERROR_NoError) && (USB_HostState != HOST_STATE_Unattached))
+	{
+		EVENT_USB_Host_DeviceEnumerationFailed(ErrorCode, SubErrorCode);
+
+		USB_Host_VBUS_Auto_Off();
+
+		EVENT_USB_Host_DeviceUnattached();
+
+		USB_ResetInterface();
+	}
+}
+
+uint8_t USB_Host_WaitMS(uint8_t MS)
+{
+	bool    BusSuspended = USB_Host_IsBusSuspended();
+	uint8_t ErrorCode    = HOST_WAITERROR_Successful;
+	bool    HSOFIEnabled = USB_INT_IsEnabled(USB_INT_HSOFI);
+
+	USB_INT_Disable(USB_INT_HSOFI);
+	USB_INT_Clear(USB_INT_HSOFI);
+
+	USB_Host_ResumeBus();
+
+	while (MS)
+	{
+		if (USB_INT_HasOccurred(USB_INT_HSOFI))
+		{
+			USB_INT_Clear(USB_INT_HSOFI);
+			MS--;
+		}
+
+		if ((USB_HostState == HOST_STATE_Unattached) || (USB_CurrentMode != USB_MODE_Host))
+		{
+			ErrorCode = HOST_WAITERROR_DeviceDisconnect;
+
+			break;
+		}
+
+		if (Pipe_IsError())
+		{
+			Pipe_ClearError();
+			ErrorCode = HOST_WAITERROR_PipeError;
+
+			break;
+		}
+
+		if (Pipe_IsStalled())
+		{
+			Pipe_ClearStall();
+			ErrorCode = HOST_WAITERROR_SetupStalled;
+
+			break;
+		}
+	}
+
+	if (BusSuspended)
+	  USB_Host_SuspendBus();
+
+	if (HSOFIEnabled)
+	  USB_INT_Enable(USB_INT_HSOFI);
+
+	return ErrorCode;
+}
+
+static void USB_Host_ResetDevice(void)
+{
+	bool BusSuspended = USB_Host_IsBusSuspended();
+
+	USB_INT_Disable(USB_INT_DDISCI);
+
+	USB_Host_ResetBus();
+	while (!(USB_Host_IsBusResetComplete()));
+	USB_Host_ResumeBus();
+
+	USB_Host_ConfigurationNumber = 0;
+
+	bool HSOFIEnabled = USB_INT_IsEnabled(USB_INT_HSOFI);
+
+	USB_INT_Disable(USB_INT_HSOFI);
+	USB_INT_Clear(USB_INT_HSOFI);
+
+	for (uint8_t MSRem = 10; MSRem != 0; MSRem--)
+	{
+		/* Workaround for powerless-pull-up devices. After a USB bus reset,
+		   all disconnection interrupts are suppressed while a USB frame is
+		   looked for - if it is found within 10ms, the device is still
+		   present.                                                        */
+
+		if (USB_INT_HasOccurred(USB_INT_HSOFI))
+		{
+			USB_INT_Clear(USB_INT_HSOFI);
+			USB_INT_Clear(USB_INT_DDISCI);
+			break;
+		}
+
+		Delay_MS(1);
+	}
+
+	if (HSOFIEnabled)
+	  USB_INT_Enable(USB_INT_HSOFI);
+
+	if (BusSuspended)
+	  USB_Host_SuspendBus();
+
+	USB_INT_Enable(USB_INT_DDISCI);
+}
+
+#endif
+
+#endif
diff --git a/lib/lufa/LUFA/Drivers/USB/Core/AVR8/Host_AVR8.h b/lib/lufa/LUFA/Drivers/USB/Core/AVR8/Host_AVR8.h
new file mode 100644
index 0000000000..7a48e3162d
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Core/AVR8/Host_AVR8.h
@@ -0,0 +1,372 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief USB Host definitions for the AVR8 microcontrollers.
+ *  \copydetails Group_Host_AVR8
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the USB driver
+ *        dispatch header located in LUFA/Drivers/USB/USB.h.
+ */
+
+/** \ingroup Group_Host
+ *  \defgroup Group_Host_AVR8 Host Management (AVR8)
+ *  \brief USB Host definitions for the AVR8 microcontrollers.
+ *
+ *  Architecture specific USB Host definitions for the Atmel 8-bit AVR microcontrollers.
+ *
+ *  @{
+ */
+
+#ifndef __USBHOST_AVR8_H__
+#define __USBHOST_AVR8_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+		#include "../StdDescriptors.h"
+		#include "../Pipe.h"
+		#include "../USBInterrupt.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_USB_DRIVER)
+			#error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.
+		#endif
+
+		#if defined(INVERTED_VBUS_ENABLE_LINE) && !defined(NO_AUTO_VBUS_MANAGEMENT)
+			#error The INVERTED_VBUS_ENABLE_LINE compile option requires NO_AUTO_VBUS_MANAGEMENT for the AVR8 architecture.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Indicates the fixed USB device address which any attached device is enumerated to when in
+			 *  host mode. As only one USB device may be attached to the AVR in host mode at any one time
+			 *  and that the address used is not important (other than the fact that it is non-zero), a
+			 *  fixed value is specified by the library.
+			 */
+			#define USB_HOST_DEVICEADDRESS                 1
+
+			#if !defined(HOST_DEVICE_SETTLE_DELAY_MS) || defined(__DOXYGEN__)
+				/** Constant for the delay in milliseconds after a device is connected before the library
+				 *  will start the enumeration process. Some devices require a delay of up to 5 seconds
+				 *  after connection before the enumeration process can start or incorrect operation will
+				 *  occur.
+				 *
+				 *  The default delay value may be overridden in the user project makefile by defining the
+				 *  \c HOST_DEVICE_SETTLE_DELAY_MS token to the required delay in milliseconds, and passed to the
+				 *  compiler using the -D switch.
+				 */
+				#define HOST_DEVICE_SETTLE_DELAY_MS        1000
+			#endif
+
+			/** Enum for the error codes for the \ref EVENT_USB_Host_HostError() event.
+			 *
+			 *  \see \ref Group_Events for more information on this event.
+			 */
+			enum USB_Host_ErrorCodes_t
+			{
+				HOST_ERROR_VBusVoltageDip       = 0, /**< VBUS voltage dipped to an unacceptable level. This
+				                                      *   error may be the result of an attached device drawing
+				                                      *   too much current from the VBUS line, or due to the
+				                                      *   AVR's power source being unable to supply sufficient
+				                                      *   current.
+				                                      */
+			};
+
+			/** Enum for the error codes for the \ref EVENT_USB_Host_DeviceEnumerationFailed() event.
+			 *
+			 *  \see \ref Group_Events for more information on this event.
+			 */
+			enum USB_Host_EnumerationErrorCodes_t
+			{
+				HOST_ENUMERROR_NoError          = 0, /**< No error occurred. Used internally, this is not a valid
+				                                      *   ErrorCode parameter value for the \ref EVENT_USB_Host_DeviceEnumerationFailed()
+				                                      *   event.
+				                                      */
+				HOST_ENUMERROR_WaitStage        = 1, /**< One of the delays between enumeration steps failed
+				                                      *   to complete successfully, due to a timeout or other
+				                                      *   error.
+				                                      */
+				HOST_ENUMERROR_NoDeviceDetected = 2, /**< No device was detected, despite the USB data lines
+				                                      *   indicating the attachment of a device.
+				                                      */
+				HOST_ENUMERROR_ControlError     = 3, /**< One of the enumeration control requests failed to
+				                                      *   complete successfully.
+				                                      */
+				HOST_ENUMERROR_PipeConfigError  = 4, /**< The default control pipe (address 0) failed to
+				                                      *   configure correctly.
+				                                      */
+			};
+
+		/* Inline Functions: */
+			/** Returns the current USB frame number, when in host mode. Every millisecond the USB bus is active (i.e. not suspended)
+			 *  the frame number is incremented by one.
+			 *
+			 *  \return Current USB frame number from the USB controller.
+			 */
+			static inline uint16_t USB_Host_GetFrameNumber(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline uint16_t USB_Host_GetFrameNumber(void)
+			{
+				return UHFNUM;
+			}
+
+			#if !defined(NO_SOF_EVENTS)
+				/** Enables the host mode Start Of Frame events. When enabled, this causes the
+				 *  \ref EVENT_USB_Host_StartOfFrame() event to fire once per millisecond, synchronized to the USB bus,
+				 *  at the start of each USB frame when a device is enumerated while in host mode.
+				 *
+				 *  \note This function is not available when the \c NO_SOF_EVENTS compile time token is defined.
+				 */
+				static inline void USB_Host_EnableSOFEvents(void) ATTR_ALWAYS_INLINE;
+				static inline void USB_Host_EnableSOFEvents(void)
+				{
+					USB_INT_Enable(USB_INT_HSOFI);
+				}
+
+				/** Disables the host mode Start Of Frame events. When disabled, this stops the firing of the
+				 *  \ref EVENT_USB_Host_StartOfFrame() event when enumerated in host mode.
+				 *
+				 *  \note This function is not available when the \c NO_SOF_EVENTS compile time token is defined.
+				 */
+				static inline void USB_Host_DisableSOFEvents(void) ATTR_ALWAYS_INLINE;
+				static inline void USB_Host_DisableSOFEvents(void)
+				{
+					USB_INT_Disable(USB_INT_HSOFI);
+				}
+			#endif
+
+			/** Resets the USB bus, including the endpoints in any attached device and pipes on the AVR host.
+			 *  USB bus resets leave the default control pipe configured (if already configured).
+			 *
+			 *  If the USB bus has been suspended prior to issuing a bus reset, the attached device will be
+			 *  woken up automatically and the bus resumed after the reset has been correctly issued.
+			 */
+			static inline void USB_Host_ResetBus(void) ATTR_ALWAYS_INLINE;
+			static inline void USB_Host_ResetBus(void)
+			{
+				UHCON |=  (1 << RESET);
+			}
+
+			/** Determines if a previously issued bus reset (via the \ref USB_Host_ResetBus() macro) has
+			 *  completed.
+			 *
+			 *  \return Boolean \c true if no bus reset is currently being sent, \c false otherwise.
+			 */
+			static inline bool USB_Host_IsBusResetComplete(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline bool USB_Host_IsBusResetComplete(void)
+			{
+				return ((UHCON & (1 << RESET)) ? false : true);
+			}
+
+			/** Resumes USB communications with an attached and enumerated device, by resuming the transmission
+			 *  of the 1MS Start Of Frame messages to the device. When resumed, USB communications between the
+			 *  host and attached device may occur.
+			 */
+			static inline void USB_Host_ResumeBus(void) ATTR_ALWAYS_INLINE;
+			static inline void USB_Host_ResumeBus(void)
+			{
+				UHCON |=  (1 << SOFEN);
+			}
+
+			/** Suspends the USB bus, preventing any communications from occurring between the host and attached
+			 *  device until the bus has been resumed. This stops the transmission of the 1MS Start Of Frame
+			 *  messages to the device.
+			 *
+			 *  \attention While the USB bus is suspended, all USB interrupt sources are also disabled; this means that
+			 *             some events (such as device disconnections) will not fire until the bus is resumed.
+			 */
+			static inline void USB_Host_SuspendBus(void) ATTR_ALWAYS_INLINE;
+			static inline void USB_Host_SuspendBus(void)
+			{
+				UHCON &= ~(1 << SOFEN);
+			}
+
+			/** Determines if the USB bus has been suspended via the use of the \ref USB_Host_SuspendBus() macro,
+			 *  false otherwise. While suspended, no USB communications can occur until the bus is resumed,
+			 *  except for the Remote Wakeup event from the device if supported.
+			 *
+			 *  \return Boolean \c true if the bus is currently suspended, \c false otherwise.
+			 */
+			static inline bool USB_Host_IsBusSuspended(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline bool USB_Host_IsBusSuspended(void)
+			{
+				return ((UHCON & (1 << SOFEN)) ? false : true);
+			}
+
+			/** Determines if the attached device is currently enumerated in Full Speed mode (12Mb/s), or
+			 *  false if the attached device is enumerated in Low Speed mode (1.5Mb/s).
+			 *
+			 *  \return Boolean \c true if the attached device is enumerated in Full Speed mode, \c false otherwise.
+			 */
+			static inline bool USB_Host_IsDeviceFullSpeed(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline bool USB_Host_IsDeviceFullSpeed(void)
+			{
+				return ((USBSTA & (1 << SPEED)) ? true : false);
+			}
+
+			/** Determines if the attached device is currently issuing a Remote Wakeup request, requesting
+			 *  that the host resume the USB bus and wake up the device, \c false otherwise.
+			 *
+			 *  \return Boolean \c true if the attached device has sent a Remote Wakeup request, \c false otherwise.
+			 */
+			static inline bool USB_Host_IsRemoteWakeupSent(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline bool USB_Host_IsRemoteWakeupSent(void)
+			{
+				return ((UHINT & (1 << RXRSMI)) ? true : false);
+			}
+
+			/** Clears the flag indicating that a Remote Wakeup request has been issued by an attached device. */
+			static inline void USB_Host_ClearRemoteWakeupSent(void) ATTR_ALWAYS_INLINE;
+			static inline void USB_Host_ClearRemoteWakeupSent(void)
+			{
+				UHINT &= ~(1 << RXRSMI);
+			}
+
+			/** Accepts a Remote Wakeup request from an attached device. This must be issued in response to
+			 *  a device's Remote Wakeup request within 2ms for the request to be accepted and the bus to
+			 *  be resumed.
+			 */
+			static inline void USB_Host_ResumeFromWakeupRequest(void) ATTR_ALWAYS_INLINE;
+			static inline void USB_Host_ResumeFromWakeupRequest(void)
+			{
+				UHCON |=  (1 << RESUME);
+			}
+
+			/** Determines if a resume from Remote Wakeup request is currently being sent to an attached
+			 *  device.
+			 *
+			 *  \return Boolean \c true if no resume request is currently being sent, \c false otherwise.
+			 */
+			static inline bool USB_Host_IsResumeFromWakeupRequestSent(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline bool USB_Host_IsResumeFromWakeupRequestSent(void)
+			{
+				return ((UHCON & (1 << RESUME)) ? false : true);
+			}
+
+	/* Private Interface - For use in library only: */
+	#if !defined(__DOXYGEN__)
+		/* Macros: */
+			static inline void USB_Host_HostMode_On(void) ATTR_ALWAYS_INLINE;
+			static inline void USB_Host_HostMode_On(void)
+			{
+				USBCON |=  (1 << HOST);
+			}
+
+			static inline void USB_Host_HostMode_Off(void) ATTR_ALWAYS_INLINE;
+			static inline void USB_Host_HostMode_Off(void)
+			{
+				USBCON &= ~(1 << HOST);
+			}
+
+			static inline void USB_Host_VBUS_Auto_Enable(void) ATTR_ALWAYS_INLINE;
+			static inline void USB_Host_VBUS_Auto_Enable(void)
+			{
+				OTGCON &= ~(1 << VBUSHWC);
+				UHWCON |=  (1 << UVCONE);
+			}
+
+			static inline void USB_Host_VBUS_Manual_Enable(void) ATTR_ALWAYS_INLINE;
+			static inline void USB_Host_VBUS_Manual_Enable(void)
+			{
+				OTGCON |=  (1 << VBUSHWC);
+				UHWCON &= ~(1 << UVCONE);
+
+				DDRE   |=  (1 << 7);
+			}
+
+			static inline void USB_Host_VBUS_Auto_On(void) ATTR_ALWAYS_INLINE;
+			static inline void USB_Host_VBUS_Auto_On(void)
+			{
+				OTGCON |=  (1 << VBUSREQ);
+			}
+
+			static inline void USB_Host_VBUS_Manual_On(void) ATTR_ALWAYS_INLINE;
+			static inline void USB_Host_VBUS_Manual_On(void)
+			{
+				#if defined(INVERTED_VBUS_ENABLE_LINE)
+				PORTE  &= ~(1 << 7);
+				#else
+				PORTE  |=  (1 << 7);
+				#endif
+			}
+
+			static inline void USB_Host_VBUS_Auto_Off(void) ATTR_ALWAYS_INLINE;
+			static inline void USB_Host_VBUS_Auto_Off(void)
+			{
+				OTGCON |=  (1 << VBUSRQC);
+			}
+
+			static inline void USB_Host_VBUS_Manual_Off(void) ATTR_ALWAYS_INLINE;
+			static inline void USB_Host_VBUS_Manual_Off(void)
+			{
+				#if defined(INVERTED_VBUS_ENABLE_LINE)
+				PORTE  |=  (1 << 7);
+				#else
+				PORTE  &= ~(1 << 7);
+				#endif
+			}
+
+			static inline void USB_Host_SetDeviceAddress(const uint8_t Address) ATTR_ALWAYS_INLINE;
+			static inline void USB_Host_SetDeviceAddress(const uint8_t Address)
+			{
+				UHADDR  =  (Address & 0x7F);
+			}
+
+		/* Enums: */
+			enum USB_Host_WaitMSErrorCodes_t
+			{
+				HOST_WAITERROR_Successful       = 0,
+				HOST_WAITERROR_DeviceDisconnect = 1,
+				HOST_WAITERROR_PipeError        = 2,
+				HOST_WAITERROR_SetupStalled     = 3,
+			};
+
+		/* Function Prototypes: */
+			void    USB_Host_ProcessNextHostState(void);
+			uint8_t USB_Host_WaitMS(uint8_t MS);
+
+			#if defined(__INCLUDE_FROM_HOST_C)
+				static void USB_Host_ResetDevice(void);
+			#endif
+	#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Core/AVR8/OTG_AVR8.h b/lib/lufa/LUFA/Drivers/USB/Core/AVR8/OTG_AVR8.h
new file mode 100644
index 0000000000..74c70ccdfd
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Core/AVR8/OTG_AVR8.h
@@ -0,0 +1,159 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief USB OTG definitions for the AVR8 microcontrollers.
+ *  \copydetails Group_OTG_AVR8
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the USB driver
+ *        dispatch header located in LUFA/Drivers/USB/USB.h.
+ */
+
+/** \ingroup Group_OTG
+ *  \defgroup Group_OTG_AVR8 USB On The Go (OTG) Management (AVR8)
+ *  \brief USB OTG definitions for the AVR8 microcontrollers.
+ *
+ *  Architecture specific USB OTG definitions for the Atmel 8-bit AVR microcontrollers.
+ *
+ *  @{
+ */
+
+#ifndef __USBOTG_AVR8_H__
+#define __USBOTG_AVR8_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_USB_DRIVER)
+			#error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Mask for the VBUS pulsing method of SRP, supported by some OTG devices.
+			 *
+			 *  \see \ref USB_OTG_Device_InitiateSRP().
+			 */
+			#define USB_OTG_SRP_VBUS                   (1 << SRPSEL)
+
+			/** Mask for the Data + pulsing method of SRP, supported by some OTG devices.
+			 *
+			 *  \see \ref USB_OTG_Device_InitiateSRP().
+			 */
+			#define USB_OTG_STP_DATA                   0
+
+		/* Inline Functions: */
+			/** Initiate a Host Negotiation Protocol request. This indicates to the other connected device
+			 *  that the device wishes to change device/host roles.
+			 */
+			static inline void USB_OTG_Device_RequestHNP(void) ATTR_ALWAYS_INLINE;
+			static inline void USB_OTG_Device_RequestHNP(void)
+			{
+				OTGCON |=  (1 << HNPREQ);
+			}
+
+			/** Cancel a Host Negotiation Protocol request. This stops a pending HNP request to the other
+			 *  connected device.
+			 */
+			static inline void USB_OTG_Device_CancelHNPRequest(void) ATTR_ALWAYS_INLINE;
+			static inline void USB_OTG_Device_CancelHNPRequest(void)
+			{
+				OTGCON &= ~(1 << HNPREQ);
+			}
+
+			/** Determines if the device is currently sending a HNP to an attached host.
+			 *
+			 *  \return Boolean \c true if currently sending a HNP to the other connected device, \c false otherwise
+			 */
+			static inline bool USB_OTG_Device_IsSendingHNP(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline bool USB_OTG_Device_IsSendingHNP(void)
+			{
+				return ((OTGCON & (1 << HNPREQ)) ? true : false);
+			}
+
+			/** Initiates a Session Request Protocol request. Most OTG devices turn off VBUS when the USB
+			 *  interface is not in use, to conserve power. Sending a SRP to a USB OTG device running in
+			 *  host mode indicates that VBUS should be applied and a session started.
+			 *
+			 *  There are two different methods of sending a SRP - either pulses on the VBUS line, or by
+			 *  pulsing the Data + line via the internal pull-up resistor.
+			 *
+			 *  \param[in] SRPTypeMask  Mask indicating the type of SRP to use, either \ref USB_OTG_SRP_VBUS or
+			 *                          \ref USB_OTG_STP_DATA.
+			 */
+			static inline void USB_OTG_Device_InitiateSRP(const uint8_t SRPTypeMask) ATTR_ALWAYS_INLINE;
+			static inline void USB_OTG_Device_InitiateSRP(const uint8_t SRPTypeMask)
+			{
+				OTGCON = ((OTGCON & ~(1 << SRPSEL)) | (SRPTypeMask | (1 << SRPREQ)));
+			}
+
+			/** Accepts a HNP from a connected device, indicating that both devices should exchange
+			 *  device/host roles.
+			 */
+			static inline void USB_OTG_Host_AcceptHNP(void) ATTR_ALWAYS_INLINE;
+			static inline void USB_OTG_Host_AcceptHNP(void)
+			{
+				OTGCON |=  (1 << HNPREQ);
+			}
+
+			/** Rejects a HNP from a connected device, indicating that both devices should remain in their
+			 *  current device/host roles.
+			 */
+			static inline void USB_OTG_Host_RejectHNP(void) ATTR_ALWAYS_INLINE;
+			static inline void USB_OTG_Host_RejectHNP(void)
+			{
+				OTGCON &= ~(1 << HNPREQ);
+			}
+
+			/** Indicates if the connected device is currently sending a HNP request.
+			 *
+			 *  \return Boolean \c true if a HNP is currently being issued by the connected device, \c false otherwise.
+			 */
+			static inline bool USB_OTG_Host_IsHNPReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline bool USB_OTG_Host_IsHNPReceived(void)
+			{
+				return ((OTGCON & (1 << HNPREQ)) ? true : false);
+			}
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.c b/lib/lufa/LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.c
new file mode 100644
index 0000000000..7b17d45d4f
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.c
@@ -0,0 +1,221 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+#include "../../../../Common/Common.h"
+#if (ARCH == ARCH_AVR8)
+
+#define  __INCLUDE_FROM_USB_DRIVER
+#include "../USBMode.h"
+
+#if defined(USB_CAN_BE_HOST)
+
+#include "PipeStream_AVR8.h"
+
+uint8_t Pipe_Discard_Stream(uint16_t Length,
+                            uint16_t* const BytesProcessed)
+{
+	uint8_t  ErrorCode;
+	uint16_t BytesInTransfer = 0;
+
+	Pipe_SetPipeToken(PIPE_TOKEN_IN);
+
+	if ((ErrorCode = Pipe_WaitUntilReady()))
+	  return ErrorCode;
+
+	if (BytesProcessed != NULL)
+	  Length -= *BytesProcessed;
+
+	while (Length)
+	{
+		if (!(Pipe_IsReadWriteAllowed()))
+		{
+			Pipe_ClearIN();
+
+			if (BytesProcessed != NULL)
+			{
+				*BytesProcessed += BytesInTransfer;
+				return PIPE_RWSTREAM_IncompleteTransfer;
+			}
+
+			if ((ErrorCode = Pipe_WaitUntilReady()))
+			  return ErrorCode;
+		}
+		else
+		{
+			Pipe_Discard_8();
+
+			Length--;
+			BytesInTransfer++;
+		}
+	}
+
+	return PIPE_RWSTREAM_NoError;
+}
+
+uint8_t Pipe_Null_Stream(uint16_t Length,
+                         uint16_t* const BytesProcessed)
+{
+	uint8_t  ErrorCode;
+	uint16_t BytesInTransfer = 0;
+
+	Pipe_SetPipeToken(PIPE_TOKEN_OUT);
+
+	if ((ErrorCode = Pipe_WaitUntilReady()))
+	  return ErrorCode;
+
+	if (BytesProcessed != NULL)
+	  Length -= *BytesProcessed;
+
+	while (Length)
+	{
+		if (!(Pipe_IsReadWriteAllowed()))
+		{
+			Pipe_ClearOUT();
+
+			if (BytesProcessed != NULL)
+			{
+				*BytesProcessed += BytesInTransfer;
+				return PIPE_RWSTREAM_IncompleteTransfer;
+			}
+
+			USB_USBTask();
+
+			if ((ErrorCode = Pipe_WaitUntilReady()))
+			  return ErrorCode;
+		}
+		else
+		{
+			Pipe_Write_8(0);
+
+			Length--;
+			BytesInTransfer++;
+		}
+	}
+
+	return PIPE_RWSTREAM_NoError;
+}
+
+/* The following abuses the C preprocessor in order to copy-paste common code with slight alterations,
+ * so that the code needs to be written once. It is a crude form of templating to reduce code maintenance. */
+
+#define  TEMPLATE_FUNC_NAME                        Pipe_Write_Stream_LE
+#define  TEMPLATE_BUFFER_TYPE                      const void*
+#define  TEMPLATE_TOKEN                            PIPE_TOKEN_OUT
+#define  TEMPLATE_CLEAR_PIPE()                     Pipe_ClearOUT()
+#define  TEMPLATE_BUFFER_OFFSET(Length)            0
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   DataStream += Amount
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Pipe_Write_8(*BufferPtr)
+#include "Template/Template_Pipe_RW.c"
+
+#define  TEMPLATE_FUNC_NAME                        Pipe_Write_Stream_BE
+#define  TEMPLATE_BUFFER_TYPE                      const void*
+#define  TEMPLATE_TOKEN                            PIPE_TOKEN_OUT
+#define  TEMPLATE_CLEAR_PIPE()                     Pipe_ClearOUT()
+#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   DataStream -= Amount
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Pipe_Write_8(*BufferPtr)
+#include "Template/Template_Pipe_RW.c"
+
+#define  TEMPLATE_FUNC_NAME                        Pipe_Read_Stream_LE
+#define  TEMPLATE_BUFFER_TYPE                      void*
+#define  TEMPLATE_TOKEN                            PIPE_TOKEN_IN
+#define  TEMPLATE_CLEAR_PIPE()                     Pipe_ClearIN()
+#define  TEMPLATE_BUFFER_OFFSET(Length)            0
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   DataStream += Amount
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         *BufferPtr = Pipe_Read_8()
+#include "Template/Template_Pipe_RW.c"
+
+#define  TEMPLATE_FUNC_NAME                        Pipe_Read_Stream_BE
+#define  TEMPLATE_BUFFER_TYPE                      void*
+#define  TEMPLATE_TOKEN                            PIPE_TOKEN_IN
+#define  TEMPLATE_CLEAR_PIPE()                     Pipe_ClearIN()
+#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   DataStream -= Amount
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         *BufferPtr = Pipe_Read_8()
+#include "Template/Template_Pipe_RW.c"
+
+#define  TEMPLATE_FUNC_NAME                        Pipe_Write_PStream_LE
+#define  TEMPLATE_BUFFER_TYPE                      const void*
+#define  TEMPLATE_TOKEN                            PIPE_TOKEN_OUT
+#define  TEMPLATE_CLEAR_PIPE()                     Pipe_ClearOUT()
+#define  TEMPLATE_BUFFER_OFFSET(Length)            0
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   DataStream += Amount
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Pipe_Write_8(pgm_read_byte(BufferPtr))
+#include "Template/Template_Pipe_RW.c"
+
+#define  TEMPLATE_FUNC_NAME                        Pipe_Write_PStream_BE
+#define  TEMPLATE_BUFFER_TYPE                      const void*
+#define  TEMPLATE_TOKEN                            PIPE_TOKEN_OUT
+#define  TEMPLATE_CLEAR_PIPE()                     Pipe_ClearOUT()
+#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   DataStream -= Amount
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Pipe_Write_8(pgm_read_byte(BufferPtr))
+#include "Template/Template_Pipe_RW.c"
+
+#define  TEMPLATE_FUNC_NAME                        Pipe_Write_EStream_LE
+#define  TEMPLATE_BUFFER_TYPE                      const void*
+#define  TEMPLATE_TOKEN                            PIPE_TOKEN_OUT
+#define  TEMPLATE_CLEAR_PIPE()                     Pipe_ClearOUT()
+#define  TEMPLATE_BUFFER_OFFSET(Length)            0
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   DataStream += Amount
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Pipe_Write_8(eeprom_read_byte(BufferPtr))
+#include "Template/Template_Pipe_RW.c"
+
+#define  TEMPLATE_FUNC_NAME                        Pipe_Write_EStream_BE
+#define  TEMPLATE_BUFFER_TYPE                      const void*
+#define  TEMPLATE_TOKEN                            PIPE_TOKEN_OUT
+#define  TEMPLATE_CLEAR_PIPE()                     Pipe_ClearOUT()
+#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   DataStream -= Amount
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Pipe_Write_8(eeprom_read_byte(BufferPtr))
+#include "Template/Template_Pipe_RW.c"
+
+#define  TEMPLATE_FUNC_NAME                        Pipe_Read_EStream_LE
+#define  TEMPLATE_BUFFER_TYPE                      void*
+#define  TEMPLATE_TOKEN                            PIPE_TOKEN_IN
+#define  TEMPLATE_CLEAR_PIPE()                     Pipe_ClearIN()
+#define  TEMPLATE_BUFFER_OFFSET(Length)            0
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   DataStream += Amount
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         eeprom_update_byte(BufferPtr, Pipe_Read_8())
+#include "Template/Template_Pipe_RW.c"
+
+#define  TEMPLATE_FUNC_NAME                        Pipe_Read_EStream_BE
+#define  TEMPLATE_BUFFER_TYPE                      void*
+#define  TEMPLATE_TOKEN                            PIPE_TOKEN_IN
+#define  TEMPLATE_CLEAR_PIPE()                     Pipe_ClearIN()
+#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   DataStream -= Amount
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         eeprom_update_byte(BufferPtr, Pipe_Read_8())
+#include "Template/Template_Pipe_RW.c"
+
+#endif
+
+#endif
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.h b/lib/lufa/LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.h
new file mode 100644
index 0000000000..ca63bdf5a2
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.h
@@ -0,0 +1,442 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Pipe data stream transmission and reception management for the AVR8 microcontrollers
+ *  \copydetails Group_PipeStreamRW_AVR8
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the USB driver
+ *        dispatch header located in LUFA/Drivers/USB/USB.h.
+ */
+
+/** \ingroup Group_PipeStreamRW
+ *  \defgroup Group_PipeStreamRW_AVR8 Read/Write of Multi-Byte Streams (AVR8)
+ *  \brief Pipe data stream transmission and reception management for the Atmel AVR8 architecture.
+ *
+ *  Functions, macros, variables, enums and types related to data reading and writing of data streams from
+ *  and to pipes.
+ *
+ *  @{
+ */
+
+#ifndef __PIPE_STREAM_AVR8_H__
+#define __PIPE_STREAM_AVR8_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+		#include "../USBMode.h"
+		#include "../USBTask.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_USB_DRIVER)
+			#error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Function Prototypes: */
+			/** \name Stream functions for null data */
+			//@{
+
+			/** Reads and discards the given number of bytes from the pipe, discarding fully read packets from the host
+			 *  as needed. The last packet is not automatically discarded once the remaining bytes has been read; the
+			 *  user is responsible for manually discarding the last packet from the device via the \ref Pipe_ClearIN() macro.
+			 *
+			 *  If the BytesProcessed parameter is \c NULL, the entire stream transfer is attempted at once, failing or
+			 *  succeeding as a single unit. If the BytesProcessed parameter points to a valid storage location, the transfer
+			 *  will instead be performed as a series of chunks. Each time the pipe bank becomes empty while there is still data
+			 *  to process (and after the current packet has been acknowledged) the BytesProcessed location will be updated with
+			 *  the total number of bytes processed in the stream, and the function will exit with an error code of
+			 *  \ref PIPE_RWSTREAM_IncompleteTransfer. This allows for any abort checking to be performed in the user code - to
+			 *  continue the transfer, call the function again with identical parameters and it will resume until the BytesProcessed
+			 *  value reaches the total transfer length.
+			 *
+			 *  <b>Single Stream Transfer Example:</b>
+			 *  \code
+			 *  uint8_t ErrorCode;
+			 *
+			 *  if ((ErrorCode = Pipe_Discard_Stream(512, NULL)) != PIPE_RWSTREAM_NoError)
+			 *  {
+			 *       // Stream failed to complete - check ErrorCode here
+			 *  }
+			 *  \endcode
+			 *
+			 *  <b>Partial Stream Transfers Example:</b>
+			 *  \code
+			 *  uint8_t  ErrorCode;
+			 *  uint16_t BytesProcessed;
+			 *
+			 *  BytesProcessed = 0;
+			 *  while ((ErrorCode = Pipe_Discard_Stream(512, &BytesProcessed)) == PIPE_RWSTREAM_IncompleteTransfer)
+			 *  {
+			 *      // Stream not yet complete - do other actions here, abort if required
+			 *  }
+			 *
+			 *  if (ErrorCode != PIPE_RWSTREAM_NoError)
+			 *  {
+			 *      // Stream failed to complete - check ErrorCode here
+			 *  }
+			 *  \endcode
+			 *
+			 *  \note The pipe token is set automatically, thus this can be used on bi-directional pipes directly without
+			 *        having to explicitly change the data direction with a call to \ref Pipe_SetPipeToken().
+			 *
+			 *  \param[in] Length          Number of bytes to discard via the currently selected pipe.
+			 *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes already processed should
+			 *                             updated, \c NULL if the entire stream should be processed at once.
+			 *
+			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t Pipe_Discard_Stream(uint16_t Length,
+			                            uint16_t* const BytesProcessed);
+
+			/** Writes a given number of zeroed bytes to the pipe, sending full pipe packets from the host to the device
+			 *  as needed. The last packet is not automatically sent once the remaining bytes has been written; the
+			 *  user is responsible for manually discarding the last packet from the device via the \ref Pipe_ClearOUT() macro.
+			 *
+			 *  If the BytesProcessed parameter is \c NULL, the entire stream transfer is attempted at once, failing or
+			 *  succeeding as a single unit. If the BytesProcessed parameter points to a valid storage location, the transfer
+			 *  will instead be performed as a series of chunks. Each time the pipe bank becomes full while there is still data
+			 *  to process (and after the current packet transmission has been initiated) the BytesProcessed location will be
+			 *  updated with the total number of bytes processed in the stream, and the function will exit with an error code of
+			 *  \ref PIPE_RWSTREAM_IncompleteTransfer. This allows for any abort checking to be performed in the user code - to
+			 *  continue the transfer, call the function again with identical parameters and it will resume until the BytesProcessed
+			 *  value reaches the total transfer length.
+			 *
+			 *  <b>Single Stream Transfer Example:</b>
+			 *  \code
+			 *  uint8_t ErrorCode;
+			 *
+			 *  if ((ErrorCode = Pipe_Null_Stream(512, NULL)) != PIPE_RWSTREAM_NoError)
+			 *  {
+			 *       // Stream failed to complete - check ErrorCode here
+			 *  }
+			 *  \endcode
+			 *
+			 *  <b>Partial Stream Transfers Example:</b>
+			 *  \code
+			 *  uint8_t  ErrorCode;
+			 *  uint16_t BytesProcessed;
+			 *
+			 *  BytesProcessed = 0;
+			 *  while ((ErrorCode = Pipe_Null_Stream(512, &BytesProcessed)) == PIPE_RWSTREAM_IncompleteTransfer)
+			 *  {
+			 *      // Stream not yet complete - do other actions here, abort if required
+			 *  }
+			 *
+			 *  if (ErrorCode != PIPE_RWSTREAM_NoError)
+			 *  {
+			 *      // Stream failed to complete - check ErrorCode here
+			 *  }
+			 *  \endcode
+			 *
+			 *  \note The pipe token is set automatically, thus this can be used on bi-directional pipes directly without
+			 *        having to explicitly change the data direction with a call to \ref Pipe_SetPipeToken().
+			 *
+			 *  \param[in] Length          Number of zero bytes to write via the currently selected pipe.
+			 *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes already processed should
+			 *                             updated, \c NULL if the entire stream should be processed at once.
+			 *
+			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t Pipe_Null_Stream(uint16_t Length,
+			                         uint16_t* const BytesProcessed);
+
+			//@}
+
+			/** \name Stream functions for RAM source/destination data */
+			//@{
+
+			/** Writes the given number of bytes to the pipe from the given buffer in little endian,
+			 *  sending full packets to the device as needed. The last packet filled is not automatically sent;
+			 *  the user is responsible for manually sending the last written packet to the host via the
+			 *  \ref Pipe_ClearOUT() macro. Between each USB packet, the given stream callback function is
+			 *  executed repeatedly until the next packet is ready, allowing for early aborts of stream transfers.
+			 *
+			 *  If the BytesProcessed parameter is \c NULL, the entire stream transfer is attempted at once,
+			 *  failing or succeeding as a single unit. If the BytesProcessed parameter points to a valid
+			 *  storage location, the transfer will instead be performed as a series of chunks. Each time
+			 *  the pipe bank becomes full while there is still data to process (and after the current
+			 *  packet transmission has been initiated) the BytesProcessed location will be updated with the
+			 *  total number of bytes processed in the stream, and the function will exit with an error code of
+			 *  \ref PIPE_RWSTREAM_IncompleteTransfer. This allows for any abort checking to be performed
+			 *  in the user code - to continue the transfer, call the function again with identical parameters
+			 *  and it will resume until the BytesProcessed value reaches the total transfer length.
+			 *
+			 *  <b>Single Stream Transfer Example:</b>
+			 *  \code
+			 *  uint8_t DataStream[512];
+			 *  uint8_t ErrorCode;
+			 *
+			 *  if ((ErrorCode = Pipe_Write_Stream_LE(DataStream, sizeof(DataStream),
+			 *                                        NULL)) != PIPE_RWSTREAM_NoError)
+			 *  {
+			 *       // Stream failed to complete - check ErrorCode here
+			 *  }
+			 *  \endcode
+			 *
+			 *  <b>Partial Stream Transfers Example:</b>
+			 *  \code
+			 *  uint8_t  DataStream[512];
+			 *  uint8_t  ErrorCode;
+			 *  uint16_t BytesProcessed;
+			 *
+			 *  BytesProcessed = 0;
+			 *  while ((ErrorCode = Pipe_Write_Stream_LE(DataStream, sizeof(DataStream),
+			 *                                           &BytesProcessed)) == PIPE_RWSTREAM_IncompleteTransfer)
+			 *  {
+			 *      // Stream not yet complete - do other actions here, abort if required
+			 *  }
+			 *
+			 *  if (ErrorCode != PIPE_RWSTREAM_NoError)
+			 *  {
+			 *      // Stream failed to complete - check ErrorCode here
+			 *  }
+			 *  \endcode
+			 *
+			 *  \note The pipe token is set automatically, thus this can be used on bi-directional pipes directly without
+			 *        having to explicitly change the data direction with a call to \ref Pipe_SetPipeToken().
+			 *
+			 *  \param[in] Buffer          Pointer to the source data buffer to read from.
+			 *  \param[in] Length          Number of bytes to read for the currently selected pipe into the buffer.
+			 *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes already processed should
+			 *                             updated, \c NULL if the entire stream should be written at once.
+			 *
+			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t Pipe_Write_Stream_LE(const void* const Buffer,
+			                             uint16_t Length,
+			                             uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Writes the given number of bytes to the pipe from the given buffer in big endian,
+			 *  sending full packets to the device as needed. The last packet filled is not automatically sent;
+			 *  the user is responsible for manually sending the last written packet to the host via the
+			 *  \ref Pipe_ClearOUT() macro. Between each USB packet, the given stream callback function is
+			 *  executed repeatedly until the next packet is ready, allowing for early aborts of stream transfers.
+			 *
+			 *  \note The pipe token is set automatically, thus this can be used on bi-directional pipes directly without
+			 *        having to explicitly change the data direction with a call to \ref Pipe_SetPipeToken().
+			 *
+			 *  \param[in] Buffer          Pointer to the source data buffer to read from.
+			 *  \param[in] Length          Number of bytes to read for the currently selected pipe into the buffer.
+			 *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes already processed should
+			 *                             updated, \c NULL if the entire stream should be written at once.
+			 *
+			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t Pipe_Write_Stream_BE(const void* const Buffer,
+			                             uint16_t Length,
+			                             uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Reads the given number of bytes from the pipe into the given buffer in little endian,
+			 *  sending full packets to the device as needed. The last packet filled is not automatically sent;
+			 *  the user is responsible for manually sending the last written packet to the host via the
+			 *  \ref Pipe_ClearIN() macro. Between each USB packet, the given stream callback function is
+			 *  executed repeatedly until the next packet is ready, allowing for early aborts of stream transfers.
+			 *
+			 *  If the BytesProcessed parameter is \c NULL, the entire stream transfer is attempted at once,
+			 *  failing or succeeding as a single unit. If the BytesProcessed parameter points to a valid
+			 *  storage location, the transfer will instead be performed as a series of chunks. Each time
+			 *  the pipe bank becomes empty while there is still data to process (and after the current
+			 *  packet has been acknowledged) the BytesProcessed location will be updated with the total number
+			 *  of bytes processed in the stream, and the function will exit with an error code of
+			 *  \ref PIPE_RWSTREAM_IncompleteTransfer. This allows for any abort checking to be performed
+			 *  in the user code - to continue the transfer, call the function again with identical parameters
+			 *  and it will resume until the BytesProcessed value reaches the total transfer length.
+			 *
+			 *  <b>Single Stream Transfer Example:</b>
+			 *  \code
+			 *  uint8_t DataStream[512];
+			 *  uint8_t ErrorCode;
+			 *
+			 *  if ((ErrorCode = Pipe_Read_Stream_LE(DataStream, sizeof(DataStream),
+			 *                                       NULL)) != PIPE_RWSTREAM_NoError)
+			 *  {
+			 *       // Stream failed to complete - check ErrorCode here
+			 *  }
+			 *  \endcode
+			 *
+			 *  <b>Partial Stream Transfers Example:</b>
+			 *  \code
+			 *  uint8_t  DataStream[512];
+			 *  uint8_t  ErrorCode;
+			 *  uint16_t BytesProcessed;
+			 *
+			 *  BytesProcessed = 0;
+			 *  while ((ErrorCode = Pipe_Read_Stream_LE(DataStream, sizeof(DataStream),
+			 *                                          &BytesProcessed)) == PIPE_RWSTREAM_IncompleteTransfer)
+			 *  {
+			 *      // Stream not yet complete - do other actions here, abort if required
+			 *  }
+			 *
+			 *  if (ErrorCode != PIPE_RWSTREAM_NoError)
+			 *  {
+			 *      // Stream failed to complete - check ErrorCode here
+			 *  }
+			 *  \endcode
+			 *
+			 *  \note The pipe token is set automatically, thus this can be used on bi-directional pipes directly without
+			 *        having to explicitly change the data direction with a call to \ref Pipe_SetPipeToken().
+			 *
+			 *  \param[out] Buffer          Pointer to the source data buffer to write to.
+			 *  \param[in]  Length          Number of bytes to read for the currently selected pipe to read from.
+			 *  \param[in]  BytesProcessed  Pointer to a location where the total number of bytes already processed should
+			 *                              updated, \c NULL if the entire stream should be read at once.
+			 *
+			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t Pipe_Read_Stream_LE(void* const Buffer,
+			                            uint16_t Length,
+			                            uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Reads the given number of bytes from the pipe into the given buffer in big endian,
+			 *  sending full packets to the device as needed. The last packet filled is not automatically sent;
+			 *  the user is responsible for manually sending the last written packet to the host via the
+			 *  \ref Pipe_ClearIN() macro. Between each USB packet, the given stream callback function is
+			 *  executed repeatedly until the next packet is ready, allowing for early aborts of stream transfers.
+			 *
+			 *  \note The pipe token is set automatically, thus this can be used on bi-directional pipes directly without
+			 *        having to explicitly change the data direction with a call to \ref Pipe_SetPipeToken().
+			 *
+			 *  \param[out] Buffer          Pointer to the source data buffer to write to.
+			 *  \param[in]  Length          Number of bytes to read for the currently selected pipe to read from.
+			 *  \param[in]  BytesProcessed  Pointer to a location where the total number of bytes already processed should
+			 *                              updated, \c NULL if the entire stream should be read at once.
+			 *
+			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t Pipe_Read_Stream_BE(void* const Buffer,
+			                            uint16_t Length,
+			                            uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1);
+			//@}
+
+			/** \name Stream functions for EEPROM source/destination data */
+			//@{
+
+			/** EEPROM buffer source version of \ref Pipe_Write_Stream_LE().
+			 *
+			 *  \param[in] Buffer          Pointer to the source data buffer to read from.
+			 *  \param[in] Length          Number of bytes to read for the currently selected pipe into the buffer.
+			 *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes already processed should
+			 *                             updated, \c NULL if the entire stream should be written at once.
+			 *
+			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t Pipe_Write_EStream_LE(const void* const Buffer,
+			                              uint16_t Length,
+			                              uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** EEPROM buffer source version of \ref Pipe_Write_Stream_BE().
+			 *
+			 *  \param[in] Buffer          Pointer to the source data buffer to read from.
+			 *  \param[in] Length          Number of bytes to read for the currently selected pipe into the buffer.
+			 *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes already processed should
+			 *                             updated, \c NULL if the entire stream should be written at once.
+			 *
+			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t Pipe_Write_EStream_BE(const void* const Buffer,
+			                              uint16_t Length,
+			                              uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** EEPROM buffer source version of \ref Pipe_Read_Stream_LE().
+			 *
+			 *  \param[out] Buffer          Pointer to the source data buffer to write to.
+			 *  \param[in]  Length          Number of bytes to read for the currently selected pipe to read from.
+			 *  \param[in]  BytesProcessed  Pointer to a location where the total number of bytes already processed should
+			 *                              updated, \c NULL if the entire stream should be read at once.
+			 *
+			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t Pipe_Read_EStream_LE(void* const Buffer,
+			                             uint16_t Length,
+			                             uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** EEPROM buffer source version of \ref Pipe_Read_Stream_BE().
+			 *
+			 *  \param[out] Buffer          Pointer to the source data buffer to write to.
+			 *  \param[in]  Length          Number of bytes to read for the currently selected pipe to read from.
+			 *  \param[in]  BytesProcessed  Pointer to a location where the total number of bytes already processed should
+			 *                              updated, \c NULL if the entire stream should be read at once.
+			 *
+			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t Pipe_Read_EStream_BE(void* const Buffer,
+			                             uint16_t Length,
+			                             uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1);
+			//@}
+
+			/** \name Stream functions for PROGMEM source/destination data */
+			//@{
+
+			/** FLASH buffer source version of \ref Pipe_Write_Stream_LE().
+			 *
+			 *  \pre The FLASH data must be located in the first 64KB of FLASH for this function to work correctly.
+			 *
+			 *  \param[in] Buffer          Pointer to the source data buffer to read from.
+			 *  \param[in] Length          Number of bytes to read for the currently selected pipe into the buffer.
+			 *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes already processed should
+			 *                             updated, \c NULL if the entire stream should be written at once.
+			 *
+			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t Pipe_Write_PStream_LE(const void* const Buffer,
+			                              uint16_t Length,
+			                              uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** FLASH buffer source version of \ref Pipe_Write_Stream_BE().
+			 *
+			 *  \pre The FLASH data must be located in the first 64KB of FLASH for this function to work correctly.
+			 *
+			 *  \param[in] Buffer          Pointer to the source data buffer to read from.
+			 *  \param[in] Length          Number of bytes to read for the currently selected pipe into the buffer.
+			 *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes already processed should
+			 *                             updated, \c NULL if the entire stream should be written at once.
+			 *
+			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t Pipe_Write_PStream_BE(const void* const Buffer,
+			                              uint16_t Length,
+			                              uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1);
+			//@}
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.c b/lib/lufa/LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.c
new file mode 100644
index 0000000000..20239d06f8
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.c
@@ -0,0 +1,210 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+#include "../../../../Common/Common.h"
+#if (ARCH == ARCH_AVR8)
+
+#define  __INCLUDE_FROM_USB_DRIVER
+#include "../USBMode.h"
+
+#if defined(USB_CAN_BE_HOST)
+
+#include "../Pipe.h"
+
+uint8_t USB_Host_ControlPipeSize = PIPE_CONTROLPIPE_DEFAULT_SIZE;
+
+bool Pipe_ConfigurePipeTable(const USB_Pipe_Table_t* const Table,
+                             const uint8_t Entries)
+{
+	for (uint8_t i = 0; i < Entries; i++)
+	{
+		if (!(Table[i].Address))
+		  continue;
+
+		if (!(Pipe_ConfigurePipe(Table[i].Address, Table[i].Type, Table[i].EndpointAddress, Table[i].Size, Table[i].Banks)))
+		{
+			return false;
+		}
+	}
+
+	return true;
+}
+
+bool Pipe_ConfigurePipe(const uint8_t Address,
+                        const uint8_t Type,
+                        const uint8_t EndpointAddress,
+                        const uint16_t Size,
+                        const uint8_t Banks)
+{
+	uint8_t Number = (Address & PIPE_EPNUM_MASK);
+	uint8_t Token  = (Address & PIPE_DIR_IN) ? PIPE_TOKEN_IN : PIPE_TOKEN_OUT;
+
+	if (Number >= PIPE_TOTAL_PIPES)
+	  return false;
+
+	if (Type == EP_TYPE_CONTROL)
+	  Token = PIPE_TOKEN_SETUP;
+
+#if defined(ORDERED_EP_CONFIG)
+	Pipe_SelectPipe(Number);
+	Pipe_EnablePipe();
+
+	UPCFG1X = 0;
+
+	UPCFG0X = ((Type << EPTYPE0) | Token | ((EndpointAddress & PIPE_EPNUM_MASK) << PEPNUM0));
+	UPCFG1X = ((1 << ALLOC) | ((Banks > 1) ? (1 << EPBK0) : 0) | Pipe_BytesToEPSizeMask(Size));
+
+	Pipe_SetInfiniteINRequests();
+
+	return Pipe_IsConfigured();
+#else
+	for (uint8_t PNum = Number; PNum < PIPE_TOTAL_PIPES; PNum++)
+	{
+		uint8_t UPCFG0XTemp;
+		uint8_t UPCFG1XTemp;
+		uint8_t UPCFG2XTemp;
+		uint8_t UPIENXTemp;
+
+		Pipe_SelectPipe(PNum);
+
+		if (PNum == Number)
+		{
+			UPCFG0XTemp = ((Type << EPTYPE0) | Token | ((EndpointAddress & PIPE_EPNUM_MASK) << PEPNUM0));
+			UPCFG1XTemp = ((1 << ALLOC) | ((Banks > 1) ? (1 << EPBK0) : 0) | Pipe_BytesToEPSizeMask(Size));
+			UPCFG2XTemp = 0;
+			UPIENXTemp  = 0;
+		}
+		else
+		{
+			UPCFG0XTemp = UPCFG0X;
+			UPCFG1XTemp = UPCFG1X;
+			UPCFG2XTemp = UPCFG2X;
+			UPIENXTemp  = UPIENX;
+		}
+
+		if (!(UPCFG1XTemp & (1 << ALLOC)))
+		  continue;
+
+		Pipe_DisablePipe();
+		UPCFG1X &= ~(1 << ALLOC);
+
+		Pipe_EnablePipe();
+		UPCFG0X = UPCFG0XTemp;
+		UPCFG1X = UPCFG1XTemp;
+		UPCFG2X = UPCFG2XTemp;
+		UPIENX  = UPIENXTemp;
+
+		Pipe_SetInfiniteINRequests();
+
+		if (!(Pipe_IsConfigured()))
+		  return false;
+	}
+
+	Pipe_SelectPipe(Number);
+	return true;
+#endif
+}
+
+void Pipe_ClearPipes(void)
+{
+	UPINT = 0;
+
+	for (uint8_t PNum = 0; PNum < PIPE_TOTAL_PIPES; PNum++)
+	{
+		Pipe_SelectPipe(PNum);
+		UPIENX  = 0;
+		UPINTX  = 0;
+		UPCFG1X = 0;
+		Pipe_DisablePipe();
+	}
+}
+
+bool Pipe_IsEndpointBound(const uint8_t EndpointAddress)
+{
+	uint8_t PrevPipeNumber = Pipe_GetCurrentPipe();
+
+	for (uint8_t PNum = 0; PNum < PIPE_TOTAL_PIPES; PNum++)
+	{
+		Pipe_SelectPipe(PNum);
+
+		if (!(Pipe_IsConfigured()))
+		  continue;
+
+		if (Pipe_GetBoundEndpointAddress() == EndpointAddress)
+		  return true;
+	}
+
+	Pipe_SelectPipe(PrevPipeNumber);
+	return false;
+}
+
+uint8_t Pipe_WaitUntilReady(void)
+{
+	#if (USB_STREAM_TIMEOUT_MS < 0xFF)
+	uint8_t  TimeoutMSRem = USB_STREAM_TIMEOUT_MS;
+	#else
+	uint16_t TimeoutMSRem = USB_STREAM_TIMEOUT_MS;
+	#endif
+
+	uint16_t PreviousFrameNumber = USB_Host_GetFrameNumber();
+
+	for (;;)
+	{
+		if (Pipe_GetPipeToken() == PIPE_TOKEN_IN)
+		{
+			if (Pipe_IsINReceived())
+			  return PIPE_READYWAIT_NoError;
+		}
+		else
+		{
+			if (Pipe_IsOUTReady())
+			  return PIPE_READYWAIT_NoError;
+		}
+
+		if (Pipe_IsStalled())
+		  return PIPE_READYWAIT_PipeStalled;
+		else if (USB_HostState == HOST_STATE_Unattached)
+		  return PIPE_READYWAIT_DeviceDisconnected;
+
+		uint16_t CurrentFrameNumber = USB_Host_GetFrameNumber();
+
+		if (CurrentFrameNumber != PreviousFrameNumber)
+		{
+			PreviousFrameNumber = CurrentFrameNumber;
+
+			if (!(TimeoutMSRem--))
+			  return PIPE_READYWAIT_Timeout;
+		}
+	}
+}
+
+#endif
+
+#endif
diff --git a/lib/lufa/LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.h b/lib/lufa/LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.h
new file mode 100644
index 0000000000..3521efbe9e
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.h
@@ -0,0 +1,922 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief USB Pipe definitions for the AVR8 microcontrollers.
+ *  \copydetails Group_PipeManagement_AVR8
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the USB driver
+ *        dispatch header located in LUFA/Drivers/USB/USB.h.
+ */
+
+/** \ingroup Group_PipeRW
+ *  \defgroup Group_PipeRW_AVR8 Pipe Data Reading and Writing (AVR8)
+ *  \brief Pipe data read/write definitions for the Atmel AVR8 architecture.
+ *
+ *  Functions, macros, variables, enums and types related to data reading and writing from and to pipes.
+ */
+
+/** \ingroup Group_PipePrimitiveRW
+ *  \defgroup Group_PipePrimitiveRW_AVR8 Read/Write of Primitive Data Types (AVR8)
+ *  \brief Pipe primitive data read/write definitions for the Atmel AVR8 architecture.
+ *
+ *  Functions, macros, variables, enums and types related to data reading and writing of primitive data types
+ *  from and to pipes.
+ */
+
+/** \ingroup Group_PipePacketManagement
+ *  \defgroup Group_PipePacketManagement_AVR8 Pipe Packet Management (AVR8)
+ *  \brief Pipe packet management definitions for the Atmel AVR8 architecture.
+ *
+ *  Functions, macros, variables, enums and types related to packet management of pipes.
+ */
+
+/** \ingroup Group_PipeControlReq
+ *  \defgroup Group_PipeControlReq_AVR8 Pipe Control Request Management (AVR8)
+ *  \brief Pipe control request management definitions for the Atmel AVR8 architecture.
+ *
+ *  Module for host mode request processing. This module allows for the transmission of standard, class and
+ *  vendor control requests to the default control endpoint of an attached device while in host mode.
+ *
+ *  \see Chapter 9 of the USB 2.0 specification.
+ */
+
+/** \ingroup Group_PipeManagement
+ *  \defgroup Group_PipeManagement_AVR8 Pipe Management (AVR8)
+ *  \brief Pipe management definitions for the Atmel AVR8 architecture.
+ *
+ *  This module contains functions, macros and enums related to pipe management when in USB Host mode. This
+ *  module contains the pipe management macros, as well as pipe interrupt and data send/receive functions
+ *  for various data types.
+ *
+ *  @{
+ */
+
+#ifndef __PIPE_AVR8_H__
+#define __PIPE_AVR8_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+		#include "../USBTask.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_USB_DRIVER)
+			#error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** \name Pipe Error Flag Masks */
+			//@{
+			/** Mask for \ref Pipe_GetErrorFlags(), indicating that an overflow error occurred in the pipe on the received data. */
+			#define PIPE_ERRORFLAG_OVERFLOW         (1 << 6)
+
+			/** Mask for \ref Pipe_GetErrorFlags(), indicating that an underflow error occurred in the pipe on the received data. */
+			#define PIPE_ERRORFLAG_UNDERFLOW        (1 << 5)
+
+			/** Mask for \ref Pipe_GetErrorFlags(), indicating that a CRC error occurred in the pipe on the received data. */
+			#define PIPE_ERRORFLAG_CRC16            (1 << 4)
+
+			/** Mask for \ref Pipe_GetErrorFlags(), indicating that a hardware timeout error occurred in the pipe. */
+			#define PIPE_ERRORFLAG_TIMEOUT          (1 << 3)
+
+			/** Mask for \ref Pipe_GetErrorFlags(), indicating that a hardware PID error occurred in the pipe. */
+			#define PIPE_ERRORFLAG_PID              (1 << 2)
+
+			/** Mask for \ref Pipe_GetErrorFlags(), indicating that a hardware data PID error occurred in the pipe. */
+			#define PIPE_ERRORFLAG_DATAPID          (1 << 1)
+
+			/** Mask for \ref Pipe_GetErrorFlags(), indicating that a hardware data toggle error occurred in the pipe. */
+			#define PIPE_ERRORFLAG_DATATGL          (1 << 0)
+			//@}
+
+			/** \name Pipe Token Masks */
+			//@{
+			/** Token mask for \ref Pipe_SetPipeToken() and \ref Pipe_GetPipeToken(). This sets the pipe as a SETUP token (for CONTROL type pipes),
+			 *  which will trigger a control request on the attached device when data is written to the pipe.
+			 */
+			#define PIPE_TOKEN_SETUP                (0 << PTOKEN0)
+
+			/** Token mask for \ref Pipe_SetPipeToken() and \ref Pipe_GetPipeToken(). This sets the pipe as a IN token (for non-CONTROL type pipes),
+			 *  indicating that the pipe data will flow from device to host.
+			 */
+			#define PIPE_TOKEN_IN                   (1 << PTOKEN0)
+
+			/** Token mask for \ref Pipe_SetPipeToken() and \ref Pipe_GetPipeToken(). This sets the pipe as a OUT token (for non-CONTROL type pipes),
+			 *  indicating that the pipe data will flow from host to device.
+			 */
+			#define PIPE_TOKEN_OUT                  (2 << PTOKEN0)
+			//@}
+
+			/** Default size of the default control pipe's bank, until altered by the Endpoint0Size value
+			 *  in the device descriptor of the attached device.
+			 */
+			#define PIPE_CONTROLPIPE_DEFAULT_SIZE   64
+
+			/** Total number of pipes (including the default control pipe at address 0) which may be used in
+			 *  the device. Different USB AVR models support different amounts of pipes, this value reflects
+			 *  the maximum number of pipes for the currently selected AVR model.
+			 */
+			#define PIPE_TOTAL_PIPES                7
+
+			/** Size in bytes of the largest pipe bank size possible in the device. Not all banks on each AVR
+			 *  model supports the largest bank size possible on the device; different pipe numbers support
+			 *  different maximum bank sizes. This value reflects the largest possible bank of any pipe on the
+			 *  currently selected USB AVR model.
+			 */
+			#define PIPE_MAX_SIZE                   256
+
+		/* Enums: */
+			/** Enum for the possible error return codes of the \ref Pipe_WaitUntilReady() function.
+			 *
+			 *  \ingroup Group_PipeRW_AVR8
+			 */
+			enum Pipe_WaitUntilReady_ErrorCodes_t
+			{
+				PIPE_READYWAIT_NoError                 = 0, /**< Pipe ready for next packet, no error. */
+				PIPE_READYWAIT_PipeStalled             = 1,	/**< The device stalled the pipe while waiting. */
+				PIPE_READYWAIT_DeviceDisconnected      = 2,	/**< Device was disconnected from the host while waiting. */
+				PIPE_READYWAIT_Timeout                 = 3, /**< The device failed to accept or send the next packet
+				                                             *   within the software timeout period set by the
+				                                             *   \ref USB_STREAM_TIMEOUT_MS macro.
+				                                             */
+			};
+
+		/* Inline Functions: */
+			/** Indicates the number of bytes currently stored in the current pipes's selected bank.
+			 *
+			 *  \ingroup Group_PipeRW_AVR8
+			 *
+			 *  \return Total number of bytes in the currently selected pipe's FIFO buffer.
+			 */
+			static inline uint16_t Pipe_BytesInPipe(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline uint16_t Pipe_BytesInPipe(void)
+			{
+				return UPBCX;
+			}
+
+			/** Determines the currently selected pipe's direction.
+			 *
+			 *  \return The currently selected pipe's direction, as a \c PIPE_DIR_* mask.
+			 */
+			static inline uint8_t Pipe_GetPipeDirection(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline uint8_t Pipe_GetPipeDirection(void)
+			{
+				return (UPCFG0X & (1 << EPDIR)) ? PIPE_DIR_IN : PIPE_DIR_OUT;
+			}
+
+			/** Returns the pipe address of the currently selected pipe. This is typically used to save the
+			 *  currently selected pipe address so that it can be restored after another pipe has been manipulated.
+			 *
+			 *  \return Index of the currently selected pipe.
+			 */
+			static inline uint8_t Pipe_GetCurrentPipe(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline uint8_t Pipe_GetCurrentPipe(void)
+			{
+				return ((UPNUM & PIPE_PIPENUM_MASK) | Pipe_GetPipeDirection());
+			}
+
+			/** Selects the given pipe address. Any pipe operations which do not require the pipe address to be
+			 *  indicated will operate on the currently selected pipe.
+			 *
+			 *  \param[in] Address  Address of the pipe to select.
+			 */
+			static inline void Pipe_SelectPipe(const uint8_t Address) ATTR_ALWAYS_INLINE;
+			static inline void Pipe_SelectPipe(const uint8_t Address)
+			{
+				UPNUM = (Address & PIPE_PIPENUM_MASK);
+			}
+
+			/** Resets the desired pipe, including the pipe banks and flags.
+			 *
+			 *  \param[in] Address  Address of the pipe to reset.
+			 */
+			static inline void Pipe_ResetPipe(const uint8_t Address) ATTR_ALWAYS_INLINE;
+			static inline void Pipe_ResetPipe(const uint8_t Address)
+			{
+				UPRST = (1 << (Address & PIPE_PIPENUM_MASK));
+				UPRST = 0;
+			}
+
+			/** Enables the currently selected pipe so that data can be sent and received through it to and from
+			 *  an attached device.
+			 *
+			 *  \pre The currently selected pipe must first be configured properly via \ref Pipe_ConfigurePipe().
+			 */
+			static inline void Pipe_EnablePipe(void) ATTR_ALWAYS_INLINE;
+			static inline void Pipe_EnablePipe(void)
+			{
+				UPCONX |= (1 << PEN);
+			}
+
+			/** Disables the currently selected pipe so that data cannot be sent and received through it to and
+			 *  from an attached device.
+			 */
+			static inline void Pipe_DisablePipe(void) ATTR_ALWAYS_INLINE;
+			static inline void Pipe_DisablePipe(void)
+			{
+				UPCONX &= ~(1 << PEN);
+			}
+
+			/** Determines if the currently selected pipe is enabled, but not necessarily configured.
+			 *
+			 * \return Boolean \c true if the currently selected pipe is enabled, \c false otherwise.
+			 */
+			static inline bool Pipe_IsEnabled(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline bool Pipe_IsEnabled(void)
+			{
+				return ((UPCONX & (1 << PEN)) ? true : false);
+			}
+
+			/** Gets the current pipe token, indicating the pipe's data direction and type.
+			 *
+			 *  \return The current pipe token, as a \c PIPE_TOKEN_* mask.
+			 */
+			static inline uint8_t Pipe_GetPipeToken(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline uint8_t Pipe_GetPipeToken(void)
+			{
+				return (UPCFG0X & (0x03 << PTOKEN0));
+			}
+
+			/** Sets the token for the currently selected pipe to one of the tokens specified by the \c PIPE_TOKEN_*
+			 *  masks. This can be used on CONTROL type pipes, to allow for bidirectional transfer of data during
+			 *  control requests, or on regular pipes to allow for half-duplex bidirectional data transfer to devices
+			 *  which have two endpoints of opposite direction sharing the same endpoint address within the device.
+			 *
+			 *  \param[in] Token  New pipe token to set the selected pipe to, as a \c PIPE_TOKEN_* mask.
+			 */
+			static inline void Pipe_SetPipeToken(const uint8_t Token) ATTR_ALWAYS_INLINE;
+			static inline void Pipe_SetPipeToken(const uint8_t Token)
+			{
+				UPCFG0X = ((UPCFG0X & ~(0x03 << PTOKEN0)) | Token);
+			}
+
+			/** Configures the currently selected pipe to allow for an unlimited number of IN requests. */
+			static inline void Pipe_SetInfiniteINRequests(void) ATTR_ALWAYS_INLINE;
+			static inline void Pipe_SetInfiniteINRequests(void)
+			{
+				UPCONX |= (1 << INMODE);
+			}
+
+			/** Configures the currently selected pipe to only allow the specified number of IN requests to be
+			 *  accepted by the pipe before it is automatically frozen.
+			 *
+			 *  \param[in] TotalINRequests  Total number of IN requests that the pipe may receive before freezing.
+			 */
+			static inline void Pipe_SetFiniteINRequests(const uint8_t TotalINRequests) ATTR_ALWAYS_INLINE;
+			static inline void Pipe_SetFiniteINRequests(const uint8_t TotalINRequests)
+			{
+				UPCONX &= ~(1 << INMODE);
+				UPINRQX = TotalINRequests;
+			}
+
+			/** Determines if the currently selected pipe is configured.
+			 *
+			 *  \return Boolean \c true if the selected pipe is configured, \c false otherwise.
+			 */
+			static inline bool Pipe_IsConfigured(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline bool Pipe_IsConfigured(void)
+			{
+				return ((UPSTAX & (1 << CFGOK)) ? true : false);
+			}
+
+			/** Retrieves the endpoint address of the endpoint within the attached device that the currently selected
+			 *  pipe is bound to.
+			 *
+			 *  \return Endpoint address the currently selected pipe is bound to.
+			 */
+			static inline uint8_t Pipe_GetBoundEndpointAddress(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline uint8_t Pipe_GetBoundEndpointAddress(void)
+			{
+				uint8_t UPCFG0X_Temp = UPCFG0X;
+
+				return (((UPCFG0X_Temp >> PEPNUM0) & PIPE_EPNUM_MASK) |
+				        ((UPCFG0X_Temp & (1 << PTOKEN1)) ? ENDPOINT_DIR_IN : ENDPOINT_DIR_OUT));
+			}
+
+			/** Sets the period between interrupts for an INTERRUPT type pipe to a specified number of milliseconds.
+			 *
+			 *  \param[in] Milliseconds  Number of milliseconds between each pipe poll.
+			 */
+			static inline void Pipe_SetInterruptPeriod(const uint8_t Milliseconds) ATTR_ALWAYS_INLINE;
+			static inline void Pipe_SetInterruptPeriod(const uint8_t Milliseconds)
+			{
+				UPCFG2X = Milliseconds;
+			}
+
+			/** Returns a mask indicating which pipe's interrupt periods have elapsed, indicating that the pipe should
+			 *  be serviced.
+			 *
+			 *  \return Mask whose bits indicate which pipes have interrupted.
+			 */
+			static inline uint8_t Pipe_GetPipeInterrupts(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline uint8_t Pipe_GetPipeInterrupts(void)
+			{
+				return UPINT;
+			}
+
+			/** Determines if the specified pipe address has interrupted (valid only for INTERRUPT type
+			 *  pipes).
+			 *
+			 *  \param[in] Address  Address of the pipe whose interrupt flag should be tested.
+			 *
+			 *  \return Boolean \c true if the specified pipe has interrupted, \c false otherwise.
+			 */
+			static inline bool Pipe_HasPipeInterrupted(const uint8_t Address) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline bool Pipe_HasPipeInterrupted(const uint8_t Address)
+			{
+				return ((UPINT & (1 << (Address & PIPE_PIPENUM_MASK))) ? true : false);
+			}
+
+			/** Unfreezes the selected pipe, allowing it to communicate with an attached device. */
+			static inline void Pipe_Unfreeze(void) ATTR_ALWAYS_INLINE;
+			static inline void Pipe_Unfreeze(void)
+			{
+				UPCONX &= ~(1 << PFREEZE);
+			}
+
+			/** Freezes the selected pipe, preventing it from communicating with an attached device. */
+			static inline void Pipe_Freeze(void) ATTR_ALWAYS_INLINE;
+			static inline void Pipe_Freeze(void)
+			{
+				UPCONX |= (1 << PFREEZE);
+			}
+
+			/** Determines if the currently selected pipe is frozen, and not able to accept data.
+			 *
+			 *  \return Boolean \c true if the currently selected pipe is frozen, \c false otherwise.
+			 */
+			static inline bool Pipe_IsFrozen(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline bool Pipe_IsFrozen(void)
+			{
+				return ((UPCONX & (1 << PFREEZE)) ? true : false);
+			}
+
+			/** Clears the error flags for the currently selected pipe. */
+			static inline void Pipe_ClearError(void) ATTR_ALWAYS_INLINE;
+			static inline void Pipe_ClearError(void)
+			{
+				UPERRX = 0;
+				UPINTX &= ~(1 << PERRI);
+			}
+
+			/** Determines if the master pipe error flag is set for the currently selected pipe, indicating that
+			 *  some sort of hardware error has occurred on the pipe.
+			 *
+			 *  \see \ref Pipe_GetErrorFlags() macro for information on retrieving the exact error flag.
+			 *
+			 *  \return Boolean \c true if an error has occurred on the selected pipe, \c false otherwise.
+			 */
+			static inline bool Pipe_IsError(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline bool Pipe_IsError(void)
+			{
+				return ((UPINTX & (1 << PERRI)) ? true : false);
+			}
+
+			/** Gets a mask of the hardware error flags which have occurred on the currently selected pipe. This
+			 *  value can then be masked against the \c PIPE_ERRORFLAG_* masks to determine what error has occurred.
+			 *
+			 *  \return  Mask comprising of \c PIPE_ERRORFLAG_* bits indicating what error has occurred on the selected pipe.
+			 */
+			static inline uint8_t Pipe_GetErrorFlags(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline uint8_t Pipe_GetErrorFlags(void)
+			{
+				return ((UPERRX & (PIPE_ERRORFLAG_CRC16 | PIPE_ERRORFLAG_TIMEOUT |
+				                   PIPE_ERRORFLAG_PID   | PIPE_ERRORFLAG_DATAPID |
+				                   PIPE_ERRORFLAG_DATATGL)) |
+				        (UPSTAX & (PIPE_ERRORFLAG_OVERFLOW | PIPE_ERRORFLAG_UNDERFLOW)));
+			}
+
+			/** Retrieves the number of busy banks in the currently selected pipe, which have been queued for
+			 *  transmission via the \ref Pipe_ClearOUT() command, or are awaiting acknowledgement via the
+			 *  \ref Pipe_ClearIN() command.
+			 *
+			 *  \ingroup Group_PipePacketManagement_AVR8
+			 *
+			 *  \return Total number of busy banks in the selected pipe.
+			 */
+			static inline uint8_t Pipe_GetBusyBanks(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline uint8_t Pipe_GetBusyBanks(void)
+			{
+				return (UPSTAX & (0x03 << NBUSYBK0));
+			}
+
+			/** Determines if the currently selected pipe may be read from (if data is waiting in the pipe
+			 *  bank and the pipe is an IN direction, or if the bank is not yet full if the pipe is an OUT
+			 *  direction). This function will return false if an error has occurred in the pipe, or if the pipe
+			 *  is an IN direction and no packet (or an empty packet) has been received, or if the pipe is an OUT
+			 *  direction and the pipe bank is full.
+			 *
+			 *  \note This function is not valid on CONTROL type pipes.
+			 *
+			 *  \ingroup Group_PipePacketManagement_AVR8
+			 *
+			 *  \return Boolean \c true if the currently selected pipe may be read from or written to, depending
+			 *          on its direction.
+			 */
+			static inline bool Pipe_IsReadWriteAllowed(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline bool Pipe_IsReadWriteAllowed(void)
+			{
+				return ((UPINTX & (1 << RWAL)) ? true : false);
+			}
+
+			/** Determines if a packet has been received on the currently selected IN pipe from the attached device.
+			 *
+			 *  \ingroup Group_PipePacketManagement_AVR8
+			 *
+			 *  \return Boolean \c true if the current pipe has received an IN packet, \c false otherwise.
+			 */
+			static inline bool Pipe_IsINReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline bool Pipe_IsINReceived(void)
+			{
+				return ((UPINTX & (1 << RXINI)) ? true : false);
+			}
+
+			/** Determines if the currently selected OUT pipe is ready to send an OUT packet to the attached device.
+			 *
+			 *  \ingroup Group_PipePacketManagement_AVR8
+			 *
+			 *  \return Boolean \c true if the current pipe is ready for an OUT packet, \c false otherwise.
+			 */
+			static inline bool Pipe_IsOUTReady(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline bool Pipe_IsOUTReady(void)
+			{
+				return ((UPINTX & (1 << TXOUTI)) ? true : false);
+			}
+
+			/** Determines if no SETUP request is currently being sent to the attached device on the selected
+			 *  CONTROL type pipe.
+			 *
+			 *  \ingroup Group_PipePacketManagement_AVR8
+			 *
+			 *  \return Boolean \c true if the current pipe is ready for a SETUP packet, \c false otherwise.
+			 */
+			static inline bool Pipe_IsSETUPSent(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline bool Pipe_IsSETUPSent(void)
+			{
+				return ((UPINTX & (1 << TXSTPI)) ? true : false);
+			}
+
+			/** Sends the currently selected CONTROL type pipe's contents to the device as a SETUP packet.
+			 *
+			 *  \ingroup Group_PipePacketManagement_AVR8
+			 */
+			static inline void Pipe_ClearSETUP(void) ATTR_ALWAYS_INLINE;
+			static inline void Pipe_ClearSETUP(void)
+			{
+				UPINTX &= ~((1 << TXSTPI) | (1 << FIFOCON));
+			}
+
+			/** Acknowledges the reception of a setup IN request from the attached device on the currently selected
+			 *  pipe, freeing the bank ready for the next packet.
+			 *
+			 *  \ingroup Group_PipePacketManagement_AVR8
+			 */
+			static inline void Pipe_ClearIN(void) ATTR_ALWAYS_INLINE;
+			static inline void Pipe_ClearIN(void)
+			{
+				UPINTX &= ~((1 << RXINI) | (1 << FIFOCON));
+			}
+
+			/** Sends the currently selected pipe's contents to the device as an OUT packet on the selected pipe, freeing
+			 *  the bank ready for the next packet.
+			 *
+			 *  \ingroup Group_PipePacketManagement_AVR8
+			 */
+			static inline void Pipe_ClearOUT(void) ATTR_ALWAYS_INLINE;
+			static inline void Pipe_ClearOUT(void)
+			{
+				UPINTX &= ~((1 << TXOUTI) | (1 << FIFOCON));
+			}
+
+			/** Determines if the device sent a NAK (Negative Acknowledge) in response to the last sent packet on
+			 *  the currently selected pipe. This occurs when the host sends a packet to the device, but the device
+			 *  is not currently ready to handle the packet (i.e. its endpoint banks are full). Once a NAK has been
+			 *  received, it must be cleared using \ref Pipe_ClearNAKReceived() before the previous (or any other) packet
+			 *  can be re-sent.
+			 *
+			 *  \ingroup Group_PipePacketManagement_AVR8
+			 *
+			 *  \return Boolean \c true if an NAK has been received on the current pipe, \c false otherwise.
+			 */
+			static inline bool Pipe_IsNAKReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline bool Pipe_IsNAKReceived(void)
+			{
+				return ((UPINTX & (1 << NAKEDI)) ? true : false);
+			}
+
+			/** Clears the NAK condition on the currently selected pipe.
+			 *
+			 *  \ingroup Group_PipePacketManagement_AVR8
+			 *
+			 *  \see \ref Pipe_IsNAKReceived() for more details.
+			 */
+			static inline void Pipe_ClearNAKReceived(void) ATTR_ALWAYS_INLINE;
+			static inline void Pipe_ClearNAKReceived(void)
+			{
+				UPINTX &= ~(1 << NAKEDI);
+			}
+
+			/** Determines if the currently selected pipe has had the STALL condition set by the attached device.
+			 *
+			 *  \ingroup Group_PipePacketManagement_AVR8
+			 *
+			 *  \return Boolean \c true if the current pipe has been stalled by the attached device, \c false otherwise.
+			 */
+			static inline bool Pipe_IsStalled(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline bool Pipe_IsStalled(void)
+			{
+				return ((UPINTX & (1 << RXSTALLI)) ? true : false);
+			}
+
+			/** Clears the STALL condition detection flag on the currently selected pipe, but does not clear the
+			 *  STALL condition itself (this must be done via a ClearFeature control request to the device).
+			 *
+			 *  \ingroup Group_PipePacketManagement_AVR8
+			 */
+			static inline void Pipe_ClearStall(void) ATTR_ALWAYS_INLINE;
+			static inline void Pipe_ClearStall(void)
+			{
+				UPINTX &= ~(1 << RXSTALLI);
+			}
+
+			/** Reads one byte from the currently selected pipe's bank, for OUT direction pipes.
+			 *
+			 *  \ingroup Group_PipePrimitiveRW_AVR8
+			 *
+			 *  \return Next byte in the currently selected pipe's FIFO buffer.
+			 */
+			static inline uint8_t Pipe_Read_8(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline uint8_t Pipe_Read_8(void)
+			{
+				return UPDATX;
+			}
+
+			/** Writes one byte to the currently selected pipe's bank, for IN direction pipes.
+			 *
+			 *  \ingroup Group_PipePrimitiveRW_AVR8
+			 *
+			 *  \param[in] Data  Data to write into the the currently selected pipe's FIFO buffer.
+			 */
+			static inline void Pipe_Write_8(const uint8_t Data) ATTR_ALWAYS_INLINE;
+			static inline void Pipe_Write_8(const uint8_t Data)
+			{
+				UPDATX = Data;
+			}
+
+			/** Discards one byte from the currently selected pipe's bank, for OUT direction pipes.
+			 *
+			 *  \ingroup Group_PipePrimitiveRW_AVR8
+			 */
+			static inline void Pipe_Discard_8(void) ATTR_ALWAYS_INLINE;
+			static inline void Pipe_Discard_8(void)
+			{
+				uint8_t Dummy;
+
+				Dummy = UPDATX;
+
+				(void)Dummy;
+			}
+
+			/** Reads two bytes from the currently selected pipe's bank in little endian format, for OUT
+			 *  direction pipes.
+			 *
+			 *  \ingroup Group_PipePrimitiveRW_AVR8
+			 *
+			 *  \return Next two bytes in the currently selected pipe's FIFO buffer.
+			 */
+			static inline uint16_t Pipe_Read_16_LE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline uint16_t Pipe_Read_16_LE(void)
+			{
+				union
+				{
+					uint16_t Value;
+					uint8_t  Bytes[2];
+				} Data;
+
+				Data.Bytes[0] = UPDATX;
+				Data.Bytes[1] = UPDATX;
+
+				return Data.Value;
+			}
+
+			/** Reads two bytes from the currently selected pipe's bank in big endian format, for OUT
+			 *  direction pipes.
+			 *
+			 *  \ingroup Group_PipePrimitiveRW_AVR8
+			 *
+			 *  \return Next two bytes in the currently selected pipe's FIFO buffer.
+			 */
+			static inline uint16_t Pipe_Read_16_BE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline uint16_t Pipe_Read_16_BE(void)
+			{
+				union
+				{
+					uint16_t Value;
+					uint8_t  Bytes[2];
+				} Data;
+
+				Data.Bytes[1] = UPDATX;
+				Data.Bytes[0] = UPDATX;
+
+				return Data.Value;
+			}
+
+			/** Writes two bytes to the currently selected pipe's bank in little endian format, for IN
+			 *  direction pipes.
+			 *
+			 *  \ingroup Group_PipePrimitiveRW_AVR8
+			 *
+			 *  \param[in] Data  Data to write to the currently selected pipe's FIFO buffer.
+			 */
+			static inline void Pipe_Write_16_LE(const uint16_t Data) ATTR_ALWAYS_INLINE;
+			static inline void Pipe_Write_16_LE(const uint16_t Data)
+			{
+				UPDATX = (Data & 0xFF);
+				UPDATX = (Data >> 8);
+			}
+
+			/** Writes two bytes to the currently selected pipe's bank in big endian format, for IN
+			 *  direction pipes.
+			 *
+			 *  \ingroup Group_PipePrimitiveRW_AVR8
+			 *
+			 *  \param[in] Data  Data to write to the currently selected pipe's FIFO buffer.
+			 */
+			static inline void Pipe_Write_16_BE(const uint16_t Data) ATTR_ALWAYS_INLINE;
+			static inline void Pipe_Write_16_BE(const uint16_t Data)
+			{
+				UPDATX = (Data >> 8);
+				UPDATX = (Data & 0xFF);
+			}
+
+			/** Discards two bytes from the currently selected pipe's bank, for OUT direction pipes.
+			 *
+			 *  \ingroup Group_PipePrimitiveRW_AVR8
+			 */
+			static inline void Pipe_Discard_16(void) ATTR_ALWAYS_INLINE;
+			static inline void Pipe_Discard_16(void)
+			{
+				uint8_t Dummy;
+
+				Dummy = UPDATX;
+				Dummy = UPDATX;
+
+				(void)Dummy;
+			}
+
+			/** Reads four bytes from the currently selected pipe's bank in little endian format, for OUT
+			 *  direction pipes.
+			 *
+			 *  \ingroup Group_PipePrimitiveRW_AVR8
+			 *
+			 *  \return Next four bytes in the currently selected pipe's FIFO buffer.
+			 */
+			static inline uint32_t Pipe_Read_32_LE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline uint32_t Pipe_Read_32_LE(void)
+			{
+				union
+				{
+					uint32_t Value;
+					uint8_t  Bytes[4];
+				} Data;
+
+				Data.Bytes[0] = UPDATX;
+				Data.Bytes[1] = UPDATX;
+				Data.Bytes[2] = UPDATX;
+				Data.Bytes[3] = UPDATX;
+
+				return Data.Value;
+			}
+
+			/** Reads four bytes from the currently selected pipe's bank in big endian format, for OUT
+			 *  direction pipes.
+			 *
+			 *  \ingroup Group_PipePrimitiveRW_AVR8
+			 *
+			 *  \return Next four bytes in the currently selected pipe's FIFO buffer.
+			 */
+			static inline uint32_t Pipe_Read_32_BE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline uint32_t Pipe_Read_32_BE(void)
+			{
+				union
+				{
+					uint32_t DWord;
+					uint8_t  Bytes[4];
+				} Data;
+
+				Data.Bytes[3] = UPDATX;
+				Data.Bytes[2] = UPDATX;
+				Data.Bytes[1] = UPDATX;
+				Data.Bytes[0] = UPDATX;
+
+				return Data.DWord;
+			}
+
+			/** Writes four bytes to the currently selected pipe's bank in little endian format, for IN
+			 *  direction pipes.
+			 *
+			 *  \ingroup Group_PipePrimitiveRW_AVR8
+			 *
+			 *  \param[in] Data  Data to write to the currently selected pipe's FIFO buffer.
+			 */
+			static inline void Pipe_Write_32_LE(const uint32_t Data) ATTR_ALWAYS_INLINE;
+			static inline void Pipe_Write_32_LE(const uint32_t Data)
+			{
+				UPDATX = (Data &  0xFF);
+				UPDATX = (Data >> 8);
+				UPDATX = (Data >> 16);
+				UPDATX = (Data >> 24);
+			}
+
+			/** Writes four bytes to the currently selected pipe's bank in big endian format, for IN
+			 *  direction pipes.
+			 *
+			 *  \ingroup Group_PipePrimitiveRW_AVR8
+			 *
+			 *  \param[in] Data  Data to write to the currently selected pipe's FIFO buffer.
+			 */
+			static inline void Pipe_Write_32_BE(const uint32_t Data) ATTR_ALWAYS_INLINE;
+			static inline void Pipe_Write_32_BE(const uint32_t Data)
+			{
+				UPDATX = (Data >> 24);
+				UPDATX = (Data >> 16);
+				UPDATX = (Data >> 8);
+				UPDATX = (Data &  0xFF);
+			}
+
+			/** Discards four bytes from the currently selected pipe's bank, for OUT direction pipes.
+			 *
+			 *  \ingroup Group_PipePrimitiveRW_AVR8
+			 */
+			static inline void Pipe_Discard_32(void) ATTR_ALWAYS_INLINE;
+			static inline void Pipe_Discard_32(void)
+			{
+				uint8_t Dummy;
+
+				Dummy = UPDATX;
+				Dummy = UPDATX;
+				Dummy = UPDATX;
+				Dummy = UPDATX;
+
+				(void)Dummy;
+			}
+
+		/* External Variables: */
+			/** Global indicating the maximum packet size of the default control pipe located at address
+			 *  0 in the device. This value is set to the value indicated in the attached device's device
+		     *  descriptor once the USB interface is initialized into host mode and a device is attached
+			 *  to the USB bus.
+			 *
+			 *  \attention This variable should be treated as read-only in the user application, and never manually
+			 *             changed in value.
+			 */
+			extern uint8_t USB_Host_ControlPipeSize;
+
+		/* Function Prototypes: */
+			/** Configures a table of pipe descriptions, in sequence. This function can be used to configure multiple
+			 *  pipes at the same time.
+			 *
+			 *  \note Pipe with a zero address will be ignored, thus this function cannot be used to configure the
+			 *        control pipe.
+			 *
+			 *  \param[in] Table    Pointer to a table of pipe descriptions.
+			 *  \param[in] Entries  Number of entries in the pipe table to configure.
+			 *
+			 *  \return Boolean \c true if all pipes configured successfully, \c false otherwise.
+			 */
+			bool Pipe_ConfigurePipeTable(const USB_Pipe_Table_t* const Table,
+			                             const uint8_t Entries);
+
+			/** Configures the specified pipe address with the given pipe type, endpoint address within the attached device,
+			 *  bank size and number of hardware banks.
+			 *
+			 *  A newly configured pipe is frozen by default, and must be unfrozen before use via the \ref Pipe_Unfreeze()
+			 *  before being used. Pipes should be kept frozen unless waiting for data from a device while in IN mode, or
+			 *  sending data to the device in OUT mode. IN type pipes are also automatically configured to accept infinite
+			 *  numbers of IN requests without automatic freezing - this can be overridden by a call to
+			 *  \ref Pipe_SetFiniteINRequests().
+			 *
+			 *  \param[in] Address          Pipe address to configure.
+			 *
+			 *  \param[in] Type             Type of pipe to configure, an \c EP_TYPE_* mask. Not all pipe types are available on Low
+			 *                              Speed USB devices - refer to the USB 2.0 specification.
+			 *
+			 *  \param[in] EndpointAddress  Endpoint address within the attached device that the pipe should interface to.
+			 *
+			 *  \param[in] Size             Size of the pipe's bank, where packets are stored before they are transmitted to
+			 *                              the USB device, or after they have been received from the USB device (depending on
+			 *                              the pipe's data direction). The bank size must indicate the maximum packet size that
+			 *                              the pipe can handle.
+			 *
+			 *  \param[in] Banks            Number of banks to use for the pipe being configured.
+			 *
+			 *  \attention When the \c ORDERED_EP_CONFIG compile time option is used, Pipes <b>must</b> be configured in ascending order,
+			 *             or bank corruption will occur.
+			 *
+			 *  \note Certain microcontroller model's pipes may have different maximum packet sizes based on the pipe's
+			 *        index - refer to the chosen microcontroller's datasheet to determine the maximum bank size for each pipe.
+			 *        \n\n
+			 *
+			 *  \note The default control pipe should not be manually configured by the user application, as it is
+			 *        automatically configured by the library internally.
+			 *        \n\n
+			 *
+			 *  \note This routine will automatically select the specified pipe upon success. Upon failure, the pipe which
+			 *        failed to reconfigure correctly will be selected.
+			 *
+			 *  \return Boolean \c true if the configuration succeeded, \c false otherwise.
+			 */
+			bool Pipe_ConfigurePipe(const uint8_t Address,
+			                        const uint8_t Type,
+			                        const uint8_t EndpointAddress,
+			                        const uint16_t Size,
+			                        const uint8_t Banks);
+
+			/** Spin-loops until the currently selected non-control pipe is ready for the next packet of data to be read
+			 *  or written to it, aborting in the case of an error condition (such as a timeout or device disconnect).
+			 *
+			 *  \ingroup Group_PipeRW_AVR8
+			 *
+			 *  \return A value from the \ref Pipe_WaitUntilReady_ErrorCodes_t enum.
+			 */
+			uint8_t Pipe_WaitUntilReady(void);
+
+			/** Determines if a pipe has been bound to the given device endpoint address. If a pipe which is bound to the given
+			 *  endpoint is found, it is automatically selected.
+			 *
+			 *  \param[in] EndpointAddress Address and direction mask of the endpoint within the attached device to check.
+			 *
+			 *  \return Boolean \c true if a pipe bound to the given endpoint address of the specified direction is found,
+			 *          \c false otherwise.
+			 */
+			bool Pipe_IsEndpointBound(const uint8_t EndpointAddress) ATTR_WARN_UNUSED_RESULT;
+
+	/* Private Interface - For use in library only: */
+	#if !defined(__DOXYGEN__)
+		/* Macros: */
+			#if !defined(ENDPOINT_CONTROLEP)
+				#define ENDPOINT_CONTROLEP          0
+			#endif
+
+		/* Inline Functions: */
+			static inline uint8_t Pipe_BytesToEPSizeMask(const uint16_t Bytes) ATTR_WARN_UNUSED_RESULT ATTR_CONST ATTR_ALWAYS_INLINE;
+			static inline uint8_t Pipe_BytesToEPSizeMask(const uint16_t Bytes)
+			{
+				uint8_t  MaskVal    = 0;
+				uint16_t CheckBytes = 8;
+
+				while ((CheckBytes < Bytes) && (CheckBytes < PIPE_MAX_SIZE))
+				{
+					MaskVal++;
+					CheckBytes <<= 1;
+				}
+
+				return (MaskVal << EPSIZE0);
+			}
+
+		/* Function Prototypes: */
+			void Pipe_ClearPipes(void);
+	#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Core/AVR8/Template/Template_Endpoint_Control_R.c b/lib/lufa/LUFA/Drivers/USB/Core/AVR8/Template/Template_Endpoint_Control_R.c
new file mode 100644
index 0000000000..f6c4beb229
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Core/AVR8/Template/Template_Endpoint_Control_R.c
@@ -0,0 +1,84 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+#if defined(TEMPLATE_FUNC_NAME)
+
+uint8_t TEMPLATE_FUNC_NAME (void* const Buffer,
+                            uint16_t Length)
+{
+	uint8_t* DataStream = ((uint8_t*)Buffer + TEMPLATE_BUFFER_OFFSET(Length));
+
+	if (!(Length))
+	  Endpoint_ClearOUT();
+
+	while (Length)
+	{
+		uint8_t USB_DeviceState_LCL = USB_DeviceState;
+
+		if (USB_DeviceState_LCL == DEVICE_STATE_Unattached)
+		  return ENDPOINT_RWCSTREAM_DeviceDisconnected;
+		else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended)
+		  return ENDPOINT_RWCSTREAM_BusSuspended;
+		else if (Endpoint_IsSETUPReceived())
+		  return ENDPOINT_RWCSTREAM_HostAborted;
+
+		if (Endpoint_IsOUTReceived())
+		{
+			while (Length && Endpoint_BytesInEndpoint())
+			{
+				TEMPLATE_TRANSFER_BYTE(DataStream);
+				TEMPLATE_BUFFER_MOVE(DataStream, 1);
+				Length--;
+			}
+
+			Endpoint_ClearOUT();
+		}
+	}
+
+	while (!(Endpoint_IsINReady()))
+	{
+		uint8_t USB_DeviceState_LCL = USB_DeviceState;
+
+		if (USB_DeviceState_LCL == DEVICE_STATE_Unattached)
+		  return ENDPOINT_RWCSTREAM_DeviceDisconnected;
+		else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended)
+		  return ENDPOINT_RWCSTREAM_BusSuspended;
+	}
+
+	return ENDPOINT_RWCSTREAM_NoError;
+}
+
+#undef TEMPLATE_BUFFER_OFFSET
+#undef TEMPLATE_BUFFER_MOVE
+#undef TEMPLATE_FUNC_NAME
+#undef TEMPLATE_TRANSFER_BYTE
+
+#endif
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Core/AVR8/Template/Template_Endpoint_Control_W.c b/lib/lufa/LUFA/Drivers/USB/Core/AVR8/Template/Template_Endpoint_Control_W.c
new file mode 100644
index 0000000000..922b58efa3
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Core/AVR8/Template/Template_Endpoint_Control_W.c
@@ -0,0 +1,95 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+#if defined(TEMPLATE_FUNC_NAME)
+
+uint8_t TEMPLATE_FUNC_NAME (const void* const Buffer,
+                            uint16_t Length)
+{
+	uint8_t* DataStream     = ((uint8_t*)Buffer + TEMPLATE_BUFFER_OFFSET(Length));
+	bool     LastPacketFull = false;
+
+	if (Length > USB_ControlRequest.wLength)
+	  Length = USB_ControlRequest.wLength;
+	else if (!(Length))
+	  Endpoint_ClearIN();
+
+	while (Length || LastPacketFull)
+	{
+		uint8_t USB_DeviceState_LCL = USB_DeviceState;
+
+		if (USB_DeviceState_LCL == DEVICE_STATE_Unattached)
+		  return ENDPOINT_RWCSTREAM_DeviceDisconnected;
+		else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended)
+		  return ENDPOINT_RWCSTREAM_BusSuspended;
+		else if (Endpoint_IsSETUPReceived())
+		  return ENDPOINT_RWCSTREAM_HostAborted;
+		else if (Endpoint_IsOUTReceived())
+		  break;
+
+		if (Endpoint_IsINReady())
+		{
+			uint16_t BytesInEndpoint = Endpoint_BytesInEndpoint();
+
+			while (Length && (BytesInEndpoint < USB_Device_ControlEndpointSize))
+			{
+				TEMPLATE_TRANSFER_BYTE(DataStream);
+				TEMPLATE_BUFFER_MOVE(DataStream, 1);
+				Length--;
+				BytesInEndpoint++;
+			}
+
+			LastPacketFull = (BytesInEndpoint == USB_Device_ControlEndpointSize);
+			Endpoint_ClearIN();
+		}
+	}
+
+	while (!(Endpoint_IsOUTReceived()))
+	{
+		uint8_t USB_DeviceState_LCL = USB_DeviceState;
+
+		if (USB_DeviceState_LCL == DEVICE_STATE_Unattached)
+		  return ENDPOINT_RWCSTREAM_DeviceDisconnected;
+		else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended)
+		  return ENDPOINT_RWCSTREAM_BusSuspended;
+		else if (Endpoint_IsSETUPReceived())
+		  return ENDPOINT_RWCSTREAM_HostAborted;
+	}
+
+	return ENDPOINT_RWCSTREAM_NoError;
+}
+
+#undef TEMPLATE_BUFFER_OFFSET
+#undef TEMPLATE_BUFFER_MOVE
+#undef TEMPLATE_FUNC_NAME
+#undef TEMPLATE_TRANSFER_BYTE
+
+#endif
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Core/AVR8/Template/Template_Endpoint_RW.c b/lib/lufa/LUFA/Drivers/USB/Core/AVR8/Template/Template_Endpoint_RW.c
new file mode 100644
index 0000000000..e55e592eb2
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Core/AVR8/Template/Template_Endpoint_RW.c
@@ -0,0 +1,89 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+#if defined(TEMPLATE_FUNC_NAME)
+
+uint8_t TEMPLATE_FUNC_NAME (TEMPLATE_BUFFER_TYPE const Buffer,
+                            uint16_t Length,
+                            uint16_t* const BytesProcessed)
+{
+	uint8_t* DataStream      = ((uint8_t*)Buffer + TEMPLATE_BUFFER_OFFSET(Length));
+	uint16_t BytesInTransfer = 0;
+	uint8_t  ErrorCode;
+
+	if ((ErrorCode = Endpoint_WaitUntilReady()))
+	  return ErrorCode;
+
+	if (BytesProcessed != NULL)
+	{
+		Length -= *BytesProcessed;
+		TEMPLATE_BUFFER_MOVE(DataStream, *BytesProcessed);
+	}
+
+	while (Length)
+	{
+		if (!(Endpoint_IsReadWriteAllowed()))
+		{
+			TEMPLATE_CLEAR_ENDPOINT();
+
+			#if !defined(INTERRUPT_CONTROL_ENDPOINT)
+			USB_USBTask();
+			#endif
+
+			if (BytesProcessed != NULL)
+			{
+				*BytesProcessed += BytesInTransfer;
+				return ENDPOINT_RWSTREAM_IncompleteTransfer;
+			}
+
+			if ((ErrorCode = Endpoint_WaitUntilReady()))
+			  return ErrorCode;
+		}
+		else
+		{
+			TEMPLATE_TRANSFER_BYTE(DataStream);
+			TEMPLATE_BUFFER_MOVE(DataStream, 1);
+			Length--;
+			BytesInTransfer++;
+		}
+	}
+
+	return ENDPOINT_RWSTREAM_NoError;
+}
+
+#undef TEMPLATE_FUNC_NAME
+#undef TEMPLATE_BUFFER_TYPE
+#undef TEMPLATE_TRANSFER_BYTE
+#undef TEMPLATE_CLEAR_ENDPOINT
+#undef TEMPLATE_BUFFER_OFFSET
+#undef TEMPLATE_BUFFER_MOVE
+
+#endif
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Core/AVR8/Template/Template_Pipe_RW.c b/lib/lufa/LUFA/Drivers/USB/Core/AVR8/Template/Template_Pipe_RW.c
new file mode 100644
index 0000000000..bb2a57fa52
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Core/AVR8/Template/Template_Pipe_RW.c
@@ -0,0 +1,88 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+#if defined(TEMPLATE_FUNC_NAME)
+
+uint8_t TEMPLATE_FUNC_NAME (TEMPLATE_BUFFER_TYPE const Buffer,
+                            uint16_t Length,
+                            uint16_t* const BytesProcessed)
+{
+	uint8_t* DataStream      = ((uint8_t*)Buffer + TEMPLATE_BUFFER_OFFSET(Length));
+	uint16_t BytesInTransfer = 0;
+	uint8_t  ErrorCode;
+
+	Pipe_SetPipeToken(TEMPLATE_TOKEN);
+
+	if ((ErrorCode = Pipe_WaitUntilReady()))
+	  return ErrorCode;
+
+	if (BytesProcessed != NULL)
+	{
+		Length -= *BytesProcessed;
+		TEMPLATE_BUFFER_MOVE(DataStream, *BytesProcessed);
+	}
+
+	while (Length)
+	{
+		if (!(Pipe_IsReadWriteAllowed()))
+		{
+			TEMPLATE_CLEAR_PIPE();
+
+			if (BytesProcessed != NULL)
+			{
+				*BytesProcessed += BytesInTransfer;
+				return PIPE_RWSTREAM_IncompleteTransfer;
+			}
+
+			if ((ErrorCode = Pipe_WaitUntilReady()))
+			  return ErrorCode;
+		}
+		else
+		{
+			TEMPLATE_TRANSFER_BYTE(DataStream);
+			TEMPLATE_BUFFER_MOVE(DataStream, 1);
+			Length--;
+			BytesInTransfer++;
+		}
+	}
+
+	return PIPE_RWSTREAM_NoError;
+}
+
+#undef TEMPLATE_FUNC_NAME
+#undef TEMPLATE_BUFFER_TYPE
+#undef TEMPLATE_TOKEN
+#undef TEMPLATE_TRANSFER_BYTE
+#undef TEMPLATE_CLEAR_PIPE
+#undef TEMPLATE_BUFFER_OFFSET
+#undef TEMPLATE_BUFFER_MOVE
+
+#endif
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.c b/lib/lufa/LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.c
new file mode 100644
index 0000000000..92532ab00b
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.c
@@ -0,0 +1,273 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+#include "../../../../Common/Common.h"
+#if (ARCH == ARCH_AVR8)
+
+#define  __INCLUDE_FROM_USB_DRIVER
+#define  __INCLUDE_FROM_USB_CONTROLLER_C
+#include "../USBController.h"
+
+#if defined(USB_CAN_BE_BOTH)
+volatile uint8_t USB_CurrentMode = USB_MODE_None;
+#endif
+
+#if !defined(USE_STATIC_OPTIONS)
+volatile uint8_t USB_Options;
+#endif
+
+void USB_Init(
+               #if defined(USB_CAN_BE_BOTH)
+               const uint8_t Mode
+               #endif
+
+               #if (defined(USB_CAN_BE_BOTH) && !defined(USE_STATIC_OPTIONS))
+               ,
+               #elif (!defined(USB_CAN_BE_BOTH) && defined(USE_STATIC_OPTIONS))
+               void
+               #endif
+
+               #if !defined(USE_STATIC_OPTIONS)
+               const uint8_t Options
+               #endif
+               )
+{
+	#if !defined(USE_STATIC_OPTIONS)
+	USB_Options = Options;
+	#endif
+
+	#if defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR)
+	/* Workaround for AVR8 bootloaders that fail to turn off the OTG pad before running
+	 * the loaded application. This causes VBUS detection to fail unless we first force
+	 * it off to reset it. */
+	USB_OTGPAD_Off();
+	#endif
+
+	if (!(USB_Options & USB_OPT_REG_DISABLED))
+	  USB_REG_On();
+	else
+	  USB_REG_Off();
+
+	if (!(USB_Options & USB_OPT_MANUAL_PLL))
+	{
+		#if defined(USB_SERIES_4_AVR)
+		PLLFRQ = (1 << PDIV2);
+		#endif
+	}
+
+	#if defined(USB_CAN_BE_BOTH)
+	if (Mode == USB_MODE_UID)
+	{
+		UHWCON |=  (1 << UIDE);
+		USB_INT_Enable(USB_INT_IDTI);
+		USB_CurrentMode = USB_GetUSBModeFromUID();
+	}
+	else
+	{
+		UHWCON &= ~(1 << UIDE);
+		USB_CurrentMode = Mode;
+	}
+	#endif
+
+	USB_IsInitialized = true;
+
+	USB_ResetInterface();
+}
+
+void USB_Disable(void)
+{
+	USB_INT_DisableAllInterrupts();
+	USB_INT_ClearAllInterrupts();
+
+	USB_Detach();
+	USB_Controller_Disable();
+
+	if (!(USB_Options & USB_OPT_MANUAL_PLL))
+	  USB_PLL_Off();
+
+	if (!(USB_Options & USB_OPT_REG_KEEP_ENABLED))
+	  USB_REG_Off();
+
+	#if defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR)
+	USB_OTGPAD_Off();
+	#endif
+
+	#if defined(USB_CAN_BE_BOTH)
+	USB_CurrentMode = USB_MODE_None;
+	#endif
+
+	USB_IsInitialized = false;
+}
+
+void USB_ResetInterface(void)
+{
+	#if defined(USB_CAN_BE_BOTH)
+	bool UIDModeSelectEnabled = ((UHWCON & (1 << UIDE)) != 0);
+	#endif
+
+	USB_INT_DisableAllInterrupts();
+	USB_INT_ClearAllInterrupts();
+
+	USB_Controller_Reset();
+
+	#if defined(USB_CAN_BE_BOTH)
+	if (UIDModeSelectEnabled)
+	  USB_INT_Enable(USB_INT_IDTI);
+	#endif
+
+	USB_CLK_Unfreeze();
+
+	if (USB_CurrentMode == USB_MODE_Device)
+	{
+		#if defined(USB_CAN_BE_DEVICE)
+		#if (defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR))
+		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
+	}
+	else if (USB_CurrentMode == USB_MODE_Host)
+	{
+		#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 (defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR))
+	USB_OTGPAD_On();
+	#endif
+}
+
+#if defined(USB_CAN_BE_DEVICE)
+static void USB_Init_Device(void)
+{
+	USB_DeviceState                 = DEVICE_STATE_Unattached;
+	USB_Device_ConfigurationNumber  = 0;
+
+	#if !defined(NO_DEVICE_REMOTE_WAKEUP)
+	USB_Device_RemoteWakeupEnabled  = false;
+	#endif
+
+	#if !defined(NO_DEVICE_SELF_POWER)
+	USB_Device_CurrentlySelfPowered = false;
+	#endif
+
+	#if !defined(FIXED_CONTROL_ENDPOINT_SIZE)
+	USB_Descriptor_Device_t* DeviceDescriptorPtr;
+
+	#if defined(ARCH_HAS_MULTI_ADDRESS_SPACE) && \
+	    !(defined(USE_FLASH_DESCRIPTORS) || defined(USE_EEPROM_DESCRIPTORS) || defined(USE_RAM_DESCRIPTORS))
+	uint8_t DescriptorAddressSpace;
+
+	if (CALLBACK_USB_GetDescriptor((DTYPE_Device << 8), 0, (void*)&DeviceDescriptorPtr, &DescriptorAddressSpace) != NO_DESCRIPTOR)
+	{
+		if (DescriptorAddressSpace == MEMSPACE_FLASH)
+		  USB_Device_ControlEndpointSize = pgm_read_byte(&DeviceDescriptorPtr->Endpoint0Size);
+		else if (DescriptorAddressSpace == MEMSPACE_EEPROM)
+		  USB_Device_ControlEndpointSize = eeprom_read_byte(&DeviceDescriptorPtr->Endpoint0Size);
+		else
+		  USB_Device_ControlEndpointSize = DeviceDescriptorPtr->Endpoint0Size;
+	}
+	#else
+	if (CALLBACK_USB_GetDescriptor((DTYPE_Device << 8), 0, (void*)&DeviceDescriptorPtr) != NO_DESCRIPTOR)
+	{
+		#if defined(USE_RAM_DESCRIPTORS)
+		USB_Device_ControlEndpointSize = DeviceDescriptorPtr->Endpoint0Size;
+		#elif defined(USE_EEPROM_DESCRIPTORS)
+		USB_Device_ControlEndpointSize = eeprom_read_byte(&DeviceDescriptorPtr->Endpoint0Size);
+		#else
+		USB_Device_ControlEndpointSize = pgm_read_byte(&DeviceDescriptorPtr->Endpoint0Size);
+		#endif
+	}
+	#endif
+	#endif
+
+	#if (defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR))
+	if (USB_Options & USB_DEVICE_OPT_LOWSPEED)
+	  USB_Device_SetLowSpeed();
+	else
+	  USB_Device_SetFullSpeed();
+
+	USB_INT_Enable(USB_INT_VBUSTI);
+	#endif
+
+	Endpoint_ConfigureEndpoint(ENDPOINT_CONTROLEP, EP_TYPE_CONTROL,
+							   USB_Device_ControlEndpointSize, 1);
+
+	USB_INT_Clear(USB_INT_SUSPI);
+	USB_INT_Enable(USB_INT_SUSPI);
+	USB_INT_Enable(USB_INT_EORSTI);
+
+	USB_Attach();
+}
+#endif
+
+#if defined(USB_CAN_BE_HOST)
+static void USB_Init_Host(void)
+{
+	USB_HostState                = HOST_STATE_Unattached;
+	USB_Host_ConfigurationNumber = 0;
+	USB_Host_ControlPipeSize     = PIPE_CONTROLPIPE_DEFAULT_SIZE;
+
+	USB_Host_HostMode_On();
+
+	USB_Host_VBUS_Auto_Off();
+	USB_Host_VBUS_Manual_Enable();
+	USB_Host_VBUS_Manual_On();
+
+	USB_INT_Enable(USB_INT_SRPI);
+	USB_INT_Enable(USB_INT_BCERRI);
+
+	USB_Attach();
+}
+#endif
+
+#endif
diff --git a/lib/lufa/LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.h b/lib/lufa/LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.h
new file mode 100644
index 0000000000..1b6e2ef43c
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.h
@@ -0,0 +1,432 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief USB Controller definitions for the AVR8 microcontrollers.
+ *  \copydetails Group_USBManagement_AVR8
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the USB driver
+ *        dispatch header located in LUFA/Drivers/USB/USB.h.
+ */
+
+/** \ingroup Group_USBManagement
+ *  \defgroup Group_USBManagement_AVR8 USB Interface Management (AVR8)
+ *  \brief USB Controller definitions for the AVR8 microcontrollers.
+ *
+ *  Functions, macros, variables, enums and types related to the setup and management of the USB interface.
+ *
+ *  @{
+ */
+
+#ifndef __USBCONTROLLER_AVR8_H__
+#define __USBCONTROLLER_AVR8_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+		#include "../USBMode.h"
+		#include "../Events.h"
+		#include "../USBTask.h"
+		#include "../USBInterrupt.h"
+
+		#if defined(USB_CAN_BE_HOST) || defined(__DOXYGEN__)
+			#include "../Host.h"
+			#include "../OTG.h"
+			#include "../Pipe.h"
+			#include "../HostStandardReq.h"
+			#include "../PipeStream.h"
+		#endif
+
+		#if defined(USB_CAN_BE_DEVICE) || defined(__DOXYGEN__)
+			#include "../Device.h"
+			#include "../Endpoint.h"
+			#include "../DeviceStandardReq.h"
+			#include "../EndpointStream.h"
+		#endif
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks and Defines: */
+		#if !defined(__INCLUDE_FROM_USB_DRIVER)
+			#error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.
+		#endif
+
+		#if !defined(F_USB)
+			#error F_USB is not defined. You must define F_USB to the frequency of the unprescaled USB controller clock in your project makefile.
+		#endif
+
+		#if (F_USB == 8000000)
+			#if (defined(__AVR_AT90USB82__) || defined(__AVR_AT90USB162__) || \
+			     defined(__AVR_ATmega8U2__) || defined(__AVR_ATmega16U2__) || \
+			     defined(__AVR_ATmega32U2__))
+				#define USB_PLL_PSC                0
+			#elif (defined(__AVR_ATmega16U4__) || defined(__AVR_ATmega32U4__))
+				#define USB_PLL_PSC                0
+			#elif (defined(__AVR_AT90USB646__)  || defined(__AVR_AT90USB1286__))
+				#define USB_PLL_PSC                ((1 << PLLP1) | (1 << PLLP0))
+			#elif (defined(__AVR_AT90USB647__)  || defined(__AVR_AT90USB1287__))
+				#define USB_PLL_PSC                ((1 << PLLP1) | (1 << PLLP0))
+			#endif
+		#elif (F_USB == 16000000)
+			#if (defined(__AVR_AT90USB82__) || defined(__AVR_AT90USB162__) || \
+			     defined(__AVR_ATmega8U2__) || defined(__AVR_ATmega16U2__) || \
+			     defined(__AVR_ATmega32U2__))
+				#define USB_PLL_PSC                (1 << PLLP0)
+			#elif (defined(__AVR_ATmega16U4__) || defined(__AVR_ATmega32U4__))
+				#define USB_PLL_PSC                (1 << PINDIV)
+			#elif (defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB647__))
+				#define USB_PLL_PSC                ((1 << PLLP2) | (1 << PLLP1))
+			#elif (defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB1287__))
+				#define USB_PLL_PSC                ((1 << PLLP2) | (1 << PLLP0))
+			#endif
+		#endif
+
+		#if !defined(USB_PLL_PSC)
+			#error No PLL prescale value available for chosen F_USB value and AVR model.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** \name USB Controller Option Masks */
+			//@{
+			/** Regulator disable option mask for \ref USB_Init(). This indicates that the internal 3.3V USB data pad
+			 *  regulator should be disabled and the AVR's VCC level used for the data pads.
+			 *
+			 *  \note See USB AVR data sheet for more information on the internal pad regulator.
+			 */
+			#define USB_OPT_REG_DISABLED               (1 << 1)
+
+			/** Regulator enable option mask for \ref USB_Init(). This indicates that the internal 3.3V USB data pad
+			 *  regulator should be enabled to regulate the data pin voltages from the VBUS level down to a level within
+			 *  the range allowable by the USB standard.
+			 *
+			 *  \note See USB AVR data sheet for more information on the internal pad regulator.
+			 */
+			#define USB_OPT_REG_ENABLED                (0 << 1)
+
+			/** Option mask for \ref USB_Init() to keep regulator enabled at all times. Indicates that \ref USB_Disable()
+			 *  should not disable the regulator as it would otherwise. Has no effect if regulator is disabled using
+			 *  \ref USB_OPT_REG_DISABLED.
+			 *
+			 *  \note See USB AVR data sheet for more information on the internal pad regulator.
+			 */
+			#define USB_OPT_REG_KEEP_ENABLED           (1 << 3)
+
+			/** Manual PLL control option mask for \ref USB_Init(). This indicates to the library that the user application
+			 *  will take full responsibility for controlling the AVR's PLL (used to generate the high frequency clock
+			 *  that the USB controller requires) and ensuring that it is locked at the correct frequency for USB operations.
+			 */
+			#define USB_OPT_MANUAL_PLL                 (1 << 2)
+
+			/** Automatic PLL control option mask for \ref USB_Init(). This indicates to the library that the library should
+			 *  take full responsibility for controlling the AVR's PLL (used to generate the high frequency clock
+			 *  that the USB controller requires) and ensuring that it is locked at the correct frequency for USB operations.
+			 */
+			#define USB_OPT_AUTO_PLL                   (0 << 2)
+			//@}
+
+			#if !defined(USB_STREAM_TIMEOUT_MS) || defined(__DOXYGEN__)
+				/** Constant for the maximum software timeout period of the USB data stream transfer functions
+				 *  (both control and standard) when in either device or host mode. If the next packet of a stream
+				 *  is not received or acknowledged within this time period, the stream function will fail.
+				 *
+				 *  This value may be overridden in the user project makefile as the value of the
+				 *  \ref USB_STREAM_TIMEOUT_MS token, and passed to the compiler using the -D switch.
+				 */
+				#define USB_STREAM_TIMEOUT_MS       100
+			#endif
+
+		/* Inline Functions: */
+			#if defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR) || defined(__DOXYGEN__)
+				/** Determines if the VBUS line is currently high (i.e. the USB host is supplying power).
+				 *
+				 *  \note This function is not available on some AVR models which do not support hardware VBUS monitoring.
+				 *
+				 *  \return Boolean \c true if the VBUS line is currently detecting power from a host, \c false otherwise.
+				 */
+				static inline bool USB_VBUS_GetStatus(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+				static inline bool USB_VBUS_GetStatus(void)
+				{
+					return ((USBSTA & (1 << VBUS)) ? true : false);
+				}
+			#endif
+
+			/** Detaches the device from the USB bus. This has the effect of removing the device from any
+			 *  attached host, ceasing USB communications. If no host is present, this prevents any host from
+			 *  enumerating the device once attached until \ref USB_Attach() is called.
+			 */
+			static inline void USB_Detach(void) ATTR_ALWAYS_INLINE;
+			static inline void USB_Detach(void)
+			{
+				UDCON  |=  (1 << DETACH);
+			}
+
+			/** Attaches the device to the USB bus. This announces the device's presence to any attached
+			 *  USB host, starting the enumeration process. If no host is present, attaching the device
+			 *  will allow for enumeration once a host is connected to the device.
+			 *
+			 *  This is inexplicably also required for proper operation while in host mode, to enable the
+			 *  attachment of a device to the host. This is despite the bit being located in the device-mode
+			 *  register and despite the datasheet making no mention of its requirement in host mode.
+			 */
+			static inline void USB_Attach(void) ATTR_ALWAYS_INLINE;
+			static inline void USB_Attach(void)
+			{
+				UDCON  &= ~(1 << DETACH);
+			}
+
+		/* Function Prototypes: */
+			/** Main function to initialize and start the USB interface. Once active, the USB interface will
+			 *  allow for device connection to a host when in device mode, or for device enumeration while in
+			 *  host mode.
+			 *
+			 *  As the USB library relies on interrupts for the device and host mode enumeration processes,
+			 *  the user must enable global interrupts before or shortly after this function is called. In
+			 *  device mode, interrupts must be enabled within 500ms of this function being called to ensure
+			 *  that the host does not time out whilst enumerating the device. In host mode, interrupts may be
+			 *  enabled at the application's leisure however enumeration will not begin of an attached device
+			 *  until after this has occurred.
+			 *
+			 *  Calling this function when the USB interface is already initialized will cause a complete USB
+			 *  interface reset and re-enumeration.
+			 *
+			 *  \param[in] Mode     Mask indicating what mode the USB interface is to be initialized to, a value
+			 *                      from the \ref USB_Modes_t enum.
+			 *                      \note This parameter does not exist on devices with only one supported USB
+			 *                            mode (device or host).
+			 *
+			 *  \param[in] Options  Mask indicating the options which should be used when initializing the USB
+			 *                      interface to control the USB interface's behavior. This should be comprised of
+			 *                      a \c USB_OPT_REG_* mask to control the regulator, a \c USB_OPT_*_PLL mask to control the
+			 *                      PLL, and a \c USB_DEVICE_OPT_* mask (when the device mode is enabled) to set the device
+			 *                      mode speed.
+			 *
+			 *  \note To reduce the FLASH requirements of the library if only device or host mode is required,
+			 *        the mode can be statically set in the project makefile by defining the token \c USB_DEVICE_ONLY
+			 *        (for device mode) or \c USB_HOST_ONLY (for host mode), passing the token to the compiler
+			 *        via the -D switch. If the mode is statically set, this parameter does not exist in the
+			 *        function prototype.
+			 *        \n\n
+			 *
+			 *  \note To reduce the FLASH requirements of the library if only fixed settings are required,
+			 *        the options may be set statically in the same manner as the mode (see the Mode parameter of
+			 *        this function). To statically set the USB options, pass in the \c USE_STATIC_OPTIONS token,
+			 *        defined to the appropriate options masks. When the options are statically set, this
+			 *        parameter does not exist in the function prototype.
+			 *        \n\n
+			 *
+			 *  \note The mode parameter does not exist on devices where only one mode is possible, such as USB
+			 *        AVR models which only implement the USB device mode in hardware.
+			 *
+			 *  \see \ref Group_Device for the \c USB_DEVICE_OPT_* masks.
+			 */
+			void USB_Init(
+			               #if defined(USB_CAN_BE_BOTH) || defined(__DOXYGEN__)
+			               const uint8_t Mode
+			               #endif
+
+			               #if (defined(USB_CAN_BE_BOTH) && !defined(USE_STATIC_OPTIONS)) || defined(__DOXYGEN__)
+			               ,
+			               #elif (!defined(USB_CAN_BE_BOTH) && defined(USE_STATIC_OPTIONS))
+			               void
+			               #endif
+
+			               #if !defined(USE_STATIC_OPTIONS) || defined(__DOXYGEN__)
+			               const uint8_t Options
+			               #endif
+			               );
+
+			/** Shuts down the USB interface. This turns off the USB interface after deallocating all USB FIFO
+			 *  memory, endpoints and pipes. When turned off, no USB functionality can be used until the interface
+			 *  is restarted with the \ref USB_Init() function.
+			 */
+			void USB_Disable(void);
+
+			/** Resets the interface, when already initialized. This will re-enumerate the device if already connected
+			 *  to a host, or re-enumerate an already attached device when in host mode.
+			 */
+			void USB_ResetInterface(void);
+
+		/* Global Variables: */
+			#if defined(USB_CAN_BE_BOTH) || defined(__DOXYGEN__)
+				/** Indicates the mode that the USB interface is currently initialized to, a value from the
+				 *  \ref USB_Modes_t enum.
+				 *
+				 *  \attention This variable should be treated as read-only in the user application, and never manually
+				 *             changed in value.
+				 *
+				 *  \note When the controller is initialized into UID auto-detection mode, this variable will hold the
+				 *        currently selected USB mode (i.e. \ref USB_MODE_Device or \ref USB_MODE_Host). If the controller
+				 *        is fixed into a specific mode (either through the \c USB_DEVICE_ONLY or \c USB_HOST_ONLY compile time
+				 *        options, or a limitation of the USB controller in the chosen device model) this will evaluate to
+				 *        a constant of the appropriate value and will never evaluate to \ref USB_MODE_None even when the
+				 *        USB interface is not initialized.
+				 */
+				extern volatile uint8_t USB_CurrentMode;
+			#elif defined(USB_CAN_BE_HOST)
+				#define USB_CurrentMode USB_MODE_Host
+			#elif defined(USB_CAN_BE_DEVICE)
+				#define USB_CurrentMode USB_MODE_Device
+			#endif
+
+			#if !defined(USE_STATIC_OPTIONS) || defined(__DOXYGEN__)
+				/** Indicates the current USB options that the USB interface was initialized with when \ref USB_Init()
+				 *  was called. This value will be one of the \c USB_MODE_* masks defined elsewhere in this module.
+				 *
+				 *  \attention This variable should be treated as read-only in the user application, and never manually
+				 *             changed in value.
+				 */
+				extern volatile uint8_t USB_Options;
+			#elif defined(USE_STATIC_OPTIONS)
+				#define USB_Options USE_STATIC_OPTIONS
+			#endif
+
+	/* Private Interface - For use in library only: */
+	#if !defined(__DOXYGEN__)
+		/* Function Prototypes: */
+			#if defined(__INCLUDE_FROM_USB_CONTROLLER_C)
+				#if defined(USB_CAN_BE_DEVICE)
+				static void USB_Init_Device(void);
+				#endif
+
+				#if defined(USB_CAN_BE_HOST)
+				static void USB_Init_Host(void);
+				#endif
+			#endif
+
+		/* Inline Functions: */
+			static inline void USB_PLL_On(void) ATTR_ALWAYS_INLINE;
+			static inline void USB_PLL_On(void)
+			{
+				PLLCSR = USB_PLL_PSC;
+				PLLCSR = (USB_PLL_PSC | (1 << PLLE));
+			}
+
+			static inline void USB_PLL_Off(void) ATTR_ALWAYS_INLINE;
+			static inline void USB_PLL_Off(void)
+			{
+				PLLCSR = 0;
+			}
+
+			static inline bool USB_PLL_IsReady(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline bool USB_PLL_IsReady(void)
+			{
+				return ((PLLCSR & (1 << PLOCK)) ? true : false);
+			}
+
+			static inline void USB_REG_On(void) ATTR_ALWAYS_INLINE;
+			static inline void USB_REG_On(void)
+			{
+			#if defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR)
+				UHWCON |=  (1 << UVREGE);
+			#else
+				REGCR  &= ~(1 << REGDIS);
+			#endif
+			}
+
+			static inline void USB_REG_Off(void) ATTR_ALWAYS_INLINE;
+			static inline void USB_REG_Off(void)
+			{
+			#if defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR)
+				UHWCON &= ~(1 << UVREGE);
+			#else
+				REGCR  |=  (1 << REGDIS);
+			#endif
+			}
+
+			#if defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR)
+			static inline void USB_OTGPAD_On(void) ATTR_ALWAYS_INLINE;
+			static inline void USB_OTGPAD_On(void)
+			{
+				USBCON |=  (1 << OTGPADE);
+			}
+
+			static inline void USB_OTGPAD_Off(void) ATTR_ALWAYS_INLINE;
+			static inline void USB_OTGPAD_Off(void)
+			{
+				USBCON &= ~(1 << OTGPADE);
+			}
+			#endif
+
+			static inline void USB_CLK_Freeze(void) ATTR_ALWAYS_INLINE;
+			static inline void USB_CLK_Freeze(void)
+			{
+				USBCON |=  (1 << FRZCLK);
+			}
+
+			static inline void USB_CLK_Unfreeze(void) ATTR_ALWAYS_INLINE;
+			static inline void USB_CLK_Unfreeze(void)
+			{
+				USBCON &= ~(1 << FRZCLK);
+			}
+
+			static inline void USB_Controller_Enable(void) ATTR_ALWAYS_INLINE;
+			static inline void USB_Controller_Enable(void)
+			{
+				USBCON |=  (1 << USBE);
+			}
+
+			static inline void USB_Controller_Disable(void) ATTR_ALWAYS_INLINE;
+			static inline void USB_Controller_Disable(void)
+			{
+				USBCON &= ~(1 << USBE);
+			}
+
+			static inline void USB_Controller_Reset(void) ATTR_ALWAYS_INLINE;
+			static inline void USB_Controller_Reset(void)
+			{
+				USBCON &= ~(1 << USBE);
+				USBCON |=  (1 << USBE);
+			}
+
+			#if defined(USB_CAN_BE_BOTH)
+			static inline uint8_t USB_GetUSBModeFromUID(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline uint8_t USB_GetUSBModeFromUID(void)
+			{
+				if (USBSTA & (1 << ID))
+				  return USB_MODE_Device;
+				else
+				  return USB_MODE_Host;
+			}
+			#endif
+
+	#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.c b/lib/lufa/LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.c
new file mode 100644
index 0000000000..fac4fb41ad
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.c
@@ -0,0 +1,279 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+#include "../../../../Common/Common.h"
+#if (ARCH == ARCH_AVR8)
+
+#define  __INCLUDE_FROM_USB_DRIVER
+#include "../USBInterrupt.h"
+
+void USB_INT_DisableAllInterrupts(void)
+{
+	#if defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR)
+	USBCON &= ~((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;
+	#endif
+
+	#if defined(USB_CAN_BE_DEVICE)
+	UDIEN   = 0;
+	#endif
+}
+
+void USB_INT_ClearAllInterrupts(void)
+{
+	#if defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR)
+	USBINT = 0;
+	#endif
+
+	#if defined(USB_CAN_BE_BOTH)
+	OTGINT = 0;
+	#endif
+
+	#if defined(USB_CAN_BE_HOST)
+	UHINT  = 0;
+	#endif
+
+	#if defined(USB_CAN_BE_DEVICE)
+	UDINT  = 0;
+	#endif
+}
+
+ISR(USB_GEN_vect, ISR_BLOCK)
+{
+	#if defined(USB_CAN_BE_DEVICE)
+	#if !defined(NO_SOF_EVENTS)
+	if (USB_INT_HasOccurred(USB_INT_SOFI) && USB_INT_IsEnabled(USB_INT_SOFI))
+	{
+		USB_INT_Clear(USB_INT_SOFI);
+
+		EVENT_USB_Device_StartOfFrame();
+	}
+	#endif
+
+	#if defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR)
+	if (USB_INT_HasOccurred(USB_INT_VBUSTI) && USB_INT_IsEnabled(USB_INT_VBUSTI))
+	{
+		USB_INT_Clear(USB_INT_VBUSTI);
+
+		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();
+		}
+	}
+	#endif
+
+	if (USB_INT_HasOccurred(USB_INT_SUSPI) && USB_INT_IsEnabled(USB_INT_SUSPI))
+	{
+		USB_INT_Disable(USB_INT_SUSPI);
+		USB_INT_Enable(USB_INT_WAKEUPI);
+
+		USB_CLK_Freeze();
+
+		if (!(USB_Options & USB_OPT_MANUAL_PLL))
+		  USB_PLL_Off();
+
+		#if defined(USB_SERIES_2_AVR) && !defined(NO_LIMITED_CONTROLLER_CONNECT)
+		USB_DeviceState = DEVICE_STATE_Unattached;
+		EVENT_USB_Device_Disconnect();
+		#else
+		USB_DeviceState = DEVICE_STATE_Suspended;
+		EVENT_USB_Device_Suspend();
+		#endif
+	}
+
+	if (USB_INT_HasOccurred(USB_INT_WAKEUPI) && USB_INT_IsEnabled(USB_INT_WAKEUPI))
+	{
+		if (!(USB_Options & USB_OPT_MANUAL_PLL))
+		{
+			USB_PLL_On();
+			while (!(USB_PLL_IsReady()));
+		}
+
+		USB_CLK_Unfreeze();
+
+		USB_INT_Clear(USB_INT_WAKEUPI);
+
+		USB_INT_Disable(USB_INT_WAKEUPI);
+		USB_INT_Enable(USB_INT_SUSPI);
+
+		if (USB_Device_ConfigurationNumber)
+		  USB_DeviceState = DEVICE_STATE_Configured;
+		else
+		  USB_DeviceState = (USB_Device_IsAddressSet()) ? DEVICE_STATE_Addressed : DEVICE_STATE_Powered;
+
+		#if defined(USB_SERIES_2_AVR) && !defined(NO_LIMITED_CONTROLLER_CONNECT)
+		EVENT_USB_Device_Connect();
+		#else
+		EVENT_USB_Device_WakeUp();
+		#endif
+	}
+
+	if (USB_INT_HasOccurred(USB_INT_EORSTI) && USB_INT_IsEnabled(USB_INT_EORSTI))
+	{
+		USB_INT_Clear(USB_INT_EORSTI);
+
+		USB_DeviceState                = DEVICE_STATE_Default;
+		USB_Device_ConfigurationNumber = 0;
+
+		USB_INT_Clear(USB_INT_SUSPI);
+		USB_INT_Disable(USB_INT_SUSPI);
+		USB_INT_Enable(USB_INT_WAKEUPI);
+
+		Endpoint_ConfigureEndpoint(ENDPOINT_CONTROLEP, EP_TYPE_CONTROL,
+		                           USB_Device_ControlEndpointSize, 1);
+
+		#if defined(INTERRUPT_CONTROL_ENDPOINT)
+		USB_INT_Enable(USB_INT_RXSTPI);
+		#endif
+
+		EVENT_USB_Device_Reset();
+	}
+	#endif
+
+	#if defined(USB_CAN_BE_HOST)
+	#if !defined(NO_SOF_EVENTS)
+	if (USB_INT_HasOccurred(USB_INT_HSOFI) && USB_INT_IsEnabled(USB_INT_HSOFI))
+	{
+		USB_INT_Clear(USB_INT_HSOFI);
+
+		EVENT_USB_Host_StartOfFrame();
+	}
+	#endif
+
+	if (USB_INT_HasOccurred(USB_INT_DDISCI) && USB_INT_IsEnabled(USB_INT_DDISCI))
+	{
+		USB_INT_Clear(USB_INT_DDISCI);
+		USB_INT_Clear(USB_INT_DCONNI);
+		USB_INT_Disable(USB_INT_DDISCI);
+
+		EVENT_USB_Host_DeviceUnattached();
+
+		USB_ResetInterface();
+	}
+
+	if (USB_INT_HasOccurred(USB_INT_VBERRI) && USB_INT_IsEnabled(USB_INT_VBERRI))
+	{
+		USB_INT_Clear(USB_INT_VBERRI);
+
+		USB_Host_VBUS_Manual_Off();
+		USB_Host_VBUS_Auto_Off();
+
+		EVENT_USB_Host_HostError(HOST_ERROR_VBusVoltageDip);
+		EVENT_USB_Host_DeviceUnattached();
+
+		USB_HostState = HOST_STATE_Unattached;
+	}
+
+	if (USB_INT_HasOccurred(USB_INT_SRPI) && USB_INT_IsEnabled(USB_INT_SRPI))
+	{
+		USB_INT_Clear(USB_INT_SRPI);
+		USB_INT_Disable(USB_INT_SRPI);
+
+		EVENT_USB_Host_DeviceAttached();
+
+		USB_INT_Enable(USB_INT_DDISCI);
+
+		USB_HostState = HOST_STATE_Powered;
+	}
+
+	if (USB_INT_HasOccurred(USB_INT_BCERRI) && USB_INT_IsEnabled(USB_INT_BCERRI))
+	{
+		USB_INT_Clear(USB_INT_BCERRI);
+
+		EVENT_USB_Host_DeviceEnumerationFailed(HOST_ENUMERROR_NoDeviceDetected, 0);
+		EVENT_USB_Host_DeviceUnattached();
+
+		USB_ResetInterface();
+	}
+	#endif
+
+	#if defined(USB_CAN_BE_BOTH)
+	if (USB_INT_HasOccurred(USB_INT_IDTI) && USB_INT_IsEnabled(USB_INT_IDTI))
+	{
+		USB_INT_Clear(USB_INT_IDTI);
+
+		if (USB_DeviceState != DEVICE_STATE_Unattached)
+		  EVENT_USB_Device_Disconnect();
+
+		if (USB_HostState != HOST_STATE_Unattached)
+		  EVENT_USB_Host_DeviceUnattached();
+
+		USB_CurrentMode = USB_GetUSBModeFromUID();
+		USB_ResetInterface();
+
+		EVENT_USB_UIDChange();
+	}
+	#endif
+}
+
+#if defined(INTERRUPT_CONTROL_ENDPOINT) && defined(USB_CAN_BE_DEVICE)
+ISR(USB_COM_vect, ISR_BLOCK)
+{
+	uint8_t PrevSelectedEndpoint = Endpoint_GetCurrentEndpoint();
+
+	Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP);
+	USB_INT_Disable(USB_INT_RXSTPI);
+
+	GlobalInterruptEnable();
+
+	USB_Device_ProcessControlRequest();
+
+	Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP);
+	USB_INT_Enable(USB_INT_RXSTPI);
+	Endpoint_SelectEndpoint(PrevSelectedEndpoint);
+}
+#endif
+
+#endif
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.h b/lib/lufa/LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.h
new file mode 100644
index 0000000000..1eeb019f20
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.h
@@ -0,0 +1,375 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief USB Controller Interrupt definitions for the AVR8 microcontrollers.
+ *
+ *  This file contains definitions required for the correct handling of low level USB service routine interrupts
+ *  from the USB controller.
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the USB driver
+ *        dispatch header located in LUFA/Drivers/USB/USB.h.
+ */
+
+#ifndef __USBINTERRUPT_AVR8_H__
+#define __USBINTERRUPT_AVR8_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_USB_DRIVER)
+			#error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.
+		#endif
+
+	/* Private Interface - For use in library only: */
+	#if !defined(__DOXYGEN__)
+		/* Enums: */
+			enum USB_Interrupts_t
+			{
+				#if (defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR) || defined(__DOXYGEN__))
+				USB_INT_VBUSTI  = 0,
+				#endif
+				#if (defined(USB_CAN_BE_BOTH) || defined(__DOXYGEN__))
+				USB_INT_IDTI    = 1,
+				#endif
+				#if (defined(USB_CAN_BE_DEVICE) || defined(__DOXYGEN__))
+				USB_INT_WAKEUPI = 2,
+				USB_INT_SUSPI   = 3,
+				USB_INT_EORSTI  = 4,
+				USB_INT_SOFI    = 5,
+				USB_INT_RXSTPI  = 6,
+				#endif
+				#if (defined(USB_CAN_BE_HOST) || defined(__DOXYGEN__))
+				USB_INT_HSOFI   = 7,
+				USB_INT_DCONNI  = 8,
+				USB_INT_DDISCI  = 9,
+				USB_INT_RSTI    = 10,
+				USB_INT_BCERRI  = 11,
+				USB_INT_VBERRI  = 12,
+				USB_INT_SRPI    = 13,
+				#endif
+			};
+
+		/* Inline Functions: */
+			static inline void USB_INT_Enable(const uint8_t Interrupt) ATTR_ALWAYS_INLINE;
+			static inline void USB_INT_Enable(const uint8_t Interrupt)
+			{
+				switch (Interrupt)
+				{
+					#if (defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR))
+					case USB_INT_VBUSTI:
+						USBCON |= (1 << VBUSTE);
+						break;
+					#endif
+					#if defined(USB_CAN_BE_BOTH)
+					case USB_INT_IDTI:
+						USBCON |= (1 << IDTE);
+						break;
+					#endif
+					#if defined(USB_CAN_BE_DEVICE)
+					case USB_INT_WAKEUPI:
+						UDIEN  |= (1 << WAKEUPE);
+						break;
+					case USB_INT_SUSPI:
+						UDIEN  |= (1 << SUSPE);
+						break;
+					case USB_INT_EORSTI:
+						UDIEN  |= (1 << EORSTE);
+						break;
+					case USB_INT_SOFI:
+						UDIEN  |= (1 << SOFE);
+						break;
+					case USB_INT_RXSTPI:
+						UEIENX |= (1 << RXSTPE);
+						break;
+					#endif
+					#if defined(USB_CAN_BE_HOST)
+					case USB_INT_HSOFI:
+						UHIEN  |= (1 << HSOFE);
+						break;
+					case USB_INT_DCONNI:
+						UHIEN  |= (1 << DCONNE);
+						break;
+					case USB_INT_DDISCI:
+						UHIEN  |= (1 << DDISCE);
+						break;
+					case USB_INT_RSTI:
+						UHIEN  |= (1 << RSTE);
+						break;
+					case USB_INT_BCERRI:
+						OTGIEN |= (1 << BCERRE);
+						break;
+					case USB_INT_VBERRI:
+						OTGIEN |= (1 << VBERRE);
+						break;
+					case USB_INT_SRPI:
+						OTGIEN |= (1 << SRPE);
+						break;
+					#endif
+					default:
+						break;
+				}
+			}
+
+			static inline void USB_INT_Disable(const uint8_t Interrupt) ATTR_ALWAYS_INLINE;
+			static inline void USB_INT_Disable(const uint8_t Interrupt)
+			{
+				switch (Interrupt)
+				{
+					#if (defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR))
+					case USB_INT_VBUSTI:
+						USBCON &= ~(1 << VBUSTE);
+						break;
+					#endif
+					#if defined(USB_CAN_BE_BOTH)
+					case USB_INT_IDTI:
+						USBCON &= ~(1 << IDTE);
+						break;
+					#endif
+					#if defined(USB_CAN_BE_DEVICE)
+					case USB_INT_WAKEUPI:
+						UDIEN  &= ~(1 << WAKEUPE);
+						break;
+					case USB_INT_SUSPI:
+						UDIEN  &= ~(1 << SUSPE);
+						break;
+					case USB_INT_EORSTI:
+						UDIEN  &= ~(1 << EORSTE);
+						break;
+					case USB_INT_SOFI:
+						UDIEN  &= ~(1 << SOFE);
+						break;
+					case USB_INT_RXSTPI:
+						UEIENX &= ~(1 << RXSTPE);
+						break;
+					#endif
+					#if defined(USB_CAN_BE_HOST)
+					case USB_INT_HSOFI:
+						UHIEN  &= ~(1 << HSOFE);
+						break;
+					case USB_INT_DCONNI:
+						UHIEN  &= ~(1 << DCONNE);
+						break;
+					case USB_INT_DDISCI:
+						UHIEN  &= ~(1 << DDISCE);
+						break;
+					case USB_INT_RSTI:
+						UHIEN  &= ~(1 << RSTE);
+						break;
+					case USB_INT_BCERRI:
+						OTGIEN &= ~(1 << BCERRE);
+						break;
+					case USB_INT_VBERRI:
+						OTGIEN &= ~(1 << VBERRE);
+						break;
+					case USB_INT_SRPI:
+						OTGIEN &= ~(1 << SRPE);
+						break;
+					#endif
+					default:
+						break;
+				}
+			}
+
+			static inline void USB_INT_Clear(const uint8_t Interrupt) ATTR_ALWAYS_INLINE;
+			static inline void USB_INT_Clear(const uint8_t Interrupt)
+			{
+				switch (Interrupt)
+				{
+					#if (defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR))
+					case USB_INT_VBUSTI:
+						USBINT &= ~(1 << VBUSTI);
+						break;
+					#endif
+					#if defined(USB_CAN_BE_BOTH)
+					case USB_INT_IDTI:
+						USBINT &= ~(1 << IDTI);
+						break;
+					#endif
+					#if defined(USB_CAN_BE_DEVICE)
+					case USB_INT_WAKEUPI:
+						UDINT  &= ~(1 << WAKEUPI);
+						break;
+					case USB_INT_SUSPI:
+						UDINT  &= ~(1 << SUSPI);
+						break;
+					case USB_INT_EORSTI:
+						UDINT  &= ~(1 << EORSTI);
+						break;
+					case USB_INT_SOFI:
+						UDINT  &= ~(1 << SOFI);
+						break;
+					case USB_INT_RXSTPI:
+						UEINTX &= ~(1 << RXSTPI);
+						break;
+					#endif
+					#if defined(USB_CAN_BE_HOST)
+					case USB_INT_HSOFI:
+						UHINT  &= ~(1 << HSOFI);
+						break;
+					case USB_INT_DCONNI:
+						UHINT  &= ~(1 << DCONNI);
+						break;
+					case USB_INT_DDISCI:
+						UHINT  &= ~(1 << DDISCI);
+						break;
+					case USB_INT_RSTI:
+						UHINT  &= ~(1 << RSTI);
+						break;
+					case USB_INT_BCERRI:
+						OTGINT &= ~(1 << BCERRI);
+						break;
+					case USB_INT_VBERRI:
+						OTGINT &= ~(1 << VBERRI);
+						break;
+					case USB_INT_SRPI:
+						OTGINT &= ~(1 << SRPI);
+						break;
+					#endif
+					default:
+						break;
+				}
+			}
+
+			static inline bool USB_INT_IsEnabled(const uint8_t Interrupt) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT;
+			static inline bool USB_INT_IsEnabled(const uint8_t Interrupt)
+			{
+				switch (Interrupt)
+				{
+					#if (defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR))
+					case USB_INT_VBUSTI:
+						return (USBCON & (1 << VBUSTE));
+					#endif
+					#if defined(USB_CAN_BE_BOTH)
+					case USB_INT_IDTI:
+						return (USBCON & (1 << IDTE));
+					#endif
+					#if defined(USB_CAN_BE_DEVICE)
+					case USB_INT_WAKEUPI:
+						return (UDIEN  & (1 << WAKEUPE));
+					case USB_INT_SUSPI:
+						return (UDIEN  & (1 << SUSPE));
+					case USB_INT_EORSTI:
+						return (UDIEN  & (1 << EORSTE));
+					case USB_INT_SOFI:
+						return (UDIEN  & (1 << SOFE));
+					case USB_INT_RXSTPI:
+						return (UEIENX & (1 << RXSTPE));
+					#endif
+					#if defined(USB_CAN_BE_HOST)
+					case USB_INT_HSOFI:
+						return (UHIEN  & (1 << HSOFE));
+					case USB_INT_DCONNI:
+						return (UHIEN  & (1 << DCONNE));
+					case USB_INT_DDISCI:
+						return (UHIEN  & (1 << DDISCE));
+					case USB_INT_RSTI:
+						return (UHIEN  & (1 << RSTE));
+					case USB_INT_BCERRI:
+						return (OTGIEN & (1 << BCERRE));
+					case USB_INT_VBERRI:
+						return (OTGIEN & (1 << VBERRE));
+					case USB_INT_SRPI:
+						return (OTGIEN & (1 << SRPE));
+					#endif
+					default:
+						return false;
+				}
+			}
+
+			static inline bool USB_INT_HasOccurred(const uint8_t Interrupt) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT;
+			static inline bool USB_INT_HasOccurred(const uint8_t Interrupt)
+			{
+				switch (Interrupt)
+				{
+					#if (defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR))
+					case USB_INT_VBUSTI:
+						return (USBINT & (1 << VBUSTI));
+					#endif
+					#if defined(USB_CAN_BE_BOTH)
+					case USB_INT_IDTI:
+						return (USBINT & (1 << IDTI));
+					#endif
+					#if defined(USB_CAN_BE_DEVICE)
+					case USB_INT_WAKEUPI:
+						return (UDINT  & (1 << WAKEUPI));
+					case USB_INT_SUSPI:
+						return (UDINT  & (1 << SUSPI));
+					case USB_INT_EORSTI:
+						return (UDINT  & (1 << EORSTI));
+					case USB_INT_SOFI:
+						return (UDINT  & (1 << SOFI));
+					case USB_INT_RXSTPI:
+						return (UEINTX & (1 << RXSTPI));
+					#endif
+					#if defined(USB_CAN_BE_HOST)
+					case USB_INT_HSOFI:
+						return (UHINT  & (1 << HSOFI));
+					case USB_INT_DCONNI:
+						return (UHINT  & (1 << DCONNI));
+					case USB_INT_DDISCI:
+						return (UHINT  & (1 << DDISCI));
+					case USB_INT_RSTI:
+						return (UHINT  & (1 << RSTI));
+					case USB_INT_BCERRI:
+						return (OTGINT & (1 << BCERRI));
+					case USB_INT_VBERRI:
+						return (OTGINT & (1 << VBERRI));
+					case USB_INT_SRPI:
+						return (OTGINT & (1 << SRPI));
+					#endif
+					default:
+						return false;
+				}
+			}
+
+		/* Includes: */
+			#include "../USBMode.h"
+			#include "../Events.h"
+			#include "../USBController.h"
+
+		/* Function Prototypes: */
+			void USB_INT_ClearAllInterrupts(void);
+			void USB_INT_DisableAllInterrupts(void);
+	#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Core/ConfigDescriptors.c b/lib/lufa/LUFA/Drivers/USB/Core/ConfigDescriptors.c
new file mode 100644
index 0000000000..d540bcfb4f
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Core/ConfigDescriptors.c
@@ -0,0 +1,146 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+#define  __INCLUDE_FROM_USB_DRIVER
+#include "ConfigDescriptors.h"
+
+#if defined(USB_CAN_BE_HOST)
+uint8_t USB_Host_GetDeviceConfigDescriptor(const uint8_t ConfigNumber,
+                                           uint16_t* const ConfigSizePtr,
+                                           void* const BufferPtr,
+                                           const uint16_t BufferSize)
+{
+	uint8_t ErrorCode;
+	uint8_t ConfigHeader[sizeof(USB_Descriptor_Configuration_Header_t)];
+
+	USB_ControlRequest = (USB_Request_Header_t)
+		{
+			.bmRequestType = (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE),
+			.bRequest      = REQ_GetDescriptor,
+			.wValue        = ((DTYPE_Configuration << 8) | (ConfigNumber - 1)),
+			.wIndex        = 0,
+			.wLength       = sizeof(USB_Descriptor_Configuration_Header_t),
+		};
+
+	Pipe_SelectPipe(PIPE_CONTROLPIPE);
+
+	if ((ErrorCode = USB_Host_SendControlRequest(ConfigHeader)) != HOST_SENDCONTROL_Successful)
+	  return ErrorCode;
+
+	*ConfigSizePtr = le16_to_cpu(DESCRIPTOR_PCAST(ConfigHeader, USB_Descriptor_Configuration_Header_t)->TotalConfigurationSize);
+
+	if (*ConfigSizePtr > BufferSize)
+	  return HOST_GETCONFIG_BuffOverflow;
+
+	USB_ControlRequest.wLength = *ConfigSizePtr;
+
+	if ((ErrorCode = USB_Host_SendControlRequest(BufferPtr)) != HOST_SENDCONTROL_Successful)
+	  return ErrorCode;
+
+	if (DESCRIPTOR_TYPE(BufferPtr) != DTYPE_Configuration)
+	  return HOST_GETCONFIG_InvalidData;
+
+	return HOST_GETCONFIG_Successful;
+}
+#endif
+
+void USB_GetNextDescriptorOfType(uint16_t* const BytesRem,
+                                 void** const CurrConfigLoc,
+                                 const uint8_t Type)
+{
+	while (*BytesRem)
+	{
+		USB_GetNextDescriptor(BytesRem, CurrConfigLoc);
+
+		if (DESCRIPTOR_TYPE(*CurrConfigLoc) == Type)
+		  return;
+	}
+}
+
+void USB_GetNextDescriptorOfTypeBefore(uint16_t* const BytesRem,
+                                       void** const CurrConfigLoc,
+                                       const uint8_t Type,
+                                       const uint8_t BeforeType)
+{
+	while (*BytesRem)
+	{
+		USB_GetNextDescriptor(BytesRem, CurrConfigLoc);
+
+		if (DESCRIPTOR_TYPE(*CurrConfigLoc) == Type)
+		{
+			return;
+		}
+		else if (DESCRIPTOR_TYPE(*CurrConfigLoc) == BeforeType)
+		{
+			*BytesRem = 0;
+			return;
+		}
+	}
+}
+
+void USB_GetNextDescriptorOfTypeAfter(uint16_t* const BytesRem,
+                                      void** const CurrConfigLoc,
+                                      const uint8_t Type,
+                                      const uint8_t AfterType)
+{
+	USB_GetNextDescriptorOfType(BytesRem, CurrConfigLoc, AfterType);
+
+	if (*BytesRem)
+	  USB_GetNextDescriptorOfType(BytesRem, CurrConfigLoc, Type);
+}
+
+uint8_t USB_GetNextDescriptorComp(uint16_t* const BytesRem,
+                                  void** const CurrConfigLoc,
+                                  ConfigComparatorPtr_t const ComparatorRoutine)
+{
+	uint8_t ErrorCode;
+
+	while (*BytesRem)
+	{
+		uint8_t* PrevDescLoc  = *CurrConfigLoc;
+		uint16_t PrevBytesRem = *BytesRem;
+
+		USB_GetNextDescriptor(BytesRem, CurrConfigLoc);
+
+		if ((ErrorCode = ComparatorRoutine(*CurrConfigLoc)) != DESCRIPTOR_SEARCH_NotFound)
+		{
+			if (ErrorCode == DESCRIPTOR_SEARCH_Fail)
+			{
+				*CurrConfigLoc = PrevDescLoc;
+				*BytesRem      = PrevBytesRem;
+			}
+
+			return ErrorCode;
+		}
+	}
+
+	return DESCRIPTOR_SEARCH_COMP_EndOfDescriptor;
+}
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Core/ConfigDescriptors.h b/lib/lufa/LUFA/Drivers/USB/Core/ConfigDescriptors.h
new file mode 100644
index 0000000000..5355ecfe6d
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Core/ConfigDescriptors.h
@@ -0,0 +1,287 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief USB Configuration Descriptor definitions.
+ *  \copydetails Group_ConfigDescriptorParser
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the USB driver
+ *        dispatch header located in LUFA/Drivers/USB/USB.h.
+ */
+
+/** \ingroup Group_StdDescriptors
+ *  \defgroup Group_ConfigDescriptorParser Configuration Descriptor Parser
+ *  \brief USB Configuration Descriptor definitions.
+ *
+ *  This section of the library gives a friendly API which can be used in host applications to easily
+ *  parse an attached device's configuration descriptor so that endpoint, interface and other descriptor
+ *  data can be extracted and used as needed.
+ *
+ *  @{
+ */
+
+#ifndef __CONFIGDESCRIPTORS_H__
+#define __CONFIGDESCRIPTORS_H__
+
+	/* Includes: */
+		#include "../../../Common/Common.h"
+		#include "USBMode.h"
+		#include "HostStandardReq.h"
+		#include "StdDescriptors.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_USB_DRIVER)
+			#error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Casts a pointer to a descriptor inside the configuration descriptor into a pointer to the given
+			 *  descriptor type.
+			 *
+			 *  Usage Example:
+			 *  \code
+			 *  uint8_t* CurrDescriptor = &ConfigDescriptor[0]; // Pointing to the configuration header
+			 *  USB_Descriptor_Configuration_Header_t* ConfigHeaderPtr = DESCRIPTOR_PCAST(CurrDescriptor,
+			 *                                                           USB_Descriptor_Configuration_Header_t);
+			 *
+			 *  // Can now access elements of the configuration header struct using the -> indirection operator
+			 *  \endcode
+			 */
+			#define DESCRIPTOR_PCAST(DescriptorPtr, Type) ((Type*)(DescriptorPtr))
+
+			/** Casts a pointer to a descriptor inside the configuration descriptor into the given descriptor
+			 *  type (as an actual struct instance rather than a pointer to a struct).
+			 *
+			 *  Usage Example:
+			 *  \code
+			 *  uint8_t* CurrDescriptor = &ConfigDescriptor[0]; // Pointing to the configuration header
+			 *  USB_Descriptor_Configuration_Header_t ConfigHeader = DESCRIPTOR_CAST(CurrDescriptor,
+			 *                                                       USB_Descriptor_Configuration_Header_t);
+			 *
+			 *  // Can now access elements of the configuration header struct using the . operator
+			 *  \endcode
+			 */
+			#define DESCRIPTOR_CAST(DescriptorPtr, Type)  (*DESCRIPTOR_PCAST(DescriptorPtr, Type))
+
+			/** Returns the descriptor's type, expressed as the 8-bit type value in the header of the descriptor.
+			 *  This value's meaning depends on the descriptor's placement in the descriptor, but standard type
+			 *  values can be accessed in the \ref USB_DescriptorTypes_t enum.
+			 */
+			#define DESCRIPTOR_TYPE(DescriptorPtr)    DESCRIPTOR_PCAST(DescriptorPtr, USB_Descriptor_Header_t)->Type
+
+			/** Returns the descriptor's size, expressed as the 8-bit value indicating the number of bytes. */
+			#define DESCRIPTOR_SIZE(DescriptorPtr)    DESCRIPTOR_PCAST(DescriptorPtr, USB_Descriptor_Header_t)->Size
+
+		/* Type Defines: */
+			/** Type define for a Configuration Descriptor comparator function (function taking a pointer to an array
+			 *  of type void, returning a uint8_t value).
+			 *
+			 *  \see \ref USB_GetNextDescriptorComp function for more details.
+			 */
+			typedef uint8_t (* ConfigComparatorPtr_t)(void*);
+
+		/* Enums: */
+			/** Enum for the possible return codes of the \ref USB_Host_GetDeviceConfigDescriptor() function. */
+			enum USB_Host_GetConfigDescriptor_ErrorCodes_t
+			{
+				HOST_GETCONFIG_Successful       = 0, /**< No error occurred while retrieving the configuration descriptor. */
+				HOST_GETCONFIG_DeviceDisconnect = 1, /**< The attached device was disconnected while retrieving the configuration
+				                                      *   descriptor.
+				                                      */
+				HOST_GETCONFIG_PipeError        = 2, /**< An error occurred in the pipe while sending the request. */
+				HOST_GETCONFIG_SetupStalled     = 3, /**< The attached device stalled the request to retrieve the configuration
+				                                      *   descriptor.
+				                                      */
+				HOST_GETCONFIG_SoftwareTimeOut  = 4, /**< The request or data transfer timed out. */
+				HOST_GETCONFIG_BuffOverflow     = 5, /**< The device's configuration descriptor is too large to fit into the allocated
+				                                      *   buffer.
+				                                      */
+				HOST_GETCONFIG_InvalidData      = 6, /**< The device returned invalid configuration descriptor data. */
+			};
+
+			/** Enum for return values of a descriptor comparator function. */
+			enum DSearch_Return_ErrorCodes_t
+			{
+				DESCRIPTOR_SEARCH_Found                = 0, /**< Current descriptor matches comparator criteria. */
+				DESCRIPTOR_SEARCH_Fail                 = 1, /**< No further descriptor could possibly match criteria, fail the search. */
+				DESCRIPTOR_SEARCH_NotFound             = 2, /**< Current descriptor does not match comparator criteria. */
+			};
+
+			/** Enum for return values of \ref USB_GetNextDescriptorComp(). */
+			enum DSearch_Comp_Return_ErrorCodes_t
+			{
+				DESCRIPTOR_SEARCH_COMP_Found           = 0, /**< Configuration descriptor now points to descriptor which matches
+				                                             *   search criteria of the given comparator function. */
+				DESCRIPTOR_SEARCH_COMP_Fail            = 1, /**< Comparator function returned \ref DESCRIPTOR_SEARCH_Fail. */
+				DESCRIPTOR_SEARCH_COMP_EndOfDescriptor = 2, /**< End of configuration descriptor reached before match found. */
+			};
+
+		/* Function Prototypes: */
+			/** Retrieves the configuration descriptor data from an attached device via a standard request into a buffer,
+			 *  including validity and size checking to prevent a buffer overflow.
+			 *
+			 *  \param[in]     ConfigNumber   Device configuration descriptor number to fetch from the device (usually set to 1 for
+			 *                                single configuration devices).
+			 *  \param[in,out] ConfigSizePtr  Pointer to a location for storing the retrieved configuration descriptor size.
+			 *  \param[out]    BufferPtr      Pointer to the buffer for storing the configuration descriptor data.
+			 *  \param[out]    BufferSize     Size of the allocated buffer where the configuration descriptor is to be stored.
+			 *
+			 *  \return A value from the \ref USB_Host_GetConfigDescriptor_ErrorCodes_t enum.
+			 */
+			uint8_t USB_Host_GetDeviceConfigDescriptor(const uint8_t ConfigNumber,
+			                                           uint16_t* const ConfigSizePtr,
+			                                           void* const BufferPtr,
+			                                           const uint16_t BufferSize) ATTR_NON_NULL_PTR_ARG(2) ATTR_NON_NULL_PTR_ARG(3);
+
+			/** Skips to the next sub-descriptor inside the configuration descriptor of the specified type value.
+			 *  The bytes remaining value is automatically decremented.
+			 *
+			 * \param[in,out] BytesRem       Pointer to the number of bytes remaining of the configuration descriptor.
+			 * \param[in,out] CurrConfigLoc  Pointer to the current descriptor inside the configuration descriptor.
+			 * \param[in]     Type           Descriptor type value to search for.
+			 */
+			void USB_GetNextDescriptorOfType(uint16_t* const BytesRem,
+			                                 void** const CurrConfigLoc,
+			                                 const uint8_t Type)
+			                                 ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2);
+
+			/** Skips to the next sub-descriptor inside the configuration descriptor of the specified type value,
+			 *  which must come before a descriptor of the second given type value. If the BeforeType type
+			 *  descriptor is reached first, the number of bytes remaining to process is set to zero and the
+			 *  function exits. The bytes remaining value is automatically decremented.
+			 *
+			 * \param[in,out] BytesRem       Pointer to the number of bytes remaining of the configuration descriptor.
+			 * \param[in,out] CurrConfigLoc  Pointer to the current descriptor inside the configuration descriptor.
+			 * \param[in]     Type           Descriptor type value to search for.
+			 * \param[in]     BeforeType     Descriptor type value which must not be reached before the given Type descriptor.
+			 */
+			void USB_GetNextDescriptorOfTypeBefore(uint16_t* const BytesRem,
+			                                       void** const CurrConfigLoc,
+			                                       const uint8_t Type,
+			                                       const uint8_t BeforeType)
+			                                       ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2);
+
+			/** Skips to the next sub-descriptor inside the configuration descriptor of the specified type value,
+			 *  which must come after a descriptor of the second given type value. The bytes remaining value is
+			 *  automatically decremented.
+			 *
+			 * \param[in,out] BytesRem       Pointer to the number of bytes remaining of the configuration descriptor.
+			 * \param[in,out] CurrConfigLoc  Pointer to the current descriptor inside the configuration descriptor.
+			 * \param[in]     Type           Descriptor type value to search for.
+			 * \param[in]     AfterType      Descriptor type value which must be reached before the given Type descriptor.
+			 */
+			void USB_GetNextDescriptorOfTypeAfter(uint16_t* const BytesRem,
+			                                      void** const CurrConfigLoc,
+			                                      const uint8_t Type,
+			                                      const uint8_t AfterType)
+			                                      ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2);
+
+			/** Searches for the next descriptor in the given configuration descriptor using a pre-made comparator
+			 *  function. The routine updates the position and remaining configuration descriptor bytes values
+			 *  automatically. If a comparator routine fails a search, the descriptor pointer is retreated back
+			 *  so that the next descriptor search invocation will start from the descriptor which first caused the
+			 *  original search to fail. This behavior allows for one comparator to be used immediately after another
+			 *  has failed, starting the second search from the descriptor which failed the first.
+			 *
+			 *  Comparator functions should be standard functions which accept a pointer to the header of the current
+			 *  descriptor inside the configuration descriptor which is being compared, and should return a value from
+			 *  the \ref DSearch_Return_ErrorCodes_t enum as a uint8_t value.
+			 *
+			 *  \note This function is available in USB Host mode only.
+			 *
+			 *  \param[in,out] BytesRem           Pointer to an int storing the remaining bytes in the configuration descriptor.
+			 *  \param[in,out] CurrConfigLoc      Pointer to the current position in the configuration descriptor.
+			 *  \param[in]     ComparatorRoutine  Name of the comparator search function to use on the configuration descriptor.
+			 *
+			 *  \return Value of one of the members of the \ref DSearch_Comp_Return_ErrorCodes_t enum.
+			 *
+			 *  Usage Example:
+			 *  \code
+			 *  uint8_t EndpointSearcher(void* CurrentDescriptor); // Comparator Prototype
+			 *
+			 *  uint8_t EndpointSearcher(void* CurrentDescriptor)
+			 *  {
+			 *     if (DESCRIPTOR_TYPE(CurrentDescriptor) == DTYPE_Endpoint)
+			 *         return DESCRIPTOR_SEARCH_Found;
+			 *     else
+			 *         return DESCRIPTOR_SEARCH_NotFound;
+			 *  }
+			 *
+			 *  //...
+			 *
+			 *  // After retrieving configuration descriptor:
+			 *  if (USB_Host_GetNextDescriptorComp(&BytesRemaining, &CurrentConfigLoc, EndpointSearcher) ==
+			 *      Descriptor_Search_Comp_Found)
+			 *  {
+			 *      // Do something with the endpoint descriptor
+			 *  }
+			 *  \endcode
+			 */
+			uint8_t USB_GetNextDescriptorComp(uint16_t* const BytesRem,
+			                                  void** const CurrConfigLoc,
+			                                  ConfigComparatorPtr_t const ComparatorRoutine) ATTR_NON_NULL_PTR_ARG(1)
+			                                  ATTR_NON_NULL_PTR_ARG(2) ATTR_NON_NULL_PTR_ARG(3);
+
+		/* Inline Functions: */
+			/** Skips over the current sub-descriptor inside the configuration descriptor, so that the pointer then
+			    points to the next sub-descriptor. The bytes remaining value is automatically decremented.
+			 *
+			 * \param[in,out] BytesRem       Pointer to the number of bytes remaining of the configuration descriptor.
+			 * \param[in,out] CurrConfigLoc  Pointer to the current descriptor inside the configuration descriptor.
+			 */
+			static inline void USB_GetNextDescriptor(uint16_t* const BytesRem,
+			                                         void** CurrConfigLoc) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2);
+			static inline void USB_GetNextDescriptor(uint16_t* const BytesRem,
+			                                         void** CurrConfigLoc)
+			{
+				uint16_t CurrDescriptorSize = DESCRIPTOR_CAST(*CurrConfigLoc, USB_Descriptor_Header_t).Size;
+
+				if (*BytesRem < CurrDescriptorSize)
+				  CurrDescriptorSize = *BytesRem;
+
+				*CurrConfigLoc  = (void*)((uintptr_t)*CurrConfigLoc + CurrDescriptorSize);
+				*BytesRem      -= CurrDescriptorSize;
+			}
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Core/Device.h b/lib/lufa/LUFA/Drivers/USB/Core/Device.h
new file mode 100644
index 0000000000..81b0e17028
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Core/Device.h
@@ -0,0 +1,159 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Common USB Device definitions for all architectures.
+ *  \copydetails Group_Device
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the USB driver
+ *        dispatch header located in LUFA/Drivers/USB/USB.h.
+ */
+
+/** \ingroup Group_USB
+ *  \defgroup Group_Device Device Management
+ *  \brief USB Device management definitions for USB device mode.
+ *
+ *  USB Device mode related definitions common to all architectures. This module contains definitions which
+ *  are used when the USB controller is initialized in device mode.
+ *
+ *  @{
+ */
+
+#ifndef __USBDEVICE_H__
+#define __USBDEVICE_H__
+
+	/* Includes: */
+		#include "../../../Common/Common.h"
+		#include "USBMode.h"
+		#include "StdDescriptors.h"
+		#include "USBInterrupt.h"
+		#include "Endpoint.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_USB_DRIVER)
+			#error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Enums: */
+			/** Enum for the various states of the USB Device state machine. Only some states are
+			 *  implemented in the LUFA library - other states are left to the user to implement.
+			 *
+			 *  For information on each possible USB device state, refer to the USB 2.0 specification.
+			 *
+			 *  \see \ref USB_DeviceState, which stores the current device state machine state.
+			 */
+			enum USB_Device_States_t
+			{
+				DEVICE_STATE_Unattached                   = 0, /**< Internally implemented by the library. This state indicates
+				                                                *   that the device is not currently connected to a host.
+				                                                */
+				DEVICE_STATE_Powered                      = 1, /**< Internally implemented by the library. This state indicates
+				                                                *   that the device is connected to a host, but enumeration has not
+				                                                *   yet begun.
+				                                                */
+				DEVICE_STATE_Default                      = 2, /**< Internally implemented by the library. This state indicates
+				                                                *   that the device's USB bus has been reset by the host and it is
+				                                                *   now waiting for the host to begin the enumeration process.
+				                                                */
+				DEVICE_STATE_Addressed                    = 3, /**< Internally implemented by the library. This state indicates
+				                                                *   that the device has been addressed by the USB Host, but is not
+				                                                *   yet configured.
+				                                                */
+				DEVICE_STATE_Configured                   = 4, /**< May be implemented by the user project. This state indicates
+				                                                *   that the device has been enumerated by the host and is ready
+				                                                *   for USB communications to begin.
+				                                                */
+				DEVICE_STATE_Suspended                    = 5, /**< May be implemented by the user project. This state indicates
+				                                                *   that the USB bus has been suspended by the host, and the device
+				                                                *   should power down to a minimal power level until the bus is
+				                                                *   resumed.
+				                                                */
+			};
+
+		/* Function Prototypes: */
+			/** Function to retrieve a given descriptor's size and memory location from the given descriptor type value,
+			 *  index and language ID. This function MUST be overridden in the user application (added with full, identical
+			 *  prototype and name so that the library can call it to retrieve descriptor data.
+			 *
+			 *  \param[in] wValue                  The type of the descriptor to retrieve in the upper byte, and the index in the
+			 *                                     lower byte (when more than one descriptor of the given type exists, such as the
+			 *                                     case of string descriptors). The type may be one of the standard types defined
+			 *                                     in the DescriptorTypes_t enum, or may be a class-specific descriptor type value.
+			 *  \param[in] wIndex                  The language ID of the string to return if the \c wValue type indicates
+			 *                                     \ref DTYPE_String, otherwise zero for standard descriptors, or as defined in a
+			 *                                     class-specific standards.
+			 *  \param[out] DescriptorAddress      Pointer to the descriptor in memory. This should be set by the routine to
+			 *                                     the address of the descriptor.
+			 *  \param[out] DescriptorMemorySpace  A value from the \ref USB_DescriptorMemorySpaces_t enum to indicate the memory
+			 *                                     space in which the descriptor is stored. This parameter does not exist when one
+			 *                                     of the \c USE_*_DESCRIPTORS compile time options is used, or on architectures which
+			 *                                     use a unified address space.
+			 *
+			 *  \note By default, the library expects all descriptors to be located in flash memory via the \c PROGMEM attribute.
+			 *        If descriptors should be located in RAM or EEPROM instead (to speed up access in the case of RAM, or to
+			 *        allow the descriptors to be changed dynamically at runtime) either the \c USE_RAM_DESCRIPTORS or the
+			 *        \c USE_EEPROM_DESCRIPTORS tokens may be defined in the project makefile and passed to the compiler by the -D
+			 *        switch.
+			 *
+			 *  \return Size in bytes of the descriptor if it exists, zero or \ref NO_DESCRIPTOR otherwise.
+			 */
+			uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue,
+			                                    const uint16_t wIndex,
+			                                    const void** const DescriptorAddress
+			#if (defined(ARCH_HAS_MULTI_ADDRESS_SPACE) || defined(__DOXYGEN__)) && \
+			    !(defined(USE_FLASH_DESCRIPTORS) || defined(USE_EEPROM_DESCRIPTORS) || defined(USE_RAM_DESCRIPTORS))
+			                                    , uint8_t* const DescriptorMemorySpace
+			#endif
+			                                    ) ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(3);
+
+	/* Architecture Includes: */
+		#if (ARCH == ARCH_AVR8)
+			#include "AVR8/Device_AVR8.h"
+		#elif (ARCH == ARCH_UC3)
+			#include "UC3/Device_UC3.h"
+		#elif (ARCH == ARCH_XMEGA)
+			#include "XMEGA/Device_XMEGA.h"
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Core/DeviceStandardReq.c b/lib/lufa/LUFA/Drivers/USB/Core/DeviceStandardReq.c
new file mode 100644
index 0000000000..feb092dbf7
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Core/DeviceStandardReq.c
@@ -0,0 +1,393 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+#define  __INCLUDE_FROM_USB_DRIVER
+#include "USBMode.h"
+
+#if defined(USB_CAN_BE_DEVICE)
+
+#define  __INCLUDE_FROM_DEVICESTDREQ_C
+#include "DeviceStandardReq.h"
+
+uint8_t USB_Device_ConfigurationNumber;
+
+#if !defined(NO_DEVICE_SELF_POWER)
+bool    USB_Device_CurrentlySelfPowered;
+#endif
+
+#if !defined(NO_DEVICE_REMOTE_WAKEUP)
+bool    USB_Device_RemoteWakeupEnabled;
+#endif
+
+void USB_Device_ProcessControlRequest(void)
+{
+	#if defined(ARCH_BIG_ENDIAN)
+	USB_ControlRequest.bmRequestType = Endpoint_Read_8();
+	USB_ControlRequest.bRequest      = Endpoint_Read_8();
+	USB_ControlRequest.wValue        = Endpoint_Read_16_LE();
+	USB_ControlRequest.wIndex        = Endpoint_Read_16_LE();
+	USB_ControlRequest.wLength       = Endpoint_Read_16_LE();
+	#else
+	uint8_t* RequestHeader = (uint8_t*)&USB_ControlRequest;
+
+	for (uint8_t RequestHeaderByte = 0; RequestHeaderByte < sizeof(USB_Request_Header_t); RequestHeaderByte++)
+	  *(RequestHeader++) = Endpoint_Read_8();
+	#endif
+
+	EVENT_USB_Device_ControlRequest();
+
+	if (Endpoint_IsSETUPReceived())
+	{
+		uint8_t bmRequestType = USB_ControlRequest.bmRequestType;
+
+		switch (USB_ControlRequest.bRequest)
+		{
+			case REQ_GetStatus:
+				if ((bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE)) ||
+					(bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_ENDPOINT)))
+				{
+					USB_Device_GetStatus();
+				}
+
+				break;
+			case REQ_ClearFeature:
+			case REQ_SetFeature:
+				if ((bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE)) ||
+					(bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_ENDPOINT)))
+				{
+					USB_Device_ClearSetFeature();
+				}
+
+				break;
+			case REQ_SetAddress:
+				if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE))
+				  USB_Device_SetAddress();
+
+				break;
+			case REQ_GetDescriptor:
+				if ((bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE)) ||
+					(bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_INTERFACE)))
+				{
+					USB_Device_GetDescriptor();
+				}
+
+				break;
+			case REQ_GetConfiguration:
+				if (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE))
+				  USB_Device_GetConfiguration();
+
+				break;
+			case REQ_SetConfiguration:
+				if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE))
+				  USB_Device_SetConfiguration();
+
+				break;
+
+			default:
+				break;
+		}
+	}
+
+	if (Endpoint_IsSETUPReceived())
+	{
+		Endpoint_ClearSETUP();
+		Endpoint_StallTransaction();
+	}
+}
+
+static void USB_Device_SetAddress(void)
+{
+	uint8_t DeviceAddress = (USB_ControlRequest.wValue & 0x7F);
+
+	USB_Device_SetDeviceAddress(DeviceAddress);
+
+	Endpoint_ClearSETUP();
+
+	Endpoint_ClearStatusStage();
+
+	while (!(Endpoint_IsINReady()));
+
+	USB_Device_EnableDeviceAddress(DeviceAddress);
+
+	USB_DeviceState = (DeviceAddress) ? DEVICE_STATE_Addressed : DEVICE_STATE_Default;
+}
+
+static void USB_Device_SetConfiguration(void)
+{
+	#if defined(FIXED_NUM_CONFIGURATIONS)
+	if ((uint8_t)USB_ControlRequest.wValue > FIXED_NUM_CONFIGURATIONS)
+	  return;
+	#else
+	USB_Descriptor_Device_t* DevDescriptorPtr;
+
+	#if defined(ARCH_HAS_MULTI_ADDRESS_SPACE)
+		#if defined(USE_FLASH_DESCRIPTORS)
+			#define MemoryAddressSpace  MEMSPACE_FLASH
+		#elif defined(USE_EEPROM_DESCRIPTORS)
+			#define MemoryAddressSpace  MEMSPACE_EEPROM
+		#elif defined(USE_RAM_DESCRIPTORS)
+			#define MemoryAddressSpace  MEMSPACE_RAM
+		#else
+			uint8_t MemoryAddressSpace;
+		#endif
+	#endif
+
+	if (CALLBACK_USB_GetDescriptor((DTYPE_Device << 8), 0, (void*)&DevDescriptorPtr
+	#if defined(ARCH_HAS_MULTI_ADDRESS_SPACE) && \
+	    !(defined(USE_FLASH_DESCRIPTORS) || defined(USE_EEPROM_DESCRIPTORS) || defined(USE_RAM_DESCRIPTORS))
+	                               , &MemoryAddressSpace
+	#endif
+	                               ) == NO_DESCRIPTOR)
+	{
+		return;
+	}
+
+	#if defined(ARCH_HAS_MULTI_ADDRESS_SPACE)
+	if (MemoryAddressSpace == MEMSPACE_FLASH)
+	{
+		if (((uint8_t)USB_ControlRequest.wValue > pgm_read_byte(&DevDescriptorPtr->NumberOfConfigurations)))
+		  return;
+	}
+	else if (MemoryAddressSpace == MEMSPACE_EEPROM)
+	{
+		if (((uint8_t)USB_ControlRequest.wValue > eeprom_read_byte(&DevDescriptorPtr->NumberOfConfigurations)))
+		  return;
+	}
+	else
+	{
+		if ((uint8_t)USB_ControlRequest.wValue > DevDescriptorPtr->NumberOfConfigurations)
+		  return;
+	}
+	#else
+	if ((uint8_t)USB_ControlRequest.wValue > DevDescriptorPtr->NumberOfConfigurations)
+	  return;
+	#endif
+	#endif
+
+	Endpoint_ClearSETUP();
+
+	USB_Device_ConfigurationNumber = (uint8_t)USB_ControlRequest.wValue;
+
+	Endpoint_ClearStatusStage();
+
+	if (USB_Device_ConfigurationNumber)
+	  USB_DeviceState = DEVICE_STATE_Configured;
+	else
+	  USB_DeviceState = (USB_Device_IsAddressSet()) ? DEVICE_STATE_Configured : DEVICE_STATE_Powered;
+
+	EVENT_USB_Device_ConfigurationChanged();
+}
+
+static void USB_Device_GetConfiguration(void)
+{
+	Endpoint_ClearSETUP();
+
+	Endpoint_Write_8(USB_Device_ConfigurationNumber);
+	Endpoint_ClearIN();
+
+	Endpoint_ClearStatusStage();
+}
+
+#if !defined(NO_INTERNAL_SERIAL) && (USE_INTERNAL_SERIAL != NO_DESCRIPTOR)
+static void USB_Device_GetInternalSerialDescriptor(void)
+{
+	struct
+	{
+		USB_Descriptor_Header_t Header;
+		uint16_t                UnicodeString[INTERNAL_SERIAL_LENGTH_BITS / 4];
+	} SignatureDescriptor;
+
+	SignatureDescriptor.Header.Type = DTYPE_String;
+	SignatureDescriptor.Header.Size = USB_STRING_LEN(INTERNAL_SERIAL_LENGTH_BITS / 4);
+
+	USB_Device_GetSerialString(SignatureDescriptor.UnicodeString);
+
+	Endpoint_ClearSETUP();
+
+	Endpoint_Write_Control_Stream_LE(&SignatureDescriptor, sizeof(SignatureDescriptor));
+	Endpoint_ClearOUT();
+}
+#endif
+
+static void USB_Device_GetDescriptor(void)
+{
+	const void* DescriptorPointer;
+	uint16_t    DescriptorSize;
+
+	#if defined(ARCH_HAS_MULTI_ADDRESS_SPACE) && \
+	    !(defined(USE_FLASH_DESCRIPTORS) || defined(USE_EEPROM_DESCRIPTORS) || defined(USE_RAM_DESCRIPTORS))
+	uint8_t DescriptorAddressSpace;
+	#endif
+
+	#if !defined(NO_INTERNAL_SERIAL) && (USE_INTERNAL_SERIAL != NO_DESCRIPTOR)
+	if (USB_ControlRequest.wValue == ((DTYPE_String << 8) | USE_INTERNAL_SERIAL))
+	{
+		USB_Device_GetInternalSerialDescriptor();
+		return;
+	}
+	#endif
+
+	if ((DescriptorSize = CALLBACK_USB_GetDescriptor(USB_ControlRequest.wValue, USB_ControlRequest.wIndex,
+	                                                 &DescriptorPointer
+	#if defined(ARCH_HAS_MULTI_ADDRESS_SPACE) && \
+	    !(defined(USE_FLASH_DESCRIPTORS) || defined(USE_EEPROM_DESCRIPTORS) || defined(USE_RAM_DESCRIPTORS))
+	                                                 , &DescriptorAddressSpace
+	#endif
+													 )) == NO_DESCRIPTOR)
+	{
+		return;
+	}
+
+	Endpoint_ClearSETUP();
+
+	#if defined(USE_RAM_DESCRIPTORS) || !defined(ARCH_HAS_MULTI_ADDRESS_SPACE)
+	Endpoint_Write_Control_Stream_LE(DescriptorPointer, DescriptorSize);
+	#elif defined(USE_EEPROM_DESCRIPTORS)
+	Endpoint_Write_Control_EStream_LE(DescriptorPointer, DescriptorSize);
+	#elif defined(USE_FLASH_DESCRIPTORS)
+	Endpoint_Write_Control_PStream_LE(DescriptorPointer, DescriptorSize);
+	#else
+	if (DescriptorAddressSpace == MEMSPACE_FLASH)
+	  Endpoint_Write_Control_PStream_LE(DescriptorPointer, DescriptorSize);
+	else if (DescriptorAddressSpace == MEMSPACE_EEPROM)
+	  Endpoint_Write_Control_EStream_LE(DescriptorPointer, DescriptorSize);
+	else
+	  Endpoint_Write_Control_Stream_LE(DescriptorPointer, DescriptorSize);
+	#endif
+
+	Endpoint_ClearOUT();
+}
+
+static void USB_Device_GetStatus(void)
+{
+	uint8_t CurrentStatus = 0;
+
+	switch (USB_ControlRequest.bmRequestType)
+	{
+		case (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE):
+		{
+			#if !defined(NO_DEVICE_SELF_POWER)
+			if (USB_Device_CurrentlySelfPowered)
+			  CurrentStatus |= FEATURE_SELFPOWERED_ENABLED;
+			#endif
+
+			#if !defined(NO_DEVICE_REMOTE_WAKEUP)
+			if (USB_Device_RemoteWakeupEnabled)
+			  CurrentStatus |= FEATURE_REMOTE_WAKEUP_ENABLED;
+			#endif
+			break;
+		}
+		case (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_ENDPOINT):
+		{
+			#if !defined(CONTROL_ONLY_DEVICE)
+			uint8_t EndpointIndex = ((uint8_t)USB_ControlRequest.wIndex & ENDPOINT_EPNUM_MASK);
+
+			if (EndpointIndex >= ENDPOINT_TOTAL_ENDPOINTS)
+				return;
+
+			Endpoint_SelectEndpoint(EndpointIndex);
+
+			CurrentStatus = Endpoint_IsStalled();
+
+			Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP);
+			#endif
+
+			break;
+		}
+		default:
+			return;
+	}
+
+	Endpoint_ClearSETUP();
+
+	Endpoint_Write_16_LE(CurrentStatus);
+	Endpoint_ClearIN();
+
+	Endpoint_ClearStatusStage();
+}
+
+static void USB_Device_ClearSetFeature(void)
+{
+	switch (USB_ControlRequest.bmRequestType & CONTROL_REQTYPE_RECIPIENT)
+	{
+		#if !defined(NO_DEVICE_REMOTE_WAKEUP)
+		case REQREC_DEVICE:
+		{
+			if ((uint8_t)USB_ControlRequest.wValue == FEATURE_SEL_DeviceRemoteWakeup)
+			  USB_Device_RemoteWakeupEnabled = (USB_ControlRequest.bRequest == REQ_SetFeature);
+			else
+			  return;
+
+			break;
+		}
+		#endif
+		#if !defined(CONTROL_ONLY_DEVICE)
+		case REQREC_ENDPOINT:
+		{
+			if ((uint8_t)USB_ControlRequest.wValue == FEATURE_SEL_EndpointHalt)
+			{
+				uint8_t EndpointIndex = ((uint8_t)USB_ControlRequest.wIndex & ENDPOINT_EPNUM_MASK);
+
+				if (EndpointIndex == ENDPOINT_CONTROLEP || EndpointIndex >= ENDPOINT_TOTAL_ENDPOINTS)
+				  return;
+
+				Endpoint_SelectEndpoint(EndpointIndex);
+
+				if (Endpoint_IsEnabled())
+				{
+					if (USB_ControlRequest.bRequest == REQ_SetFeature)
+					{
+						Endpoint_StallTransaction();
+					}
+					else
+					{
+						Endpoint_ClearStall();
+						Endpoint_ResetEndpoint(EndpointIndex);
+						Endpoint_ResetDataToggle();
+					}
+				}
+			}
+
+			break;
+		}
+		#endif
+		default:
+			return;
+	}
+
+	Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP);
+
+	Endpoint_ClearSETUP();
+
+	Endpoint_ClearStatusStage();
+}
+
+#endif
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Core/DeviceStandardReq.h b/lib/lufa/LUFA/Drivers/USB/Core/DeviceStandardReq.h
new file mode 100644
index 0000000000..14badcda1f
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Core/DeviceStandardReq.h
@@ -0,0 +1,158 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief USB device standard request management.
+ *
+ *  This file contains the function prototypes necessary for the processing of incoming standard control requests
+ *  when the library is in USB device mode.
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the USB driver
+ *        dispatch header located in LUFA/Drivers/USB/USB.h.
+ */
+
+#ifndef __DEVICESTDREQ_H__
+#define __DEVICESTDREQ_H__
+
+	/* Includes: */
+		#include "../../../Common/Common.h"
+		#include "USBMode.h"
+		#include "StdDescriptors.h"
+		#include "Events.h"
+		#include "StdRequestType.h"
+		#include "USBTask.h"
+		#include "USBController.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_USB_DRIVER)
+			#error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Enums: */
+			#if defined(ARCH_HAS_MULTI_ADDRESS_SPACE) || defined(__DOXYGEN__)
+				/** Enum for the possible descriptor memory spaces, for the \c MemoryAddressSpace parameter of the
+				 *  \ref CALLBACK_USB_GetDescriptor() function. This can be used when none of the \c USE_*_DESCRIPTORS
+				 *  compile time options are used, to indicate in which memory space the descriptor is stored.
+				 *
+				 *  \ingroup Group_Device
+				 */
+				enum USB_DescriptorMemorySpaces_t
+				{
+					#if defined(ARCH_HAS_FLASH_ADDRESS_SPACE) || defined(__DOXYGEN__)
+					MEMSPACE_FLASH    = 0, /**< Indicates the requested descriptor is located in FLASH memory. */
+					#endif
+					#if defined(ARCH_HAS_EEPROM_ADDRESS_SPACE) || defined(__DOXYGEN__)
+					MEMSPACE_EEPROM   = 1, /**< Indicates the requested descriptor is located in EEPROM memory. */
+					#endif
+					MEMSPACE_RAM      = 2, /**< Indicates the requested descriptor is located in RAM memory. */
+				};
+			#endif
+
+		/* Global Variables: */
+			/** Indicates the currently set configuration number of the device. USB devices may have several
+			 *  different configurations which the host can select between; this indicates the currently selected
+			 *  value, or 0 if no configuration has been selected.
+			 *
+			 *  \attention This variable should be treated as read-only in the user application, and never manually
+			 *             changed in value.
+			 *
+			 *  \ingroup Group_Device
+			 */
+			extern uint8_t USB_Device_ConfigurationNumber;
+
+			#if !defined(NO_DEVICE_REMOTE_WAKEUP)
+				/** Indicates if the host is currently allowing the device to issue remote wakeup events. If this
+				 *  flag is cleared, the device should not issue remote wakeup events to the host.
+				 *
+				 *  \attention This variable should be treated as read-only in the user application, and never manually
+				 *             changed in value.
+				 *
+				 *  \note To reduce FLASH usage of the compiled applications where Remote Wakeup is not supported,
+				 *        this global and the underlying management code can be disabled by defining the
+				 *        \c NO_DEVICE_REMOTE_WAKEUP token in the project makefile and passing it to the compiler via
+				 *        the -D switch.
+				 *
+				 *  \ingroup Group_Device
+				 */
+				extern bool USB_Device_RemoteWakeupEnabled;
+			#endif
+
+			#if !defined(NO_DEVICE_SELF_POWER)
+				/** Indicates if the device is currently being powered by its own power supply, rather than being
+				 *  powered by the host's USB supply. This flag should remain cleared if the device does not
+				 *  support self powered mode, as indicated in the device descriptors.
+				 *
+				 *  \ingroup Group_Device
+				 */
+				extern bool USB_Device_CurrentlySelfPowered;
+			#endif
+
+	/* Private Interface - For use in library only: */
+	#if !defined(__DOXYGEN__)
+		#if defined(USE_RAM_DESCRIPTORS) && defined(USE_EEPROM_DESCRIPTORS)
+			#error USE_RAM_DESCRIPTORS and USE_EEPROM_DESCRIPTORS are mutually exclusive.
+		#elif defined(USE_RAM_DESCRIPTORS) && defined(USE_FLASH_DESCRIPTORS)
+			#error USE_RAM_DESCRIPTORS and USE_FLASH_DESCRIPTORS are mutually exclusive.
+		#elif defined(USE_FLASH_DESCRIPTORS) && defined(USE_EEPROM_DESCRIPTORS)
+			#error USE_FLASH_DESCRIPTORS and USE_EEPROM_DESCRIPTORS are mutually exclusive.
+		#elif defined(USE_FLASH_DESCRIPTORS) && defined(USE_EEPROM_DESCRIPTORS) && defined(USE_RAM_DESCRIPTORS)
+			#error Only one of the USE_*_DESCRIPTORS modes should be selected.
+		#endif
+
+		/* Function Prototypes: */
+			void USB_Device_ProcessControlRequest(void);
+
+			#if defined(__INCLUDE_FROM_DEVICESTDREQ_C)
+				static void USB_Device_SetAddress(void);
+				static void USB_Device_SetConfiguration(void);
+				static void USB_Device_GetConfiguration(void);
+				static void USB_Device_GetDescriptor(void);
+				static void USB_Device_GetStatus(void);
+				static void USB_Device_ClearSetFeature(void);
+
+				#if !defined(NO_INTERNAL_SERIAL) && (USE_INTERNAL_SERIAL != NO_DESCRIPTOR)
+					static void USB_Device_GetInternalSerialDescriptor(void);
+				#endif
+			#endif
+	#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Core/Endpoint.h b/lib/lufa/LUFA/Drivers/USB/Core/Endpoint.h
new file mode 100644
index 0000000000..b577f63476
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Core/Endpoint.h
@@ -0,0 +1,130 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief USB Endpoint definitions for all architectures.
+ *  \copydetails Group_EndpointManagement
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the USB driver
+ *        dispatch header located in LUFA/Drivers/USB/USB.h.
+ */
+
+/** \ingroup Group_EndpointManagement
+ *  \defgroup Group_EndpointRW Endpoint Data Reading and Writing
+ *  \brief Endpoint data read/write definitions.
+ *
+ *  Functions, macros, variables, enums and types related to data reading and writing from and to endpoints.
+ */
+
+/** \ingroup Group_EndpointRW
+ *  \defgroup Group_EndpointPrimitiveRW Read/Write of Primitive Data Types
+ *  \brief Endpoint data primitive read/write definitions.
+ *
+ *  Functions, macros, variables, enums and types related to data reading and writing of primitive data types
+ *  from and to endpoints.
+ */
+
+/** \ingroup Group_EndpointManagement
+ *  \defgroup Group_EndpointPacketManagement Endpoint Packet Management
+ *  \brief USB Endpoint package management definitions.
+ *
+ *  Functions, macros, variables, enums and types related to packet management of endpoints.
+ */
+
+/** \ingroup Group_USB
+ *  \defgroup Group_EndpointManagement Endpoint Management
+ *  \brief Endpoint management definitions.
+ *
+ *  Functions, macros and enums related to endpoint management when in USB Device mode. This
+ *  module contains the endpoint management macros, as well as endpoint interrupt and data
+ *  send/receive functions for various data types.
+ *
+ *  @{
+ */
+
+#ifndef __ENDPOINT_H__
+#define __ENDPOINT_H__
+
+	/* Includes: */
+		#include "../../../Common/Common.h"
+		#include "USBMode.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_USB_DRIVER)
+			#error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Type Defines: */
+			/** Type define for a endpoint table entry, used to configure endpoints in groups via
+			 *  \ref Endpoint_ConfigureEndpointTable().
+			 */
+			typedef struct
+			{
+				uint8_t  Address; /**< Address of the endpoint to configure, or zero if the table entry is to be unused. */
+				uint16_t Size; /**< Size of the endpoint bank, in bytes. */
+				uint8_t  Type; /**< Type of the endpoint, a \c EP_TYPE_* mask. */
+				uint8_t  Banks; /**< Number of hardware banks to use for the endpoint. */
+			} USB_Endpoint_Table_t;
+
+		/* Macros: */
+			/** Endpoint number mask, for masking against endpoint addresses to retrieve the endpoint's
+			 *  numerical address in the device.
+			 */
+			#define ENDPOINT_EPNUM_MASK                     0x0F
+
+			/** Endpoint address for the default control endpoint, which always resides in address 0. This is
+			 *  defined for convenience to give more readable code when used with the endpoint macros.
+			 */
+			#define ENDPOINT_CONTROLEP                      0
+
+	/* Architecture Includes: */
+		#if (ARCH == ARCH_AVR8)
+			#include "AVR8/Endpoint_AVR8.h"
+		#elif (ARCH == ARCH_UC3)
+			#include "UC3/Endpoint_UC3.h"
+		#elif (ARCH == ARCH_XMEGA)
+			#include "XMEGA/Endpoint_XMEGA.h"
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Core/EndpointStream.h b/lib/lufa/LUFA/Drivers/USB/Core/EndpointStream.h
new file mode 100644
index 0000000000..156d155b3d
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Core/EndpointStream.h
@@ -0,0 +1,124 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Endpoint data stream transmission and reception management.
+ *  \copydetails Group_EndpointStreamRW
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the USB driver
+ *        dispatch header located in LUFA/Drivers/USB/USB.h.
+ */
+
+/** \ingroup Group_EndpointRW
+ *  \defgroup Group_EndpointStreamRW Read/Write of Multi-Byte Streams
+ *  \brief Endpoint data stream transmission and reception management.
+ *
+ *  Functions, macros, variables, enums and types related to data reading and writing of data streams from
+ *  and to endpoints.
+ *
+ *  @{
+ */
+
+#ifndef __ENDPOINT_STREAM_H__
+#define __ENDPOINT_STREAM_H__
+
+	/* Includes: */
+		#include "../../../Common/Common.h"
+		#include "USBMode.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_USB_DRIVER)
+			#error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Enums: */
+			/** Enum for the possible error return codes of the \c Endpoint_*_Stream_* functions. */
+			enum Endpoint_Stream_RW_ErrorCodes_t
+			{
+				ENDPOINT_RWSTREAM_NoError            = 0, /**< Command completed successfully, no error. */
+				ENDPOINT_RWSTREAM_EndpointStalled    = 1, /**< The endpoint was stalled during the stream
+				                                           *   transfer by the host or device.
+				                                           */
+				ENDPOINT_RWSTREAM_DeviceDisconnected = 2, /**< Device was disconnected from the host during
+				                                           *   the transfer.
+				                                           */
+				ENDPOINT_RWSTREAM_BusSuspended       = 3, /**< The USB bus has been suspended by the host and
+				                                           *   no USB endpoint traffic can occur until the bus
+				                                           *   has resumed.
+				                                           */
+				ENDPOINT_RWSTREAM_Timeout            = 4, /**< The host failed to accept or send the next packet
+				                                           *   within the software timeout period set by the
+				                                           *   \ref USB_STREAM_TIMEOUT_MS macro.
+				                                           */
+				ENDPOINT_RWSTREAM_IncompleteTransfer = 5, /**< Indicates that the endpoint bank became full or empty before
+				                                           *   the complete contents of the current stream could be
+				                                           *   transferred. The endpoint stream function should be called
+				                                           *   again to process the next chunk of data in the transfer.
+				                                           */
+			};
+
+			/** Enum for the possible error return codes of the \c Endpoint_*_Control_Stream_* functions. */
+			enum Endpoint_ControlStream_RW_ErrorCodes_t
+			{
+				ENDPOINT_RWCSTREAM_NoError            = 0, /**< Command completed successfully, no error. */
+				ENDPOINT_RWCSTREAM_HostAborted        = 1, /**< The aborted the transfer prematurely. */
+				ENDPOINT_RWCSTREAM_DeviceDisconnected = 2, /**< Device was disconnected from the host during
+				                                            *   the transfer.
+				                                            */
+				ENDPOINT_RWCSTREAM_BusSuspended       = 3, /**< The USB bus has been suspended by the host and
+				                                            *   no USB endpoint traffic can occur until the bus
+				                                            *   has resumed.
+				                                            */
+			};
+
+	/* Architecture Includes: */
+		#if (ARCH == ARCH_AVR8)
+			#include "AVR8/EndpointStream_AVR8.h"
+		#elif (ARCH == ARCH_UC3)
+			#include "UC3/EndpointStream_UC3.h"
+		#elif (ARCH == ARCH_XMEGA)
+			#include "XMEGA/EndpointStream_XMEGA.h"
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Core/Events.c b/lib/lufa/LUFA/Drivers/USB/Core/Events.c
new file mode 100644
index 0000000000..186557956a
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Core/Events.c
@@ -0,0 +1,39 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+#define  __INCLUDE_FROM_EVENTS_C
+#define  __INCLUDE_FROM_USB_DRIVER
+#include "Events.h"
+
+void USB_Event_Stub(void)
+{
+
+}
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Core/Events.h b/lib/lufa/LUFA/Drivers/USB/Core/Events.h
new file mode 100644
index 0000000000..57fd0d9af7
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Core/Events.h
@@ -0,0 +1,372 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief USB Event management definitions.
+ *  \copydetails Group_Events
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the USB driver
+ *        dispatch header located in LUFA/Drivers/USB/USB.h.
+ */
+
+/** \ingroup Group_USB
+ *  \defgroup Group_Events USB Events
+ *  \brief USB Event management definitions.
+ *
+ *  This module contains macros and functions relating to the management of library events, which are small
+ *  pieces of code similar to ISRs which are run when a given condition is met. Each event can be fired from
+ *  multiple places in the user or library code, which may or may not be inside an ISR, thus each handler
+ *  should be written to be as small and fast as possible to prevent possible problems.
+ *
+ *  Events can be hooked by the user application by declaring a handler function with the same name and parameters
+ *  listed here. If an event with no user-associated handler is fired within the library, it by default maps to an
+ *  internal empty stub function.
+ *
+ *  Each event must only have one associated event handler, but can be raised by multiple sources by calling the
+ *  event handler function (with any required event parameters).
+ *
+ *  @{
+ */
+
+#ifndef __USBEVENTS_H__
+#define __USBEVENTS_H__
+
+	/* Includes: */
+		#include "../../../Common/Common.h"
+		#include "USBMode.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_USB_DRIVER)
+			#error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Pseudo-Functions for Doxygen: */
+		#if !defined(__INCLUDE_FROM_EVENTS_C) || defined(__DOXYGEN__)
+			/** Event for USB mode pin level change. This event fires when the USB interface is set to dual role
+			 *  mode, and the UID pin level has changed to indicate a new mode (device or host). This event fires
+			 *  before the mode is switched to the newly indicated mode but after the \ref EVENT_USB_Device_Disconnect
+			 *  event has fired (if disconnected before the role change).
+			 *
+			 *  \note This event only exists on microcontrollers that support dual role USB modes.
+			 *        \n\n
+			 *
+			 *  \note This event does not exist if the \c USB_DEVICE_ONLY or \c USB_HOST_ONLY tokens have been supplied
+			 *        to the compiler (see \ref Group_USBManagement documentation).
+			 */
+			void EVENT_USB_UIDChange(void);
+
+			/** Event for USB host error. This event fires when a hardware fault has occurred whilst the USB
+			 *  interface is in host mode.
+			 *
+			 *  \param[in] ErrorCode  Error code indicating the failure reason, a value in \ref USB_Host_ErrorCodes_t.
+			 *
+			 *  \note This event only exists on microcontrollers that supports USB host mode.
+			 *        \n\n
+			 *
+			 *  \note This event does not exist if the \c USB_DEVICE_ONLY token is supplied to the compiler (see
+			 *        \ref Group_USBManagement documentation).
+			 */
+			void EVENT_USB_Host_HostError(const uint8_t ErrorCode);
+
+			/** Event for USB device attachment. This event fires when a the USB interface is in host mode, and
+			 *  a USB device has been connected to the USB interface. This is interrupt driven, thus fires before
+			 *  the standard \ref EVENT_USB_Device_Connect() event and so can be used to programmatically start the USB
+			 *  management task to reduce CPU consumption.
+			 *
+			 *  \note This event only exists on microcontrollers that supports USB host mode.
+			 *        \n\n
+			 *
+			 *  \note This event does not exist if the \c USB_DEVICE_ONLY token is supplied to the compiler (see
+			 *        \ref Group_USBManagement documentation).
+			 *
+			 *  \see \ref USB_USBTask() for more information on the USB management task and reducing CPU usage.
+			 */
+			void EVENT_USB_Host_DeviceAttached(void);
+
+			/** Event for USB device removal. This event fires when a the USB interface is in host mode, and
+			 *  a USB device has been removed the USB interface whether or not it has been enumerated. This
+			 *  can be used to programmatically stop the USB management task to reduce CPU consumption.
+			 *
+			 *  \note This event only exists on microcontrollers that supports USB host mode.
+			 *        \n\n
+			 *
+			 *  \note This event does not exist if the \c USB_DEVICE_ONLY token is supplied to the compiler (see
+			 *        \ref Group_USBManagement documentation).
+			 *
+			 *  \see \ref USB_USBTask() for more information on the USB management task and reducing CPU usage.
+			 */
+			void EVENT_USB_Host_DeviceUnattached(void);
+
+			/** Event for USB device enumeration failure. This event fires when a the USB interface is
+			 *  in host mode, and an attached USB device has failed to enumerate completely.
+			 *
+			 *  \param[in] ErrorCode     Error code indicating the failure reason, a value in
+			 *                           \ref USB_Host_EnumerationErrorCodes_t.
+			 *
+			 *  \param[in] SubErrorCode  Sub error code indicating the reason for failure - for example, if the
+			 *                           ErrorCode parameter indicates a control error, this will give the error
+			 *                           code returned by the \ref USB_Host_SendControlRequest() function.
+			 *
+			 *  \note This event only exists on microcontrollers that supports USB host mode.
+			 *        \n\n
+			 *
+			 *  \note This event does not exist if the \c USB_DEVICE_ONLY token is supplied to the compiler (see
+			 *        \ref Group_USBManagement documentation).
+			 */
+			void EVENT_USB_Host_DeviceEnumerationFailed(const uint8_t ErrorCode,
+			                                            const uint8_t SubErrorCode);
+
+			/** Event for USB device enumeration completion. This event fires when a the USB interface is
+			 *  in host mode and an attached USB device has been completely enumerated and is ready to be
+			 *  controlled by the user application.
+			 *
+			 *  This event is time-critical; exceeding OS-specific delays within this event handler (typically of around
+			 *  1 second) when a transaction is waiting to be processed by the device will prevent break communications
+			 *  and cause the host to reset the USB bus.
+			 *
+			 *  \note This event only exists on microcontrollers that supports USB host mode.
+			 *        \n\n
+			 *
+			 *  \note This event does not exist if the \c USB_DEVICE_ONLY token is supplied to the compiler (see
+			 *        \ref Group_USBManagement documentation).
+			 */
+			void EVENT_USB_Host_DeviceEnumerationComplete(void);
+
+			/** Event for USB Start Of Frame detection, when enabled. This event fires at the start of each USB
+			 *  frame, once per millisecond, and is synchronized to the USB bus. This can be used as an accurate
+			 *  millisecond timer source when the USB bus is not suspended while in host mode.
+			 *
+			 *  This event is time-critical; it is run once per millisecond and thus long handlers will significantly
+			 *  degrade device performance. This event should only be enabled when needed to reduce device wake-ups.
+			 *
+			 *  \note This event is not normally active - it must be manually enabled and disabled via the
+			 *        \ref USB_Host_EnableSOFEvents() and \ref USB_Host_DisableSOFEvents() commands after enumeration of
+			 *        a USB device.
+			 *        \n\n
+			 *
+			 *  \note This event does not exist if the \c USB_DEVICE_ONLY token is supplied to the compiler (see
+			 *        \ref Group_USBManagement documentation).
+			 */
+			void EVENT_USB_Host_StartOfFrame(void);
+
+			/** Event for USB device connection. This event fires when the microcontroller is in USB Device mode
+			 *  and the device is connected to a USB host, beginning the enumeration process measured by a rising
+			 *  level on the microcontroller's VBUS sense pin.
+			 *
+			 *  This event is time-critical; exceeding OS-specific delays within this event handler (typically of around
+			 *  two seconds) will prevent the device from enumerating correctly.
+			 *
+			 *  \attention This event may fire multiple times during device enumeration on the microcontrollers with limited USB controllers
+			 *             if \c NO_LIMITED_CONTROLLER_CONNECT is not defined.
+			 *
+			 *  \note For the microcontrollers with limited USB controller functionality, VBUS sensing is not available.
+			 *        this means that the current connection state is derived from the bus suspension and wake up events by default,
+			 *        which is not always accurate (host may suspend the bus while still connected). If the actual connection state
+			 *        needs to be determined, VBUS should be routed to an external pin, and the auto-detect behavior turned off by
+			 *        passing the \c NO_LIMITED_CONTROLLER_CONNECT token to the compiler via the -D switch at compile time. The connection
+			 *        and disconnection events may be manually fired, and the \ref USB_DeviceState global changed manually.
+			 *        \n\n
+			 *
+			 *  \see \ref Group_USBManagement for more information on the USB management task and reducing CPU usage.
+			 */
+			void EVENT_USB_Device_Connect(void);
+
+			/** Event for USB device disconnection. This event fires when the microcontroller is in USB Device mode and the device is
+			 *  disconnected from a host, measured by a falling level on the microcontroller's VBUS sense pin.
+			 *
+			 *  \attention This event may fire multiple times during device enumeration on the microcontrollers with limited USB controllers
+			 *             if \c NO_LIMITED_CONTROLLER_CONNECT is not defined.
+			 *
+			 *  \note For the microcontrollers with limited USB controllers, VBUS sense is not available to the USB controller.
+			 *        this means that the current connection state is derived from the bus suspension and wake up events by default,
+			 *        which is not always accurate (host may suspend the bus while still connected). If the actual connection state
+			 *        needs to be determined, VBUS should be routed to an external pin, and the auto-detect behavior turned off by
+			 *        passing the \c NO_LIMITED_CONTROLLER_CONNECT token to the compiler via the -D switch at compile time. The connection
+			 *        and disconnection events may be manually fired, and the \ref USB_DeviceState global changed manually.
+			 *        \n\n
+			 *
+			 *  \see \ref Group_USBManagement for more information on the USB management task and reducing CPU usage.
+			 */
+			void EVENT_USB_Device_Disconnect(void);
+
+			/** Event for control requests. This event fires when a the USB host issues a control request
+			 *  to the mandatory device control endpoint (of address 0). This may either be a standard
+			 *  request that the library may have a handler code for internally, or a class specific request
+			 *  issued to the device which must be handled appropriately. If a request is not processed in the
+			 *  user application via this event, it will be passed to the library for processing internally
+			 *  if a suitable handler exists.
+			 *
+			 *  This event is time-critical; each packet within the request transaction must be acknowledged or
+			 *  sent within 50ms or the host will abort the transfer.
+			 *
+			 *  The library internally handles all standard control requests with the exceptions of SYNC FRAME,
+			 *  SET DESCRIPTOR and SET INTERFACE. These and all other non-standard control requests will be left
+			 *  for the user to process via this event if desired. If not handled in the user application or by
+			 *  the library internally, unknown requests are automatically STALLed.
+			 *
+			 *  \note This event does not exist if the \c USB_HOST_ONLY token is supplied to the compiler (see
+			 *        \ref Group_USBManagement documentation).
+			 *        \n\n
+			 *
+			 *  \note Requests should be handled in the same manner as described in the USB 2.0 Specification,
+			 *        or appropriate class specification. In all instances, the library has already read the
+			 *        request SETUP parameters into the \ref USB_ControlRequest structure which should then be used
+			 *        by the application to determine how to handle the issued request.
+			 */
+			void EVENT_USB_Device_ControlRequest(void);
+
+			/** Event for USB configuration number changed. This event fires when a the USB host changes the
+			 *  selected configuration number while in device mode. This event should be hooked in device
+			 *  applications to create the endpoints and configure the device for the selected configuration.
+			 *
+			 *  This event is time-critical; exceeding OS-specific delays within this event handler (typically of around
+			 *  one second) will prevent the device from enumerating correctly.
+			 *
+			 *  This event fires after the value of \ref USB_Device_ConfigurationNumber has been changed.
+			 *
+			 *  \note This event does not exist if the \c USB_HOST_ONLY token is supplied to the compiler (see
+			 *        \ref Group_USBManagement documentation).
+			 */
+			void EVENT_USB_Device_ConfigurationChanged(void);
+
+			/** Event for USB suspend. This event fires when a the USB host suspends the device by halting its
+			 *  transmission of Start Of Frame pulses to the device. This is generally hooked in order to move
+			 *  the device over to a low power state until the host wakes up the device. If the USB interface is
+			 *  enumerated with the \ref USB_OPT_AUTO_PLL option set, the library will automatically suspend the
+			 *  USB PLL before the event is fired to save power.
+			 *
+			 *  \note This event does not exist if the \c USB_HOST_ONLY token is supplied to the compiler (see
+			 *        \ref Group_USBManagement documentation).
+			 *        \n\n
+			 *
+			 *  \note This event does not exist on the microcontrollers with limited USB VBUS sensing abilities
+			 *        when the \c NO_LIMITED_CONTROLLER_CONNECT compile time token is not set - see
+			 *        \ref EVENT_USB_Device_Disconnect.
+			 *
+			 *  \see \ref EVENT_USB_Device_WakeUp() event for accompanying Wake Up event.
+			 */
+			void EVENT_USB_Device_Suspend(void);
+
+			/** Event for USB wake up. This event fires when a the USB interface is suspended while in device
+			 *  mode, and the host wakes up the device by supplying Start Of Frame pulses. This is generally
+			 *  hooked to pull the user application out of a low power state and back into normal operating
+			 *  mode. If the USB interface is enumerated with the \ref USB_OPT_AUTO_PLL option set, the library
+			 *  will automatically restart the USB PLL before the event is fired.
+			 *
+			 *  \note This event does not exist if the \c USB_HOST_ONLY token is supplied to the compiler (see
+			 *        \ref Group_USBManagement documentation).
+			 *        \n\n
+			 *
+			 *  \note This event does not exist on the microcontrollers with limited USB VBUS sensing abilities
+			 *        when the \c NO_LIMITED_CONTROLLER_CONNECT compile time token is not set - see
+			 *        \ref EVENT_USB_Device_Disconnect.
+			 *
+			 *  \see \ref EVENT_USB_Device_Suspend() event for accompanying Suspend event.
+			 */
+			void EVENT_USB_Device_WakeUp(void);
+
+			/** Event for USB interface reset. This event fires when the USB interface is in device mode, and
+			 *  a the USB host requests that the device reset its interface. This event fires after the control
+			 *  endpoint has been automatically configured by the library.
+			 *
+			 *  This event is time-critical; exceeding OS-specific delays within this event handler (typically of around
+			 *  two seconds) will prevent the device from enumerating correctly.
+			 *
+			 *  \note This event does not exist if the \c USB_HOST_ONLY token is supplied to the compiler (see
+			 *        \ref Group_USBManagement documentation).
+			 */
+			void EVENT_USB_Device_Reset(void);
+
+			/** Event for USB Start Of Frame detection, when enabled. This event fires at the start of each USB
+			 *  frame, once per millisecond, and is synchronized to the USB bus. This can be used as an accurate
+			 *  millisecond timer source when the USB bus is enumerated in device mode to a USB host.
+			 *
+			 *  This event is time-critical; it is run once per millisecond and thus long handlers will significantly
+			 *  degrade device performance. This event should only be enabled when needed to reduce device wake-ups.
+			 *
+			 *  \pre This event is not normally active - it must be manually enabled and disabled via the
+			 *       \ref USB_Device_EnableSOFEvents() and \ref USB_Device_DisableSOFEvents() commands after enumeration.
+			 *       \n\n
+			 *
+			 *  \note This event does not exist if the \c USB_HOST_ONLY token is supplied to the compiler (see
+			 *        \ref Group_USBManagement documentation).
+			 */
+			void EVENT_USB_Device_StartOfFrame(void);
+		#endif
+
+	/* Private Interface - For use in library only: */
+	#if !defined(__DOXYGEN__)
+		/* Function Prototypes: */
+			#if defined(__INCLUDE_FROM_EVENTS_C)
+				void USB_Event_Stub(void) ATTR_CONST;
+
+				#if defined(USB_CAN_BE_BOTH)
+					void EVENT_USB_UIDChange(void) ATTR_WEAK ATTR_ALIAS(USB_Event_Stub);
+				#endif
+
+				#if defined(USB_CAN_BE_HOST)
+					void EVENT_USB_Host_HostError(const uint8_t ErrorCode) ATTR_WEAK ATTR_ALIAS(USB_Event_Stub);
+					void EVENT_USB_Host_DeviceAttached(void) ATTR_WEAK ATTR_ALIAS(USB_Event_Stub);
+					void EVENT_USB_Host_DeviceUnattached(void) ATTR_WEAK ATTR_ALIAS(USB_Event_Stub);
+					void EVENT_USB_Host_DeviceEnumerationComplete(void) ATTR_WEAK ATTR_ALIAS(USB_Event_Stub);
+					void EVENT_USB_Host_DeviceEnumerationFailed(const uint8_t ErrorCode,
+                                                                const uint8_t SubErrorCode)
+					                                            ATTR_WEAK ATTR_ALIAS(USB_Event_Stub);
+					void EVENT_USB_Host_StartOfFrame(void) ATTR_WEAK ATTR_ALIAS(USB_Event_Stub);
+				#endif
+
+				#if defined(USB_CAN_BE_DEVICE)
+					void EVENT_USB_Device_Connect(void) ATTR_WEAK ATTR_ALIAS(USB_Event_Stub);
+					void EVENT_USB_Device_Disconnect(void) ATTR_WEAK ATTR_ALIAS(USB_Event_Stub);
+					void EVENT_USB_Device_ControlRequest(void) ATTR_WEAK ATTR_ALIAS(USB_Event_Stub);
+					void EVENT_USB_Device_ConfigurationChanged(void) ATTR_WEAK ATTR_ALIAS(USB_Event_Stub);
+					void EVENT_USB_Device_Suspend(void) ATTR_WEAK ATTR_ALIAS(USB_Event_Stub);
+					void EVENT_USB_Device_WakeUp(void) ATTR_WEAK ATTR_ALIAS(USB_Event_Stub);
+					void EVENT_USB_Device_Reset(void) ATTR_WEAK ATTR_ALIAS(USB_Event_Stub);
+					void EVENT_USB_Device_StartOfFrame(void) ATTR_WEAK ATTR_ALIAS(USB_Event_Stub);
+				#endif
+			#endif
+	#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Core/Host.h b/lib/lufa/LUFA/Drivers/USB/Core/Host.h
new file mode 100644
index 0000000000..50410b2be8
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Core/Host.h
@@ -0,0 +1,139 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Common USB Host definitions for all architectures.
+ *  \copydetails Group_Host
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the USB driver
+ *        dispatch header located in LUFA/Drivers/USB/USB.h.
+ */
+
+/** \ingroup Group_USB
+ *  \defgroup Group_Host Host Management
+ *  \brief USB Host management definitions for USB host mode.
+ *
+ *  USB Host mode related macros and enums. This module contains macros and enums which are used when
+ *  the USB controller is initialized in host mode.
+ *
+ *  @{
+ */
+
+#ifndef __USBHOST_H__
+#define __USBHOST_H__
+
+	/* Includes: */
+		#include "../../../Common/Common.h"
+		#include "USBMode.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_USB_DRIVER)
+			#error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Enums: */
+			/** Enum for the various states of the USB Host state machine.
+			 *
+			 *  For information on each possible USB host state, refer to the USB 2.0 specification.
+			 *  Several of the USB host states are broken up further into multiple smaller sub-states,
+			 *  so that they can be internally implemented inside the library in an efficient manner.
+			 *
+			 *  \see \ref USB_HostState, which stores the current host state machine state.
+			 */
+			enum USB_Host_States_t
+			{
+				HOST_STATE_WaitForDevice                = 0,  /**< This state indicates that the stack is waiting for an interval
+				                                               *   to elapse before continuing with the next step of the device
+				                                               *   enumeration process.
+				                                               */
+				HOST_STATE_Unattached                   = 1,  /**< This state indicates that the host state machine is waiting for
+				                                               *   a device to be attached so that it can start the enumeration process.
+				                                               */
+				HOST_STATE_Powered                      = 2,  /**< This state indicates that a device has been attached, and the
+				                                               *   library's internals are being configured to begin the enumeration
+				                                               *   process.
+				                                               */
+				HOST_STATE_Powered_WaitForDeviceSettle  = 3,  /**< This state indicates that the stack is waiting for the initial
+				                                               *   settling period to elapse before beginning the enumeration process.
+				                                               */
+				HOST_STATE_Powered_WaitForConnect       = 4,  /**< 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.
+				                                               */
+				HOST_STATE_Powered_DoReset              = 5,  /**< This state indicates that a valid USB device has been attached, and that
+				                                               *   it will now be reset to ensure it is ready for enumeration.
+				                                               */
+				HOST_STATE_Powered_ConfigPipe           = 6,  /**< This state indicates that the attached device is currently powered and
+				                                               *   reset, and that the control pipe is now being configured by the stack.
+				                                               */
+				HOST_STATE_Default                      = 7,  /**< 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.
+				                                               */
+				HOST_STATE_Default_PostReset            = 8,  /**< 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.
+				                                               */
+				HOST_STATE_Default_PostAddressSet       = 9,  /**< 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 \ref HOST_STATE_Addressed state
+				                                               *   ready for use in the user application.
+				                                               */
+				HOST_STATE_Addressed                    = 10, /**< Indicates that the device has been enumerated and addressed, and is now waiting
+				                                               *   for the user application to configure the device ready for use.
+				                                               */
+				HOST_STATE_Configured                   = 11, /**< Indicates that the device has been configured into a valid device configuration,
+				                                               *   ready for general use by the user application.
+				                                               */
+			};
+
+	/* Architecture Includes: */
+		#if (ARCH == ARCH_AVR8)
+			#include "AVR8/Host_AVR8.h"
+		#elif (ARCH == ARCH_UC3)
+			#include "UC3/Host_UC3.h"
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Core/HostStandardReq.c b/lib/lufa/LUFA/Drivers/USB/Core/HostStandardReq.c
new file mode 100644
index 0000000000..42a934daa0
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Core/HostStandardReq.c
@@ -0,0 +1,322 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+#define  __INCLUDE_FROM_USB_DRIVER
+#include "USBMode.h"
+
+#if defined(USB_CAN_BE_HOST)
+
+#define  __INCLUDE_FROM_HOSTSTDREQ_C
+#include "HostStandardReq.h"
+
+uint8_t USB_Host_ConfigurationNumber;
+
+static uint8_t USB_Host_SendControlRequest_PRV(void* const BufferPtr)
+{
+	uint8_t* DataStream   = (uint8_t*)BufferPtr;
+	uint8_t  ReturnStatus = HOST_SENDCONTROL_Successful;
+	uint16_t DataLen      = USB_ControlRequest.wLength;
+
+	USB_Host_ResumeBus();
+
+	if ((ReturnStatus = USB_Host_WaitMS(1)) != HOST_WAITERROR_Successful)
+	  return ReturnStatus;
+
+	Pipe_SetPipeToken(PIPE_TOKEN_SETUP);
+	Pipe_ClearError();
+
+	Pipe_Unfreeze();
+
+	#if defined(ARCH_BIG_ENDIAN)
+	Pipe_Write_8(USB_ControlRequest.bmRequestType);
+	Pipe_Write_8(USB_ControlRequest.bRequest);
+	Pipe_Write_16_LE(USB_ControlRequest.wValue);
+	Pipe_Write_16_LE(USB_ControlRequest.wIndex);
+	Pipe_Write_16_LE(USB_ControlRequest.wLength);
+	#else
+	uint8_t* HeaderStream = (uint8_t*)&USB_ControlRequest;
+
+	for (uint8_t HeaderByte = 0; HeaderByte < sizeof(USB_Request_Header_t); HeaderByte++)
+	  Pipe_Write_8(*(HeaderStream++));
+	#endif
+
+	Pipe_ClearSETUP();
+
+	if ((ReturnStatus = USB_Host_WaitForIOS(USB_HOST_WAITFOR_SetupSent)) != HOST_SENDCONTROL_Successful)
+	  return ReturnStatus;
+
+	Pipe_Freeze();
+
+	if ((ReturnStatus = USB_Host_WaitMS(1)) != HOST_WAITERROR_Successful)
+	  return ReturnStatus;
+
+	if ((USB_ControlRequest.bmRequestType & CONTROL_REQTYPE_DIRECTION) == REQDIR_DEVICETOHOST)
+	{
+		Pipe_SetPipeToken(PIPE_TOKEN_IN);
+
+		if (DataStream != NULL)
+		{
+			while (DataLen)
+			{
+				Pipe_Unfreeze();
+
+				if ((ReturnStatus = USB_Host_WaitForIOS(USB_HOST_WAITFOR_InReceived)) != HOST_SENDCONTROL_Successful)
+				  return ReturnStatus;
+
+				if (!(Pipe_BytesInPipe()))
+				  DataLen = 0;
+
+				while (Pipe_BytesInPipe() && DataLen)
+				{
+					*(DataStream++) = Pipe_Read_8();
+					DataLen--;
+				}
+
+				Pipe_Freeze();
+				Pipe_ClearIN();
+			}
+		}
+
+		Pipe_SetPipeToken(PIPE_TOKEN_OUT);
+		Pipe_Unfreeze();
+
+		if ((ReturnStatus = USB_Host_WaitForIOS(USB_HOST_WAITFOR_OutReady)) != HOST_SENDCONTROL_Successful)
+		  return ReturnStatus;
+
+		Pipe_ClearOUT();
+
+		if ((ReturnStatus = USB_Host_WaitForIOS(USB_HOST_WAITFOR_OutReady)) != HOST_SENDCONTROL_Successful)
+		  return ReturnStatus;
+	}
+	else
+	{
+		if (DataStream != NULL)
+		{
+			Pipe_SetPipeToken(PIPE_TOKEN_OUT);
+			Pipe_Unfreeze();
+
+			while (DataLen)
+			{
+				if ((ReturnStatus = USB_Host_WaitForIOS(USB_HOST_WAITFOR_OutReady)) != HOST_SENDCONTROL_Successful)
+				  return ReturnStatus;
+
+				while (DataLen && (Pipe_BytesInPipe() < USB_Host_ControlPipeSize))
+				{
+					Pipe_Write_8(*(DataStream++));
+					DataLen--;
+				}
+
+				Pipe_ClearOUT();
+			}
+
+			if ((ReturnStatus = USB_Host_WaitForIOS(USB_HOST_WAITFOR_OutReady)) != HOST_SENDCONTROL_Successful)
+			  return ReturnStatus;
+
+			Pipe_Freeze();
+		}
+
+		Pipe_SetPipeToken(PIPE_TOKEN_IN);
+		Pipe_Unfreeze();
+
+		if ((ReturnStatus = USB_Host_WaitForIOS(USB_HOST_WAITFOR_InReceived)) != HOST_SENDCONTROL_Successful)
+		  return ReturnStatus;
+
+		Pipe_ClearIN();
+	}
+
+	return ReturnStatus;
+}
+
+static uint8_t USB_Host_WaitForIOS(const uint8_t WaitType)
+{
+	#if (USB_HOST_TIMEOUT_MS < 0xFF)
+	uint8_t  TimeoutCounter = USB_HOST_TIMEOUT_MS;
+	#else
+	uint16_t TimeoutCounter = USB_HOST_TIMEOUT_MS;
+	#endif
+
+	while (!(((WaitType == USB_HOST_WAITFOR_SetupSent)  && Pipe_IsSETUPSent())  ||
+	         ((WaitType == USB_HOST_WAITFOR_InReceived) && Pipe_IsINReceived()) ||
+	         ((WaitType == USB_HOST_WAITFOR_OutReady)   && Pipe_IsOUTReady())))
+	{
+		uint8_t ErrorCode;
+
+		if ((ErrorCode = USB_Host_WaitMS(1)) != HOST_WAITERROR_Successful)
+		  return ErrorCode;
+
+		if (!(TimeoutCounter--))
+		  return HOST_SENDCONTROL_SoftwareTimeOut;
+	}
+
+	return HOST_SENDCONTROL_Successful;
+}
+
+uint8_t USB_Host_SendControlRequest(void* const BufferPtr)
+{
+	bool BusSuspended    = USB_Host_IsBusSuspended();
+	uint8_t ReturnStatus = USB_Host_SendControlRequest_PRV(BufferPtr);
+
+	Pipe_Freeze();
+
+	if (BusSuspended)
+	  USB_Host_SuspendBus();
+
+	Pipe_ResetPipe(PIPE_CONTROLPIPE);
+
+	return ReturnStatus;
+}
+
+uint8_t USB_Host_SetDeviceConfiguration(const uint8_t ConfigNumber)
+{
+	uint8_t ErrorCode;
+
+	USB_ControlRequest = (USB_Request_Header_t)
+		{
+			.bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE),
+			.bRequest      = REQ_SetConfiguration,
+			.wValue        = ConfigNumber,
+			.wIndex        = 0,
+			.wLength       = 0,
+		};
+
+	Pipe_SelectPipe(PIPE_CONTROLPIPE);
+
+	if ((ErrorCode = USB_Host_SendControlRequest(NULL)) == HOST_SENDCONTROL_Successful)
+	{
+		USB_Host_ConfigurationNumber = ConfigNumber;
+		USB_HostState                = (ConfigNumber) ? HOST_STATE_Configured : HOST_STATE_Addressed;
+	}
+
+	return ErrorCode;
+}
+
+uint8_t USB_Host_GetDeviceConfiguration(uint8_t* const ConfigNumber)
+{
+	USB_ControlRequest = (USB_Request_Header_t)
+		{
+			.bmRequestType = (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE),
+			.bRequest      = REQ_GetConfiguration,
+			.wValue        = 0,
+			.wIndex        = 0,
+			.wLength       = sizeof(uint8_t),
+		};
+
+	Pipe_SelectPipe(PIPE_CONTROLPIPE);
+
+	return USB_Host_SendControlRequest(ConfigNumber);
+}
+
+uint8_t USB_Host_GetDescriptor(const uint8_t Type,
+                               const uint8_t Index,
+                               void* const Buffer,
+                               const uint8_t BufferLength)
+{
+	USB_ControlRequest = (USB_Request_Header_t)
+		{
+			.bmRequestType = (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE),
+			.bRequest      = REQ_GetDescriptor,
+			.wValue        = (((uint16_t)Type << 8) | Index),
+			.wIndex        = 0,
+			.wLength       = BufferLength,
+		};
+
+	Pipe_SelectPipe(PIPE_CONTROLPIPE);
+
+	return USB_Host_SendControlRequest(Buffer);
+}
+
+uint8_t USB_Host_GetDeviceStatus(uint8_t* const FeatureStatus)
+{
+	USB_ControlRequest = (USB_Request_Header_t)
+		{
+			.bmRequestType = (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE),
+			.bRequest      = REQ_GetStatus,
+			.wValue        = 0,
+			.wIndex        = 0,
+			.wLength       = 0,
+		};
+
+	Pipe_SelectPipe(PIPE_CONTROLPIPE);
+
+	return USB_Host_SendControlRequest(FeatureStatus);
+}
+
+uint8_t USB_Host_ClearEndpointStall(const uint8_t EndpointAddress)
+{
+	USB_ControlRequest = (USB_Request_Header_t)
+		{
+			.bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_ENDPOINT),
+			.bRequest      = REQ_ClearFeature,
+			.wValue        = FEATURE_SEL_EndpointHalt,
+			.wIndex        = EndpointAddress,
+			.wLength       = 0,
+		};
+
+	Pipe_SelectPipe(PIPE_CONTROLPIPE);
+
+	return USB_Host_SendControlRequest(NULL);
+}
+
+uint8_t USB_Host_SetInterfaceAltSetting(const uint8_t InterfaceIndex,
+                                        const uint8_t AltSetting)
+{
+	USB_ControlRequest = (USB_Request_Header_t)
+		{
+			.bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_INTERFACE),
+			.bRequest      = REQ_SetInterface,
+			.wValue        = AltSetting,
+			.wIndex        = InterfaceIndex,
+			.wLength       = 0,
+		};
+
+	Pipe_SelectPipe(PIPE_CONTROLPIPE);
+
+	return USB_Host_SendControlRequest(NULL);
+}
+
+uint8_t USB_Host_GetInterfaceAltSetting(const uint8_t InterfaceIndex,
+                                        uint8_t* const AltSetting)
+{
+	USB_ControlRequest = (USB_Request_Header_t)
+		{
+			.bmRequestType = (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_INTERFACE),
+			.bRequest      = REQ_GetInterface,
+			.wValue        = 0,
+			.wIndex        = InterfaceIndex,
+			.wLength       = sizeof(uint8_t),
+		};
+
+	Pipe_SelectPipe(PIPE_CONTROLPIPE);
+
+	return USB_Host_SendControlRequest(AltSetting);
+}
+
+#endif
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Core/HostStandardReq.h b/lib/lufa/LUFA/Drivers/USB/Core/HostStandardReq.h
new file mode 100644
index 0000000000..66542690ab
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Core/HostStandardReq.h
@@ -0,0 +1,292 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief USB host standard request management.
+ *
+ *  This file contains the function prototypes necessary for the issuing of outgoing standard control requests
+ *  when the library is in USB host mode.
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the USB driver
+ *        dispatch header located in LUFA/Drivers/USB/USB.h.
+ */
+
+#ifndef __HOSTSTDREQ_H__
+#define __HOSTSTDREQ_H__
+
+	/* Includes: */
+		#include "../../../Common/Common.h"
+		#include "USBMode.h"
+		#include "StdRequestType.h"
+		#include "USBController.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_USB_DRIVER)
+			#error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			#if !defined(USB_HOST_TIMEOUT_MS) || defined(__DOXYGEN__)
+				/** Constant for the maximum software timeout period of sent USB control transactions to an attached
+				 *  device. If a device fails to respond to a sent control request within this period, the
+				 *  library will return a timeout error code.
+				 *
+				 *  This value may be overridden in the user project makefile as the value of the
+				 *  \ref USB_HOST_TIMEOUT_MS token, and passed to the compiler using the -D switch.
+				 */
+				#define USB_HOST_TIMEOUT_MS                1000
+			#endif
+
+		/* Enums: */
+			/** Enum for the \ref USB_Host_SendControlRequest() return code, indicating the reason for the error
+			 *  if the transfer of the request is unsuccessful.
+			 *
+			 *  \ingroup Group_PipeControlReq
+			 */
+			enum USB_Host_SendControlErrorCodes_t
+			{
+				HOST_SENDCONTROL_Successful         = 0, /**< No error occurred in the request transfer. */
+				HOST_SENDCONTROL_DeviceDisconnected = 1, /**< The attached device was disconnected during the
+				                                        *     request transfer.
+				                                        */
+				HOST_SENDCONTROL_PipeError          = 2, /**< An error occurred in the pipe while sending the request. */
+				HOST_SENDCONTROL_SetupStalled       = 3, /**< The attached device stalled the request, usually
+				                                          *   indicating that the request is unsupported on the device.
+				                                          */
+				HOST_SENDCONTROL_SoftwareTimeOut    = 4, /**< The request or data transfer timed out. */
+			};
+
+		/* Global Variables: */
+			/** Indicates the currently set configuration number of the attached device. This indicates the currently
+			 *  selected configuration value if one has been set successfully, or 0 if no configuration has been selected.
+			 *
+			 *  To set a device configuration, call the \ref USB_Host_SetDeviceConfiguration() function.
+			 *
+			 *  \attention This variable should be treated as read-only in the user application, and never manually
+			 *             changed in value.
+			 *
+			 *  \ingroup Group_Host
+			 */
+			extern uint8_t USB_Host_ConfigurationNumber;
+
+		/* Function Prototypes: */
+			/** Sends the request stored in the \ref USB_ControlRequest global structure to the attached device,
+			 *  and transfers the data stored in the buffer to the device, or from the device to the buffer
+			 *  as requested. The transfer is made on the currently selected pipe.
+			 *
+			 *  \ingroup Group_PipeControlReq
+			 *
+			 *  \param[in] BufferPtr  Pointer to the start of the data buffer if the request has a data stage, or
+			 *                        \c NULL if the request transfers no data to or from the device.
+			 *
+			 *  \return A value from the \ref USB_Host_SendControlErrorCodes_t enum to indicate the result.
+			 */
+			uint8_t USB_Host_SendControlRequest(void* const BufferPtr);
+
+			/** Sends a SET CONFIGURATION standard request to the attached device, with the given configuration index.
+			 *
+			 *  This routine will automatically update the \ref USB_HostState and \ref USB_Host_ConfigurationNumber
+			 *  state variables according to the given function parameters and the result of the request.
+			 *
+			 *  \note After this routine returns, the control pipe will be selected.
+			 *
+			 *  \ingroup Group_PipeControlReq
+			 *
+			 *  \param[in] ConfigNumber  Configuration index to send to the device.
+			 *
+			 *  \return A value from the \ref USB_Host_SendControlErrorCodes_t enum to indicate the result.
+			 */
+			uint8_t USB_Host_SetDeviceConfiguration(const uint8_t ConfigNumber);
+
+			/** Sends a GET CONFIGURATION standard request to the attached device, to retrieve the currently selected
+			 *  device configuration index.
+			 *
+			 *  \note After this routine returns, the control pipe will be selected.
+			 *
+			 *  \ingroup Group_PipeControlReq
+			 *
+			 *  \param[out] ConfigNumber  Pointer to a location where the retrieved configuration index should be stored.
+			 *
+			 *  \return A value from the \ref USB_Host_SendControlErrorCodes_t enum to indicate the result.
+			 */
+			uint8_t USB_Host_GetDeviceConfiguration(uint8_t* const ConfigNumber) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Sends a GET DESCRIPTOR standard request to the attached device, requesting the  descriptor of the
+			 *  specified type and index.
+			 *
+			 *  \note After this routine returns, the control pipe will be selected.
+			 *
+			 *  \ingroup Group_PipeControlReq
+			 *
+			 *  \param[in]  Type          Type of descriptor to retrieve, a value from the \ref USB_DescriptorTypes_t enum.
+			 *  \param[in]  Index         Index of the descriptor to retrieve.
+			 *  \param[out] Buffer        Pointer to the destination buffer where the retrieved string descriptor is to be stored.
+			 *  \param[in]  BufferLength  Maximum size of the string descriptor which can be stored into the buffer.
+			 *
+			 *  \return A value from the \ref USB_Host_SendControlErrorCodes_t enum to indicate the result.
+			 */
+			uint8_t USB_Host_GetDescriptor(const uint8_t Type,
+			                               const uint8_t Index,
+			                               void* const Buffer,
+			                               const uint8_t BufferLength) ATTR_NON_NULL_PTR_ARG(3);
+
+			/** Retrieves the current feature status of the attached device, via a GET STATUS standard request. The
+			 *  retrieved feature status can then be examined by masking the retrieved value with the various
+			 *  \c FEATURE_* masks for bus/self power information and remote wakeup support.
+			 *
+			 *  \note After this routine returns, the control pipe will be selected.
+			 *
+			 *  \ingroup Group_PipeControlReq
+			 *
+			 *  \param[out]  FeatureStatus  Location where the retrieved feature status should be stored.
+			 *
+			 *  \return A value from the \ref USB_Host_SendControlErrorCodes_t enum to indicate the result.
+			 */
+			uint8_t USB_Host_GetDeviceStatus(uint8_t* const FeatureStatus) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Clears a stall condition on the given pipe, via a CLEAR FEATURE standard request to the attached device.
+			 *
+			 *  \note After this routine returns, the control pipe will be selected.
+			 *
+			 *  \ingroup Group_PipeControlReq
+			 *
+			 *  \param[in] EndpointAddress  Address of the endpoint to clear, including the endpoint's direction.
+			 *
+			 *  \return A value from the \ref USB_Host_SendControlErrorCodes_t enum to indicate the result.
+			 */
+			uint8_t USB_Host_ClearEndpointStall(const uint8_t EndpointAddress);
+
+			/** Selects a given alternative setting for the specified interface, via a SET INTERFACE standard request to
+			 *  the attached device.
+			 *
+			 *  \note After this routine returns, the control pipe will be selected.
+			 *
+			 *  \ingroup Group_PipeControlReq
+			 *
+			 *  \param[in] InterfaceIndex  Index of the interface whose alternative setting is to be altered.
+			 *  \param[in] AltSetting      Index of the interface's alternative setting which is to be selected.
+			 *
+			 *  \return A value from the \ref USB_Host_SendControlErrorCodes_t enum to indicate the result.
+			 */
+			uint8_t USB_Host_SetInterfaceAltSetting(const uint8_t InterfaceIndex,
+			                                        const uint8_t AltSetting);
+
+
+			/** Retrieves the current alternative setting for the specified interface, via a GET INTERFACE standard request to
+			 *  the attached device.
+			 *
+			 *  \note After this routine returns, the control pipe will be selected.
+			 *
+			 *  \ingroup Group_PipeControlReq
+			 *
+			 *  \param[in]  InterfaceIndex  Index of the interface whose alternative setting is to be altered.
+			 *  \param[out] AltSetting      Pointer to a location where the retrieved alternative setting value should be stored.
+			 *
+			 *  \return A value from the \ref USB_Host_SendControlErrorCodes_t enum to indicate the result.
+			 */
+			uint8_t USB_Host_GetInterfaceAltSetting(const uint8_t InterfaceIndex,
+			                                        uint8_t* const AltSetting) ATTR_NON_NULL_PTR_ARG(2);
+
+		/* Inline Functions: */
+			/** Sends a GET DESCRIPTOR standard request to the attached device, requesting the device descriptor.
+			 *  This can be used to easily retrieve information about the device such as its VID, PID and power
+			 *  requirements. This is a convenience wrapper for \ref USB_Host_GetDescriptor().
+			 *
+			 *  \note After this routine returns, the control pipe will be selected.
+			 *
+			 *  \ingroup Group_PipeControlReq
+			 *
+			 *  \param[out] DeviceDescriptorPtr  Pointer to the destination device descriptor structure where
+			 *                                   the read data is to be stored.
+			 *
+			 *  \return A value from the \ref USB_Host_SendControlErrorCodes_t enum to indicate the result.
+			 */
+			static inline uint8_t USB_Host_GetDeviceDescriptor(USB_Descriptor_Device_t* const DeviceDescriptorPtr) ATTR_NON_NULL_PTR_ARG(1);
+			static inline uint8_t USB_Host_GetDeviceDescriptor(USB_Descriptor_Device_t* const DeviceDescriptorPtr)
+			{
+				return USB_Host_GetDescriptor(DTYPE_Device, 0, DeviceDescriptorPtr, sizeof(USB_Descriptor_Device_t));
+			}
+
+			/** Sends a GET DESCRIPTOR standard request to the attached device, requesting the string descriptor
+			 *  of the specified index. This can be used to easily retrieve string descriptors from the device by
+			 *  index, after the index is obtained from the Device or Configuration descriptors. This is a convenience
+			 *  wrapper for \ref USB_Host_GetDescriptor().
+			 *
+			 *  \note After this routine returns, the control pipe will be selected.
+			 *
+			 *  \ingroup Group_PipeControlReq
+			 *
+			 *  \param[in]  Index        Index of the string descriptor to retrieve.
+			 *  \param[out] Buffer       Pointer to the destination buffer where the retrieved string descriptor is
+			 *                           to be stored.
+			 *  \param[in] BufferLength  Maximum size of the string descriptor which can be stored into the buffer.
+			 *
+			 *  \return A value from the \ref USB_Host_SendControlErrorCodes_t enum to indicate the result.
+			 */
+			static inline uint8_t USB_Host_GetDeviceStringDescriptor(const uint8_t Index,
+			                                                         void* const Buffer,
+			                                                         const uint8_t BufferLength) ATTR_NON_NULL_PTR_ARG(2);
+			static inline uint8_t USB_Host_GetDeviceStringDescriptor(const uint8_t Index,
+			                                                         void* const Buffer,
+			                                                         const uint8_t BufferLength)
+			{
+				return USB_Host_GetDescriptor(DTYPE_String, Index,  Buffer, BufferLength);
+			}
+
+	/* Private Interface - For use in library only: */
+	#if !defined(__DOXYGEN__)
+		/* Enums: */
+			enum USB_WaitForTypes_t
+			{
+				USB_HOST_WAITFOR_SetupSent,
+				USB_HOST_WAITFOR_InReceived,
+				USB_HOST_WAITFOR_OutReady,
+			};
+
+		/* Function Prototypes: */
+			#if defined(__INCLUDE_FROM_HOSTSTDREQ_C)
+				static uint8_t USB_Host_SendControlRequest_PRV(void* const BufferPtr);
+				static uint8_t USB_Host_WaitForIOS(const uint8_t WaitType);
+			#endif
+	#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Core/OTG.h b/lib/lufa/LUFA/Drivers/USB/Core/OTG.h
new file mode 100644
index 0000000000..6293e4cacd
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Core/OTG.h
@@ -0,0 +1,80 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Common USB OTG definitions for all architectures.
+ *  \copydetails Group_OTG
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the USB driver
+ *        dispatch header located in LUFA/Drivers/USB/USB.h.
+ */
+
+/** \ingroup Group_USB
+ *  \defgroup Group_OTG USB On The Go (OTG) Management
+ *  \brief USB OTG management definitions.
+ *
+ *  This module contains macros for embedded USB hosts with dual role On The Go capabilities, for managing role
+ *  exchange. OTG is a way for two USB dual role devices to talk to one another directly without fixed device/host
+ *  roles.
+ *
+ *  @{
+ */
+
+#ifndef __USBOTG_H__
+#define __USBOTG_H__
+
+	/* Includes: */
+		#include "../../../Common/Common.h"
+		#include "USBMode.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_USB_DRIVER)
+			#error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.
+		#endif
+
+	/* Architecture Includes: */
+		#if (ARCH == ARCH_AVR8)
+			#include "AVR8/OTG_AVR8.h"
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Core/Pipe.h b/lib/lufa/LUFA/Drivers/USB/Core/Pipe.h
new file mode 100644
index 0000000000..0697078d01
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Core/Pipe.h
@@ -0,0 +1,144 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Common USB Pipe definitions for all architectures.
+ *  \copydetails Group_PipeManagement
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the USB driver
+ *        dispatch header located in LUFA/Drivers/USB/USB.h.
+ */
+
+/** \ingroup Group_PipeManagement
+ *  \defgroup Group_PipeRW Pipe Data Reading and Writing
+ *  \brief Pipe data read/write definitions.
+ *
+ *  Functions, macros, variables, enums and types related to data reading and writing from and to pipes.
+ */
+
+/** \ingroup Group_PipeRW
+ *  \defgroup Group_PipePrimitiveRW Read/Write of Primitive Data Types
+ *  \brief Pipe data primitive read/write definitions.
+ *
+ *  Functions, macros, variables, enums and types related to data reading and writing of primitive data types
+ *  from and to pipes.
+ */
+
+/** \ingroup Group_PipeManagement
+ *  \defgroup Group_PipePacketManagement Pipe Packet Management
+ *  \brief Pipe packet management definitions.
+ *
+ *  Functions, macros, variables, enums and types related to packet management of pipes.
+ */
+
+/** \ingroup Group_PipeManagement
+ *  \defgroup Group_PipeControlReq Pipe Control Request Management
+ *  \brief Pipe control request definitions.
+ *
+ *  Module for host mode request processing. This module allows for the transmission of standard, class and
+ *  vendor control requests to the default control endpoint of an attached device while in host mode.
+ *
+ *  \see Chapter 9 of the USB 2.0 specification.
+ */
+
+/** \ingroup Group_USB
+ *  \defgroup Group_PipeManagement Pipe Management
+ *  \brief Pipe management definitions.
+ *
+ *  This module contains functions, macros and enums related to pipe management when in USB Host mode. This
+ *  module contains the pipe management macros, as well as pipe interrupt and data send/receive functions
+ *  for various data types.
+ *
+ *  @{
+ */
+
+#ifndef __PIPE_H__
+#define __PIPE_H__
+
+	/* Includes: */
+		#include "../../../Common/Common.h"
+		#include "USBMode.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_USB_DRIVER)
+			#error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Type Defines: */
+			/** Type define for a pipe table entry, used to configure pipes in groups via
+			 *  \ref Pipe_ConfigurePipeTable().
+			 */
+			typedef struct
+			{
+				uint8_t  Address; /**< Address of the pipe to configure, or zero if the table entry is to be unused. */
+				uint16_t Size; /**< Size of the pipe bank, in bytes. */
+				uint8_t  EndpointAddress; /**< Address of the endpoint in the connected device. */
+				uint8_t  Type; /**< Type of the endpoint, a \c EP_TYPE_* mask. */
+				uint8_t  Banks; /**< Number of hardware banks to use for the pipe. */
+			} USB_Pipe_Table_t;
+
+		/* Macros: */
+			/** Pipe address for the default control pipe, which always resides in address 0. This is
+			 *  defined for convenience to give more readable code when used with the pipe macros.
+			 */
+			#define PIPE_CONTROLPIPE                0
+
+			/** Pipe number mask, for masking against pipe addresses to retrieve the pipe's numerical address
+			 *  in the device.
+			 */
+			#define PIPE_PIPENUM_MASK               0x0F
+
+			/** Endpoint number mask, for masking against endpoint addresses to retrieve the endpoint's
+			 *  numerical address in the attached device.
+			 */
+			#define PIPE_EPNUM_MASK                 0x0F
+
+	/* Architecture Includes: */
+		#if (ARCH == ARCH_AVR8)
+			#include "AVR8/Pipe_AVR8.h"
+		#elif (ARCH == ARCH_UC3)
+			#include "UC3/Pipe_UC3.h"
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Core/PipeStream.h b/lib/lufa/LUFA/Drivers/USB/Core/PipeStream.h
new file mode 100644
index 0000000000..8785302847
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Core/PipeStream.h
@@ -0,0 +1,100 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Pipe data stream transmission and reception management.
+ *  \copydetails Group_PipeStreamRW
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the USB driver
+ *        dispatch header located in LUFA/Drivers/USB/USB.h.
+ */
+
+/** \ingroup Group_PipeRW
+ *  \defgroup Group_PipeStreamRW Read/Write of Multi-Byte Streams
+ *  \brief Pipe data stream transmission and reception management.
+ *
+ *  Functions, macros, variables, enums and types related to data reading and writing of data streams from
+ *  and to pipes.
+ *
+ *  @{
+ */
+
+#ifndef __PIPE_STREAM_H__
+#define __PIPE_STREAM_H__
+
+	/* Includes: */
+		#include "../../../Common/Common.h"
+		#include "USBMode.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_USB_DRIVER)
+			#error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Enums: */
+			/** Enum for the possible error return codes of the Pipe_*_Stream_* functions. */
+			enum Pipe_Stream_RW_ErrorCodes_t
+			{
+				PIPE_RWSTREAM_NoError            = 0, /**< Command completed successfully, no error. */
+				PIPE_RWSTREAM_PipeStalled        = 1, /**< The device stalled the pipe during the transfer. */
+				PIPE_RWSTREAM_DeviceDisconnected = 2, /**< Device was disconnected from the host during
+			                                           *   the transfer.
+			                                           */
+				PIPE_RWSTREAM_Timeout            = 3, /**< The device failed to accept or send the next packet
+				                                       *   within the software timeout period set by the
+				                                       *   \ref USB_STREAM_TIMEOUT_MS macro.
+				                                       */
+				PIPE_RWSTREAM_IncompleteTransfer = 4, /**< Indicates that the pipe bank became full/empty before the
+				                                       *   complete contents of the stream could be transferred.
+				                                       */
+			};
+
+	/* Architecture Includes: */
+		#if (ARCH == ARCH_AVR8)
+			#include "AVR8/PipeStream_AVR8.h"
+		#elif (ARCH == ARCH_UC3)
+			#include "UC3/PipeStream_UC3.h"
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Core/StdDescriptors.h b/lib/lufa/LUFA/Drivers/USB/Core/StdDescriptors.h
new file mode 100644
index 0000000000..381c02c53f
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Core/StdDescriptors.h
@@ -0,0 +1,765 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Common standard USB Descriptor definitions for all architectures.
+ *  \copydetails Group_StdDescriptors
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the USB driver
+ *        dispatch header located in LUFA/Drivers/USB/USB.h.
+ */
+
+/** \ingroup Group_USB
+ *  \defgroup Group_StdDescriptors USB Descriptors
+ *  \brief Standard USB Descriptor definitions.
+ *
+ *  Standard USB device descriptor defines and retrieval routines, for USB devices. This module contains
+ *  structures and macros for the easy creation of standard USB descriptors in USB device projects.
+ *
+ *  @{
+ */
+
+#ifndef __USBDESCRIPTORS_H__
+#define __USBDESCRIPTORS_H__
+
+	/* Includes: */
+		#include "../../../Common/Common.h"
+		#include "USBMode.h"
+		#include "Events.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_USB_DRIVER)
+			#error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Indicates that a given descriptor does not exist in the device. This can be used inside descriptors
+			 *  for string descriptor indexes, or may be use as a return value for GetDescriptor when the specified
+			 *  descriptor does not exist.
+			 */
+			#define NO_DESCRIPTOR                     0
+
+			/** Macro to calculate the power value for the configuration descriptor, from a given number of milliamperes.
+			 *
+			 *  \param[in] mA  Maximum number of milliamps the device consumes when the given configuration is selected.
+			 */
+			#define USB_CONFIG_POWER_MA(mA)           ((mA) >> 1)
+
+			/** Macro to calculate the Unicode length of a string with a given number of Unicode characters.
+			 *  Should be used in string descriptor's headers for giving the string descriptor's byte length.
+			 *
+			 *  \param[in] UnicodeChars  Number of Unicode characters in the string text.
+			 */
+			#define USB_STRING_LEN(UnicodeChars)      (sizeof(USB_Descriptor_Header_t) + ((UnicodeChars) << 1))
+
+			/** Convenience macro to easily create \ref USB_Descriptor_String_t instances from a wide character string.
+			 *
+			 *  \note This macro is for little-endian systems only.
+			 *
+			 *  \param[in] String  String to initialize a USB String Descriptor structure with.
+			 */
+			#define USB_STRING_DESCRIPTOR(String)     { .Header = {.Size = sizeof(USB_Descriptor_Header_t) + (sizeof(String) - 2), .Type = DTYPE_String}, .UnicodeString = String }
+
+			/** Convenience macro to easily create \ref USB_Descriptor_String_t instances from an array of characters.
+			 *
+			 *  \param[in] ...  Characters to initialize a USB String Descriptor structure with.
+			 */
+			#define USB_STRING_DESCRIPTOR_ARRAY(...)  { .Header = {.Size = sizeof(USB_Descriptor_Header_t) + sizeof((uint16_t){__VA_ARGS__}), .Type = DTYPE_String}, .UnicodeString = {__VA_ARGS__} }
+
+			/** Macro to encode a given major/minor/revision version number into Binary Coded Decimal format for descriptor
+			 *  fields requiring BCD encoding, such as the USB version number in the standard device descriptor.
+			 *
+			 *  \note This value is automatically converted into Little Endian, suitable for direct use inside device
+			 *        descriptors on all architectures without endianness conversion macros.
+			 *
+			 *  \param[in]  Major     Major version number to encode.
+			 *  \param[in]  Minor     Minor version number to encode.
+			 *  \param[in]  Revision  Revision version number to encode.
+			 */
+			#define VERSION_BCD(Major, Minor, Revision) \
+			                                          CPU_TO_LE16( ((Major & 0xFF) << 8) | \
+			                                                       ((Minor & 0x0F) << 4) | \
+			                                                       (Revision & 0x0F) )
+
+			/** String language ID for the English language. Should be used in \ref USB_Descriptor_String_t descriptors
+			 *  to indicate that the English language is supported by the device in its string descriptors.
+			 */
+			#define LANGUAGE_ID_ENG                   0x0409
+
+			/** \name USB Configuration Descriptor Attribute Masks */
+			//@{
+			/** Mask for the reserved bit in the Configuration Descriptor's \c ConfigAttributes field, which must be set on all
+			 *  devices for historical purposes.
+			 */
+			#define USB_CONFIG_ATTR_RESERVED          0x80
+
+			/** Can be masked with other configuration descriptor attributes for a \ref USB_Descriptor_Configuration_Header_t
+			 *  descriptor's \c ConfigAttributes value to indicate that the specified configuration can draw its power
+			 *  from the device's own power source.
+			 */
+			#define USB_CONFIG_ATTR_SELFPOWERED       0x40
+
+			/** Can be masked with other configuration descriptor attributes for a \ref USB_Descriptor_Configuration_Header_t
+			 *  descriptor's \c ConfigAttributes value to indicate that the specified configuration supports the
+			 *  remote wakeup feature of the USB standard, allowing a suspended USB device to wake up the host upon
+			 *  request.
+			 */
+			#define USB_CONFIG_ATTR_REMOTEWAKEUP      0x20
+			//@}
+
+			/** \name Endpoint Descriptor Attribute Masks */
+			//@{
+			/** Can be masked with other endpoint descriptor attributes for a \ref USB_Descriptor_Endpoint_t descriptor's
+			 *  \c Attributes value to indicate that the specified endpoint is not synchronized.
+			 *
+			 *  \see The USB specification for more details on the possible Endpoint attributes.
+			 */
+			#define ENDPOINT_ATTR_NO_SYNC             (0 << 2)
+
+			/** Can be masked with other endpoint descriptor attributes for a \ref USB_Descriptor_Endpoint_t descriptor's
+			 *  \c Attributes value to indicate that the specified endpoint is asynchronous.
+			 *
+			 *  \see The USB specification for more details on the possible Endpoint attributes.
+			 */
+			#define ENDPOINT_ATTR_ASYNC               (1 << 2)
+
+			/** Can be masked with other endpoint descriptor attributes for a \ref USB_Descriptor_Endpoint_t descriptor's
+			 *  \c Attributes value to indicate that the specified endpoint is adaptive.
+			 *
+			 *  \see The USB specification for more details on the possible Endpoint attributes.
+			 */
+			#define ENDPOINT_ATTR_ADAPTIVE            (2 << 2)
+
+			/** Can be masked with other endpoint descriptor attributes for a \ref USB_Descriptor_Endpoint_t descriptor's
+			 *  \c Attributes value to indicate that the specified endpoint is synchronized.
+			 *
+			 *  \see The USB specification for more details on the possible Endpoint attributes.
+			 */
+			#define ENDPOINT_ATTR_SYNC                (3 << 2)
+			//@}
+
+			/** \name Endpoint Descriptor Usage Masks */
+			//@{
+			/** Can be masked with other endpoint descriptor attributes for a \ref USB_Descriptor_Endpoint_t descriptor's
+			 *  \c Attributes value to indicate that the specified endpoint is used for data transfers.
+			 *
+			 *  \see The USB specification for more details on the possible Endpoint usage attributes.
+			 */
+			#define ENDPOINT_USAGE_DATA               (0 << 4)
+
+			/** Can be masked with other endpoint descriptor attributes for a \ref USB_Descriptor_Endpoint_t descriptor's
+			 *  \c Attributes value to indicate that the specified endpoint is used for feedback.
+			 *
+			 *  \see The USB specification for more details on the possible Endpoint usage attributes.
+			 */
+			#define ENDPOINT_USAGE_FEEDBACK           (1 << 4)
+
+			/** Can be masked with other endpoint descriptor attributes for a \ref USB_Descriptor_Endpoint_t descriptor's
+			 *  \c Attributes value to indicate that the specified endpoint is used for implicit feedback.
+			 *
+			 *  \see The USB specification for more details on the possible Endpoint usage attributes.
+			 */
+			#define ENDPOINT_USAGE_IMPLICIT_FEEDBACK  (2 << 4)
+			//@}
+
+		/* Enums: */
+			/** Enum for the possible standard descriptor types, as given in each descriptor's header. */
+			enum USB_DescriptorTypes_t
+			{
+				DTYPE_Device                    = 0x01, /**< Indicates that the descriptor is a device descriptor. */
+				DTYPE_Configuration             = 0x02, /**< Indicates that the descriptor is a configuration descriptor. */
+				DTYPE_String                    = 0x03, /**< Indicates that the descriptor is a string descriptor. */
+				DTYPE_Interface                 = 0x04, /**< Indicates that the descriptor is an interface descriptor. */
+				DTYPE_Endpoint                  = 0x05, /**< Indicates that the descriptor is an endpoint descriptor. */
+				DTYPE_DeviceQualifier           = 0x06, /**< Indicates that the descriptor is a device qualifier descriptor. */
+				DTYPE_Other                     = 0x07, /**< Indicates that the descriptor is of other type. */
+				DTYPE_InterfacePower            = 0x08, /**< Indicates that the descriptor is an interface power descriptor. */
+				DTYPE_InterfaceAssociation      = 0x0B, /**< Indicates that the descriptor is an interface association descriptor. */
+				DTYPE_CSInterface               = 0x24, /**< Indicates that the descriptor is a class specific interface descriptor. */
+				DTYPE_CSEndpoint                = 0x25, /**< Indicates that the descriptor is a class specific endpoint descriptor. */
+			};
+
+			/** Enum for possible Class, Subclass and Protocol values of device and interface descriptors. */
+			enum USB_Descriptor_ClassSubclassProtocol_t
+			{
+				USB_CSCP_NoDeviceClass          = 0x00, /**< Descriptor Class value indicating that the device does not belong
+				                                         *   to a particular class at the device level.
+				                                         */
+				USB_CSCP_NoDeviceSubclass       = 0x00, /**< Descriptor Subclass value indicating that the device does not belong
+				                                         *   to a particular subclass at the device level.
+				                                         */
+				USB_CSCP_NoDeviceProtocol       = 0x00, /**< Descriptor Protocol value indicating that the device does not belong
+				                                         *   to a particular protocol at the device level.
+				                                         */
+				USB_CSCP_VendorSpecificClass    = 0xFF, /**< Descriptor Class value indicating that the device/interface belongs
+				                                         *   to a vendor specific class.
+				                                         */
+				USB_CSCP_VendorSpecificSubclass = 0xFF, /**< Descriptor Subclass value indicating that the device/interface belongs
+				                                         *   to a vendor specific subclass.
+				                                         */
+				USB_CSCP_VendorSpecificProtocol = 0xFF, /**< Descriptor Protocol value indicating that the device/interface belongs
+				                                         *   to a vendor specific protocol.
+				                                         */
+				USB_CSCP_IADDeviceClass         = 0xEF, /**< Descriptor Class value indicating that the device belongs to the
+				                                         *   Interface Association Descriptor class.
+				                                         */
+				USB_CSCP_IADDeviceSubclass      = 0x02, /**< Descriptor Subclass value indicating that the device belongs to the
+				                                         *   Interface Association Descriptor subclass.
+				                                         */
+				USB_CSCP_IADDeviceProtocol      = 0x01, /**< Descriptor Protocol value indicating that the device belongs to the
+				                                         *   Interface Association Descriptor protocol.
+				                                         */
+			};
+
+		/* Type Defines: */
+			/** \brief Standard USB Descriptor Header (LUFA naming conventions).
+			 *
+             *  Type define for all descriptors' standard header, indicating the descriptor's length and type. This structure
+			 *  uses LUFA-specific element names to make each element's purpose clearer.
+			 *
+			 *  \see \ref USB_StdDescriptor_Header_t for the version of this type with standard element names.
+			 *
+			 *  \note Regardless of CPU architecture, these values should be stored as little endian.
+			 */
+			typedef struct
+			{
+				uint8_t Size; /**< Size of the descriptor, in bytes. */
+				uint8_t Type; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a value
+				               *   given by the specific class.
+				               */
+			} ATTR_PACKED USB_Descriptor_Header_t;
+
+			/** \brief Standard USB Descriptor Header (USB-IF naming conventions).
+			 *
+			 *  Type define for all descriptors' standard header, indicating the descriptor's length and type. This structure
+			 *  uses the relevant standard's given element names to ensure compatibility with the standard.
+			 *
+			 *  \see \ref USB_Descriptor_Header_t for the version of this type with non-standard LUFA specific element names.
+			 *
+			 *  \note Regardless of CPU architecture, these values should be stored as little endian.
+			 */
+			typedef struct
+			{
+				uint8_t bLength; /**< Size of the descriptor, in bytes. */
+				uint8_t bDescriptorType; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a value
+				                          *   given by the specific class.
+				                          */
+			} ATTR_PACKED USB_StdDescriptor_Header_t;
+
+			/** \brief Standard USB Device Descriptor (LUFA naming conventions).
+			 *
+			 *  Type define for a standard Device Descriptor. This structure uses LUFA-specific element names to make each
+			 *  element's purpose clearer.
+			 *
+			 *  \see \ref USB_StdDescriptor_Device_t for the version of this type with standard element names.
+			 *
+			 *  \note Regardless of CPU architecture, these values should be stored as little endian.
+			 */
+			typedef struct
+			{
+				USB_Descriptor_Header_t Header; /**< Descriptor header, including type and size. */
+
+				uint16_t USBSpecification; /**< BCD of the supported USB specification.
+				                            *
+				                            *   \see \ref VERSION_BCD() utility macro.
+				                            */
+				uint8_t  Class; /**< USB device class. */
+				uint8_t  SubClass; /**< USB device subclass. */
+				uint8_t  Protocol; /**< USB device protocol. */
+
+				uint8_t  Endpoint0Size; /**< Size of the control (address 0) endpoint's bank in bytes. */
+
+				uint16_t VendorID; /**< Vendor ID for the USB product. */
+				uint16_t ProductID; /**< Unique product ID for the USB product. */
+				uint16_t ReleaseNumber; /**< Product release (version) number.
+				                         *
+				                         *   \see \ref VERSION_BCD() utility macro.
+				                         */
+				uint8_t  ManufacturerStrIndex; /**< String index for the manufacturer's name. The
+				                                *   host will request this string via a separate
+				                                *   control request for the string descriptor.
+				                                *
+				                                *   \note If no string supplied, use \ref NO_DESCRIPTOR.
+				                                */
+				uint8_t  ProductStrIndex; /**< String index for the product name/details.
+				                           *
+				                           *  \see ManufacturerStrIndex structure entry.
+				                           */
+				uint8_t  SerialNumStrIndex; /**< String index for the product's globally unique hexadecimal
+				                             *   serial number, in uppercase Unicode ASCII.
+				                             *
+				                             *  \note On some microcontroller models, there is an embedded serial number
+				                             *        in the chip which can be used for the device serial number.
+				                             *        To use this serial number, set this to \c USE_INTERNAL_SERIAL.
+				                             *        On unsupported devices, this will evaluate to \ref NO_DESCRIPTOR
+				                             *        and will cause the host to generate a pseudo-unique value for the
+				                             *        device upon insertion.
+				                             *
+				                             *  \see \c ManufacturerStrIndex structure entry.
+				                             */
+				uint8_t  NumberOfConfigurations; /**< Total number of configurations supported by
+				                                  *   the device.
+				                                  */
+			} ATTR_PACKED USB_Descriptor_Device_t;
+
+			/** \brief Standard USB Device Descriptor (USB-IF naming conventions).
+			 *
+			 *  Type define for a standard Device Descriptor. This structure uses the relevant standard's given element names
+			 *  to ensure compatibility with the standard.
+			 *
+			 *  \see \ref USB_Descriptor_Device_t for the version of this type with non-standard LUFA specific element names.
+			 *
+			 *  \note Regardless of CPU architecture, these values should be stored as little endian.
+			 */
+			typedef struct
+			{
+				uint8_t  bLength; /**< Size of the descriptor, in bytes. */
+				uint8_t  bDescriptorType; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a value
+				                              *   given by the specific class.
+				                              */
+				uint16_t bcdUSB; /**< BCD of the supported USB specification.
+				                  *
+				                  *   \see \ref VERSION_BCD() utility macro.
+				                  */
+				uint8_t  bDeviceClass; /**< USB device class. */
+				uint8_t  bDeviceSubClass; /**< USB device subclass. */
+				uint8_t  bDeviceProtocol; /**< USB device protocol. */
+				uint8_t  bMaxPacketSize0; /**< Size of the control (address 0) endpoint's bank in bytes. */
+				uint16_t idVendor; /**< Vendor ID for the USB product. */
+				uint16_t idProduct; /**< Unique product ID for the USB product. */
+				uint16_t bcdDevice; /**< Product release (version) number.
+				                     *
+				                     *   \see \ref VERSION_BCD() utility macro.
+				                     */
+				uint8_t  iManufacturer; /**< String index for the manufacturer's name. The
+				                         *   host will request this string via a separate
+				                         *   control request for the string descriptor.
+				                         *
+				                         *   \note If no string supplied, use \ref NO_DESCRIPTOR.
+				                         */
+				uint8_t  iProduct; /**< String index for the product name/details.
+				                    *
+				                    *  \see ManufacturerStrIndex structure entry.
+				                    */
+				uint8_t iSerialNumber; /**< String index for the product's globally unique hexadecimal
+				                        *   serial number, in uppercase Unicode ASCII.
+				                        *
+				                        *  \note On some microcontroller models, there is an embedded serial number
+				                        *        in the chip which can be used for the device serial number.
+				                        *        To use this serial number, set this to \c USE_INTERNAL_SERIAL.
+				                        *        On unsupported devices, this will evaluate to \ref NO_DESCRIPTOR
+				                        *        and will cause the host to generate a pseudo-unique value for the
+				                        *        device upon insertion.
+				                        *
+				                        *  \see \c ManufacturerStrIndex structure entry.
+				                        */
+				uint8_t  bNumConfigurations; /**< Total number of configurations supported by
+				                              *   the device.
+				                              */
+			} ATTR_PACKED USB_StdDescriptor_Device_t;
+
+			/** \brief Standard USB Device Qualifier Descriptor (LUFA naming conventions).
+			 *
+			 *  Type define for a standard Device Qualifier Descriptor. This structure uses LUFA-specific element names
+			 *  to make each element's purpose clearer.
+			 *
+			 *  \see \ref USB_StdDescriptor_DeviceQualifier_t for the version of this type with standard element names.
+			 */
+			typedef struct
+			{
+				USB_Descriptor_Header_t Header; /**< Descriptor header, including type and size. */
+
+				uint16_t USBSpecification; /**< BCD of the supported USB specification.
+				                            *
+				                            *   \see \ref VERSION_BCD() utility macro.
+				                            */
+				uint8_t  Class; /**< USB device class. */
+				uint8_t  SubClass; /**< USB device subclass. */
+				uint8_t  Protocol; /**< USB device protocol. */
+
+				uint8_t  Endpoint0Size; /**< Size of the control (address 0) endpoint's bank in bytes. */
+				uint8_t  NumberOfConfigurations; /**< Total number of configurations supported by
+				                                  *   the device.
+				                                  */
+				uint8_t  Reserved; /**< Reserved for future use, must be 0. */
+			} ATTR_PACKED USB_Descriptor_DeviceQualifier_t;
+
+			/** \brief Standard USB Device Qualifier Descriptor (USB-IF naming conventions).
+			 *
+			 *  Type define for a standard Device Qualifier Descriptor. This structure uses the relevant standard's given element names
+			 *  to ensure compatibility with the standard.
+			 *
+			 *  \see \ref USB_Descriptor_DeviceQualifier_t for the version of this type with non-standard LUFA specific element names.
+			 */
+			typedef struct
+			{
+				uint8_t  bLength; /**< Size of the descriptor, in bytes. */
+				uint8_t  bDescriptorType; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a value
+				                           *   given by the specific class.
+				                           */
+				uint16_t bcdUSB; /**< BCD of the supported USB specification.
+				                  *
+				                  *   \see \ref VERSION_BCD() utility macro.
+				                  */
+				uint8_t  bDeviceClass; /**< USB device class. */
+				uint8_t  bDeviceSubClass; /**< USB device subclass. */
+				uint8_t  bDeviceProtocol; /**< USB device protocol. */
+				uint8_t  bMaxPacketSize0; /**< Size of the control (address 0) endpoint's bank in bytes. */
+				uint8_t  bNumConfigurations; /**< Total number of configurations supported by
+				                              *   the device.
+				                              */
+				uint8_t  bReserved; /**< Reserved for future use, must be 0. */
+			} ATTR_PACKED USB_StdDescriptor_DeviceQualifier_t;
+
+			/** \brief Standard USB Configuration Descriptor (LUFA naming conventions).
+			 *
+			 *  Type define for a standard Configuration Descriptor header. This structure uses LUFA-specific element names
+			 *  to make each element's purpose clearer.
+			 *
+			 *  \see \ref USB_StdDescriptor_Configuration_Header_t for the version of this type with standard element names.
+			 *
+			 *  \note Regardless of CPU architecture, these values should be stored as little endian.
+			 */
+			typedef struct
+			{
+				USB_Descriptor_Header_t Header; /**< Descriptor header, including type and size. */
+
+				uint16_t TotalConfigurationSize; /**< Size of the configuration descriptor header,
+				                                  *   and all sub descriptors inside the configuration.
+				                                  */
+				uint8_t  TotalInterfaces; /**< Total number of interfaces in the configuration. */
+
+				uint8_t  ConfigurationNumber; /**< Configuration index of the current configuration. */
+				uint8_t  ConfigurationStrIndex; /**< Index of a string descriptor describing the configuration. */
+
+				uint8_t  ConfigAttributes; /**< Configuration attributes, comprised of a mask of \c USB_CONFIG_ATTR_* masks.
+				                            *   On all devices, this should include USB_CONFIG_ATTR_RESERVED at a minimum.
+				                            */
+
+				uint8_t  MaxPowerConsumption; /**< Maximum power consumption of the device while in the
+				                               *   current configuration, calculated by the \ref USB_CONFIG_POWER_MA()
+				                               *   macro.
+				                               */
+			} ATTR_PACKED USB_Descriptor_Configuration_Header_t;
+
+			/** \brief Standard USB Configuration Descriptor (USB-IF naming conventions).
+			 *
+			 *  Type define for a standard Configuration Descriptor header. This structure uses the relevant standard's given element names
+			 *  to ensure compatibility with the standard.
+			 *
+			 *  \see \ref USB_Descriptor_Device_t for the version of this type with non-standard LUFA specific element names.
+			 *
+			 *  \note Regardless of CPU architecture, these values should be stored as little endian.
+			 */
+			typedef struct
+			{
+				uint8_t  bLength; /**< Size of the descriptor, in bytes. */
+				uint8_t  bDescriptorType; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a value
+				                           *   given by the specific class.
+				                           */
+				uint16_t wTotalLength; /**< Size of the configuration descriptor header,
+				                           *   and all sub descriptors inside the configuration.
+				                           */
+				uint8_t  bNumInterfaces; /**< Total number of interfaces in the configuration. */
+				uint8_t  bConfigurationValue; /**< Configuration index of the current configuration. */
+				uint8_t  iConfiguration; /**< Index of a string descriptor describing the configuration. */
+				uint8_t  bmAttributes; /**< Configuration attributes, comprised of a mask of \c USB_CONFIG_ATTR_* masks.
+				                        *   On all devices, this should include USB_CONFIG_ATTR_RESERVED at a minimum.
+				                        */
+				uint8_t  bMaxPower; /**< Maximum power consumption of the device while in the
+				                     *   current configuration, calculated by the \ref USB_CONFIG_POWER_MA()
+				                     *   macro.
+				                     */
+			} ATTR_PACKED USB_StdDescriptor_Configuration_Header_t;
+
+			/** \brief Standard USB Interface Descriptor (LUFA naming conventions).
+			 *
+			 *  Type define for a standard Interface Descriptor. This structure uses LUFA-specific element names
+			 *  to make each element's purpose clearer.
+			 *
+			 *  \see \ref USB_StdDescriptor_Interface_t for the version of this type with standard element names.
+			 *
+			 *  \note Regardless of CPU architecture, these values should be stored as little endian.
+			 */
+			typedef struct
+			{
+				USB_Descriptor_Header_t Header; /**< Descriptor header, including type and size. */
+
+				uint8_t InterfaceNumber; /**< Index of the interface in the current configuration. */
+				uint8_t AlternateSetting; /**< Alternate setting for the interface number. The same
+				                           *   interface number can have multiple alternate settings
+				                           *   with different endpoint configurations, which can be
+				                           *   selected by the host.
+				                           */
+				uint8_t TotalEndpoints; /**< Total number of endpoints in the interface. */
+
+				uint8_t Class; /**< Interface class ID. */
+				uint8_t SubClass; /**< Interface subclass ID. */
+				uint8_t Protocol; /**< Interface protocol ID. */
+
+				uint8_t InterfaceStrIndex; /**< Index of the string descriptor describing the interface. */
+			} ATTR_PACKED USB_Descriptor_Interface_t;
+
+			/** \brief Standard USB Interface Descriptor (USB-IF naming conventions).
+			 *
+			 *  Type define for a standard Interface Descriptor. This structure uses the relevant standard's given element names
+			 *  to ensure compatibility with the standard.
+			 *
+			 *  \see \ref USB_Descriptor_Interface_t for the version of this type with non-standard LUFA specific element names.
+			 *
+			 *  \note Regardless of CPU architecture, these values should be stored as little endian.
+			 */
+			typedef struct
+			{
+				uint8_t bLength; /**< Size of the descriptor, in bytes. */
+				uint8_t bDescriptorType; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a value
+				                          *   given by the specific class.
+				                          */
+				uint8_t bInterfaceNumber; /**< Index of the interface in the current configuration. */
+				uint8_t bAlternateSetting; /**< Alternate setting for the interface number. The same
+				                            *   interface number can have multiple alternate settings
+				                            *   with different endpoint configurations, which can be
+				                            *   selected by the host.
+				                            */
+				uint8_t bNumEndpoints; /**< Total number of endpoints in the interface. */
+				uint8_t bInterfaceClass; /**< Interface class ID. */
+				uint8_t bInterfaceSubClass; /**< Interface subclass ID. */
+				uint8_t bInterfaceProtocol; /**< Interface protocol ID. */
+				uint8_t iInterface; /**< Index of the string descriptor describing the
+				                     *   interface.
+				                     */
+			} ATTR_PACKED USB_StdDescriptor_Interface_t;
+
+			/** \brief Standard USB Interface Association Descriptor (LUFA naming conventions).
+			 *
+			 *  Type define for a standard Interface Association Descriptor. This structure uses LUFA-specific element names
+			 *  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 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.
+			 *
+			 *  \see \ref USB_StdDescriptor_Interface_Association_t for the version of this type with standard element names.
+			 *
+			 *  \note Regardless of CPU architecture, these values should be stored as little endian.
+			 */
+			typedef struct
+			{
+				USB_Descriptor_Header_t Header; /**< Descriptor header, including type and size. */
+
+				uint8_t FirstInterfaceIndex; /**< Index of the first associated interface. */
+				uint8_t TotalInterfaces; /**< Total number of associated interfaces. */
+
+				uint8_t Class; /**< Interface class ID. */
+				uint8_t SubClass; /**< Interface subclass ID. */
+				uint8_t Protocol; /**< Interface protocol ID. */
+
+				uint8_t IADStrIndex; /**< Index of the string descriptor describing the
+				                      *   interface association.
+				                      */
+			} ATTR_PACKED USB_Descriptor_Interface_Association_t;
+
+			/** \brief Standard USB Interface Association Descriptor (USB-IF naming conventions).
+			 *
+			 *  Type define for a standard Interface Association Descriptor. This structure uses the relevant standard's given
+			 *  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 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.
+			 *
+			 *  \see \ref USB_Descriptor_Interface_Association_t for the version of this type with non-standard LUFA specific
+			 *       element names.
+			 *
+			 *  \note Regardless of CPU architecture, these values should be stored as little endian.
+			 */
+			typedef struct
+			{
+				uint8_t bLength; /**< Size of the descriptor, in bytes. */
+				uint8_t bDescriptorType; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a value
+				                          *   given by the specific class.
+				                          */
+				uint8_t bFirstInterface; /**< Index of the first associated interface. */
+				uint8_t bInterfaceCount; /**< Total number of associated interfaces. */
+				uint8_t bFunctionClass; /**< Interface class ID. */
+				uint8_t bFunctionSubClass; /**< Interface subclass ID. */
+				uint8_t bFunctionProtocol; /**< Interface protocol ID. */
+				uint8_t iFunction; /**< Index of the string descriptor describing the
+				                    *   interface association.
+				                    */
+			} ATTR_PACKED USB_StdDescriptor_Interface_Association_t;
+
+			/** \brief Standard USB Endpoint Descriptor (LUFA naming conventions).
+			 *
+			 *  Type define for a standard Endpoint Descriptor. This structure uses LUFA-specific element names
+			 *  to make each element's purpose clearer.
+			 *
+			 *  \see \ref USB_StdDescriptor_Endpoint_t for the version of this type with standard element names.
+			 *
+			 *  \note Regardless of CPU architecture, these values should be stored as little endian.
+			 */
+			typedef struct
+			{
+				USB_Descriptor_Header_t Header; /**< Descriptor header, including type and size. */
+
+				uint8_t  EndpointAddress; /**< Logical address of the endpoint within the device for the current
+				                           *   configuration, including direction mask.
+				                           */
+				uint8_t  Attributes; /**< Endpoint attributes, comprised of a mask of the endpoint type (EP_TYPE_*)
+				                      *   and attributes (ENDPOINT_ATTR_*) masks.
+				                      */
+				uint16_t EndpointSize; /**< Size of the endpoint bank, in bytes. This indicates the maximum packet
+				                        *   size that the endpoint can receive at a time.
+				                        */
+				uint8_t  PollingIntervalMS; /**< Polling interval in milliseconds for the endpoint if it is an INTERRUPT
+				                             *   or ISOCHRONOUS type.
+				                             */
+			} ATTR_PACKED USB_Descriptor_Endpoint_t;
+
+			/** \brief Standard USB Endpoint Descriptor (USB-IF naming conventions).
+			 *
+			 *  Type define for a standard Endpoint Descriptor. This structure uses the relevant standard's given
+			 *  element names to ensure compatibility with the standard.
+			 *
+			 *  \see \ref USB_Descriptor_Endpoint_t for the version of this type with non-standard LUFA specific
+			 *       element names.
+			 *
+			 *  \note Regardless of CPU architecture, these values should be stored as little endian.
+			 */
+			typedef struct
+			{
+				uint8_t  bLength; /**< Size of the descriptor, in bytes. */
+				uint8_t  bDescriptorType; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a
+				                           *   value given by the specific class.
+				                           */
+				uint8_t  bEndpointAddress; /**< Logical address of the endpoint within the device for the current
+				                            *   configuration, including direction mask.
+				                            */
+				uint8_t  bmAttributes; /**< Endpoint attributes, comprised of a mask of the endpoint type (EP_TYPE_*)
+				                        *   and attributes (ENDPOINT_ATTR_*) masks.
+				                        */
+				uint16_t wMaxPacketSize; /**< Size of the endpoint bank, in bytes. This indicates the maximum packet size
+				                          *   that the endpoint can receive at a time.
+				                          */
+				uint8_t  bInterval; /**< Polling interval in milliseconds for the endpoint if it is an INTERRUPT or
+				                     *   ISOCHRONOUS type.
+				                     */
+			} ATTR_PACKED USB_StdDescriptor_Endpoint_t;
+
+			/** \brief Standard USB String Descriptor (LUFA naming conventions).
+			 *
+			 *  Type define for a standard string descriptor. Unlike other standard descriptors, the length
+			 *  of the descriptor for placement in the descriptor header must be determined by the \ref USB_STRING_LEN()
+			 *  macro rather than by the size of the descriptor structure, as the length is not fixed.
+			 *
+			 *  This structure should also be used for string index 0, which contains the supported language IDs for
+			 *  the device as an array.
+			 *
+			 *  This structure uses LUFA-specific element names to make each element's purpose clearer.
+			 *
+			 *  \see \ref USB_StdDescriptor_String_t for the version of this type with standard element names.
+			 *
+			 *  \note Regardless of CPU architecture, these values should be stored as little endian.
+			 */
+			typedef struct
+			{
+				USB_Descriptor_Header_t Header; /**< Descriptor header, including type and size. */
+
+				#if (((ARCH == ARCH_AVR8) || (ARCH == ARCH_XMEGA)) && !defined(__DOXYGEN__))
+				wchar_t  UnicodeString[];
+				#else
+				uint16_t UnicodeString[]; /**< String data, as unicode characters (alternatively,
+				                           *   string language IDs). If normal ASCII characters are
+				                           *   to be used, they must be added as an array of characters
+				                           *   rather than a normal C string so that they are widened to
+				                           *   Unicode size.
+				                           *
+				                           *   Under GCC, strings prefixed with the "L" character (before
+				                           *   the opening string quotation mark) are considered to be
+				                           *   Unicode strings, and may be used instead of an explicit
+				                           *   array of ASCII characters on little endian devices with
+				                           *   UTF-16-LE \c wchar_t encoding.
+				                           */
+				#endif
+			} ATTR_PACKED USB_Descriptor_String_t;
+
+			/** \brief Standard USB String Descriptor (USB-IF naming conventions).
+			 *
+			 *  Type define for a standard string descriptor. Unlike other standard descriptors, the length
+			 *  of the descriptor for placement in the descriptor header must be determined by the \ref USB_STRING_LEN()
+			 *  macro rather than by the size of the descriptor structure, as the length is not fixed.
+			 *
+			 *  This structure should also be used for string index 0, which contains the supported language IDs for
+			 *  the device as an array.
+			 *
+			 *  This structure uses the relevant standard's given element names to ensure compatibility with the standard.
+			 *
+			 *  \see \ref USB_Descriptor_String_t for the version of this type with with non-standard LUFA specific
+			 *       element names.
+			 *
+			 *  \note Regardless of CPU architecture, these values should be stored as little endian.
+			 */
+			typedef struct
+			{
+				uint8_t bLength; /**< Size of the descriptor, in bytes. */
+				uint8_t bDescriptorType; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t
+				                          *   or a value given by the specific class.
+				                          */
+				uint16_t bString[]; /**< String data, as unicode characters (alternatively, string language IDs).
+				                     *   If normal ASCII characters are to be used, they must be added as an array
+				                     *   of characters rather than a normal C string so that they are widened to
+				                     *   Unicode size.
+				                     *
+				                     *   Under GCC, strings prefixed with the "L" character (before the opening string
+				                     *   quotation mark) are considered to be Unicode strings, and may be used instead
+				                     *   of an explicit array of ASCII characters.
+				                     */
+			} ATTR_PACKED USB_StdDescriptor_String_t;
+
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Core/StdRequestType.h b/lib/lufa/LUFA/Drivers/USB/Core/StdRequestType.h
new file mode 100644
index 0000000000..7297806962
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Core/StdRequestType.h
@@ -0,0 +1,258 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief USB control endpoint request definitions.
+ *  \copydetails Group_StdRequest
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the USB driver
+ *        dispatch header located in LUFA/Drivers/USB/USB.h.
+ */
+
+/** \ingroup Group_USB
+ *  \defgroup Group_StdRequest Standard USB Requests
+ *  \brief USB control endpoint request definitions.
+ *
+ *  This module contains definitions for the various control request parameters, so that the request
+ *  details (such as data direction, request recipient, etc.) can be extracted via masking.
+ *
+ *  @{
+ */
+
+#ifndef __STDREQTYPE_H__
+#define __STDREQTYPE_H__
+
+	/* Includes: */
+		#include "../../../Common/Common.h"
+		#include "USBMode.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_USB_DRIVER)
+			#error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Mask for the request type parameter, to indicate the direction of the request data (Host to Device
+			 *  or Device to Host). The result of this mask should then be compared to the request direction masks.
+			 *
+			 *  \see \c REQDIR_* macros for masks indicating the request data direction.
+			 */
+			#define CONTROL_REQTYPE_DIRECTION  0x80
+
+			/** Mask for the request type parameter, to indicate the type of request (Device, Class or Vendor
+			 *  Specific). The result of this mask should then be compared to the request type masks.
+			 *
+			 *  \see \c REQTYPE_* macros for masks indicating the request type.
+			 */
+			#define CONTROL_REQTYPE_TYPE       0x60
+
+			/** Mask for the request type parameter, to indicate the recipient of the request (Device, Interface
+			 *  Endpoint or Other). The result of this mask should then be compared to the request recipient
+			 *  masks.
+			 *
+			 *  \see \c REQREC_* macros for masks indicating the request recipient.
+			 */
+			#define CONTROL_REQTYPE_RECIPIENT  0x1F
+
+			/** \name Control Request Data Direction Masks */
+			//@{
+			/** Request data direction mask, indicating that the request data will flow from host to device.
+			 *
+			 *  \see \ref CONTROL_REQTYPE_DIRECTION macro.
+			 */
+			#define REQDIR_HOSTTODEVICE        (0 << 7)
+
+			/** Request data direction mask, indicating that the request data will flow from device to host.
+			 *
+			 *  \see \ref CONTROL_REQTYPE_DIRECTION macro.
+			 */
+			#define REQDIR_DEVICETOHOST        (1 << 7)
+			//@}
+
+			/** \name Control Request Type Masks */
+			//@{
+			/** Request type mask, indicating that the request is a standard request.
+			 *
+			 *  \see \ref CONTROL_REQTYPE_TYPE macro.
+			 */
+			#define REQTYPE_STANDARD           (0 << 5)
+
+			/** Request type mask, indicating that the request is a class-specific request.
+			 *
+			 *  \see \ref CONTROL_REQTYPE_TYPE macro.
+			 */
+			#define REQTYPE_CLASS              (1 << 5)
+
+			/** Request type mask, indicating that the request is a vendor specific request.
+			 *
+			 *  \see \ref CONTROL_REQTYPE_TYPE macro.
+			 */
+			#define REQTYPE_VENDOR             (2 << 5)
+			//@}
+
+			/** \name Control Request Recipient Masks */
+			//@{
+			/** Request recipient mask, indicating that the request is to be issued to the device as a whole.
+			 *
+			 *  \see \ref CONTROL_REQTYPE_RECIPIENT macro.
+			 */
+			#define REQREC_DEVICE              (0 << 0)
+
+			/** Request recipient mask, indicating that the request is to be issued to an interface in the
+			 *  currently selected configuration.
+			 *
+			 *  \see \ref CONTROL_REQTYPE_RECIPIENT macro.
+			 */
+			#define REQREC_INTERFACE           (1 << 0)
+
+			/** Request recipient mask, indicating that the request is to be issued to an endpoint in the
+			 *  currently selected configuration.
+			 *
+			 *  \see \ref CONTROL_REQTYPE_RECIPIENT macro.
+			 */
+			#define REQREC_ENDPOINT            (2 << 0)
+
+			/** Request recipient mask, indicating that the request is to be issued to an unspecified element
+			 *  in the currently selected configuration.
+			 *
+			 *  \see \ref CONTROL_REQTYPE_RECIPIENT macro.
+			 */
+			#define REQREC_OTHER               (3 << 0)
+			//@}
+
+		/* Type Defines: */
+			/** \brief Standard USB Control Request
+			 *
+			 *  Type define for a standard USB control request.
+			 *
+			 *  \see The USB 2.0 specification for more information on standard control requests.
+			 */
+			typedef struct
+			{
+				uint8_t  bmRequestType; /**< Type of the request. */
+				uint8_t  bRequest; /**< Request command code. */
+				uint16_t wValue; /**< wValue parameter of the request. */
+				uint16_t wIndex; /**< wIndex parameter of the request. */
+				uint16_t wLength; /**< Length of the data to transfer in bytes. */
+			} ATTR_PACKED USB_Request_Header_t;
+
+		/* Enums: */
+			/** Enumeration for the various standard request commands. These commands are applicable when the
+			 *  request type is \ref REQTYPE_STANDARD (with the exception of \ref REQ_GetDescriptor, which is always
+			 *  handled regardless of the request type value).
+			 *
+			 *  \see Chapter 9 of the USB 2.0 Specification.
+			 */
+			enum USB_Control_Request_t
+			{
+				REQ_GetStatus           = 0, /**< Implemented in the library for device and endpoint recipients. Passed
+				                              *   to the user application for other recipients via the
+				                              *   \ref EVENT_USB_Device_ControlRequest() event when received in
+				                              *   device mode. */
+				REQ_ClearFeature        = 1, /**< Implemented in the library for device and endpoint recipients. Passed
+				                              *   to the user application for other recipients via the
+				                              *   \ref EVENT_USB_Device_ControlRequest() event when received in
+				                              *   device mode. */
+				REQ_SetFeature          = 3, /**< Implemented in the library for device and endpoint recipients. Passed
+				                              *   to the user application for other recipients via the
+				                              *   \ref EVENT_USB_Device_ControlRequest() event when received in
+				                              *   device mode. */
+				REQ_SetAddress          = 5, /**< Implemented in the library for the device recipient. Passed
+				                              *   to the user application for other recipients via the
+				                              *   \ref EVENT_USB_Device_ControlRequest() event when received in
+				                              *   device mode. */
+				REQ_GetDescriptor       = 6, /**< Implemented in the library for device and interface recipients. Passed to the
+				                              *   user application for other recipients via the
+				                              *   \ref EVENT_USB_Device_ControlRequest() event when received in
+				                              *   device mode. */
+				REQ_SetDescriptor       = 7, /**< Not implemented in the library, passed to the user application
+				                              *   via the \ref EVENT_USB_Device_ControlRequest() event when received in
+				                              *   device mode. */
+				REQ_GetConfiguration    = 8, /**< Implemented in the library for the device recipient. Passed
+				                              *   to the user application for other recipients via the
+				                              *   \ref EVENT_USB_Device_ControlRequest() event when received in
+				                              *   device mode. */
+				REQ_SetConfiguration    = 9, /**< Implemented in the library for the device recipient. Passed
+				                              *   to the user application for other recipients via the
+				                              *   \ref EVENT_USB_Device_ControlRequest() event when received in
+				                              *   device mode. */
+				REQ_GetInterface        = 10, /**< Not implemented in the library, passed to the user application
+				                              *   via the \ref EVENT_USB_Device_ControlRequest() event when received in
+				                              *   device mode. */
+				REQ_SetInterface        = 11, /**< Not implemented in the library, passed to the user application
+				                              *   via the \ref EVENT_USB_Device_ControlRequest() event when received in
+				                              *   device mode. */
+				REQ_SynchFrame          = 12, /**< Not implemented in the library, passed to the user application
+				                              *   via the \ref EVENT_USB_Device_ControlRequest() event when received in
+				                              *   device mode. */
+			};
+
+			/** Feature Selector values for Set Feature and Clear Feature standard control requests directed to the device, interface
+			 *  and endpoint recipients.
+			 */
+			enum USB_Feature_Selectors_t
+			{
+				FEATURE_SEL_EndpointHalt       = 0x00, /**< Feature selector for Clear Feature or Set Feature commands. When
+				                                        *   used in a Set Feature or Clear Feature request this indicates that an
+				                                        *   endpoint (whose address is given elsewhere in the request) should have
+				                                        *   its stall condition changed.
+				                                        */
+				FEATURE_SEL_DeviceRemoteWakeup = 0x01, /**< Feature selector for Device level Remote Wakeup enable set or clear.
+			                                            *   This feature can be controlled by the host on devices which indicate
+			                                            *   remote wakeup support in their descriptors to selectively disable or
+			                                            *   enable remote wakeup.
+			                                            */
+				FEATURE_SEL_TestMode           = 0x02, /**< Feature selector for Test Mode features, used to test the USB controller
+			                                            *   to check for incorrect operation.
+			                                            */
+			};
+
+	/* Private Interface - For use in library only: */
+		#if !defined(__DOXYGEN__)
+			/* Macros: */
+				#define FEATURE_SELFPOWERED_ENABLED     (1 << 0)
+				#define FEATURE_REMOTE_WAKEUP_ENABLED   (1 << 1)
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Core/UC3/Device_UC3.c b/lib/lufa/LUFA/Drivers/USB/Core/UC3/Device_UC3.c
new file mode 100644
index 0000000000..3aa1433f53
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Core/UC3/Device_UC3.c
@@ -0,0 +1,51 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+#include "../../../../Common/Common.h"
+#if (ARCH == ARCH_UC3)
+
+#define  __INCLUDE_FROM_USB_DRIVER
+#include "../USBMode.h"
+
+#if defined(USB_CAN_BE_DEVICE)
+
+#include "../Device.h"
+
+void USB_Device_SendRemoteWakeup(void)
+{
+	USB_CLK_Unfreeze();
+
+	AVR32_USBB.UDCON.rmwkup = true;
+	while (AVR32_USBB.UDCON.rmwkup);
+}
+
+#endif
+
+#endif
diff --git a/lib/lufa/LUFA/Drivers/USB/Core/UC3/Device_UC3.h b/lib/lufa/LUFA/Drivers/USB/Core/UC3/Device_UC3.h
new file mode 100644
index 0000000000..fd6dbde887
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Core/UC3/Device_UC3.h
@@ -0,0 +1,267 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief USB Device definitions for the AVR32 UC3 microcontrollers.
+ *  \copydetails Group_Device_UC3
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the USB driver
+ *        dispatch header located in LUFA/Drivers/USB/USB.h.
+ */
+
+/** \ingroup Group_Device
+ *  \defgroup Group_Device_UC3 Device Management (UC3)
+ *  \brief USB Device definitions for the AVR32 UC3 microcontrollers.
+ *
+ *  Architecture specific USB Device definitions for the Atmel 32-bit UC3 AVR microcontrollers.
+ *
+ *  @{
+ */
+
+#ifndef __USBDEVICE_UC3_H__
+#define __USBDEVICE_UC3_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+		#include "../USBController.h"
+		#include "../StdDescriptors.h"
+		#include "../USBInterrupt.h"
+		#include "../Endpoint.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_USB_DRIVER)
+			#error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** \name USB Device Mode Option Masks */
+			//@{
+			/** Mask for the Options parameter of the \ref USB_Init() function. This indicates that the
+			 *  USB interface should be initialized in low speed (1.5Mb/s) mode.
+			 *
+			 *  \note Restrictions apply on the number, size and type of endpoints which can be used
+			 *        when running in low speed mode - please refer to the USB 2.0 specification.
+			 */
+			#define USB_DEVICE_OPT_LOWSPEED                (1 << 0)
+
+			/** Mask for the Options parameter of the \ref USB_Init() function. This indicates that the
+			 *  USB interface should be initialized in full speed (12Mb/s) mode.
+			 */
+			#define USB_DEVICE_OPT_FULLSPEED               (0 << 0)
+
+			#if defined(USB_SERIES_UC3A3_AVR32) || defined(USB_SERIES_UC3A4_AVR32) || defined(__DOXYGEN__)
+				/** Mask for the Options parameter of the \ref USB_Init() function. This indicates that the
+				 *  USB interface should be initialized in high speed (480Mb/s) mode.
+				 */
+				#define USB_DEVICE_OPT_HIGHSPEED           (1 << 1)
+			#endif
+			//@}
+
+			#if (!defined(NO_INTERNAL_SERIAL) && \
+			     (defined(USB_SERIES_UC3A3_AVR32) || defined(USB_SERIES_UC3A4_AVR32) || \
+				  defined(__DOXYGEN__)))
+				/** String descriptor index for the device's unique serial number string descriptor within the device.
+				 *  This unique serial number is used by the host to associate resources to the device (such as drivers or COM port
+				 *  number allocations) to a device regardless of the port it is plugged in to on the host. Some microcontrollers contain
+				 *  a unique serial number internally, and setting the device descriptors serial number string index to this value
+				 *  will cause it to use the internal serial number.
+				 *
+				 *  On unsupported devices, this will evaluate to \ref NO_DESCRIPTOR and so will force the host to create a pseudo-serial
+				 *  number for the device.
+				 */
+				#define USE_INTERNAL_SERIAL             0xDC
+
+				/** Length of the device's unique internal serial number, in bits, if present on the selected microcontroller
+				 *  model.
+				 */
+				#define INTERNAL_SERIAL_LENGTH_BITS     120
+
+				/** Start address of the internal serial number, in the appropriate address space, if present on the selected microcontroller
+				 *  model.
+				 */
+				#define INTERNAL_SERIAL_START_ADDRESS   0x80800204
+			#else
+				#define USE_INTERNAL_SERIAL             NO_DESCRIPTOR
+
+				#define INTERNAL_SERIAL_LENGTH_BITS     0
+				#define INTERNAL_SERIAL_START_ADDRESS   0
+			#endif
+
+		/* Function Prototypes: */
+			/** Sends a Remote Wakeup request to the host. This signals to the host that the device should
+			 *  be taken out of suspended mode, and communications should resume.
+			 *
+			 *  Typically, this is implemented so that HID devices (mice, keyboards, etc.) can wake up the
+			 *  host computer when the host has suspended all USB devices to enter a low power state.
+			 *
+			 *  \note This function should only be used if the device has indicated to the host that it
+			 *        supports the Remote Wakeup feature in the device descriptors, and should only be
+			 *        issued if the host is currently allowing remote wakeup events from the device (i.e.,
+			 *        the \ref USB_Device_RemoteWakeupEnabled flag is set). When the \c NO_DEVICE_REMOTE_WAKEUP
+			 *        compile time option is used, this function is unavailable.
+			 *
+			 *  \note The USB clock must be running for this function to operate. If the stack is initialized with
+			 *        the \ref USB_OPT_MANUAL_PLL option enabled, the user must ensure that the PLL is running
+			 *        before attempting to call this function.
+			 *
+			 *  \see \ref Group_StdDescriptors for more information on the RMWAKEUP feature and device descriptors.
+			 */
+			void USB_Device_SendRemoteWakeup(void);
+
+		/* Inline Functions: */
+			/** Returns the current USB frame number, when in device mode. Every millisecond the USB bus is active (i.e. enumerated to a host)
+			 *  the frame number is incremented by one.
+			 *
+			 *  \return Current USB frame number from the USB controller.
+			 */
+			static inline uint16_t USB_Device_GetFrameNumber(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT;
+			static inline uint16_t USB_Device_GetFrameNumber(void)
+			{
+				return AVR32_USBB.UDFNUM.fnum;
+			}
+
+			#if !defined(NO_SOF_EVENTS)
+				/** Enables the device mode Start Of Frame events. When enabled, this causes the
+				 *  \ref EVENT_USB_Device_StartOfFrame() event to fire once per millisecond, synchronized to the USB bus,
+				 *  at the start of each USB frame when enumerated in device mode.
+				 *
+				 *  \note Not available when the \c NO_SOF_EVENTS compile time token is defined.
+				 */
+				static inline void USB_Device_EnableSOFEvents(void) ATTR_ALWAYS_INLINE;
+				static inline void USB_Device_EnableSOFEvents(void)
+				{
+					USB_INT_Enable(USB_INT_SOFI);
+				}
+
+				/** Disables the device mode Start Of Frame events. When disabled, this stops the firing of the
+				 *  \ref EVENT_USB_Device_StartOfFrame() event when enumerated in device mode.
+				 *
+				 *  \note Not available when the \c NO_SOF_EVENTS compile time token is defined.
+				 */
+				static inline void USB_Device_DisableSOFEvents(void) ATTR_ALWAYS_INLINE;
+				static inline void USB_Device_DisableSOFEvents(void)
+				{
+					USB_INT_Disable(USB_INT_SOFI);
+				}
+			#endif
+
+	/* Private Interface - For use in library only: */
+	#if !defined(__DOXYGEN__)
+		/* Inline Functions: */
+			static inline void USB_Device_SetLowSpeed(void) ATTR_ALWAYS_INLINE;
+			static inline void USB_Device_SetLowSpeed(void)
+			{
+				AVR32_USBB.UDCON.ls      = true;
+			}
+
+			static inline void USB_Device_SetFullSpeed(void) ATTR_ALWAYS_INLINE;
+			static inline void USB_Device_SetFullSpeed(void)
+			{
+				AVR32_USBB.UDCON.ls      = false;
+				#if defined(USB_DEVICE_OPT_HIGHSPEED)
+				AVR32_USBB.UDCON.spdconf = 3;
+				#endif
+			}
+
+			#if defined(USB_DEVICE_OPT_HIGHSPEED)
+			static inline void USB_Device_SetHighSpeed(void) ATTR_ALWAYS_INLINE;
+			static inline void USB_Device_SetHighSpeed(void)
+			{
+				AVR32_USBB.UDCON.ls      = false;
+				AVR32_USBB.UDCON.spdconf = 0;
+			}
+			#endif
+
+			static inline void USB_Device_SetDeviceAddress(const uint8_t Address) ATTR_ALWAYS_INLINE;
+			static inline void USB_Device_SetDeviceAddress(const uint8_t Address)
+			{
+				AVR32_USBB.UDCON.uadd  = Address;
+			}
+
+			static inline void USB_Device_EnableDeviceAddress(const uint8_t Address) ATTR_ALWAYS_INLINE;
+			static inline void USB_Device_EnableDeviceAddress(const uint8_t Address)
+			{
+				(void)Address;
+
+				AVR32_USBB.UDCON.adden = true;
+			}
+
+			static inline bool USB_Device_IsAddressSet(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT;
+			static inline bool USB_Device_IsAddressSet(void)
+			{
+				return AVR32_USBB.UDCON.adden;
+			}
+
+			#if (USE_INTERNAL_SERIAL != NO_DESCRIPTOR)
+			static inline void USB_Device_GetSerialString(uint16_t* const UnicodeString) ATTR_NON_NULL_PTR_ARG(1);
+			static inline void USB_Device_GetSerialString(uint16_t* const UnicodeString)
+			{
+				uint_reg_t CurrentGlobalInt = GetGlobalInterruptMask();
+				GlobalInterruptDisable();
+
+				uint8_t* SigReadAddress = (uint8_t*)INTERNAL_SERIAL_START_ADDRESS;
+
+				for (uint8_t SerialCharNum = 0; SerialCharNum < (INTERNAL_SERIAL_LENGTH_BITS / 4); SerialCharNum++)
+				{
+					uint8_t SerialByte = *SigReadAddress;
+
+					if (SerialCharNum & 0x01)
+					{
+						SerialByte >>= 4;
+						SigReadAddress++;
+					}
+
+					SerialByte &= 0x0F;
+
+					UnicodeString[SerialCharNum] = cpu_to_le16((SerialByte >= 10) ?
+															   (('A' - 10) + SerialByte) : ('0' + SerialByte));
+				}
+
+				SetGlobalInterruptMask(CurrentGlobalInt);
+			}
+			#endif
+
+	#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Core/UC3/EndpointStream_UC3.c b/lib/lufa/LUFA/Drivers/USB/Core/UC3/EndpointStream_UC3.c
new file mode 100644
index 0000000000..04f6e97d65
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Core/UC3/EndpointStream_UC3.c
@@ -0,0 +1,235 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+#include "../../../../Common/Common.h"
+#if (ARCH == ARCH_UC3)
+
+#define  __INCLUDE_FROM_USB_DRIVER
+#include "../USBMode.h"
+
+#if defined(USB_CAN_BE_DEVICE)
+
+#include "EndpointStream_UC3.h"
+
+#if !defined(CONTROL_ONLY_DEVICE)
+uint8_t Endpoint_Discard_Stream(uint16_t Length,
+                                uint16_t* const BytesProcessed)
+{
+	uint8_t  ErrorCode;
+	uint16_t BytesInTransfer = 0;
+
+	if ((ErrorCode = Endpoint_WaitUntilReady()))
+	  return ErrorCode;
+
+	if (BytesProcessed != NULL)
+	  Length -= *BytesProcessed;
+
+	while (Length)
+	{
+		if (!(Endpoint_IsReadWriteAllowed()))
+		{
+			Endpoint_ClearOUT();
+
+			if (BytesProcessed != NULL)
+			{
+				*BytesProcessed += BytesInTransfer;
+				return ENDPOINT_RWSTREAM_IncompleteTransfer;
+			}
+
+			if ((ErrorCode = Endpoint_WaitUntilReady()))
+			  return ErrorCode;
+		}
+		else
+		{
+			Endpoint_Discard_8();
+
+			Length--;
+			BytesInTransfer++;
+		}
+	}
+
+	return ENDPOINT_RWSTREAM_NoError;
+}
+
+uint8_t Endpoint_Null_Stream(uint16_t Length,
+                             uint16_t* const BytesProcessed)
+{
+	uint8_t  ErrorCode;
+	uint16_t BytesInTransfer = 0;
+
+	if ((ErrorCode = Endpoint_WaitUntilReady()))
+	  return ErrorCode;
+
+	if (BytesProcessed != NULL)
+	  Length -= *BytesProcessed;
+
+	while (Length)
+	{
+		if (!(Endpoint_IsReadWriteAllowed()))
+		{
+			Endpoint_ClearIN();
+
+			if (BytesProcessed != NULL)
+			{
+				*BytesProcessed += BytesInTransfer;
+				return ENDPOINT_RWSTREAM_IncompleteTransfer;
+			}
+
+			if ((ErrorCode = Endpoint_WaitUntilReady()))
+			  return ErrorCode;
+		}
+		else
+		{
+			Endpoint_Write_8(0);
+
+			Length--;
+			BytesInTransfer++;
+		}
+	}
+
+	return ENDPOINT_RWSTREAM_NoError;
+}
+
+/* The following abuses the C preprocessor in order to copy-paste common code with slight alterations,
+ * so that the code needs to be written once. It is a crude form of templating to reduce code maintenance. */
+
+#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_Stream_LE
+#define  TEMPLATE_BUFFER_TYPE                      const void*
+#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearIN()
+#define  TEMPLATE_BUFFER_OFFSET(Length)            0
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_8(*BufferPtr)
+#include "Template/Template_Endpoint_RW.c"
+
+#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_Stream_BE
+#define  TEMPLATE_BUFFER_TYPE                      const void*
+#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearIN()
+#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_8(*BufferPtr)
+#include "Template/Template_Endpoint_RW.c"
+
+#define  TEMPLATE_FUNC_NAME                        Endpoint_Read_Stream_LE
+#define  TEMPLATE_BUFFER_TYPE                      void*
+#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearOUT()
+#define  TEMPLATE_BUFFER_OFFSET(Length)            0
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         *BufferPtr = Endpoint_Read_8()
+#include "Template/Template_Endpoint_RW.c"
+
+#define  TEMPLATE_FUNC_NAME                        Endpoint_Read_Stream_BE
+#define  TEMPLATE_BUFFER_TYPE                      void*
+#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearOUT()
+#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         *BufferPtr = Endpoint_Read_8()
+#include "Template/Template_Endpoint_RW.c"
+
+#if defined(ARCH_HAS_FLASH_ADDRESS_SPACE)
+	#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_PStream_LE
+	#define  TEMPLATE_BUFFER_TYPE                      const void*
+	#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearIN()
+	#define  TEMPLATE_BUFFER_OFFSET(Length)            0
+	#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount
+	#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_8(pgm_read_byte(BufferPtr))
+	#include "Template/Template_Endpoint_RW.c"
+
+	#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_PStream_BE
+	#define  TEMPLATE_BUFFER_TYPE                      const void*
+	#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearIN()
+	#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)
+	#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount
+	#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_8(pgm_read_byte(BufferPtr))
+	#include "Template/Template_Endpoint_RW.c"
+#endif
+
+#if defined(ARCH_HAS_EEPROM_ADDRESS_SPACE)
+	#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_EStream_LE
+	#define  TEMPLATE_BUFFER_TYPE                      const void*
+	#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearIN()
+	#define  TEMPLATE_BUFFER_OFFSET(Length)            0
+	#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount
+	#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_8(eeprom_read_byte(BufferPtr))
+	#include "Template/Template_Endpoint_RW.c"
+
+	#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_EStream_BE
+	#define  TEMPLATE_BUFFER_TYPE                      const void*
+	#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearIN()
+	#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)
+	#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount
+	#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_8(eeprom_read_byte(BufferPtr))
+	#include "Template/Template_Endpoint_RW.c"
+
+	#define  TEMPLATE_FUNC_NAME                        Endpoint_Read_EStream_LE
+	#define  TEMPLATE_BUFFER_TYPE                      void*
+	#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearOUT()
+	#define  TEMPLATE_BUFFER_OFFSET(Length)            0
+	#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount
+	#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         eeprom_update_byte(BufferPtr, Endpoint_Read_8())
+	#include "Template/Template_Endpoint_RW.c"
+
+	#define  TEMPLATE_FUNC_NAME                        Endpoint_Read_EStream_BE
+	#define  TEMPLATE_BUFFER_TYPE                      void*
+	#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearOUT()
+	#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)
+	#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount
+	#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         eeprom_update_byte(BufferPtr, Endpoint_Read_8())
+	#include "Template/Template_Endpoint_RW.c"
+#endif
+
+#endif
+
+#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_Control_Stream_LE
+#define  TEMPLATE_BUFFER_OFFSET(Length)            0
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_8(*BufferPtr)
+#include "Template/Template_Endpoint_Control_W.c"
+
+#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_Control_Stream_BE
+#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_8(*BufferPtr)
+#include "Template/Template_Endpoint_Control_W.c"
+
+#define  TEMPLATE_FUNC_NAME                        Endpoint_Read_Control_Stream_LE
+#define  TEMPLATE_BUFFER_OFFSET(Length)            0
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         *BufferPtr = Endpoint_Read_8()
+#include "Template/Template_Endpoint_Control_R.c"
+
+#define  TEMPLATE_FUNC_NAME                        Endpoint_Read_Control_Stream_BE
+#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         *BufferPtr = Endpoint_Read_8()
+#include "Template/Template_Endpoint_Control_R.c"
+
+#endif
+
+#endif
diff --git a/lib/lufa/LUFA/Drivers/USB/Core/UC3/EndpointStream_UC3.h b/lib/lufa/LUFA/Drivers/USB/Core/UC3/EndpointStream_UC3.h
new file mode 100644
index 0000000000..8b1c10eb09
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Core/UC3/EndpointStream_UC3.h
@@ -0,0 +1,438 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Endpoint data stream transmission and reception management for the AVR32 UC3 microcontrollers.
+ *  \copydetails Group_EndpointStreamRW_UC3
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the USB driver
+ *        dispatch header located in LUFA/Drivers/USB/USB.h.
+ */
+
+/** \ingroup Group_EndpointStreamRW
+ *  \defgroup Group_EndpointStreamRW_UC3 Read/Write of Multi-Byte Streams (UC3)
+ *  \brief Endpoint data stream transmission and reception management for the Atmel AVR32 UC3 architecture.
+ *
+ *  Functions, macros, variables, enums and types related to data reading and writing of data streams from
+ *  and to endpoints.
+ *
+ *  @{
+ */
+
+#ifndef __ENDPOINT_STREAM_UC3_H__
+#define __ENDPOINT_STREAM_UC3_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+		#include "../USBMode.h"
+		#include "../USBTask.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_USB_DRIVER)
+			#error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Function Prototypes: */
+			/** \name Stream functions for null data */
+			//@{
+
+			/** Reads and discards the given number of bytes from the currently selected endpoint's bank,
+			 *  discarding fully read packets from the host as needed. The last packet is not automatically
+			 *  discarded once the remaining bytes has been read; the user is responsible for manually
+			 *  discarding the last packet from the host via the \ref Endpoint_ClearOUT() macro.
+			 *
+			 *  If the BytesProcessed parameter is \c NULL, the entire stream transfer is attempted at once,
+			 *  failing or succeeding as a single unit. If the BytesProcessed parameter points to a valid
+			 *  storage location, the transfer will instead be performed as a series of chunks. Each time
+			 *  the endpoint bank becomes empty while there is still data to process (and after the current
+			 *  packet has been acknowledged) the BytesProcessed location will be updated with the total number
+			 *  of bytes processed in the stream, and the function will exit with an error code of
+			 *  \ref ENDPOINT_RWSTREAM_IncompleteTransfer. This allows for any abort checking to be performed
+			 *  in the user code - to continue the transfer, call the function again with identical parameters
+			 *  and it will resume until the BytesProcessed value reaches the total transfer length.
+			 *
+			 *  <b>Single Stream Transfer Example:</b>
+			 *  \code
+			 *  uint8_t ErrorCode;
+			 *
+			 *  if ((ErrorCode = Endpoint_Discard_Stream(512, NULL)) != ENDPOINT_RWSTREAM_NoError)
+			 *  {
+			 *       // Stream failed to complete - check ErrorCode here
+			 *  }
+			 *  \endcode
+			 *
+			 *  <b>Partial Stream Transfers Example:</b>
+			 *  \code
+			 *  uint8_t  ErrorCode;
+			 *  uint16_t BytesProcessed;
+			 *
+			 *  BytesProcessed = 0;
+			 *  while ((ErrorCode = Endpoint_Discard_Stream(512, &BytesProcessed)) == ENDPOINT_RWSTREAM_IncompleteTransfer)
+			 *  {
+			 *      // Stream not yet complete - do other actions here, abort if required
+			 *  }
+			 *
+			 *  if (ErrorCode != ENDPOINT_RWSTREAM_NoError)
+			 *  {
+			 *      // Stream failed to complete - check ErrorCode here
+			 *  }
+			 *  \endcode
+			 *
+			 *  \note This routine should not be used on CONTROL type endpoints.
+			 *
+			 *  \param[in] Length          Number of bytes to discard via the currently selected endpoint.
+			 *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes processed in the current
+			 *                             transaction should be updated, \c NULL if the entire stream should be read at once.
+			 *
+			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t Endpoint_Discard_Stream(uint16_t Length,
+			                                uint16_t* const BytesProcessed);
+
+			/** Writes a given number of zeroed bytes to the currently selected endpoint's bank, sending
+			 *  full packets to the host as needed. The last packet is not automatically sent once the
+			 *  remaining bytes have been written; the user is responsible for manually sending the last
+			 *  packet to the host via the \ref Endpoint_ClearIN() macro.
+			 *
+			 *  If the BytesProcessed parameter is \c NULL, the entire stream transfer is attempted at once,
+			 *  failing or succeeding as a single unit. If the BytesProcessed parameter points to a valid
+			 *  storage location, the transfer will instead be performed as a series of chunks. Each time
+			 *  the endpoint bank becomes full while there is still data to process (and after the current
+			 *  packet transmission has been initiated) the BytesProcessed location will be updated with the
+			 *  total number of bytes processed in the stream, and the function will exit with an error code of
+			 *  \ref ENDPOINT_RWSTREAM_IncompleteTransfer. This allows for any abort checking to be performed
+			 *  in the user code - to continue the transfer, call the function again with identical parameters
+			 *  and it will resume until the BytesProcessed value reaches the total transfer length.
+			 *
+			 *  <b>Single Stream Transfer Example:</b>
+			 *  \code
+			 *  uint8_t ErrorCode;
+			 *
+			 *  if ((ErrorCode = Endpoint_Null_Stream(512, NULL)) != ENDPOINT_RWSTREAM_NoError)
+			 *  {
+			 *       // Stream failed to complete - check ErrorCode here
+			 *  }
+			 *  \endcode
+			 *
+			 *  <b>Partial Stream Transfers Example:</b>
+			 *  \code
+			 *  uint8_t  ErrorCode;
+			 *  uint16_t BytesProcessed;
+			 *
+			 *  BytesProcessed = 0;
+			 *  while ((ErrorCode = Endpoint_Null_Stream(512, &BytesProcessed)) == ENDPOINT_RWSTREAM_IncompleteTransfer)
+			 *  {
+			 *      // Stream not yet complete - do other actions here, abort if required
+			 *  }
+			 *
+			 *  if (ErrorCode != ENDPOINT_RWSTREAM_NoError)
+			 *  {
+			 *      // Stream failed to complete - check ErrorCode here
+			 *  }
+			 *  \endcode
+			 *
+			 *  \note This routine should not be used on CONTROL type endpoints.
+			 *
+			 *  \param[in] Length          Number of zero bytes to send via the currently selected endpoint.
+			 *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes processed in the current
+			 *                             transaction should be updated, \c NULL if the entire stream should be read at once.
+			 *
+			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t Endpoint_Null_Stream(uint16_t Length,
+			                             uint16_t* const BytesProcessed);
+
+			//@}
+
+			/** \name Stream functions for RAM source/destination data */
+			//@{
+
+			/** Writes the given number of bytes to the endpoint from the given buffer in little endian,
+			 *  sending full packets to the host as needed. The last packet filled is not automatically sent;
+			 *  the user is responsible for manually sending the last written packet to the host via the
+			 *  \ref Endpoint_ClearIN() macro.
+			 *
+			 *  If the BytesProcessed parameter is \c NULL, the entire stream transfer is attempted at once,
+			 *  failing or succeeding as a single unit. If the BytesProcessed parameter points to a valid
+			 *  storage location, the transfer will instead be performed as a series of chunks. Each time
+			 *  the endpoint bank becomes full while there is still data to process (and after the current
+			 *  packet transmission has been initiated) the BytesProcessed location will be updated with the
+			 *  total number of bytes processed in the stream, and the function will exit with an error code of
+			 *  \ref ENDPOINT_RWSTREAM_IncompleteTransfer. This allows for any abort checking to be performed
+			 *  in the user code - to continue the transfer, call the function again with identical parameters
+			 *  and it will resume until the BytesProcessed value reaches the total transfer length.
+			 *
+			 *  <b>Single Stream Transfer Example:</b>
+			 *  \code
+			 *  uint8_t DataStream[512];
+			 *  uint8_t ErrorCode;
+			 *
+			 *  if ((ErrorCode = Endpoint_Write_Stream_LE(DataStream, sizeof(DataStream),
+			 *                                            NULL)) != ENDPOINT_RWSTREAM_NoError)
+			 *  {
+			 *       // Stream failed to complete - check ErrorCode here
+			 *  }
+			 *  \endcode
+			 *
+			 *  <b>Partial Stream Transfers Example:</b>
+			 *  \code
+			 *  uint8_t  DataStream[512];
+			 *  uint8_t  ErrorCode;
+			 *  uint16_t BytesProcessed;
+			 *
+			 *  BytesProcessed = 0;
+			 *  while ((ErrorCode = Endpoint_Write_Stream_LE(DataStream, sizeof(DataStream),
+			 *                                               &BytesProcessed)) == ENDPOINT_RWSTREAM_IncompleteTransfer)
+			 *  {
+			 *      // Stream not yet complete - do other actions here, abort if required
+			 *  }
+			 *
+			 *  if (ErrorCode != ENDPOINT_RWSTREAM_NoError)
+			 *  {
+			 *      // Stream failed to complete - check ErrorCode here
+			 *  }
+			 *  \endcode
+			 *
+			 *  \note This routine should not be used on CONTROL type endpoints.
+			 *
+			 *  \param[in] Buffer          Pointer to the source data buffer to read from.
+			 *  \param[in] Length          Number of bytes to read for the currently selected endpoint into the buffer.
+			 *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes processed in the current
+			 *                             transaction should be updated, \c NULL if the entire stream should be written at once.
+			 *
+			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t Endpoint_Write_Stream_LE(const void* const Buffer,
+			                                 uint16_t Length,
+			                                 uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Writes the given number of bytes to the endpoint from the given buffer in big endian,
+			 *  sending full packets to the host as needed. The last packet filled is not automatically sent;
+			 *  the user is responsible for manually sending the last written packet to the host via the
+			 *  \ref Endpoint_ClearIN() macro.
+			 *
+			 *  \note This routine should not be used on CONTROL type endpoints.
+			 *
+			 *  \param[in] Buffer          Pointer to the source data buffer to read from.
+			 *  \param[in] Length          Number of bytes to read for the currently selected endpoint into the buffer.
+			 *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes processed in the current
+			 *                             transaction should be updated, \c NULL if the entire stream should be written at once.
+			 *
+			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t Endpoint_Write_Stream_BE(const void* const Buffer,
+			                                 uint16_t Length,
+			                                 uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Reads the given number of bytes from the endpoint from the given buffer in little endian,
+			 *  discarding fully read packets from the host as needed. The last packet is not automatically
+			 *  discarded once the remaining bytes has been read; the user is responsible for manually
+			 *  discarding the last packet from the host via the \ref Endpoint_ClearOUT() macro.
+			 *
+			 *  If the BytesProcessed parameter is \c NULL, the entire stream transfer is attempted at once,
+			 *  failing or succeeding as a single unit. If the BytesProcessed parameter points to a valid
+			 *  storage location, the transfer will instead be performed as a series of chunks. Each time
+			 *  the endpoint bank becomes empty while there is still data to process (and after the current
+			 *  packet has been acknowledged) the BytesProcessed location will be updated with the total number
+			 *  of bytes processed in the stream, and the function will exit with an error code of
+			 *  \ref ENDPOINT_RWSTREAM_IncompleteTransfer. This allows for any abort checking to be performed
+			 *  in the user code - to continue the transfer, call the function again with identical parameters
+			 *  and it will resume until the BytesProcessed value reaches the total transfer length.
+			 *
+			 *  <b>Single Stream Transfer Example:</b>
+			 *  \code
+			 *  uint8_t DataStream[512];
+			 *  uint8_t ErrorCode;
+			 *
+			 *  if ((ErrorCode = Endpoint_Read_Stream_LE(DataStream, sizeof(DataStream),
+			 *                                           NULL)) != ENDPOINT_RWSTREAM_NoError)
+			 *  {
+			 *       // Stream failed to complete - check ErrorCode here
+			 *  }
+			 *  \endcode
+			 *
+			 *  <b>Partial Stream Transfers Example:</b>
+			 *  \code
+			 *  uint8_t  DataStream[512];
+			 *  uint8_t  ErrorCode;
+			 *  uint16_t BytesProcessed;
+			 *
+			 *  BytesProcessed = 0;
+			 *  while ((ErrorCode = Endpoint_Read_Stream_LE(DataStream, sizeof(DataStream),
+			 *                                              &BytesProcessed)) == ENDPOINT_RWSTREAM_IncompleteTransfer)
+			 *  {
+			 *      // Stream not yet complete - do other actions here, abort if required
+			 *  }
+			 *
+			 *  if (ErrorCode != ENDPOINT_RWSTREAM_NoError)
+			 *  {
+			 *      // Stream failed to complete - check ErrorCode here
+			 *  }
+			 *  \endcode
+			 *
+			 *  \note This routine should not be used on CONTROL type endpoints.
+			 *
+			 *  \param[out] Buffer          Pointer to the destination data buffer to write to.
+			 *  \param[in]  Length          Number of bytes to send via the currently selected endpoint.
+			 *  \param[in]  BytesProcessed  Pointer to a location where the total number of bytes processed in the current
+			 *                              transaction should be updated, \c NULL if the entire stream should be read at once.
+			 *
+			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t Endpoint_Read_Stream_LE(void* const Buffer,
+			                                uint16_t Length,
+			                                uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Reads the given number of bytes from the endpoint from the given buffer in big endian,
+			 *  discarding fully read packets from the host as needed. The last packet is not automatically
+			 *  discarded once the remaining bytes has been read; the user is responsible for manually
+			 *  discarding the last packet from the host via the \ref Endpoint_ClearOUT() macro.
+			 *
+			 *  \note This routine should not be used on CONTROL type endpoints.
+			 *
+			 *  \param[out] Buffer          Pointer to the destination data buffer to write to.
+			 *  \param[in]  Length          Number of bytes to send via the currently selected endpoint.
+			 *  \param[in]  BytesProcessed  Pointer to a location where the total number of bytes processed in the current
+			 *                              transaction should be updated, \c NULL if the entire stream should be read at once.
+			 *
+			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t Endpoint_Read_Stream_BE(void* const Buffer,
+			                                uint16_t Length,
+			                                uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Writes the given number of bytes to the CONTROL type endpoint from the given buffer in little endian,
+			 *  sending full packets to the host as needed. The host OUT acknowledgement is not automatically cleared
+			 *  in both failure and success states; the user is responsible for manually clearing the status OUT packet
+			 *  to finalize the transfer's status stage via the \ref Endpoint_ClearOUT() macro.
+			 *
+			 *  \note This function automatically sends the last packet in the data stage of the transaction; when the
+			 *        function returns, the user is responsible for clearing the <b>status</b> stage of the transaction.
+			 *        Note that the status stage packet is sent or received in the opposite direction of the data flow.
+			 *        \n\n
+			 *
+			 *  \note This routine should only be used on CONTROL type endpoints.
+			 *
+			 *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained
+			 *           together; i.e. the entire stream data must be read or written at the one time.
+			 *
+			 *  \param[in] Buffer  Pointer to the source data buffer to read from.
+			 *  \param[in] Length  Number of bytes to read for the currently selected endpoint into the buffer.
+			 *
+			 *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t Endpoint_Write_Control_Stream_LE(const void* const Buffer,
+			                                         uint16_t Length) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Writes the given number of bytes to the CONTROL type endpoint from the given buffer in big endian,
+			 *  sending full packets to the host as needed. The host OUT acknowledgement is not automatically cleared
+			 *  in both failure and success states; the user is responsible for manually clearing the status OUT packet
+			 *  to finalize the transfer's status stage via the \ref Endpoint_ClearOUT() macro.
+			 *
+			 *  \note This function automatically sends the last packet in the data stage of the transaction; when the
+			 *        function returns, the user is responsible for clearing the <b>status</b> stage of the transaction.
+			 *        Note that the status stage packet is sent or received in the opposite direction of the data flow.
+			 *        \n\n
+			 *
+			 *  \note This routine should only be used on CONTROL type endpoints.
+			 *
+			 *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained
+			 *           together; i.e. the entire stream data must be read or written at the one time.
+			 *
+			 *  \param[in] Buffer  Pointer to the source data buffer to read from.
+			 *  \param[in] Length  Number of bytes to read for the currently selected endpoint into the buffer.
+			 *
+			 *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t Endpoint_Write_Control_Stream_BE(const void* const Buffer,
+			                                         uint16_t Length) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Reads the given number of bytes from the CONTROL endpoint from the given buffer in little endian,
+			 *  discarding fully read packets from the host as needed. The device IN acknowledgement is not
+			 *  automatically sent after success or failure states; the user is responsible for manually sending the
+			 *  status IN packet to finalize the transfer's status stage via the \ref Endpoint_ClearIN() macro.
+			 *
+			 *  \note This function automatically sends the last packet in the data stage of the transaction; when the
+			 *        function returns, the user is responsible for clearing the <b>status</b> stage of the transaction.
+			 *        Note that the status stage packet is sent or received in the opposite direction of the data flow.
+			 *        \n\n
+			 *
+			 *  \note This routine should only be used on CONTROL type endpoints.
+			 *
+			 *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained
+			 *           together; i.e. the entire stream data must be read or written at the one time.
+			 *
+			 *  \param[out] Buffer  Pointer to the destination data buffer to write to.
+			 *  \param[in]  Length  Number of bytes to send via the currently selected endpoint.
+			 *
+			 *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t Endpoint_Read_Control_Stream_LE(void* const Buffer,
+			                                        uint16_t Length) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Reads the given number of bytes from the CONTROL endpoint from the given buffer in big endian,
+			 *  discarding fully read packets from the host as needed. The device IN acknowledgement is not
+			 *  automatically sent after success or failure states; the user is responsible for manually sending the
+			 *  status IN packet to finalize the transfer's status stage via the \ref Endpoint_ClearIN() macro.
+			 *
+			 *  \note This function automatically sends the last packet in the data stage of the transaction; when the
+			 *        function returns, the user is responsible for clearing the <b>status</b> stage of the transaction.
+			 *        Note that the status stage packet is sent or received in the opposite direction of the data flow.
+			 *        \n\n
+			 *
+			 *  \note This routine should only be used on CONTROL type endpoints.
+			 *
+			 *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained
+			 *           together; i.e. the entire stream data must be read or written at the one time.
+			 *
+			 *  \param[out] Buffer  Pointer to the destination data buffer to write to.
+			 *  \param[in]  Length  Number of bytes to send via the currently selected endpoint.
+			 *
+			 *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t Endpoint_Read_Control_Stream_BE(void* const Buffer,
+			                                        uint16_t Length) ATTR_NON_NULL_PTR_ARG(1);
+			//@}
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Core/UC3/Endpoint_UC3.c b/lib/lufa/LUFA/Drivers/USB/Core/UC3/Endpoint_UC3.c
new file mode 100644
index 0000000000..7e24672c50
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Core/UC3/Endpoint_UC3.c
@@ -0,0 +1,196 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+#include "../../../../Common/Common.h"
+#if (ARCH == ARCH_UC3)
+
+#define  __INCLUDE_FROM_USB_DRIVER
+#include "../USBMode.h"
+
+#if defined(USB_CAN_BE_DEVICE)
+
+#include "../Endpoint.h"
+
+#if !defined(FIXED_CONTROL_ENDPOINT_SIZE)
+uint8_t USB_Device_ControlEndpointSize = ENDPOINT_CONTROLEP_DEFAULT_SIZE;
+#endif
+
+volatile uint32_t USB_Endpoint_SelectedEndpoint = ENDPOINT_CONTROLEP;
+volatile uint8_t* USB_Endpoint_FIFOPos[ENDPOINT_TOTAL_ENDPOINTS];
+
+bool Endpoint_ConfigureEndpointTable(const USB_Endpoint_Table_t* const Table,
+                                     const uint8_t Entries)
+{
+	for (uint8_t i = 0; i < Entries; i++)
+	{
+		if (!(Table[i].Address))
+		  continue;
+
+		if (!(Endpoint_ConfigureEndpoint(Table[i].Address, Table[i].Type, Table[i].Size, Table[i].Banks)))
+		{
+			return false;
+		}
+	}
+
+	return true;
+}
+
+bool Endpoint_ConfigureEndpoint_Prv(const uint8_t Number,
+                                    const uint32_t UECFG0Data)
+{
+	USB_Endpoint_FIFOPos[Number] = &AVR32_USBB_SLAVE[Number * ENDPOINT_HSB_ADDRESS_SPACE_SIZE];
+
+#if defined(CONTROL_ONLY_DEVICE) || defined(ORDERED_EP_CONFIG)
+	Endpoint_SelectEndpoint(Number);
+	Endpoint_EnableEndpoint();
+
+	(&AVR32_USBB.uecfg0)[Number] = 0;
+	(&AVR32_USBB.uecfg0)[Number] = UECFG0Data;
+
+	return Endpoint_IsConfigured();
+#else
+	for (uint8_t EPNum = Number; EPNum < ENDPOINT_TOTAL_ENDPOINTS; EPNum++)
+	{
+		uint32_t UECFG0Temp;
+
+		Endpoint_SelectEndpoint(EPNum);
+
+		if (EPNum == Number)
+		{
+			UECFG0Temp = UECFG0Data;
+		}
+		else
+		{
+			UECFG0Temp = (&AVR32_USBB.uecfg0)[EPNum];
+		}
+
+		if (!(UECFG0Temp & AVR32_USBB_ALLOC_MASK))
+		  continue;
+
+		Endpoint_DisableEndpoint();
+		(&AVR32_USBB.uecfg0)[EPNum] &= ~AVR32_USBB_ALLOC_MASK;
+
+		Endpoint_EnableEndpoint();
+		(&AVR32_USBB.uecfg0)[EPNum] = UECFG0Temp;
+
+		if (!(Endpoint_IsConfigured()))
+		  return false;
+	}
+
+	Endpoint_SelectEndpoint(Number);
+	return true;
+#endif
+}
+
+void Endpoint_ClearEndpoints(void)
+{
+	for (uint8_t EPNum = 0; EPNum < ENDPOINT_TOTAL_ENDPOINTS; EPNum++)
+	{
+		Endpoint_SelectEndpoint(EPNum);
+		(&AVR32_USBB.uecfg0)[EPNum]    = 0;
+		(&AVR32_USBB.uecon0clr)[EPNum] = -1;
+		USB_Endpoint_FIFOPos[EPNum]    = &AVR32_USBB_SLAVE[EPNum * 0x10000];
+		Endpoint_DisableEndpoint();
+	}
+}
+
+void Endpoint_ClearStatusStage(void)
+{
+	if (USB_ControlRequest.bmRequestType & REQDIR_DEVICETOHOST)
+	{
+		while (!(Endpoint_IsOUTReceived()))
+		{
+			if (USB_DeviceState == DEVICE_STATE_Unattached)
+			  return;
+		}
+
+		Endpoint_ClearOUT();
+	}
+	else
+	{
+		while (!(Endpoint_IsINReady()))
+		{
+			if (USB_DeviceState == DEVICE_STATE_Unattached)
+			  return;
+		}
+
+		Endpoint_ClearIN();
+	}
+}
+
+#if !defined(CONTROL_ONLY_DEVICE)
+uint8_t Endpoint_WaitUntilReady(void)
+{
+	#if (USB_STREAM_TIMEOUT_MS < 0xFF)
+	uint8_t  TimeoutMSRem = USB_STREAM_TIMEOUT_MS;
+	#else
+	uint16_t TimeoutMSRem = USB_STREAM_TIMEOUT_MS;
+	#endif
+
+	uint16_t PreviousFrameNumber = USB_Device_GetFrameNumber();
+
+	for (;;)
+	{
+		if (Endpoint_GetEndpointDirection() == ENDPOINT_DIR_IN)
+		{
+			if (Endpoint_IsINReady())
+			  return ENDPOINT_READYWAIT_NoError;
+		}
+		else
+		{
+			if (Endpoint_IsOUTReceived())
+			  return ENDPOINT_READYWAIT_NoError;
+		}
+
+		uint8_t USB_DeviceState_LCL = USB_DeviceState;
+
+		if (USB_DeviceState_LCL == DEVICE_STATE_Unattached)
+		  return ENDPOINT_READYWAIT_DeviceDisconnected;
+		else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended)
+		  return ENDPOINT_READYWAIT_BusSuspended;
+		else if (Endpoint_IsStalled())
+		  return ENDPOINT_READYWAIT_EndpointStalled;
+
+		uint16_t CurrentFrameNumber = USB_Device_GetFrameNumber();
+
+		if (CurrentFrameNumber != PreviousFrameNumber)
+		{
+			PreviousFrameNumber = CurrentFrameNumber;
+
+			if (!(TimeoutMSRem--))
+			  return ENDPOINT_READYWAIT_Timeout;
+		}
+	}
+}
+#endif
+
+#endif
+
+#endif
diff --git a/lib/lufa/LUFA/Drivers/USB/Core/UC3/Endpoint_UC3.h b/lib/lufa/LUFA/Drivers/USB/Core/UC3/Endpoint_UC3.h
new file mode 100644
index 0000000000..32d6a9b768
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Core/UC3/Endpoint_UC3.h
@@ -0,0 +1,794 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief USB Endpoint definitions for the AVR32 UC3 microcontrollers.
+ *  \copydetails Group_EndpointManagement_UC3
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the USB driver
+ *        dispatch header located in LUFA/Drivers/USB/USB.h.
+ */
+
+/** \ingroup Group_EndpointRW
+ *  \defgroup Group_EndpointRW_UC3 Endpoint Data Reading and Writing (UC3)
+ *  \brief Endpoint data read/write definitions for the Atmel AVR32 UC3 architecture.
+ *
+ *  Functions, macros, variables, enums and types related to data reading and writing from and to endpoints.
+ */
+
+/** \ingroup Group_EndpointPrimitiveRW
+ *  \defgroup Group_EndpointPrimitiveRW_UC3 Read/Write of Primitive Data Types (UC3)
+ *  \brief Endpoint primitive read/write definitions for the Atmel AVR32 UC3 architecture.
+ *
+ *  Functions, macros, variables, enums and types related to data reading and writing of primitive data types
+ *  from and to endpoints.
+ */
+
+/** \ingroup Group_EndpointPacketManagement
+ *  \defgroup Group_EndpointPacketManagement_UC3 Endpoint Packet Management (UC3)
+ *  \brief Endpoint packet management definitions for the Atmel AVR32 UC3 architecture.
+ *
+ *  Functions, macros, variables, enums and types related to packet management of endpoints.
+ */
+
+/** \ingroup Group_EndpointManagement
+ *  \defgroup Group_EndpointManagement_UC3 Endpoint Management (UC3)
+ *  \brief Endpoint management definitions for the Atmel AVR32 UC3 architecture.
+ *
+ *  Functions, macros and enums related to endpoint management when in USB Device mode. This
+ *  module contains the endpoint management macros, as well as endpoint interrupt and data
+ *  send/receive functions for various data types.
+ *
+ *  @{
+ */
+
+#ifndef __ENDPOINT_UC3_H__
+#define __ENDPOINT_UC3_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+		#include "../USBTask.h"
+		#include "../USBInterrupt.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_USB_DRIVER)
+			#error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.
+		#endif
+
+	/* Private Interface - For use in library only: */
+	#if !defined(__DOXYGEN__)
+		/* Macros: */
+			#define ENDPOINT_HSB_ADDRESS_SPACE_SIZE            (64 * 1024UL)
+
+		/* Inline Functions: */
+			static inline uint32_t Endpoint_BytesToEPSizeMask(const uint16_t Bytes) ATTR_WARN_UNUSED_RESULT ATTR_CONST
+			                                                                        ATTR_ALWAYS_INLINE;
+			static inline uint32_t Endpoint_BytesToEPSizeMask(const uint16_t Bytes)
+			{
+				uint8_t  MaskVal    = 0;
+				uint16_t CheckBytes = 8;
+
+				while (CheckBytes < Bytes)
+				{
+					MaskVal++;
+					CheckBytes <<= 1;
+				}
+
+				return (MaskVal << AVR32_USBB_EPSIZE_OFFSET);
+			}
+
+		/* Function Prototypes: */
+			void Endpoint_ClearEndpoints(void);
+			bool Endpoint_ConfigureEndpoint_Prv(const uint8_t Number,
+			                                    const uint32_t UECFGXData);
+
+		/* External Variables: */
+			extern volatile uint32_t USB_Endpoint_SelectedEndpoint;
+			extern volatile uint8_t* USB_Endpoint_FIFOPos[];
+	#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			#if (!defined(FIXED_CONTROL_ENDPOINT_SIZE) || defined(__DOXYGEN__))
+				/** Default size of the default control endpoint's bank, until altered by the control endpoint bank size
+				 *  value in the device descriptor. Not available if the \c FIXED_CONTROL_ENDPOINT_SIZE token is defined.
+				 */
+				#define ENDPOINT_CONTROLEP_DEFAULT_SIZE     8
+			#endif
+
+			#if !defined(CONTROL_ONLY_DEVICE) || defined(__DOXYGEN__)
+				#if defined(USB_SERIES_UC3A3_AVR32) || defined(USB_SERIES_UC3A4_AVR32)
+					#define ENDPOINT_TOTAL_ENDPOINTS        8
+				#else
+					/** Total number of endpoints (including the default control endpoint at address 0) which may
+					 *  be used in the device. Different AVR models support different amounts of endpoints,
+					 *  this value reflects the maximum number of endpoints for the currently selected AVR model.
+					 */
+					#define ENDPOINT_TOTAL_ENDPOINTS        7
+				#endif
+			#else
+				#define ENDPOINT_TOTAL_ENDPOINTS            1
+			#endif
+
+		/* Enums: */
+			/** Enum for the possible error return codes of the \ref Endpoint_WaitUntilReady() function.
+			 *
+			 *  \ingroup Group_EndpointRW_UC3
+			 */
+			enum Endpoint_WaitUntilReady_ErrorCodes_t
+			{
+				ENDPOINT_READYWAIT_NoError                 = 0, /**< Endpoint is ready for next packet, no error. */
+				ENDPOINT_READYWAIT_EndpointStalled         = 1, /**< The endpoint was stalled during the stream
+				                                                 *   transfer by the host or device.
+				                                                 */
+				ENDPOINT_READYWAIT_DeviceDisconnected      = 2,	/**< Device was disconnected from the host while
+				                                                 *   waiting for the endpoint to become ready.
+				                                                 */
+				ENDPOINT_READYWAIT_BusSuspended            = 3, /**< The USB bus has been suspended by the host and
+				                                                 *   no USB endpoint traffic can occur until the bus
+				                                                 *   has resumed.
+				                                                 */
+				ENDPOINT_READYWAIT_Timeout                 = 4, /**< The host failed to accept or send the next packet
+				                                                 *   within the software timeout period set by the
+				                                                 *   \ref USB_STREAM_TIMEOUT_MS macro.
+				                                                 */
+			};
+
+		/* Inline Functions: */
+			/** Configures the specified endpoint address with the given endpoint type, bank size and number of hardware
+			 *  banks. Once configured, the endpoint may be read from or written to, depending on its direction.
+			 *
+			 *  \param[in] Address    Endpoint address to configure.
+			 *
+			 *  \param[in] Type       Type of endpoint to configure, a \c EP_TYPE_* mask. Not all endpoint types
+			 *                        are available on Low Speed USB devices - refer to the USB 2.0 specification.
+			 *
+			 *  \param[in] Size       Size of the endpoint's bank, where packets are stored before they are transmitted
+			 *                        to the USB host, or after they have been received from the USB host (depending on
+			 *                        the endpoint's data direction). The bank size must indicate the maximum packet size
+			 *                        that the endpoint can handle.
+			 *
+			 *  \param[in] Banks      Number of hardware banks to use for the endpoint being configured.
+			 *
+			 *  \attention When the \c ORDERED_EP_CONFIG compile time option is used, Endpoints <b>must</b> be configured in
+			 *             ascending order, or bank corruption will occur.
+			 *
+			 *  \note Different endpoints may have different maximum packet sizes based on the endpoint's index - refer to
+			 *        the chosen microcontroller model's datasheet to determine the maximum bank size for each endpoint.
+			 *        \n\n
+			 *
+			 *  \note The default control endpoint should not be manually configured by the user application, as
+			 *        it is automatically configured by the library internally.
+			 *        \n\n
+			 *
+			 *  \note This routine will automatically select the specified endpoint upon success. Upon failure, the endpoint
+			 *        which failed to reconfigure correctly will be selected.
+			 *
+			 *  \return Boolean \c true if the configuration succeeded, \c false otherwise.
+			 */
+			static inline bool Endpoint_ConfigureEndpoint(const uint8_t Address,
+			                                              const uint8_t Type,
+			                                              const uint16_t Size,
+			                                              const uint8_t Banks) ATTR_ALWAYS_INLINE;
+			static inline bool Endpoint_ConfigureEndpoint(const uint8_t Address,
+			                                              const uint8_t Type,
+			                                              const uint16_t Size,
+			                                              const uint8_t Banks)
+			{
+				uint8_t Number = (Address & ENDPOINT_EPNUM_MASK);
+
+				if (Number >= ENDPOINT_TOTAL_ENDPOINTS)
+				  return false;
+
+				return Endpoint_ConfigureEndpoint_Prv(Number,
+				                                      (AVR32_USBB_ALLOC_MASK |
+				                                       ((uint32_t)Type << AVR32_USBB_EPTYPE_OFFSET) |
+				                                       ((Address & ENDPOINT_DIR_IN) ? AVR32_USBB_UECFG0_EPDIR_MASK : 0) |
+				                                       ((Banks > 1) ? AVR32_USBB_UECFG0_EPBK_SINGLE : AVR32_USBB_UECFG0_EPBK_DOUBLE) |
+				                                       Endpoint_BytesToEPSizeMask(Size)));
+			}
+
+			/** Indicates the number of bytes currently stored in the current endpoint's selected bank.
+			 *
+			 *  \ingroup Group_EndpointRW_UC3
+			 *
+			 *  \return Total number of bytes in the currently selected Endpoint's FIFO buffer.
+			 */
+			static inline uint16_t Endpoint_BytesInEndpoint(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline uint16_t Endpoint_BytesInEndpoint(void)
+			{
+				return (&AVR32_USBB.UESTA0)[USB_Endpoint_SelectedEndpoint].byct;
+			}
+
+			/** Determines the currently selected endpoint's direction.
+			 *
+			 *  \return The currently selected endpoint's direction, as a \c ENDPOINT_DIR_* mask.
+			 */
+			static inline uint32_t Endpoint_GetEndpointDirection(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline uint32_t Endpoint_GetEndpointDirection(void)
+			{
+				return ((&AVR32_USBB.UECFG0)[USB_Endpoint_SelectedEndpoint].epdir ? ENDPOINT_DIR_IN : ENDPOINT_DIR_OUT);
+			}
+
+			/** Get the endpoint address of the currently selected endpoint. This is typically used to save
+			 *  the currently selected endpoint so that it can be restored after another endpoint has been
+			 *  manipulated.
+			 *
+			 *  \return Index of the currently selected endpoint.
+			 */
+			static inline uint8_t Endpoint_GetCurrentEndpoint(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline uint8_t Endpoint_GetCurrentEndpoint(void)
+			{
+				return (USB_Endpoint_SelectedEndpoint | Endpoint_GetEndpointDirection());
+			}
+
+			/** Selects the given endpoint address.
+			 *
+			 *  Any endpoint operations which do not require the endpoint address to be indicated will operate on
+			 *  the currently selected endpoint.
+			 *
+			 *  \param[in] Address  Endpoint address to select.
+			 */
+			static inline void Endpoint_SelectEndpoint(const uint8_t Address) ATTR_ALWAYS_INLINE;
+			static inline void Endpoint_SelectEndpoint(const uint8_t Address)
+			{
+				USB_Endpoint_SelectedEndpoint = (Address & ENDPOINT_EPNUM_MASK);
+			}
+
+			/** Resets the endpoint bank FIFO. This clears all the endpoint banks and resets the USB controller's
+			 *  data In and Out pointers to the bank's contents.
+			 *
+			 *  \param[in] Address  Endpoint number whose FIFO buffers are to be reset.
+			 */
+			static inline void Endpoint_ResetEndpoint(const uint8_t Address) ATTR_ALWAYS_INLINE;
+			static inline void Endpoint_ResetEndpoint(const uint8_t Address)
+			{
+				uint32_t EndpointNumber = (Address & ENDPOINT_EPNUM_MASK);
+
+				AVR32_USBB.uerst |=  (AVR32_USBB_EPRST0_MASK << EndpointNumber);
+				AVR32_USBB.uerst &= ~(AVR32_USBB_EPRST0_MASK << EndpointNumber);
+				USB_Endpoint_FIFOPos[EndpointNumber] = &AVR32_USBB_SLAVE[EndpointNumber * ENDPOINT_HSB_ADDRESS_SPACE_SIZE];
+			}
+
+			/** Enables the currently selected endpoint so that data can be sent and received through it to
+			 *  and from a host.
+			 *
+			 *  \note Endpoints must first be configured properly via \ref Endpoint_ConfigureEndpoint().
+			 */
+			static inline void Endpoint_EnableEndpoint(void) ATTR_ALWAYS_INLINE;
+			static inline void Endpoint_EnableEndpoint(void)
+			{
+				AVR32_USBB.uerst |=  (AVR32_USBB_EPEN0_MASK << USB_Endpoint_SelectedEndpoint);
+			}
+
+			/** Disables the currently selected endpoint so that data cannot be sent and received through it
+			 *  to and from a host.
+			 */
+			static inline void Endpoint_DisableEndpoint(void) ATTR_ALWAYS_INLINE;
+			static inline void Endpoint_DisableEndpoint(void)
+			{
+				AVR32_USBB.uerst &= ~(AVR32_USBB_EPEN0_MASK << USB_Endpoint_SelectedEndpoint);
+			}
+
+			/** Determines if the currently selected endpoint is enabled, but not necessarily configured.
+			 *
+			 * \return Boolean \c true if the currently selected endpoint is enabled, \c false otherwise.
+			 */
+			static inline bool Endpoint_IsEnabled(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline bool Endpoint_IsEnabled(void)
+			{
+				return ((AVR32_USBB.uerst & (AVR32_USBB_EPEN0_MASK << USB_Endpoint_SelectedEndpoint)) ? true : false);
+			}
+
+			/** Retrieves the number of busy banks in the currently selected endpoint, which have been queued for
+			 *  transmission via the \ref Endpoint_ClearIN() command, or are awaiting acknowledgement via the
+			 *  \ref Endpoint_ClearOUT() command.
+			 *
+			 *  \ingroup Group_EndpointPacketManagement_UC3
+			 *
+			 *  \return Total number of busy banks in the selected endpoint.
+			 */
+			static inline uint8_t Endpoint_GetBusyBanks(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t Endpoint_GetBusyBanks(void)
+			{
+				return (&AVR32_USBB.UESTA0)[USB_Endpoint_SelectedEndpoint].nbusybk;
+			}
+
+			/** Aborts all pending IN transactions on the currently selected endpoint, once the bank
+			 *  has been queued for transmission to the host via \ref Endpoint_ClearIN(). This function
+			 *  will terminate all queued transactions, resetting the endpoint banks ready for a new
+			 *  packet.
+			 *
+			 *  \ingroup Group_EndpointPacketManagement_UC3
+			 */
+			static inline void Endpoint_AbortPendingIN(void)
+			{
+				while (Endpoint_GetBusyBanks() != 0)
+				{
+					(&AVR32_USBB.UECON0SET)[USB_Endpoint_SelectedEndpoint].killbks = true;
+					while ((&AVR32_USBB.UECON0)[USB_Endpoint_SelectedEndpoint].killbk);
+				}
+			}
+
+			/** Determines if the currently selected endpoint may be read from (if data is waiting in the endpoint
+			 *  bank and the endpoint is an OUT direction, or if the bank is not yet full if the endpoint is an IN
+			 *  direction). This function will return false if an error has occurred in the endpoint, if the endpoint
+			 *  is an OUT direction and no packet (or an empty packet) has been received, or if the endpoint is an IN
+			 *  direction and the endpoint bank is full.
+			 *
+			 *  \ingroup Group_EndpointPacketManagement_UC3
+			 *
+			 *  \return Boolean \c true if the currently selected endpoint may be read from or written to, depending
+			 *          on its direction.
+			 */
+			static inline bool Endpoint_IsReadWriteAllowed(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline bool Endpoint_IsReadWriteAllowed(void)
+			{
+				return (&AVR32_USBB.UESTA0)[USB_Endpoint_SelectedEndpoint].rwall;
+			}
+
+			/** Determines if the currently selected endpoint is configured.
+			 *
+			 *  \return Boolean \c true if the currently selected endpoint has been configured, \c false otherwise.
+			 */
+			static inline bool Endpoint_IsConfigured(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline bool Endpoint_IsConfigured(void)
+			{
+				return (&AVR32_USBB.UESTA0)[USB_Endpoint_SelectedEndpoint].cfgok;
+			}
+
+			/** Returns a mask indicating which INTERRUPT type endpoints have interrupted - i.e. their
+			 *  interrupt duration has elapsed. Which endpoints have interrupted can be determined by
+			 *  masking the return value against <tt>(1 << <i>{Endpoint Number}</i>)</tt>.
+			 *
+			 *  \return Mask whose bits indicate which endpoints have interrupted.
+			 */
+			static inline uint32_t Endpoint_GetEndpointInterrupts(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline uint32_t Endpoint_GetEndpointInterrupts(void)
+			{
+				return ((AVR32_USBB.udint & (AVR32_USBB_EP6INT_MASK | AVR32_USBB_EP5INT_MASK |
+				                             AVR32_USBB_EP4INT_MASK | AVR32_USBB_EP3INT_MASK |
+				                             AVR32_USBB_EP2INT_MASK | AVR32_USBB_EP1INT_MASK |
+				                             AVR32_USBB_EP0INT_MASK)) >> AVR32_USBB_EP0INT_OFFSET);
+			}
+
+			/** Determines if the specified endpoint number has interrupted (valid only for INTERRUPT type
+			 *  endpoints).
+			 *
+			 *  \param[in] Address  Address of the endpoint whose interrupt flag should be tested.
+			 *
+			 *  \return Boolean \c true if the specified endpoint has interrupted, \c false otherwise.
+			 */
+			static inline bool Endpoint_HasEndpointInterrupted(const uint8_t Address) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline bool Endpoint_HasEndpointInterrupted(const uint8_t Address)
+			{
+				return ((Endpoint_GetEndpointInterrupts() & (AVR32_USBB_EP0INT_MASK << (Address & ENDPOINT_EPNUM_MASK))) ? true : false);
+			}
+
+			/** Determines if the selected IN endpoint is ready for a new packet to be sent to the host.
+			 *
+			 *  \ingroup Group_EndpointPacketManagement_UC3
+			 *
+			 *  \return Boolean \c true if the current endpoint is ready for an IN packet, \c false otherwise.
+			 */
+			static inline bool Endpoint_IsINReady(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline bool Endpoint_IsINReady(void)
+			{
+				return (&AVR32_USBB.UESTA0)[USB_Endpoint_SelectedEndpoint].txini;
+			}
+
+			/** Determines if the selected OUT endpoint has received new packet from the host.
+			 *
+			 *  \ingroup Group_EndpointPacketManagement_UC3
+			 *
+			 *  \return Boolean \c true if current endpoint is has received an OUT packet, \c false otherwise.
+			 */
+			static inline bool Endpoint_IsOUTReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline bool Endpoint_IsOUTReceived(void)
+			{
+				return (&AVR32_USBB.UESTA0)[USB_Endpoint_SelectedEndpoint].rxouti;
+			}
+
+			/** Determines if the current CONTROL type endpoint has received a SETUP packet.
+			 *
+			 *  \ingroup Group_EndpointPacketManagement_UC3
+			 *
+			 *  \return Boolean \c true if the selected endpoint has received a SETUP packet, \c false otherwise.
+			 */
+			static inline bool Endpoint_IsSETUPReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline bool Endpoint_IsSETUPReceived(void)
+			{
+				return (&AVR32_USBB.UESTA0)[USB_Endpoint_SelectedEndpoint].rxstpi;
+			}
+
+			/** Clears a received SETUP packet on the currently selected CONTROL type endpoint, freeing up the
+			 *  endpoint for the next packet.
+			 *
+			 *  \ingroup Group_EndpointPacketManagement_UC3
+			 *
+			 *  \note This is not applicable for non CONTROL type endpoints.
+			 */
+			static inline void Endpoint_ClearSETUP(void) ATTR_ALWAYS_INLINE;
+			static inline void Endpoint_ClearSETUP(void)
+			{
+				(&AVR32_USBB.UESTA0CLR)[USB_Endpoint_SelectedEndpoint].rxstpic = true;
+				USB_Endpoint_FIFOPos[USB_Endpoint_SelectedEndpoint] = &AVR32_USBB_SLAVE[USB_Endpoint_SelectedEndpoint * ENDPOINT_HSB_ADDRESS_SPACE_SIZE];
+			}
+
+			/** Sends an IN packet to the host on the currently selected endpoint, freeing up the endpoint for the
+			 *  next packet and switching to the alternative endpoint bank if double banked.
+			 *
+			 *  \ingroup Group_EndpointPacketManagement_UC3
+			 */
+			static inline void Endpoint_ClearIN(void) ATTR_ALWAYS_INLINE;
+			static inline void Endpoint_ClearIN(void)
+			{
+				(&AVR32_USBB.UESTA0CLR)[USB_Endpoint_SelectedEndpoint].txinic   = true;
+				(&AVR32_USBB.UECON0CLR)[USB_Endpoint_SelectedEndpoint].fifoconc = true;
+				USB_Endpoint_FIFOPos[USB_Endpoint_SelectedEndpoint] = &AVR32_USBB_SLAVE[USB_Endpoint_SelectedEndpoint * ENDPOINT_HSB_ADDRESS_SPACE_SIZE];
+			}
+
+			/** Acknowledges an OUT packet to the host on the currently selected endpoint, freeing up the endpoint
+			 *  for the next packet and switching to the alternative endpoint bank if double banked.
+			 *
+			 *  \ingroup Group_EndpointPacketManagement_UC3
+			 */
+			static inline void Endpoint_ClearOUT(void) ATTR_ALWAYS_INLINE;
+			static inline void Endpoint_ClearOUT(void)
+			{
+				(&AVR32_USBB.UESTA0CLR)[USB_Endpoint_SelectedEndpoint].rxoutic  = true;
+				(&AVR32_USBB.UECON0CLR)[USB_Endpoint_SelectedEndpoint].fifoconc = true;
+				USB_Endpoint_FIFOPos[USB_Endpoint_SelectedEndpoint] = &AVR32_USBB_SLAVE[USB_Endpoint_SelectedEndpoint * ENDPOINT_HSB_ADDRESS_SPACE_SIZE];
+			}
+
+			/** Stalls the current endpoint, indicating to the host that a logical problem occurred with the
+			 *  indicated endpoint and that the current transfer sequence should be aborted. This provides a
+			 *  way for devices to indicate invalid commands to the host so that the current transfer can be
+			 *  aborted and the host can begin its own recovery sequence.
+			 *
+			 *  The currently selected endpoint remains stalled until either the \ref Endpoint_ClearStall() macro
+			 *  is called, or the host issues a CLEAR FEATURE request to the device for the currently selected
+			 *  endpoint.
+			 *
+			 *  \ingroup Group_EndpointPacketManagement_UC3
+			 */
+			static inline void Endpoint_StallTransaction(void) ATTR_ALWAYS_INLINE;
+			static inline void Endpoint_StallTransaction(void)
+			{
+				(&AVR32_USBB.UECON0SET)[USB_Endpoint_SelectedEndpoint].stallrqs = true;
+			}
+
+			/** Clears the STALL condition on the currently selected endpoint.
+			 *
+			 *  \ingroup Group_EndpointPacketManagement_UC3
+			 */
+			static inline void Endpoint_ClearStall(void) ATTR_ALWAYS_INLINE;
+			static inline void Endpoint_ClearStall(void)
+			{
+				(&AVR32_USBB.UECON0CLR)[USB_Endpoint_SelectedEndpoint].stallrqc = true;
+			}
+
+			/** Determines if the currently selected endpoint is stalled, \c false otherwise.
+			 *
+			 *  \ingroup Group_EndpointPacketManagement_UC3
+			 *
+			 *  \return Boolean \c true if the currently selected endpoint is stalled, \c false otherwise.
+			 */
+			static inline bool Endpoint_IsStalled(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline bool Endpoint_IsStalled(void)
+			{
+				return (&AVR32_USBB.UECON0)[USB_Endpoint_SelectedEndpoint].stallrq;
+			}
+
+			/** Resets the data toggle of the currently selected endpoint. */
+			static inline void Endpoint_ResetDataToggle(void) ATTR_ALWAYS_INLINE;
+			static inline void Endpoint_ResetDataToggle(void)
+			{
+				(&AVR32_USBB.UECON0SET)[USB_Endpoint_SelectedEndpoint].rstdts = true;
+			}
+
+			/** Sets the direction of the currently selected endpoint.
+			 *
+			 *  \param[in] DirectionMask  New endpoint direction, as a \c ENDPOINT_DIR_* mask.
+			 */
+			static inline void Endpoint_SetEndpointDirection(const uint32_t DirectionMask) ATTR_ALWAYS_INLINE;
+			static inline void Endpoint_SetEndpointDirection(const uint32_t DirectionMask)
+			{
+				(&AVR32_USBB.UECFG0)[USB_Endpoint_SelectedEndpoint].epdir = (DirectionMask == ENDPOINT_DIR_IN);
+			}
+
+			/** Reads one byte from the currently selected endpoint's bank, for OUT direction endpoints.
+			 *
+			 *  \ingroup Group_EndpointPrimitiveRW_UC3
+			 *
+			 *  \return Next byte in the currently selected endpoint's FIFO buffer.
+			 */
+			static inline uint8_t Endpoint_Read_8(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline uint8_t Endpoint_Read_8(void)
+			{
+				return *(USB_Endpoint_FIFOPos[USB_Endpoint_SelectedEndpoint]++);
+			}
+
+			/** Writes one byte to the currently selected endpoint's bank, for IN direction endpoints.
+			 *
+			 *  \ingroup Group_EndpointPrimitiveRW_UC3
+			 *
+			 *  \param[in] Data  Data to write into the the currently selected endpoint's FIFO buffer.
+			 */
+			static inline void Endpoint_Write_8(const uint8_t Data) ATTR_ALWAYS_INLINE;
+			static inline void Endpoint_Write_8(const uint8_t Data)
+			{
+				*(USB_Endpoint_FIFOPos[USB_Endpoint_SelectedEndpoint]++) = Data;
+			}
+
+			/** Discards one byte from the currently selected endpoint's bank, for OUT direction endpoints.
+			 *
+			 *  \ingroup Group_EndpointPrimitiveRW_UC3
+			 */
+			static inline void Endpoint_Discard_8(void) ATTR_ALWAYS_INLINE;
+			static inline void Endpoint_Discard_8(void)
+			{
+				uint8_t Dummy;
+
+				Dummy = *(USB_Endpoint_FIFOPos[USB_Endpoint_SelectedEndpoint]++);
+
+				(void)Dummy;
+			}
+
+			/** Reads two bytes from the currently selected endpoint's bank in little endian format, for OUT
+			 *  direction endpoints.
+			 *
+			 *  \ingroup Group_EndpointPrimitiveRW_UC3
+			 *
+			 *  \return Next two bytes in the currently selected endpoint's FIFO buffer.
+			 */
+			static inline uint16_t Endpoint_Read_16_LE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline uint16_t Endpoint_Read_16_LE(void)
+			{
+				uint16_t Byte0 = *(USB_Endpoint_FIFOPos[USB_Endpoint_SelectedEndpoint]++);
+				uint16_t Byte1 = *(USB_Endpoint_FIFOPos[USB_Endpoint_SelectedEndpoint]++);
+
+				return ((Byte1 << 8) | Byte0);
+			}
+
+			/** Reads two bytes from the currently selected endpoint's bank in big endian format, for OUT
+			 *  direction endpoints.
+			 *
+			 *  \ingroup Group_EndpointPrimitiveRW_UC3
+			 *
+			 *  \return Next two bytes in the currently selected endpoint's FIFO buffer.
+			 */
+			static inline uint16_t Endpoint_Read_16_BE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline uint16_t Endpoint_Read_16_BE(void)
+			{
+				uint16_t Byte0 = *(USB_Endpoint_FIFOPos[USB_Endpoint_SelectedEndpoint]++);
+				uint16_t Byte1 = *(USB_Endpoint_FIFOPos[USB_Endpoint_SelectedEndpoint]++);
+
+				return ((Byte0 << 8) | Byte1);
+			}
+
+			/** Writes two bytes to the currently selected endpoint's bank in little endian format, for IN
+			 *  direction endpoints.
+			 *
+			 *  \ingroup Group_EndpointPrimitiveRW_UC3
+			 *
+			 *  \param[in] Data  Data to write to the currently selected endpoint's FIFO buffer.
+			 */
+			static inline void Endpoint_Write_16_LE(const uint16_t Data) ATTR_ALWAYS_INLINE;
+			static inline void Endpoint_Write_16_LE(const uint16_t Data)
+			{
+				*(USB_Endpoint_FIFOPos[USB_Endpoint_SelectedEndpoint]++) = (Data & 0xFF);
+				*(USB_Endpoint_FIFOPos[USB_Endpoint_SelectedEndpoint]++) = (Data >> 8);
+			}
+
+			/** Writes two bytes to the currently selected endpoint's bank in big endian format, for IN
+			 *  direction endpoints.
+			 *
+			 *  \ingroup Group_EndpointPrimitiveRW_UC3
+			 *
+			 *  \param[in] Data  Data to write to the currently selected endpoint's FIFO buffer.
+			 */
+			static inline void Endpoint_Write_16_BE(const uint16_t Data) ATTR_ALWAYS_INLINE;
+			static inline void Endpoint_Write_16_BE(const uint16_t Data)
+			{
+				*(USB_Endpoint_FIFOPos[USB_Endpoint_SelectedEndpoint]++) = (Data >> 8);
+				*(USB_Endpoint_FIFOPos[USB_Endpoint_SelectedEndpoint]++) = (Data & 0xFF);
+			}
+
+			/** Discards two bytes from the currently selected endpoint's bank, for OUT direction endpoints.
+			 *
+			 *  \ingroup Group_EndpointPrimitiveRW_UC3
+			 */
+			static inline void Endpoint_Discard_16(void) ATTR_ALWAYS_INLINE;
+			static inline void Endpoint_Discard_16(void)
+			{
+				uint8_t Dummy;
+
+				Dummy = *(USB_Endpoint_FIFOPos[USB_Endpoint_SelectedEndpoint]++);
+				Dummy = *(USB_Endpoint_FIFOPos[USB_Endpoint_SelectedEndpoint]++);
+
+				(void)Dummy;
+			}
+
+			/** Reads four bytes from the currently selected endpoint's bank in little endian format, for OUT
+			 *  direction endpoints.
+			 *
+			 *  \ingroup Group_EndpointPrimitiveRW_UC3
+			 *
+			 *  \return Next four bytes in the currently selected endpoint's FIFO buffer.
+			 */
+			static inline uint32_t Endpoint_Read_32_LE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline uint32_t Endpoint_Read_32_LE(void)
+			{
+				uint32_t Byte0 = *(USB_Endpoint_FIFOPos[USB_Endpoint_SelectedEndpoint]++);
+				uint32_t Byte1 = *(USB_Endpoint_FIFOPos[USB_Endpoint_SelectedEndpoint]++);
+				uint32_t Byte2 = *(USB_Endpoint_FIFOPos[USB_Endpoint_SelectedEndpoint]++);
+				uint32_t Byte3 = *(USB_Endpoint_FIFOPos[USB_Endpoint_SelectedEndpoint]++);
+
+				return ((Byte3 << 24) | (Byte2 << 16) | (Byte1 << 8) | Byte0);
+			}
+
+			/** Reads four bytes from the currently selected endpoint's bank in big endian format, for OUT
+			 *  direction endpoints.
+			 *
+			 *  \ingroup Group_EndpointPrimitiveRW_UC3
+			 *
+			 *  \return Next four bytes in the currently selected endpoint's FIFO buffer.
+			 */
+			static inline uint32_t Endpoint_Read_32_BE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline uint32_t Endpoint_Read_32_BE(void)
+			{
+				uint32_t Byte0 = *(USB_Endpoint_FIFOPos[USB_Endpoint_SelectedEndpoint]++);
+				uint32_t Byte1 = *(USB_Endpoint_FIFOPos[USB_Endpoint_SelectedEndpoint]++);
+				uint32_t Byte2 = *(USB_Endpoint_FIFOPos[USB_Endpoint_SelectedEndpoint]++);
+				uint32_t Byte3 = *(USB_Endpoint_FIFOPos[USB_Endpoint_SelectedEndpoint]++);
+
+				return ((Byte0 << 24) | (Byte1 << 16) | (Byte2 << 8) | Byte3);
+			}
+
+			/** Writes four bytes to the currently selected endpoint's bank in little endian format, for IN
+			 *  direction endpoints.
+			 *
+			 *  \ingroup Group_EndpointPrimitiveRW_UC3
+			 *
+			 *  \param[in] Data  Data to write to the currently selected endpoint's FIFO buffer.
+			 */
+			static inline void Endpoint_Write_32_LE(const uint32_t Data) ATTR_ALWAYS_INLINE;
+			static inline void Endpoint_Write_32_LE(const uint32_t Data)
+			{
+				*(USB_Endpoint_FIFOPos[USB_Endpoint_SelectedEndpoint]++) = (Data &  0xFF);
+				*(USB_Endpoint_FIFOPos[USB_Endpoint_SelectedEndpoint]++) = (Data >> 8);
+				*(USB_Endpoint_FIFOPos[USB_Endpoint_SelectedEndpoint]++) = (Data >> 16);
+				*(USB_Endpoint_FIFOPos[USB_Endpoint_SelectedEndpoint]++) = (Data >> 24);
+			}
+
+			/** Writes four bytes to the currently selected endpoint's bank in big endian format, for IN
+			 *  direction endpoints.
+			 *
+			 *  \ingroup Group_EndpointPrimitiveRW_UC3
+			 *
+			 *  \param[in] Data  Data to write to the currently selected endpoint's FIFO buffer.
+			 */
+			static inline void Endpoint_Write_32_BE(const uint32_t Data) ATTR_ALWAYS_INLINE;
+			static inline void Endpoint_Write_32_BE(const uint32_t Data)
+			{
+				*(USB_Endpoint_FIFOPos[USB_Endpoint_SelectedEndpoint]++) = (Data >> 24);
+				*(USB_Endpoint_FIFOPos[USB_Endpoint_SelectedEndpoint]++) = (Data >> 16);
+				*(USB_Endpoint_FIFOPos[USB_Endpoint_SelectedEndpoint]++) = (Data >> 8);
+				*(USB_Endpoint_FIFOPos[USB_Endpoint_SelectedEndpoint]++) = (Data &  0xFF);
+			}
+
+			/** Discards four bytes from the currently selected endpoint's bank, for OUT direction endpoints.
+			 *
+			 *  \ingroup Group_EndpointPrimitiveRW_UC3
+			 */
+			static inline void Endpoint_Discard_32(void) ATTR_ALWAYS_INLINE;
+			static inline void Endpoint_Discard_32(void)
+			{
+				uint8_t Dummy;
+
+				Dummy = *(USB_Endpoint_FIFOPos[USB_Endpoint_SelectedEndpoint]++);
+				Dummy = *(USB_Endpoint_FIFOPos[USB_Endpoint_SelectedEndpoint]++);
+				Dummy = *(USB_Endpoint_FIFOPos[USB_Endpoint_SelectedEndpoint]++);
+				Dummy = *(USB_Endpoint_FIFOPos[USB_Endpoint_SelectedEndpoint]++);
+
+				(void)Dummy;
+			}
+
+		/* External Variables: */
+			/** Global indicating the maximum packet size of the default control endpoint located at address
+			 *  0 in the device. This value is set to the value indicated in the device descriptor in the user
+			 *  project once the USB interface is initialized into device mode.
+			 *
+			 *  If space is an issue, it is possible to fix this to a static value by defining the control
+			 *  endpoint size in the \c FIXED_CONTROL_ENDPOINT_SIZE token passed to the compiler in the makefile
+			 *  via the -D switch. When a fixed control endpoint size is used, the size is no longer dynamically
+			 *  read from the descriptors at runtime and instead fixed to the given value. When used, it is
+			 *  important that the descriptor control endpoint size value matches the size given as the
+			 *  \c FIXED_CONTROL_ENDPOINT_SIZE token - it is recommended that the \c FIXED_CONTROL_ENDPOINT_SIZE token
+			 *  be used in the device descriptors to ensure this.
+			 *
+			 *  \attention This variable should be treated as read-only in the user application, and never manually
+			 *             changed in value.
+			 */
+			#if (!defined(FIXED_CONTROL_ENDPOINT_SIZE) || defined(__DOXYGEN__))
+				extern uint8_t USB_Device_ControlEndpointSize;
+			#else
+				#define USB_Device_ControlEndpointSize FIXED_CONTROL_ENDPOINT_SIZE
+			#endif
+
+		/* Function Prototypes: */
+			/** Configures a table of endpoint descriptions, in sequence. This function can be used to configure multiple
+			 *  endpoints at the same time.
+			 *
+			 *  \note Endpoints with a zero address will be ignored, thus this function cannot be used to configure the
+			 *        control endpoint.
+			 *
+			 *  \param[in] Table    Pointer to a table of endpoint descriptions.
+			 *  \param[in] Entries  Number of entries in the endpoint table to configure.
+			 *
+			 *  \return Boolean \c true if all endpoints configured successfully, \c false otherwise.
+			 */
+			bool Endpoint_ConfigureEndpointTable(const USB_Endpoint_Table_t* const Table,
+			                                     const uint8_t Entries);
+
+			/** Completes the status stage of a control transfer on a CONTROL type endpoint automatically,
+			 *  with respect to the data direction. This is a convenience function which can be used to
+			 *  simplify user control request handling.
+			 *
+			 *  \note This routine should not be called on non CONTROL type endpoints.
+			 */
+			void Endpoint_ClearStatusStage(void);
+
+			/** Spin-loops until the currently selected non-control endpoint is ready for the next packet of data
+			 *  to be read or written to it.
+			 *
+			 *  \note This routine should not be called on CONTROL type endpoints.
+			 *
+			 *  \ingroup Group_EndpointRW_UC3
+			 *
+			 *  \return A value from the \ref Endpoint_WaitUntilReady_ErrorCodes_t enum.
+			 */
+			uint8_t Endpoint_WaitUntilReady(void);
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Core/UC3/Host_UC3.c b/lib/lufa/LUFA/Drivers/USB/Core/UC3/Host_UC3.c
new file mode 100644
index 0000000000..2c182ab69c
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Core/UC3/Host_UC3.c
@@ -0,0 +1,297 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+#include "../../../../Common/Common.h"
+#if (ARCH == ARCH_UC3)
+
+#define  __INCLUDE_FROM_USB_DRIVER
+#include "../USBMode.h"
+
+#if defined(USB_CAN_BE_HOST)
+
+#define  __INCLUDE_FROM_HOST_C
+#include "../Host.h"
+
+void USB_Host_ProcessNextHostState(void)
+{
+	uint8_t ErrorCode    = HOST_ENUMERROR_NoError;
+	uint8_t SubErrorCode = HOST_ENUMERROR_NoError;
+
+	static uint16_t WaitMSRemaining;
+	static uint8_t  PostWaitState;
+
+	switch (USB_HostState)
+	{
+		case HOST_STATE_WaitForDevice:
+			if (WaitMSRemaining)
+			{
+				if ((SubErrorCode = USB_Host_WaitMS(1)) != HOST_WAITERROR_Successful)
+				{
+					USB_HostState = PostWaitState;
+					ErrorCode     = HOST_ENUMERROR_WaitStage;
+					break;
+				}
+
+				if (!(--WaitMSRemaining))
+				  USB_HostState = PostWaitState;
+			}
+
+			break;
+		case HOST_STATE_Powered:
+			WaitMSRemaining = HOST_DEVICE_SETTLE_DELAY_MS;
+
+			USB_HostState = HOST_STATE_Powered_WaitForDeviceSettle;
+			break;
+		case HOST_STATE_Powered_WaitForDeviceSettle:
+			if (WaitMSRemaining--)
+			{
+				Delay_MS(1);
+				break;
+			}
+			else
+			{
+				USB_Host_VBUS_Manual_Off();
+
+				USB_OTGPAD_On();
+				USB_Host_VBUS_Auto_Enable();
+				USB_Host_VBUS_Auto_On();
+
+				#if defined(NO_AUTO_VBUS_MANAGEMENT)
+				USB_Host_VBUS_Manual_Enable();
+				USB_Host_VBUS_Manual_On();
+				#endif
+
+				USB_HostState = HOST_STATE_Powered_WaitForConnect;
+			}
+
+			break;
+		case HOST_STATE_Powered_WaitForConnect:
+			if (USB_INT_HasOccurred(USB_INT_DCONNI))
+			{
+				USB_INT_Clear(USB_INT_DCONNI);
+				USB_INT_Clear(USB_INT_DDISCI);
+
+				USB_INT_Clear(USB_INT_VBERRI);
+				USB_INT_Enable(USB_INT_VBERRI);
+
+				USB_Host_ResumeBus();
+				Pipe_ClearPipes();
+
+				HOST_TASK_NONBLOCK_WAIT(100, HOST_STATE_Powered_DoReset);
+			}
+
+			break;
+		case HOST_STATE_Powered_DoReset:
+			USB_Host_ResetDevice();
+
+			HOST_TASK_NONBLOCK_WAIT(200, HOST_STATE_Powered_ConfigPipe);
+			break;
+		case HOST_STATE_Powered_ConfigPipe:
+			if (!(Pipe_ConfigurePipe(PIPE_CONTROLPIPE, EP_TYPE_CONTROL, ENDPOINT_CONTROLEP, PIPE_CONTROLPIPE_DEFAULT_SIZE, 1)))
+			{
+				ErrorCode    = HOST_ENUMERROR_PipeConfigError;
+				SubErrorCode = 0;
+				break;
+			}
+
+			USB_HostState = HOST_STATE_Default;
+			break;
+		case HOST_STATE_Default:
+			USB_ControlRequest = (USB_Request_Header_t)
+				{
+					.bmRequestType = (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE),
+					.bRequest      = REQ_GetDescriptor,
+					.wValue        = (DTYPE_Device << 8),
+					.wIndex        = 0,
+					.wLength       = 8,
+				};
+
+			uint8_t DataBuffer[8];
+
+			Pipe_SelectPipe(PIPE_CONTROLPIPE);
+			if ((SubErrorCode = USB_Host_SendControlRequest(DataBuffer)) != HOST_SENDCONTROL_Successful)
+			{
+				ErrorCode = HOST_ENUMERROR_ControlError;
+				break;
+			}
+
+			USB_Host_ControlPipeSize = DataBuffer[offsetof(USB_Descriptor_Device_t, Endpoint0Size)];
+
+			USB_Host_ResetDevice();
+
+			HOST_TASK_NONBLOCK_WAIT(200, HOST_STATE_Default_PostReset);
+			break;
+		case HOST_STATE_Default_PostReset:
+			if (!(Pipe_ConfigurePipe(PIPE_CONTROLPIPE, EP_TYPE_CONTROL, ENDPOINT_CONTROLEP, USB_Host_ControlPipeSize, 1)))
+			{
+				ErrorCode    = HOST_ENUMERROR_PipeConfigError;
+				SubErrorCode = 0;
+				break;
+			}
+
+			USB_ControlRequest = (USB_Request_Header_t)
+				{
+					.bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE),
+					.bRequest      = REQ_SetAddress,
+					.wValue        = USB_HOST_DEVICEADDRESS,
+					.wIndex        = 0,
+					.wLength       = 0,
+				};
+
+			if ((SubErrorCode = USB_Host_SendControlRequest(NULL)) != HOST_SENDCONTROL_Successful)
+			{
+				ErrorCode = HOST_ENUMERROR_ControlError;
+				break;
+			}
+
+			HOST_TASK_NONBLOCK_WAIT(100, HOST_STATE_Default_PostAddressSet);
+			break;
+		case HOST_STATE_Default_PostAddressSet:
+			USB_Host_SetDeviceAddress(USB_HOST_DEVICEADDRESS);
+
+			USB_HostState = HOST_STATE_Addressed;
+
+			EVENT_USB_Host_DeviceEnumerationComplete();
+			break;
+
+		default:
+			break;
+	}
+
+	if ((ErrorCode != HOST_ENUMERROR_NoError) && (USB_HostState != HOST_STATE_Unattached))
+	{
+		EVENT_USB_Host_DeviceEnumerationFailed(ErrorCode, SubErrorCode);
+
+		USB_Host_VBUS_Auto_Off();
+
+		EVENT_USB_Host_DeviceUnattached();
+
+		USB_ResetInterface();
+	}
+}
+
+uint8_t USB_Host_WaitMS(uint8_t MS)
+{
+	bool    BusSuspended = USB_Host_IsBusSuspended();
+	uint8_t ErrorCode    = HOST_WAITERROR_Successful;
+	bool    HSOFIEnabled = USB_INT_IsEnabled(USB_INT_HSOFI);
+
+	USB_INT_Disable(USB_INT_HSOFI);
+	USB_INT_Clear(USB_INT_HSOFI);
+
+	USB_Host_ResumeBus();
+
+	while (MS)
+	{
+		if (USB_INT_HasOccurred(USB_INT_HSOFI))
+		{
+			USB_INT_Clear(USB_INT_HSOFI);
+			MS--;
+		}
+
+		if ((USB_HostState == HOST_STATE_Unattached) || (USB_CurrentMode != USB_MODE_Host))
+		{
+			ErrorCode = HOST_WAITERROR_DeviceDisconnect;
+
+			break;
+		}
+
+		if (Pipe_IsError())
+		{
+			Pipe_ClearError();
+			ErrorCode = HOST_WAITERROR_PipeError;
+
+			break;
+		}
+
+		if (Pipe_IsStalled())
+		{
+			Pipe_ClearStall();
+			ErrorCode = HOST_WAITERROR_SetupStalled;
+
+			break;
+		}
+	}
+
+	if (BusSuspended)
+	  USB_Host_SuspendBus();
+
+	if (HSOFIEnabled)
+	  USB_INT_Enable(USB_INT_HSOFI);
+
+	return ErrorCode;
+}
+
+static void USB_Host_ResetDevice(void)
+{
+	bool BusSuspended = USB_Host_IsBusSuspended();
+
+	USB_INT_Disable(USB_INT_DDISCI);
+
+	USB_Host_ResetBus();
+	while (!(USB_Host_IsBusResetComplete()));
+	USB_Host_ResumeBus();
+
+	USB_Host_ConfigurationNumber = 0;
+
+	bool HSOFIEnabled = USB_INT_IsEnabled(USB_INT_HSOFI);
+
+	USB_INT_Disable(USB_INT_HSOFI);
+	USB_INT_Clear(USB_INT_HSOFI);
+
+	for (uint8_t MSRem = 10; MSRem != 0; MSRem--)
+	{
+		/* Workaround for powerless-pull-up devices. After a USB bus reset,
+		   all disconnection interrupts are suppressed while a USB frame is
+		   looked for - if it is found within 10ms, the device is still
+		   present.                                                        */
+
+		if (USB_INT_HasOccurred(USB_INT_HSOFI))
+		{
+			USB_INT_Clear(USB_INT_HSOFI);
+			USB_INT_Clear(USB_INT_DDISCI);
+			break;
+		}
+
+		Delay_MS(1);
+	}
+
+	if (HSOFIEnabled)
+	  USB_INT_Enable(USB_INT_HSOFI);
+
+	if (BusSuspended)
+	  USB_Host_SuspendBus();
+
+	USB_INT_Enable(USB_INT_DDISCI);
+}
+
+#endif
+
+#endif
diff --git a/lib/lufa/LUFA/Drivers/USB/Core/UC3/Host_UC3.h b/lib/lufa/LUFA/Drivers/USB/Core/UC3/Host_UC3.h
new file mode 100644
index 0000000000..5338f72089
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Core/UC3/Host_UC3.h
@@ -0,0 +1,363 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief USB Host definitions for the AVR32 UC3B microcontrollers.
+ *  \copydetails Group_Host_UC3B
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the USB driver
+ *        dispatch header located in LUFA/Drivers/USB/USB.h.
+ */
+
+/** \ingroup Group_Host
+ *  \defgroup Group_Host_UC3B Host Management (UC3B)
+ *  \brief USB Host definitions for the AVR32 UC3B microcontrollers.
+ *
+ *  Architecture specific USB Host definitions for the Atmel 32-bit AVR UC3B microcontrollers.
+ *
+ *  @{
+ */
+
+#ifndef __USBHOST_UC3B_H__
+#define __USBHOST_UC3B_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+		#include "../StdDescriptors.h"
+		#include "../Pipe.h"
+		#include "../USBInterrupt.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_USB_DRIVER)
+			#error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** Indicates the fixed USB device address which any attached device is enumerated to when in
+			 *  host mode. As only one USB device may be attached to the AVR in host mode at any one time
+			 *  and that the address used is not important (other than the fact that it is non-zero), a
+			 *  fixed value is specified by the library.
+			 */
+			#define USB_HOST_DEVICEADDRESS                 1
+
+			#if !defined(HOST_DEVICE_SETTLE_DELAY_MS) || defined(__DOXYGEN__)
+				/** Constant for the delay in milliseconds after a device is connected before the library
+				 *  will start the enumeration process. Some devices require a delay of up to 5 seconds
+				 *  after connection before the enumeration process can start or incorrect operation will
+				 *  occur.
+				 *
+				 *  The default delay value may be overridden in the user project makefile by defining the
+				 *  \c HOST_DEVICE_SETTLE_DELAY_MS token to the required delay in milliseconds, and passed to the
+				 *  compiler using the -D switch.
+				 */
+				#define HOST_DEVICE_SETTLE_DELAY_MS        1000
+			#endif
+
+		/* Enums: */
+			/** Enum for the error codes for the \ref EVENT_USB_Host_HostError() event.
+			 *
+			 *  \see \ref Group_Events for more information on this event.
+			 */
+			enum USB_Host_ErrorCodes_t
+			{
+				HOST_ERROR_VBusVoltageDip       = 0, /**< VBUS voltage dipped to an unacceptable level. This
+				                                      *   error may be the result of an attached device drawing
+				                                      *   too much current from the VBUS line, or due to the
+				                                      *   AVR's power source being unable to supply sufficient
+				                                      *   current.
+				                                      */
+			};
+
+			/** Enum for the error codes for the \ref EVENT_USB_Host_DeviceEnumerationFailed() event.
+			 *
+			 *  \see \ref Group_Events for more information on this event.
+			 */
+			enum USB_Host_EnumerationErrorCodes_t
+			{
+				HOST_ENUMERROR_NoError          = 0, /**< No error occurred. Used internally, this is not a valid
+				                                      *   ErrorCode parameter value for the \ref EVENT_USB_Host_DeviceEnumerationFailed()
+				                                      *   event.
+				                                      */
+				HOST_ENUMERROR_WaitStage        = 1, /**< One of the delays between enumeration steps failed
+				                                      *   to complete successfully, due to a timeout or other
+				                                      *   error.
+				                                      */
+				HOST_ENUMERROR_NoDeviceDetected = 2, /**< No device was detected, despite the USB data lines
+				                                      *   indicating the attachment of a device.
+				                                      */
+				HOST_ENUMERROR_ControlError     = 3, /**< One of the enumeration control requests failed to
+				                                      *   complete successfully.
+				                                      */
+				HOST_ENUMERROR_PipeConfigError  = 4, /**< The default control pipe (address 0) failed to
+				                                      *   configure correctly.
+				                                      */
+			};
+
+		/* Inline Functions: */
+			/** Returns the current USB frame number, when in host mode. Every millisecond the USB bus is active (i.e. not suspended)
+			 *  the frame number is incremented by one.
+			 *
+			 *  \return Current USB frame number from the USB controller.
+			 */
+			static inline uint16_t USB_Host_GetFrameNumber(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline uint16_t USB_Host_GetFrameNumber(void)
+			{
+				return AVR32_USBB_UHFNUM;
+			}
+
+			#if !defined(NO_SOF_EVENTS)
+				/** Enables the host mode Start Of Frame events. When enabled, this causes the
+				 *  \ref EVENT_USB_Host_StartOfFrame() event to fire once per millisecond, synchronized to the USB bus,
+				 *  at the start of each USB frame when a device is enumerated while in host mode.
+				 *
+				 *  \note This function is not available when the \c NO_SOF_EVENTS compile time token is defined.
+				 */
+				static inline void USB_Host_EnableSOFEvents(void) ATTR_ALWAYS_INLINE;
+				static inline void USB_Host_EnableSOFEvents(void)
+				{
+					USB_INT_Enable(USB_INT_HSOFI);
+				}
+
+				/** Disables the host mode Start Of Frame events. When disabled, this stops the firing of the
+				 *  \ref EVENT_USB_Host_StartOfFrame() event when enumerated in host mode.
+				 *
+				 *  \note This function is not available when the \c NO_SOF_EVENTS compile time token is defined.
+				 */
+				static inline void USB_Host_DisableSOFEvents(void) ATTR_ALWAYS_INLINE;
+				static inline void USB_Host_DisableSOFEvents(void)
+				{
+					USB_INT_Disable(USB_INT_HSOFI);
+				}
+			#endif
+
+			/** Resets the USB bus, including the endpoints in any attached device and pipes on the AVR host.
+			 *  USB bus resets leave the default control pipe configured (if already configured).
+			 *
+			 *  If the USB bus has been suspended prior to issuing a bus reset, the attached device will be
+			 *  woken up automatically and the bus resumed after the reset has been correctly issued.
+			 */
+			static inline void USB_Host_ResetBus(void) ATTR_ALWAYS_INLINE;
+			static inline void USB_Host_ResetBus(void)
+			{
+				AVR32_USBB.UHCON.reset = true;
+			}
+
+			/** Determines if a previously issued bus reset (via the \ref USB_Host_ResetBus() macro) has
+			 *  completed.
+			 *
+			 *  \return Boolean \c true if no bus reset is currently being sent, \c false otherwise.
+			 */
+			static inline bool USB_Host_IsBusResetComplete(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline bool USB_Host_IsBusResetComplete(void)
+			{
+				return AVR32_USBB.UHCON.reset;
+			}
+
+			/** Resumes USB communications with an attached and enumerated device, by resuming the transmission
+			 *  of the 1MS Start Of Frame messages to the device. When resumed, USB communications between the
+			 *  host and attached device may occur.
+			 */
+			static inline void USB_Host_ResumeBus(void) ATTR_ALWAYS_INLINE;
+			static inline void USB_Host_ResumeBus(void)
+			{
+				AVR32_USBB.UHCON.sofe = true;
+			}
+
+			/** Suspends the USB bus, preventing any communications from occurring between the host and attached
+			 *  device until the bus has been resumed. This stops the transmission of the 1MS Start Of Frame
+			 *  messages to the device.
+			 *
+			 *  \note While the USB bus is suspended, all USB interrupt sources are also disabled; this means that
+			 *        some events (such as device disconnections) will not fire until the bus is resumed.
+			 */
+			static inline void USB_Host_SuspendBus(void) ATTR_ALWAYS_INLINE;
+			static inline void USB_Host_SuspendBus(void)
+			{
+				AVR32_USBB.UHCON.sofe = false;
+			}
+
+			/** Determines if the USB bus has been suspended via the use of the \ref USB_Host_SuspendBus() macro,
+			 *  false otherwise. While suspended, no USB communications can occur until the bus is resumed,
+			 *  except for the Remote Wakeup event from the device if supported.
+			 *
+			 *  \return Boolean \c true if the bus is currently suspended, \c false otherwise.
+			 */
+			static inline bool USB_Host_IsBusSuspended(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline bool USB_Host_IsBusSuspended(void)
+			{
+				return AVR32_USBB.UHCON.sofe;
+			}
+
+			/** Determines if the attached device is currently enumerated in Full Speed mode (12Mb/s), or
+			 *  false if the attached device is enumerated in Low Speed mode (1.5Mb/s).
+			 *
+			 *  \return Boolean \c true if the attached device is enumerated in Full Speed mode, \c false otherwise.
+			 */
+			static inline bool USB_Host_IsDeviceFullSpeed(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline bool USB_Host_IsDeviceFullSpeed(void)
+			{
+				return (AVR32_USBB.USBSTA.speed == AVR32_USBB_SPEED_FULL);
+			}
+
+			/** Determines if the attached device is currently issuing a Remote Wakeup request, requesting
+			 *  that the host resume the USB bus and wake up the device, \c false otherwise.
+			 *
+			 *  \return Boolean \c true if the attached device has sent a Remote Wakeup request, \c false otherwise.
+			 */
+			static inline bool USB_Host_IsRemoteWakeupSent(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline bool USB_Host_IsRemoteWakeupSent(void)
+			{
+				return AVR32_USBB.UHINT.rxrsmi;
+			}
+
+			/** Clears the flag indicating that a Remote Wakeup request has been issued by an attached device. */
+			static inline void USB_Host_ClearRemoteWakeupSent(void) ATTR_ALWAYS_INLINE;
+			static inline void USB_Host_ClearRemoteWakeupSent(void)
+			{
+				AVR32_USBB.UHINTCLR.rxrsmic = true;
+			}
+
+			/** Accepts a Remote Wakeup request from an attached device. This must be issued in response to
+			 *  a device's Remote Wakeup request within 2ms for the request to be accepted and the bus to
+			 *  be resumed.
+			 */
+			static inline void USB_Host_ResumeFromWakeupRequest(void) ATTR_ALWAYS_INLINE;
+			static inline void USB_Host_ResumeFromWakeupRequest(void)
+			{
+				AVR32_USBB.UHCON.resume = true;
+			}
+
+			/** Determines if a resume from Remote Wakeup request is currently being sent to an attached
+			 *  device.
+			 *
+			 *  \return Boolean \c true if no resume request is currently being sent, \c false otherwise.
+			 */
+			static inline bool USB_Host_IsResumeFromWakeupRequestSent(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline bool USB_Host_IsResumeFromWakeupRequestSent(void)
+			{
+				return AVR32_USBB.UHCON.resume;
+			}
+
+	/* Private Interface - For use in library only: */
+	#if !defined(__DOXYGEN__)
+		/* Macros: */
+			static inline void USB_Host_HostMode_On(void) ATTR_ALWAYS_INLINE;
+			static inline void USB_Host_HostMode_On(void)
+			{
+				// Not required for UC3B
+			}
+
+			static inline void USB_Host_HostMode_Off(void) ATTR_ALWAYS_INLINE;
+			static inline void USB_Host_HostMode_Off(void)
+			{
+				// Not required for UC3B
+			}
+
+			static inline void USB_Host_VBUS_Auto_Enable(void) ATTR_ALWAYS_INLINE;
+			static inline void USB_Host_VBUS_Auto_Enable(void)
+			{
+				AVR32_USBB.USBCON.vbushwc = false;
+			}
+
+			static inline void USB_Host_VBUS_Manual_Enable(void) ATTR_ALWAYS_INLINE;
+			static inline void USB_Host_VBUS_Manual_Enable(void)
+			{
+				AVR32_USBB.USBCON.vbushwc = true;
+			}
+
+			static inline void USB_Host_VBUS_Auto_On(void) ATTR_ALWAYS_INLINE;
+			static inline void USB_Host_VBUS_Auto_On(void)
+			{
+				AVR32_USBB.USBSTASET.vbusrqs = true;
+			}
+
+			static inline void USB_Host_VBUS_Manual_On(void) ATTR_ALWAYS_INLINE;
+			static inline void USB_Host_VBUS_Manual_On(void)
+			{
+				AVR32_USBB.USBSTASET.vbusrqs = true;
+			}
+
+			static inline void USB_Host_VBUS_Auto_Off(void) ATTR_ALWAYS_INLINE;
+			static inline void USB_Host_VBUS_Auto_Off(void)
+			{
+				AVR32_USBB.USBSTACLR.vbusrqc = true;
+			}
+
+			static inline void USB_Host_VBUS_Manual_Off(void) ATTR_ALWAYS_INLINE;
+			static inline void USB_Host_VBUS_Manual_Off(void)
+			{
+				AVR32_USBB.USBSTACLR.vbusrqc = true;
+			}
+
+			static inline void USB_Host_SetDeviceAddress(const uint8_t Address) ATTR_ALWAYS_INLINE;
+			static inline void USB_Host_SetDeviceAddress(const uint8_t Address)
+			{
+				AVR32_USBB.UHADDR1.uhaddr_p0 = Address;
+				AVR32_USBB.UHADDR1.uhaddr_p1 = Address;
+				AVR32_USBB.UHADDR1.uhaddr_p2 = Address;
+				AVR32_USBB.UHADDR1.uhaddr_p3 = Address;
+				AVR32_USBB.UHADDR2.uhaddr_p4 = Address;
+				AVR32_USBB.UHADDR2.uhaddr_p5 = Address;
+				AVR32_USBB.UHADDR2.uhaddr_p6 = Address;
+			}
+
+		/* Enums: */
+			enum USB_Host_WaitMSErrorCodes_t
+			{
+				HOST_WAITERROR_Successful       = 0,
+				HOST_WAITERROR_DeviceDisconnect = 1,
+				HOST_WAITERROR_PipeError        = 2,
+				HOST_WAITERROR_SetupStalled     = 3,
+			};
+
+		/* Function Prototypes: */
+			void    USB_Host_ProcessNextHostState(void);
+			uint8_t USB_Host_WaitMS(uint8_t MS);
+
+			#if defined(__INCLUDE_FROM_HOST_C)
+				static void USB_Host_ResetDevice(void);
+			#endif
+	#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Core/UC3/PipeStream_UC3.c b/lib/lufa/LUFA/Drivers/USB/Core/UC3/PipeStream_UC3.c
new file mode 100644
index 0000000000..27426ada0b
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Core/UC3/PipeStream_UC3.c
@@ -0,0 +1,166 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+#include "../../../../Common/Common.h"
+#if (ARCH == ARCH_UC3)
+
+#define  __INCLUDE_FROM_USB_DRIVER
+#include "../USBMode.h"
+
+#if defined(USB_CAN_BE_HOST)
+
+#include "PipeStream_UC3.h"
+
+uint8_t Pipe_Discard_Stream(uint16_t Length,
+                            uint16_t* const BytesProcessed)
+{
+	uint8_t  ErrorCode;
+	uint16_t BytesInTransfer = 0;
+
+	Pipe_SetPipeToken(PIPE_TOKEN_IN);
+
+	if ((ErrorCode = Pipe_WaitUntilReady()))
+	  return ErrorCode;
+
+	if (BytesProcessed != NULL)
+	  Length -= *BytesProcessed;
+
+	while (Length)
+	{
+		if (!(Pipe_IsReadWriteAllowed()))
+		{
+			Pipe_ClearIN();
+
+			if (BytesProcessed != NULL)
+			{
+				*BytesProcessed += BytesInTransfer;
+				return PIPE_RWSTREAM_IncompleteTransfer;
+			}
+
+			if ((ErrorCode = Pipe_WaitUntilReady()))
+			  return ErrorCode;
+		}
+		else
+		{
+			Pipe_Discard_8();
+
+			Length--;
+			BytesInTransfer++;
+		}
+	}
+
+	return PIPE_RWSTREAM_NoError;
+}
+
+uint8_t Pipe_Null_Stream(uint16_t Length,
+                         uint16_t* const BytesProcessed)
+{
+	uint8_t  ErrorCode;
+	uint16_t BytesInTransfer = 0;
+
+	Pipe_SetPipeToken(PIPE_TOKEN_OUT);
+
+	if ((ErrorCode = Pipe_WaitUntilReady()))
+	  return ErrorCode;
+
+	if (BytesProcessed != NULL)
+	  Length -= *BytesProcessed;
+
+	while (Length)
+	{
+		if (!(Pipe_IsReadWriteAllowed()))
+		{
+			Pipe_ClearOUT();
+
+			if (BytesProcessed != NULL)
+			{
+				*BytesProcessed += BytesInTransfer;
+				return PIPE_RWSTREAM_IncompleteTransfer;
+			}
+
+			USB_USBTask();
+
+			if ((ErrorCode = Pipe_WaitUntilReady()))
+			  return ErrorCode;
+		}
+		else
+		{
+			Pipe_Write_8(0);
+
+			Length--;
+			BytesInTransfer++;
+		}
+	}
+
+	return PIPE_RWSTREAM_NoError;
+}
+
+/* The following abuses the C preprocessor in order to copy-paste common code with slight alterations,
+ * so that the code needs to be written once. It is a crude form of templating to reduce code maintenance. */
+
+#define  TEMPLATE_FUNC_NAME                        Pipe_Write_Stream_LE
+#define  TEMPLATE_BUFFER_TYPE                      const void*
+#define  TEMPLATE_TOKEN                            PIPE_TOKEN_OUT
+#define  TEMPLATE_CLEAR_PIPE()                     Pipe_ClearOUT()
+#define  TEMPLATE_BUFFER_OFFSET(Length)            0
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   DataStream += Amount
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Pipe_Write_8(*BufferPtr)
+#include "Template/Template_Pipe_RW.c"
+
+#define  TEMPLATE_FUNC_NAME                        Pipe_Write_Stream_BE
+#define  TEMPLATE_BUFFER_TYPE                      const void*
+#define  TEMPLATE_TOKEN                            PIPE_TOKEN_OUT
+#define  TEMPLATE_CLEAR_PIPE()                     Pipe_ClearOUT()
+#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   DataStream -= Amount
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Pipe_Write_8(*BufferPtr)
+#include "Template/Template_Pipe_RW.c"
+
+#define  TEMPLATE_FUNC_NAME                        Pipe_Read_Stream_LE
+#define  TEMPLATE_BUFFER_TYPE                      void*
+#define  TEMPLATE_TOKEN                            PIPE_TOKEN_IN
+#define  TEMPLATE_CLEAR_PIPE()                     Pipe_ClearIN()
+#define  TEMPLATE_BUFFER_OFFSET(Length)            0
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   DataStream += Amount
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         *BufferPtr = Pipe_Read_8()
+#include "Template/Template_Pipe_RW.c"
+
+#define  TEMPLATE_FUNC_NAME                        Pipe_Read_Stream_BE
+#define  TEMPLATE_BUFFER_TYPE                      void*
+#define  TEMPLATE_TOKEN                            PIPE_TOKEN_IN
+#define  TEMPLATE_CLEAR_PIPE()                     Pipe_ClearIN()
+#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   DataStream -= Amount
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         *BufferPtr = Pipe_Read_8()
+#include "Template/Template_Pipe_RW.c"
+
+#endif
+
+#endif
diff --git a/lib/lufa/LUFA/Drivers/USB/Core/UC3/PipeStream_UC3.h b/lib/lufa/LUFA/Drivers/USB/Core/UC3/PipeStream_UC3.h
new file mode 100644
index 0000000000..cc34442084
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Core/UC3/PipeStream_UC3.h
@@ -0,0 +1,352 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Pipe data stream transmission and reception management for the AVR32 UC3 microcontrollers.
+ *  \copydetails Group_PipeStreamRW_UC3
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the USB driver
+ *        dispatch header located in LUFA/Drivers/USB/USB.h.
+ */
+
+/** \ingroup Group_PipeStreamRW
+ *  \defgroup Group_PipeStreamRW_UC3 Read/Write of Multi-Byte Streams (UC3)
+ *  \brief Pipe data stream transmission and reception management for the Atmel AVR32 UC3 architecture.
+ *
+ *  Functions, macros, variables, enums and types related to data reading and writing of data streams from
+ *  and to pipes.
+ *
+ *  @{
+ */
+
+#ifndef __PIPE_STREAM_UC3_H__
+#define __PIPE_STREAM_UC3_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+		#include "../USBMode.h"
+		#include "../USBTask.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_USB_DRIVER)
+			#error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Function Prototypes: */
+			/** \name Stream functions for null data */
+			//@{
+
+			/** Reads and discards the given number of bytes from the pipe, discarding fully read packets from the host
+			 *  as needed. The last packet is not automatically discarded once the remaining bytes has been read; the
+			 *  user is responsible for manually discarding the last packet from the device via the \ref Pipe_ClearIN() macro.
+			 *
+			 *  If the BytesProcessed parameter is \c NULL, the entire stream transfer is attempted at once, failing or
+			 *  succeeding as a single unit. If the BytesProcessed parameter points to a valid storage location, the transfer
+			 *  will instead be performed as a series of chunks. Each time the pipe bank becomes empty while there is still data
+			 *  to process (and after the current packet has been acknowledged) the BytesProcessed location will be updated with
+			 *  the total number of bytes processed in the stream, and the function will exit with an error code of
+			 *  \ref PIPE_RWSTREAM_IncompleteTransfer. This allows for any abort checking to be performed in the user code - to
+			 *  continue the transfer, call the function again with identical parameters and it will resume until the BytesProcessed
+			 *  value reaches the total transfer length.
+			 *
+			 *  <b>Single Stream Transfer Example:</b>
+			 *  \code
+			 *  uint8_t ErrorCode;
+			 *
+			 *  if ((ErrorCode = Pipe_Discard_Stream(512, NULL)) != PIPE_RWSTREAM_NoError)
+			 *  {
+			 *       // Stream failed to complete - check ErrorCode here
+			 *  }
+			 *  \endcode
+			 *
+			 *  <b>Partial Stream Transfers Example:</b>
+			 *  \code
+			 *  uint8_t  ErrorCode;
+			 *  uint16_t BytesProcessed;
+			 *
+			 *  BytesProcessed = 0;
+			 *  while ((ErrorCode = Pipe_Discard_Stream(512, &BytesProcessed)) == PIPE_RWSTREAM_IncompleteTransfer)
+			 *  {
+			 *      // Stream not yet complete - do other actions here, abort if required
+			 *  }
+			 *
+			 *  if (ErrorCode != PIPE_RWSTREAM_NoError)
+			 *  {
+			 *      // Stream failed to complete - check ErrorCode here
+			 *  }
+			 *  \endcode
+			 *
+			 *  \note The pipe token is set automatically, thus this can be used on bi-directional pipes directly without
+			 *        having to explicitly change the data direction with a call to \ref Pipe_SetPipeToken().
+			 *
+			 *  \param[in] Length          Number of bytes to discard via the currently selected pipe.
+			 *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes already processed should
+			 *                             updated, \c NULL if the entire stream should be processed at once.
+			 *
+			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t Pipe_Discard_Stream(uint16_t Length,
+			                            uint16_t* const BytesProcessed);
+
+			/** Writes a given number of zeroed bytes to the pipe, sending full pipe packets from the host to the device
+			 *  as needed. The last packet is not automatically sent once the remaining bytes has been written; the
+			 *  user is responsible for manually discarding the last packet from the device via the \ref Pipe_ClearOUT() macro.
+			 *
+			 *  If the BytesProcessed parameter is \c NULL, the entire stream transfer is attempted at once, failing or
+			 *  succeeding as a single unit. If the BytesProcessed parameter points to a valid storage location, the transfer
+			 *  will instead be performed as a series of chunks. Each time the pipe bank becomes full while there is still data
+			 *  to process (and after the current packet transmission has been initiated) the BytesProcessed location will be
+			 *  updated with the total number of bytes processed in the stream, and the function will exit with an error code of
+			 *  \ref PIPE_RWSTREAM_IncompleteTransfer. This allows for any abort checking to be performed in the user code - to
+			 *  continue the transfer, call the function again with identical parameters and it will resume until the BytesProcessed
+			 *  value reaches the total transfer length.
+			 *
+			 *  <b>Single Stream Transfer Example:</b>
+			 *  \code
+			 *  uint8_t ErrorCode;
+			 *
+			 *  if ((ErrorCode = Pipe_Null_Stream(512, NULL)) != PIPE_RWSTREAM_NoError)
+			 *  {
+			 *       // Stream failed to complete - check ErrorCode here
+			 *  }
+			 *  \endcode
+			 *
+			 *  <b>Partial Stream Transfers Example:</b>
+			 *  \code
+			 *  uint8_t  ErrorCode;
+			 *  uint16_t BytesProcessed;
+			 *
+			 *  BytesProcessed = 0;
+			 *  while ((ErrorCode = Pipe_Null_Stream(512, &BytesProcessed)) == PIPE_RWSTREAM_IncompleteTransfer)
+			 *  {
+			 *      // Stream not yet complete - do other actions here, abort if required
+			 *  }
+			 *
+			 *  if (ErrorCode != PIPE_RWSTREAM_NoError)
+			 *  {
+			 *      // Stream failed to complete - check ErrorCode here
+			 *  }
+			 *  \endcode
+			 *
+			 *  \note The pipe token is set automatically, thus this can be used on bi-directional pipes directly without
+			 *        having to explicitly change the data direction with a call to \ref Pipe_SetPipeToken().
+			 *
+			 *  \param[in] Length          Number of zero bytes to write via the currently selected pipe.
+			 *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes already processed should
+			 *                             updated, \c NULL if the entire stream should be processed at once.
+			 *
+			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t Pipe_Null_Stream(uint16_t Length,
+			                         uint16_t* const BytesProcessed);
+
+			//@}
+
+			/** \name Stream functions for RAM source/destination data */
+			//@{
+
+			/** Writes the given number of bytes to the pipe from the given buffer in little endian,
+			 *  sending full packets to the device as needed. The last packet filled is not automatically sent;
+			 *  the user is responsible for manually sending the last written packet to the host via the
+			 *  \ref Pipe_ClearOUT() macro. Between each USB packet, the given stream callback function is
+			 *  executed repeatedly until the next packet is ready, allowing for early aborts of stream transfers.
+			 *
+			 *  If the BytesProcessed parameter is \c NULL, the entire stream transfer is attempted at once,
+			 *  failing or succeeding as a single unit. If the BytesProcessed parameter points to a valid
+			 *  storage location, the transfer will instead be performed as a series of chunks. Each time
+			 *  the pipe bank becomes full while there is still data to process (and after the current
+			 *  packet transmission has been initiated) the BytesProcessed location will be updated with the
+			 *  total number of bytes processed in the stream, and the function will exit with an error code of
+			 *  \ref PIPE_RWSTREAM_IncompleteTransfer. This allows for any abort checking to be performed
+			 *  in the user code - to continue the transfer, call the function again with identical parameters
+			 *  and it will resume until the BytesProcessed value reaches the total transfer length.
+			 *
+			 *  <b>Single Stream Transfer Example:</b>
+			 *  \code
+			 *  uint8_t DataStream[512];
+			 *  uint8_t ErrorCode;
+			 *
+			 *  if ((ErrorCode = Pipe_Write_Stream_LE(DataStream, sizeof(DataStream),
+			 *                                        NULL)) != PIPE_RWSTREAM_NoError)
+			 *  {
+			 *       // Stream failed to complete - check ErrorCode here
+			 *  }
+			 *  \endcode
+			 *
+			 *  <b>Partial Stream Transfers Example:</b>
+			 *  \code
+			 *  uint8_t  DataStream[512];
+			 *  uint8_t  ErrorCode;
+			 *  uint16_t BytesProcessed;
+			 *
+			 *  BytesProcessed = 0;
+			 *  while ((ErrorCode = Pipe_Write_Stream_LE(DataStream, sizeof(DataStream),
+			 *                                           &BytesProcessed)) == PIPE_RWSTREAM_IncompleteTransfer)
+			 *  {
+			 *      // Stream not yet complete - do other actions here, abort if required
+			 *  }
+			 *
+			 *  if (ErrorCode != PIPE_RWSTREAM_NoError)
+			 *  {
+			 *      // Stream failed to complete - check ErrorCode here
+			 *  }
+			 *  \endcode
+			 *
+			 *  \note The pipe token is set automatically, thus this can be used on bi-directional pipes directly without
+			 *        having to explicitly change the data direction with a call to \ref Pipe_SetPipeToken().
+			 *
+			 *  \param[in] Buffer          Pointer to the source data buffer to read from.
+			 *  \param[in] Length          Number of bytes to read for the currently selected pipe into the buffer.
+			 *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes already processed should
+			 *                             updated, \c NULL if the entire stream should be written at once.
+			 *
+			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t Pipe_Write_Stream_LE(const void* const Buffer,
+			                             uint16_t Length,
+			                             uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Writes the given number of bytes to the pipe from the given buffer in big endian,
+			 *  sending full packets to the device as needed. The last packet filled is not automatically sent;
+			 *  the user is responsible for manually sending the last written packet to the host via the
+			 *  \ref Pipe_ClearOUT() macro. Between each USB packet, the given stream callback function is
+			 *  executed repeatedly until the next packet is ready, allowing for early aborts of stream transfers.
+			 *
+			 *  \note The pipe token is set automatically, thus this can be used on bi-directional pipes directly without
+			 *        having to explicitly change the data direction with a call to \ref Pipe_SetPipeToken().
+			 *
+			 *  \param[in] Buffer          Pointer to the source data buffer to read from.
+			 *  \param[in] Length          Number of bytes to read for the currently selected pipe into the buffer.
+			 *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes already processed should
+			 *                             updated, \c NULL if the entire stream should be written at once.
+			 *
+			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t Pipe_Write_Stream_BE(const void* const Buffer,
+			                             uint16_t Length,
+			                             uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Reads the given number of bytes from the pipe into the given buffer in little endian,
+			 *  sending full packets to the device as needed. The last packet filled is not automatically sent;
+			 *  the user is responsible for manually sending the last written packet to the host via the
+			 *  \ref Pipe_ClearIN() macro. Between each USB packet, the given stream callback function is
+			 *  executed repeatedly until the next packet is ready, allowing for early aborts of stream transfers.
+			 *
+			 *  If the BytesProcessed parameter is \c NULL, the entire stream transfer is attempted at once,
+			 *  failing or succeeding as a single unit. If the BytesProcessed parameter points to a valid
+			 *  storage location, the transfer will instead be performed as a series of chunks. Each time
+			 *  the pipe bank becomes empty while there is still data to process (and after the current
+			 *  packet has been acknowledged) the BytesProcessed location will be updated with the total number
+			 *  of bytes processed in the stream, and the function will exit with an error code of
+			 *  \ref PIPE_RWSTREAM_IncompleteTransfer. This allows for any abort checking to be performed
+			 *  in the user code - to continue the transfer, call the function again with identical parameters
+			 *  and it will resume until the BytesProcessed value reaches the total transfer length.
+			 *
+			 *  <b>Single Stream Transfer Example:</b>
+			 *  \code
+			 *  uint8_t DataStream[512];
+			 *  uint8_t ErrorCode;
+			 *
+			 *  if ((ErrorCode = Pipe_Read_Stream_LE(DataStream, sizeof(DataStream),
+			 *                                       NULL)) != PIPE_RWSTREAM_NoError)
+			 *  {
+			 *       // Stream failed to complete - check ErrorCode here
+			 *  }
+			 *  \endcode
+			 *
+			 *  <b>Partial Stream Transfers Example:</b>
+			 *  \code
+			 *  uint8_t  DataStream[512];
+			 *  uint8_t  ErrorCode;
+			 *  uint16_t BytesProcessed;
+			 *
+			 *  BytesProcessed = 0;
+			 *  while ((ErrorCode = Pipe_Read_Stream_LE(DataStream, sizeof(DataStream),
+			 *                                          &BytesProcessed)) == PIPE_RWSTREAM_IncompleteTransfer)
+			 *  {
+			 *      // Stream not yet complete - do other actions here, abort if required
+			 *  }
+			 *
+			 *  if (ErrorCode != PIPE_RWSTREAM_NoError)
+			 *  {
+			 *      // Stream failed to complete - check ErrorCode here
+			 *  }
+			 *  \endcode
+			 *
+			 *  \note The pipe token is set automatically, thus this can be used on bi-directional pipes directly without
+			 *        having to explicitly change the data direction with a call to \ref Pipe_SetPipeToken().
+			 *
+			 *  \param[out] Buffer          Pointer to the source data buffer to write to.
+			 *  \param[in]  Length          Number of bytes to read for the currently selected pipe to read from.
+			 *  \param[in]  BytesProcessed  Pointer to a location where the total number of bytes already processed should
+			 *                              updated, \c NULL if the entire stream should be read at once.
+			 *
+			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t Pipe_Read_Stream_LE(void* const Buffer,
+			                            uint16_t Length,
+			                            uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Reads the given number of bytes from the pipe into the given buffer in big endian,
+			 *  sending full packets to the device as needed. The last packet filled is not automatically sent;
+			 *  the user is responsible for manually sending the last written packet to the host via the
+			 *  \ref Pipe_ClearIN() macro. Between each USB packet, the given stream callback function is
+			 *  executed repeatedly until the next packet is ready, allowing for early aborts of stream transfers.
+			 *
+			 *  \note The pipe token is set automatically, thus this can be used on bi-directional pipes directly without
+			 *        having to explicitly change the data direction with a call to \ref Pipe_SetPipeToken().
+			 *
+			 *  \param[out] Buffer          Pointer to the source data buffer to write to.
+			 *  \param[in]  Length          Number of bytes to read for the currently selected pipe to read from.
+			 *  \param[in]  BytesProcessed  Pointer to a location where the total number of bytes already processed should
+			 *                              updated, \c NULL if the entire stream should be read at once.
+			 *
+			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t Pipe_Read_Stream_BE(void* const Buffer,
+			                            uint16_t Length,
+			                            uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1);
+			//@}
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Core/UC3/Pipe_UC3.c b/lib/lufa/LUFA/Drivers/USB/Core/UC3/Pipe_UC3.c
new file mode 100644
index 0000000000..73cf360783
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Core/UC3/Pipe_UC3.c
@@ -0,0 +1,209 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+#include "../../../../Common/Common.h"
+#if (ARCH == ARCH_UC3)
+
+#define  __INCLUDE_FROM_USB_DRIVER
+#include "../USBMode.h"
+
+#if defined(USB_CAN_BE_HOST)
+
+#include "../Pipe.h"
+
+uint8_t USB_Host_ControlPipeSize = PIPE_CONTROLPIPE_DEFAULT_SIZE;
+
+volatile uint32_t USB_Pipe_SelectedPipe = PIPE_CONTROLPIPE;
+volatile uint8_t* USB_Pipe_FIFOPos[PIPE_TOTAL_PIPES];
+
+bool Pipe_ConfigurePipeTable(const USB_Pipe_Table_t* const Table,
+                             const uint8_t Entries)
+{
+	for (uint8_t i = 0; i < Entries; i++)
+	{
+		if (!(Table[i].Address))
+		  continue;
+
+		if (!(Pipe_ConfigurePipe(Table[i].Address, Table[i].Type, Table[i].EndpointAddress, Table[i].Size, Table[i].Banks)))
+		{
+			return false;
+		}
+	}
+
+	return true;
+}
+
+bool Pipe_ConfigurePipe(const uint8_t Address,
+                        const uint8_t Type,
+                        const uint8_t EndpointAddress,
+                        const uint16_t Size,
+                        const uint8_t Banks)
+{
+	uint8_t Number = (Address & PIPE_EPNUM_MASK);
+	uint8_t Token  = (Address & PIPE_DIR_IN) ? PIPE_TOKEN_IN : PIPE_TOKEN_OUT;
+
+	if (Number >= PIPE_TOTAL_PIPES)
+	  return false;
+
+	if (Type == EP_TYPE_CONTROL)
+	  Token = PIPE_TOKEN_SETUP;
+
+	USB_Pipe_FIFOPos[Number]     = &AVR32_USBB_SLAVE[Number * PIPE_HSB_ADDRESS_SPACE_SIZE];
+
+#if defined(ORDERED_EP_CONFIG)
+	Pipe_SelectPipe(Number);
+	Pipe_EnablePipe();
+
+	(&AVR32_USBB.upcfg0)[Number] = 0;
+	(&AVR32_USBB.upcfg0)[Number] = (AVR32_USBB_ALLOC_MASK |
+	                                ((uint32_t)Type  << AVR32_USBB_PTYPE_OFFSET)  |
+	                                ((uint32_t)Token << AVR32_USBB_PTOKEN_OFFSET) |
+	                                ((Banks > 1) ? AVR32_USBB_PBK_MASK : 0)       |
+	                                Pipe_BytesToEPSizeMask(Size) |
+	                                ((uint32_t)Number << AVR32_USBB_PEPNUM_OFFSET));
+
+	Pipe_SetInfiniteINRequests();
+
+	return Pipe_IsConfigured();
+#else
+	for (uint8_t PNum = Number; PNum < PIPE_TOTAL_PIPES; PNum++)
+	{
+		uint32_t UPCFG0Temp;
+
+		Pipe_SelectPipe(PNum);
+
+		if (PNum == Number)
+		{
+			UPCFG0Temp = (AVR32_USBB_ALLOC_MASK |
+			              ((uint32_t)Type  << AVR32_USBB_PTYPE_OFFSET)  |
+			              ((uint32_t)Token << AVR32_USBB_PTOKEN_OFFSET) |
+			              ((Banks > 1) ? AVR32_USBB_PBK_MASK : 0)       |
+			              Pipe_BytesToEPSizeMask(Size) |
+			              ((EndpointAddress & PIPE_EPNUM_MASK) << AVR32_USBB_PEPNUM_OFFSET));
+		}
+		else
+		{
+			UPCFG0Temp = (&AVR32_USBB.upcfg0)[PNum];
+		}
+
+		if (!(UPCFG0Temp & AVR32_USBB_ALLOC_MASK))
+		  continue;
+
+		Pipe_DisablePipe();
+		(&AVR32_USBB.upcfg0)[PNum] &= ~AVR32_USBB_ALLOC_MASK;
+
+		Pipe_EnablePipe();
+		(&AVR32_USBB.upcfg0)[PNum] = UPCFG0Temp;
+
+		Pipe_SetInfiniteINRequests();
+
+		if (!(Pipe_IsConfigured()))
+		  return false;
+	}
+
+	Pipe_SelectPipe(Number);
+	return true;
+#endif
+}
+
+void Pipe_ClearPipes(void)
+{
+	for (uint8_t PNum = 0; PNum < PIPE_TOTAL_PIPES; PNum++)
+	{
+		Pipe_SelectPipe(PNum);
+		(&AVR32_USBB.upcfg0)[PNum]    = 0;
+		(&AVR32_USBB.upcon0clr)[PNum] = -1;
+		USB_Pipe_FIFOPos[PNum]        = &AVR32_USBB_SLAVE[PNum * 0x10000];
+		Pipe_DisablePipe();
+	}
+}
+
+bool Pipe_IsEndpointBound(const uint8_t EndpointAddress)
+{
+	uint8_t PrevPipeNumber = Pipe_GetCurrentPipe();
+
+	for (uint8_t PNum = 0; PNum < PIPE_TOTAL_PIPES; PNum++)
+	{
+		Pipe_SelectPipe(PNum);
+
+		if (!(Pipe_IsConfigured()))
+		  continue;
+
+		if (Pipe_GetBoundEndpointAddress() == EndpointAddress)
+		  return true;
+	}
+
+	Pipe_SelectPipe(PrevPipeNumber);
+	return false;
+}
+
+uint8_t Pipe_WaitUntilReady(void)
+{
+	#if (USB_STREAM_TIMEOUT_MS < 0xFF)
+	uint8_t  TimeoutMSRem = USB_STREAM_TIMEOUT_MS;
+	#else
+	uint16_t TimeoutMSRem = USB_STREAM_TIMEOUT_MS;
+	#endif
+
+	uint16_t PreviousFrameNumber = USB_Host_GetFrameNumber();
+
+	for (;;)
+	{
+		if (Pipe_GetPipeToken() == PIPE_TOKEN_IN)
+		{
+			if (Pipe_IsINReceived())
+			  return PIPE_READYWAIT_NoError;
+		}
+		else
+		{
+			if (Pipe_IsOUTReady())
+			  return PIPE_READYWAIT_NoError;
+		}
+
+		if (Pipe_IsStalled())
+		  return PIPE_READYWAIT_PipeStalled;
+		else if (USB_HostState == HOST_STATE_Unattached)
+		  return PIPE_READYWAIT_DeviceDisconnected;
+
+		uint16_t CurrentFrameNumber = USB_Host_GetFrameNumber();
+
+		if (CurrentFrameNumber != PreviousFrameNumber)
+		{
+			PreviousFrameNumber = CurrentFrameNumber;
+
+			if (!(TimeoutMSRem--))
+			  return PIPE_READYWAIT_Timeout;
+		}
+	}
+}
+
+#endif
+
+#endif
diff --git a/lib/lufa/LUFA/Drivers/USB/Core/UC3/Pipe_UC3.h b/lib/lufa/LUFA/Drivers/USB/Core/UC3/Pipe_UC3.h
new file mode 100644
index 0000000000..12e0dcd62d
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Core/UC3/Pipe_UC3.h
@@ -0,0 +1,924 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief USB Pipe definitions for the AVR32 UC3 microcontrollers.
+ *  \copydetails Group_PipeManagement_UC3
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the USB driver
+ *        dispatch header located in LUFA/Drivers/USB/USB.h.
+ */
+
+/** \ingroup Group_PipeRW
+ *  \defgroup Group_PipeRW_UC3 Pipe Data Reading and Writing (UC3)
+ *  \brief Pipe data read/write definitions for the Atmel AVR32 UC3 architecture.
+ *
+ *  Functions, macros, variables, enums and types related to data reading and writing from and to pipes.
+ */
+
+/** \ingroup Group_PipePrimitiveRW
+ *  \defgroup Group_PipePrimitiveRW_UC3 Read/Write of Primitive Data Types (UC3)
+ *  \brief Pipe primitive data read/write definitions for the Atmel AVR32 UC3 architecture.
+ *
+ *  Functions, macros, variables, enums and types related to data reading and writing of primitive data types
+ *  from and to pipes.
+ */
+
+/** \ingroup Group_PipePacketManagement
+ *  \defgroup Group_PipePacketManagement_UC3 Pipe Packet Management (UC3)
+ *  \brief Pipe packet management definitions for the Atmel AVR32 UC3 architecture.
+ *
+ *  Functions, macros, variables, enums and types related to packet management of pipes.
+ */
+
+/** \ingroup Group_PipeControlReq
+ *  \defgroup Group_PipeControlReq_UC3 Pipe Control Request Management (UC3)
+ *  \brief Pipe control request management definitions for the Atmel AVR32 UC3 architecture.
+ *
+ *  Module for host mode request processing. This module allows for the transmission of standard, class and
+ *  vendor control requests to the default control endpoint of an attached device while in host mode.
+ *
+ *  \see Chapter 9 of the USB 2.0 specification.
+ */
+
+/** \ingroup Group_PipeManagement
+ *  \defgroup Group_PipeManagement_UC3 Pipe Management (UC3)
+ *  \brief Pipe management definitions for the Atmel AVR32 UC3 architecture.
+ *
+ *  This module contains functions, macros and enums related to pipe management when in USB Host mode. This
+ *  module contains the pipe management macros, as well as pipe interrupt and data send/receive functions
+ *  for various data types.
+ *
+ *  @{
+ */
+
+#ifndef __PIPE_UC3_H__
+#define __PIPE_UC3_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+		#include "../USBTask.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_USB_DRIVER)
+			#error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.
+		#endif
+
+	/* Private Interface - For use in library only: */
+	#if !defined(__DOXYGEN__)
+		/* Macros: */
+			#define PIPE_HSB_ADDRESS_SPACE_SIZE     (64 * 1024UL)
+
+		/* External Variables: */
+			extern volatile uint32_t USB_Pipe_SelectedPipe;
+			extern volatile uint8_t* USB_Pipe_FIFOPos[];
+	#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** \name Pipe Error Flag Masks */
+			//@{
+			/** Mask for \ref Pipe_GetErrorFlags(), indicating that an overflow error occurred in the pipe on the received data. */
+			#define PIPE_ERRORFLAG_OVERFLOW         (AVR32_USBB_UPSTA0_OVERFI_MASK << 8)
+
+			/** Mask for \ref Pipe_GetErrorFlags(), indicating that a CRC error occurred in the pipe on the received data. */
+			#define PIPE_ERRORFLAG_CRC16            AVR32_USBB_UPERR0_CRC16_MASK
+
+			/** Mask for \ref Pipe_GetErrorFlags(), indicating that a hardware timeout error occurred in the pipe. */
+			#define PIPE_ERRORFLAG_TIMEOUT          AVR32_USBB_UPERR0_TIMEOUT_MASK
+
+			/** Mask for \ref Pipe_GetErrorFlags(), indicating that a hardware PID error occurred in the pipe. */
+			#define PIPE_ERRORFLAG_PID              AVR32_USBB_UPERR0_PID_MASK
+
+			/** Mask for \ref Pipe_GetErrorFlags(), indicating that a hardware data PID error occurred in the pipe. */
+			#define PIPE_ERRORFLAG_DATAPID          AVR32_USBB_UPERR0_DATAPID_MASK
+
+			/** Mask for \ref Pipe_GetErrorFlags(), indicating that a hardware data toggle error occurred in the pipe. */
+			#define PIPE_ERRORFLAG_DATATGL          AVR32_USBB_UPERR0_DATATGL_MASK
+			//@}
+
+			/** \name Pipe Token Masks */
+			//@{
+			/** Token mask for \ref Pipe_SetPipeToken() and \ref Pipe_GetPipeToken(). This sets the pipe as a SETUP token (for CONTROL type pipes),
+			 *  which will trigger a control request on the attached device when data is written to the pipe.
+			 */
+			#define PIPE_TOKEN_SETUP                AVR32_USBB_UPCFG0_PTOKEN_SETUP
+
+			/** Token mask for \ref Pipe_SetPipeToken() and \ref Pipe_GetPipeToken(). This sets the pipe as a IN token (for non-CONTROL type pipes),
+			 *  indicating that the pipe data will flow from device to host.
+			 */
+			#define PIPE_TOKEN_IN                   AVR32_USBB_UPCFG0_PTOKEN_IN
+
+			/** Token mask for \ref Pipe_SetPipeToken() and \ref Pipe_GetPipeToken(). This sets the pipe as a OUT token (for non-CONTROL type pipes),
+			 *  indicating that the pipe data will flow from host to device.
+			 */
+			#define PIPE_TOKEN_OUT                  AVR32_USBB_UPCFG0_PTOKEN_OUT
+			//@}
+
+			/** Default size of the default control pipe's bank, until altered by the Endpoint0Size value
+			 *  in the device descriptor of the attached device.
+			 */
+			#define PIPE_CONTROLPIPE_DEFAULT_SIZE   64
+
+			#if defined(USB_SERIES_UC3A3_AVR32) || defined(USB_SERIES_UC3A4_AVR32) || defined(__DOXYGEN__)
+				/** Total number of pipes (including the default control pipe at address 0) which may be used in
+				 *  the device.
+				 */
+				#define PIPE_TOTAL_PIPES            8
+			#else
+				#define PIPE_TOTAL_PIPES            7
+			#endif
+
+			/** Size in bytes of the largest pipe bank size possible in the device. Not all banks on each AVR
+			 *  model supports the largest bank size possible on the device; different pipe numbers support
+			 *  different maximum bank sizes. This value reflects the largest possible bank of any pipe on the
+			 *  currently selected UC3 AVR model.
+			 */
+			#define PIPE_MAX_SIZE                   256
+
+		/* Enums: */
+			/** Enum for the possible error return codes of the \ref Pipe_WaitUntilReady() function.
+			 *
+			 *  \ingroup Group_PipeRW_UC3
+			 */
+			enum Pipe_WaitUntilReady_ErrorCodes_t
+			{
+				PIPE_READYWAIT_NoError                 = 0, /**< Pipe ready for next packet, no error. */
+				PIPE_READYWAIT_PipeStalled             = 1,	/**< The device stalled the pipe while waiting. */
+				PIPE_READYWAIT_DeviceDisconnected      = 2,	/**< Device was disconnected from the host while waiting. */
+				PIPE_READYWAIT_Timeout                 = 3, /**< The device failed to accept or send the next packet
+				                                             *   within the software timeout period set by the
+				                                             *   \ref USB_STREAM_TIMEOUT_MS macro.
+				                                             */
+			};
+
+		/* Inline Functions: */
+			/** Indicates the number of bytes currently stored in the current pipes's selected bank.
+			 *
+			 *  \ingroup Group_PipeRW_UC3
+			 *
+			 *  \return Total number of bytes in the currently selected pipe's FIFO buffer.
+			 */
+			static inline uint16_t Pipe_BytesInPipe(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline uint16_t Pipe_BytesInPipe(void)
+			{
+				return (&AVR32_USBB.UPSTA0)[USB_Pipe_SelectedPipe].pbyct;
+			}
+
+			/** Determines the currently selected pipe's direction.
+			 *
+			 *  \return The currently selected pipe's direction, as a \c PIPE_DIR_* mask.
+			 */
+			static inline uint8_t Pipe_GetPipeDirection(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline uint8_t Pipe_GetPipeDirection(void)
+			{
+				return (((&AVR32_USBB.UPCFG0)[USB_Pipe_SelectedPipe].ptoken == PIPE_TOKEN_OUT) ? PIPE_DIR_OUT : PIPE_DIR_IN);
+			}
+
+			/** Returns the pipe address of the currently selected pipe. This is typically used to save the
+			 *  currently selected pipe number so that it can be restored after another pipe has been manipulated.
+			 *
+			 *  \return Index of the currently selected pipe.
+			 */
+			static inline uint8_t Pipe_GetCurrentPipe(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline uint8_t Pipe_GetCurrentPipe(void)
+			{
+				return (USB_Pipe_SelectedPipe | Pipe_GetPipeDirection());
+			}
+
+			/** Selects the given pipe address. Any pipe operations which do not require the pipe address to be
+			 *  indicated will operate on the currently selected pipe.
+			 *
+			 *  \param[in] Address  Address of the pipe to select.
+			 */
+			static inline void Pipe_SelectPipe(const uint8_t Address) ATTR_ALWAYS_INLINE;
+			static inline void Pipe_SelectPipe(const uint8_t Address)
+			{
+				USB_Pipe_SelectedPipe = (Address & PIPE_EPNUM_MASK);
+			}
+
+			/** Resets the desired pipe, including the pipe banks and flags.
+			 *
+			 *  \param[in] Address  Index of the pipe to reset.
+			 */
+			static inline void Pipe_ResetPipe(const uint8_t Address) ATTR_ALWAYS_INLINE;
+			static inline void Pipe_ResetPipe(const uint8_t Address)
+			{
+				uint32_t PipeNumber = (Address & PIPE_EPNUM_MASK);
+
+				AVR32_USBB.uprst |=  (AVR32_USBB_PRST0_MASK << PipeNumber);
+				AVR32_USBB.uprst &= ~(AVR32_USBB_PRST0_MASK << PipeNumber);
+				USB_Pipe_FIFOPos[PipeNumber] = &AVR32_USBB_SLAVE[PipeNumber * PIPE_HSB_ADDRESS_SPACE_SIZE];
+			}
+
+			/** Enables the currently selected pipe so that data can be sent and received through it to and from
+			 *  an attached device.
+			 *
+			 *  \pre The currently selected pipe must first be configured properly via \ref Pipe_ConfigurePipe().
+			 */
+			static inline void Pipe_EnablePipe(void) ATTR_ALWAYS_INLINE;
+			static inline void Pipe_EnablePipe(void)
+			{
+				AVR32_USBB.uprst |=  (AVR32_USBB_PEN0_MASK << USB_Pipe_SelectedPipe);
+			}
+
+			/** Disables the currently selected pipe so that data cannot be sent and received through it to and
+			 *  from an attached device.
+			 */
+			static inline void Pipe_DisablePipe(void) ATTR_ALWAYS_INLINE;
+			static inline void Pipe_DisablePipe(void)
+			{
+				AVR32_USBB.uprst &= ~(AVR32_USBB_PEN0_MASK << USB_Pipe_SelectedPipe);
+			}
+
+			/** Determines if the currently selected pipe is enabled, but not necessarily configured.
+			 *
+			 * \return Boolean \c true if the currently selected pipe is enabled, \c false otherwise.
+			 */
+			static inline bool Pipe_IsEnabled(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline bool Pipe_IsEnabled(void)
+			{
+				return ((AVR32_USBB.uprst & (AVR32_USBB_PEN0_MASK << USB_Pipe_SelectedPipe)) ? true : false);
+			}
+
+			/** Gets the current pipe token, indicating the pipe's data direction and type.
+			 *
+			 *  \return The current pipe token, as a \c PIPE_TOKEN_* mask.
+			 */
+			static inline uint8_t Pipe_GetPipeToken(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline uint8_t Pipe_GetPipeToken(void)
+			{
+				return (&AVR32_USBB.UPCFG0)[USB_Pipe_SelectedPipe].ptoken;
+			}
+
+			/** Sets the token for the currently selected pipe to one of the tokens specified by the \c PIPE_TOKEN_*
+			 *  masks. This can be used on CONTROL type pipes, to allow for bidirectional transfer of data during
+			 *  control requests, or on regular pipes to allow for half-duplex bidirectional data transfer to devices
+			 *  which have two endpoints of opposite direction sharing the same endpoint address within the device.
+			 *
+			 *  \param[in] Token  New pipe token to set the selected pipe to, as a \c PIPE_TOKEN_* mask.
+			 */
+			static inline void Pipe_SetPipeToken(const uint8_t Token) ATTR_ALWAYS_INLINE;
+			static inline void Pipe_SetPipeToken(const uint8_t Token)
+			{
+				(&AVR32_USBB.UPCFG0)[USB_Pipe_SelectedPipe].ptoken = Token;
+			}
+
+			/** Configures the currently selected pipe to allow for an unlimited number of IN requests. */
+			static inline void Pipe_SetInfiniteINRequests(void) ATTR_ALWAYS_INLINE;
+			static inline void Pipe_SetInfiniteINRequests(void)
+			{
+				(&AVR32_USBB.UPINRQ0)[USB_Pipe_SelectedPipe].inmode = true;
+			}
+
+			/** Configures the currently selected pipe to only allow the specified number of IN requests to be
+			 *  accepted by the pipe before it is automatically frozen.
+			 *
+			 *  \param[in] TotalINRequests  Total number of IN requests that the pipe may receive before freezing.
+			 */
+			static inline void Pipe_SetFiniteINRequests(const uint8_t TotalINRequests) ATTR_ALWAYS_INLINE;
+			static inline void Pipe_SetFiniteINRequests(const uint8_t TotalINRequests)
+			{
+				(&AVR32_USBB.UPINRQ0)[USB_Pipe_SelectedPipe].inmode = false;
+				(&AVR32_USBB.UPINRQ0)[USB_Pipe_SelectedPipe].inrq   = TotalINRequests;
+			}
+
+			/** Determines if the currently selected pipe is configured.
+			 *
+			 *  \return Boolean \c true if the selected pipe is configured, \c false otherwise.
+			 */
+			static inline bool Pipe_IsConfigured(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline bool Pipe_IsConfigured(void)
+			{
+				return (&AVR32_USBB.UPSTA0)[USB_Pipe_SelectedPipe].cfgok;
+			}
+
+			/** Retrieves the endpoint address of the endpoint within the attached device that the currently selected
+			 *  pipe is bound to.
+			 *
+			 *  \return Endpoint address the currently selected pipe is bound to.
+			 */
+			static inline uint8_t Pipe_GetBoundEndpointAddress(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline uint8_t Pipe_GetBoundEndpointAddress(void)
+			{
+				return ((&AVR32_USBB.UPCFG0)[USB_Pipe_SelectedPipe].pepnum |
+				        ((Pipe_GetPipeToken() == PIPE_TOKEN_IN) ? PIPE_DIR_IN : PIPE_DIR_OUT));
+			}
+
+			/** Sets the period between interrupts for an INTERRUPT type pipe to a specified number of milliseconds.
+			 *
+			 *  \param[in] Milliseconds  Number of milliseconds between each pipe poll.
+			 */
+			static inline void Pipe_SetInterruptPeriod(const uint8_t Milliseconds) ATTR_ALWAYS_INLINE;
+			static inline void Pipe_SetInterruptPeriod(const uint8_t Milliseconds)
+			{
+				(&AVR32_USBB.UPCFG0)[USB_Pipe_SelectedPipe].intfrq = Milliseconds;
+			}
+
+			/** Returns a mask indicating which pipe's interrupt periods have elapsed, indicating that the pipe should
+			 *  be serviced.
+			 *
+			 *  \return Mask whose bits indicate which pipes have interrupted.
+			 */
+			static inline uint8_t Pipe_GetPipeInterrupts(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline uint8_t Pipe_GetPipeInterrupts(void)
+			{
+				return ((AVR32_USBB.uhint & (AVR32_USBB_P6INT_MASK | AVR32_USBB_P5INT_MASK |
+				                             AVR32_USBB_P4INT_MASK | AVR32_USBB_P3INT_MASK |
+				                             AVR32_USBB_P2INT_MASK | AVR32_USBB_P1INT_MASK |
+				                             AVR32_USBB_P0INT_MASK)) >> AVR32_USBB_P0INT_OFFSET);
+			}
+
+			/** Determines if the specified pipe address has interrupted (valid only for INTERRUPT type
+			 *  pipes).
+			 *
+			 *  \param[in] Address  Address of the pipe whose interrupt flag should be tested.
+			 *
+			 *  \return Boolean \c true if the specified pipe has interrupted, \c false otherwise.
+			 */
+			static inline bool Pipe_HasPipeInterrupted(const uint8_t Address) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline bool Pipe_HasPipeInterrupted(const uint8_t Address)
+			{
+				return ((AVR32_USBB.uhint & (AVR32_USBB_P0INTES_MASK << (Address & PIPE_EPNUM_MASK))) ? true : false);
+			}
+
+			/** Unfreezes the selected pipe, allowing it to communicate with an attached device. */
+			static inline void Pipe_Unfreeze(void) ATTR_ALWAYS_INLINE;
+			static inline void Pipe_Unfreeze(void)
+			{
+				(&AVR32_USBB.UPCON0CLR)[USB_Pipe_SelectedPipe].pfreezec = true;
+			}
+
+			/** Freezes the selected pipe, preventing it from communicating with an attached device. */
+			static inline void Pipe_Freeze(void) ATTR_ALWAYS_INLINE;
+			static inline void Pipe_Freeze(void)
+			{
+				(&AVR32_USBB.UPCON0SET)[USB_Pipe_SelectedPipe].pfreezes = true;
+			}
+
+			/** Determines if the currently selected pipe is frozen, and not able to accept data.
+			 *
+			 *  \return Boolean \c true if the currently selected pipe is frozen, \c false otherwise.
+			 */
+			static inline bool Pipe_IsFrozen(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline bool Pipe_IsFrozen(void)
+			{
+				return (((&AVR32_USBB.UPCON0)[USB_Pipe_SelectedPipe].pfreeze) ? true : false);
+			}
+
+			/** Clears the error flags for the currently selected pipe. */
+			static inline void Pipe_ClearError(void) ATTR_ALWAYS_INLINE;
+			static inline void Pipe_ClearError(void)
+			{
+				(&AVR32_USBB.uperr0)[USB_Pipe_SelectedPipe] = 0;
+				(&AVR32_USBB.UPSTA0CLR)[USB_Pipe_SelectedPipe].overfic  = true;
+			}
+
+			/** Determines if the master pipe error flag is set for the currently selected pipe, indicating that
+			 *  some sort of hardware error has occurred on the pipe.
+			 *
+			 *  \see \ref Pipe_GetErrorFlags() macro for information on retrieving the exact error flag.
+			 *
+			 *  \return Boolean \c true if an error has occurred on the selected pipe, \c false otherwise.
+			 */
+			static inline bool Pipe_IsError(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline bool Pipe_IsError(void)
+			{
+				return (((&AVR32_USBB.upsta0)[USB_Pipe_SelectedPipe] &
+				        (AVR32_USBB_PERRI_MASK | AVR32_USBB_OVERFI_MASK)) ? true : false);
+			}
+
+			/** Gets a mask of the hardware error flags which have occurred on the currently selected pipe. This
+			 *  value can then be masked against the \c PIPE_ERRORFLAG_* masks to determine what error has occurred.
+			 *
+			 *  \return  Mask comprising of \c PIPE_ERRORFLAG_* bits indicating what error has occurred on the selected pipe.
+			 */
+			static inline uint8_t Pipe_GetErrorFlags(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline uint8_t Pipe_GetErrorFlags(void)
+			{
+
+				return (((&AVR32_USBB.uperr0)[USB_Pipe_SelectedPipe] &
+				        (PIPE_ERRORFLAG_CRC16 | PIPE_ERRORFLAG_TIMEOUT |
+				         PIPE_ERRORFLAG_PID   | PIPE_ERRORFLAG_DATAPID |
+				         PIPE_ERRORFLAG_DATATGL)) |
+				        (((&AVR32_USBB.upsta0)[USB_Pipe_SelectedPipe] << 8) &
+						 PIPE_ERRORFLAG_OVERFLOW));
+			}
+
+			/** Retrieves the number of busy banks in the currently selected pipe, which have been queued for
+			 *  transmission via the \ref Pipe_ClearOUT() command, or are awaiting acknowledgement via the
+			 *  \ref Pipe_ClearIN() command.
+			 *
+			 *  \ingroup Group_PipePacketManagement_UC3
+			 *
+			 *  \return Total number of busy banks in the selected pipe.
+			 */
+			static inline uint8_t Pipe_GetBusyBanks(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline uint8_t Pipe_GetBusyBanks(void)
+			{
+				return (&AVR32_USBB.UPSTA0)[USB_Pipe_SelectedPipe].nbusybk;
+			}
+
+			/** Determines if the currently selected pipe may be read from (if data is waiting in the pipe
+			 *  bank and the pipe is an IN direction, or if the bank is not yet full if the pipe is an OUT
+			 *  direction). This function will return false if an error has occurred in the pipe, or if the pipe
+			 *  is an IN direction and no packet (or an empty packet) has been received, or if the pipe is an OUT
+			 *  direction and the pipe bank is full.
+			 *
+			 *  \note This function is not valid on CONTROL type pipes.
+			 *
+			 *  \ingroup Group_PipePacketManagement_UC3
+			 *
+			 *  \return Boolean \c true if the currently selected pipe may be read from or written to, depending
+			 *          on its direction.
+			 */
+			static inline bool Pipe_IsReadWriteAllowed(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline bool Pipe_IsReadWriteAllowed(void)
+			{
+				return (&AVR32_USBB.UPSTA0)[USB_Pipe_SelectedPipe].rwall;
+			}
+
+			/** Determines if a packet has been received on the currently selected IN pipe from the attached device.
+			 *
+			 *  \ingroup Group_PipePacketManagement_UC3
+			 *
+			 *  \return Boolean \c true if the current pipe has received an IN packet, \c false otherwise.
+			 */
+			static inline bool Pipe_IsINReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline bool Pipe_IsINReceived(void)
+			{
+				return (&AVR32_USBB.UPSTA0)[USB_Pipe_SelectedPipe].rxini;
+			}
+
+			/** Determines if the currently selected OUT pipe is ready to send an OUT packet to the attached device.
+			 *
+			 *  \ingroup Group_PipePacketManagement_UC3
+			 *
+			 *  \return Boolean \c true if the current pipe is ready for an OUT packet, \c false otherwise.
+			 */
+			static inline bool Pipe_IsOUTReady(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline bool Pipe_IsOUTReady(void)
+			{
+				return (&AVR32_USBB.UPSTA0)[USB_Pipe_SelectedPipe].txouti;
+			}
+
+			/** Determines if no SETUP request is currently being sent to the attached device on the selected
+			 *  CONTROL type pipe.
+			 *
+			 *  \ingroup Group_PipePacketManagement_UC3
+			 *
+			 *  \return Boolean \c true if the current pipe is ready for a SETUP packet, \c false otherwise.
+			 */
+			static inline bool Pipe_IsSETUPSent(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline bool Pipe_IsSETUPSent(void)
+			{
+				return (&AVR32_USBB.UPSTA0)[USB_Pipe_SelectedPipe].txstpi;
+			}
+
+			/** Sends the currently selected CONTROL type pipe's contents to the device as a SETUP packet.
+			 *
+			 *  \ingroup Group_PipePacketManagement_UC3
+			 */
+			static inline void Pipe_ClearSETUP(void) ATTR_ALWAYS_INLINE;
+			static inline void Pipe_ClearSETUP(void)
+			{
+				(&AVR32_USBB.UPSTA0CLR)[USB_Pipe_SelectedPipe].txstpic = true;
+				(&AVR32_USBB.UPCON0CLR)[USB_Pipe_SelectedPipe].fifoconc = true;
+				USB_Pipe_FIFOPos[USB_Pipe_SelectedPipe] = &AVR32_USBB_SLAVE[USB_Pipe_SelectedPipe * PIPE_HSB_ADDRESS_SPACE_SIZE];
+			}
+
+			/** Acknowledges the reception of a setup IN request from the attached device on the currently selected
+			 *  pipe, freeing the bank ready for the next packet.
+			 *
+			 *  \ingroup Group_PipePacketManagement_UC3
+			 */
+			static inline void Pipe_ClearIN(void) ATTR_ALWAYS_INLINE;
+			static inline void Pipe_ClearIN(void)
+			{
+				(&AVR32_USBB.UPSTA0CLR)[USB_Pipe_SelectedPipe].rxinic   = true;
+				(&AVR32_USBB.UPCON0CLR)[USB_Pipe_SelectedPipe].fifoconc = true;
+				USB_Pipe_FIFOPos[USB_Pipe_SelectedPipe] = &AVR32_USBB_SLAVE[USB_Pipe_SelectedPipe * PIPE_HSB_ADDRESS_SPACE_SIZE];
+			}
+
+			/** Sends the currently selected pipe's contents to the device as an OUT packet on the selected pipe, freeing
+			 *  the bank ready for the next packet.
+			 *
+			 *  \ingroup Group_PipePacketManagement_UC3
+			 */
+			static inline void Pipe_ClearOUT(void) ATTR_ALWAYS_INLINE;
+			static inline void Pipe_ClearOUT(void)
+			{
+				(&AVR32_USBB.UPSTA0CLR)[USB_Pipe_SelectedPipe].txoutic  = true;
+				(&AVR32_USBB.UPCON0CLR)[USB_Pipe_SelectedPipe].fifoconc = true;
+				USB_Pipe_FIFOPos[USB_Pipe_SelectedPipe] = &AVR32_USBB_SLAVE[USB_Pipe_SelectedPipe * PIPE_HSB_ADDRESS_SPACE_SIZE];
+			}
+
+			/** Determines if the device sent a NAK (Negative Acknowledge) in response to the last sent packet on
+			 *  the currently selected pipe. This occurs when the host sends a packet to the device, but the device
+			 *  is not currently ready to handle the packet (i.e. its endpoint banks are full). Once a NAK has been
+			 *  received, it must be cleared using \ref Pipe_ClearNAKReceived() before the previous (or any other) packet
+			 *  can be re-sent.
+			 *
+			 *  \ingroup Group_PipePacketManagement_UC3
+			 *
+			 *  \return Boolean \c true if an NAK has been received on the current pipe, \c false otherwise.
+			 */
+			static inline bool Pipe_IsNAKReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline bool Pipe_IsNAKReceived(void)
+			{
+				return (&AVR32_USBB.UPSTA0)[USB_Pipe_SelectedPipe].nakedi;
+			}
+
+			/** Clears the NAK condition on the currently selected pipe.
+			 *
+			 *  \ingroup Group_PipePacketManagement_UC3
+			 *
+			 *  \see \ref Pipe_IsNAKReceived() for more details.
+			 */
+			static inline void Pipe_ClearNAKReceived(void) ATTR_ALWAYS_INLINE;
+			static inline void Pipe_ClearNAKReceived(void)
+			{
+				(&AVR32_USBB.UPSTA0CLR)[USB_Pipe_SelectedPipe].nakedic = true;
+			}
+
+			/** Determines if the currently selected pipe has had the STALL condition set by the attached device.
+			 *
+			 *  \ingroup Group_PipePacketManagement_UC3
+			 *
+			 *  \return Boolean \c true if the current pipe has been stalled by the attached device, \c false otherwise.
+			 */
+			static inline bool Pipe_IsStalled(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline bool Pipe_IsStalled(void)
+			{
+				return (&AVR32_USBB.UPSTA0)[USB_Pipe_SelectedPipe].rxstalldi;
+			}
+
+			/** Clears the STALL condition detection flag on the currently selected pipe, but does not clear the
+			 *  STALL condition itself (this must be done via a ClearFeature control request to the device).
+			 *
+			 *  \ingroup Group_PipePacketManagement_UC3
+			 */
+			static inline void Pipe_ClearStall(void) ATTR_ALWAYS_INLINE;
+			static inline void Pipe_ClearStall(void)
+			{
+				(&AVR32_USBB.UPSTA0CLR)[USB_Pipe_SelectedPipe].rxstalldic = true;
+				USB_Pipe_FIFOPos[USB_Pipe_SelectedPipe] = &AVR32_USBB_SLAVE[USB_Pipe_SelectedPipe * PIPE_HSB_ADDRESS_SPACE_SIZE];
+			}
+
+			/** Reads one byte from the currently selected pipe's bank, for OUT direction pipes.
+			 *
+			 *  \ingroup Group_PipePrimitiveRW_UC3
+			 *
+			 *  \return Next byte in the currently selected pipe's FIFO buffer.
+			 */
+			static inline uint8_t Pipe_Read_8(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline uint8_t Pipe_Read_8(void)
+			{
+				return *(USB_Pipe_FIFOPos[USB_Pipe_SelectedPipe]++);
+			}
+
+			/** Writes one byte to the currently selected pipe's bank, for IN direction pipes.
+			 *
+			 *  \ingroup Group_PipePrimitiveRW_UC3
+			 *
+			 *  \param[in] Data  Data to write into the the currently selected pipe's FIFO buffer.
+			 */
+			static inline void Pipe_Write_8(const uint8_t Data) ATTR_ALWAYS_INLINE;
+			static inline void Pipe_Write_8(const uint8_t Data)
+			{
+				*(USB_Pipe_FIFOPos[USB_Pipe_SelectedPipe]++) = Data;
+			}
+
+			/** Discards one byte from the currently selected pipe's bank, for OUT direction pipes.
+			 *
+			 *  \ingroup Group_PipePrimitiveRW_UC3
+			 */
+			static inline void Pipe_Discard_8(void) ATTR_ALWAYS_INLINE;
+			static inline void Pipe_Discard_8(void)
+			{
+				uint8_t Dummy;
+
+				Dummy = *(USB_Pipe_FIFOPos[USB_Pipe_SelectedPipe]++);
+
+				(void)Dummy;
+			}
+
+			/** Reads two bytes from the currently selected pipe's bank in little endian format, for OUT
+			 *  direction pipes.
+			 *
+			 *  \ingroup Group_PipePrimitiveRW_UC3
+			 *
+			 *  \return Next two bytes in the currently selected pipe's FIFO buffer.
+			 */
+			static inline uint16_t Pipe_Read_16_LE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline uint16_t Pipe_Read_16_LE(void)
+			{
+				uint16_t Byte0 = *(USB_Pipe_FIFOPos[USB_Pipe_SelectedPipe]++);
+				uint16_t Byte1 = *(USB_Pipe_FIFOPos[USB_Pipe_SelectedPipe]++);
+
+				return ((Byte1 << 8) | Byte0);
+			}
+
+			/** Reads two bytes from the currently selected pipe's bank in big endian format, for OUT
+			 *  direction pipes.
+			 *
+			 *  \ingroup Group_PipePrimitiveRW_UC3
+			 *
+			 *  \return Next two bytes in the currently selected pipe's FIFO buffer.
+			 */
+			static inline uint16_t Pipe_Read_16_BE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline uint16_t Pipe_Read_16_BE(void)
+			{
+				uint16_t Byte0 = *(USB_Pipe_FIFOPos[USB_Pipe_SelectedPipe]++);
+				uint16_t Byte1 = *(USB_Pipe_FIFOPos[USB_Pipe_SelectedPipe]++);
+
+				return ((Byte0 << 8) | Byte1);
+			}
+
+			/** Writes two bytes to the currently selected pipe's bank in little endian format, for IN
+			 *  direction pipes.
+			 *
+			 *  \ingroup Group_PipePrimitiveRW_UC3
+			 *
+			 *  \param[in] Data  Data to write to the currently selected pipe's FIFO buffer.
+			 */
+			static inline void Pipe_Write_16_LE(const uint16_t Data) ATTR_ALWAYS_INLINE;
+			static inline void Pipe_Write_16_LE(const uint16_t Data)
+			{
+				*(USB_Pipe_FIFOPos[USB_Pipe_SelectedPipe]++) = (Data & 0xFF);
+				*(USB_Pipe_FIFOPos[USB_Pipe_SelectedPipe]++) = (Data >> 8);
+			}
+
+			/** Writes two bytes to the currently selected pipe's bank in big endian format, for IN
+			 *  direction pipes.
+			 *
+			 *  \ingroup Group_PipePrimitiveRW_UC3
+			 *
+			 *  \param[in] Data  Data to write to the currently selected pipe's FIFO buffer.
+			 */
+			static inline void Pipe_Write_16_BE(const uint16_t Data) ATTR_ALWAYS_INLINE;
+			static inline void Pipe_Write_16_BE(const uint16_t Data)
+			{
+				*(USB_Pipe_FIFOPos[USB_Pipe_SelectedPipe]++) = (Data >> 8);
+				*(USB_Pipe_FIFOPos[USB_Pipe_SelectedPipe]++) = (Data & 0xFF);
+			}
+
+			/** Discards two bytes from the currently selected pipe's bank, for OUT direction pipes.
+			 *
+			 *  \ingroup Group_PipePrimitiveRW_UC3
+			 */
+			static inline void Pipe_Discard_16(void) ATTR_ALWAYS_INLINE;
+			static inline void Pipe_Discard_16(void)
+			{
+				uint8_t Dummy;
+
+				Dummy = *(USB_Pipe_FIFOPos[USB_Pipe_SelectedPipe]++);
+				Dummy = *(USB_Pipe_FIFOPos[USB_Pipe_SelectedPipe]++);
+
+				(void)Dummy;
+			}
+
+			/** Reads four bytes from the currently selected pipe's bank in little endian format, for OUT
+			 *  direction pipes.
+			 *
+			 *  \ingroup Group_PipePrimitiveRW_UC3
+			 *
+			 *  \return Next four bytes in the currently selected pipe's FIFO buffer.
+			 */
+			static inline uint32_t Pipe_Read_32_LE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline uint32_t Pipe_Read_32_LE(void)
+			{
+				uint32_t Byte0 = *(USB_Pipe_FIFOPos[USB_Pipe_SelectedPipe]++);
+				uint32_t Byte1 = *(USB_Pipe_FIFOPos[USB_Pipe_SelectedPipe]++);
+				uint32_t Byte2 = *(USB_Pipe_FIFOPos[USB_Pipe_SelectedPipe]++);
+				uint32_t Byte3 = *(USB_Pipe_FIFOPos[USB_Pipe_SelectedPipe]++);
+
+				return ((Byte3 << 24) | (Byte2 << 16) | (Byte1 << 8) | Byte0);
+			}
+
+			/** Reads four bytes from the currently selected pipe's bank in big endian format, for OUT
+			 *  direction pipes.
+			 *
+			 *  \ingroup Group_PipePrimitiveRW_UC3
+			 *
+			 *  \return Next four bytes in the currently selected pipe's FIFO buffer.
+			 */
+			static inline uint32_t Pipe_Read_32_BE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline uint32_t Pipe_Read_32_BE(void)
+			{
+				uint32_t Byte0 = *(USB_Pipe_FIFOPos[USB_Pipe_SelectedPipe]++);
+				uint32_t Byte1 = *(USB_Pipe_FIFOPos[USB_Pipe_SelectedPipe]++);
+				uint32_t Byte2 = *(USB_Pipe_FIFOPos[USB_Pipe_SelectedPipe]++);
+				uint32_t Byte3 = *(USB_Pipe_FIFOPos[USB_Pipe_SelectedPipe]++);
+
+				return ((Byte0 << 24) | (Byte1 << 16) | (Byte2 << 8) | Byte3);
+			}
+
+			/** Writes four bytes to the currently selected pipe's bank in little endian format, for IN
+			 *  direction pipes.
+			 *
+			 *  \ingroup Group_PipePrimitiveRW_UC3
+			 *
+			 *  \param[in] Data  Data to write to the currently selected pipe's FIFO buffer.
+			 */
+			static inline void Pipe_Write_32_LE(const uint32_t Data) ATTR_ALWAYS_INLINE;
+			static inline void Pipe_Write_32_LE(const uint32_t Data)
+			{
+				*(USB_Pipe_FIFOPos[USB_Pipe_SelectedPipe]++) = (Data &  0xFF);
+				*(USB_Pipe_FIFOPos[USB_Pipe_SelectedPipe]++) = (Data >> 8);
+				*(USB_Pipe_FIFOPos[USB_Pipe_SelectedPipe]++) = (Data >> 16);
+				*(USB_Pipe_FIFOPos[USB_Pipe_SelectedPipe]++) = (Data >> 24);
+			}
+
+			/** Writes four bytes to the currently selected pipe's bank in big endian format, for IN
+			 *  direction pipes.
+			 *
+			 *  \ingroup Group_PipePrimitiveRW_UC3
+			 *
+			 *  \param[in] Data  Data to write to the currently selected pipe's FIFO buffer.
+			 */
+			static inline void Pipe_Write_32_BE(const uint32_t Data) ATTR_ALWAYS_INLINE;
+			static inline void Pipe_Write_32_BE(const uint32_t Data)
+			{
+				*(USB_Pipe_FIFOPos[USB_Pipe_SelectedPipe]++) = (Data >> 24);
+				*(USB_Pipe_FIFOPos[USB_Pipe_SelectedPipe]++) = (Data >> 16);
+				*(USB_Pipe_FIFOPos[USB_Pipe_SelectedPipe]++) = (Data >> 8);
+				*(USB_Pipe_FIFOPos[USB_Pipe_SelectedPipe]++) = (Data &  0xFF);
+			}
+
+			/** Discards four bytes from the currently selected pipe's bank, for OUT direction pipes.
+			 *
+			 *  \ingroup Group_PipePrimitiveRW_UC3
+			 */
+			static inline void Pipe_Discard_32(void) ATTR_ALWAYS_INLINE;
+			static inline void Pipe_Discard_32(void)
+			{
+				uint8_t Dummy;
+
+				Dummy = *(USB_Pipe_FIFOPos[USB_Pipe_SelectedPipe]++);
+				Dummy = *(USB_Pipe_FIFOPos[USB_Pipe_SelectedPipe]++);
+				Dummy = *(USB_Pipe_FIFOPos[USB_Pipe_SelectedPipe]++);
+				Dummy = *(USB_Pipe_FIFOPos[USB_Pipe_SelectedPipe]++);
+
+				(void)Dummy;
+			}
+
+		/* External Variables: */
+			/** Global indicating the maximum packet size of the default control pipe located at address
+			 *  0 in the device. This value is set to the value indicated in the attached device's device
+		     *  descriptor once the USB interface is initialized into host mode and a device is attached
+			 *  to the USB bus.
+			 *
+			 *  \attention This variable should be treated as read-only in the user application, and never manually
+			 *             changed in value.
+			 */
+			extern uint8_t USB_Host_ControlPipeSize;
+
+		/* Function Prototypes: */
+			/** Configures a table of pipe descriptions, in sequence. This function can be used to configure multiple
+			 *  pipes at the same time.
+			 *
+			 *  \note Pipe with a zero address will be ignored, thus this function cannot be used to configure the
+			 *        control pipe.
+			 *
+			 *  \param[in] Table    Pointer to a table of pipe descriptions.
+			 *  \param[in] Entries  Number of entries in the pipe table to configure.
+			 *
+			 *  \return Boolean \c true if all pipes configured successfully, \c false otherwise.
+			 */
+			bool Pipe_ConfigurePipeTable(const USB_Pipe_Table_t* const Table,
+			                             const uint8_t Entries);
+
+			/** Configures the specified pipe address with the given pipe type, endpoint address within the attached device,
+			 *  bank size and number of hardware banks.
+			 *
+			 *  A newly configured pipe is frozen by default, and must be unfrozen before use via the \ref Pipe_Unfreeze()
+			 *  before being used. Pipes should be kept frozen unless waiting for data from a device while in IN mode, or
+			 *  sending data to the device in OUT mode. IN type pipes are also automatically configured to accept infinite
+			 *  numbers of IN requests without automatic freezing - this can be overridden by a call to
+			 *  \ref Pipe_SetFiniteINRequests().
+			 *
+			 *  \param[in] Address          Pipe address to configure.
+			 *
+			 *  \param[in] Type             Type of pipe to configure, an \c EP_TYPE_* mask. Not all pipe types are available on Low
+			 *                              Speed USB devices - refer to the USB 2.0 specification.
+			 *
+			 *  \param[in] EndpointAddress  Endpoint address within the attached device that the pipe should interface to.
+			 *
+			 *  \param[in] Size             Size of the pipe's bank, where packets are stored before they are transmitted to
+			 *                              the USB device, or after they have been received from the USB device (depending on
+			 *                              the pipe's data direction). The bank size must indicate the maximum packet size that
+			 *                              the pipe can handle.
+			 *
+			 *  \param[in] Banks            Number of banks to use for the pipe being configured.
+			 *
+			 *  \note When the \c ORDERED_EP_CONFIG compile time option is used, Pipes <b>must</b> be configured in ascending order,
+			 *        or bank corruption will occur.
+			 *        \n\n
+			 *
+			 *  \note Certain microcontroller model's pipes may have different maximum packet sizes based on the pipe's
+			 *        index - refer to the chosen microcontroller's datasheet to determine the maximum bank size for each pipe.
+			 *        \n\n
+			 *
+			 *  \note The default control pipe should not be manually configured by the user application, as it is
+			 *        automatically configured by the library internally.
+			 *        \n\n
+			 *
+			 *  \note This routine will automatically select the specified pipe upon success. Upon failure, the pipe which
+			 *        failed to reconfigure correctly will be selected.
+			 *
+			 *  \return Boolean \c true if the configuration succeeded, \c false otherwise.
+			 */
+			bool Pipe_ConfigurePipe(const uint8_t Address,
+			                        const uint8_t Type,
+			                        const uint8_t EndpointAddress,
+			                        const uint16_t Size,
+			                        const uint8_t Banks);
+
+			/** Spin-loops until the currently selected non-control pipe is ready for the next packet of data to be read
+			 *  or written to it, aborting in the case of an error condition (such as a timeout or device disconnect).
+			 *
+			 *  \ingroup Group_PipeRW_UC3
+			 *
+			 *  \return A value from the \ref Pipe_WaitUntilReady_ErrorCodes_t enum.
+			 */
+			uint8_t Pipe_WaitUntilReady(void);
+
+			/** Determines if a pipe has been bound to the given device endpoint address. If a pipe which is bound to the given
+			 *  endpoint is found, it is automatically selected.
+			 *
+			 *  \param[in] EndpointAddress Address and direction mask of the endpoint within the attached device to check.
+			 *
+			 *  \return Boolean \c true if a pipe bound to the given endpoint address of the specified direction is found,
+			 *          \c false otherwise.
+			 */
+			bool Pipe_IsEndpointBound(const uint8_t EndpointAddress) ATTR_WARN_UNUSED_RESULT;
+
+	/* Private Interface - For use in library only: */
+	#if !defined(__DOXYGEN__)
+		/* Macros: */
+			#if !defined(ENDPOINT_CONTROLEP)
+				#define ENDPOINT_CONTROLEP          0
+			#endif
+
+		/* Inline Functions: */
+			static inline uint8_t Pipe_BytesToEPSizeMask(const uint16_t Bytes) ATTR_WARN_UNUSED_RESULT ATTR_CONST ATTR_ALWAYS_INLINE;
+			static inline uint8_t Pipe_BytesToEPSizeMask(const uint16_t Bytes)
+			{
+				uint8_t  MaskVal    = 0;
+				uint16_t CheckBytes = 8;
+
+				while ((CheckBytes < Bytes) && (CheckBytes < PIPE_MAX_SIZE))
+				{
+					MaskVal++;
+					CheckBytes <<= 1;
+				}
+
+				return (MaskVal << AVR32_USBB_PSIZE_OFFSET);
+			}
+
+		/* Function Prototypes: */
+			void Pipe_ClearPipes(void);
+	#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Core/UC3/Template/Template_Endpoint_Control_R.c b/lib/lufa/LUFA/Drivers/USB/Core/UC3/Template/Template_Endpoint_Control_R.c
new file mode 100644
index 0000000000..f6c4beb229
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Core/UC3/Template/Template_Endpoint_Control_R.c
@@ -0,0 +1,84 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+#if defined(TEMPLATE_FUNC_NAME)
+
+uint8_t TEMPLATE_FUNC_NAME (void* const Buffer,
+                            uint16_t Length)
+{
+	uint8_t* DataStream = ((uint8_t*)Buffer + TEMPLATE_BUFFER_OFFSET(Length));
+
+	if (!(Length))
+	  Endpoint_ClearOUT();
+
+	while (Length)
+	{
+		uint8_t USB_DeviceState_LCL = USB_DeviceState;
+
+		if (USB_DeviceState_LCL == DEVICE_STATE_Unattached)
+		  return ENDPOINT_RWCSTREAM_DeviceDisconnected;
+		else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended)
+		  return ENDPOINT_RWCSTREAM_BusSuspended;
+		else if (Endpoint_IsSETUPReceived())
+		  return ENDPOINT_RWCSTREAM_HostAborted;
+
+		if (Endpoint_IsOUTReceived())
+		{
+			while (Length && Endpoint_BytesInEndpoint())
+			{
+				TEMPLATE_TRANSFER_BYTE(DataStream);
+				TEMPLATE_BUFFER_MOVE(DataStream, 1);
+				Length--;
+			}
+
+			Endpoint_ClearOUT();
+		}
+	}
+
+	while (!(Endpoint_IsINReady()))
+	{
+		uint8_t USB_DeviceState_LCL = USB_DeviceState;
+
+		if (USB_DeviceState_LCL == DEVICE_STATE_Unattached)
+		  return ENDPOINT_RWCSTREAM_DeviceDisconnected;
+		else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended)
+		  return ENDPOINT_RWCSTREAM_BusSuspended;
+	}
+
+	return ENDPOINT_RWCSTREAM_NoError;
+}
+
+#undef TEMPLATE_BUFFER_OFFSET
+#undef TEMPLATE_BUFFER_MOVE
+#undef TEMPLATE_FUNC_NAME
+#undef TEMPLATE_TRANSFER_BYTE
+
+#endif
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Core/UC3/Template/Template_Endpoint_Control_W.c b/lib/lufa/LUFA/Drivers/USB/Core/UC3/Template/Template_Endpoint_Control_W.c
new file mode 100644
index 0000000000..922b58efa3
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Core/UC3/Template/Template_Endpoint_Control_W.c
@@ -0,0 +1,95 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+#if defined(TEMPLATE_FUNC_NAME)
+
+uint8_t TEMPLATE_FUNC_NAME (const void* const Buffer,
+                            uint16_t Length)
+{
+	uint8_t* DataStream     = ((uint8_t*)Buffer + TEMPLATE_BUFFER_OFFSET(Length));
+	bool     LastPacketFull = false;
+
+	if (Length > USB_ControlRequest.wLength)
+	  Length = USB_ControlRequest.wLength;
+	else if (!(Length))
+	  Endpoint_ClearIN();
+
+	while (Length || LastPacketFull)
+	{
+		uint8_t USB_DeviceState_LCL = USB_DeviceState;
+
+		if (USB_DeviceState_LCL == DEVICE_STATE_Unattached)
+		  return ENDPOINT_RWCSTREAM_DeviceDisconnected;
+		else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended)
+		  return ENDPOINT_RWCSTREAM_BusSuspended;
+		else if (Endpoint_IsSETUPReceived())
+		  return ENDPOINT_RWCSTREAM_HostAborted;
+		else if (Endpoint_IsOUTReceived())
+		  break;
+
+		if (Endpoint_IsINReady())
+		{
+			uint16_t BytesInEndpoint = Endpoint_BytesInEndpoint();
+
+			while (Length && (BytesInEndpoint < USB_Device_ControlEndpointSize))
+			{
+				TEMPLATE_TRANSFER_BYTE(DataStream);
+				TEMPLATE_BUFFER_MOVE(DataStream, 1);
+				Length--;
+				BytesInEndpoint++;
+			}
+
+			LastPacketFull = (BytesInEndpoint == USB_Device_ControlEndpointSize);
+			Endpoint_ClearIN();
+		}
+	}
+
+	while (!(Endpoint_IsOUTReceived()))
+	{
+		uint8_t USB_DeviceState_LCL = USB_DeviceState;
+
+		if (USB_DeviceState_LCL == DEVICE_STATE_Unattached)
+		  return ENDPOINT_RWCSTREAM_DeviceDisconnected;
+		else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended)
+		  return ENDPOINT_RWCSTREAM_BusSuspended;
+		else if (Endpoint_IsSETUPReceived())
+		  return ENDPOINT_RWCSTREAM_HostAborted;
+	}
+
+	return ENDPOINT_RWCSTREAM_NoError;
+}
+
+#undef TEMPLATE_BUFFER_OFFSET
+#undef TEMPLATE_BUFFER_MOVE
+#undef TEMPLATE_FUNC_NAME
+#undef TEMPLATE_TRANSFER_BYTE
+
+#endif
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Core/UC3/Template/Template_Endpoint_RW.c b/lib/lufa/LUFA/Drivers/USB/Core/UC3/Template/Template_Endpoint_RW.c
new file mode 100644
index 0000000000..e55e592eb2
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Core/UC3/Template/Template_Endpoint_RW.c
@@ -0,0 +1,89 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+#if defined(TEMPLATE_FUNC_NAME)
+
+uint8_t TEMPLATE_FUNC_NAME (TEMPLATE_BUFFER_TYPE const Buffer,
+                            uint16_t Length,
+                            uint16_t* const BytesProcessed)
+{
+	uint8_t* DataStream      = ((uint8_t*)Buffer + TEMPLATE_BUFFER_OFFSET(Length));
+	uint16_t BytesInTransfer = 0;
+	uint8_t  ErrorCode;
+
+	if ((ErrorCode = Endpoint_WaitUntilReady()))
+	  return ErrorCode;
+
+	if (BytesProcessed != NULL)
+	{
+		Length -= *BytesProcessed;
+		TEMPLATE_BUFFER_MOVE(DataStream, *BytesProcessed);
+	}
+
+	while (Length)
+	{
+		if (!(Endpoint_IsReadWriteAllowed()))
+		{
+			TEMPLATE_CLEAR_ENDPOINT();
+
+			#if !defined(INTERRUPT_CONTROL_ENDPOINT)
+			USB_USBTask();
+			#endif
+
+			if (BytesProcessed != NULL)
+			{
+				*BytesProcessed += BytesInTransfer;
+				return ENDPOINT_RWSTREAM_IncompleteTransfer;
+			}
+
+			if ((ErrorCode = Endpoint_WaitUntilReady()))
+			  return ErrorCode;
+		}
+		else
+		{
+			TEMPLATE_TRANSFER_BYTE(DataStream);
+			TEMPLATE_BUFFER_MOVE(DataStream, 1);
+			Length--;
+			BytesInTransfer++;
+		}
+	}
+
+	return ENDPOINT_RWSTREAM_NoError;
+}
+
+#undef TEMPLATE_FUNC_NAME
+#undef TEMPLATE_BUFFER_TYPE
+#undef TEMPLATE_TRANSFER_BYTE
+#undef TEMPLATE_CLEAR_ENDPOINT
+#undef TEMPLATE_BUFFER_OFFSET
+#undef TEMPLATE_BUFFER_MOVE
+
+#endif
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Core/UC3/Template/Template_Pipe_RW.c b/lib/lufa/LUFA/Drivers/USB/Core/UC3/Template/Template_Pipe_RW.c
new file mode 100644
index 0000000000..bb2a57fa52
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Core/UC3/Template/Template_Pipe_RW.c
@@ -0,0 +1,88 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+#if defined(TEMPLATE_FUNC_NAME)
+
+uint8_t TEMPLATE_FUNC_NAME (TEMPLATE_BUFFER_TYPE const Buffer,
+                            uint16_t Length,
+                            uint16_t* const BytesProcessed)
+{
+	uint8_t* DataStream      = ((uint8_t*)Buffer + TEMPLATE_BUFFER_OFFSET(Length));
+	uint16_t BytesInTransfer = 0;
+	uint8_t  ErrorCode;
+
+	Pipe_SetPipeToken(TEMPLATE_TOKEN);
+
+	if ((ErrorCode = Pipe_WaitUntilReady()))
+	  return ErrorCode;
+
+	if (BytesProcessed != NULL)
+	{
+		Length -= *BytesProcessed;
+		TEMPLATE_BUFFER_MOVE(DataStream, *BytesProcessed);
+	}
+
+	while (Length)
+	{
+		if (!(Pipe_IsReadWriteAllowed()))
+		{
+			TEMPLATE_CLEAR_PIPE();
+
+			if (BytesProcessed != NULL)
+			{
+				*BytesProcessed += BytesInTransfer;
+				return PIPE_RWSTREAM_IncompleteTransfer;
+			}
+
+			if ((ErrorCode = Pipe_WaitUntilReady()))
+			  return ErrorCode;
+		}
+		else
+		{
+			TEMPLATE_TRANSFER_BYTE(DataStream);
+			TEMPLATE_BUFFER_MOVE(DataStream, 1);
+			Length--;
+			BytesInTransfer++;
+		}
+	}
+
+	return PIPE_RWSTREAM_NoError;
+}
+
+#undef TEMPLATE_FUNC_NAME
+#undef TEMPLATE_BUFFER_TYPE
+#undef TEMPLATE_TOKEN
+#undef TEMPLATE_TRANSFER_BYTE
+#undef TEMPLATE_CLEAR_PIPE
+#undef TEMPLATE_BUFFER_OFFSET
+#undef TEMPLATE_BUFFER_MOVE
+
+#endif
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Core/UC3/USBController_UC3.c b/lib/lufa/LUFA/Drivers/USB/Core/UC3/USBController_UC3.c
new file mode 100644
index 0000000000..2b1e9ac6b8
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Core/UC3/USBController_UC3.c
@@ -0,0 +1,222 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+#include "../../../../Common/Common.h"
+#if (ARCH == ARCH_UC3)
+
+#define  __INCLUDE_FROM_USB_DRIVER
+#define  __INCLUDE_FROM_USB_CONTROLLER_C
+#include "../USBController.h"
+
+#if defined(USB_CAN_BE_BOTH)
+volatile uint8_t USB_CurrentMode = USB_MODE_None;
+#endif
+
+#if !defined(USE_STATIC_OPTIONS)
+volatile uint8_t USB_Options;
+#endif
+
+void USB_Init(
+               #if defined(USB_CAN_BE_BOTH)
+               const uint8_t Mode
+               #endif
+
+               #if (defined(USB_CAN_BE_BOTH) && !defined(USE_STATIC_OPTIONS))
+               ,
+               #elif (!defined(USB_CAN_BE_BOTH) && defined(USE_STATIC_OPTIONS))
+               void
+               #endif
+
+               #if !defined(USE_STATIC_OPTIONS)
+               const uint8_t Options
+               #endif
+               )
+{
+	#if !defined(USE_STATIC_OPTIONS)
+	USB_Options = Options;
+	#endif
+
+	#if defined(USB_CAN_BE_BOTH)
+	if (Mode == USB_MODE_UID)
+	{
+		AVR32_USBB.USBCON.uide = true;
+		USB_INT_Enable(USB_INT_IDTI);
+		USB_CurrentMode = USB_GetUSBModeFromUID();
+	}
+	else
+	{
+		AVR32_USBB.USBCON.uide = false;
+		USB_CurrentMode = Mode;
+	}
+	#else
+	AVR32_USBB.USBCON.uide = false;
+	#endif
+
+	USB_IsInitialized = true;
+
+	USB_ResetInterface();
+}
+
+void USB_Disable(void)
+{
+	USB_INT_DisableAllInterrupts();
+	USB_INT_ClearAllInterrupts();
+
+	USB_Detach();
+	USB_Controller_Disable();
+
+	USB_OTGPAD_Off();
+
+	#if defined(USB_CAN_BE_BOTH)
+	USB_CurrentMode = USB_MODE_None;
+	#endif
+
+	AVR32_PM.GCCTRL[3].cen = false;
+
+	USB_IsInitialized = false;
+}
+
+void USB_ResetInterface(void)
+{
+	#if defined(USB_CAN_BE_BOTH)
+	bool UIDModeSelectEnabled = AVR32_USBB.USBCON.uide;
+	#endif
+
+	AVR32_PM.GCCTRL[AVR32_PM_GCLK_USBB].pllsel = !(USB_Options & USB_OPT_GCLK_SRC_OSC);
+	AVR32_PM.GCCTRL[AVR32_PM_GCLK_USBB].oscsel = !(USB_Options & USB_OPT_GCLK_CHANNEL_0);
+	AVR32_PM.GCCTRL[AVR32_PM_GCLK_USBB].diven  = (F_USB != USB_CLOCK_REQUIRED_FREQ);
+	AVR32_PM.GCCTRL[AVR32_PM_GCLK_USBB].div    = (F_USB == USB_CLOCK_REQUIRED_FREQ) ? 0 : (uint32_t)((F_USB / USB_CLOCK_REQUIRED_FREQ / 2) - 1);
+	AVR32_PM.GCCTRL[AVR32_PM_GCLK_USBB].cen    = true;
+
+	USB_INT_DisableAllInterrupts();
+	USB_INT_ClearAllInterrupts();
+
+	USB_Controller_Reset();
+
+	#if defined(USB_CAN_BE_BOTH)
+	if (UIDModeSelectEnabled)
+	  USB_INT_Enable(USB_INT_IDTI);
+	#endif
+
+	USB_CLK_Unfreeze();
+
+	if (USB_CurrentMode == USB_MODE_Device)
+	{
+		#if defined(USB_CAN_BE_DEVICE)
+		AVR32_USBB.USBCON.uimod = true;
+
+		USB_Init_Device();
+		#endif
+	}
+	else if (USB_CurrentMode == USB_MODE_Host)
+	{
+		#if defined(INVERTED_VBUS_ENABLE_LINE)
+		AVR32_USBB.USBCON.vbuspo = true;
+		#endif
+
+		#if defined(USB_CAN_BE_HOST)
+		AVR32_USBB.USBCON.uimod = false;
+
+		USB_Init_Host();
+		#endif
+	}
+
+	USB_OTGPAD_On();
+}
+
+#if defined(USB_CAN_BE_DEVICE)
+static void USB_Init_Device(void)
+{
+	USB_DeviceState                 = DEVICE_STATE_Unattached;
+	USB_Device_ConfigurationNumber  = 0;
+
+	#if !defined(NO_DEVICE_REMOTE_WAKEUP)
+	USB_Device_RemoteWakeupEnabled  = false;
+	#endif
+
+	#if !defined(NO_DEVICE_SELF_POWER)
+	USB_Device_CurrentlySelfPowered = false;
+	#endif
+
+	#if !defined(FIXED_CONTROL_ENDPOINT_SIZE)
+	USB_Descriptor_Device_t* DeviceDescriptorPtr;
+
+	if (CALLBACK_USB_GetDescriptor((DTYPE_Device << 8), 0, (void*)&DeviceDescriptorPtr) != NO_DESCRIPTOR)
+	  USB_Device_ControlEndpointSize = DeviceDescriptorPtr->Endpoint0Size;
+	#endif
+
+	if (USB_Options & USB_DEVICE_OPT_LOWSPEED)
+	{
+		USB_Device_SetLowSpeed();
+	}
+	else
+	{
+		#if defined(USB_DEVICE_OPT_HIGHSPEED)
+		if (USB_Options & USB_DEVICE_OPT_HIGHSPEED)
+		  USB_Device_SetHighSpeed();
+		else
+		  USB_Device_SetFullSpeed();
+		#else
+		USB_Device_SetFullSpeed();
+		#endif
+	}
+
+	USB_INT_Enable(USB_INT_VBUSTI);
+
+	Endpoint_ConfigureEndpoint(ENDPOINT_CONTROLEP, EP_TYPE_CONTROL,
+							   USB_Device_ControlEndpointSize, 1);
+
+	USB_INT_Clear(USB_INT_SUSPI);
+	USB_INT_Enable(USB_INT_SUSPI);
+	USB_INT_Enable(USB_INT_EORSTI);
+
+	USB_Attach();
+}
+#endif
+
+#if defined(USB_CAN_BE_HOST)
+static void USB_Init_Host(void)
+{
+	USB_HostState                = HOST_STATE_Unattached;
+	USB_Host_ConfigurationNumber = 0;
+	USB_Host_ControlPipeSize     = PIPE_CONTROLPIPE_DEFAULT_SIZE;
+
+	USB_Host_HostMode_On();
+
+	USB_Host_VBUS_Auto_On();
+
+	USB_INT_Enable(USB_INT_DCONNI);
+	USB_INT_Enable(USB_INT_BCERRI);
+
+	USB_Attach();
+}
+#endif
+
+#endif
diff --git a/lib/lufa/LUFA/Drivers/USB/Core/UC3/USBController_UC3.h b/lib/lufa/LUFA/Drivers/USB/Core/UC3/USBController_UC3.h
new file mode 100644
index 0000000000..32c2f6ec17
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Core/UC3/USBController_UC3.h
@@ -0,0 +1,353 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief USB Controller definitions for the AVR32 UC3 microcontrollers.
+ *  \copydetails Group_USBManagement_UC3
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the USB driver
+ *        dispatch header located in LUFA/Drivers/USB/USB.h.
+ */
+
+/** \ingroup Group_USBManagement
+ *  \defgroup Group_USBManagement_UC3 USB Interface Management (UC3)
+ *  \brief USB Controller definitions for the AVR32 UC3 microcontrollers.
+ *
+ *  Functions, macros, variables, enums and types related to the setup and management of the USB interface.
+ *
+ *  @{
+ */
+
+#ifndef __USBCONTROLLER_UC3_H__
+#define __USBCONTROLLER_UC3_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+		#include "../USBMode.h"
+		#include "../Events.h"
+		#include "../USBTask.h"
+		#include "../USBInterrupt.h"
+
+		#if defined(USB_CAN_BE_HOST) || defined(__DOXYGEN__)
+			#include "../Host.h"
+			#include "../OTG.h"
+			#include "../Pipe.h"
+			#include "../HostStandardReq.h"
+			#include "../PipeStream.h"
+		#endif
+
+		#if defined(USB_CAN_BE_DEVICE) || defined(__DOXYGEN__)
+			#include "../Device.h"
+			#include "../Endpoint.h"
+			#include "../DeviceStandardReq.h"
+			#include "../EndpointStream.h"
+		#endif
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks and Defines: */
+		#if !defined(__INCLUDE_FROM_USB_DRIVER)
+			#error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.
+		#endif
+
+		#if !defined(F_USB)
+			#error F_USB is not defined. You must define F_USB to the frequency of the clock input to the USB module.
+		#endif
+
+		#if (defined(USB_SERIES_UC3A3_AVR) || defined(USB_SERIES_UC3A4_AVR))
+			#if ((F_USB < 12000000) || (F_USB % 12000000))
+				#error Invalid F_USB specified. F_USB must be a multiple of 12MHz for UC3A3 and UC3A4 devices.
+			#endif
+		#else
+			#if ((F_USB < 48000000) || (F_USB % 48000000))
+				#error Invalid F_USB specified. F_USB must be a multiple of 48MHz for UC3A and UC3B devices.
+			#endif
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** \name USB Controller Option Masks */
+			//@{
+			/** Selects one of the system's main clock oscillators as the input clock to the USB Generic Clock source
+			 *  generation module. This indicates that an external oscillator should be used directly instead of an
+			 *  internal PLL clock source.
+			 */
+			#define USB_OPT_GCLK_SRC_OSC               (1 << 2)
+
+			/** Selects one of the system's PLL oscillators as the input clock to the USB Generic Clock source
+			 *  generation module. This indicates that one of the device's PLL outputs should be used instead of an
+			 *  external oscillator source.
+			 */
+			#define USB_OPT_GCLK_SRC_PLL               (0 << 2)
+
+			/** Selects PLL or External Oscillator 0 as the USB Generic Clock source module input clock. */
+			#define USB_OPT_GCLK_CHANNEL_0             (1 << 3)
+
+			/** Selects PLL or External Oscillator 1 as the USB Generic Clock source module input clock. */
+			#define USB_OPT_GCLK_CHANNEL_1             (0 << 3)
+			//@}
+
+			#if !defined(USB_STREAM_TIMEOUT_MS) || defined(__DOXYGEN__)
+				/** Constant for the maximum software timeout period of the USB data stream transfer functions
+				 *  (both control and standard) when in either device or host mode. If the next packet of a stream
+				 *  is not received or acknowledged within this time period, the stream function will fail.
+				 *
+				 *  This value may be overridden in the user project makefile as the value of the
+				 *  \ref USB_STREAM_TIMEOUT_MS token, and passed to the compiler using the -D switch.
+				 */
+				#define USB_STREAM_TIMEOUT_MS       100
+			#endif
+
+		/* Inline Functions: */
+			/** Determines if the VBUS line is currently high (i.e. the USB host is supplying power).
+			 *
+			 *  \return Boolean \c true if the VBUS line is currently detecting power from a host, \c false otherwise.
+			 */
+			static inline bool USB_VBUS_GetStatus(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline bool USB_VBUS_GetStatus(void)
+			{
+				return AVR32_USBB.USBSTA.vbus;
+			}
+
+			/** Detaches the device from the USB bus. This has the effect of removing the device from any
+			 *  attached host, ceasing USB communications. If no host is present, this prevents any host from
+			 *  enumerating the device once attached until \ref USB_Attach() is called.
+			 */
+			static inline void USB_Detach(void) ATTR_ALWAYS_INLINE;
+			static inline void USB_Detach(void)
+			{
+				AVR32_USBB.UDCON.detach = true;
+			}
+
+			/** Attaches the device to the USB bus. This announces the device's presence to any attached
+			 *  USB host, starting the enumeration process. If no host is present, attaching the device
+			 *  will allow for enumeration once a host is connected to the device.
+			 *
+			 *  This is inexplicably also required for proper operation while in host mode, to enable the
+			 *  attachment of a device to the host. This is despite the bit being located in the device-mode
+			 *  register and despite the datasheet making no mention of its requirement in host mode.
+			 */
+			static inline void USB_Attach(void) ATTR_ALWAYS_INLINE;
+			static inline void USB_Attach(void)
+			{
+				AVR32_USBB.UDCON.detach = false;
+			}
+
+		/* Function Prototypes: */
+			/** Main function to initialize and start the USB interface. Once active, the USB interface will
+			 *  allow for device connection to a host when in device mode, or for device enumeration while in
+			 *  host mode.
+			 *
+			 *  As the USB library relies on interrupts for the device and host mode enumeration processes,
+			 *  the user must enable global interrupts before or shortly after this function is called. In
+			 *  device mode, interrupts must be enabled within 500ms of this function being called to ensure
+			 *  that the host does not time out whilst enumerating the device. In host mode, interrupts may be
+			 *  enabled at the application's leisure however enumeration will not begin of an attached device
+			 *  until after this has occurred.
+			 *
+			 *  Calling this function when the USB interface is already initialized will cause a complete USB
+			 *  interface reset and re-enumeration.
+			 *
+			 *  \param[in] Mode     Mask indicating what mode the USB interface is to be initialized to, a value
+			 *                      from the \ref USB_Modes_t enum.
+			 *                      \note This parameter does not exist on devices with only one supported USB
+			 *                            mode (device or host).
+			 *
+			 *  \param[in] Options  Mask indicating the options which should be used when initializing the USB
+			 *                      interface to control the USB interface's behavior. This should be comprised of
+			 *                      a \c USB_OPT_REG_* mask to control the regulator, a \c USB_OPT_*_PLL mask to control the
+			 *                      PLL, and a \c USB_DEVICE_OPT_* mask (when the device mode is enabled) to set the device
+			 *                      mode speed.
+			 *
+			 *  \note To reduce the FLASH requirements of the library if only device or host mode is required,
+			 *        the mode can be statically set in the project makefile by defining the token \c USB_DEVICE_ONLY
+			 *        (for device mode) or \c USB_HOST_ONLY (for host mode), passing the token to the compiler
+			 *        via the -D switch. If the mode is statically set, this parameter does not exist in the
+			 *        function prototype.
+			 *        \n\n
+			 *
+			 *  \note To reduce the FLASH requirements of the library if only fixed settings are required,
+			 *        the options may be set statically in the same manner as the mode (see the Mode parameter of
+			 *        this function). To statically set the USB options, pass in the \c USE_STATIC_OPTIONS token,
+			 *        defined to the appropriate options masks. When the options are statically set, this
+			 *        parameter does not exist in the function prototype.
+			 *
+			 *  \see \ref Group_Device for the \c USB_DEVICE_OPT_* masks.
+			 */
+			void USB_Init(
+			               #if defined(USB_CAN_BE_BOTH) || defined(__DOXYGEN__)
+			               const uint8_t Mode
+			               #endif
+
+			               #if (defined(USB_CAN_BE_BOTH) && !defined(USE_STATIC_OPTIONS)) || defined(__DOXYGEN__)
+			               ,
+			               #elif (!defined(USB_CAN_BE_BOTH) && defined(USE_STATIC_OPTIONS))
+			               void
+			               #endif
+
+			               #if !defined(USE_STATIC_OPTIONS) || defined(__DOXYGEN__)
+			               const uint8_t Options
+			               #endif
+			               );
+
+			/** Shuts down the USB interface. This turns off the USB interface after deallocating all USB FIFO
+			 *  memory, endpoints and pipes. When turned off, no USB functionality can be used until the interface
+			 *  is restarted with the \ref USB_Init() function.
+			 */
+			void USB_Disable(void);
+
+			/** Resets the interface, when already initialized. This will re-enumerate the device if already connected
+			 *  to a host, or re-enumerate an already attached device when in host mode.
+			 */
+			void USB_ResetInterface(void);
+
+		/* Global Variables: */
+			#if defined(USB_CAN_BE_BOTH) || defined(__DOXYGEN__)
+				/** Indicates the mode that the USB interface is currently initialized to, a value from the
+				 *  \ref USB_Modes_t enum.
+				 *
+				 *  \attention This variable should be treated as read-only in the user application, and never manually
+				 *             changed in value.
+				 *
+				 *  \note When the controller is initialized into UID auto-detection mode, this variable will hold the
+				 *        currently selected USB mode (i.e. \ref USB_MODE_Device or \ref USB_MODE_Host). If the controller
+				 *        is fixed into a specific mode (either through the \c USB_DEVICE_ONLY or \c USB_HOST_ONLY compile time
+				 *        options, or a limitation of the USB controller in the chosen device model) this will evaluate to
+				 *        a constant of the appropriate value and will never evaluate to \ref USB_MODE_None even when the
+				 *        USB interface is not initialized.
+				 */
+				extern volatile uint8_t USB_CurrentMode;
+			#elif defined(USB_CAN_BE_HOST)
+				#define USB_CurrentMode USB_MODE_Host
+			#elif defined(USB_CAN_BE_DEVICE)
+				#define USB_CurrentMode USB_MODE_Device
+			#endif
+
+			#if !defined(USE_STATIC_OPTIONS) || defined(__DOXYGEN__)
+				/** Indicates the current USB options that the USB interface was initialized with when \ref USB_Init()
+				 *  was called. This value will be one of the \c USB_MODE_* masks defined elsewhere in this module.
+				 *
+				 *  \attention This variable should be treated as read-only in the user application, and never manually
+				 *             changed in value.
+				 */
+				extern volatile uint8_t USB_Options;
+			#elif defined(USE_STATIC_OPTIONS)
+				#define USB_Options USE_STATIC_OPTIONS
+			#endif
+
+	/* Private Interface - For use in library only: */
+	#if !defined(__DOXYGEN__)
+		/* Macros: */
+			#if defined(USB_SERIES_UC3A3_AVR32) || defined(USB_SERIES_UC3A4_AVR32)
+				#define USB_CLOCK_REQUIRED_FREQ  12000000UL
+			#else
+				#define USB_CLOCK_REQUIRED_FREQ  48000000UL
+			#endif
+
+		/* Function Prototypes: */
+			#if defined(__INCLUDE_FROM_USB_CONTROLLER_C)
+				#if defined(USB_CAN_BE_DEVICE)
+				static void USB_Init_Device(void);
+				#endif
+
+				#if defined(USB_CAN_BE_HOST)
+				static void USB_Init_Host(void);
+				#endif
+			#endif
+
+		/* Inline Functions: */
+			static inline void USB_OTGPAD_On(void) ATTR_ALWAYS_INLINE;
+			static inline void USB_OTGPAD_On(void)
+			{
+				AVR32_USBB.USBCON.otgpade = true;
+			}
+
+			static inline void USB_OTGPAD_Off(void) ATTR_ALWAYS_INLINE;
+			static inline void USB_OTGPAD_Off(void)
+			{
+				AVR32_USBB.USBCON.otgpade = false;
+			}
+
+			static inline void USB_CLK_Freeze(void) ATTR_ALWAYS_INLINE;
+			static inline void USB_CLK_Freeze(void)
+			{
+				AVR32_USBB.USBCON.frzclk = true;
+			}
+
+			static inline void USB_CLK_Unfreeze(void) ATTR_ALWAYS_INLINE;
+			static inline void USB_CLK_Unfreeze(void)
+			{
+				AVR32_USBB.USBCON.frzclk = false;
+			}
+
+			static inline void USB_Controller_Enable(void) ATTR_ALWAYS_INLINE;
+			static inline void USB_Controller_Enable(void)
+			{
+				AVR32_USBB.USBCON.usbe = true;
+			}
+
+			static inline void USB_Controller_Disable(void) ATTR_ALWAYS_INLINE;
+			static inline void USB_Controller_Disable(void)
+			{
+				AVR32_USBB.USBCON.usbe = false;
+			}
+
+			static inline void USB_Controller_Reset(void) ATTR_ALWAYS_INLINE;
+			static inline void USB_Controller_Reset(void)
+			{
+				AVR32_USBB.USBCON.usbe = false;
+				AVR32_USBB.USBCON.usbe = true;
+			}
+
+			#if defined(USB_CAN_BE_BOTH)
+			static inline uint8_t USB_GetUSBModeFromUID(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline uint8_t USB_GetUSBModeFromUID(void)
+			{
+				if (AVR32_USBB.USBSTA.id)
+				  return USB_MODE_Device;
+				else
+				  return USB_MODE_Host;
+			}
+			#endif
+
+	#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Core/UC3/USBInterrupt_UC3.c b/lib/lufa/LUFA/Drivers/USB/Core/UC3/USBInterrupt_UC3.c
new file mode 100644
index 0000000000..3b3958a145
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Core/UC3/USBInterrupt_UC3.c
@@ -0,0 +1,228 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+#include "../../../../Common/Common.h"
+#if (ARCH == ARCH_UC3)
+
+#define  __INCLUDE_FROM_USB_DRIVER
+#include "../USBInterrupt.h"
+
+void USB_INT_DisableAllInterrupts(void)
+{
+	AVR32_USBB.USBCON.vbuste     = false;
+	AVR32_USBB.USBCON.idte       = false;
+
+	AVR32_USBB.uhinteclr         = -1;
+	AVR32_USBB.udinteclr         = -1;
+}
+
+void USB_INT_ClearAllInterrupts(void)
+{
+	AVR32_USBB.USBSTACLR.vbustic = true;
+	AVR32_USBB.USBSTACLR.idtic   = true;
+
+	AVR32_USBB.uhintclr          = -1;
+	AVR32_USBB.udintclr          = -1;
+}
+
+ISR(USB_GEN_vect)
+{
+	#if defined(USB_CAN_BE_DEVICE)
+	#if !defined(NO_SOF_EVENTS)
+	if (USB_INT_HasOccurred(USB_INT_SOFI) && USB_INT_IsEnabled(USB_INT_SOFI))
+	{
+		USB_INT_Clear(USB_INT_SOFI);
+
+		EVENT_USB_Device_StartOfFrame();
+	}
+	#endif
+
+	if (USB_INT_HasOccurred(USB_INT_VBUSTI) && USB_INT_IsEnabled(USB_INT_VBUSTI))
+	{
+		USB_INT_Clear(USB_INT_VBUSTI);
+
+		if (USB_VBUS_GetStatus())
+		{
+			USB_DeviceState = DEVICE_STATE_Powered;
+			EVENT_USB_Device_Connect();
+		}
+		else
+		{
+			USB_DeviceState = DEVICE_STATE_Unattached;
+			EVENT_USB_Device_Disconnect();
+		}
+	}
+
+	if (USB_INT_HasOccurred(USB_INT_SUSPI) && USB_INT_IsEnabled(USB_INT_SUSPI))
+	{
+		USB_INT_Disable(USB_INT_SUSPI);
+		USB_INT_Enable(USB_INT_WAKEUPI);
+
+		USB_CLK_Freeze();
+
+		USB_DeviceState = DEVICE_STATE_Suspended;
+		EVENT_USB_Device_Suspend();
+	}
+
+	if (USB_INT_HasOccurred(USB_INT_WAKEUPI) && USB_INT_IsEnabled(USB_INT_WAKEUPI))
+	{
+		USB_CLK_Unfreeze();
+
+		USB_INT_Clear(USB_INT_WAKEUPI);
+
+		USB_INT_Disable(USB_INT_WAKEUPI);
+		USB_INT_Enable(USB_INT_SUSPI);
+
+		if (USB_Device_ConfigurationNumber)
+		  USB_DeviceState = DEVICE_STATE_Configured;
+		else
+		  USB_DeviceState = (USB_Device_IsAddressSet()) ? DEVICE_STATE_Addressed : DEVICE_STATE_Powered;
+
+		EVENT_USB_Device_WakeUp();
+	}
+
+	if (USB_INT_HasOccurred(USB_INT_EORSTI) && USB_INT_IsEnabled(USB_INT_EORSTI))
+	{
+		USB_INT_Clear(USB_INT_EORSTI);
+
+		USB_DeviceState                = DEVICE_STATE_Default;
+		USB_Device_ConfigurationNumber = 0;
+
+		USB_INT_Clear(USB_INT_SUSPI);
+		USB_INT_Disable(USB_INT_SUSPI);
+		USB_INT_Enable(USB_INT_WAKEUPI);
+
+		USB_Device_SetDeviceAddress(0);
+		Endpoint_ConfigureEndpoint(ENDPOINT_CONTROLEP, EP_TYPE_CONTROL,
+		                           USB_Device_ControlEndpointSize, 1);
+
+		#if defined(INTERRUPT_CONTROL_ENDPOINT)
+		USB_INT_Enable(USB_INT_RXSTPI);
+		#endif
+
+		EVENT_USB_Device_Reset();
+	}
+	#endif
+
+	#if defined(USB_CAN_BE_HOST)
+	#if !defined(NO_SOF_EVENTS)
+	if (USB_INT_HasOccurred(USB_INT_HSOFI) && USB_INT_IsEnabled(USB_INT_HSOFI))
+	{
+		USB_INT_Clear(USB_INT_HSOFI);
+
+		EVENT_USB_Host_StartOfFrame();
+	}
+	#endif
+
+	if (USB_INT_HasOccurred(USB_INT_DDISCI) && USB_INT_IsEnabled(USB_INT_DDISCI))
+	{
+		USB_INT_Clear(USB_INT_DDISCI);
+		USB_INT_Clear(USB_INT_DCONNI);
+		USB_INT_Disable(USB_INT_DDISCI);
+
+		EVENT_USB_Host_DeviceUnattached();
+
+		USB_ResetInterface();
+	}
+
+	if (USB_INT_HasOccurred(USB_INT_VBERRI) && USB_INT_IsEnabled(USB_INT_VBERRI))
+	{
+		USB_INT_Clear(USB_INT_VBERRI);
+
+		USB_Host_VBUS_Manual_Off();
+		USB_Host_VBUS_Auto_Off();
+
+		EVENT_USB_Host_HostError(HOST_ERROR_VBusVoltageDip);
+		EVENT_USB_Host_DeviceUnattached();
+
+		USB_HostState = HOST_STATE_Unattached;
+	}
+
+	if (USB_INT_HasOccurred(USB_INT_DCONNI) && USB_INT_IsEnabled(USB_INT_DCONNI))
+	{
+		USB_INT_Clear(USB_INT_DCONNI);
+		USB_INT_Disable(USB_INT_DCONNI);
+
+		EVENT_USB_Host_DeviceAttached();
+
+		USB_INT_Enable(USB_INT_DDISCI);
+
+		USB_HostState = HOST_STATE_Powered;
+	}
+
+	if (USB_INT_HasOccurred(USB_INT_BCERRI) && USB_INT_IsEnabled(USB_INT_BCERRI))
+	{
+		USB_INT_Clear(USB_INT_BCERRI);
+
+		EVENT_USB_Host_DeviceEnumerationFailed(HOST_ENUMERROR_NoDeviceDetected, 0);
+		EVENT_USB_Host_DeviceUnattached();
+
+		USB_ResetInterface();
+	}
+	#endif
+
+	#if defined(USB_CAN_BE_BOTH)
+	if (USB_INT_HasOccurred(USB_INT_IDTI) && USB_INT_IsEnabled(USB_INT_IDTI))
+	{
+		USB_INT_Clear(USB_INT_IDTI);
+
+		if (USB_DeviceState != DEVICE_STATE_Unattached)
+		  EVENT_USB_Device_Disconnect();
+
+		if (USB_HostState != HOST_STATE_Unattached)
+		  EVENT_USB_Host_DeviceUnattached();
+
+		USB_CurrentMode = USB_GetUSBModeFromUID();
+		USB_ResetInterface();
+
+		EVENT_USB_UIDChange();
+	}
+	#endif
+}
+
+#if defined(INTERRUPT_CONTROL_ENDPOINT) && defined(USB_CAN_BE_DEVICE)
+ISR(USB_COM_vect)
+{
+	uint8_t PrevSelectedEndpoint = Endpoint_GetCurrentEndpoint();
+
+	Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP);
+	USB_INT_Disable(USB_INT_RXSTPI);
+
+	GlobalInterruptEnable();
+
+	USB_Device_ProcessControlRequest();
+
+	Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP);
+	USB_INT_Enable(USB_INT_RXSTPI);
+	Endpoint_SelectEndpoint(PrevSelectedEndpoint);
+}
+#endif
+
+#endif
diff --git a/lib/lufa/LUFA/Drivers/USB/Core/UC3/USBInterrupt_UC3.h b/lib/lufa/LUFA/Drivers/USB/Core/UC3/USBInterrupt_UC3.h
new file mode 100644
index 0000000000..e2f67bf86a
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Core/UC3/USBInterrupt_UC3.h
@@ -0,0 +1,376 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief USB Controller Interrupt definitions for the AVR32 UC3 microcontrollers.
+ *
+ *  This file contains definitions required for the correct handling of low level USB service routine interrupts
+ *  from the USB controller.
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the USB driver
+ *        dispatch header located in LUFA/Drivers/USB/USB.h.
+ */
+
+#ifndef __USBINTERRUPT_UC3_H__
+#define __USBINTERRUPT_UC3_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_USB_DRIVER)
+			#error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.
+		#endif
+
+	/* Private Interface - For use in library only: */
+	#if !defined(__DOXYGEN__)
+		/* External Variables: */
+			extern volatile uint32_t USB_Endpoint_SelectedEndpoint;
+
+		/* Enums: */
+			enum USB_Interrupts_t
+			{
+				USB_INT_VBUSTI  = 0,
+				#if (defined(USB_CAN_BE_BOTH) || defined(__DOXYGEN__))
+				USB_INT_IDTI    = 1,
+				#endif
+				#if (defined(USB_CAN_BE_DEVICE) || defined(__DOXYGEN__))
+				USB_INT_WAKEUPI = 2,
+				USB_INT_SUSPI   = 3,
+				USB_INT_EORSTI  = 4,
+				USB_INT_SOFI    = 5,
+				USB_INT_RXSTPI  = 6,
+				#endif
+				#if (defined(USB_CAN_BE_HOST) || defined(__DOXYGEN__))
+				USB_INT_HSOFI   = 7,
+				USB_INT_DCONNI  = 8,
+				USB_INT_DDISCI  = 9,
+				USB_INT_RSTI    = 10,
+				USB_INT_BCERRI  = 11,
+				USB_INT_VBERRI  = 12,
+				#endif
+			};
+
+		/* Inline Functions: */
+			static inline void USB_INT_Enable(const uint8_t Interrupt) ATTR_ALWAYS_INLINE;
+			static inline void USB_INT_Enable(const uint8_t Interrupt)
+			{
+				switch (Interrupt)
+				{
+					case USB_INT_VBUSTI:
+						AVR32_USBB.USBCON.vbuste      = true;
+						break;
+					#if defined(USB_CAN_BE_BOTH)
+					case USB_INT_IDTI:
+						AVR32_USBB.USBCON.idte        = true;
+						break;
+					#endif
+					#if defined(USB_CAN_BE_DEVICE)
+					case USB_INT_WAKEUPI:
+						AVR32_USBB.UDINTESET.wakeupes = true;
+						break;
+					case USB_INT_SUSPI:
+						AVR32_USBB.UDINTESET.suspes   = true;
+						break;
+					case USB_INT_EORSTI:
+						AVR32_USBB.UDINTESET.eorstes  = true;
+						break;
+					case USB_INT_SOFI:
+						AVR32_USBB.UDINTESET.sofes    = true;
+						break;
+					case USB_INT_RXSTPI:
+						(&AVR32_USBB.UECON0SET)[USB_Endpoint_SelectedEndpoint].rxstpes = true;
+						break;
+					#endif
+					#if defined(USB_CAN_BE_HOST)
+					case USB_INT_HSOFI:
+						AVR32_USBB.UHINTESET.hsofies  = true;
+						break;
+					case USB_INT_DCONNI:
+						AVR32_USBB.UHINTESET.dconnies = true;
+						break;
+					case USB_INT_DDISCI:
+						AVR32_USBB.UHINTESET.ddiscies = true;
+						break;
+					case USB_INT_RSTI:
+						AVR32_USBB.UHINTESET.rsties   = true;
+						break;
+					case USB_INT_BCERRI:
+						AVR32_USBB.USBCON.bcerre      = true;
+						break;
+					case USB_INT_VBERRI:
+						AVR32_USBB.USBCON.vberre      = true;
+						break;
+					#endif
+					default:
+						break;
+				}
+			}
+
+			static inline void USB_INT_Disable(const uint8_t Interrupt) ATTR_ALWAYS_INLINE;
+			static inline void USB_INT_Disable(const uint8_t Interrupt)
+			{
+				switch (Interrupt)
+				{
+					case USB_INT_VBUSTI:
+						AVR32_USBB.USBCON.vbuste      = false;
+						break;
+					#if defined(USB_CAN_BE_BOTH)
+					case USB_INT_IDTI:
+						AVR32_USBB.USBCON.idte        = false;
+						break;
+					#endif
+					#if defined(USB_CAN_BE_DEVICE)
+					case USB_INT_WAKEUPI:
+						AVR32_USBB.UDINTECLR.wakeupec = true;
+						break;
+					case USB_INT_SUSPI:
+						AVR32_USBB.UDINTECLR.suspec   = true;
+						break;
+					case USB_INT_EORSTI:
+						AVR32_USBB.UDINTECLR.eorstec  = true;
+						break;
+					case USB_INT_SOFI:
+						AVR32_USBB.UDINTECLR.sofec    = true;
+						break;
+					case USB_INT_RXSTPI:
+						(&AVR32_USBB.UECON0CLR)[USB_Endpoint_SelectedEndpoint].rxstpec = true;
+						break;
+					#endif
+					#if defined(USB_CAN_BE_HOST)
+					case USB_INT_HSOFI:
+						AVR32_USBB.UHINTECLR.hsofiec  = true;
+						break;
+					case USB_INT_DCONNI:
+						AVR32_USBB.UHINTECLR.dconniec = true;
+						break;
+					case USB_INT_DDISCI:
+						AVR32_USBB.UHINTECLR.ddisciec = true;
+						break;
+					case USB_INT_RSTI:
+						AVR32_USBB.UHINTECLR.rstiec   = true;
+						break;
+					case USB_INT_BCERRI:
+						AVR32_USBB.USBCON.bcerre      = false;
+						break;
+					case USB_INT_VBERRI:
+						AVR32_USBB.USBCON.vberre      = false;
+						break;
+					#endif
+					default:
+						break;
+				}
+			}
+
+			static inline void USB_INT_Clear(const uint8_t Interrupt) ATTR_ALWAYS_INLINE;
+			static inline void USB_INT_Clear(const uint8_t Interrupt)
+			{
+				switch (Interrupt)
+				{
+					case USB_INT_VBUSTI:
+						AVR32_USBB.USBSTACLR.vbustic = true;
+						(void)AVR32_USBB.USBSTACLR;
+						break;
+					#if defined(USB_CAN_BE_BOTH)
+					case USB_INT_IDTI:
+						AVR32_USBB.USBSTACLR.idtic   = true;
+						(void)AVR32_USBB.USBSTACLR;
+						break;
+					#endif
+					#if defined(USB_CAN_BE_DEVICE)
+					case USB_INT_WAKEUPI:
+						AVR32_USBB.UDINTCLR.wakeupc  = true;
+						(void)AVR32_USBB.UDINTCLR;
+						break;
+					case USB_INT_SUSPI:
+						AVR32_USBB.UDINTCLR.suspc    = true;
+						(void)AVR32_USBB.UDINTCLR;
+						break;
+					case USB_INT_EORSTI:
+						AVR32_USBB.UDINTCLR.eorstc   = true;
+						(void)AVR32_USBB.UDINTCLR;
+						break;
+					case USB_INT_SOFI:
+						AVR32_USBB.UDINTCLR.sofc     = true;
+						(void)AVR32_USBB.UDINTCLR;
+						break;
+					case USB_INT_RXSTPI:
+						(&AVR32_USBB.UESTA0CLR)[USB_Endpoint_SelectedEndpoint].rxstpic = true;
+						break;
+					#endif
+					#if defined(USB_CAN_BE_HOST)
+					case USB_INT_HSOFI:
+						AVR32_USBB.UHINTCLR.hsofic   = true;
+						(void)AVR32_USBB.UHINTCLR;
+						break;
+					case USB_INT_DCONNI:
+						AVR32_USBB.UHINTCLR.dconnic  = true;
+						(void)AVR32_USBB.UHINTCLR;
+						break;
+					case USB_INT_DDISCI:
+						AVR32_USBB.UHINTCLR.ddiscic  = true;
+						(void)AVR32_USBB.UHINTCLR;
+						break;
+					case USB_INT_RSTI:
+						AVR32_USBB.UHINTCLR.rstic    = true;
+						(void)AVR32_USBB.UHINTCLR;
+						break;
+					case USB_INT_BCERRI:
+						AVR32_USBB.USBSTACLR.bcerric = true;
+						(void)AVR32_USBB.USBSTACLR;
+						break;
+					case USB_INT_VBERRI:
+						AVR32_USBB.USBSTACLR.vberric = true;
+						(void)AVR32_USBB.USBSTACLR;
+						break;
+					#endif
+					default:
+						break;
+				}
+			}
+
+			static inline bool USB_INT_IsEnabled(const uint8_t Interrupt) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT;
+			static inline bool USB_INT_IsEnabled(const uint8_t Interrupt)
+			{
+				switch (Interrupt)
+				{
+					case USB_INT_VBUSTI:
+						return AVR32_USBB.USBCON.vbuste;
+					#if defined(USB_CAN_BE_BOTH)
+					case USB_INT_IDTI:
+						return AVR32_USBB.USBCON.idte;
+					#endif
+					#if defined(USB_CAN_BE_DEVICE)
+					case USB_INT_WAKEUPI:
+						return AVR32_USBB.UDINTE.wakeupe;
+					case USB_INT_SUSPI:
+						return AVR32_USBB.UDINTE.suspe;
+					case USB_INT_EORSTI:
+						return AVR32_USBB.UDINTE.eorste;
+					case USB_INT_SOFI:
+						return AVR32_USBB.UDINTE.sofe;
+					case USB_INT_RXSTPI:
+						return (&AVR32_USBB.UECON0)[USB_Endpoint_SelectedEndpoint].rxstpe;
+					#endif
+					#if defined(USB_CAN_BE_HOST)
+					case USB_INT_HSOFI:
+						return AVR32_USBB.UHINTE.hsofie;
+					case USB_INT_DCONNI:
+						return AVR32_USBB.UHINTE.dconnie;
+					case USB_INT_DDISCI:
+						return AVR32_USBB.UHINTE.ddiscie;
+					case USB_INT_RSTI:
+						return AVR32_USBB.UHINTE.rstie;
+					case USB_INT_BCERRI:
+						return AVR32_USBB.USBCON.bcerre;
+					case USB_INT_VBERRI:
+						return AVR32_USBB.USBCON.vberre;
+					#endif
+					default:
+						return false;
+				}
+			}
+
+			static inline bool USB_INT_HasOccurred(const uint8_t Interrupt) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT;
+			static inline bool USB_INT_HasOccurred(const uint8_t Interrupt)
+			{
+				switch (Interrupt)
+				{
+					case USB_INT_VBUSTI:
+						return AVR32_USBB.USBSTA.vbusti;
+					#if defined(USB_CAN_BE_BOTH)
+					case USB_INT_IDTI:
+						return AVR32_USBB.USBSTA.idti;
+					#endif
+					#if defined(USB_CAN_BE_DEVICE)
+					case USB_INT_WAKEUPI:
+						return AVR32_USBB.UDINT.wakeup;
+					case USB_INT_SUSPI:
+						return AVR32_USBB.UDINT.susp;
+					case USB_INT_EORSTI:
+						return AVR32_USBB.UDINT.eorst;
+					case USB_INT_SOFI:
+						return AVR32_USBB.UDINT.sof;
+					case USB_INT_RXSTPI:
+						return (&AVR32_USBB.UESTA0)[USB_Endpoint_SelectedEndpoint].rxstpi;
+					#endif
+					#if defined(USB_CAN_BE_HOST)
+					case USB_INT_HSOFI:
+						return AVR32_USBB.UHINT.hsofi;
+					case USB_INT_DCONNI:
+						return AVR32_USBB.UHINT.dconni;
+					case USB_INT_DDISCI:
+						return AVR32_USBB.UHINT.ddisci;
+					case USB_INT_RSTI:
+						return AVR32_USBB.UHINT.rsti;
+					case USB_INT_BCERRI:
+						return AVR32_USBB.USBSTA.bcerri;
+					case USB_INT_VBERRI:
+						return AVR32_USBB.USBSTA.vberri;
+					#endif
+					default:
+						return false;
+				}
+			}
+
+		/* Includes: */
+			#include "../USBMode.h"
+			#include "../Events.h"
+			#include "../USBController.h"
+
+		/* Function Prototypes: */
+			void USB_INT_ClearAllInterrupts(void);
+			void USB_INT_DisableAllInterrupts(void);
+	#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Function Prototypes: */
+			#if defined(__DOXYGEN__)
+				/** Interrupt service routine handler for the USB controller ISR group. This interrupt routine <b>must</b> be
+				 *  linked to the entire USB controller ISR vector group inside the AVR32's interrupt controller peripheral,
+				 *  using the user application's preferred USB controller driver.
+				 */
+				void USB_GEN_vect(void);
+			#else
+				ISR(USB_GEN_vect);
+			#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Core/USBController.h b/lib/lufa/LUFA/Drivers/USB/Core/USBController.h
new file mode 100644
index 0000000000..5980a37ce6
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Core/USBController.h
@@ -0,0 +1,165 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Common USB Controller definitions for all architectures.
+ *  \copydetails Group_USBManagement
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the USB driver
+ *        dispatch header located in LUFA/Drivers/USB/USB.h.
+ */
+
+/** \ingroup Group_USB
+ *  \defgroup Group_USBManagement USB Interface Management
+ *  \brief USB Controller definitions for general USB controller management.
+ *
+ *  Functions, macros, variables, enums and types related to the setup and management of the USB interface.
+ *
+ *  @{
+ */
+
+#ifndef __USBCONTROLLER_H__
+#define __USBCONTROLLER_H__
+
+	/* Includes: */
+		#include "../../../Common/Common.h"
+		#include "USBMode.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks and Defines: */
+		#if !defined(__INCLUDE_FROM_USB_DRIVER)
+			#error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.
+		#endif
+
+	/* Defines: */
+		/** \name Endpoint Direction Masks */
+		//@{
+		/** Endpoint direction mask, for masking against endpoint addresses to retrieve the endpoint's
+		 *  direction for comparing with the \c ENDPOINT_DIR_* masks.
+		 */
+		#define ENDPOINT_DIR_MASK                  0x80
+
+		/** Endpoint address direction mask for an OUT direction (Host to Device) endpoint. This may be ORed with
+		 *  the index of the address within a device to obtain the full endpoint address.
+		 */
+		#define ENDPOINT_DIR_OUT                   0x00
+
+		/** Endpoint address direction mask for an IN direction (Device to Host) endpoint. This may be ORed with
+		 *  the index of the address within a device to obtain the full endpoint address.
+		 */
+		#define ENDPOINT_DIR_IN                    0x80
+		//@}
+
+		/** \name Pipe Direction Masks */
+		//@{
+		/** Pipe direction mask, for masking against pipe addresses to retrieve the pipe's
+		 *  direction for comparing with the \c PIPE_DIR_* masks.
+		 */
+		#define PIPE_DIR_MASK                      0x80
+
+		/** Endpoint address direction mask for an OUT direction (Host to Device) endpoint. This may be ORed with
+		 *  the index of the address within a device to obtain the full endpoint address.
+		 */
+		#define PIPE_DIR_OUT                       0x00
+
+		/** Endpoint address direction mask for an IN direction (Device to Host) endpoint. This may be ORed with
+		 *  the index of the address within a device to obtain the full endpoint address.
+		 */
+		#define PIPE_DIR_IN                        0x80
+		//@}
+
+		/** \name Endpoint/Pipe Type Masks */
+		//@{
+		/** Mask for determining the type of an endpoint from an endpoint descriptor. This should then be compared
+		 *  with the \c EP_TYPE_* masks to determine the exact type of the endpoint.
+		 */
+		#define EP_TYPE_MASK                       0x03
+
+		/** Mask for a CONTROL type endpoint or pipe.
+		 *
+		 *  \note See \ref Group_EndpointManagement and \ref Group_PipeManagement for endpoint/pipe functions.
+		 */
+		#define EP_TYPE_CONTROL                    0x00
+
+		/** Mask for an ISOCHRONOUS type endpoint or pipe.
+		 *
+		 *  \note See \ref Group_EndpointManagement and \ref Group_PipeManagement for endpoint/pipe functions.
+		 */
+		#define EP_TYPE_ISOCHRONOUS                0x01
+
+		/** Mask for a BULK type endpoint or pipe.
+		 *
+		 *  \note See \ref Group_EndpointManagement and \ref Group_PipeManagement for endpoint/pipe functions.
+		 */
+		#define EP_TYPE_BULK                       0x02
+
+		/** Mask for an INTERRUPT type endpoint or pipe.
+		 *
+		 *  \note See \ref Group_EndpointManagement and \ref Group_PipeManagement for endpoint/pipe functions.
+		 */
+		#define EP_TYPE_INTERRUPT                  0x03
+		//@}
+
+	/* Enums: */
+		/** Enum for the possible USB controller modes, for initialization via \ref USB_Init() and indication back to the
+		 *  user application via \ref USB_CurrentMode.
+		 */
+		enum USB_Modes_t
+		{
+			USB_MODE_None   = 0, /**< Indicates that the controller is currently not initialized in any specific USB mode. */
+			USB_MODE_Device = 1, /**< Indicates that the controller is currently initialized in USB Device mode. */
+			USB_MODE_Host   = 2, /**< Indicates that the controller is currently initialized in USB Host mode. */
+			USB_MODE_UID    = 3, /**< Indicates that the controller should determine the USB mode from the UID pin of the
+			                      *   USB connector.
+			                      */
+		};
+
+	/* Architecture Includes: */
+		#if (ARCH == ARCH_AVR8)
+			#include "AVR8/USBController_AVR8.h"
+		#elif (ARCH == ARCH_UC3)
+			#include "UC3/USBController_UC3.h"
+		#elif (ARCH == ARCH_XMEGA)
+			#include "XMEGA/USBController_XMEGA.h"
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Core/USBInterrupt.h b/lib/lufa/LUFA/Drivers/USB/Core/USBInterrupt.h
new file mode 100644
index 0000000000..b00ef7bd39
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Core/USBInterrupt.h
@@ -0,0 +1,73 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief USB controller interrupt service routine management.
+ *
+ *  This file contains definitions required for the correct handling of low level USB service routine interrupts
+ *  from the USB controller.
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the USB driver
+ *        dispatch header located in LUFA/Drivers/USB/USB.h.
+ */
+
+#ifndef __USBINTERRUPT_H__
+#define __USBINTERRUPT_H__
+
+	/* Includes: */
+		#include "../../../Common/Common.h"
+		#include "USBMode.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_USB_DRIVER)
+			#error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.
+		#endif
+
+	/* Architecture Includes: */
+		#if (ARCH == ARCH_AVR8)
+			#include "AVR8/USBInterrupt_AVR8.h"
+		#elif (ARCH == ARCH_UC3)
+			#include "UC3/USBInterrupt_UC3.h"
+		#elif (ARCH == ARCH_XMEGA)
+			#include "XMEGA/USBInterrupt_XMEGA.h"
+		#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Core/USBMode.h b/lib/lufa/LUFA/Drivers/USB/Core/USBMode.h
new file mode 100644
index 0000000000..2044f899a9
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Core/USBMode.h
@@ -0,0 +1,283 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief USB mode and feature support definitions.
+ *  \copydetails Group_USBMode
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the USB driver
+ *        dispatch header located in LUFA/Drivers/USB/USB.h.
+ */
+
+/** \ingroup Group_USB
+ *  \defgroup Group_USBMode USB Mode Tokens
+ *  \brief USB mode and feature support definitions.
+ *
+ *  This file defines macros indicating the type of USB controller the library is being compiled for, and its
+ *  capabilities. These macros may then be referenced in the user application to selectively enable or disable
+ *  code sections depending on if they are defined or not.
+ *
+ *  After the inclusion of the master USB driver header, one or more of the following tokens may be defined, to
+ *  allow the user code to conditionally enable or disable code based on the USB controller family and allowable
+ *  USB modes. These tokens may be tested against to eliminate code relating to a USB mode which is not enabled for
+ *  the given compilation.
+ *
+ *  @{
+ */
+
+#ifndef __USBMODE_H__
+#define __USBMODE_H__
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_USB_DRIVER)
+			#error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.
+		#endif
+
+	/* Includes: */
+		#include "../../../Common/Common.h"
+
+	/* Public Interface - May be used in end-application: */
+	#if defined(__DOXYGEN__)
+		/** Indicates that the target AVR microcontroller belongs to the Series 2 AVR8 USB controller
+		 *  (i.e. AT90USBxxx2 or ATMEGAxxU2) when defined.
+		 */
+		#define USB_SERIES_2_AVR
+
+		/** Indicates that the target AVR microcontroller belongs to the Series 4 AVR8 USB controller
+		 *  (i.e. ATMEGAxxU4) when defined.
+		 */
+		#define USB_SERIES_4_AVR
+
+		/** Indicates that the target AVR microcontroller belongs to the Series 6 AVR8 USB controller
+		 *  (i.e. AT90USBxxx6) when defined.
+		 */
+		#define USB_SERIES_6_AVR
+
+		/** Indicates that the target AVR microcontroller belongs to the Series 7 AVR8 USB controller
+		 *  (i.e. AT90USBxxx7) when defined.
+		 */
+		#define USB_SERIES_7_AVR
+
+		/** Indicates that the target AVR microcontroller belongs to the AVR32 UC3A0 Series USB controller
+		 *  (i.e. AT32UC3A0*) when defined.
+		 */
+		#define USB_SERIES_UC3A0_AVR
+
+		/** Indicates that the target AVR microcontroller belongs to the AVR32 UC3A1 Series USB controller
+		 *  (i.e. AT32UC3A1*) when defined.
+		 */
+		#define USB_SERIES_UC3A1_AVR
+
+		/** Indicates that the target AVR microcontroller belongs to the AVR32 UC3A3 Series USB controller
+		 *  (i.e. AT32UC3A3*) when defined.
+		 */
+		#define USB_SERIES_UC3A3_AVR
+
+		/** Indicates that the target AVR microcontroller belongs to the AVR32 UC3A4 Series USB controller
+		 *  (i.e. AT32UC3A4*) when defined.
+		 */
+		#define USB_SERIES_UC3A4_AVR
+
+		/** Indicates that the target AVR microcontroller belongs to the AVR32 UC3B0 Series USB controller
+		 *  (i.e. AT32UC3B0*) when defined.
+		 */
+		#define USB_SERIES_UC3B0_AVR
+
+		/** Indicates that the target AVR microcontroller belongs to the AVR32 UC3B1 Series USB controller
+		 *  (i.e. AT32UC3B1*) when defined.
+		 */
+		#define USB_SERIES_UC3B1_AVR
+
+		/** Indicates that the target AVR microcontroller belongs to the XMEGA A1U Series USB controller
+		 *  (i.e. ATXMEGA*A1U) when defined.
+		 */
+		#define USB_SERIES_A1U_XMEGA
+
+		/** Indicates that the target AVR microcontroller belongs to the XMEGA A3U Series USB controller
+		 *  (i.e. ATXMEGA*A3U) when defined.
+		 */
+		#define USB_SERIES_A3U_XMEGA
+
+		/** Indicates that the target AVR microcontroller belongs to the XMEGA A4U Series USB controller
+		 *  (i.e. ATXMEGA*A4U) when defined.
+		 */
+		#define USB_SERIES_A4U_XMEGA
+
+		/** Indicates that the target AVR microcontroller belongs to the XMEGA B1 Series USB controller
+		 *  (i.e. ATXMEGA*B1) when defined.
+		 */
+		#define USB_SERIES_B1_XMEGA
+
+		/** Indicates that the target AVR microcontroller belongs to the XMEGA B3 Series USB controller
+		 *  (i.e. ATXMEGA*B3) when defined.
+		 */
+		#define USB_SERIES_B3_XMEGA
+
+		/** Indicates that the target AVR microcontroller belongs to the XMEGA C3 Series USB controller
+		 *  (i.e. ATXMEGA*C3) when defined.
+		 */
+		#define USB_SERIES_C3_XMEGA
+
+		/** Indicates that the target AVR microcontroller belongs to the XMEGA C4 Series USB controller
+		 *  (i.e. ATXMEGA*C4) when defined.
+		 */
+		#define USB_SERIES_C4_XMEGA
+
+		/** Indicates that the target microcontroller and compilation settings allow for the
+		 *  target to be configured in USB Device mode when defined.
+		 */
+		#define USB_CAN_BE_DEVICE
+
+		/** Indicates that the target microcontroller and compilation settings allow for the
+		 *  target to be configured in USB Host mode when defined.
+		 */
+		#define USB_CAN_BE_HOST
+
+		/** Indicates that the target microcontroller and compilation settings allow for the
+		 *  target to be configured in either USB Device or Host mode when defined.
+		 */
+		#define USB_CAN_BE_BOTH
+	#else
+		/* Macros: */
+			#if (defined(__AVR_AT90USB162__) || defined(__AVR_AT90USB82__)  || \
+			     defined(__AVR_ATmega32U2__) || defined(__AVR_ATmega16U2__) || defined(__AVR_ATmega8U2__))
+				#define USB_SERIES_2_AVR
+				#define USB_CAN_BE_DEVICE
+			#elif (defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega16U4__))
+				#define USB_SERIES_4_AVR
+				#define USB_CAN_BE_DEVICE
+			#elif (defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__))
+				#define USB_SERIES_6_AVR
+				#define USB_CAN_BE_DEVICE
+			#elif (defined(__AVR_AT90USB647__) || defined(__AVR_AT90USB1287__))
+				#define USB_SERIES_7_AVR
+				#define USB_CAN_BE_DEVICE
+				#define USB_CAN_BE_HOST
+			#elif (defined(__AVR32_UC3A0512__) || defined(__AVR32_UC3A0256__) || \
+			       defined(__AVR32_UC3A0128__) || defined(__AVR32_UC3A064__))
+				#define USB_SERIES_UC3A0_AVR32
+				#define USB_CAN_BE_DEVICE
+				#define USB_CAN_BE_HOST
+			#elif (defined(__AVR32_UC3A1512__) || defined(__AVR32_UC3A1256__) || \
+			       defined(__AVR32_UC3A1128__) || defined(__AVR32_UC3A164__))
+				#define USB_SERIES_UC3A1_AVR32
+				#define USB_CAN_BE_DEVICE
+				#define USB_CAN_BE_HOST
+			#elif (defined(__AVR32_UC3A3256__) || defined(__AVR32_UC3A3256S__) || \
+			       defined(__AVR32_UC3A3128__) || defined(__AVR32_UC3A3128S__) || \
+			       defined(__AVR32_UC3A364__)  || defined(__AVR32_UC3A364S__))
+				#define USB_SERIES_UC3A3_AVR32
+				#define USB_CAN_BE_DEVICE
+				#define USB_CAN_BE_HOST
+			#elif (defined(__AVR32_UC3A4256__) || defined(__AVR32_UC3A4256S__) || \
+			       defined(__AVR32_UC3A4128__) || defined(__AVR32_UC3A4128S__) || \
+			       defined(__AVR32_UC3A464__)  || defined(__AVR32_UC3A464S__))
+				#define USB_SERIES_UC3A4_AVR32
+				#define USB_CAN_BE_DEVICE
+				#define USB_CAN_BE_HOST
+			#elif (defined(__AVR32_UC3B0512__) || defined(__AVR32_UC3B0256__) || \
+			       defined(__AVR32_UC3B0128__) || defined(__AVR32_UC3B064__))
+				#define USB_SERIES_UC3B0_AVR32
+				#define USB_CAN_BE_DEVICE
+				#define USB_CAN_BE_HOST
+			#elif (defined(__AVR32_UC3B1512__) || defined(__AVR32_UC3B1256__) || \
+			       defined(__AVR32_UC3B1128__) || defined(__AVR32_UC3B164__))
+				#define USB_SERIES_UC3B1_AVR32
+				#define USB_CAN_BE_DEVICE
+				#define USB_CAN_BE_HOST
+			#elif (defined(__AVR_ATxmega128A1U__) || defined(__AVR_ATxmega64A1U__))
+				#define USB_SERIES_A1U_XMEGA
+				#define USB_CAN_BE_DEVICE
+			#elif (defined(__AVR_ATxmega64A3U__) || defined(__AVR_ATxmega128A3U__) || \
+			       defined(__AVR_ATxmega192A3U__) || defined(__AVR_ATxmega256A3U__))
+				#define USB_SERIES_A3U_XMEGA
+				#define USB_CAN_BE_DEVICE
+			#elif (defined(__AVR_ATxmega256A3BU__))
+				#define USB_SERIES_A3BU_XMEGA
+				#define USB_CAN_BE_DEVICE
+			#elif (defined(__AVR_ATxmega16A4U__) || defined(__AVR_ATxmega32A4U__) || \
+			       defined(__AVR_ATxmega64A4U__) || defined(__AVR_ATxmega128A4U__))
+				#define USB_SERIES_A4U_XMEGA
+				#define USB_CAN_BE_DEVICE
+			#elif (defined(__AVR_ATxmega128B1__) || defined(__AVR_ATxmega64B1__))
+				#define USB_SERIES_B1_XMEGA
+				#define USB_CAN_BE_DEVICE
+			#elif (defined(__AVR_ATxmega128B3__) || defined(__AVR_ATxmega64B3__))
+				#define USB_SERIES_B3_XMEGA
+				#define USB_CAN_BE_DEVICE
+			#elif (defined(__AVR_ATxmega128C3__) || defined(__AVR_ATxmega64C3__) || \
+			       defined(__AVR_ATxmega192C3__) || defined(__AVR_ATxmega256C3__) || \
+				   defined(__AVR_ATxmega384C3__))
+				#define USB_SERIES_C3_XMEGA
+				#define USB_CAN_BE_DEVICE
+			#elif (defined(__AVR_ATxmega16C4__) || defined(__AVR_ATxmega32C4__))
+				#define USB_SERIES_C4_XMEGA
+				#define USB_CAN_BE_DEVICE
+			#endif
+
+			#if (defined(USB_HOST_ONLY) && defined(USB_DEVICE_ONLY))
+				#error USB_HOST_ONLY and USB_DEVICE_ONLY are mutually exclusive.
+			#elif defined(USB_HOST_ONLY)
+				#if !defined(USB_CAN_BE_HOST)
+					#error USB_HOST_ONLY is not available for the currently selected microcontroller model.
+				#else
+					#undef USB_CAN_BE_DEVICE
+				#endif
+			#elif defined(USB_DEVICE_ONLY)
+				#if !defined(USB_CAN_BE_DEVICE)
+					#error USB_DEVICE_ONLY is not available for the currently selected microcontroller model.
+				#else
+					#undef USB_CAN_BE_HOST
+				#endif
+			#endif
+
+			#if (defined(USB_CAN_BE_DEVICE) && defined(USB_CAN_BE_HOST))
+				#define USB_CAN_BE_BOTH
+			#endif
+
+			#if (!defined(USB_CAN_BE_DEVICE) && !defined(USB_CAN_BE_HOST))
+				#error The currently selected device, USB mode or architecture is not supported.
+			#endif
+	#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Core/USBTask.c b/lib/lufa/LUFA/Drivers/USB/Core/USBTask.c
new file mode 100644
index 0000000000..329ff4a272
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Core/USBTask.c
@@ -0,0 +1,89 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+#define  __INCLUDE_FROM_USBTASK_C
+#define  __INCLUDE_FROM_USB_DRIVER
+#include "USBTask.h"
+
+volatile bool        USB_IsInitialized;
+USB_Request_Header_t USB_ControlRequest;
+
+#if defined(USB_CAN_BE_HOST) && !defined(HOST_STATE_AS_GPIOR)
+volatile uint8_t     USB_HostState;
+#endif
+
+#if defined(USB_CAN_BE_DEVICE) && !defined(DEVICE_STATE_AS_GPIOR)
+volatile uint8_t     USB_DeviceState;
+#endif
+
+void USB_USBTask(void)
+{
+	#if defined(USB_CAN_BE_BOTH)
+		if (USB_CurrentMode == USB_MODE_Device)
+		  USB_DeviceTask();
+		else if (USB_CurrentMode == USB_MODE_Host)
+		  USB_HostTask();
+	#elif defined(USB_CAN_BE_HOST)
+		USB_HostTask();
+	#elif defined(USB_CAN_BE_DEVICE)
+		USB_DeviceTask();
+	#endif
+}
+
+#if defined(USB_CAN_BE_DEVICE)
+static void USB_DeviceTask(void)
+{
+	if (USB_DeviceState == DEVICE_STATE_Unattached)
+	  return;
+
+	uint8_t PrevEndpoint = Endpoint_GetCurrentEndpoint();
+
+	Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP);
+
+	if (Endpoint_IsSETUPReceived())
+	  USB_Device_ProcessControlRequest();
+
+	Endpoint_SelectEndpoint(PrevEndpoint);
+}
+#endif
+
+#if defined(USB_CAN_BE_HOST)
+static void USB_HostTask(void)
+{
+	uint8_t PrevPipe = Pipe_GetCurrentPipe();
+
+	Pipe_SelectPipe(PIPE_CONTROLPIPE);
+
+	USB_Host_ProcessNextHostState();
+
+	Pipe_SelectPipe(PrevPipe);
+}
+#endif
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Core/USBTask.h b/lib/lufa/LUFA/Drivers/USB/Core/USBTask.h
new file mode 100644
index 0000000000..77cee65815
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Core/USBTask.h
@@ -0,0 +1,200 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Main USB service task management.
+ *
+ *  This file contains the function definitions required for the main USB service task, which must be called
+ *  from the user application to ensure that the USB connection to or from a connected USB device is maintained.
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the USB driver
+ *        dispatch header located in LUFA/Drivers/USB/USB.h.
+ */
+
+#ifndef __USBTASK_H__
+#define __USBTASK_H__
+
+	/* Includes: */
+		#include "../../../Common/Common.h"
+		#include "USBMode.h"
+		#include "USBController.h"
+		#include "Events.h"
+		#include "StdRequestType.h"
+		#include "StdDescriptors.h"
+
+		#if defined(USB_CAN_BE_DEVICE)
+			#include "DeviceStandardReq.h"
+		#endif
+
+		#if defined(USB_CAN_BE_HOST)
+			#include "HostStandardReq.h"
+		#endif
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_USB_DRIVER)
+			#error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Global Variables: */
+			/** Indicates if the USB interface is currently initialized but not necessarily connected to a host
+			 *  or device (i.e. if \ref USB_Init() has been run). If this is false, all other library globals related
+			 *  to the USB driver are invalid.
+			 *
+			 *  \attention This variable should be treated as read-only in the user application, and never manually
+			 *             changed in value.
+			 *
+			 *  \ingroup Group_USBManagement
+			 */
+			extern volatile bool USB_IsInitialized;
+
+			/** Structure containing the last received Control request when in Device mode (for use in user-applications
+			 *  inside of the \ref EVENT_USB_Device_ControlRequest() event, or for filling up with a control request to
+			 *  issue when in Host mode before calling \ref USB_Host_SendControlRequest().
+			 *
+			 *  \note The contents of this structure is automatically endian-corrected for the current CPU architecture.
+			 *
+			 *  \ingroup Group_USBManagement
+			 */
+			 extern USB_Request_Header_t USB_ControlRequest;
+
+			#if defined(USB_CAN_BE_HOST) || defined(__DOXYGEN__)
+				#if !defined(HOST_STATE_AS_GPIOR) || defined(__DOXYGEN__)
+					/** Indicates the current host state machine state. When in host mode, this indicates the state
+					 *  via one of the values of the \ref USB_Host_States_t enum values.
+					 *
+					 *  This value should not be altered by the user application as it is handled automatically by the
+					 *  library.
+					 *
+					 *  To reduce program size and speed up checks of this global on the AVR8 architecture, it can be
+					 *  placed into one of the AVR's \c GPIOR hardware registers instead of RAM by defining the
+					 *  \c HOST_STATE_AS_GPIOR token to a value between 0 and 2 in the project makefile and passing it to
+					 *  the compiler via the -D switch. When defined, the corresponding GPIOR register should not be used
+					 *  in the user application except implicitly via the library APIs.
+					 *
+					 *  \note This global is only present if the user application can be a USB host.
+					 *
+					 *  \see \ref USB_Host_States_t for a list of possible device states.
+					 *
+					 *  \ingroup Group_Host
+					 */
+					extern volatile uint8_t USB_HostState;
+				#else
+					#define USB_HostState            CONCAT_EXPANDED(GPIOR, HOST_STATE_AS_GPIOR)
+				#endif
+			#endif
+
+			#if defined(USB_CAN_BE_DEVICE) || defined(__DOXYGEN__)
+				#if !defined(DEVICE_STATE_AS_GPIOR) || defined(__DOXYGEN__)
+					/** Indicates the current device state machine state. When in device mode, this indicates the state
+					 *  via one of the values of the \ref USB_Device_States_t enum values.
+					 *
+					 *  This value should not be altered by the user application as it is handled automatically by the
+					 *  library. The only exception to this rule is if the NO_LIMITED_CONTROLLER_CONNECT token is used
+					 *  (see \ref EVENT_USB_Device_Connect() and \ref EVENT_USB_Device_Disconnect() events).
+					 *
+					 *  To reduce program size and speed up checks of this global on the AVR8 architecture, it can be
+					 *  placed into one of the AVR's \c GPIOR hardware registers instead of RAM by defining the
+					 *  \c DEVICE_STATE_AS_GPIOR token to a value between 0 and 2 in the project makefile and passing it to
+					 *  the compiler via the -D switch. When defined, the corresponding GPIOR register should not be used
+					 *  in the user application except implicitly via the library APIs.
+					 *
+					 *  \attention This variable should be treated as read-only in the user application, and never manually
+					 *             changed in value except in the circumstances outlined above.
+					 *
+					 *  \note This global is only present if the user application can be a USB device.
+					 *        \n\n
+					 *
+					 *  \see \ref USB_Device_States_t for a list of possible device states.
+					 *
+					 *  \ingroup Group_Device
+					 */
+					extern volatile uint8_t USB_DeviceState;
+				#else
+					#define USB_DeviceState            CONCAT_EXPANDED(GPIOR, DEVICE_STATE_AS_GPIOR)
+				#endif
+			#endif
+
+		/* Function Prototypes: */
+			/** This is the main USB management task. The USB driver requires this task to be executed
+			 *  continuously when the USB system is active (device attached in host mode, or attached to a host
+			 *  in device mode) in order to manage USB communications. This task may be executed inside an RTOS,
+			 *  fast timer ISR or the main user application loop.
+			 *
+			 *  The USB task must be serviced within 30ms while in device mode, or within 1ms while in host mode.
+			 *  The task may be serviced at all times, or (for minimum CPU consumption):
+			 *
+			 *    - In device mode, it may be disabled at start-up, enabled on the firing of the \ref EVENT_USB_Device_Connect()
+			 *      event and disabled again on the firing of the \ref EVENT_USB_Device_Disconnect() event.
+			 *
+			 *    - In host mode, it may be disabled at start-up, enabled on the firing of the \ref EVENT_USB_Host_DeviceAttached()
+			 *      event and disabled again on the firing of the \ref EVENT_USB_Host_DeviceEnumerationComplete() or
+			 *      \ref EVENT_USB_Host_DeviceEnumerationFailed() events.
+			 *
+			 *  If in device mode (only), the control endpoint can instead be managed via interrupts entirely by the library
+			 *  by defining the INTERRUPT_CONTROL_ENDPOINT token and passing it to the compiler via the -D switch.
+			 *
+			 *  \see \ref Group_Events for more information on the USB events.
+			 *
+			 *  \ingroup Group_USBManagement
+			 */
+			void USB_USBTask(void);
+
+	/* Private Interface - For use in library only: */
+	#if !defined(__DOXYGEN__)
+		/* Function Prototypes: */
+			#if defined(__INCLUDE_FROM_USBTASK_C)
+				#if defined(USB_CAN_BE_HOST)
+					static void USB_HostTask(void);
+				#endif
+
+				#if defined(USB_CAN_BE_DEVICE)
+					static void USB_DeviceTask(void);
+				#endif
+			#endif
+
+		/* Macros: */
+			#define HOST_TASK_NONBLOCK_WAIT(Duration, NextState) do { USB_HostState   = HOST_STATE_WaitForDevice; \
+			                                                          WaitMSRemaining = (Duration);               \
+			                                                          PostWaitState   = (NextState);              } while (0)
+	#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/Device_XMEGA.c b/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/Device_XMEGA.c
new file mode 100644
index 0000000000..470e128b64
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/Device_XMEGA.c
@@ -0,0 +1,49 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+#include "../../../../Common/Common.h"
+#if (ARCH == ARCH_XMEGA)
+
+#define  __INCLUDE_FROM_USB_DRIVER
+#include "../USBMode.h"
+
+#if defined(USB_CAN_BE_DEVICE)
+
+#include "../Device.h"
+
+void USB_Device_SendRemoteWakeup(void)
+{
+	USB.CTRLB |= USB_RWAKEUP_bm;
+}
+
+#endif
+
+#endif
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/Device_XMEGA.h b/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/Device_XMEGA.h
new file mode 100644
index 0000000000..759ff350b3
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/Device_XMEGA.h
@@ -0,0 +1,266 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief USB Device definitions for the AVR XMEGA microcontrollers.
+ *  \copydetails Group_Device_XMEGA
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the USB driver
+ *        dispatch header located in LUFA/Drivers/USB/USB.h.
+ */
+
+/** \ingroup Group_Device
+ *  \defgroup Group_Device_XMEGA Device Management (XMEGA)
+ *  \brief USB Device definitions for the AVR XMEGA microcontrollers.
+ *
+ *  Architecture specific USB Device definitions for the Atmel AVR XMEGA microcontrollers.
+ *
+ *  @{
+ */
+
+#ifndef __USBDEVICE_XMEGA_H__
+#define __USBDEVICE_XMEGA_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+		#include "../USBController.h"
+		#include "../StdDescriptors.h"
+		#include "../USBInterrupt.h"
+		#include "../Endpoint.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_USB_DRIVER)
+			#error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.
+		#endif
+
+		#if (defined(USE_RAM_DESCRIPTORS) && defined(USE_EEPROM_DESCRIPTORS))
+			#error USE_RAM_DESCRIPTORS and USE_EEPROM_DESCRIPTORS are mutually exclusive.
+		#endif
+
+		#if (defined(USE_FLASH_DESCRIPTORS) && defined(USE_EEPROM_DESCRIPTORS))
+			#error USE_FLASH_DESCRIPTORS and USE_EEPROM_DESCRIPTORS are mutually exclusive.
+		#endif
+
+		#if (defined(USE_FLASH_DESCRIPTORS) && defined(USE_RAM_DESCRIPTORS))
+			#error USE_FLASH_DESCRIPTORS and USE_RAM_DESCRIPTORS are mutually exclusive.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** \name USB Device Mode Option Masks */
+			//@{
+			/** Mask for the Options parameter of the \ref USB_Init() function. This indicates that the
+			 *  USB interface should be initialized in low speed (1.5Mb/s) mode.
+			 *
+			 *  \note Low Speed mode is not available on all USB AVR models.
+			 *        \n
+			 *
+			 *  \note Restrictions apply on the number, size and type of endpoints which can be used
+			 *        when running in low speed mode - refer to the USB 2.0 specification.
+			 */
+			#define USB_DEVICE_OPT_LOWSPEED        (1 << 0)
+
+			#if (F_USB > 6000000)
+				/** Mask for the Options parameter of the \ref USB_Init() function. This indicates that the
+				 *  USB interface should be initialized in full speed (12Mb/s) mode.
+				 */
+				#define USB_DEVICE_OPT_FULLSPEED   (0 << 0)
+			#endif
+			//@}
+
+			#if (!defined(NO_INTERNAL_SERIAL) || defined(__DOXYGEN__))
+				/** String descriptor index for the device's unique serial number string descriptor within the device.
+				 *  This unique serial number is used by the host to associate resources to the device (such as drivers or COM port
+				 *  number allocations) to a device regardless of the port it is plugged in to on the host. Some microcontrollers contain
+				 *  a unique serial number internally, and setting the device descriptors serial number string index to this value
+				 *  will cause it to use the internal serial number.
+				 *
+				 *  On unsupported devices, this will evaluate to \ref NO_DESCRIPTOR and so will force the host to create a pseudo-serial
+				 *  number for the device.
+				 */
+				#define USE_INTERNAL_SERIAL            0xDC
+
+				/** Length of the device's unique internal serial number, in bits, if present on the selected microcontroller
+				 *  model.
+				 */
+				#define INTERNAL_SERIAL_LENGTH_BITS    (8 * (1 + (offsetof(NVM_PROD_SIGNATURES_t, COORDY1) - offsetof(NVM_PROD_SIGNATURES_t, LOTNUM0))))
+
+				/** Start address of the internal serial number, in the appropriate address space, if present on the selected microcontroller
+				 *  model.
+				 */
+				#define INTERNAL_SERIAL_START_ADDRESS  offsetof(NVM_PROD_SIGNATURES_t, LOTNUM0)
+			#else
+				#define USE_INTERNAL_SERIAL            NO_DESCRIPTOR
+
+				#define INTERNAL_SERIAL_LENGTH_BITS    0
+				#define INTERNAL_SERIAL_START_ADDRESS  0
+			#endif
+
+		/* Function Prototypes: */
+			/** Sends a Remote Wakeup request to the host. This signals to the host that the device should
+			 *  be taken out of suspended mode, and communications should resume.
+			 *
+			 *  Typically, this is implemented so that HID devices (mice, keyboards, etc.) can wake up the
+			 *  host computer when the host has suspended all USB devices to enter a low power state.
+			 *
+			 *  \note This function should only be used if the device has indicated to the host that it
+			 *        supports the Remote Wakeup feature in the device descriptors, and should only be
+			 *        issued if the host is currently allowing remote wakeup events from the device (i.e.,
+			 *        the \ref USB_Device_RemoteWakeupEnabled flag is set). When the \c NO_DEVICE_REMOTE_WAKEUP
+			 *        compile time option is used, this function is unavailable.
+			 *        \n\n
+			 *
+			 *  \note The USB clock must be running for this function to operate. If the stack is initialized with
+			 *        the \ref USB_OPT_MANUAL_PLL option enabled, the user must ensure that the PLL is running
+			 *        before attempting to call this function.
+			 *
+			 *  \see \ref Group_StdDescriptors for more information on the RMWAKEUP feature and device descriptors.
+			 */
+			void USB_Device_SendRemoteWakeup(void);
+
+		/* Inline Functions: */
+			/** Returns the current USB frame number, when in device mode. Every millisecond the USB bus is active (i.e. enumerated to a host)
+			 *  the frame number is incremented by one.
+			 *
+			 *  \return Current USB frame number from the USB controller.
+			 */
+			static inline uint16_t USB_Device_GetFrameNumber(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT;
+			static inline uint16_t USB_Device_GetFrameNumber(void)
+			{
+				return ((USB_EndpointTable_t*)USB.EPPTR)->FrameNum;
+			}
+
+			#if !defined(NO_SOF_EVENTS)
+			/** Enables the device mode Start Of Frame events. When enabled, this causes the
+			 *  \ref EVENT_USB_Device_StartOfFrame() event to fire once per millisecond, synchronized to the USB bus,
+			 *  at the start of each USB frame when enumerated in device mode.
+			 *
+			 *  \note This function is not available when the \c NO_SOF_EVENTS compile time token is defined.
+			 */
+			static inline void USB_Device_EnableSOFEvents(void) ATTR_ALWAYS_INLINE;
+			static inline void USB_Device_EnableSOFEvents(void)
+			{
+				USB.INTCTRLA |=  USB_SOFIE_bm;
+			}
+
+			/** Disables the device mode Start Of Frame events. When disabled, this stops the firing of the
+			 *  \ref EVENT_USB_Device_StartOfFrame() event when enumerated in device mode.
+			 *
+			 *  \note This function is not available when the \c NO_SOF_EVENTS compile time token is defined.
+			 */
+			static inline void USB_Device_DisableSOFEvents(void) ATTR_ALWAYS_INLINE;
+			static inline void USB_Device_DisableSOFEvents(void)
+			{
+				USB.INTCTRLA &= ~USB_SOFIE_bm;
+			}
+			#endif
+
+	/* Private Interface - For use in library only: */
+	#if !defined(__DOXYGEN__)
+		/* Inline Functions: */
+			static inline void USB_Device_SetLowSpeed(void) ATTR_ALWAYS_INLINE;
+			static inline void USB_Device_SetLowSpeed(void)
+			{
+				USB.CTRLA &= ~USB_SPEED_bm;
+			}
+
+			static inline void USB_Device_SetFullSpeed(void) ATTR_ALWAYS_INLINE;
+			static inline void USB_Device_SetFullSpeed(void)
+			{
+				USB.CTRLA |=  USB_SPEED_bm;
+			}
+
+			static inline void USB_Device_SetDeviceAddress(const uint8_t Address) ATTR_ALWAYS_INLINE;
+			static inline void USB_Device_SetDeviceAddress(const uint8_t Address)
+			{
+				(void)Address;
+
+				/* No implementation for XMEGA architecture */
+			}
+
+			static inline void USB_Device_EnableDeviceAddress(const uint8_t Address) ATTR_ALWAYS_INLINE;
+			static inline void USB_Device_EnableDeviceAddress(const uint8_t Address)
+			{
+				USB.ADDR = Address;
+			}
+
+			static inline bool USB_Device_IsAddressSet(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT;
+			static inline bool USB_Device_IsAddressSet(void)
+			{
+				return ((USB.ADDR != 0) ? true : false);
+			}
+
+			static inline void USB_Device_GetSerialString(uint16_t* const UnicodeString) ATTR_NON_NULL_PTR_ARG(1);
+			static inline void USB_Device_GetSerialString(uint16_t* const UnicodeString)
+			{
+				uint_reg_t CurrentGlobalInt = GetGlobalInterruptMask();
+				GlobalInterruptDisable();
+
+				uint8_t SigReadAddress = INTERNAL_SERIAL_START_ADDRESS;
+
+				for (uint8_t SerialCharNum = 0; SerialCharNum < (INTERNAL_SERIAL_LENGTH_BITS / 4); SerialCharNum++)
+				{
+					uint8_t SerialByte;
+
+					NVM.CMD    = NVM_CMD_READ_CALIB_ROW_gc;
+					SerialByte = pgm_read_byte(SigReadAddress);
+					NVM.CMD    = 0;
+
+					if (SerialCharNum & 0x01)
+					{
+						SerialByte >>= 4;
+						SigReadAddress++;
+					}
+
+					SerialByte &= 0x0F;
+
+					UnicodeString[SerialCharNum] = cpu_to_le16((SerialByte >= 10) ?
+															   (('A' - 10) + SerialByte) : ('0' + SerialByte));
+				}
+
+				SetGlobalInterruptMask(CurrentGlobalInt);
+			}
+
+	#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/EndpointStream_XMEGA.c b/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/EndpointStream_XMEGA.c
new file mode 100644
index 0000000000..6413281708
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/EndpointStream_XMEGA.c
@@ -0,0 +1,275 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+#include "../../../../Common/Common.h"
+#if (ARCH == ARCH_XMEGA)
+
+#define  __INCLUDE_FROM_USB_DRIVER
+#include "../USBMode.h"
+
+#if defined(USB_CAN_BE_DEVICE)
+
+#include "EndpointStream_XMEGA.h"
+
+#if !defined(CONTROL_ONLY_DEVICE)
+uint8_t Endpoint_Discard_Stream(uint16_t Length,
+                                uint16_t* const BytesProcessed)
+{
+	uint8_t  ErrorCode;
+	uint16_t BytesInTransfer = 0;
+
+	if ((ErrorCode = Endpoint_WaitUntilReady()))
+	  return ErrorCode;
+
+	if (BytesProcessed != NULL)
+	  Length -= *BytesProcessed;
+
+	while (Length)
+	{
+		if (!(Endpoint_IsReadWriteAllowed()))
+		{
+			Endpoint_ClearOUT();
+
+			if (BytesProcessed != NULL)
+			{
+				*BytesProcessed += BytesInTransfer;
+				return ENDPOINT_RWSTREAM_IncompleteTransfer;
+			}
+
+			if ((ErrorCode = Endpoint_WaitUntilReady()))
+			  return ErrorCode;
+		}
+		else
+		{
+			Endpoint_Discard_8();
+
+			Length--;
+			BytesInTransfer++;
+		}
+	}
+
+	return ENDPOINT_RWSTREAM_NoError;
+}
+
+uint8_t Endpoint_Null_Stream(uint16_t Length,
+                             uint16_t* const BytesProcessed)
+{
+	uint8_t  ErrorCode;
+	uint16_t BytesInTransfer = 0;
+
+	if ((ErrorCode = Endpoint_WaitUntilReady()))
+	  return ErrorCode;
+
+	if (BytesProcessed != NULL)
+	  Length -= *BytesProcessed;
+
+	while (Length)
+	{
+		if (!(Endpoint_IsReadWriteAllowed()))
+		{
+			Endpoint_ClearIN();
+
+			if (BytesProcessed != NULL)
+			{
+				*BytesProcessed += BytesInTransfer;
+				return ENDPOINT_RWSTREAM_IncompleteTransfer;
+			}
+
+			if ((ErrorCode = Endpoint_WaitUntilReady()))
+			  return ErrorCode;
+		}
+		else
+		{
+			Endpoint_Write_8(0);
+
+			Length--;
+			BytesInTransfer++;
+		}
+	}
+
+	return ENDPOINT_RWSTREAM_NoError;
+}
+
+/* The following abuses the C preprocessor in order to copy-paste common code with slight alterations,
+ * so that the code needs to be written once. It is a crude form of templating to reduce code maintenance. */
+
+#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_Stream_LE
+#define  TEMPLATE_BUFFER_TYPE                      const void*
+#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearIN()
+#define  TEMPLATE_BUFFER_OFFSET(Length)            0
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_8(*BufferPtr)
+#include "Template/Template_Endpoint_RW.c"
+
+#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_Stream_BE
+#define  TEMPLATE_BUFFER_TYPE                      const void*
+#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearIN()
+#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_8(*BufferPtr)
+#include "Template/Template_Endpoint_RW.c"
+
+#define  TEMPLATE_FUNC_NAME                        Endpoint_Read_Stream_LE
+#define  TEMPLATE_BUFFER_TYPE                      void*
+#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearOUT()
+#define  TEMPLATE_BUFFER_OFFSET(Length)            0
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         *BufferPtr = Endpoint_Read_8()
+#include "Template/Template_Endpoint_RW.c"
+
+#define  TEMPLATE_FUNC_NAME                        Endpoint_Read_Stream_BE
+#define  TEMPLATE_BUFFER_TYPE                      void*
+#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearOUT()
+#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         *BufferPtr = Endpoint_Read_8()
+#include "Template/Template_Endpoint_RW.c"
+
+#if defined(ARCH_HAS_FLASH_ADDRESS_SPACE)
+	#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_PStream_LE
+	#define  TEMPLATE_BUFFER_TYPE                      const void*
+	#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearIN()
+	#define  TEMPLATE_BUFFER_OFFSET(Length)            0
+	#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount
+	#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_8(pgm_read_byte(BufferPtr))
+	#include "Template/Template_Endpoint_RW.c"
+
+	#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_PStream_BE
+	#define  TEMPLATE_BUFFER_TYPE                      const void*
+	#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearIN()
+	#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)
+	#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount
+	#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_8(pgm_read_byte(BufferPtr))
+	#include "Template/Template_Endpoint_RW.c"
+#endif
+
+#if defined(ARCH_HAS_EEPROM_ADDRESS_SPACE)
+	#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_EStream_LE
+	#define  TEMPLATE_BUFFER_TYPE                      const void*
+	#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearIN()
+	#define  TEMPLATE_BUFFER_OFFSET(Length)            0
+	#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount
+	#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_8(eeprom_read_byte(BufferPtr))
+	#include "Template/Template_Endpoint_RW.c"
+
+	#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_EStream_BE
+	#define  TEMPLATE_BUFFER_TYPE                      const void*
+	#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearIN()
+	#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)
+	#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount
+	#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_8(eeprom_read_byte(BufferPtr))
+	#include "Template/Template_Endpoint_RW.c"
+
+	#define  TEMPLATE_FUNC_NAME                        Endpoint_Read_EStream_LE
+	#define  TEMPLATE_BUFFER_TYPE                      void*
+	#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearOUT()
+	#define  TEMPLATE_BUFFER_OFFSET(Length)            0
+	#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount
+	#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         eeprom_update_byte(BufferPtr, Endpoint_Read_8())
+	#include "Template/Template_Endpoint_RW.c"
+
+	#define  TEMPLATE_FUNC_NAME                        Endpoint_Read_EStream_BE
+	#define  TEMPLATE_BUFFER_TYPE                      void*
+	#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearOUT()
+	#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)
+	#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount
+	#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         eeprom_update_byte(BufferPtr, Endpoint_Read_8())
+	#include "Template/Template_Endpoint_RW.c"
+#endif
+
+#endif
+
+#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_Control_Stream_LE
+#define  TEMPLATE_BUFFER_OFFSET(Length)            0
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_8(*BufferPtr)
+#include "Template/Template_Endpoint_Control_W.c"
+
+#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_Control_Stream_BE
+#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_8(*BufferPtr)
+#include "Template/Template_Endpoint_Control_W.c"
+
+#define  TEMPLATE_FUNC_NAME                        Endpoint_Read_Control_Stream_LE
+#define  TEMPLATE_BUFFER_OFFSET(Length)            0
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         *BufferPtr = Endpoint_Read_8()
+#include "Template/Template_Endpoint_Control_R.c"
+
+#define  TEMPLATE_FUNC_NAME                        Endpoint_Read_Control_Stream_BE
+#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)
+#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount
+#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         *BufferPtr = Endpoint_Read_8()
+#include "Template/Template_Endpoint_Control_R.c"
+
+#if defined(ARCH_HAS_FLASH_ADDRESS_SPACE)
+	#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_Control_PStream_LE
+	#define  TEMPLATE_BUFFER_OFFSET(Length)            0
+	#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount
+	#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_8(pgm_read_byte(BufferPtr))
+	#include "Template/Template_Endpoint_Control_W.c"
+
+	#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_Control_PStream_BE
+	#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)
+	#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount
+	#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_8(pgm_read_byte(BufferPtr))
+	#include "Template/Template_Endpoint_Control_W.c"
+#endif
+
+#if defined(ARCH_HAS_EEPROM_ADDRESS_SPACE)
+	#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_Control_EStream_LE
+	#define  TEMPLATE_BUFFER_OFFSET(Length)            0
+	#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount
+	#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_8(eeprom_read_byte(BufferPtr))
+	#include "Template/Template_Endpoint_Control_W.c"
+
+	#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_Control_EStream_BE
+	#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)
+	#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount
+	#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_8(eeprom_read_byte(BufferPtr))
+	#include "Template/Template_Endpoint_Control_W.c"
+
+	#define  TEMPLATE_FUNC_NAME                        Endpoint_Read_Control_EStream_LE
+	#define  TEMPLATE_BUFFER_OFFSET(Length)            0
+	#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount
+	#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         eeprom_update_byte(BufferPtr, Endpoint_Read_8())
+	#include "Template/Template_Endpoint_Control_R.c"
+
+	#define  TEMPLATE_FUNC_NAME                        Endpoint_Read_Control_EStream_BE
+	#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)
+	#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount
+	#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         eeprom_update_byte(BufferPtr, Endpoint_Read_8())
+	#include "Template/Template_Endpoint_Control_R.c"
+#endif
+
+#endif
+
+#endif
diff --git a/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/EndpointStream_XMEGA.h b/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/EndpointStream_XMEGA.h
new file mode 100644
index 0000000000..3c094da49c
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/EndpointStream_XMEGA.h
@@ -0,0 +1,658 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Endpoint data stream transmission and reception management for the AVR XMEGA microcontrollers.
+ *  \copydetails Group_EndpointStreamRW_XMEGA
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the USB driver
+ *        dispatch header located in LUFA/Drivers/USB/USB.h.
+ */
+
+/** \ingroup Group_EndpointStreamRW
+ *  \defgroup Group_EndpointStreamRW_XMEGA Read/Write of Multi-Byte Streams (XMEGA)
+ *  \brief Endpoint data stream transmission and reception management for the Atmel AVR XMEGA architecture.
+ *
+ *  Functions, macros, variables, enums and types related to data reading and writing of data streams from
+ *  and to endpoints.
+ *
+ *  @{
+ */
+
+#ifndef __ENDPOINT_STREAM_XMEGA_H__
+#define __ENDPOINT_STREAM_XMEGA_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+		#include "../USBMode.h"
+		#include "../USBTask.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_USB_DRIVER)
+			#error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Function Prototypes: */
+			/** \name Stream functions for null data */
+			//@{
+
+			/** Reads and discards the given number of bytes from the currently selected endpoint's bank,
+			 *  discarding fully read packets from the host as needed. The last packet is not automatically
+			 *  discarded once the remaining bytes has been read; the user is responsible for manually
+			 *  discarding the last packet from the host via the \ref Endpoint_ClearOUT() macro.
+			 *
+			 *  If the BytesProcessed parameter is \c NULL, the entire stream transfer is attempted at once,
+			 *  failing or succeeding as a single unit. If the BytesProcessed parameter points to a valid
+			 *  storage location, the transfer will instead be performed as a series of chunks. Each time
+			 *  the endpoint bank becomes empty while there is still data to process (and after the current
+			 *  packet has been acknowledged) the BytesProcessed location will be updated with the total number
+			 *  of bytes processed in the stream, and the function will exit with an error code of
+			 *  \ref ENDPOINT_RWSTREAM_IncompleteTransfer. This allows for any abort checking to be performed
+			 *  in the user code - to continue the transfer, call the function again with identical parameters
+			 *  and it will resume until the BytesProcessed value reaches the total transfer length.
+			 *
+			 *  <b>Single Stream Transfer Example:</b>
+			 *  \code
+			 *  uint8_t ErrorCode;
+			 *
+			 *  if ((ErrorCode = Endpoint_Discard_Stream(512, NULL)) != ENDPOINT_RWSTREAM_NoError)
+			 *  {
+			 *       // Stream failed to complete - check ErrorCode here
+			 *  }
+			 *  \endcode
+			 *
+			 *  <b>Partial Stream Transfers Example:</b>
+			 *  \code
+			 *  uint8_t  ErrorCode;
+			 *  uint16_t BytesProcessed;
+			 *
+			 *  BytesProcessed = 0;
+			 *  while ((ErrorCode = Endpoint_Discard_Stream(512, &BytesProcessed)) == ENDPOINT_RWSTREAM_IncompleteTransfer)
+			 *  {
+			 *      // Stream not yet complete - do other actions here, abort if required
+			 *  }
+			 *
+			 *  if (ErrorCode != ENDPOINT_RWSTREAM_NoError)
+			 *  {
+			 *      // Stream failed to complete - check ErrorCode here
+			 *  }
+			 *  \endcode
+			 *
+			 *  \note This routine should not be used on CONTROL type endpoints.
+			 *
+			 *  \param[in] Length          Number of bytes to discard via the currently selected endpoint.
+			 *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes processed in the current
+			 *                             transaction should be updated, \c NULL if the entire stream should be read at once.
+			 *
+			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t Endpoint_Discard_Stream(uint16_t Length,
+			                                uint16_t* const BytesProcessed);
+
+			/** Writes a given number of zeroed bytes to the currently selected endpoint's bank, sending
+			 *  full packets to the host as needed. The last packet is not automatically sent once the
+			 *  remaining bytes have been written; the user is responsible for manually sending the last
+			 *  packet to the host via the \ref Endpoint_ClearIN() macro.
+			 *
+			 *  If the BytesProcessed parameter is \c NULL, the entire stream transfer is attempted at once,
+			 *  failing or succeeding as a single unit. If the BytesProcessed parameter points to a valid
+			 *  storage location, the transfer will instead be performed as a series of chunks. Each time
+			 *  the endpoint bank becomes full while there is still data to process (and after the current
+			 *  packet transmission has been initiated) the BytesProcessed location will be updated with the
+			 *  total number of bytes processed in the stream, and the function will exit with an error code of
+			 *  \ref ENDPOINT_RWSTREAM_IncompleteTransfer. This allows for any abort checking to be performed
+			 *  in the user code - to continue the transfer, call the function again with identical parameters
+			 *  and it will resume until the BytesProcessed value reaches the total transfer length.
+			 *
+			 *  <b>Single Stream Transfer Example:</b>
+			 *  \code
+			 *  uint8_t ErrorCode;
+			 *
+			 *  if ((ErrorCode = Endpoint_Null_Stream(512, NULL)) != ENDPOINT_RWSTREAM_NoError)
+			 *  {
+			 *       // Stream failed to complete - check ErrorCode here
+			 *  }
+			 *  \endcode
+			 *
+			 *  <b>Partial Stream Transfers Example:</b>
+			 *  \code
+			 *  uint8_t  ErrorCode;
+			 *  uint16_t BytesProcessed;
+			 *
+			 *  BytesProcessed = 0;
+			 *  while ((ErrorCode = Endpoint_Null_Stream(512, &BytesProcessed)) == ENDPOINT_RWSTREAM_IncompleteTransfer)
+			 *  {
+			 *      // Stream not yet complete - do other actions here, abort if required
+			 *  }
+			 *
+			 *  if (ErrorCode != ENDPOINT_RWSTREAM_NoError)
+			 *  {
+			 *      // Stream failed to complete - check ErrorCode here
+			 *  }
+			 *  \endcode
+			 *
+			 *  \note This routine should not be used on CONTROL type endpoints.
+			 *
+			 *  \param[in] Length          Number of zero bytes to send via the currently selected endpoint.
+			 *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes processed in the current
+			 *                             transaction should be updated, \c NULL if the entire stream should be read at once.
+			 *
+			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t Endpoint_Null_Stream(uint16_t Length,
+			                             uint16_t* const BytesProcessed);
+
+			//@}
+
+			/** \name Stream functions for RAM source/destination data */
+			//@{
+
+			/** Writes the given number of bytes to the endpoint from the given buffer in little endian,
+			 *  sending full packets to the host as needed. The last packet filled is not automatically sent;
+			 *  the user is responsible for manually sending the last written packet to the host via the
+			 *  \ref Endpoint_ClearIN() macro.
+			 *
+			 *  If the BytesProcessed parameter is \c NULL, the entire stream transfer is attempted at once,
+			 *  failing or succeeding as a single unit. If the BytesProcessed parameter points to a valid
+			 *  storage location, the transfer will instead be performed as a series of chunks. Each time
+			 *  the endpoint bank becomes full while there is still data to process (and after the current
+			 *  packet transmission has been initiated) the BytesProcessed location will be updated with the
+			 *  total number of bytes processed in the stream, and the function will exit with an error code of
+			 *  \ref ENDPOINT_RWSTREAM_IncompleteTransfer. This allows for any abort checking to be performed
+			 *  in the user code - to continue the transfer, call the function again with identical parameters
+			 *  and it will resume until the BytesProcessed value reaches the total transfer length.
+			 *
+			 *  <b>Single Stream Transfer Example:</b>
+			 *  \code
+			 *  uint8_t DataStream[512];
+			 *  uint8_t ErrorCode;
+			 *
+			 *  if ((ErrorCode = Endpoint_Write_Stream_LE(DataStream, sizeof(DataStream),
+			 *                                            NULL)) != ENDPOINT_RWSTREAM_NoError)
+			 *  {
+			 *       // Stream failed to complete - check ErrorCode here
+			 *  }
+			 *  \endcode
+			 *
+			 *  <b>Partial Stream Transfers Example:</b>
+			 *  \code
+			 *  uint8_t  DataStream[512];
+			 *  uint8_t  ErrorCode;
+			 *  uint16_t BytesProcessed;
+			 *
+			 *  BytesProcessed = 0;
+			 *  while ((ErrorCode = Endpoint_Write_Stream_LE(DataStream, sizeof(DataStream),
+			 *                                               &BytesProcessed)) == ENDPOINT_RWSTREAM_IncompleteTransfer)
+			 *  {
+			 *      // Stream not yet complete - do other actions here, abort if required
+			 *  }
+			 *
+			 *  if (ErrorCode != ENDPOINT_RWSTREAM_NoError)
+			 *  {
+			 *      // Stream failed to complete - check ErrorCode here
+			 *  }
+			 *  \endcode
+			 *
+			 *  \note This routine should not be used on CONTROL type endpoints.
+			 *
+			 *  \param[in] Buffer          Pointer to the source data buffer to read from.
+			 *  \param[in] Length          Number of bytes to read for the currently selected endpoint into the buffer.
+			 *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes processed in the current
+			 *                             transaction should be updated, \c NULL if the entire stream should be written at once.
+			 *
+			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t Endpoint_Write_Stream_LE(const void* const Buffer,
+			                                 uint16_t Length,
+			                                 uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Writes the given number of bytes to the endpoint from the given buffer in big endian,
+			 *  sending full packets to the host as needed. The last packet filled is not automatically sent;
+			 *  the user is responsible for manually sending the last written packet to the host via the
+			 *  \ref Endpoint_ClearIN() macro.
+			 *
+			 *  \note This routine should not be used on CONTROL type endpoints.
+			 *
+			 *  \param[in] Buffer          Pointer to the source data buffer to read from.
+			 *  \param[in] Length          Number of bytes to read for the currently selected endpoint into the buffer.
+			 *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes processed in the current
+			 *                             transaction should be updated, \c NULL if the entire stream should be written at once.
+			 *
+			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t Endpoint_Write_Stream_BE(const void* const Buffer,
+			                                 uint16_t Length,
+			                                 uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Reads the given number of bytes from the endpoint from the given buffer in little endian,
+			 *  discarding fully read packets from the host as needed. The last packet is not automatically
+			 *  discarded once the remaining bytes has been read; the user is responsible for manually
+			 *  discarding the last packet from the host via the \ref Endpoint_ClearOUT() macro.
+			 *
+			 *  If the BytesProcessed parameter is \c NULL, the entire stream transfer is attempted at once,
+			 *  failing or succeeding as a single unit. If the BytesProcessed parameter points to a valid
+			 *  storage location, the transfer will instead be performed as a series of chunks. Each time
+			 *  the endpoint bank becomes empty while there is still data to process (and after the current
+			 *  packet has been acknowledged) the BytesProcessed location will be updated with the total number
+			 *  of bytes processed in the stream, and the function will exit with an error code of
+			 *  \ref ENDPOINT_RWSTREAM_IncompleteTransfer. This allows for any abort checking to be performed
+			 *  in the user code - to continue the transfer, call the function again with identical parameters
+			 *  and it will resume until the BytesProcessed value reaches the total transfer length.
+			 *
+			 *  <b>Single Stream Transfer Example:</b>
+			 *  \code
+			 *  uint8_t DataStream[512];
+			 *  uint8_t ErrorCode;
+			 *
+			 *  if ((ErrorCode = Endpoint_Read_Stream_LE(DataStream, sizeof(DataStream),
+			 *                                           NULL)) != ENDPOINT_RWSTREAM_NoError)
+			 *  {
+			 *       // Stream failed to complete - check ErrorCode here
+			 *  }
+			 *  \endcode
+			 *
+			 *  <b>Partial Stream Transfers Example:</b>
+			 *  \code
+			 *  uint8_t  DataStream[512];
+			 *  uint8_t  ErrorCode;
+			 *  uint16_t BytesProcessed;
+			 *
+			 *  BytesProcessed = 0;
+			 *  while ((ErrorCode = Endpoint_Read_Stream_LE(DataStream, sizeof(DataStream),
+			 *                                              &BytesProcessed)) == ENDPOINT_RWSTREAM_IncompleteTransfer)
+			 *  {
+			 *      // Stream not yet complete - do other actions here, abort if required
+			 *  }
+			 *
+			 *  if (ErrorCode != ENDPOINT_RWSTREAM_NoError)
+			 *  {
+			 *      // Stream failed to complete - check ErrorCode here
+			 *  }
+			 *  \endcode
+			 *
+			 *  \note This routine should not be used on CONTROL type endpoints.
+			 *
+			 *  \param[out] Buffer          Pointer to the destination data buffer to write to.
+			 *  \param[in]  Length          Number of bytes to send via the currently selected endpoint.
+			 *  \param[in]  BytesProcessed  Pointer to a location where the total number of bytes processed in the current
+			 *                              transaction should be updated, \c NULL if the entire stream should be read at once.
+			 *
+			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t Endpoint_Read_Stream_LE(void* const Buffer,
+			                                uint16_t Length,
+			                                uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Reads the given number of bytes from the endpoint from the given buffer in big endian,
+			 *  discarding fully read packets from the host as needed. The last packet is not automatically
+			 *  discarded once the remaining bytes has been read; the user is responsible for manually
+			 *  discarding the last packet from the host via the \ref Endpoint_ClearOUT() macro.
+			 *
+			 *  \note This routine should not be used on CONTROL type endpoints.
+			 *
+			 *  \param[out] Buffer          Pointer to the destination data buffer to write to.
+			 *  \param[in]  Length          Number of bytes to send via the currently selected endpoint.
+			 *  \param[in]  BytesProcessed  Pointer to a location where the total number of bytes processed in the current
+			 *                              transaction should be updated, \c NULL if the entire stream should be read at once.
+			 *
+			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t Endpoint_Read_Stream_BE(void* const Buffer,
+			                                uint16_t Length,
+			                                uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Writes the given number of bytes to the CONTROL type endpoint from the given buffer in little endian,
+			 *  sending full packets to the host as needed. The host OUT acknowledgement is not automatically cleared
+			 *  in both failure and success states; the user is responsible for manually clearing the status OUT packet
+			 *  to finalize the transfer's status stage via the \ref Endpoint_ClearOUT() macro.
+			 *
+			 *  \note This function automatically sends the last packet in the data stage of the transaction; when the
+			 *        function returns, the user is responsible for clearing the <b>status</b> stage of the transaction.
+			 *        Note that the status stage packet is sent or received in the opposite direction of the data flow.
+			 *        \n\n
+			 *
+			 *  \note This routine should only be used on CONTROL type endpoints.
+			 *
+			 *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained
+			 *           together; i.e. the entire stream data must be read or written at the one time.
+			 *
+			 *  \param[in] Buffer  Pointer to the source data buffer to read from.
+			 *  \param[in] Length  Number of bytes to read for the currently selected endpoint into the buffer.
+			 *
+			 *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t Endpoint_Write_Control_Stream_LE(const void* const Buffer,
+			                                         uint16_t Length) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Writes the given number of bytes to the CONTROL type endpoint from the given buffer in big endian,
+			 *  sending full packets to the host as needed. The host OUT acknowledgement is not automatically cleared
+			 *  in both failure and success states; the user is responsible for manually clearing the status OUT packet
+			 *  to finalize the transfer's status stage via the \ref Endpoint_ClearOUT() macro.
+			 *
+			 *  \note This function automatically sends the last packet in the data stage of the transaction; when the
+			 *        function returns, the user is responsible for clearing the <b>status</b> stage of the transaction.
+			 *        Note that the status stage packet is sent or received in the opposite direction of the data flow.
+			 *        \n\n
+			 *
+			 *  \note This routine should only be used on CONTROL type endpoints.
+			 *
+			 *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained
+			 *           together; i.e. the entire stream data must be read or written at the one time.
+			 *
+			 *  \param[in] Buffer  Pointer to the source data buffer to read from.
+			 *  \param[in] Length  Number of bytes to read for the currently selected endpoint into the buffer.
+			 *
+			 *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t Endpoint_Write_Control_Stream_BE(const void* const Buffer,
+			                                         uint16_t Length) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Reads the given number of bytes from the CONTROL endpoint from the given buffer in little endian,
+			 *  discarding fully read packets from the host as needed. The device IN acknowledgement is not
+			 *  automatically sent after success or failure states; the user is responsible for manually sending the
+			 *  status IN packet to finalize the transfer's status stage via the \ref Endpoint_ClearIN() macro.
+			 *
+			 *  \note This function automatically sends the last packet in the data stage of the transaction; when the
+			 *        function returns, the user is responsible for clearing the <b>status</b> stage of the transaction.
+			 *        Note that the status stage packet is sent or received in the opposite direction of the data flow.
+			 *        \n\n
+			 *
+			 *  \note This routine should only be used on CONTROL type endpoints.
+			 *
+			 *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained
+			 *           together; i.e. the entire stream data must be read or written at the one time.
+			 *
+			 *  \param[out] Buffer  Pointer to the destination data buffer to write to.
+			 *  \param[in]  Length  Number of bytes to send via the currently selected endpoint.
+			 *
+			 *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t Endpoint_Read_Control_Stream_LE(void* const Buffer,
+			                                        uint16_t Length) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** Reads the given number of bytes from the CONTROL endpoint from the given buffer in big endian,
+			 *  discarding fully read packets from the host as needed. The device IN acknowledgement is not
+			 *  automatically sent after success or failure states; the user is responsible for manually sending the
+			 *  status IN packet to finalize the transfer's status stage via the \ref Endpoint_ClearIN() macro.
+			 *
+			 *  \note This function automatically sends the last packet in the data stage of the transaction; when the
+			 *        function returns, the user is responsible for clearing the <b>status</b> stage of the transaction.
+			 *        Note that the status stage packet is sent or received in the opposite direction of the data flow.
+			 *        \n\n
+			 *
+			 *  \note This routine should only be used on CONTROL type endpoints.
+			 *
+			 *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained
+			 *           together; i.e. the entire stream data must be read or written at the one time.
+			 *
+			 *  \param[out] Buffer  Pointer to the destination data buffer to write to.
+			 *  \param[in]  Length  Number of bytes to send via the currently selected endpoint.
+			 *
+			 *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t Endpoint_Read_Control_Stream_BE(void* const Buffer,
+			                                        uint16_t Length) ATTR_NON_NULL_PTR_ARG(1);
+			//@}
+
+			/** \name Stream functions for EEPROM source/destination data */
+			//@{
+
+			/** EEPROM buffer source version of \ref Endpoint_Write_Stream_LE().
+			 *
+			 *  \param[in] Buffer          Pointer to the source data buffer to read from.
+			 *  \param[in] Length          Number of bytes to read for the currently selected endpoint into the buffer.
+			 *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes processed in the current
+			 *                             transaction should be updated, \c NULL if the entire stream should be written at once.
+			 *
+			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t Endpoint_Write_EStream_LE(const void* const Buffer,
+			                                  uint16_t Length,
+			                                  uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** EEPROM buffer source version of \ref Endpoint_Write_Stream_BE().
+			 *
+			 *  \param[in] Buffer          Pointer to the source data buffer to read from.
+			 *  \param[in] Length          Number of bytes to read for the currently selected endpoint into the buffer.
+			 *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes processed in the current
+			 *                             transaction should be updated, \c NULL if the entire stream should be written at once.
+			 *
+			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t Endpoint_Write_EStream_BE(const void* const Buffer,
+			                                  uint16_t Length,
+			                                  uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** EEPROM buffer destination version of \ref Endpoint_Read_Stream_LE().
+			 *
+			 *  \param[out] Buffer          Pointer to the destination data buffer to write to, located in EEPROM memory space.
+			 *  \param[in]  Length          Number of bytes to send via the currently selected endpoint.
+			 *  \param[in]  BytesProcessed  Pointer to a location where the total number of bytes processed in the current
+			 *                              transaction should be updated, \c NULL if the entire stream should be read at once.
+			 *
+			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t Endpoint_Read_EStream_LE(void* const Buffer,
+			                                 uint16_t Length,
+			                                 uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** EEPROM buffer destination version of \ref Endpoint_Read_Stream_BE().
+			 *
+			 *  \param[out] Buffer          Pointer to the destination data buffer to write to, located in EEPROM memory space.
+			 *  \param[in]  Length          Number of bytes to send via the currently selected endpoint.
+			 *  \param[in]  BytesProcessed  Pointer to a location where the total number of bytes processed in the current
+			 *                              transaction should be updated, \c NULL if the entire stream should be read at once.
+			 *
+			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t Endpoint_Read_EStream_BE(void* const Buffer,
+			                                 uint16_t Length,
+			                                 uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** EEPROM buffer source version of Endpoint_Write_Control_Stream_LE.
+			 *
+			 *  \note This function automatically sends the last packet in the data stage of the transaction; when the
+			 *        function returns, the user is responsible for clearing the <b>status</b> stage of the transaction.
+			 *        Note that the status stage packet is sent or received in the opposite direction of the data flow.
+			 *        \n\n
+			 *
+			 *  \note This routine should only be used on CONTROL type endpoints.
+			 *        \n\n
+			 *
+			 *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained
+			 *           together; i.e. the entire stream data must be read or written at the one time.
+			 *
+			 *  \param[in] Buffer  Pointer to the source data buffer to read from.
+			 *  \param[in] Length  Number of bytes to read for the currently selected endpoint into the buffer.
+			 *
+			 *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t Endpoint_Write_Control_EStream_LE(const void* const Buffer,
+			                                          uint16_t Length) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** EEPROM buffer source version of \ref Endpoint_Write_Control_Stream_BE().
+			 *
+			 *  \note This function automatically sends the last packet in the data stage of the transaction; when the
+			 *        function returns, the user is responsible for clearing the <b>status</b> stage of the transaction.
+			 *        Note that the status stage packet is sent or received in the opposite direction of the data flow.
+			 *        \n\n
+			 *
+			 *  \note This routine should only be used on CONTROL type endpoints.
+			 *        \n\n
+			 *
+			 *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained
+			 *           together; i.e. the entire stream data must be read or written at the one time.
+			 *
+			 *  \param[in] Buffer  Pointer to the source data buffer to read from.
+			 *  \param[in] Length  Number of bytes to read for the currently selected endpoint into the buffer.
+			 *
+			 *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t Endpoint_Write_Control_EStream_BE(const void* const Buffer,
+			                                          uint16_t Length) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** EEPROM buffer source version of \ref Endpoint_Read_Control_Stream_LE().
+			 *
+			 *  \note This function automatically sends the last packet in the data stage of the transaction; when the
+			 *        function returns, the user is responsible for clearing the <b>status</b> stage of the transaction.
+			 *        Note that the status stage packet is sent or received in the opposite direction of the data flow.
+			 *        \n\n
+			 *
+			 *  \note This routine should only be used on CONTROL type endpoints.
+			 *        \n\n
+			 *
+			 *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained
+			 *           together; i.e. the entire stream data must be read or written at the one time.
+			 *
+			 *  \param[out] Buffer  Pointer to the destination data buffer to write to.
+			 *  \param[in]  Length  Number of bytes to send via the currently selected endpoint.
+			 *
+			 *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t Endpoint_Read_Control_EStream_LE(void* const Buffer,
+			                                         uint16_t Length) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** EEPROM buffer source version of \ref Endpoint_Read_Control_Stream_BE().
+			 *
+			 *  \note This function automatically sends the last packet in the data stage of the transaction; when the
+			 *        function returns, the user is responsible for clearing the <b>status</b> stage of the transaction.
+			 *        Note that the status stage packet is sent or received in the opposite direction of the data flow.
+			 *        \n\n
+			 *
+			 *  \note This routine should only be used on CONTROL type endpoints.
+			 *        \n\n
+			 *
+			 *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained
+			 *           together; i.e. the entire stream data must be read or written at the one time.
+			 *
+			 *  \param[out] Buffer  Pointer to the destination data buffer to write to.
+			 *  \param[in]  Length  Number of bytes to send via the currently selected endpoint.
+			 *
+			 *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t Endpoint_Read_Control_EStream_BE(void* const Buffer,
+			                                         uint16_t Length) ATTR_NON_NULL_PTR_ARG(1);
+			//@}
+
+			/** \name Stream functions for PROGMEM source/destination data */
+			//@{
+
+			/** FLASH buffer source version of \ref Endpoint_Write_Stream_LE().
+			 *
+			 *  \pre The FLASH data must be located in the first 64KB of FLASH for this function to work correctly.
+			 *
+			 *  \param[in] Buffer          Pointer to the source data buffer to read from.
+			 *  \param[in] Length          Number of bytes to read for the currently selected endpoint into the buffer.
+			 *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes processed in the current
+			 *                             transaction should be updated, \c NULL if the entire stream should be written at once.
+			 *
+			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t Endpoint_Write_PStream_LE(const void* const Buffer,
+			                                  uint16_t Length,
+			                                  uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** FLASH buffer source version of \ref Endpoint_Write_Stream_BE().
+			 *
+			 *  \pre The FLASH data must be located in the first 64KB of FLASH for this function to work correctly.
+			 *
+			 *  \param[in] Buffer          Pointer to the source data buffer to read from.
+			 *  \param[in] Length          Number of bytes to read for the currently selected endpoint into the buffer.
+			 *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes processed in the current
+			 *                             transaction should be updated, \c NULL if the entire stream should be written at once.
+			 *
+			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t Endpoint_Write_PStream_BE(const void* const Buffer,
+			                                  uint16_t Length,
+			                                  uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** FLASH buffer source version of \ref Endpoint_Write_Control_Stream_LE().
+			 *
+			 *  \pre The FLASH data must be located in the first 64KB of FLASH for this function to work correctly.
+			 *
+			 *  \note This function automatically sends the last packet in the data stage of the transaction; when the
+			 *        function returns, the user is responsible for clearing the <b>status</b> stage of the transaction.
+			 *        Note that the status stage packet is sent or received in the opposite direction of the data flow.
+			 *        \n\n
+			 *
+			 *  \note This routine should only be used on CONTROL type endpoints.
+			 *        \n\n
+			 *
+			 *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained
+			 *           together; i.e. the entire stream data must be read or written at the one time.
+			 *
+			 *  \param[in] Buffer  Pointer to the source data buffer to read from.
+			 *  \param[in] Length  Number of bytes to read for the currently selected endpoint into the buffer.
+			 *
+			 *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t Endpoint_Write_Control_PStream_LE(const void* const Buffer,
+			                                          uint16_t Length) ATTR_NON_NULL_PTR_ARG(1);
+
+			/** FLASH buffer source version of \ref Endpoint_Write_Control_Stream_BE().
+			 *
+			 *  \pre The FLASH data must be located in the first 64KB of FLASH for this function to work correctly.
+			 *
+			 *  \note This function automatically sends the last packet in the data stage of the transaction; when the
+			 *        function returns, the user is responsible for clearing the <b>status</b> stage of the transaction.
+			 *        Note that the status stage packet is sent or received in the opposite direction of the data flow.
+			 *        \n\n
+			 *
+			 *  \note This routine should only be used on CONTROL type endpoints.
+			 *        \n\n
+			 *
+			 *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained
+			 *           together; i.e. the entire stream data must be read or written at the one time.
+			 *
+			 *  \param[in] Buffer  Pointer to the source data buffer to read from.
+			 *  \param[in] Length  Number of bytes to read for the currently selected endpoint into the buffer.
+			 *
+			 *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum.
+			 */
+			uint8_t Endpoint_Write_Control_PStream_BE(const void* const Buffer,
+			                                          uint16_t Length) ATTR_NON_NULL_PTR_ARG(1);
+			//@}
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/Endpoint_XMEGA.c b/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/Endpoint_XMEGA.c
new file mode 100644
index 0000000000..470f57ea29
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/Endpoint_XMEGA.c
@@ -0,0 +1,268 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+#include "../../../../Common/Common.h"
+#if (ARCH == ARCH_XMEGA)
+
+#define  __INCLUDE_FROM_USB_DRIVER
+#include "../USBMode.h"
+
+#if defined(USB_CAN_BE_DEVICE)
+
+#include "../Endpoint.h"
+
+#if !defined(FIXED_CONTROL_ENDPOINT_SIZE)
+uint8_t USB_Device_ControlEndpointSize = ENDPOINT_CONTROLEP_DEFAULT_SIZE;
+#endif
+
+Endpoint_FIFOPair_t       USB_Endpoint_FIFOs[ENDPOINT_TOTAL_ENDPOINTS];
+
+volatile uint8_t          USB_Endpoint_SelectedEndpoint;
+volatile USB_EP_t*        USB_Endpoint_SelectedHandle;
+volatile Endpoint_FIFO_t* USB_Endpoint_SelectedFIFO;
+
+bool Endpoint_IsINReady(void)
+{
+	Endpoint_SelectEndpoint(USB_Endpoint_SelectedEndpoint | ENDPOINT_DIR_IN);
+
+	return ((USB_Endpoint_SelectedHandle->STATUS & USB_EP_BUSNACK0_bm) ? true : false);
+}
+
+bool Endpoint_IsOUTReceived(void)
+{
+	Endpoint_SelectEndpoint(USB_Endpoint_SelectedEndpoint & ~ENDPOINT_DIR_IN);
+
+	if (USB_Endpoint_SelectedHandle->STATUS & USB_EP_TRNCOMPL0_bm)
+	{
+		USB_Endpoint_SelectedFIFO->Length = USB_Endpoint_SelectedHandle->CNT;
+		return true;
+	}
+
+	return false;
+}
+
+bool Endpoint_IsSETUPReceived(void)
+{
+	Endpoint_SelectEndpoint(USB_Endpoint_SelectedEndpoint & ~ENDPOINT_DIR_IN);
+
+	if (USB_Endpoint_SelectedHandle->STATUS & USB_EP_SETUP_bm)
+	{
+		USB_Endpoint_SelectedFIFO->Length = USB_Endpoint_SelectedHandle->CNT;
+		return true;
+	}
+
+	return false;
+}
+
+void Endpoint_ClearSETUP(void)
+{
+	Endpoint_SelectEndpoint(USB_Endpoint_SelectedEndpoint & ~ENDPOINT_DIR_IN);
+	USB_Endpoint_SelectedHandle->STATUS &= ~(USB_EP_SETUP_bm | USB_EP_TRNCOMPL0_bm | USB_EP_BUSNACK0_bm | USB_EP_OVF_bm);
+	USB_Endpoint_SelectedHandle->STATUS |= USB_EP_TOGGLE_bm;
+	USB_Endpoint_SelectedFIFO->Position  = 0;
+
+	Endpoint_SelectEndpoint(USB_Endpoint_SelectedEndpoint | ENDPOINT_DIR_IN);
+	USB_Endpoint_SelectedHandle->STATUS |= USB_EP_TOGGLE_bm;
+	USB_Endpoint_SelectedFIFO->Position  = 0;
+}
+
+void Endpoint_ClearIN(void)
+{
+	USB_Endpoint_SelectedHandle->CNT     = USB_Endpoint_SelectedFIFO->Position;
+	USB_Endpoint_SelectedHandle->STATUS &= ~(USB_EP_TRNCOMPL0_bm | USB_EP_BUSNACK0_bm | USB_EP_OVF_bm);
+	USB_Endpoint_SelectedFIFO->Position  = 0;
+}
+
+void Endpoint_ClearOUT(void)
+{
+	USB_Endpoint_SelectedHandle->STATUS &= ~(USB_EP_TRNCOMPL0_bm | USB_EP_BUSNACK0_bm | USB_EP_OVF_bm);
+	USB_Endpoint_SelectedFIFO->Position  = 0;
+}
+
+void Endpoint_StallTransaction(void)
+{
+	USB_Endpoint_SelectedHandle->CTRL |= USB_EP_STALL_bm;
+
+	if ((USB_Endpoint_SelectedHandle->CTRL & USB_EP_TYPE_gm) == USB_EP_TYPE_CONTROL_gc)
+	{
+		Endpoint_SelectEndpoint(USB_Endpoint_SelectedEndpoint ^ ENDPOINT_DIR_IN);
+		USB_Endpoint_SelectedHandle->CTRL |= USB_EP_STALL_bm;
+	}
+}
+
+uint8_t Endpoint_Read_8(void)
+{
+	return USB_Endpoint_SelectedFIFO->Data[USB_Endpoint_SelectedFIFO->Position++];
+}
+
+void Endpoint_Write_8(const uint8_t Data)
+{
+	USB_Endpoint_SelectedFIFO->Data[USB_Endpoint_SelectedFIFO->Position++] = Data;
+}
+
+void Endpoint_SelectEndpoint(const uint8_t Address)
+{
+	uint8_t EndpointNumber = (Address & ENDPOINT_EPNUM_MASK);
+
+	USB_Endpoint_SelectedEndpoint = Address;
+
+	Endpoint_FIFOPair_t* EndpointFIFOPair = &USB_Endpoint_FIFOs[EndpointNumber];
+	USB_EndpointTable_t* EndpointTable    = (USB_EndpointTable_t*)USB.EPPTR;
+
+	if (Address & ENDPOINT_DIR_IN)
+	{
+		USB_Endpoint_SelectedFIFO   = &EndpointFIFOPair->IN;
+		USB_Endpoint_SelectedHandle = &EndpointTable->Endpoints[EndpointNumber].IN;
+	}
+	else
+	{
+		USB_Endpoint_SelectedFIFO   = &EndpointFIFOPair->OUT;
+		USB_Endpoint_SelectedHandle = &EndpointTable->Endpoints[EndpointNumber].OUT;
+	}
+}
+
+bool Endpoint_ConfigureEndpointTable(const USB_Endpoint_Table_t* const Table,
+                                     const uint8_t Entries)
+{
+	for (uint8_t i = 0; i < Entries; i++)
+	{
+		if (!(Table[i].Address))
+		  continue;
+
+		if (!(Endpoint_ConfigureEndpoint(Table[i].Address, Table[i].Type, Table[i].Size, Table[i].Banks)))
+		{
+			return false;
+		}
+	}
+
+	return true;
+}
+
+bool Endpoint_ConfigureEndpoint_PRV(const uint8_t Address,
+                                    const uint8_t Config,
+                                    const uint8_t Size)
+{
+	Endpoint_SelectEndpoint(Address);
+
+	USB_Endpoint_SelectedHandle->CTRL    = 0;
+	USB_Endpoint_SelectedHandle->STATUS  = (Address & ENDPOINT_DIR_IN) ? USB_EP_BUSNACK0_bm : 0;
+	USB_Endpoint_SelectedHandle->CTRL    = Config;
+	USB_Endpoint_SelectedHandle->CNT     = 0;
+	USB_Endpoint_SelectedHandle->DATAPTR = (intptr_t)USB_Endpoint_SelectedFIFO->Data;
+
+	USB_Endpoint_SelectedFIFO->Length    = (Address & ENDPOINT_DIR_IN) ? Size : 0;
+	USB_Endpoint_SelectedFIFO->Position  = 0;
+
+	return true;
+}
+
+void Endpoint_ClearEndpoints(void)
+{
+	for (uint8_t EPNum = 0; EPNum < ENDPOINT_TOTAL_ENDPOINTS; EPNum++)
+	{
+		((USB_EndpointTable_t*)USB.EPPTR)->Endpoints[EPNum].IN.CTRL  = 0;
+		((USB_EndpointTable_t*)USB.EPPTR)->Endpoints[EPNum].OUT.CTRL = 0;
+	}
+}
+
+void Endpoint_ClearStatusStage(void)
+{
+	if (USB_ControlRequest.bmRequestType & REQDIR_DEVICETOHOST)
+	{
+		while (!(Endpoint_IsOUTReceived()))
+		{
+			if (USB_DeviceState == DEVICE_STATE_Unattached)
+			  return;
+		}
+
+		Endpoint_ClearOUT();
+	}
+	else
+	{
+		while (!(Endpoint_IsINReady()))
+		{
+			if (USB_DeviceState == DEVICE_STATE_Unattached)
+			  return;
+		}
+
+		Endpoint_ClearIN();
+	}
+}
+
+#if !defined(CONTROL_ONLY_DEVICE)
+uint8_t Endpoint_WaitUntilReady(void)
+{
+	#if (USB_STREAM_TIMEOUT_MS < 0xFF)
+	uint8_t  TimeoutMSRem = USB_STREAM_TIMEOUT_MS;
+	#else
+	uint16_t TimeoutMSRem = USB_STREAM_TIMEOUT_MS;
+	#endif
+
+	uint16_t PreviousFrameNumber = USB_Device_GetFrameNumber();
+
+	for (;;)
+	{
+		if (Endpoint_GetEndpointDirection() == ENDPOINT_DIR_IN)
+		{
+			if (Endpoint_IsINReady())
+			  return ENDPOINT_READYWAIT_NoError;
+		}
+		else
+		{
+			if (Endpoint_IsOUTReceived())
+			  return ENDPOINT_READYWAIT_NoError;
+		}
+
+		uint8_t USB_DeviceState_LCL = USB_DeviceState;
+
+		if (USB_DeviceState_LCL == DEVICE_STATE_Unattached)
+		  return ENDPOINT_READYWAIT_DeviceDisconnected;
+		else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended)
+		  return ENDPOINT_READYWAIT_BusSuspended;
+		else if (Endpoint_IsStalled())
+		  return ENDPOINT_READYWAIT_EndpointStalled;
+
+		uint16_t CurrentFrameNumber = USB_Device_GetFrameNumber();
+
+		if (CurrentFrameNumber != PreviousFrameNumber)
+		{
+			PreviousFrameNumber = CurrentFrameNumber;
+
+			if (!(TimeoutMSRem--))
+			  return ENDPOINT_READYWAIT_Timeout;
+		}
+	}
+}
+#endif
+
+#endif
+
+#endif
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/Endpoint_XMEGA.h b/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/Endpoint_XMEGA.h
new file mode 100644
index 0000000000..db7d840d2e
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/Endpoint_XMEGA.h
@@ -0,0 +1,689 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief USB Endpoint definitions for the AVR XMEGA microcontrollers.
+ *  \copydetails Group_EndpointManagement_XMEGA
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the USB driver
+ *        dispatch header located in LUFA/Drivers/USB/USB.h.
+ */
+
+/** \ingroup Group_EndpointRW
+ *  \defgroup Group_EndpointRW_XMEGA Endpoint Data Reading and Writing (XMEGA)
+ *  \brief Endpoint data read/write definitions for the Atmel AVR XMEGA architecture.
+ *
+ *  Functions, macros, variables, enums and types related to data reading and writing from and to endpoints.
+ */
+
+/** \ingroup Group_EndpointPrimitiveRW
+ *  \defgroup Group_EndpointPrimitiveRW_XMEGA Read/Write of Primitive Data Types (XMEGA)
+ *  \brief Endpoint primitive read/write definitions for the Atmel AVR XMEGA architecture.
+ *
+ *  Functions, macros, variables, enums and types related to data reading and writing of primitive data types
+ *  from and to endpoints.
+ */
+
+/** \ingroup Group_EndpointPacketManagement
+ *  \defgroup Group_EndpointPacketManagement_XMEGA Endpoint Packet Management (XMEGA)
+ *  \brief Endpoint packet management definitions for the Atmel AVR XMEGA architecture.
+ *
+ *  Functions, macros, variables, enums and types related to packet management of endpoints.
+ */
+
+/** \ingroup Group_EndpointManagement
+ *  \defgroup Group_EndpointManagement_XMEGA Endpoint Management (XMEGA)
+ *  \brief Endpoint management definitions for the Atmel AVR XMEGA architecture.
+ *
+ *  Functions, macros and enums related to endpoint management when in USB Device mode. This
+ *  module contains the endpoint management macros, as well as endpoint interrupt and data
+ *  send/receive functions for various data types.
+ *
+ *  @{
+ */
+
+#ifndef __ENDPOINT_XMEGA_H__
+#define __ENDPOINT_XMEGA_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+		#include "../USBTask.h"
+		#include "../USBInterrupt.h"
+		#include "../USBController.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_USB_DRIVER)
+			#error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			#if (!defined(MAX_ENDPOINT_INDEX) && !defined(CONTROL_ONLY_DEVICE)) || defined(__DOXYGEN__)
+				/** Total number of endpoints (including the default control endpoint at address 0) which may
+				 *  be used in the device. Different USB AVR models support different amounts of endpoints,
+				 *  this value reflects the maximum number of endpoints for the currently selected AVR model.
+				 */
+				#define ENDPOINT_TOTAL_ENDPOINTS            16
+			#else
+				#if defined(CONTROL_ONLY_DEVICE)
+					#define ENDPOINT_TOTAL_ENDPOINTS        1
+				#else
+					#define ENDPOINT_TOTAL_ENDPOINTS        (MAX_ENDPOINT_INDEX + 1)
+				#endif
+			#endif
+
+	/* Private Interface - For use in library only: */
+	#if !defined(__DOXYGEN__)
+		/* Type Defines: */
+			typedef struct
+			{
+				uint8_t Data[64];
+
+				uint8_t Length;
+				uint8_t Position;
+			} Endpoint_FIFO_t;
+
+			typedef struct
+			{
+				Endpoint_FIFO_t OUT;
+				Endpoint_FIFO_t IN;
+			} Endpoint_FIFOPair_t;
+
+		/* External Variables: */
+			extern Endpoint_FIFOPair_t       USB_Endpoint_FIFOs[ENDPOINT_TOTAL_ENDPOINTS];
+			extern volatile uint8_t          USB_Endpoint_SelectedEndpoint;
+			extern volatile USB_EP_t*        USB_Endpoint_SelectedHandle;
+			extern volatile Endpoint_FIFO_t* USB_Endpoint_SelectedFIFO;
+
+		/* Inline Functions: */
+			static inline uint8_t Endpoint_BytesToEPSizeMask(const uint16_t Bytes) ATTR_WARN_UNUSED_RESULT ATTR_CONST
+			                                                                       ATTR_ALWAYS_INLINE;
+			static inline uint8_t Endpoint_BytesToEPSizeMask(const uint16_t Bytes)
+			{
+				uint8_t  MaskVal    = 0;
+				uint16_t CheckBytes = 8;
+
+				while (CheckBytes < Bytes)
+				{
+					MaskVal++;
+					CheckBytes <<= 1;
+				}
+
+				return (MaskVal << USB_EP_BUFSIZE_gp);
+			}
+
+		/* Function Prototypes: */
+			bool Endpoint_ConfigureEndpoint_PRV(const uint8_t Address,
+			                                    const uint8_t Config,
+			                                    const uint8_t Size);
+			void Endpoint_ClearEndpoints(void);
+	#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			#if (!defined(FIXED_CONTROL_ENDPOINT_SIZE) || defined(__DOXYGEN__))
+				/** Default size of the default control endpoint's bank, until altered by the control endpoint bank size
+				 *  value in the device descriptor. Not available if the \c FIXED_CONTROL_ENDPOINT_SIZE token is defined.
+				 */
+				#define ENDPOINT_CONTROLEP_DEFAULT_SIZE     8
+			#endif
+
+		/* Enums: */
+			/** Enum for the possible error return codes of the \ref Endpoint_WaitUntilReady() function.
+			 *
+			 *  \ingroup Group_EndpointRW_XMEGA
+			 */
+			enum Endpoint_WaitUntilReady_ErrorCodes_t
+			{
+				ENDPOINT_READYWAIT_NoError                 = 0, /**< Endpoint is ready for next packet, no error. */
+				ENDPOINT_READYWAIT_EndpointStalled         = 1, /**< The endpoint was stalled during the stream
+				                                                 *   transfer by the host or device.
+				                                                 */
+				ENDPOINT_READYWAIT_DeviceDisconnected      = 2,	/**< Device was disconnected from the host while
+				                                                 *   waiting for the endpoint to become ready.
+				                                                 */
+				ENDPOINT_READYWAIT_BusSuspended            = 3, /**< The USB bus has been suspended by the host and
+				                                                 *   no USB endpoint traffic can occur until the bus
+				                                                 *   has resumed.
+				                                                 */
+				ENDPOINT_READYWAIT_Timeout                 = 4, /**< The host failed to accept or send the next packet
+				                                                 *   within the software timeout period set by the
+				                                                 *   \ref USB_STREAM_TIMEOUT_MS macro.
+				                                                 */
+			};
+
+		/* Inline Functions: */
+			/** Selects the given endpoint address.
+			 *
+			 *  Any endpoint operations which do not require the endpoint address to be indicated will operate on
+			 *  the currently selected endpoint.
+			 *
+			 *  \param[in] Address  Endpoint address to select.
+			 */
+			void Endpoint_SelectEndpoint(const uint8_t Address);
+
+			/** Configures the specified endpoint address with the given endpoint type, bank size and number of hardware
+			 *  banks. Once configured, the endpoint may be read from or written to, depending on its direction.
+			 *
+			 *  \param[in] Address    Endpoint address to configure.
+			 *
+			 *  \param[in] Type       Type of endpoint to configure, a \c EP_TYPE_* mask. Not all endpoint types
+			 *                        are available on Low Speed USB devices - refer to the USB 2.0 specification.
+			 *
+			 *  \param[in] Size       Size of the endpoint's bank, where packets are stored before they are transmitted
+			 *                        to the USB host, or after they have been received from the USB host (depending on
+			 *                        the endpoint's data direction). The bank size must indicate the maximum packet size
+			 *                        that the endpoint can handle.
+			 *
+			 *  \param[in] Banks      Number of hardware banks to use for the endpoint being configured.
+			 *
+			 *  \note The default control endpoint should not be manually configured by the user application, as
+			 *        it is automatically configured by the library internally.
+			 *        \n\n
+			 *
+			 *  \note This routine will automatically select the specified endpoint.
+			 *
+			 *  \return Boolean \c true if the configuration succeeded, \c false otherwise.
+			 */
+			static inline bool Endpoint_ConfigureEndpoint(const uint8_t Address,
+			                                              const uint8_t Type,
+			                                              const uint16_t Size,
+			                                              const uint8_t Banks) ATTR_ALWAYS_INLINE;
+			static inline bool Endpoint_ConfigureEndpoint(const uint8_t Address,
+			                                              const uint8_t Type,
+			                                              const uint16_t Size,
+			                                              const uint8_t Banks)
+			{
+				uint8_t EPConfigMask = (USB_EP_INTDSBL_bm | ((Banks > 1) ? USB_EP_PINGPONG_bm : 0) | Endpoint_BytesToEPSizeMask(Size));
+
+				if ((Address & ENDPOINT_EPNUM_MASK) >= ENDPOINT_TOTAL_ENDPOINTS)
+				  return false;
+
+				// TODO - Fix once limitations are lifted
+				EPConfigMask &= ~USB_EP_PINGPONG_bm;
+				if (Size > 64)
+				  return false;
+
+				switch (Type)
+				{
+					case EP_TYPE_CONTROL:
+						EPConfigMask |= USB_EP_TYPE_CONTROL_gc;
+						break;
+					case EP_TYPE_ISOCHRONOUS:
+						EPConfigMask |= USB_EP_TYPE_ISOCHRONOUS_gc;
+						break;
+					default:
+						EPConfigMask |= USB_EP_TYPE_BULK_gc;
+						break;
+				}
+
+				if (Type == EP_TYPE_CONTROL)
+				  Endpoint_ConfigureEndpoint_PRV(Address ^ ENDPOINT_DIR_IN, EPConfigMask, Size);
+
+				return Endpoint_ConfigureEndpoint_PRV(Address, EPConfigMask, Size);
+			}
+
+			/** Indicates the number of bytes currently stored in the current endpoint's selected bank.
+			 *
+			 *  \ingroup Group_EndpointRW_XMEGA
+			 *
+			 *  \return Total number of bytes in the currently selected Endpoint's FIFO buffer.
+			 */
+			static inline uint16_t Endpoint_BytesInEndpoint(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline uint16_t Endpoint_BytesInEndpoint(void)
+			{
+				if (USB_Endpoint_SelectedEndpoint & ENDPOINT_DIR_IN)
+				  return USB_Endpoint_SelectedFIFO->Position;
+				else
+				  return (USB_Endpoint_SelectedFIFO->Length - USB_Endpoint_SelectedFIFO->Position);
+			}
+
+			/** Get the endpoint address of the currently selected endpoint. This is typically used to save
+			 *  the currently selected endpoint so that it can be restored after another endpoint has been
+			 *  manipulated.
+			 *
+			 *  \return Index of the currently selected endpoint.
+			 */
+			static inline uint8_t Endpoint_GetCurrentEndpoint(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline uint8_t Endpoint_GetCurrentEndpoint(void)
+			{
+				return USB_Endpoint_SelectedEndpoint;
+			}
+
+			/** Resets the endpoint bank FIFO. This clears all the endpoint banks and resets the USB controller's
+			 *  data In and Out pointers to the bank's contents.
+			 *
+			 *  \param[in] Address  Endpoint address whose FIFO buffers are to be reset.
+			 */
+			static inline void Endpoint_ResetEndpoint(const uint8_t Address) ATTR_ALWAYS_INLINE;
+			static inline void Endpoint_ResetEndpoint(const uint8_t Address)
+			{
+				if (Address & ENDPOINT_DIR_IN)
+				  USB_Endpoint_FIFOs[Address & ENDPOINT_EPNUM_MASK].IN.Position  = 0;
+				else
+				  USB_Endpoint_FIFOs[Address & ENDPOINT_EPNUM_MASK].OUT.Position = 0;
+			}
+
+			/** Determines if the currently selected endpoint is enabled, but not necessarily configured.
+			 *
+			 * \return Boolean \c true if the currently selected endpoint is enabled, \c false otherwise.
+			 */
+			static inline bool Endpoint_IsEnabled(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline bool Endpoint_IsEnabled(void)
+			{
+				return true;
+			}
+
+			/** Aborts all pending IN transactions on the currently selected endpoint, once the bank
+			 *  has been queued for transmission to the host via \ref Endpoint_ClearIN(). This function
+			 *  will terminate all queued transactions, resetting the endpoint banks ready for a new
+			 *  packet.
+			 *
+			 *  \ingroup Group_EndpointPacketManagement_XMEGA
+			 */
+			static inline void Endpoint_AbortPendingIN(void)
+			{
+				USB_Endpoint_SelectedHandle->STATUS |= USB_EP_BUSNACK0_bm;
+			}
+
+			/** Determines if the currently selected endpoint may be read from (if data is waiting in the endpoint
+			 *  bank and the endpoint is an OUT direction, or if the bank is not yet full if the endpoint is an IN
+			 *  direction). This function will return false if an error has occurred in the endpoint, if the endpoint
+			 *  is an OUT direction and no packet (or an empty packet) has been received, or if the endpoint is an IN
+			 *  direction and the endpoint bank is full.
+			 *
+			 *  \ingroup Group_EndpointPacketManagement_XMEGA
+			 *
+			 *  \return Boolean \c true if the currently selected endpoint may be read from or written to, depending
+			 *          on its direction.
+			 */
+			static inline bool Endpoint_IsReadWriteAllowed(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline bool Endpoint_IsReadWriteAllowed(void)
+			{
+				return (USB_Endpoint_SelectedFIFO->Position < USB_Endpoint_SelectedFIFO->Length);
+			}
+
+			/** Determines if the currently selected endpoint is configured.
+			 *
+			 *  \return Boolean \c true if the currently selected endpoint has been configured, \c false otherwise.
+			 */
+			static inline bool Endpoint_IsConfigured(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline bool Endpoint_IsConfigured(void)
+			{
+				return ((USB_Endpoint_SelectedHandle->CTRL & USB_EP_TYPE_gm) ? true : false);
+			}
+
+			/** Determines if the selected IN endpoint is ready for a new packet to be sent to the host.
+			 *
+			 *  \ingroup Group_EndpointPacketManagement_XMEGA
+			 *
+			 *  \return Boolean \c true if the current endpoint is ready for an IN packet, \c false otherwise.
+			 */
+			bool Endpoint_IsINReady(void) ATTR_WARN_UNUSED_RESULT;
+
+			/** Determines if the selected OUT endpoint has received new packet from the host.
+			 *
+			 *  \ingroup Group_EndpointPacketManagement_XMEGA
+			 *
+			 *  \return Boolean \c true if current endpoint is has received an OUT packet, \c false otherwise.
+			 */
+			bool Endpoint_IsOUTReceived(void) ATTR_WARN_UNUSED_RESULT;
+
+			/** Determines if the current CONTROL type endpoint has received a SETUP packet.
+			 *
+			 *  \ingroup Group_EndpointPacketManagement_XMEGA
+			 *
+			 *  \return Boolean \c true if the selected endpoint has received a SETUP packet, \c false otherwise.
+			 */
+			bool Endpoint_IsSETUPReceived(void) ATTR_WARN_UNUSED_RESULT;
+
+			/** Clears a received SETUP packet on the currently selected CONTROL type endpoint, freeing up the
+			 *  endpoint for the next packet.
+			 *
+			 *  \ingroup Group_EndpointPacketManagement_XMEGA
+			 *
+			 *  \note This is not applicable for non CONTROL type endpoints.
+			 */
+			void Endpoint_ClearSETUP(void);
+
+			/** Sends an IN packet to the host on the currently selected endpoint, freeing up the endpoint for the
+			 *  next packet and switching to the alternative endpoint bank if double banked.
+			 *
+			 *  \ingroup Group_EndpointPacketManagement_XMEGA
+			 */
+			void Endpoint_ClearIN(void);
+
+			/** Acknowledges an OUT packet to the host on the currently selected endpoint, freeing up the endpoint
+			 *  for the next packet and switching to the alternative endpoint bank if double banked.
+			 *
+			 *  \ingroup Group_EndpointPacketManagement_XMEGA
+			 */
+			void Endpoint_ClearOUT(void);
+
+			/** Stalls the current endpoint, indicating to the host that a logical problem occurred with the
+			 *  indicated endpoint and that the current transfer sequence should be aborted. This provides a
+			 *  way for devices to indicate invalid commands to the host so that the current transfer can be
+			 *  aborted and the host can begin its own recovery sequence.
+			 *
+			 *  The currently selected endpoint remains stalled until either the \ref Endpoint_ClearStall() macro
+			 *  is called, or the host issues a CLEAR FEATURE request to the device for the currently selected
+			 *  endpoint.
+			 *
+			 *  \ingroup Group_EndpointPacketManagement_XMEGA
+			 */
+			void Endpoint_StallTransaction(void);
+
+			/** Clears the STALL condition on the currently selected endpoint.
+			 *
+			 *  \ingroup Group_EndpointPacketManagement_XMEGA
+			 */
+			static inline void Endpoint_ClearStall(void) ATTR_ALWAYS_INLINE;
+			static inline void Endpoint_ClearStall(void)
+			{
+				USB_Endpoint_SelectedHandle->CTRL &= ~USB_EP_STALL_bm;
+			}
+
+			/** Determines if the currently selected endpoint is stalled, \c false otherwise.
+			 *
+			 *  \ingroup Group_EndpointPacketManagement_XMEGA
+			 *
+			 *  \return Boolean \c true if the currently selected endpoint is stalled, \c false otherwise.
+			 */
+			static inline bool Endpoint_IsStalled(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline bool Endpoint_IsStalled(void)
+			{
+				return ((USB_Endpoint_SelectedHandle->CTRL & USB_EP_STALL_bm) ? true : false);
+			}
+
+			/** Resets the data toggle of the currently selected endpoint. */
+			static inline void Endpoint_ResetDataToggle(void) ATTR_ALWAYS_INLINE;
+			static inline void Endpoint_ResetDataToggle(void)
+			{
+				USB_Endpoint_SelectedHandle->STATUS &= ~USB_EP_TOGGLE_bm;
+			}
+
+			/** Determines the currently selected endpoint's direction.
+			 *
+			 *  \return The currently selected endpoint's direction, as a \c ENDPOINT_DIR_* mask.
+			 */
+			static inline uint8_t Endpoint_GetEndpointDirection(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline uint8_t Endpoint_GetEndpointDirection(void)
+			{
+				return (USB_Endpoint_SelectedEndpoint & ENDPOINT_DIR_IN);
+			}
+
+			/** Reads one byte from the currently selected endpoint's bank, for OUT direction endpoints.
+			 *
+			 *  \ingroup Group_EndpointPrimitiveRW_XMEGA
+			 *
+			 *  \return Next byte in the currently selected endpoint's FIFO buffer.
+			 */
+			uint8_t Endpoint_Read_8(void) ATTR_WARN_UNUSED_RESULT;
+
+			/** Writes one byte to the currently selected endpoint's bank, for IN direction endpoints.
+			 *
+			 *  \ingroup Group_EndpointPrimitiveRW_XMEGA
+			 *
+			 *  \param[in] Data  Data to write into the the currently selected endpoint's FIFO buffer.
+			 */
+			void Endpoint_Write_8(const uint8_t Data);
+
+			/** Discards one byte from the currently selected endpoint's bank, for OUT direction endpoints.
+			 *
+			 *  \ingroup Group_EndpointPrimitiveRW_XMEGA
+			 */
+			static inline void Endpoint_Discard_8(void) ATTR_ALWAYS_INLINE;
+			static inline void Endpoint_Discard_8(void)
+			{
+				USB_Endpoint_SelectedFIFO->Position++;
+			}
+
+			/** Reads two bytes from the currently selected endpoint's bank in little endian format, for OUT
+			 *  direction endpoints.
+			 *
+			 *  \ingroup Group_EndpointPrimitiveRW_XMEGA
+			 *
+			 *  \return Next two bytes in the currently selected endpoint's FIFO buffer.
+			 */
+			static inline uint16_t Endpoint_Read_16_LE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline uint16_t Endpoint_Read_16_LE(void)
+			{
+				uint16_t Byte0 = Endpoint_Read_8();
+				uint16_t Byte1 = Endpoint_Read_8();
+
+				return ((Byte1 << 8) | Byte0);
+			}
+
+			/** Reads two bytes from the currently selected endpoint's bank in big endian format, for OUT
+			 *  direction endpoints.
+			 *
+			 *  \ingroup Group_EndpointPrimitiveRW_XMEGA
+			 *
+			 *  \return Next two bytes in the currently selected endpoint's FIFO buffer.
+			 */
+			static inline uint16_t Endpoint_Read_16_BE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline uint16_t Endpoint_Read_16_BE(void)
+			{
+				uint16_t Byte0 = Endpoint_Read_8();
+				uint16_t Byte1 = Endpoint_Read_8();
+
+				return ((Byte0 << 8) | Byte1);
+			}
+
+			/** Writes two bytes to the currently selected endpoint's bank in little endian format, for IN
+			 *  direction endpoints.
+			 *
+			 *  \ingroup Group_EndpointPrimitiveRW_XMEGA
+			 *
+			 *  \param[in] Data  Data to write to the currently selected endpoint's FIFO buffer.
+			 */
+			static inline void Endpoint_Write_16_LE(const uint16_t Data) ATTR_ALWAYS_INLINE;
+			static inline void Endpoint_Write_16_LE(const uint16_t Data)
+			{
+				Endpoint_Write_8(Data & 0xFF);
+				Endpoint_Write_8(Data >> 8);
+			}
+
+			/** Writes two bytes to the currently selected endpoint's bank in big endian format, for IN
+			 *  direction endpoints.
+			 *
+			 *  \ingroup Group_EndpointPrimitiveRW_XMEGA
+			 *
+			 *  \param[in] Data  Data to write to the currently selected endpoint's FIFO buffer.
+			 */
+			static inline void Endpoint_Write_16_BE(const uint16_t Data) ATTR_ALWAYS_INLINE;
+			static inline void Endpoint_Write_16_BE(const uint16_t Data)
+			{
+				Endpoint_Write_8(Data >> 8);
+				Endpoint_Write_8(Data & 0xFF);
+			}
+
+			/** Discards two bytes from the currently selected endpoint's bank, for OUT direction endpoints.
+			 *
+			 *  \ingroup Group_EndpointPrimitiveRW_XMEGA
+			 */
+			static inline void Endpoint_Discard_16(void) ATTR_ALWAYS_INLINE;
+			static inline void Endpoint_Discard_16(void)
+			{
+				Endpoint_Discard_8();
+				Endpoint_Discard_8();
+			}
+
+			/** Reads four bytes from the currently selected endpoint's bank in little endian format, for OUT
+			 *  direction endpoints.
+			 *
+			 *  \ingroup Group_EndpointPrimitiveRW_XMEGA
+			 *
+			 *  \return Next four bytes in the currently selected endpoint's FIFO buffer.
+			 */
+			static inline uint32_t Endpoint_Read_32_LE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline uint32_t Endpoint_Read_32_LE(void)
+			{
+				uint32_t Byte0 = Endpoint_Read_8();
+				uint32_t Byte1 = Endpoint_Read_8();
+				uint32_t Byte2 = Endpoint_Read_8();
+				uint32_t Byte3 = Endpoint_Read_8();
+
+				return ((Byte3 << 24) | (Byte2 << 16) | (Byte1 << 8) | Byte0);
+			}
+
+			/** Reads four bytes from the currently selected endpoint's bank in big endian format, for OUT
+			 *  direction endpoints.
+			 *
+			 *  \ingroup Group_EndpointPrimitiveRW_XMEGA
+			 *
+			 *  \return Next four bytes in the currently selected endpoint's FIFO buffer.
+			 */
+			static inline uint32_t Endpoint_Read_32_BE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+			static inline uint32_t Endpoint_Read_32_BE(void)
+			{
+				uint32_t Byte0 = Endpoint_Read_8();
+				uint32_t Byte1 = Endpoint_Read_8();
+				uint32_t Byte2 = Endpoint_Read_8();
+				uint32_t Byte3 = Endpoint_Read_8();
+
+				return ((Byte0 << 24) | (Byte1 << 16) | (Byte2 << 8) | Byte3);
+			}
+
+			/** Writes four bytes to the currently selected endpoint's bank in little endian format, for IN
+			 *  direction endpoints.
+			 *
+			 *  \ingroup Group_EndpointPrimitiveRW_XMEGA
+			 *
+			 *  \param[in] Data  Data to write to the currently selected endpoint's FIFO buffer.
+			 */
+			static inline void Endpoint_Write_32_LE(const uint32_t Data) ATTR_ALWAYS_INLINE;
+			static inline void Endpoint_Write_32_LE(const uint32_t Data)
+			{
+				Endpoint_Write_8(Data & 0xFF);
+				Endpoint_Write_8(Data >> 8);
+				Endpoint_Write_8(Data >> 16);
+				Endpoint_Write_8(Data >> 24);
+			}
+
+			/** Writes four bytes to the currently selected endpoint's bank in big endian format, for IN
+			 *  direction endpoints.
+			 *
+			 *  \ingroup Group_EndpointPrimitiveRW_XMEGA
+			 *
+			 *  \param[in] Data  Data to write to the currently selected endpoint's FIFO buffer.
+			 */
+			static inline void Endpoint_Write_32_BE(const uint32_t Data) ATTR_ALWAYS_INLINE;
+			static inline void Endpoint_Write_32_BE(const uint32_t Data)
+			{
+				Endpoint_Write_8(Data >> 24);
+				Endpoint_Write_8(Data >> 16);
+				Endpoint_Write_8(Data >> 8);
+				Endpoint_Write_8(Data & 0xFF);
+			}
+
+			/** Discards four bytes from the currently selected endpoint's bank, for OUT direction endpoints.
+			 *
+			 *  \ingroup Group_EndpointPrimitiveRW_XMEGA
+			 */
+			static inline void Endpoint_Discard_32(void) ATTR_ALWAYS_INLINE;
+			static inline void Endpoint_Discard_32(void)
+			{
+				Endpoint_Discard_8();
+				Endpoint_Discard_8();
+				Endpoint_Discard_8();
+				Endpoint_Discard_8();
+			}
+
+		/* External Variables: */
+			/** Global indicating the maximum packet size of the default control endpoint located at address
+			 *  0 in the device. This value is set to the value indicated in the device descriptor in the user
+			 *  project once the USB interface is initialized into device mode.
+			 *
+			 *  If space is an issue, it is possible to fix this to a static value by defining the control
+			 *  endpoint size in the \c FIXED_CONTROL_ENDPOINT_SIZE token passed to the compiler in the makefile
+			 *  via the -D switch. When a fixed control endpoint size is used, the size is no longer dynamically
+			 *  read from the descriptors at runtime and instead fixed to the given value. When used, it is
+			 *  important that the descriptor control endpoint size value matches the size given as the
+			 *  \c FIXED_CONTROL_ENDPOINT_SIZE token - it is recommended that the \c FIXED_CONTROL_ENDPOINT_SIZE token
+			 *  be used in the device descriptors to ensure this.
+			 *
+			 *  \attention This variable should be treated as read-only in the user application, and never manually
+			 *             changed in value.
+			 */
+			#if (!defined(FIXED_CONTROL_ENDPOINT_SIZE) || defined(__DOXYGEN__))
+				extern uint8_t USB_Device_ControlEndpointSize;
+			#else
+				#define USB_Device_ControlEndpointSize FIXED_CONTROL_ENDPOINT_SIZE
+			#endif
+
+		/* Function Prototypes: */
+			/** Configures a table of endpoint descriptions, in sequence. This function can be used to configure multiple
+			 *  endpoints at the same time.
+			 *
+			 *  \note Endpoints with a zero address will be ignored, thus this function cannot be used to configure the
+			 *        control endpoint.
+			 *
+			 *  \param[in] Table    Pointer to a table of endpoint descriptions.
+			 *  \param[in] Entries  Number of entries in the endpoint table to configure.
+			 *
+			 *  \return Boolean \c true if all endpoints configured successfully, \c false otherwise.
+			 */
+			bool Endpoint_ConfigureEndpointTable(const USB_Endpoint_Table_t* const Table,
+			                                     const uint8_t Entries);
+
+			/** Completes the status stage of a control transfer on a CONTROL type endpoint automatically,
+			 *  with respect to the data direction. This is a convenience function which can be used to
+			 *  simplify user control request handling.
+			 *
+			 *  \note This routine should not be called on non CONTROL type endpoints.
+			 */
+			void Endpoint_ClearStatusStage(void);
+
+			/** Spin-loops until the currently selected non-control endpoint is ready for the next packet of data
+			 *  to be read or written to it.
+			 *
+			 *  \note This routine should not be called on CONTROL type endpoints.
+			 *
+			 *  \ingroup Group_EndpointRW_XMEGA
+			 *
+			 *  \return A value from the \ref Endpoint_WaitUntilReady_ErrorCodes_t enum.
+			 */
+			uint8_t Endpoint_WaitUntilReady(void);
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/Host_XMEGA.c b/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/Host_XMEGA.c
new file mode 100644
index 0000000000..b8b8c462cc
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/Host_XMEGA.c
@@ -0,0 +1,41 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+#include "../../../../Common/Common.h"
+#if (ARCH == ARCH_XMEGA)
+
+#define  __INCLUDE_FROM_USB_DRIVER
+#include "../USBMode.h"
+
+#if defined(USB_CAN_BE_HOST)
+
+#endif
+
+#endif
diff --git a/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/PipeStream_XMEGA.c b/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/PipeStream_XMEGA.c
new file mode 100644
index 0000000000..b8b8c462cc
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/PipeStream_XMEGA.c
@@ -0,0 +1,41 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+#include "../../../../Common/Common.h"
+#if (ARCH == ARCH_XMEGA)
+
+#define  __INCLUDE_FROM_USB_DRIVER
+#include "../USBMode.h"
+
+#if defined(USB_CAN_BE_HOST)
+
+#endif
+
+#endif
diff --git a/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/Pipe_XMEGA.c b/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/Pipe_XMEGA.c
new file mode 100644
index 0000000000..bb92b1d763
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/Pipe_XMEGA.c
@@ -0,0 +1,37 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+#define  __INCLUDE_FROM_USB_DRIVER
+#include "../USBMode.h"
+
+#if defined(USB_CAN_BE_HOST)
+
+#endif
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/Template/Template_Endpoint_Control_R.c b/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/Template/Template_Endpoint_Control_R.c
new file mode 100644
index 0000000000..c923f31017
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/Template/Template_Endpoint_Control_R.c
@@ -0,0 +1,86 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+#if defined(TEMPLATE_FUNC_NAME)
+
+uint8_t TEMPLATE_FUNC_NAME (void* const Buffer,
+                            uint16_t Length)
+{
+	uint8_t* DataStream = ((uint8_t*)Buffer + TEMPLATE_BUFFER_OFFSET(Length));
+
+	Endpoint_SelectEndpoint(USB_Endpoint_SelectedEndpoint & ~ENDPOINT_DIR_IN);
+
+	if (!(Length))
+	  Endpoint_ClearOUT();
+
+	while (Length)
+	{
+		uint8_t USB_DeviceState_LCL = USB_DeviceState;
+
+		if (USB_DeviceState_LCL == DEVICE_STATE_Unattached)
+		  return ENDPOINT_RWCSTREAM_DeviceDisconnected;
+		else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended)
+		  return ENDPOINT_RWCSTREAM_BusSuspended;
+		else if (Endpoint_IsSETUPReceived())
+		  return ENDPOINT_RWCSTREAM_HostAborted;
+
+		if (Endpoint_IsOUTReceived())
+		{
+			while (Length && Endpoint_BytesInEndpoint())
+			{
+				TEMPLATE_TRANSFER_BYTE(DataStream);
+				TEMPLATE_BUFFER_MOVE(DataStream, 1);
+				Length--;
+			}
+
+			Endpoint_ClearOUT();
+		}
+	}
+
+	while (!(Endpoint_IsINReady()))
+	{
+		uint8_t USB_DeviceState_LCL = USB_DeviceState;
+
+		if (USB_DeviceState_LCL == DEVICE_STATE_Unattached)
+		  return ENDPOINT_RWCSTREAM_DeviceDisconnected;
+		else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended)
+		  return ENDPOINT_RWCSTREAM_BusSuspended;
+	}
+
+	return ENDPOINT_RWCSTREAM_NoError;
+}
+
+#undef TEMPLATE_BUFFER_OFFSET
+#undef TEMPLATE_BUFFER_MOVE
+#undef TEMPLATE_FUNC_NAME
+#undef TEMPLATE_TRANSFER_BYTE
+
+#endif
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/Template/Template_Endpoint_Control_W.c b/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/Template/Template_Endpoint_Control_W.c
new file mode 100644
index 0000000000..b32de813df
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/Template/Template_Endpoint_Control_W.c
@@ -0,0 +1,97 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+#if defined(TEMPLATE_FUNC_NAME)
+
+uint8_t TEMPLATE_FUNC_NAME (const void* const Buffer,
+                            uint16_t Length)
+{
+	uint8_t* DataStream     = ((uint8_t*)Buffer + TEMPLATE_BUFFER_OFFSET(Length));
+	bool     LastPacketFull = false;
+
+	Endpoint_SelectEndpoint(USB_Endpoint_SelectedEndpoint | ENDPOINT_DIR_IN);
+
+	if (Length > USB_ControlRequest.wLength)
+	  Length = USB_ControlRequest.wLength;
+	else if (!(Length))
+	  Endpoint_ClearIN();
+
+	while (Length || LastPacketFull)
+	{
+		uint8_t USB_DeviceState_LCL = USB_DeviceState;
+
+		if (USB_DeviceState_LCL == DEVICE_STATE_Unattached)
+		  return ENDPOINT_RWCSTREAM_DeviceDisconnected;
+		else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended)
+		  return ENDPOINT_RWCSTREAM_BusSuspended;
+		else if (Endpoint_IsSETUPReceived())
+		  return ENDPOINT_RWCSTREAM_HostAborted;
+		else if (Endpoint_IsOUTReceived())
+		  break;
+
+		if (Endpoint_IsINReady())
+		{
+			uint16_t BytesInEndpoint = Endpoint_BytesInEndpoint();
+
+			while (Length && (BytesInEndpoint < USB_Device_ControlEndpointSize))
+			{
+				TEMPLATE_TRANSFER_BYTE(DataStream);
+				TEMPLATE_BUFFER_MOVE(DataStream, 1);
+				Length--;
+				BytesInEndpoint++;
+			}
+
+			LastPacketFull = (BytesInEndpoint == USB_Device_ControlEndpointSize);
+			Endpoint_ClearIN();
+		}
+	}
+
+	while (!(Endpoint_IsOUTReceived()))
+	{
+		uint8_t USB_DeviceState_LCL = USB_DeviceState;
+
+		if (USB_DeviceState_LCL == DEVICE_STATE_Unattached)
+		  return ENDPOINT_RWCSTREAM_DeviceDisconnected;
+		else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended)
+		  return ENDPOINT_RWCSTREAM_BusSuspended;
+		else if (Endpoint_IsSETUPReceived())
+		  return ENDPOINT_RWCSTREAM_HostAborted;
+	}
+
+	return ENDPOINT_RWCSTREAM_NoError;
+}
+
+#undef TEMPLATE_BUFFER_OFFSET
+#undef TEMPLATE_BUFFER_MOVE
+#undef TEMPLATE_FUNC_NAME
+#undef TEMPLATE_TRANSFER_BYTE
+
+#endif
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/Template/Template_Endpoint_RW.c b/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/Template/Template_Endpoint_RW.c
new file mode 100644
index 0000000000..e55e592eb2
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/Template/Template_Endpoint_RW.c
@@ -0,0 +1,89 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+#if defined(TEMPLATE_FUNC_NAME)
+
+uint8_t TEMPLATE_FUNC_NAME (TEMPLATE_BUFFER_TYPE const Buffer,
+                            uint16_t Length,
+                            uint16_t* const BytesProcessed)
+{
+	uint8_t* DataStream      = ((uint8_t*)Buffer + TEMPLATE_BUFFER_OFFSET(Length));
+	uint16_t BytesInTransfer = 0;
+	uint8_t  ErrorCode;
+
+	if ((ErrorCode = Endpoint_WaitUntilReady()))
+	  return ErrorCode;
+
+	if (BytesProcessed != NULL)
+	{
+		Length -= *BytesProcessed;
+		TEMPLATE_BUFFER_MOVE(DataStream, *BytesProcessed);
+	}
+
+	while (Length)
+	{
+		if (!(Endpoint_IsReadWriteAllowed()))
+		{
+			TEMPLATE_CLEAR_ENDPOINT();
+
+			#if !defined(INTERRUPT_CONTROL_ENDPOINT)
+			USB_USBTask();
+			#endif
+
+			if (BytesProcessed != NULL)
+			{
+				*BytesProcessed += BytesInTransfer;
+				return ENDPOINT_RWSTREAM_IncompleteTransfer;
+			}
+
+			if ((ErrorCode = Endpoint_WaitUntilReady()))
+			  return ErrorCode;
+		}
+		else
+		{
+			TEMPLATE_TRANSFER_BYTE(DataStream);
+			TEMPLATE_BUFFER_MOVE(DataStream, 1);
+			Length--;
+			BytesInTransfer++;
+		}
+	}
+
+	return ENDPOINT_RWSTREAM_NoError;
+}
+
+#undef TEMPLATE_FUNC_NAME
+#undef TEMPLATE_BUFFER_TYPE
+#undef TEMPLATE_TRANSFER_BYTE
+#undef TEMPLATE_CLEAR_ENDPOINT
+#undef TEMPLATE_BUFFER_OFFSET
+#undef TEMPLATE_BUFFER_MOVE
+
+#endif
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/USBController_XMEGA.c b/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/USBController_XMEGA.c
new file mode 100644
index 0000000000..4eea57a0bf
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/USBController_XMEGA.c
@@ -0,0 +1,204 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+#include "../../../../Common/Common.h"
+#if (ARCH == ARCH_XMEGA)
+
+#define  __INCLUDE_FROM_USB_DRIVER
+#define  __INCLUDE_FROM_USB_CONTROLLER_C
+#include "../USBController.h"
+
+#if defined(USB_CAN_BE_BOTH)
+volatile uint8_t USB_CurrentMode = USB_MODE_None;
+#endif
+
+#if !defined(USE_STATIC_OPTIONS)
+volatile uint8_t USB_Options;
+#endif
+
+/* Ugly workaround to ensure an aligned table, since __BIGGEST_ALIGNMENT__ == 1 for the 8-bit AVR-GCC toolchain */
+uint8_t USB_EndpointTable[sizeof(USB_EndpointTable_t) + 1];
+
+void USB_Init(
+               #if defined(USB_CAN_BE_BOTH)
+               const uint8_t Mode
+               #endif
+
+               #if (defined(USB_CAN_BE_BOTH) && !defined(USE_STATIC_OPTIONS))
+               ,
+               #elif (!defined(USB_CAN_BE_BOTH) && defined(USE_STATIC_OPTIONS))
+               void
+               #endif
+
+               #if !defined(USE_STATIC_OPTIONS)
+               const uint8_t Options
+               #endif
+               )
+{
+	#if !defined(USE_STATIC_OPTIONS)
+	USB_Options = Options;
+	#endif
+
+	uint_reg_t CurrentGlobalInt = GetGlobalInterruptMask();
+	GlobalInterruptDisable();
+
+	NVM.CMD  = NVM_CMD_READ_CALIB_ROW_gc;
+	USB.CAL0 = pgm_read_byte(offsetof(NVM_PROD_SIGNATURES_t, USBCAL0));
+	USB.CAL1 = pgm_read_byte(offsetof(NVM_PROD_SIGNATURES_t, USBCAL1));
+	NVM.CMD  = NVM_CMD_NO_OPERATION_gc;
+
+	/* Ugly workaround to ensure an aligned table, since __BIGGEST_ALIGNMENT__ == 1 for the 8-bit AVR-GCC toolchain */
+	USB.EPPTR = ((intptr_t)&USB_EndpointTable[1] & ~(1 << 0));
+	USB.CTRLA = (USB_STFRNUM_bm | ((ENDPOINT_TOTAL_ENDPOINTS - 1) << USB_MAXEP_gp));
+
+	if ((USB_Options & USB_OPT_BUSEVENT_PRIHIGH) == USB_OPT_BUSEVENT_PRIHIGH)
+	  USB.INTCTRLA = (3 << USB_INTLVL_gp);
+	else if ((USB_Options & USB_OPT_BUSEVENT_PRIMED) == USB_OPT_BUSEVENT_PRIMED)
+	  USB.INTCTRLA = (2 << USB_INTLVL_gp);
+	else
+	  USB.INTCTRLA = (1 << USB_INTLVL_gp);
+
+	SetGlobalInterruptMask(CurrentGlobalInt);
+
+	#if defined(USB_CAN_BE_BOTH)
+	USB_CurrentMode = Mode;
+	#endif
+
+	USB_IsInitialized = true;
+
+	USB_ResetInterface();
+}
+
+void USB_Disable(void)
+{
+	USB_INT_DisableAllInterrupts();
+	USB_INT_ClearAllInterrupts();
+
+	USB_Detach();
+	USB_Controller_Disable();
+
+	USB_IsInitialized = false;
+}
+
+void USB_ResetInterface(void)
+{
+	uint8_t PrescalerNeeded;
+
+	#if defined(USB_DEVICE_OPT_FULLSPEED)
+	if (USB_Options & USB_DEVICE_OPT_LOWSPEED)
+	  PrescalerNeeded = F_USB / 6000000;
+	else
+	  PrescalerNeeded = F_USB / 48000000;
+	#else
+	PrescalerNeeded = F_USB / 6000000;
+	#endif
+
+	uint8_t DividerIndex = 0;
+	while (PrescalerNeeded > 0)
+	{
+		DividerIndex++;
+		PrescalerNeeded >>= 1;
+	}
+
+	CLK.USBCTRL = (DividerIndex - 1) << CLK_USBPSDIV_gp;
+
+	if (USB_Options & USB_OPT_PLLCLKSRC)
+	  CLK.USBCTRL |= (CLK_USBSRC_PLL_gc   | CLK_USBSEN_bm);
+	else
+	  CLK.USBCTRL |= (CLK_USBSRC_RC32M_gc | CLK_USBSEN_bm);
+
+	USB_Device_SetDeviceAddress(0);
+
+	USB_INT_DisableAllInterrupts();
+	USB_INT_ClearAllInterrupts();
+
+	USB_Controller_Reset();
+	USB_Init_Device();
+}
+
+#if defined(USB_CAN_BE_DEVICE)
+static void USB_Init_Device(void)
+{
+	USB_DeviceState                 = DEVICE_STATE_Unattached;
+	USB_Device_ConfigurationNumber  = 0;
+
+	#if !defined(NO_DEVICE_REMOTE_WAKEUP)
+	USB_Device_RemoteWakeupEnabled  = false;
+	#endif
+
+	#if !defined(NO_DEVICE_SELF_POWER)
+	USB_Device_CurrentlySelfPowered = false;
+	#endif
+
+	#if !defined(FIXED_CONTROL_ENDPOINT_SIZE)
+	USB_Descriptor_Device_t* DeviceDescriptorPtr;
+
+	#if defined(ARCH_HAS_MULTI_ADDRESS_SPACE) && \
+	    !(defined(USE_FLASH_DESCRIPTORS) || defined(USE_EEPROM_DESCRIPTORS) || defined(USE_RAM_DESCRIPTORS))
+	uint8_t DescriptorAddressSpace;
+
+	if (CALLBACK_USB_GetDescriptor((DTYPE_Device << 8), 0, (void*)&DeviceDescriptorPtr, &DescriptorAddressSpace) != NO_DESCRIPTOR)
+	{
+		if (DescriptorAddressSpace == MEMSPACE_FLASH)
+		  USB_Device_ControlEndpointSize = pgm_read_byte(&DeviceDescriptorPtr->Endpoint0Size);
+		else if (DescriptorAddressSpace == MEMSPACE_EEPROM)
+		  USB_Device_ControlEndpointSize = eeprom_read_byte(&DeviceDescriptorPtr->Endpoint0Size);
+		else
+		  USB_Device_ControlEndpointSize = DeviceDescriptorPtr->Endpoint0Size;
+	}
+	#else
+	if (CALLBACK_USB_GetDescriptor((DTYPE_Device << 8), 0, (void*)&DeviceDescriptorPtr) != NO_DESCRIPTOR)
+	{
+		#if defined(USE_RAM_DESCRIPTORS)
+		USB_Device_ControlEndpointSize = DeviceDescriptorPtr->Endpoint0Size;
+		#elif defined(USE_EEPROM_DESCRIPTORS)
+		USB_Device_ControlEndpointSize = eeprom_read_byte(&DeviceDescriptorPtr->Endpoint0Size);
+		#else
+		USB_Device_ControlEndpointSize = pgm_read_byte(&DeviceDescriptorPtr->Endpoint0Size);
+		#endif
+	}
+	#endif
+	#endif
+
+	if (USB_Options & USB_DEVICE_OPT_LOWSPEED)
+	  USB_Device_SetLowSpeed();
+	else
+	  USB_Device_SetFullSpeed();
+
+	Endpoint_ConfigureEndpoint(ENDPOINT_CONTROLEP, EP_TYPE_CONTROL,
+							   USB_Device_ControlEndpointSize, 1);
+
+	USB_INT_Enable(USB_INT_BUSEVENTI);
+
+	USB_Attach();
+}
+#endif
+
+#endif
diff --git a/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/USBController_XMEGA.h b/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/USBController_XMEGA.h
new file mode 100644
index 0000000000..6bab03a7d3
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/USBController_XMEGA.h
@@ -0,0 +1,313 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief USB Controller definitions for the AVR XMEGA microcontrollers.
+ *  \copydetails Group_USBManagement_XMEGA
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the USB driver
+ *        dispatch header located in LUFA/Drivers/USB/USB.h.
+ */
+
+/** \ingroup Group_USBManagement
+ *  \defgroup Group_USBManagement_XMEGA USB Interface Management (XMEGA)
+ *  \brief USB Controller definitions for the AVR XMEGA microcontrollers.
+ *
+ *  Functions, macros, variables, enums and types related to the setup and management of the USB interface.
+ *
+ *  @{
+ */
+
+#ifndef __USBCONTROLLER_XMEGA_H__
+#define __USBCONTROLLER_XMEGA_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+		#include "../USBMode.h"
+		#include "../Events.h"
+		#include "../USBTask.h"
+		#include "../USBInterrupt.h"
+
+	/* Private Interface - For use in library only: */
+	#if !defined(__DOXYGEN__)
+		/* Macros: */
+			#if defined(MAX_ENDPOINT_INDEX)
+				#define ENDPOINT_TABLE_COUNT  (MAX_ENDPOINT_INDEX + 1)
+			#else
+				#define ENDPOINT_TABLE_COUNT  16
+			#endif
+
+		/* Type Defines: */
+			typedef struct
+			{
+				struct
+				{
+					USB_EP_t OUT;
+					USB_EP_t IN;
+				} Endpoints[ENDPOINT_TABLE_COUNT];
+				uint16_t FrameNum;
+			} ATTR_PACKED USB_EndpointTable_t;
+
+		/* External Variables: */
+			extern uint8_t USB_EndpointTable[];
+	#endif
+
+	/* Includes: */
+		#if defined(USB_CAN_BE_DEVICE) || defined(__DOXYGEN__)
+			#include "../Device.h"
+			#include "../Endpoint.h"
+			#include "../DeviceStandardReq.h"
+			#include "../EndpointStream.h"
+		#endif
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks and Defines: */
+		#if !defined(__INCLUDE_FROM_USB_DRIVER)
+			#error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.
+		#endif
+
+		#if !defined(F_USB)
+			#error F_USB is not defined. You must define F_USB to the frequency of the unprescaled USB controller clock in your project makefile.
+		#endif
+
+		#if ((F_USB % 6000000) || (F_USB < 6000000))
+			#error Invalid F_USB specified. F_USB must be a multiple of 6MHz for USB Low Speed operation, and a multiple of 48MHz for Full Speed operation.
+		#endif
+
+	/* Public Interface - May be used in end-application: */
+		/* Macros: */
+			/** \name USB Controller Option Masks */
+			//@{
+			/** Sets the USB bus interrupt priority level to be low priority. The USB bus interrupt is used for Start of Frame events, bus suspend
+			 *  and resume events, bus reset events and other events related to the management of the USB bus.
+			 */
+			#define USB_OPT_BUSEVENT_PRILOW           ((0 << 2) | (0 << 1))
+
+			/** Sets the USB bus interrupt priority level to be medium priority. The USB bus interrupt is used for Start of Frame events, bus suspend
+			 *  and resume events, bus reset events and other events related to the management of the USB bus.
+			 */
+			#define USB_OPT_BUSEVENT_PRIMED           ((0 << 2) | (1 << 1))
+
+			/** Sets the USB bus interrupt priority level to be high priority. The USB bus interrupt is used for Start of Frame events, bus suspend
+			 *  and resume events, bus reset events and other events related to the management of the USB bus.
+			 */
+			#define USB_OPT_BUSEVENT_PRIHIGH          ((1 << 2) | (0 << 1))
+
+			/** Sets the USB controller to source its clock from the internal RC 32MHz clock, once it has been DFLL calibrated to 48MHz. */
+			#define USB_OPT_RC32MCLKSRC               (0 << 3)
+
+			/** Sets the USB controller to source its clock from the internal PLL. */
+			#define USB_OPT_PLLCLKSRC                 (1 << 3)
+			//@}
+
+			#if !defined(USB_STREAM_TIMEOUT_MS) || defined(__DOXYGEN__)
+				/** Constant for the maximum software timeout period of the USB data stream transfer functions
+				 *  (both control and standard) when in either device or host mode. If the next packet of a stream
+				 *  is not received or acknowledged within this time period, the stream function will fail.
+				 *
+				 *  This value may be overridden in the user project makefile as the value of the
+				 *  \ref USB_STREAM_TIMEOUT_MS token, and passed to the compiler using the -D switch.
+				 */
+				#define USB_STREAM_TIMEOUT_MS       100
+			#endif
+
+		/* Inline Functions: */
+			/** Detaches the device from the USB bus. This has the effect of removing the device from any
+			 *  attached host, ceasing USB communications. If no host is present, this prevents any host from
+			 *  enumerating the device once attached until \ref USB_Attach() is called.
+			 */
+			static inline void USB_Detach(void) ATTR_ALWAYS_INLINE;
+			static inline void USB_Detach(void)
+			{
+				USB.CTRLB &= ~USB_ATTACH_bm;
+			}
+
+			/** Attaches the device to the USB bus. This announces the device's presence to any attached
+			 *  USB host, starting the enumeration process. If no host is present, attaching the device
+			 *  will allow for enumeration once a host is connected to the device.
+			 *
+			 *  This is inexplicably also required for proper operation while in host mode, to enable the
+			 *  attachment of a device to the host. This is despite the bit being located in the device-mode
+			 *  register and despite the datasheet making no mention of its requirement in host mode.
+			 */
+			static inline void USB_Attach(void) ATTR_ALWAYS_INLINE;
+			static inline void USB_Attach(void)
+			{
+				USB.CTRLB |= USB_ATTACH_bm;
+			}
+
+		/* Function Prototypes: */
+			/** Main function to initialize and start the USB interface. Once active, the USB interface will
+			 *  allow for device connection to a host when in device mode, or for device enumeration while in
+			 *  host mode.
+			 *
+			 *  As the USB library relies on interrupts for the device and host mode enumeration processes,
+			 *  the user must enable global interrupts before or shortly after this function is called. In
+			 *  device mode, interrupts must be enabled within 500ms of this function being called to ensure
+			 *  that the host does not time out whilst enumerating the device. In host mode, interrupts may be
+			 *  enabled at the application's leisure however enumeration will not begin of an attached device
+			 *  until after this has occurred.
+			 *
+			 *  Calling this function when the USB interface is already initialized will cause a complete USB
+			 *  interface reset and re-enumeration.
+			 *
+			 *  \param[in] Mode     Mask indicating what mode the USB interface is to be initialized to, a value
+			 *                      from the \ref USB_Modes_t enum.
+			 *                      \note This parameter does not exist on devices with only one supported USB
+			 *                            mode (device or host).
+			 *
+			 *  \param[in] Options  Mask indicating the options which should be used when initializing the USB
+			 *                      interface to control the USB interface's behavior. This should be comprised of
+			 *                      a \c USB_OPT_REG_* mask to control the regulator, a \c USB_OPT_*_PLL mask to control the
+			 *                      PLL, and a \c USB_DEVICE_OPT_* mask (when the device mode is enabled) to set the device
+			 *                      mode speed.
+			 *
+			 *  \note To reduce the FLASH requirements of the library if only device or host mode is required,
+			 *        the mode can be statically set in the project makefile by defining the token \c USB_DEVICE_ONLY
+			 *        (for device mode) or \c USB_HOST_ONLY (for host mode), passing the token to the compiler
+			 *        via the -D switch. If the mode is statically set, this parameter does not exist in the
+			 *        function prototype.
+			 *        \n\n
+			 *
+			 *  \note To reduce the FLASH requirements of the library if only fixed settings are required,
+			 *        the options may be set statically in the same manner as the mode (see the Mode parameter of
+			 *        this function). To statically set the USB options, pass in the \c USE_STATIC_OPTIONS token,
+			 *        defined to the appropriate options masks. When the options are statically set, this
+			 *        parameter does not exist in the function prototype.
+			 *        \n\n
+			 *
+			 *  \note The mode parameter does not exist on devices where only one mode is possible, such as USB
+			 *        AVR models which only implement the USB device mode in hardware.
+			 *
+			 *  \see \ref Group_Device for the \c USB_DEVICE_OPT_* masks.
+			 */
+			void USB_Init(
+			               #if defined(USB_CAN_BE_BOTH) || defined(__DOXYGEN__)
+			               const uint8_t Mode
+			               #endif
+
+			               #if (defined(USB_CAN_BE_BOTH) && !defined(USE_STATIC_OPTIONS)) || defined(__DOXYGEN__)
+			               ,
+			               #elif (!defined(USB_CAN_BE_BOTH) && defined(USE_STATIC_OPTIONS))
+			               void
+			               #endif
+
+			               #if !defined(USE_STATIC_OPTIONS) || defined(__DOXYGEN__)
+			               const uint8_t Options
+			               #endif
+			               );
+
+			/** Shuts down the USB interface. This turns off the USB interface after deallocating all USB FIFO
+			 *  memory, endpoints and pipes. When turned off, no USB functionality can be used until the interface
+			 *  is restarted with the \ref USB_Init() function.
+			 */
+			void USB_Disable(void);
+
+			/** Resets the interface, when already initialized. This will re-enumerate the device if already connected
+			 *  to a host, or re-enumerate an already attached device when in host mode.
+			 */
+			void USB_ResetInterface(void);
+
+		/* Global Variables: */
+			#if defined(USB_CAN_BE_BOTH) || defined(__DOXYGEN__)
+				/** Indicates the mode that the USB interface is currently initialized to, a value from the
+				 *  \ref USB_Modes_t enum.
+				 *
+				 *  \attention This variable should be treated as read-only in the user application, and never manually
+				 *             changed in value.
+				 *
+				 *  \note When the controller is initialized into UID auto-detection mode, this variable will hold the
+				 *        currently selected USB mode (i.e. \ref USB_MODE_Device or \ref USB_MODE_Host). If the controller
+				 *        is fixed into a specific mode (either through the \c USB_DEVICE_ONLY or \c USB_HOST_ONLY compile time
+				 *        options, or a limitation of the USB controller in the chosen device model) this will evaluate to
+				 *        a constant of the appropriate value and will never evaluate to \ref USB_MODE_None even when the
+				 *        USB interface is not initialized.
+				 */
+				extern volatile uint8_t USB_CurrentMode;
+			#elif defined(USB_CAN_BE_HOST)
+				#define USB_CurrentMode USB_MODE_Host
+			#elif defined(USB_CAN_BE_DEVICE)
+				#define USB_CurrentMode USB_MODE_Device
+			#endif
+
+			#if !defined(USE_STATIC_OPTIONS) || defined(__DOXYGEN__)
+				/** Indicates the current USB options that the USB interface was initialized with when \ref USB_Init()
+				 *  was called. This value will be one of the \c USB_MODE_* masks defined elsewhere in this module.
+				 *
+				 *  \attention This variable should be treated as read-only in the user application, and never manually
+				 *             changed in value.
+				 */
+				extern volatile uint8_t USB_Options;
+			#elif defined(USE_STATIC_OPTIONS)
+				#define USB_Options USE_STATIC_OPTIONS
+			#endif
+
+	/* Private Interface - For use in library only: */
+	#if !defined(__DOXYGEN__)
+		/* Function Prototypes: */
+			#if defined(__INCLUDE_FROM_USB_CONTROLLER_C)
+				static void USB_Init_Device(void);
+			#endif
+
+		/* Inline Functions: */
+			static inline void USB_Controller_Enable(void) ATTR_ALWAYS_INLINE;
+			static inline void USB_Controller_Enable(void)
+			{
+				USB.CTRLA |=  USB_ENABLE_bm;
+			}
+
+			static inline void USB_Controller_Disable(void) ATTR_ALWAYS_INLINE;
+			static inline void USB_Controller_Disable(void)
+			{
+				USB.CTRLA &= ~USB_ENABLE_bm;
+			}
+
+			static inline void USB_Controller_Reset(void) ATTR_ALWAYS_INLINE;
+			static inline void USB_Controller_Reset(void)
+			{
+				USB.CTRLA &= ~USB_ENABLE_bm;
+				USB.CTRLA |=  USB_ENABLE_bm;
+			}
+
+	#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
+/** @} */
+
diff --git a/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/USBInterrupt_XMEGA.c b/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/USBInterrupt_XMEGA.c
new file mode 100644
index 0000000000..a82dde030c
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/USBInterrupt_XMEGA.c
@@ -0,0 +1,106 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+#include "../../../../Common/Common.h"
+#if (ARCH == ARCH_XMEGA)
+
+#define  __INCLUDE_FROM_USB_DRIVER
+#include "../USBInterrupt.h"
+
+void USB_INT_DisableAllInterrupts(void)
+{
+	USB.INTCTRLA    &= USB_INTLVL_gm;
+	USB.INTCTRLB     = 0;
+}
+
+void USB_INT_ClearAllInterrupts(void)
+{
+	USB.INTFLAGSACLR = 0xFF;
+	USB.INTFLAGSBCLR = 0xFF;
+}
+
+ISR(USB_BUSEVENT_vect)
+{
+	#if !defined(NO_SOF_EVENTS)
+	if (USB_INT_HasOccurred(USB_INT_SOFI) && USB_INT_IsEnabled(USB_INT_SOFI))
+	{
+		USB_INT_Clear(USB_INT_SOFI);
+
+		EVENT_USB_Device_StartOfFrame();
+	}
+	#endif
+
+	if (USB_INT_HasOccurred(USB_INT_BUSEVENTI_Suspend))
+	{
+		USB_INT_Clear(USB_INT_BUSEVENTI_Suspend);
+
+		#if !defined(NO_LIMITED_CONTROLLER_CONNECT)
+		USB_DeviceState = DEVICE_STATE_Unattached;
+		EVENT_USB_Device_Disconnect();
+		#else
+		USB_DeviceState = DEVICE_STATE_Suspended;
+		EVENT_USB_Device_Suspend();
+		#endif
+	}
+
+	if (USB_INT_HasOccurred(USB_INT_BUSEVENTI_Resume))
+	{
+		USB_INT_Clear(USB_INT_BUSEVENTI_Resume);
+
+		if (USB_Device_ConfigurationNumber)
+		  USB_DeviceState = DEVICE_STATE_Configured;
+		else
+		  USB_DeviceState = (USB_Device_IsAddressSet()) ? DEVICE_STATE_Addressed : DEVICE_STATE_Powered;
+
+		#if !defined(NO_LIMITED_CONTROLLER_CONNECT)
+		EVENT_USB_Device_Connect();
+		#else
+		EVENT_USB_Device_WakeUp();
+		#endif
+	}
+
+	if (USB_INT_HasOccurred(USB_INT_BUSEVENTI_Reset))
+	{
+		USB_INT_Clear(USB_INT_BUSEVENTI_Reset);
+
+		USB_DeviceState                = DEVICE_STATE_Default;
+		USB_Device_ConfigurationNumber = 0;
+
+		USB_Device_EnableDeviceAddress(0);
+
+		Endpoint_ClearEndpoints();
+		Endpoint_ConfigureEndpoint(ENDPOINT_CONTROLEP, EP_TYPE_CONTROL,
+		                           USB_Device_ControlEndpointSize, 1);
+
+		EVENT_USB_Device_Reset();
+	}
+}
+
+#endif
diff --git a/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/USBInterrupt_XMEGA.h b/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/USBInterrupt_XMEGA.h
new file mode 100644
index 0000000000..54ee7f115f
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/USBInterrupt_XMEGA.h
@@ -0,0 +1,172 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief USB Controller Interrupt definitions for the AVR XMEGA microcontrollers.
+ *
+ *  This file contains definitions required for the correct handling of low level USB service routine interrupts
+ *  from the USB controller.
+ *
+ *  \note This file should not be included directly. It is automatically included as needed by the USB driver
+ *        dispatch header located in LUFA/Drivers/USB/USB.h.
+ */
+
+#ifndef __USBINTERRUPT_XMEGA_H__
+#define __USBINTERRUPT_XMEGA_H__
+
+	/* Includes: */
+		#include "../../../../Common/Common.h"
+
+	/* Enable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			extern "C" {
+		#endif
+
+	/* Preprocessor Checks: */
+		#if !defined(__INCLUDE_FROM_USB_DRIVER)
+			#error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.
+		#endif
+
+	/* Private Interface - For use in library only: */
+	#if !defined(__DOXYGEN__)
+		/* Enums: */
+			enum USB_Interrupts_t
+			{
+				USB_INT_BUSEVENTI         = 1,
+				USB_INT_BUSEVENTI_Suspend = 2,
+				USB_INT_BUSEVENTI_Resume  = 3,
+				USB_INT_BUSEVENTI_Reset   = 4,
+				USB_INT_SOFI              = 5,
+			};
+
+		/* Inline Functions: */
+			static inline void USB_INT_Enable(const uint8_t Interrupt) ATTR_ALWAYS_INLINE;
+			static inline void USB_INT_Enable(const uint8_t Interrupt)
+			{
+				switch (Interrupt)
+				{
+					case USB_INT_BUSEVENTI:
+						USB.INTCTRLA |= USB_BUSEVIE_bm;
+						break;
+					case USB_INT_SOFI:
+						USB.INTCTRLA |= USB_SOFIE_bm;
+						break;
+					default:
+						break;
+				}
+			}
+
+			static inline void USB_INT_Disable(const uint8_t Interrupt) ATTR_ALWAYS_INLINE;
+			static inline void USB_INT_Disable(const uint8_t Interrupt)
+			{
+				switch (Interrupt)
+				{
+					case USB_INT_BUSEVENTI:
+						USB.INTCTRLA &= ~USB_BUSEVIE_bm;
+						break;
+					case USB_INT_SOFI:
+						USB.INTCTRLA &= ~USB_SOFIE_bm;
+						break;
+					default:
+						break;
+				}
+			}
+
+			static inline void USB_INT_Clear(const uint8_t Interrupt) ATTR_ALWAYS_INLINE;
+			static inline void USB_INT_Clear(const uint8_t Interrupt)
+			{
+				switch (Interrupt)
+				{
+					case USB_INT_BUSEVENTI_Suspend:
+						USB.INTFLAGSACLR = USB_SUSPENDIF_bm;
+						break;
+					case USB_INT_BUSEVENTI_Resume:
+						USB.INTFLAGSACLR = USB_RESUMEIF_bm;
+						break;
+					case USB_INT_BUSEVENTI_Reset:
+						USB.INTFLAGSACLR = USB_RSTIF_bm;
+						break;
+					case USB_INT_SOFI:
+						USB.INTFLAGSACLR = USB_SOFIF_bm;
+						break;
+					default:
+						break;
+				}
+			}
+
+			static inline bool USB_INT_IsEnabled(const uint8_t Interrupt) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT;
+			static inline bool USB_INT_IsEnabled(const uint8_t Interrupt)
+			{
+				switch (Interrupt)
+				{
+					case USB_INT_BUSEVENTI:
+						return ((USB.INTCTRLA & USB_BUSEVIE_bm) ? true : false);
+					case USB_INT_SOFI:
+						return ((USB.INTCTRLA & USB_SOFIE_bm) ? true : false);
+					default:
+						return false;
+				}
+			}
+
+			static inline bool USB_INT_HasOccurred(const uint8_t Interrupt) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT;
+			static inline bool USB_INT_HasOccurred(const uint8_t Interrupt)
+			{
+				switch (Interrupt)
+				{
+					case USB_INT_BUSEVENTI_Suspend:
+						return ((USB.INTFLAGSACLR & USB_SUSPENDIF_bm) ? true : false);
+					case USB_INT_BUSEVENTI_Resume:
+						return ((USB.INTFLAGSACLR & USB_RESUMEIF_bm) ? true : false);
+					case USB_INT_BUSEVENTI_Reset:
+						return ((USB.INTFLAGSACLR & USB_RSTIF_bm) ? true : false);
+					case USB_INT_SOFI:
+						return ((USB.INTFLAGSACLR & USB_SOFIF_bm) ? true : false);
+					default:
+						return false;
+				}
+			}
+
+		/* Includes: */
+			#include "../USBMode.h"
+			#include "../Events.h"
+			#include "../USBController.h"
+
+		/* Function Prototypes: */
+			void USB_INT_ClearAllInterrupts(void);
+			void USB_INT_DisableAllInterrupts(void);
+	#endif
+
+	/* Disable C linkage for C++ Compilers: */
+		#if defined(__cplusplus)
+			}
+		#endif
+
+#endif
+
diff --git a/lib/lufa/LUFA/Drivers/USB/USB.h b/lib/lufa/LUFA/Drivers/USB/USB.h
new file mode 100644
index 0000000000..87c098cb9d
--- /dev/null
+++ b/lib/lufa/LUFA/Drivers/USB/USB.h
@@ -0,0 +1,422 @@
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2017.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *  \brief Master include file for the library USB functionality.
+ *
+ *  Master include file for the library USB functionality.
+ *
+ *  This file should be included in all user projects making use of the USB portions of the library, instead of
+ *  the individual USB driver submodule headers.
+ */
+
+/** \defgroup Group_USB USB Core - LUFA/Drivers/USB/USB.h
+ *
+ *  \brief Core driver for the microcontroller hardware USB module
+ *
+ *  \section Sec_USB_Dependencies Module Source Dependencies
+ *  The following files must be built with any user project that uses this module:
+ *    - LUFA/Drivers/USB/Core/ConfigDescriptors.c <i>(Makefile source module name: LUFA_SRC_USB)</i>
+ *    - LUFA/Drivers/USB/Core/DeviceStandardReq.c <i>(Makefile source module name: LUFA_SRC_USB)</i>
+ *    - LUFA/Drivers/USB/Core/Events.c <i>(Makefile source module name: LUFA_SRC_USB)</i>
+ *    - LUFA/Drivers/USB/Core/HostStandardReq.c <i>(Makefile source module name: LUFA_SRC_USB)</i>
+ *    - LUFA/Drivers/USB/Core/USBTask.c <i>(Makefile source module name: LUFA_SRC_USB)</i>
+ *    - LUFA/Drivers/USB/Core/<i>ARCH</i>/Device_<i>ARCH</i>.c <i>(Makefile source module name: LUFA_SRC_USB)</i>
+ *    - LUFA/Drivers/USB/Core/<i>ARCH</i>/Endpoint_<i>ARCH</i>.c <i>(Makefile source module name: LUFA_SRC_USB)</i>
+ *    - LUFA/Drivers/USB/Core/<i>ARCH</i>/EndpointStream_<i>ARCH</i>.c <i>(Makefile source module name: LUFA_SRC_USB)</i>
+ *    - LUFA/Drivers/USB/Core/<i>ARCH</i>/Host_<i>ARCH</i>.c <i>(Makefile source module name: LUFA_SRC_USB)</i>
+ *    - LUFA/Drivers/USB/Core/<i>ARCH</i>/Pipe_<i>ARCH</i>.c <i>(Makefile source module name: LUFA_SRC_USB)</i>
+ *    - LUFA/Drivers/USB/Core/<i>ARCH</i>/PipeStream_<i>ARCH</i>.c <i>(Makefile source module name: LUFA_SRC_USB)</i>
+ *    - LUFA/Drivers/USB/Core/<i>ARCH</i>/USBController_<i>ARCH</i>.c <i>(Makefile source module name: LUFA_SRC_USB)</i>
+ *    - LUFA/Drivers/USB/Core/<i>ARCH</i>/USBInterrupt_<i>ARCH</i>.c <i>(Makefile source module name: LUFA_SRC_USB)</i>
+ *    - LUFA/Drivers/USB/Class/Common/HIDParser.c <i>(Makefile source module name: LUFA_SRC_USB)</i>
+ *
+ *  \section Sec_USB_ModDescription Module Description
+ *  Driver and framework for the USB controller of the selected architecture and microcontroller model. This module
+ *  consists of many submodules, and is designed to provide an easy way to configure and control USB host, device
+ *  or OTG mode USB applications.
+ *
+ *  The USB stack requires the sole control over the USB controller in the microcontroller only; i.e. it does not
+ *  require any additional timers or other peripherals to operate. This ensures that the USB stack requires as few
+ *  resources as possible.
+ *
+ *  The USB stack can be used in Device Mode for connections to USB Hosts (see \ref Group_Device), in Host mode for
+ *  hosting of other USB devices (see \ref Group_Host), or as a dual role device which can either act as a USB host
+ *  or device depending on what peripheral is connected (see \ref Group_OTG). Both modes also require a common set
+ *  of USB management functions found \ref Group_USBManagement.
+ */
+
+/** \defgroup Group_USBClassDrivers USB Class Drivers
+ *
+ *  \brief Drivers for the various standardized USB device classes
+ *
+ *  Drivers for both host and device mode of the standard USB classes, for rapid application development.
+ *  Class drivers give a framework which sits on top of the low level library API, allowing for standard
+ *  USB classes to be implemented in a project with minimal user code. These drivers can be used in
+ *  conjunction with the library low level APIs to implement interfaces both via the class drivers and via
+ *  the standard library APIs.
+ *
+ *  Multiple device mode class drivers can be used within a project, including multiple instances of the
+ *  same class driver. In this way, USB Hosts and Devices can be made quickly using the internal class drivers
+ *  so that more time and effort can be put into the end application instead of the USB protocol.
+ *
+ *  The available class drivers and their modes are listed below.
+ *
+ *  <table>
+ *  <tr>
+ *   <th width="200px">USB Class</th>
+ *   <th width="90px">Device Mode</th>
+ *   <th width="90px">Host Mode</th>
+ *  </tr>
+ *  <tr>
+ *   <td>Android Open Accessory</td>
+ *   <td bgcolor="#EE0000">No</td>
+ *   <td bgcolor="#00EE00">Yes</td>
+ *  </tr>
+ *  <tr>
+ *   <td>Audio 1.0</td>
+ *   <td bgcolor="#00EE00">Yes</td>
+ *   <td bgcolor="#00EE00">Yes</td>
+ *  </tr>
+ *  <tr>
+ *   <td>CDC-ACM</td>
+ *   <td bgcolor="#00EE00">Yes</td>
+ *   <td bgcolor="#00EE00">Yes</td>
+ *  </tr>
+ *  <tr>
+ *   <td>HID</td>
+ *   <td bgcolor="#00EE00">Yes</td>
+ *   <td bgcolor="#00EE00">Yes</td>
+ *  </tr>
+ *  <tr>
+ *   <td>MIDI</td>
+ *   <td bgcolor="#00EE00">Yes</td>
+ *   <td bgcolor="#00EE00">Yes</td>
+ *  </tr>
+ *  <tr>
+ *   <td>Mass Storage</td>
+ *   <td bgcolor="#00EE00">Yes</td>
+ *   <td bgcolor="#00EE00">Yes</td>
+ *  </tr>
+ *  <tr>
+ *   <td>Printer</td>
+ *   <td bgcolor="#00EE00">Yes</td>
+ *   <td bgcolor="#00EE00">Yes</td>
+ *  </tr>
+ *  <tr>
+ *   <td>RNDIS</td>
+ *   <td bgcolor="#00EE00">Yes</td>
+ *   <td bgcolor="#00EE00">Yes</td>
+ *  </tr>
+ *  <tr>
+ *   <td>Still Image</td>
+ *   <td bgcolor="#EE0000">No</td>
+ *   <td bgcolor="#00EE00">Yes</td>
+ *  </tr>
+ *  </table>
+ *
+ *
+ *  \section Sec_USB_UsingClassDrivers Using the Class Drivers
+ *  To make the Class drivers easy to integrate into a user application, they all implement a standardized
+ *  design with similarly named/used function, enums, defines and types. The two different modes are implemented
+ *  slightly differently, and thus will be explained separately. For information on a specific class driver, read
+ *  the class driver's module documentation.
+ *
+ *  \subsection Sec_USB_ClassDriverDevice Device Mode Class Drivers
+ *  Implementing a Device Mode Class Driver in a user application requires a number of steps to be followed. Firstly,
+ *  the module configuration and state structure must be added to the project source. These structures are named in a
+ *  similar manner between classes, that of <tt>USB_ClassInfo_<i>{Class Name}</i>_Device_t</tt>, and are used to hold the
+ *  complete state and configuration for each class instance. Multiple class instances is where the power of the class
+ *  drivers lie; multiple interfaces of the same class simply require more instances of the Class Driver's \c USB_ClassInfo_*
+ *  structure.
+ *
+ *  Inside the ClassInfo structure lies two sections, a \c Config section, and a \c State section. The \c Config
+ *  section contains the instance's configuration parameters, and <b>must have all fields set by the user application</b>
+ *  before the class driver is used. Each Device mode Class driver typically contains a set of configuration parameters
+ *  for the endpoint size/number of the associated logical USB interface, plus any class-specific configuration parameters.
+ *
+ *  The following is an example of a properly initialized instance of the Audio Class Driver structure:
+ *
+ *  \code
+ *  USB_ClassInfo_Audio_Device_t My_Audio_Interface =
+ *  {
+ *      .Config =
+ *          {
+ *              .StreamingInterfaceNumber = 1,
+ *              .DataINEndpoint           =
+ *                  {
+ *                      .Address          = (ENDPOINT_DIR_IN | 1),
+ *                      .Size             = 64,
+ *                      .Banks            = 1,
+ *                  },
+ *          },
+ *  };
+ *  \endcode
+ *
+ *  \note The class driver's configuration parameters should match those used in the device's descriptors that are
+ *  sent to the host.
+ *
+ *  To initialize the Class driver instance, the driver's <tt><i>{Class Name}</i>_Device_ConfigureEndpoints()</tt> function
+ *  should be called in response to the \ref EVENT_USB_Device_ConfigurationChanged() event. This function will return a
+ *  boolean true value if the driver successfully initialized the instance. Like all the class driver functions, this function
+ *  takes in the address of the specific instance you wish to initialize - in this manner, multiple separate instances of
+ *  the same class type can be initialized like this:
+ *
+ *  \code
+ *  void EVENT_USB_Device_ConfigurationChanged(void)
+ *  {
+ *      LEDs_SetAllLEDs(LEDMASK_USB_READY);
+ *
+ *      if (!(Audio_Device_ConfigureEndpoints(&My_Audio_Interface)))
+ *          LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
+ *  }
+ *  \endcode
+ *
+ *  Once initialized, it is important to maintain the class driver's state by repeatedly calling the Class Driver's
+ *  <tt><i>{Class Name}</i>_Device_USBTask()</tt> function in the main program loop. The exact implementation of this
+ *  function varies between class drivers, and can be used for any internal class driver purpose to maintain each
+ *  instance. Again, this function uses the address of the instance to operate on, and thus needs to be called for each
+ *  separate instance, just like the main USB maintenance routine \ref USB_USBTask():
+ *
+ *  \code
+ *  int main(void)
+ *  {
+ *      SetupHardware();
+ *
+ *      LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
+ *
+ *      for (;;)
+ *      {
+ *          if (USB_DeviceState != DEVICE_STATE_Configured)
+ *            Create_And_Process_Samples();
+ *
+ *          Audio_Device_USBTask(&My_Audio_Interface);
+ *          USB_USBTask();
+ *      }
+ *  }
+ *  \endcode
+ *
+ *  The final standardized Device Class Driver function is the Control Request handler function
+ *  <tt><i>{Class Name}</i>_Device_ProcessControlRequest()</tt>, which should be called when the
+ *  \ref EVENT_USB_Device_ControlRequest() event fires. This function should also be called for
+ *  each class driver instance, using the address of the instance to operate on as the function's
+ *  parameter. The request handler will abort if it is determined that the current request is not
+ *  targeted at the given class driver instance, thus these methods can safely be called
+ *  one-after-another in the event handler with no form of error checking:
+ *
+ *  \code
+ *  void EVENT_USB_Device_ControlRequest(void)
+ *  {
+ *      Audio_Device_ProcessControlRequest(&My_Audio_Interface);
+ *  }
+ *  \endcode
+ *
+ *  Each class driver may also define a set of callback functions (which are prefixed by \c CALLBACK_*
+ *  in the function's name) which <b>must</b> also be added to the user application - refer to each
+ *  individual class driver's documentation for mandatory callbacks. In addition, each class driver may
+ *  also define a set of events (identifiable by their prefix of \c EVENT_* in the function's name), which
+ *  the user application <b>may</b> choose to implement, or ignore if not needed.
+ *
+ *  The individual Device Mode Class Driver documentation contains more information on the non-standardized,
+ *  class-specific functions which the user application can then use on the driver instances, such as data
+ *  read and write routines. See each driver's individual documentation for more information on the
+ *  class-specific functions.
+ *
+ *  \subsection Sec_USB_ClassDriverHost Host Mode Class Drivers
+ *  Implementing a Host Mode Class Driver in a user application requires a number of steps to be followed. Firstly,
+ *  the module configuration and state structure must be added to the project source. These structures are named in a
+ *  similar manner between classes, that of <tt>USB_ClassInfo_<b>{Class Name}</b>_Host_t</tt>, and are used to hold the
+ *  complete state and configuration for each class instance. Multiple class instances is where the power of the class
+ *  drivers lie; multiple interfaces of the same class simply require more instances of the Class Driver's \c USB_ClassInfo_*
+ *  structure.
+ *
+ *  Inside the \c USB_ClassInfo_* structure lies two sections, a \c Config section, and a \c State section. The \c Config
+ *  section contains the instance's configuration parameters, and <b>must have all fields set by the user application</b>
+ *  before the class driver is used. Each Device mode Class driver typically contains a set of configuration parameters
+ *  for the endpoint size/number of the associated logical USB interface, plus any class-specific configuration parameters.
+ *
+ *  The following is an example of a properly initialized instance of the MIDI Host Class Driver structure:
+ *
+ *  \code
+ *  USB_ClassInfo_MIDI_Host_t My_MIDI_Interface =
+ *  {
+ *      .Config =
+ *          {
+ *              .DataINPipe             =
+ *                  {
+ *                      .Address        = (PIPE_DIR_IN  | 1),
+ *                      .Size           = 64,
+ *                      .Banks          = 1,
+ *                  },
+ *              .DataOUTPipe            =
+ *                  {
+ *                      .Address        = (PIPE_DIR_OUT | 2),
+ *                      .Size           = 64,
+ *                      .Banks          = 1,
+ *                  },
+ *          },
+ *  };
+ *  \endcode
+ *
+ *  To initialize the Class driver instance, the driver's <tt><b>{Class Name}</b>_Host_ConfigurePipes()</tt> function
+ *  should be called in response to the \c EVENT_USB_Host_DeviceEnumerationComplete() event firing. This function will
+ *  will return an error code from the class driver's <tt><b>{Class Name}</b>_EnumerationFailure_ErrorCodes_t</tt> enum
+ *  to indicate if the driver successfully initialized the instance and bound it to an interface in the attached device.
+ *  Like all the class driver functions, this function takes in the address of the specific instance you wish to initialize -
+ *  in this manner, multiple separate instances of the same class type can be initialized. A fragment of a Class Driver
+ *  based Host mode application may look like the following:
+ *
+ *  \code
+ *  void EVENT_USB_Host_DeviceEnumerationComplete(void)
+ *  {
+ *      LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING);
+ *
+ *      uint16_t ConfigDescriptorSize;
+ *      uint8_t  ConfigDescriptorData[512];
+ *
+ *      if (USB_Host_GetDeviceConfigDescriptor(1, &ConfigDescriptorSize, ConfigDescriptorData,
+ *                                             sizeof(ConfigDescriptorData)) != HOST_GETCONFIG_Successful)
+ *      {
+ *          LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
+ *          return;
+ *      }
+ *
+ *      if (MIDI_Host_ConfigurePipes(&Keyboard_MIDI_Interface,
+ *                                   ConfigDescriptorSize, ConfigDescriptorData) != MIDI_ENUMERROR_NoError)
+ *      {
+ *          LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
+ *          return;
+ *      }
+ *
+ *      if (USB_Host_SetDeviceConfiguration(1) != HOST_SENDCONTROL_Successful)
+ *      {
+ *          LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
+ *          return;
+ *      }
+ *
+ *      LEDs_SetAllLEDs(LEDMASK_USB_READY);
+ *  }
+ *  \endcode
+ *
+ *  Note that the function also requires the device's configuration descriptor so that it can determine which interface
+ *  in the device to bind to - this can be retrieved as shown in the above fragment using the
+ *  \ref USB_Host_GetDeviceConfigDescriptor() function. If the device does not implement the interface the class driver
+ *  is looking for, if all the matching interfaces are already bound to class driver instances or if an error occurs while
+ *  binding to a device interface (for example, a device endpoint bank larger that the maximum supported bank size is used)
+ *  the configuration will fail.
+ *
+ *  To complete the device enumeration after binding the host mode Class Drivers to the attached device, a call to
+ *  \c USB_Host_SetDeviceConfiguration() must be made. If the device configuration is not set within the
+ *  \c EVENT_USB_Host_DeviceEnumerationComplete() event, the host still will assume the device enumeration has failed.
+ *
+ *  Once initialized, it is important to maintain the class driver's state by repeatedly calling the Class Driver's
+ *  <tt><b>{Class Name}</b>_Host_USBTask()</tt> function in the main program loop. The exact implementation of this
+ *  function varies between class drivers, and can be used for any internal class driver purpose to maintain each
+ *  instance. Again, this function uses the address of the instance to operate on, and thus needs to be called for each
+ *  separate instance, just like the main USB maintenance routine \ref USB_USBTask():
+ *
+ *  \code
+ *  int main(void)
+ *  {
+ *      SetupHardware();
+ *
+ *      LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
+ *
+ *      for (;;)
+ *      {
+ *          if (USB_HostState != HOST_STATE_Configured)
+ *              Create_And_Process_Samples();
+ *
+ *          MIDI_Host_USBTask(&My_Audio_Interface);
+ *          USB_USBTask();
+ *      }
+ *  }
+ *  \endcode
+ *
+ *  Each class driver may also define a set of callback functions (which are prefixed by \c CALLBACK_*
+ *  in the function's name) which <b>must</b> also be added to the user application - refer to each
+ *  individual class driver's documentation for mandatory callbacks. In addition, each class driver may
+ *  also define a set of events (identifiable by their prefix of \c EVENT_* in the function's name), which
+ *  the user application <b>may</b> choose to implement, or ignore if not needed.
+ *
+ *  The individual Host Mode Class Driver documentation contains more information on the non-standardized,
+ *  class-specific functions which the user application can then use on the driver instances, such as data
+ *  read and write routines. See each driver's individual documentation for more information on the
+ *  class-specific functions.
+ */
+
+#ifndef __USB_H__
+#define __USB_H__
+
+	/* Macros: */
+		#define __INCLUDE_FROM_USB_DRIVER
+
+	/* Includes: */
+		#include "../../Common/Common.h"
+		#include "Core/USBMode.h"
+
+	/* Includes: */
+		#include "Core/USBTask.h"
+		#include "Core/Events.h"
+		#include "Core/StdDescriptors.h"
+		#include "Core/ConfigDescriptors.h"
+		#include "Core/USBController.h"
+		#include "Core/USBInterrupt.h"
+
+		#if defined(USB_CAN_BE_HOST) || defined(__DOXYGEN__)
+			#include "Core/Host.h"
+			#include "Core/Pipe.h"
+			#include "Core/HostStandardReq.h"
+			#include "Core/PipeStream.h"
+		#endif
+
+		#if defined(USB_CAN_BE_DEVICE) || defined(__DOXYGEN__)
+			#include "Core/Device.h"
+			#include "Core/Endpoint.h"
+			#include "Core/DeviceStandardReq.h"
+			#include "Core/EndpointStream.h"
+		#endif
+
+		#if defined(USB_CAN_BE_BOTH) || defined(__DOXYGEN__)
+			#include "Core/OTG.h"
+		#endif
+
+		#include "Class/AndroidAccessoryClass.h"
+		#include "Class/AudioClass.h"
+		#include "Class/CDCClass.h"
+		#include "Class/HIDClass.h"
+		#include "Class/MassStorageClass.h"
+		#include "Class/MIDIClass.h"
+		#include "Class/PrinterClass.h"
+		#include "Class/RNDISClass.h"
+		#include "Class/StillImageClass.h"
+
+#endif
+