summary refs log tree commit diff
path: root/tmk_core
diff options
context:
space:
mode:
authorJosh Colbeck <skrymir@gmail.com>2017-02-21 20:31:16 -0600
committerJosh Colbeck <skrymir@gmail.com>2017-02-21 20:31:16 -0600
commite51001efcc3ff8b64f8264e8bd4c2dbea15f3364 (patch)
treebdf5a0a4b44d5e63ba1376b70d94f64c77f3c90c /tmk_core
parentc56693f858cb3409e4a68a8e65a1370c022a51ed (diff)
parent7ff41df32c29bca4e3a6efc3047b8fa93bb99b92 (diff)
Merge remote-tracking branch 'qmk/master'
Diffstat (limited to 'tmk_core')
-rw-r--r--tmk_core/avr.mk11
-rw-r--r--tmk_core/chibios.mk12
-rw-r--r--tmk_core/common.mk94
-rw-r--r--tmk_core/common/action.c118
-rw-r--r--tmk_core/common/action.h18
-rw-r--r--tmk_core/common/action_code.h38
-rw-r--r--tmk_core/common/action_layer.c14
-rw-r--r--tmk_core/common/action_layer.h5
-rw-r--r--tmk_core/common/action_macro.h26
-rw-r--r--tmk_core/common/action_util.c10
-rw-r--r--tmk_core/common/avr/bootloader.c20
-rw-r--r--tmk_core/common/avr/suspend.c11
-rw-r--r--tmk_core/common/avr/timer.c69
-rw-r--r--tmk_core/common/avr/xprintf.S1000
-rw-r--r--tmk_core/common/avr/xprintf.h222
-rw-r--r--tmk_core/common/backlight.c4
-rw-r--r--tmk_core/common/bootmagic.c4
-rw-r--r--tmk_core/common/command.c23
-rw-r--r--tmk_core/common/host.c5
-rw-r--r--tmk_core/common/host.h4
-rw-r--r--tmk_core/common/host_driver.h9
-rw-r--r--tmk_core/common/keyboard.c13
-rw-r--r--tmk_core/common/keycode.h2
-rw-r--r--tmk_core/common/magic.c4
-rw-r--r--tmk_core/common/matrix.h2
-rw-r--r--tmk_core/common/mbed/xprintf.cpp2
-rw-r--r--tmk_core/common/mbed/xprintf.h2
-rw-r--r--tmk_core/common/print.h172
-rw-r--r--tmk_core/common/raw_hid.h8
-rw-r--r--tmk_core/common/report.h7
-rw-r--r--tmk_core/common/virtser.h10
-rw-r--r--tmk_core/native.mk24
-rw-r--r--tmk_core/protocol/chibios/usb_main.c19
-rw-r--r--tmk_core/protocol/iwrap/suart.S312
-rw-r--r--tmk_core/protocol/iwrap/suart.h16
-rw-r--r--tmk_core/protocol/iwrap/wd.h318
-rw-r--r--tmk_core/protocol/lufa.mk11
-rw-r--r--tmk_core/protocol/lufa/LUFA-git/Bootloaders/CDC/asf.xml322
-rw-r--r--tmk_core/protocol/lufa/LUFA-git/Bootloaders/DFU/asf.xml312
-rw-r--r--tmk_core/protocol/lufa/LUFA-git/Bootloaders/HID/asf.xml246
-rw-r--r--tmk_core/protocol/lufa/LUFA-git/Bootloaders/MassStorage/BootloaderAPITable.S204
-rw-r--r--tmk_core/protocol/lufa/LUFA-git/Bootloaders/MassStorage/asf.xml312
-rw-r--r--tmk_core/protocol/lufa/LUFA-git/Bootloaders/MassStorage/makefile136
-rw-r--r--tmk_core/protocol/lufa/LUFA-git/Bootloaders/Printer/BootloaderAPITable.S182
-rw-r--r--tmk_core/protocol/lufa/LUFA-git/Bootloaders/Printer/asf.xml318
-rw-r--r--tmk_core/protocol/lufa/LUFA-git/Bootloaders/Printer/makefile110
-rw-r--r--tmk_core/protocol/lufa/LUFA-git/LUFA/Build/HID_EEPROM_Loader/makefile84
-rw-r--r--tmk_core/protocol/lufa/LUFA-git/LUFA/CodeTemplates/DeviceTemplate/asf.xml110
-rw-r--r--tmk_core/protocol/lufa/LUFA-git/LUFA/CodeTemplates/HostTemplate/asf.xml82
-rw-r--r--tmk_core/protocol/lufa/LUFA-git/LUFA/DoxygenPages/BuildSystem.txt1950
-rw-r--r--tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/Docbook/mshelp/placeholder.txt2
-rw-r--r--tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/Docbook/placeholder.txt2
-rw-r--r--tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/HV1/lufa_hv1_transform.xslt90
-rw-r--r--tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/HV1/lufa_studio_help_styling.css106
-rw-r--r--tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/VSIX/[Content_Types].xml26
-rw-r--r--tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/VSIX/asf-manifest.xml36
-rw-r--r--tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/VSIX/extension.vsixmanifest66
-rw-r--r--tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/VSIX/generate_caches.py76
-rw-r--r--tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa.xml192
-rw-r--r--tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_common.xml68
-rw-r--r--tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_board.xml228
-rw-r--r--tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_board_names.xml1706
-rw-r--r--tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_misc.xml112
-rw-r--r--tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_peripheral.xml396
-rw-r--r--tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_usb.xml62
-rw-r--r--tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_usb_class.xml64
-rw-r--r--tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_usb_core.xml170
-rw-r--r--tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_usb_core_avr8.xml86
-rw-r--r--tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_usb_core_uc3.xml84
-rw-r--r--tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_usb_core_xmega.xml72
-rw-r--r--tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_platform.xml120
-rw-r--r--tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_platform_uc3.xml52
-rw-r--r--tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_platform_xmega.xml46
-rw-r--r--tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_toolchain.xml86
-rw-r--r--tmk_core/protocol/lufa/adafruit_ble.cpp805
-rw-r--r--tmk_core/protocol/lufa/adafruit_ble.h60
-rw-r--r--tmk_core/protocol/lufa/descriptor.c208
-rw-r--r--tmk_core/protocol/lufa/descriptor.h88
-rw-r--r--tmk_core/protocol/lufa/lufa.c397
-rw-r--r--tmk_core/protocol/lufa/lufa.h15
-rw-r--r--tmk_core/protocol/lufa/outputselect.c56
-rw-r--r--tmk_core/protocol/lufa/outputselect.h41
-rw-r--r--tmk_core/protocol/lufa/ringbuffer.hpp66
-rw-r--r--tmk_core/protocol/midi.mk1
-rwxr-xr-xtmk_core/protocol/midi/Config/LUFAConfig.h186
-rw-r--r--tmk_core/protocol/pjrc/usb.c18
-rw-r--r--tmk_core/protocol/pjrc/usb_keyboard.c8
-rw-r--r--tmk_core/protocol/ps2_mouse.c330
-rw-r--r--tmk_core/protocol/ps2_mouse.h132
-rw-r--r--tmk_core/protocol/vusb.mk3
-rw-r--r--tmk_core/protocol/vusb/main.c6
-rw-r--r--tmk_core/protocol/vusb/vusb.c22
-rw-r--r--tmk_core/readme.md2
-rw-r--r--tmk_core/ring_buffer.h26
-rw-r--r--tmk_core/rules.mk351
-rw-r--r--tmk_core/tool/chibios/ch-bootloader-jump.patch204
96 files changed, 8012 insertions, 5968 deletions
diff --git a/tmk_core/avr.mk b/tmk_core/avr.mk
index 3bf2b34f88..5df539def5 100644
--- a/tmk_core/avr.mk
+++ b/tmk_core/avr.mk
@@ -26,7 +26,7 @@ CFLAGS += -fno-inline-small-functions
 CFLAGS += -fno-strict-aliasing
 
 CPPFLAGS += $(COMPILEFLAGS)
-CPPFLAGS += -fno-exceptions
+CPPFLAGS += -fno-exceptions -std=c++11
 
 LDFLAGS +=-Wl,--gc-sections
 
@@ -107,6 +107,10 @@ flip: $(BUILD_DIR)/$(TARGET).hex
 	batchisp -hardware usb -device $(MCU) -operation start reset 0
 
 dfu: $(BUILD_DIR)/$(TARGET).hex sizeafter
+	until dfu-programmer $(MCU) get bootloader-version; do\
+		echo "Error: Bootloader not found. Trying again in 5s." ;\
+		sleep 5 ;\
+	done
 ifneq (, $(findstring 0.7, $(shell dfu-programmer --version 2>&1)))
 	dfu-programmer $(MCU) erase --force
 else
@@ -134,6 +138,11 @@ else
 endif
 	dfu-programmer $(MCU) reset
 
+# Convert hex to bin.
+flashbin: $(BUILD_DIR)/$(TARGET).hex
+	$(OBJCOPY) -Iihex -Obinary $(BUILD_DIR)/$(TARGET).hex $(BUILD_DIR)/$(TARGET).bin
+	$(COPY) $(BUILD_DIR)/$(TARGET).bin $(TARGET).bin;
+	$(COPY) $(BUILD_DIR)/$(TARGET).bin FLASH.bin; 
 
 # Generate avr-gdb config/init file which does the following:
 #     define the reset signal, load the target file, connect to target, and set
diff --git a/tmk_core/chibios.mk b/tmk_core/chibios.mk
index cb67ac6f25..062a712bd1 100644
--- a/tmk_core/chibios.mk
+++ b/tmk_core/chibios.mk
@@ -89,9 +89,9 @@ CHIBISRC = $(STARTUPSRC) \
 	   $(STARTUPASM) \
 	   $(PORTASM) \
 	   $(OSALASM)         
-	   
-SRC += $(patsubst $(TOP_DIR)/%,%,$(CHIBISRC))
 
+CHIBISRC := $(patsubst $(TOP_DIR)/%,%,$(CHIBISRC))
+	   
 EXTRAINCDIRS += $(CHIBIOS)/os/license \
          $(STARTUPINC) $(KERNINC) $(PORTINC) $(OSALINC) \
          $(HALINC) $(PLATFORMINC) $(BOARDINC) $(TESTINC) \
@@ -143,14 +143,6 @@ MCUFLAGS = -mcpu=$(MCU)
 
 DEBUG = gdb
 
-# Define ASM defines here
-# bootloader definitions may be used in the startup .s file
-ifneq ("$(wildcard $(KEYBOARD_PATH)/bootloader_defs.h)","")
-    OPT_DEFS += -include $(KEYBOARD_PATH)/bootloader_defs.h
-else ifneq ("$(wildcard $(KEYBOARD_PATH)/boards/$(BOARD)/bootloader_defs.h)","")
-    OPT_DEFS += -include $(KEYBOARD_PATH)/boards/$(BOARD)/bootloader_defs.h
-endif
-
 # List any extra directories to look for libraries here.
 EXTRALIBDIRS = $(RULESPATH)/ld
 
diff --git a/tmk_core/common.mk b/tmk_core/common.mk
index aa05b9491d..a86dccc616 100644
--- a/tmk_core/common.mk
+++ b/tmk_core/common.mk
@@ -5,7 +5,7 @@ else ifeq ($(PLATFORM),CHIBIOS)
 	PLATFORM_COMMON_DIR = $(COMMON_DIR)/chibios
 endif
 
-SRC +=	$(COMMON_DIR)/host.c \
+TMK_COMMON_SRC +=	$(COMMON_DIR)/host.c \
 	$(COMMON_DIR)/keyboard.c \
 	$(COMMON_DIR)/action.c \
 	$(COMMON_DIR)/action_tapping.c \
@@ -21,101 +21,109 @@ SRC +=	$(COMMON_DIR)/host.c \
 	$(PLATFORM_COMMON_DIR)/bootloader.c \
 
 ifeq ($(PLATFORM),AVR)
-	SRC += $(PLATFORM_COMMON_DIR)/xprintf.S
+	TMK_COMMON_SRC += $(PLATFORM_COMMON_DIR)/xprintf.S
 endif 
 
 ifeq ($(PLATFORM),CHIBIOS)
-	SRC += $(PLATFORM_COMMON_DIR)/printf.c
-	SRC += $(PLATFORM_COMMON_DIR)/eeprom.c
+	TMK_COMMON_SRC += $(PLATFORM_COMMON_DIR)/printf.c
+	TMK_COMMON_SRC += $(PLATFORM_COMMON_DIR)/eeprom.c
 endif
 
 
 
 # Option modules
 ifeq ($(strip $(BOOTMAGIC_ENABLE)), yes)
-    OPT_DEFS += -DBOOTMAGIC_ENABLE
-    SRC += $(COMMON_DIR)/bootmagic.c
+    TMK_COMMON_DEFS += -DBOOTMAGIC_ENABLE
+    TMK_COMMON_SRC += $(COMMON_DIR)/bootmagic.c
 else
-    OPT_DEFS += -DMAGIC_ENABLE
-    SRC += $(COMMON_DIR)/magic.c
+    TMK_COMMON_DEFS += -DMAGIC_ENABLE
+    TMK_COMMON_SRC += $(COMMON_DIR)/magic.c
 endif
 
 ifeq ($(strip $(MOUSEKEY_ENABLE)), yes)
-    SRC += $(COMMON_DIR)/mousekey.c
-    OPT_DEFS += -DMOUSEKEY_ENABLE
-    OPT_DEFS += -DMOUSE_ENABLE
+    TMK_COMMON_SRC += $(COMMON_DIR)/mousekey.c
+    TMK_COMMON_DEFS += -DMOUSEKEY_ENABLE
+    TMK_COMMON_DEFS += -DMOUSE_ENABLE
 endif
 
 ifeq ($(strip $(EXTRAKEY_ENABLE)), yes)
-    OPT_DEFS += -DEXTRAKEY_ENABLE
+    TMK_COMMON_DEFS += -DEXTRAKEY_ENABLE
+endif
+
+ifeq ($(strip $(RAW_ENABLE)), yes)
+    TMK_COMMON_DEFS += -DRAW_ENABLE
 endif
 
 ifeq ($(strip $(CONSOLE_ENABLE)), yes)
-    OPT_DEFS += -DCONSOLE_ENABLE
+    TMK_COMMON_DEFS += -DCONSOLE_ENABLE
 else
-    OPT_DEFS += -DNO_PRINT
-    OPT_DEFS += -DNO_DEBUG
+    TMK_COMMON_DEFS += -DNO_PRINT
+    TMK_COMMON_DEFS += -DNO_DEBUG
 endif
 
 ifeq ($(strip $(COMMAND_ENABLE)), yes)
-    SRC += $(COMMON_DIR)/command.c
-    OPT_DEFS += -DCOMMAND_ENABLE
+    TMK_COMMON_SRC += $(COMMON_DIR)/command.c
+    TMK_COMMON_DEFS += -DCOMMAND_ENABLE
 endif
 
 ifeq ($(strip $(NKRO_ENABLE)), yes)
-    OPT_DEFS += -DNKRO_ENABLE
+    TMK_COMMON_DEFS += -DNKRO_ENABLE
 endif
 
 ifeq ($(strip $(USB_6KRO_ENABLE)), yes)
-    OPT_DEFS += -DUSB_6KRO_ENABLE
+    TMK_COMMON_DEFS += -DUSB_6KRO_ENABLE
 endif
 
 ifeq ($(strip $(SLEEP_LED_ENABLE)), yes)
-    SRC += $(PLATFORM_COMMON_DIR)/sleep_led.c
-    OPT_DEFS += -DSLEEP_LED_ENABLE
-    OPT_DEFS += -DNO_SUSPEND_POWER_DOWN
+    TMK_COMMON_SRC += $(PLATFORM_COMMON_DIR)/sleep_led.c
+    TMK_COMMON_DEFS += -DSLEEP_LED_ENABLE
+    TMK_COMMON_DEFS += -DNO_SUSPEND_POWER_DOWN
+endif
+
+ifeq ($(strip $(NO_UART)), yes)
+    TMK_COMMON_DEFS += -DNO_UART
+endif
+
+ifeq ($(strip $(NO_SUSPEND_POWER_DOWN)), yes)
+    TMK_COMMON_DEFS += -DNO_SUSPEND_POWER_DOWN
 endif
 
 ifeq ($(strip $(BACKLIGHT_ENABLE)), yes)
-    SRC += $(COMMON_DIR)/backlight.c
-    OPT_DEFS += -DBACKLIGHT_ENABLE
+    TMK_COMMON_SRC += $(COMMON_DIR)/backlight.c
+    TMK_COMMON_DEFS += -DBACKLIGHT_ENABLE
+endif
+
+ifeq ($(strip $(ADAFRUIT_BLE_ENABLE)), yes)
+    TMK_COMMON_DEFS += -DADAFRUIT_BLE_ENABLE
 endif
 
 ifeq ($(strip $(BLUETOOTH_ENABLE)), yes)
-    OPT_DEFS += -DBLUETOOTH_ENABLE
+    TMK_COMMON_DEFS += -DBLUETOOTH_ENABLE
+endif
+
+ifeq ($(strip $(ONEHAND_ENABLE)), yes)
+    TMK_COMMON_DEFS += -DONEHAND_ENABLE
 endif
 
 ifeq ($(strip $(KEYMAP_SECTION_ENABLE)), yes)
-    OPT_DEFS += -DKEYMAP_SECTION_ENABLE
+    TMK_COMMON_DEFS += -DKEYMAP_SECTION_ENABLE
 
     ifeq ($(strip $(MCU)),atmega32u2)
-	EXTRALDFLAGS = -Wl,-L$(TMK_DIR),-Tldscript_keymap_avr35.x
+	TMK_COMMON_LDFLAGS = -Wl,-L$(TMK_DIR),-Tldscript_keymap_avr35.x
     else ifeq ($(strip $(MCU)),atmega32u4)
-	EXTRALDFLAGS = -Wl,-L$(TMK_DIR),-Tldscript_keymap_avr5.x
+	TMK_COMMON_LDFLAGS = -Wl,-L$(TMK_DIR),-Tldscript_keymap_avr5.x
     else
-	EXTRALDFLAGS = $(error no ldscript for keymap section)
+	TMK_COMMON_LDFLAGS = $(error no ldscript for keymap section)
     endif
 endif
 
-ifeq ($(MASTER),right)	
-	OPT_DEFS += -DMASTER_IS_ON_RIGHT
-else 
-	ifneq ($(MASTER),left)
-$(error MASTER does not have a valid value(left/right))
-	endif
-endif
-
-
-# Version string
-OPT_DEFS += -DVERSION=$(GIT_VERSION)
-
 # Bootloader address
 ifdef STM32_BOOTLOADER_ADDRESS
-    OPT_DEFS += -DSTM32_BOOTLOADER_ADDRESS=$(STM32_BOOTLOADER_ADDRESS)
+    TMK_COMMON_DEFS += -DSTM32_BOOTLOADER_ADDRESS=$(STM32_BOOTLOADER_ADDRESS)
 endif
 
 # Search Path
 VPATH += $(TMK_PATH)/$(COMMON_DIR)
 ifeq ($(PLATFORM),CHIBIOS)
 VPATH += $(TMK_PATH)/$(COMMON_DIR)/chibios
-endif
\ No newline at end of file
+endif
diff --git a/tmk_core/common/action.c b/tmk_core/common/action.c
index be6dea2b79..94de36918d 100644
--- a/tmk_core/common/action.c
+++ b/tmk_core/common/action.c
@@ -33,6 +33,9 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #include "nodebug.h"
 #endif
 
+#ifdef FAUXCLICKY_ENABLE
+#include <fauxclicky.h>
+#endif
 
 void action_exec(keyevent_t event)
 {
@@ -41,8 +44,31 @@ void action_exec(keyevent_t event)
         dprint("EVENT: "); debug_event(event); dprintln();
     }
 
+#ifdef FAUXCLICKY_ENABLE
+    if (IS_PRESSED(event)) {
+        FAUXCLICKY_ACTION_PRESS;
+    }
+    if (IS_RELEASED(event)) {
+        FAUXCLICKY_ACTION_RELEASE;
+    }
+    fauxclicky_check();
+#endif
+
+#ifdef ONEHAND_ENABLE
+    if (!IS_NOEVENT(event)) {
+        process_hand_swap(&event);
+    }
+#endif
+
     keyrecord_t record = { .event = event };
 
+#if (defined(ONESHOT_TIMEOUT) && (ONESHOT_TIMEOUT > 0))
+    if (has_oneshot_layer_timed_out()) {
+        dprintf("Oneshot layer: timeout\n");
+        clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED);
+    }
+#endif
+
 #ifndef NO_ACTION_TAPPING
     action_tapping_process(record);
 #else
@@ -53,6 +79,26 @@ void action_exec(keyevent_t event)
 #endif
 }
 
+#ifdef ONEHAND_ENABLE
+bool swap_hands = false;
+
+void process_hand_swap(keyevent_t *event) {
+    static swap_state_row_t swap_state[MATRIX_ROWS];
+
+    keypos_t pos = event->key;
+    swap_state_row_t col_bit = (swap_state_row_t)1<<pos.col;
+    bool do_swap = event->pressed ? swap_hands :
+                                    swap_state[pos.row] & (col_bit);
+
+    if (do_swap) {
+        event->key = hand_swap_config[pos.row][pos.col];
+        swap_state[pos.row] |= col_bit;
+    } else {
+        swap_state[pos.row] &= ~(col_bit);
+    }
+}
+#endif
+
 #if !defined(NO_ACTION_LAYER) && defined(PREVENT_STUCK_MODIFIERS)
 bool disable_action_cache = false;
 
@@ -74,7 +120,7 @@ bool process_record_quantum(keyrecord_t *record) {
     return true;
 }
 
-void process_record(keyrecord_t *record) 
+void process_record(keyrecord_t *record)
 {
     if (IS_NOEVENT(record->event)) { return; }
 
@@ -100,13 +146,6 @@ void process_action(keyrecord_t *record, action_t action)
     uint8_t tap_count = record->tap.count;
 #endif
 
-#if (defined(ONESHOT_TIMEOUT) && (ONESHOT_TIMEOUT > 0))
-    if (has_oneshot_layer_timed_out()) {
-        dprintf("Oneshot layer: timeout\n");
-        clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED);
-    }
-#endif
-
     if (event.pressed) {
         // clear the potential weak mods left by previously pressed keys
         clear_weak_mods();
@@ -129,9 +168,10 @@ void process_action(keyrecord_t *record, action_t action)
                                                                 action.key.mods<<4;
                 if (event.pressed) {
                     if (mods) {
-                        if (IS_MOD(action.key.code)) {
+                        if (IS_MOD(action.key.code) || action.key.code == KC_NO) {
                             // e.g. LSFT(KC_LGUI): we don't want the LSFT to be weak as it would make it useless.
-                            // this also makes LSFT(KC_LGUI) behave exactly the same as LGUI(KC_LSFT)
+                            // This also makes LSFT(KC_LGUI) behave exactly the same as LGUI(KC_LSFT).
+                            // Same applies for some keys like KC_MEH which are declared as MEH(KC_NO).
                             add_mods(mods);
                         } else {
                             add_weak_mods(mods);
@@ -142,7 +182,7 @@ void process_action(keyrecord_t *record, action_t action)
                 } else {
                     unregister_code(action.key.code);
                     if (mods) {
-                        if (IS_MOD(action.key.code)) {
+                        if (IS_MOD(action.key.code) || action.key.code == KC_NO) {
                             del_mods(mods);
                         } else {
                             del_weak_mods(mods);
@@ -440,6 +480,54 @@ void process_action(keyrecord_t *record, action_t action)
 #endif
         case ACT_COMMAND:
             break;
+#ifdef ONEHAND_ENABLE
+        case ACT_SWAP_HANDS:
+            switch (action.swap.code) {
+                case OP_SH_TOGGLE:
+                    if (event.pressed) {
+                        swap_hands = !swap_hands;
+                    }
+                    break;
+                case OP_SH_ON_OFF:
+                    swap_hands = event.pressed;
+                    break;
+                case OP_SH_OFF_ON:
+                    swap_hands = !event.pressed;
+                    break;
+                case OP_SH_ON:
+                    if (!event.pressed) {
+                        swap_hands = true;
+                    }
+                    break;
+                case OP_SH_OFF:
+                    if (!event.pressed) {
+                        swap_hands = false;
+                    }
+                    break;
+    #ifndef NO_ACTION_TAPPING
+                case OP_SH_TAP_TOGGLE:
+                    /* tap toggle */
+                    if (tap_count > 0) {
+                        if (!event.pressed) {
+                            swap_hands = !swap_hands;
+                        }
+                    } else {
+                        swap_hands = event.pressed;
+                    }
+                    break;
+                default:
+                    if (tap_count > 0) {
+                        if (event.pressed) {
+                            register_code(action.swap.code);
+                        } else {
+                            unregister_code(action.swap.code);
+                        }
+                    } else {
+                        swap_hands = event.pressed;
+                    }
+    #endif
+            }
+#endif
 #ifndef NO_ACTION_FUNCTION
         case ACT_FUNCTION:
             action_function(record, action.func.id, action.func.opt);
@@ -652,6 +740,13 @@ bool is_tap_key(keypos_t key)
                     return true;
             }
             return false;
+        case ACT_SWAP_HANDS:
+            switch (action.swap.code) {
+                case 0x00 ... 0xdf:
+                case OP_SH_TAP_TOGGLE:
+                    return true;
+            }
+            return false;
         case ACT_MACRO:
         case ACT_FUNCTION:
             if (action.func.opt & FUNC_TAP) { return true; }
@@ -692,6 +787,7 @@ void debug_action(action_t action)
         case ACT_MACRO:             dprint("ACT_MACRO");             break;
         case ACT_COMMAND:           dprint("ACT_COMMAND");           break;
         case ACT_FUNCTION:          dprint("ACT_FUNCTION");          break;
+        case ACT_SWAP_HANDS:        dprint("ACT_SWAP_HANDS");        break;
         default:                    dprint("UNKNOWN");               break;
     }
     dprintf("[%X:%02X]", action.kind.param>>8, action.kind.param&0xff);
diff --git a/tmk_core/common/action.h b/tmk_core/common/action.h
index e8aa12a7cb..b9bdfe642c 100644
--- a/tmk_core/common/action.h
+++ b/tmk_core/common/action.h
@@ -65,6 +65,24 @@ bool process_record_quantum(keyrecord_t *record);
 #if !defined(NO_ACTION_LAYER) && defined(PREVENT_STUCK_MODIFIERS)
 extern bool disable_action_cache;
 #endif
+
+/* Code for handling one-handed key modifiers. */
+#ifdef ONEHAND_ENABLE
+extern bool swap_hands;
+extern const keypos_t hand_swap_config[MATRIX_ROWS][MATRIX_COLS];
+#if (MATRIX_COLS <= 8)
+typedef  uint8_t    swap_state_row_t;
+#elif (MATRIX_COLS <= 16)
+typedef  uint16_t   swap_state_row_t;
+#elif (MATRIX_COLS <= 32)
+typedef  uint32_t   swap_state_row_t;
+#else
+#error "MATRIX_COLS: invalid value"
+#endif
+
+void process_hand_swap(keyevent_t *record);
+#endif
+
 void process_record_nocache(keyrecord_t *record);
 void process_record(keyrecord_t *record);
 void process_action(keyrecord_t *record, action_t action);
diff --git a/tmk_core/common/action_code.h b/tmk_core/common/action_code.h
index ca729aaece..b15aaa0eb3 100644
--- a/tmk_core/common/action_code.h
+++ b/tmk_core/common/action_code.h
@@ -47,10 +47,15 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
  * 0100|10| usage(10)     (reserved)
  * 0100|11| usage(10)     (reserved)
  *
- * ACT_MOUSEKEY(0110): TODO: Not needed?
+ *
+ * ACT_MOUSEKEY(0101): TODO: Merge these two actions to conserve space?
  * 0101|xxxx| keycode     Mouse key
  *
- * 011x|xxxx xxxx xxxx    (reseved)
+ * ACT_SWAP_HANDS(0110):
+ * 0110|xxxx| keycode     Swap hands (keycode on tap, or options)
+ *
+ *
+ * 0111|xxxx xxxx xxxx    (reserved)
  *
  *
  * Layer Actions(10xx)
@@ -67,7 +72,6 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
  *   ee:    on event(01:press, 10:release, 11:both)
  *
  * 1001|xxxx|xxxx xxxx   (reserved)
- * 1001|oopp|BBBB BBBB   8-bit Bitwise Operation???
  *
  * ACT_LAYER_TAP(101x):
  * 101E|LLLL| keycode    On/Off with tap key    (0x00-DF)[TAP]
@@ -108,6 +112,8 @@ enum action_kind_id {
     /* Other Keys */
     ACT_USAGE           = 0b0100,
     ACT_MOUSEKEY        = 0b0101,
+    /* One-hand Support */
+    ACT_SWAP_HANDS      = 0b0110,
     /* Layer Actions */
     ACT_LAYER           = 0b1000,
     ACT_LAYER_TAP       = 0b1010, /* Layer  0-15 */
@@ -178,6 +184,11 @@ typedef union {
         uint8_t  opt    :4;
         uint8_t  kind   :4;
     } func;
+    struct action_swap {
+        uint8_t  code   :8;
+        uint8_t  opt   :4;
+        uint8_t  kind   :4;
+    } swap;
 } action_t;
 
 
@@ -295,6 +306,7 @@ enum backlight_opt {
     BACKLIGHT_STEP     = 3,
     BACKLIGHT_LEVEL    = 4,
 };
+
 /* Macro */
 #define ACTION_MACRO(id)                ACTION(ACT_MACRO, (id))
 #define ACTION_MACRO_TAP(id)            ACTION(ACT_MACRO, FUNC_TAP<<8 | (id))
@@ -306,7 +318,7 @@ enum backlight_opt {
 #define ACTION_BACKLIGHT_STEP()         ACTION(ACT_BACKLIGHT, BACKLIGHT_STEP << 8)
 #define ACTION_BACKLIGHT_LEVEL(level)   ACTION(ACT_BACKLIGHT, BACKLIGHT_LEVEL << 8 | (level))
 /* Command */
-#define ACTION_COMMAND(id, opt)         ACTION(ACT_COMMAND,  (opt)<<8 | (addr))
+#define ACTION_COMMAND(id, opt)         ACTION(ACT_COMMAND,  (opt)<<8 | (id))
 /* Function */
 enum function_opts {
     FUNC_TAP = 0x8,     /* indciates function is tappable */
@@ -314,5 +326,23 @@ enum function_opts {
 #define ACTION_FUNCTION(id)             ACTION(ACT_FUNCTION, (id))
 #define ACTION_FUNCTION_TAP(id)         ACTION(ACT_FUNCTION, FUNC_TAP<<8 | (id))
 #define ACTION_FUNCTION_OPT(id, opt)    ACTION(ACT_FUNCTION, (opt)<<8 | (id))
+/* OneHand Support */
+enum swap_hands_pram_tap_op {
+    OP_SH_TOGGLE = 0xF0,
+    OP_SH_TAP_TOGGLE,
+    OP_SH_ON_OFF,
+    OP_SH_OFF_ON,
+    OP_SH_OFF,
+    OP_SH_ON,
+};
+
+#define ACTION_SWAP_HANDS()             ACTION_SWAP_HANDS_ON_OFF()
+#define ACTION_SWAP_HANDS_TOGGLE()      ACTION(ACT_SWAP_HANDS, OP_SH_TOGGLE)
+#define ACTION_SWAP_HANDS_TAP_TOGGLE()  ACTION(ACT_SWAP_HANDS, OP_SH_TAP_TOGGLE)
+#define ACTION_SWAP_HANDS_TAP_KEY(key)  ACTION(ACT_SWAP_HANDS, key)
+#define ACTION_SWAP_HANDS_ON_OFF()      ACTION(ACT_SWAP_HANDS, OP_SH_ON_OFF)
+#define ACTION_SWAP_HANDS_OFF_ON()      ACTION(ACT_SWAP_HANDS, OP_SH_OFF_ON)
+#define ACTION_SWAP_HANDS_ON()          ACTION(ACT_SWAP_HANDS, OP_SH_ON)
+#define ACTION_SWAP_HANDS_OFF()         ACTION(ACT_SWAP_HANDS, OP_SH_OFF)
 
 #endif /* ACTION_CODE_H */
diff --git a/tmk_core/common/action_layer.c b/tmk_core/common/action_layer.c
index 63fa2b5ae4..58d919a04d 100644
--- a/tmk_core/common/action_layer.c
+++ b/tmk_core/common/action_layer.c
@@ -16,8 +16,14 @@
  */
 uint32_t default_layer_state = 0;
 
+__attribute__((weak))
+uint32_t default_layer_state_set_kb(uint32_t state) {
+    return state;
+}
+
 static void default_layer_state_set(uint32_t state)
 {
+    state = default_layer_state_set_kb(state);
     debug("default_layer_state: ");
     default_layer_debug(); debug(" to ");
     default_layer_state = state;
@@ -57,8 +63,14 @@ void default_layer_xor(uint32_t state)
  */
 uint32_t layer_state = 0;
 
+__attribute__((weak))
+uint32_t layer_state_set_kb(uint32_t state) {
+    return state;
+}
+
 static void layer_state_set(uint32_t state)
 {
+    state = layer_state_set_kb(state);
     dprint("layer_state: ");
     layer_debug(); dprint(" to ");
     layer_state = state;
@@ -111,7 +123,7 @@ void layer_debug(void)
 #endif
 
 #if !defined(NO_ACTION_LAYER) && defined(PREVENT_STUCK_MODIFIERS)
-uint8_t source_layers_cache[(MATRIX_ROWS * MATRIX_COLS + 7) / 8][MAX_LAYER_BITS] = {0};
+uint8_t source_layers_cache[(MATRIX_ROWS * MATRIX_COLS + 7) / 8][MAX_LAYER_BITS] = {{0}};
 
 void update_source_layers_cache(keypos_t key, uint8_t layer)
 {
diff --git a/tmk_core/common/action_layer.h b/tmk_core/common/action_layer.h
index 025cf5420f..d89ed6e5ce 100644
--- a/tmk_core/common/action_layer.h
+++ b/tmk_core/common/action_layer.h
@@ -29,6 +29,9 @@ extern uint32_t default_layer_state;
 void default_layer_debug(void);
 void default_layer_set(uint32_t state);
 
+__attribute__((weak))
+uint32_t default_layer_state_set_kb(uint32_t state);
+
 #ifndef NO_ACTION_LAYER
 /* bitwise operation */
 void default_layer_or(uint32_t state);
@@ -69,6 +72,8 @@ void layer_xor(uint32_t state);
 #define layer_xor(state)
 #define layer_debug()
 
+__attribute__((weak))
+uint32_t layer_state_set_kb(uint32_t state);
 #endif
 
 /* pressed actions cache */
diff --git a/tmk_core/common/action_macro.h b/tmk_core/common/action_macro.h
index aedc32ec6b..f373f5068e 100644
--- a/tmk_core/common/action_macro.h
+++ b/tmk_core/common/action_macro.h
@@ -20,11 +20,33 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #include "progmem.h"
 
 
-#define MACRO_NONE      0
+
+typedef uint8_t macro_t;
+
+#define MACRO_NONE      (macro_t*)0
 #define MACRO(...)      ({ static const macro_t __m[] PROGMEM = { __VA_ARGS__ }; &__m[0]; })
 #define MACRO_GET(p)    pgm_read_byte(p)
 
-typedef uint8_t macro_t;
+// Sends press when the macro key is pressed, release when release, or tap_macro when the key has been tapped
+#define MACRO_TAP_HOLD(record, press, release, tap_macro) ( ((record)->event.pressed) ? \
+     ( ((record)->tap.count <= 0 || (record)->tap.interrupted) ? (press) : MACRO_NONE ) : \
+     ( ((record)->tap.count > 0 && !((record)->tap.interrupted)) ? (tap_macro) : (release) ) )
+
+// Holds down the modifier mod when the macro key is held, or sends macro instead when tapped
+#define MACRO_TAP_HOLD_MOD(record, macro, mod) MACRO_TAP_HOLD(record, (MACRO(D(mod), END)), MACRO(U(mod), END), macro)
+
+// Holds down the modifier mod when the macro key is held, or pressed a shifted key when tapped (eg: shift+3 for #)
+#define MACRO_TAP_SHFT_KEY_HOLD_MOD(record, key, mod) MACRO_TAP_HOLD_MOD(record, (MACRO(I(10), D(LSFT), T(key), U(LSFT), END)), mod)
+
+
+// Momentary switch layer when held, sends macro if tapped
+#define MACRO_TAP_HOLD_LAYER(record, macro, layer) ( ((record)->event.pressed) ? \
+     ( ((record)->tap.count <= 0 || (record)->tap.interrupted) ? ({layer_on((layer)); MACRO_NONE; }) : MACRO_NONE ) : \
+     ( ((record)->tap.count > 0 && !((record)->tap.interrupted)) ? (macro) : ({layer_off((layer)); MACRO_NONE; }) ) )
+
+// Momentary switch layer when held, presses a shifted key when tapped (eg: shift+3 for #)
+#define MACRO_TAP_SHFT_KEY_HOLD_LAYER(record, key, layer) MACRO_TAP_HOLD_LAYER(record, MACRO(I(10), D(LSFT), T(key), U(LSFT), END), layer)
+     
 
 
 #ifndef NO_ACTION_MACRO
diff --git a/tmk_core/common/action_util.c b/tmk_core/common/action_util.c
index 61ff202bef..cb4b252648 100644
--- a/tmk_core/common/action_util.c
+++ b/tmk_core/common/action_util.c
@@ -20,6 +20,10 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #include "action_util.h"
 #include "action_layer.h"
 #include "timer.h"
+#include "keycode_config.h"
+
+extern keymap_config_t keymap_config;
+
 
 static inline void add_key_byte(uint8_t code);
 static inline void del_key_byte(uint8_t code);
@@ -139,7 +143,7 @@ void send_keyboard_report(void) {
 void add_key(uint8_t key)
 {
 #ifdef NKRO_ENABLE
-    if (keyboard_protocol && keyboard_nkro) {
+    if (keyboard_protocol && keymap_config.nkro) {
         add_key_bit(key);
         return;
     }
@@ -150,7 +154,7 @@ void add_key(uint8_t key)
 void del_key(uint8_t key)
 {
 #ifdef NKRO_ENABLE
-    if (keyboard_protocol && keyboard_nkro) {
+    if (keyboard_protocol && keymap_config.nkro) {
         del_key_bit(key);
         return;
     }
@@ -231,7 +235,7 @@ uint8_t has_anymod(void)
 uint8_t get_first_key(void)
 {
 #ifdef NKRO_ENABLE
-    if (keyboard_protocol && keyboard_nkro) {
+    if (keyboard_protocol && keymap_config.nkro) {
         uint8_t i = 0;
         for (; i < KEYBOARD_REPORT_BITS && !keyboard_report->nkro.bits[i]; i++)
             ;
diff --git a/tmk_core/common/avr/bootloader.c b/tmk_core/common/avr/bootloader.c
index fb9bf2d1c3..34db8d0b0a 100644
--- a/tmk_core/common/avr/bootloader.c
+++ b/tmk_core/common/avr/bootloader.c
@@ -1,6 +1,7 @@
 #include <stdint.h>
 #include <stdbool.h>
 #include <avr/io.h>
+#include <avr/eeprom.h>
 #include <avr/interrupt.h>
 #include <avr/wdt.h>
 #include <util/delay.h>
@@ -38,7 +39,7 @@
  *          |               |                        |               |
  *          =               =                        =               =
  *          |               | 32KB-4KB               |               | 128KB-8KB
- * 0x6000   +---------------+               0x1FC00  +---------------+
+ * 0x7000   +---------------+               0x1E000  +---------------+
  *          |  Bootloader   | 4KB                    |  Bootloader   | 8KB
  * 0x7FFF   +---------------+               0x1FFFF  +---------------+
  *
@@ -64,8 +65,8 @@
 #define BOOTLOADER_START    (FLASH_SIZE - BOOTLOADER_SIZE)
 
 
-/* 
- * Entering the Bootloader via Software 
+/*
+ * Entering the Bootloader via Software
  * http://www.fourwalledcubicle.com/files/LUFA/Doc/120730/html/_page__software_bootloader_start.html
  */
 #define BOOTLOADER_RESET_KEY 0xB007B007
@@ -89,6 +90,12 @@ void bootloader_jump(void) {
             _delay_ms(5);
         #endif
 
+        #ifdef BOOTLOADHID_BOOTLOADER
+            // force bootloadHID to stay in bootloader mode, so that it waits
+            // for a new firmware to be flashed
+            eeprom_write_byte((uint8_t *)1, 0x00);
+        #endif
+
         // watchdog reset
         reset_key = BOOTLOADER_RESET_KEY;
         wdt_enable(WDTO_250MS);
@@ -114,6 +121,11 @@ void bootloader_jump(void) {
     #endif
 }
 
+#ifdef __AVR_ATmega32A__
+// MCUSR is actually called MCUCSR in ATmega32A
+#define MCUSR MCUCSR
+#endif
+
 /* this runs before main() */
 void bootloader_jump_after_watchdog_reset(void) __attribute__ ((used, naked, section (".init3")));
 void bootloader_jump_after_watchdog_reset(void)
@@ -137,7 +149,7 @@ void bootloader_jump_after_watchdog_reset(void)
 #if 0
 /* Jumping To The Bootloader
  * http://www.pjrc.com/teensy/jump_to_bootloader.html
- * 
+ *
  * This method doen't work when using LUFA. idk why.
  * - needs to initialize more regisers or interrupt setting?
  */
diff --git a/tmk_core/common/avr/suspend.c b/tmk_core/common/avr/suspend.c
index 8a7272bbc5..0c81e83612 100644
--- a/tmk_core/common/avr/suspend.c
+++ b/tmk_core/common/avr/suspend.c
@@ -47,6 +47,7 @@ void suspend_idle(uint8_t time)
     sleep_disable();
 }
 
+#ifndef NO_SUSPEND_POWER_DOWN
 /* Power down MCU with watchdog timer
  * wdto: watchdog timer timeout defined in <avr/wdt.h>
  *          WDTO_15MS
@@ -61,6 +62,7 @@ void suspend_idle(uint8_t time)
  *          WDTO_8S
  */
 static uint8_t wdt_timeout = 0;
+
 static void power_down(uint8_t wdto)
 {
 #ifdef PROTOCOL_LUFA
@@ -98,19 +100,19 @@ static void power_down(uint8_t wdto)
     // Disable watchdog after sleep
     wdt_disable();
 }
+#endif
 
 void suspend_power_down(void)
 {
+#ifndef NO_SUSPEND_POWER_DOWN
     power_down(WDTO_15MS);
+#endif
 }
 
 __attribute__ ((weak)) void matrix_power_up(void) {}
 __attribute__ ((weak)) void matrix_power_down(void) {}
 bool suspend_wakeup_condition(void)
 {
-#ifdef BACKLIGHT_ENABLE
-    backlight_set(0);
-#endif
     matrix_power_up();
     matrix_scan();
     matrix_power_down();
@@ -126,10 +128,9 @@ void suspend_wakeup_init(void)
     // clear keyboard state
     clear_keyboard();
 #ifdef BACKLIGHT_ENABLE
-    backlight_set(0);
     backlight_init();
 #endif
-led_set(host_keyboard_leds());
+	led_set(host_keyboard_leds());
 }
 
 #ifndef NO_SUSPEND_POWER_DOWN
diff --git a/tmk_core/common/avr/timer.c b/tmk_core/common/avr/timer.c
index 292b41c3a6..369015200d 100644
--- a/tmk_core/common/avr/timer.c
+++ b/tmk_core/common/avr/timer.c
@@ -17,6 +17,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 #include <avr/io.h>
 #include <avr/interrupt.h>
+#include <util/atomic.h>
 #include <stdint.h>
 #include "timer_avr.h"
 #include "timer.h"
@@ -24,38 +25,47 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 // counter resolution 1ms
 // NOTE: union { uint32_t timer32; struct { uint16_t dummy; uint16_t timer16; }}
-volatile uint32_t timer_count = 0;
+volatile uint32_t timer_count;
 
 void timer_init(void)
 {
-    // Timer0 CTC mode
-    TCCR0A = 0x02;
-
 #if TIMER_PRESCALER == 1
-    TCCR0B = 0x01;
+    uint8_t prescaler = 0x01;
 #elif TIMER_PRESCALER == 8
-    TCCR0B = 0x02;
+    uint8_t prescaler = 0x02;
 #elif TIMER_PRESCALER == 64
-    TCCR0B = 0x03;
+    uint8_t prescaler = 0x03;
 #elif TIMER_PRESCALER == 256
-    TCCR0B = 0x04;
+    uint8_t prescaler = 0x04;
 #elif TIMER_PRESCALER == 1024
-    TCCR0B = 0x05;
+    uint8_t prescaler = 0x05;
 #else
 #   error "Timer prescaler value is NOT vaild."
 #endif
 
+#ifndef __AVR_ATmega32A__
+    // Timer0 CTC mode
+    TCCR0A = 0x02;
+
+    TCCR0B = prescaler;
+
     OCR0A = TIMER_RAW_TOP;
     TIMSK0 = (1<<OCIE0A);
+#else
+    // Timer0 CTC mode
+    TCCR0 = (1 << WGM01) | prescaler;
+
+    OCR0 = TIMER_RAW_TOP;
+    TIMSK = (1 << OCIE0);
+#endif
 }
 
 inline
 void timer_clear(void)
 {
-    uint8_t sreg = SREG;
-    cli();
+  ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
     timer_count = 0;
-    SREG = sreg;
+  }
 }
 
 inline
@@ -63,10 +73,9 @@ uint16_t timer_read(void)
 {
     uint32_t t;
 
-    uint8_t sreg = SREG;
-    cli();
-    t = timer_count;
-    SREG = sreg;
+    ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
+      t = timer_count;
+    }
 
     return (t & 0xFFFF);
 }
@@ -76,10 +85,9 @@ uint32_t timer_read32(void)
 {
     uint32_t t;
 
-    uint8_t sreg = SREG;
-    cli();
-    t = timer_count;
-    SREG = sreg;
+    ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
+      t = timer_count;
+    }
 
     return t;
 }
@@ -89,10 +97,9 @@ uint16_t timer_elapsed(uint16_t last)
 {
     uint32_t t;
 
-    uint8_t sreg = SREG;
-    cli();
-    t = timer_count;
-    SREG = sreg;
+    ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
+      t = timer_count;
+    }
 
     return TIMER_DIFF_16((t & 0xFFFF), last);
 }
@@ -102,16 +109,20 @@ uint32_t timer_elapsed32(uint32_t last)
 {
     uint32_t t;
 
-    uint8_t sreg = SREG;
-    cli();
-    t = timer_count;
-    SREG = sreg;
+    ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
+      t = timer_count;
+    }
 
     return TIMER_DIFF_32(t, last);
 }
 
 // excecuted once per 1ms.(excess for just timer count?)
-ISR(TIMER0_COMPA_vect)
+#ifndef __AVR_ATmega32A__
+#define TIMER_INTERRUPT_VECTOR TIMER0_COMPA_vect
+#else
+#define TIMER_INTERRUPT_VECTOR TIMER0_COMP_vect
+#endif
+ISR(TIMER_INTERRUPT_VECTOR, ISR_NOBLOCK)
 {
     timer_count++;
 }
diff --git a/tmk_core/common/avr/xprintf.S b/tmk_core/common/avr/xprintf.S
index 0cec70ce22..06434b98d9 100644
--- a/tmk_core/common/avr/xprintf.S
+++ b/tmk_core/common/avr/xprintf.S
@@ -1,500 +1,500 @@
-;---------------------------------------------------------------------------;

-; Extended itoa, puts, printf and atoi                     (C)ChaN, 2011

-;---------------------------------------------------------------------------;

-

-				// Base size is 152 bytes

-#define	CR_CRLF		0	// Convert \n to \r\n (+10 bytes)

-#define USE_XPRINTF	1	// Enable xprintf function (+194 bytes)

-#define USE_XSPRINTF	0	// Add xsprintf function (+78 bytes)

-#define USE_XFPRINTF	0	// Add xfprintf function (+54 bytes)

-#define USE_XATOI	0	// Enable xatoi function (+182 bytes)

-

-

-#if FLASHEND > 0x1FFFF

-#error xitoa module does not support 256K devices

-#endif

-

-.nolist

-#include <avr/io.h>	// Include device specific definitions.

-.list

-

-#ifdef SPM_PAGESIZE	// Recent devices have "lpm Rd,Z+" and "movw".

-.macro	_LPMI	reg

-	lpm	\reg, Z+

-.endm

-.macro	_MOVW	dh,dl, sh,sl

-	movw	\dl, \sl

-.endm

-#else			// Earlier devices do not have "lpm Rd,Z+" nor "movw".

-.macro	_LPMI	reg

-	lpm

-	mov	\reg, r0

-	adiw	ZL, 1

-.endm

-.macro	_MOVW	dh,dl, sh,sl

-	mov	\dl, \sl

-	mov	\dh, \sh

-.endm

-#endif

-

-

-

-;---------------------------------------------------------------------------

-; Stub function to forward to user output function

-;

-;Prototype: void xputc (char chr	// a character to be output

-;			);

-;Size: 12/12 words

-

-.section .bss

-.global xfunc_out	; xfunc_out must be initialized before using this module.

-xfunc_out:	.ds.w	1

-.section .text

-

-

-.func xputc

-.global xputc

-xputc:

-#if CR_CRLF

-	cpi	r24, 10		;LF --> CRLF

-	brne	1f		;

-	ldi	r24, 13		;

-	rcall	1f		;

-	ldi	r24, 10		;/

-1:

-#endif

-	push	ZH

-	push	ZL

-	lds	ZL, xfunc_out+0	;Pointer to the registered output function.

-	lds	ZH, xfunc_out+1	;/

-	sbiw	ZL, 0		;Skip if null

-	breq	2f		;/

-	icall

-2:	pop	ZL

-	pop	ZH

-	ret

-.endfunc

-

-

-

-;---------------------------------------------------------------------------

-; Direct ROM string output

-;

-;Prototype: void xputs (const char *str_p // rom string to be output

-;			);

-

-.func xputs

-.global xputs

-xputs:

-	_MOVW	ZH,ZL, r25,r24	; Z = pointer to rom string

-1:	_LPMI	r24

-	cpi	r24, 0

-	breq	2f

-	rcall	xputc

-	rjmp	1b

-2:	ret

-.endfunc

-

-

-;---------------------------------------------------------------------------

-; Extended direct numeral string output (32bit version)

-;

-;Prototype: void xitoa (long value,	// value to be output

-;                       char radix,	// radix

-;                       char width);	// minimum width

-;

-

-.func xitoa

-.global xitoa

-xitoa:

-				;r25:r22 = value, r20 = base, r18 = digits

-	clr	r31		;r31 = stack level

-	ldi	r30, ' '	;r30 = sign

-	ldi	r19, ' '	;r19 = filler

-	sbrs	r20, 7		;When base indicates signd format and the value

-	rjmp	0f		;is minus, add a '-'.

-	neg	r20		;

-	sbrs	r25, 7		;

-	rjmp	0f		;

-	ldi	r30, '-'	;

-	com	r22		;

-	com	r23		;

-	com	r24		;

-	com	r25		;

-	adc	r22, r1		;

-	adc	r23, r1		;

-	adc	r24, r1		;

-	adc	r25, r1		;/

-0:	sbrs	r18, 7		;When digits indicates zero filled,

-	rjmp	1f		;filler is '0'.

-	neg	r18		;

-	ldi	r19, '0'	;/

-				;----- string conversion loop

-1:	ldi	r21, 32		;r26 = r25:r22 % r20

-	clr	r26		;r25:r22 /= r20

-2:	lsl	r22		;

-	rol	r23		;

-	rol	r24		;

-	rol	r25		;

-	rol	r26		;

-	cp	r26, r20	;

-	brcs	3f		;

-	sub	r26, r20	;

-	inc	r22		;

-3:	dec	r21		;

-	brne	2b		;/

-	cpi	r26, 10		;r26 is a numeral digit '0'-'F'

-	brcs	4f		;

-	subi	r26, -7		;

-4:	subi	r26, -'0'	;/

-	push	r26		;Stack it

-	inc	r31		;/

-	cp	r22, r1		;Repeat until r25:r22 gets zero

-	cpc	r23, r1		;

-	cpc	r24, r1		;

-	cpc	r25, r1		;

-	brne	1b		;/

-

-	cpi	r30, '-'	;Minus sign if needed

-	brne	5f		;

-	push	r30		;

-	inc	r31		;/

-5:	cp	r31, r18	;Filler

-	brcc	6f		;

-	push	r19		;

-	inc	r31		;

-	rjmp	5b		;/

-

-6:	pop	r24		;Flush stacked digits and exit

-	rcall	xputc		;

-	dec	r31		;

-	brne	6b		;/

-

-	ret

-.endfunc

-

-

-

-;---------------------------------------------------------------------------;

-; Formatted string output (16/32bit version)

-;

-;Prototype:

-; void __xprintf (const char *format_p, ...);

-; void __xsprintf(char*, const char *format_p, ...);

-; void __xfprintf(void(*func)(char), const char *format_p, ...);

-;

-

-#if USE_XPRINTF

-

-.func xvprintf

-xvprintf:

-	ld	ZL, Y+		;Z = pointer to format string

-	ld	ZH, Y+		;/

-

-0:	_LPMI	r24		;Get a format char

-	cpi	r24, 0		;End of format string?

-	breq	90f		;/

-	cpi	r24, '%'	;Is format?

-	breq	20f		;/

-1:	rcall	xputc		;Put a normal character

-	rjmp	0b		;/

-90:	ret

-

-20:	ldi	r18, 0		;r18: digits

-	clt			;T: filler

-	_LPMI	r21		;Get flags

-	cpi	r21, '%'	;Is a %?

-	breq	1b		;/

-	cpi	r21, '0'	;Zero filled?

-	brne	23f		;

-	set			;/

-22:	_LPMI	r21		;Get width

-23:	cpi	r21, '9'+1	;

-	brcc	24f		;

-	subi	r21, '0'	;

-	brcs	90b		;

-	lsl	r18		;

-	mov	r0, r18		;

-	lsl	r18		;

-	lsl	r18		;

-	add	r18, r0		;

-	add	r18, r21	;

-	rjmp	22b		;/

-

-24:	brtc	25f		;get value (low word)

-	neg	r18		;

-25:	ld	r24, Y+		;

-	ld	r25, Y+		;/

-	cpi	r21, 'c'	;Is type character?

-	breq	1b		;/

-	cpi	r21, 's'	;Is type RAM string?

-	breq	50f		;/

-	cpi	r21, 'S'	;Is type ROM string?

-	breq	60f		;/

-	_MOVW	r23,r22,r25,r24	;r25:r22 = value

-	clr	r24		;

-	clr	r25		;

-	clt			;/

-	cpi	r21, 'l'	;Is long int?

-	brne	26f		;

-	ld	r24, Y+		;get value (high word)

-	ld	r25, Y+		;

-	set			;

-	_LPMI	r21		;/

-26:	cpi	r21, 'd'	;Is type signed decimal?

-	brne	27f		;/

-	ldi	r20, -10	;

-	brts	40f		;

-	sbrs	r23, 7		;

-	rjmp	40f		;

-	ldi	r24, -1		;

-	ldi	r25, -1		;

-	rjmp	40f		;/

-27:	cpi	r21, 'u'	;Is type unsigned decimal?

-	ldi	r20, 10		;

-	breq	40f		;/

-	cpi	r21, 'X'	;Is type hexdecimal?

-	ldi	r20, 16		;

-	breq	40f		;/

-	cpi	r21, 'b'	;Is type binary?

-	ldi	r20, 2		;

-	breq	40f		;/

-	ret			;abort

-40:	push	ZH		;Output the value

-	push	ZL		;

-	rcall	xitoa		;

-42:	pop	ZL		;

-	pop	ZH		;

-	rjmp	0b		;/

-

-50:	push	ZH		;Put a string on the RAM

-	push	ZL

-	_MOVW	ZH,ZL, r25,r24

-51:	ld	r24, Z+

-	cpi	r24, 0

-	breq	42b

-	rcall	xputc

-	rjmp	51b

-

-60:	push	ZH		;Put a string on the ROM

-	push	ZL

-	rcall	xputs

-	rjmp	42b

-.endfunc

-

-

-.func __xprintf

-.global __xprintf

-__xprintf:

-	push	YH

-	push	YL

-	in	YL, _SFR_IO_ADDR(SPL)

-#ifdef SPH

-	in	YH, _SFR_IO_ADDR(SPH)

-#else

-	clr	YH

-#endif

-	adiw	YL, 5		;Y = pointer to arguments

-	rcall	xvprintf

-	pop	YL

-	pop	YH

-	ret

-.endfunc

-

-

-#if USE_XSPRINTF

-

-.func __xsprintf

-putram:

-	_MOVW	ZH,ZL, r15,r14

-	st	Z+, r24

-	_MOVW	r15,r14, ZH,ZL

-	ret

-.global __xsprintf

-__xsprintf:

-	push	YH

-	push	YL

-	in	YL, _SFR_IO_ADDR(SPL)

-#ifdef SPH

-	in	YH, _SFR_IO_ADDR(SPH)

-#else

-	clr	YH

-#endif

-	adiw	YL, 5		;Y = pointer to arguments

-	lds	ZL, xfunc_out+0	;Save registered output function

-	lds	ZH, xfunc_out+1	;

-	push	ZL		;

-	push	ZH		;/

-	ldi	ZL, lo8(pm(putram));Set local output function

-	ldi	ZH, hi8(pm(putram));

-	sts	xfunc_out+0, ZL	;

-	sts	xfunc_out+1, ZH	;/

-	push	r15		;Initialize pointer to string buffer

-	push	r14		;

-	ld	r14, Y+		;

-	ld	r15, Y+		;/

-	rcall	xvprintf

-	_MOVW	ZH,ZL, r15,r14	;Terminate string

-	st	Z, r1		;

-	pop	r14		;

-	pop	r15		;/

-	pop	ZH		;Restore registered output function

-	pop	ZL		;

-	sts	xfunc_out+0, ZL	;

-	sts	xfunc_out+1, ZH	;/

-	pop	YL

-	pop	YH

-	ret

-.endfunc

-#endif

-

-

-#if USE_XFPRINTF

-.func __xfprintf

-.global __xfprintf

-__xfprintf:

-	push	YH

-	push	YL

-	in	YL, _SFR_IO_ADDR(SPL)

-#ifdef SPH

-	in	YH, _SFR_IO_ADDR(SPH)

-#else

-	clr	YH

-#endif

-	adiw	YL, 5		;Y = pointer to arguments

-	lds	ZL, xfunc_out+0	;Save registered output function

-	lds	ZH, xfunc_out+1	;

-	push	ZL		;

-	push	ZH		;/

-	ld	ZL, Y+		;Set output function

-	ld	ZH, Y+		;

-	sts	xfunc_out+0, ZL	;

-	sts	xfunc_out+1, ZH	;/

-	rcall	xvprintf

-	pop	ZH		;Restore registered output function

-	pop	ZL		;

-	sts	xfunc_out+0, ZL	;

-	sts	xfunc_out+1, ZH	;/

-	pop	YL

-	pop	YH

-	ret

-.endfunc

-#endif

-

-#endif

-

-

-

-;---------------------------------------------------------------------------

-; Extended numeral string input

-;

-;Prototype:

-; char xatoi (           /* 1: Successful, 0: Failed */

-;      const char **str, /* pointer to pointer to source string */

-;      long *res         /* result */

-; );

-;

-

-

-#if USE_XATOI

-.func xatoi

-.global xatoi

-xatoi:

-	_MOVW	r1, r0, r23, r22

-	_MOVW	XH, XL, r25, r24

-	ld	ZL, X+

-	ld	ZH, X+

-	clr	r18		;r21:r18 = 0;

-	clr	r19		;

-	clr	r20		;

-	clr	r21		;/

-	clt			;T = 0;

-

-	ldi	r25, 10		;r25 = 10;

-	rjmp	41f		;/

-40:	adiw	ZL, 1		;Z++;

-41:	ld	r22, Z		;r22 = *Z;

-	cpi	r22, ' '	;if(r22 == ' ') continue

-	breq	40b		;/

-	brcs	70f		;if(r22 < ' ') error;

-	cpi	r22, '-'	;if(r22 == '-') {

-	brne	42f		; T = 1;

-	set			; continue;

-	rjmp	40b		;}

-42:	cpi	r22, '9'+1	;if(r22 > '9') error;

-	brcc	70f		;/

-	cpi	r22, '0'	;if(r22 < '0') error;

-	brcs	70f		;/

-	brne	51f		;if(r22 > '0') cv_start;

-	ldi	r25, 8		;r25 = 8;

-	adiw	ZL, 1		;r22 = *(++Z);

-	ld	r22, Z		;/

-	cpi	r22, ' '+1	;if(r22 <= ' ') exit;

-	brcs	80f		;/

-	cpi	r22, 'b'	;if(r22 == 'b') {

-	brne	43f		; r25 = 2;

-	ldi	r25, 2		; cv_start;

-	rjmp	50f		;}

-43:	cpi	r22, 'x'	;if(r22 != 'x') error;

-	brne	51f		;/

-	ldi	r25, 16		;r25 = 16;

-

-50:	adiw	ZL, 1		;Z++;

-	ld	r22, Z		;r22 = *Z;

-51:	cpi	r22, ' '+1	;if(r22 <= ' ') break;

-	brcs	80f		;/

-	cpi	r22, 'a'	;if(r22 >= 'a') r22 =- 0x20;

-	brcs	52f		;

-	subi	r22, 0x20	;/

-52:	subi	r22, '0'	;if((r22 -= '0') < 0) error;

-	brcs	70f		;/

-	cpi	r22, 10		;if(r22 >= 10) {

-	brcs	53f		; r22 -= 7;

-	subi	r22, 7		; if(r22 < 10) 

-	cpi	r22, 10		;

-	brcs	70f		;}

-53:	cp	r22, r25	;if(r22 >= r25) error;

-	brcc	70f		;/

-60:	ldi	r24, 33		;r21:r18 *= r25;

-	sub	r23, r23	;

-61:	brcc	62f		;

-	add	r23, r25	;

-62:	lsr	r23		;

-	ror	r21		;

-	ror	r20		;

-	ror	r19		;

-	ror	r18		;

-	dec	r24		;

-	brne	61b		;/

-	add	r18, r22	;r21:r18 += r22;

-	adc	r19, r24	;

-	adc	r20, r24	;

-	adc	r21, r24	;/

-	rjmp	50b		;repeat

-

-70:	ldi	r24, 0

-	rjmp	81f

-80:	ldi	r24, 1

-81:	brtc	82f

-	clr	r22

-	com	r18

-	com	r19

-	com	r20

-	com	r21

-	adc	r18, r22

-	adc	r19, r22

-	adc	r20, r22

-	adc	r21, r22

-82:	st	-X, ZH

-	st	-X, ZL

-	_MOVW	XH, XL, r1, r0

-	st	X+, r18

-	st	X+, r19

-	st	X+, r20

-	st	X+, r21

-	clr	r1

-	ret

-.endfunc

-#endif

-

-

+;---------------------------------------------------------------------------;
+; Extended itoa, puts, printf and atoi                     (C)ChaN, 2011
+;---------------------------------------------------------------------------;
+
+				// Base size is 152 bytes
+#define	CR_CRLF		0	// Convert \n to \r\n (+10 bytes)
+#define USE_XPRINTF	1	// Enable xprintf function (+194 bytes)
+#define USE_XSPRINTF	0	// Add xsprintf function (+78 bytes)
+#define USE_XFPRINTF	0	// Add xfprintf function (+54 bytes)
+#define USE_XATOI	0	// Enable xatoi function (+182 bytes)
+
+
+#if FLASHEND > 0x1FFFF
+#error xitoa module does not support 256K devices
+#endif
+
+.nolist
+#include <avr/io.h>	// Include device specific definitions.
+.list
+
+#ifdef SPM_PAGESIZE	// Recent devices have "lpm Rd,Z+" and "movw".
+.macro	_LPMI	reg
+	lpm	\reg, Z+
+.endm
+.macro	_MOVW	dh,dl, sh,sl
+	movw	\dl, \sl
+.endm
+#else			// Earlier devices do not have "lpm Rd,Z+" nor "movw".
+.macro	_LPMI	reg
+	lpm
+	mov	\reg, r0
+	adiw	ZL, 1
+.endm
+.macro	_MOVW	dh,dl, sh,sl
+	mov	\dl, \sl
+	mov	\dh, \sh
+.endm
+#endif
+
+
+
+;---------------------------------------------------------------------------
+; Stub function to forward to user output function
+;
+;Prototype: void xputc (char chr	// a character to be output
+;			);
+;Size: 12/12 words
+
+.section .bss
+.global xfunc_out	; xfunc_out must be initialized before using this module.
+xfunc_out:	.ds.w	1
+.section .text
+
+
+.func xputc
+.global xputc
+xputc:
+#if CR_CRLF
+	cpi	r24, 10		;LF --> CRLF
+	brne	1f		;
+	ldi	r24, 13		;
+	rcall	1f		;
+	ldi	r24, 10		;/
+1:
+#endif
+	push	ZH
+	push	ZL
+	lds	ZL, xfunc_out+0	;Pointer to the registered output function.
+	lds	ZH, xfunc_out+1	;/
+	sbiw	ZL, 0		;Skip if null
+	breq	2f		;/
+	icall
+2:	pop	ZL
+	pop	ZH
+	ret
+.endfunc
+
+
+
+;---------------------------------------------------------------------------
+; Direct ROM string output
+;
+;Prototype: void xputs (const char *str_p // rom string to be output
+;			);
+
+.func xputs
+.global xputs
+xputs:
+	_MOVW	ZH,ZL, r25,r24	; Z = pointer to rom string
+1:	_LPMI	r24
+	cpi	r24, 0
+	breq	2f
+	rcall	xputc
+	rjmp	1b
+2:	ret
+.endfunc
+
+
+;---------------------------------------------------------------------------
+; Extended direct numeral string output (32bit version)
+;
+;Prototype: void xitoa (long value,	// value to be output
+;                       char radix,	// radix
+;                       char width);	// minimum width
+;
+
+.func xitoa
+.global xitoa
+xitoa:
+				;r25:r22 = value, r20 = base, r18 = digits
+	clr	r31		;r31 = stack level
+	ldi	r30, ' '	;r30 = sign
+	ldi	r19, ' '	;r19 = filler
+	sbrs	r20, 7		;When base indicates signd format and the value
+	rjmp	0f		;is minus, add a '-'.
+	neg	r20		;
+	sbrs	r25, 7		;
+	rjmp	0f		;
+	ldi	r30, '-'	;
+	com	r22		;
+	com	r23		;
+	com	r24		;
+	com	r25		;
+	adc	r22, r1		;
+	adc	r23, r1		;
+	adc	r24, r1		;
+	adc	r25, r1		;/
+0:	sbrs	r18, 7		;When digits indicates zero filled,
+	rjmp	1f		;filler is '0'.
+	neg	r18		;
+	ldi	r19, '0'	;/
+				;----- string conversion loop
+1:	ldi	r21, 32		;r26 = r25:r22 % r20
+	clr	r26		;r25:r22 /= r20
+2:	lsl	r22		;
+	rol	r23		;
+	rol	r24		;
+	rol	r25		;
+	rol	r26		;
+	cp	r26, r20	;
+	brcs	3f		;
+	sub	r26, r20	;
+	inc	r22		;
+3:	dec	r21		;
+	brne	2b		;/
+	cpi	r26, 10		;r26 is a numeral digit '0'-'F'
+	brcs	4f		;
+	subi	r26, -7		;
+4:	subi	r26, -'0'	;/
+	push	r26		;Stack it
+	inc	r31		;/
+	cp	r22, r1		;Repeat until r25:r22 gets zero
+	cpc	r23, r1		;
+	cpc	r24, r1		;
+	cpc	r25, r1		;
+	brne	1b		;/
+
+	cpi	r30, '-'	;Minus sign if needed
+	brne	5f		;
+	push	r30		;
+	inc	r31		;/
+5:	cp	r31, r18	;Filler
+	brcc	6f		;
+	push	r19		;
+	inc	r31		;
+	rjmp	5b		;/
+
+6:	pop	r24		;Flush stacked digits and exit
+	rcall	xputc		;
+	dec	r31		;
+	brne	6b		;/
+
+	ret
+.endfunc
+
+
+
+;---------------------------------------------------------------------------;
+; Formatted string output (16/32bit version)
+;
+;Prototype:
+; void __xprintf (const char *format_p, ...);
+; void __xsprintf(char*, const char *format_p, ...);
+; void __xfprintf(void(*func)(char), const char *format_p, ...);
+;
+
+#if USE_XPRINTF
+
+.func xvprintf
+xvprintf:
+	ld	ZL, Y+		;Z = pointer to format string
+	ld	ZH, Y+		;/
+
+0:	_LPMI	r24		;Get a format char
+	cpi	r24, 0		;End of format string?
+	breq	90f		;/
+	cpi	r24, '%'	;Is format?
+	breq	20f		;/
+1:	rcall	xputc		;Put a normal character
+	rjmp	0b		;/
+90:	ret
+
+20:	ldi	r18, 0		;r18: digits
+	clt			;T: filler
+	_LPMI	r21		;Get flags
+	cpi	r21, '%'	;Is a %?
+	breq	1b		;/
+	cpi	r21, '0'	;Zero filled?
+	brne	23f		;
+	set			;/
+22:	_LPMI	r21		;Get width
+23:	cpi	r21, '9'+1	;
+	brcc	24f		;
+	subi	r21, '0'	;
+	brcs	90b		;
+	lsl	r18		;
+	mov	r0, r18		;
+	lsl	r18		;
+	lsl	r18		;
+	add	r18, r0		;
+	add	r18, r21	;
+	rjmp	22b		;/
+
+24:	brtc	25f		;get value (low word)
+	neg	r18		;
+25:	ld	r24, Y+		;
+	ld	r25, Y+		;/
+	cpi	r21, 'c'	;Is type character?
+	breq	1b		;/
+	cpi	r21, 's'	;Is type RAM string?
+	breq	50f		;/
+	cpi	r21, 'S'	;Is type ROM string?
+	breq	60f		;/
+	_MOVW	r23,r22,r25,r24	;r25:r22 = value
+	clr	r24		;
+	clr	r25		;
+	clt			;/
+	cpi	r21, 'l'	;Is long int?
+	brne	26f		;
+	ld	r24, Y+		;get value (high word)
+	ld	r25, Y+		;
+	set			;
+	_LPMI	r21		;/
+26:	cpi	r21, 'd'	;Is type signed decimal?
+	brne	27f		;/
+	ldi	r20, -10	;
+	brts	40f		;
+	sbrs	r23, 7		;
+	rjmp	40f		;
+	ldi	r24, -1		;
+	ldi	r25, -1		;
+	rjmp	40f		;/
+27:	cpi	r21, 'u'	;Is type unsigned decimal?
+	ldi	r20, 10		;
+	breq	40f		;/
+	cpi	r21, 'X'	;Is type hexdecimal?
+	ldi	r20, 16		;
+	breq	40f		;/
+	cpi	r21, 'b'	;Is type binary?
+	ldi	r20, 2		;
+	breq	40f		;/
+	ret			;abort
+40:	push	ZH		;Output the value
+	push	ZL		;
+	rcall	xitoa		;
+42:	pop	ZL		;
+	pop	ZH		;
+	rjmp	0b		;/
+
+50:	push	ZH		;Put a string on the RAM
+	push	ZL
+	_MOVW	ZH,ZL, r25,r24
+51:	ld	r24, Z+
+	cpi	r24, 0
+	breq	42b
+	rcall	xputc
+	rjmp	51b
+
+60:	push	ZH		;Put a string on the ROM
+	push	ZL
+	rcall	xputs
+	rjmp	42b
+.endfunc
+
+
+.func __xprintf
+.global __xprintf
+__xprintf:
+	push	YH
+	push	YL
+	in	YL, _SFR_IO_ADDR(SPL)
+#ifdef SPH
+	in	YH, _SFR_IO_ADDR(SPH)
+#else
+	clr	YH
+#endif
+	adiw	YL, 5		;Y = pointer to arguments
+	rcall	xvprintf
+	pop	YL
+	pop	YH
+	ret
+.endfunc
+
+
+#if USE_XSPRINTF
+
+.func __xsprintf
+putram:
+	_MOVW	ZH,ZL, r15,r14
+	st	Z+, r24
+	_MOVW	r15,r14, ZH,ZL
+	ret
+.global __xsprintf
+__xsprintf:
+	push	YH
+	push	YL
+	in	YL, _SFR_IO_ADDR(SPL)
+#ifdef SPH
+	in	YH, _SFR_IO_ADDR(SPH)
+#else
+	clr	YH
+#endif
+	adiw	YL, 5		;Y = pointer to arguments
+	lds	ZL, xfunc_out+0	;Save registered output function
+	lds	ZH, xfunc_out+1	;
+	push	ZL		;
+	push	ZH		;/
+	ldi	ZL, lo8(pm(putram));Set local output function
+	ldi	ZH, hi8(pm(putram));
+	sts	xfunc_out+0, ZL	;
+	sts	xfunc_out+1, ZH	;/
+	push	r15		;Initialize pointer to string buffer
+	push	r14		;
+	ld	r14, Y+		;
+	ld	r15, Y+		;/
+	rcall	xvprintf
+	_MOVW	ZH,ZL, r15,r14	;Terminate string
+	st	Z, r1		;
+	pop	r14		;
+	pop	r15		;/
+	pop	ZH		;Restore registered output function
+	pop	ZL		;
+	sts	xfunc_out+0, ZL	;
+	sts	xfunc_out+1, ZH	;/
+	pop	YL
+	pop	YH
+	ret
+.endfunc
+#endif
+
+
+#if USE_XFPRINTF
+.func __xfprintf
+.global __xfprintf
+__xfprintf:
+	push	YH
+	push	YL
+	in	YL, _SFR_IO_ADDR(SPL)
+#ifdef SPH
+	in	YH, _SFR_IO_ADDR(SPH)
+#else
+	clr	YH
+#endif
+	adiw	YL, 5		;Y = pointer to arguments
+	lds	ZL, xfunc_out+0	;Save registered output function
+	lds	ZH, xfunc_out+1	;
+	push	ZL		;
+	push	ZH		;/
+	ld	ZL, Y+		;Set output function
+	ld	ZH, Y+		;
+	sts	xfunc_out+0, ZL	;
+	sts	xfunc_out+1, ZH	;/
+	rcall	xvprintf
+	pop	ZH		;Restore registered output function
+	pop	ZL		;
+	sts	xfunc_out+0, ZL	;
+	sts	xfunc_out+1, ZH	;/
+	pop	YL
+	pop	YH
+	ret
+.endfunc
+#endif
+
+#endif
+
+
+
+;---------------------------------------------------------------------------
+; Extended numeral string input
+;
+;Prototype:
+; char xatoi (           /* 1: Successful, 0: Failed */
+;      const char **str, /* pointer to pointer to source string */
+;      long *res         /* result */
+; );
+;
+
+
+#if USE_XATOI
+.func xatoi
+.global xatoi
+xatoi:
+	_MOVW	r1, r0, r23, r22
+	_MOVW	XH, XL, r25, r24
+	ld	ZL, X+
+	ld	ZH, X+
+	clr	r18		;r21:r18 = 0;
+	clr	r19		;
+	clr	r20		;
+	clr	r21		;/
+	clt			;T = 0;
+
+	ldi	r25, 10		;r25 = 10;
+	rjmp	41f		;/
+40:	adiw	ZL, 1		;Z++;
+41:	ld	r22, Z		;r22 = *Z;
+	cpi	r22, ' '	;if(r22 == ' ') continue
+	breq	40b		;/
+	brcs	70f		;if(r22 < ' ') error;
+	cpi	r22, '-'	;if(r22 == '-') {
+	brne	42f		; T = 1;
+	set			; continue;
+	rjmp	40b		;}
+42:	cpi	r22, '9'+1	;if(r22 > '9') error;
+	brcc	70f		;/
+	cpi	r22, '0'	;if(r22 < '0') error;
+	brcs	70f		;/
+	brne	51f		;if(r22 > '0') cv_start;
+	ldi	r25, 8		;r25 = 8;
+	adiw	ZL, 1		;r22 = *(++Z);
+	ld	r22, Z		;/
+	cpi	r22, ' '+1	;if(r22 <= ' ') exit;
+	brcs	80f		;/
+	cpi	r22, 'b'	;if(r22 == 'b') {
+	brne	43f		; r25 = 2;
+	ldi	r25, 2		; cv_start;
+	rjmp	50f		;}
+43:	cpi	r22, 'x'	;if(r22 != 'x') error;
+	brne	51f		;/
+	ldi	r25, 16		;r25 = 16;
+
+50:	adiw	ZL, 1		;Z++;
+	ld	r22, Z		;r22 = *Z;
+51:	cpi	r22, ' '+1	;if(r22 <= ' ') break;
+	brcs	80f		;/
+	cpi	r22, 'a'	;if(r22 >= 'a') r22 =- 0x20;
+	brcs	52f		;
+	subi	r22, 0x20	;/
+52:	subi	r22, '0'	;if((r22 -= '0') < 0) error;
+	brcs	70f		;/
+	cpi	r22, 10		;if(r22 >= 10) {
+	brcs	53f		; r22 -= 7;
+	subi	r22, 7		; if(r22 < 10) 
+	cpi	r22, 10		;
+	brcs	70f		;}
+53:	cp	r22, r25	;if(r22 >= r25) error;
+	brcc	70f		;/
+60:	ldi	r24, 33		;r21:r18 *= r25;
+	sub	r23, r23	;
+61:	brcc	62f		;
+	add	r23, r25	;
+62:	lsr	r23		;
+	ror	r21		;
+	ror	r20		;
+	ror	r19		;
+	ror	r18		;
+	dec	r24		;
+	brne	61b		;/
+	add	r18, r22	;r21:r18 += r22;
+	adc	r19, r24	;
+	adc	r20, r24	;
+	adc	r21, r24	;/
+	rjmp	50b		;repeat
+
+70:	ldi	r24, 0
+	rjmp	81f
+80:	ldi	r24, 1
+81:	brtc	82f
+	clr	r22
+	com	r18
+	com	r19
+	com	r20
+	com	r21
+	adc	r18, r22
+	adc	r19, r22
+	adc	r20, r22
+	adc	r21, r22
+82:	st	-X, ZH
+	st	-X, ZL
+	_MOVW	XH, XL, r1, r0
+	st	X+, r18
+	st	X+, r19
+	st	X+, r20
+	st	X+, r21
+	clr	r1
+	ret
+.endfunc
+#endif
+
+
diff --git a/tmk_core/common/avr/xprintf.h b/tmk_core/common/avr/xprintf.h
index 59c6f25312..08d9f93a0c 100644
--- a/tmk_core/common/avr/xprintf.h
+++ b/tmk_core/common/avr/xprintf.h
@@ -1,111 +1,111 @@
-/*---------------------------------------------------------------------------

-   Extended itoa, puts and printf                    (C)ChaN, 2011

------------------------------------------------------------------------------*/

-

-#ifndef XPRINTF_H

-#define XPRINTF_H

-

-#include <inttypes.h>

-#include <avr/pgmspace.h>

-

-#ifdef __cplusplus

-extern "C" {

-#endif

-

-extern void (*xfunc_out)(uint8_t);

-#define xdev_out(func) xfunc_out = (void(*)(uint8_t))(func)

-

-/* This is a pointer to user defined output function. It must be initialized

-   before using this modle.

-*/

-

-void xputc(char chr);

-

-/* This is a stub function to forward outputs to user defined output function.

-   All outputs from this module are output via this function.

-*/

-

-

-/*-----------------------------------------------------------------------------*/

-void xputs(const char *string_p);

-

-/*  The string placed in the ROM is forwarded to xputc() directly.

-*/

-

-

-/*-----------------------------------------------------------------------------*/

-void xitoa(long value, char radix, char width);

-

-/* Extended itoa().

-

-      value  radix  width   output

-        100     10      6   "   100"

-        100     10     -6   "000100"

-        100     10      0   "100"

- 4294967295     10      0   "4294967295"

- 4294967295    -10      0   "-1"

-     655360     16     -8   "000A0000"

-       1024     16      0   "400"

-       0x55      2     -8   "01010101"

-*/

-

-

-/*-----------------------------------------------------------------------------*/

-#define xprintf(format, ...)            __xprintf(PSTR(format), ##__VA_ARGS__)

-#define xsprintf(str, format, ...)      __xsprintf(str, PSTR(format), ##__VA_ARGS__)

-#define xfprintf(func, format, ...)     __xfprintf(func, PSTR(format), ##__VA_ARGS__)

-

-void __xprintf(const char *format_p, ...);	/* Send formatted string to the registered device */

-void __xsprintf(char*, const char *format_p, ...);	/* Put formatted string to the memory */

-void __xfprintf(void(*func)(uint8_t), const char *format_p, ...); /* Send formatted string to the specified device */

-

-/* Format string is placed in the ROM. The format flags is similar to printf().

-

-   %[flag][width][size]type

-

-   flag

-     A '0' means filled with '0' when output is shorter than width.

-     ' ' is used in default. This is effective only numeral type.

-   width

-     Minimum width in decimal number. This is effective only numeral type.

-     Default width is zero.

-   size

-     A 'l' means the argument is long(32bit). Default is short(16bit).

-     This is effective only numeral type.

-   type

-     'c' : Character, argument is the value

-     's' : String placed on the RAM, argument is the pointer

-     'S' : String placed on the ROM, argument is the pointer

-     'd' : Signed decimal, argument is the value

-     'u' : Unsigned decimal, argument is the value

-     'X' : Hexdecimal, argument is the value

-     'b' : Binary, argument is the value

-     '%' : '%'

-

-*/

-

-

-/*-----------------------------------------------------------------------------*/

-char xatoi(char **str, long *ret);

-

-/* Get value of the numeral string. 

-

-  str

-    Pointer to pointer to source string

-

-    "0b11001010" binary

-    "0377" octal

-    "0xff800" hexdecimal

-    "1250000" decimal

-    "-25000" decimal

-

-  ret

-    Pointer to return value

-*/

-

-#ifdef __cplusplus

-}

-#endif

-

-#endif

-

+/*---------------------------------------------------------------------------
+   Extended itoa, puts and printf                    (C)ChaN, 2011
+-----------------------------------------------------------------------------*/
+
+#ifndef XPRINTF_H
+#define XPRINTF_H
+
+#include <inttypes.h>
+#include <avr/pgmspace.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern void (*xfunc_out)(uint8_t);
+#define xdev_out(func) xfunc_out = (void(*)(uint8_t))(func)
+
+/* This is a pointer to user defined output function. It must be initialized
+   before using this modle.
+*/
+
+void xputc(char chr);
+
+/* This is a stub function to forward outputs to user defined output function.
+   All outputs from this module are output via this function.
+*/
+
+
+/*-----------------------------------------------------------------------------*/
+void xputs(const char *string_p);
+
+/*  The string placed in the ROM is forwarded to xputc() directly.
+*/
+
+
+/*-----------------------------------------------------------------------------*/
+void xitoa(long value, char radix, char width);
+
+/* Extended itoa().
+
+      value  radix  width   output
+        100     10      6   "   100"
+        100     10     -6   "000100"
+        100     10      0   "100"
+ 4294967295     10      0   "4294967295"
+ 4294967295    -10      0   "-1"
+     655360     16     -8   "000A0000"
+       1024     16      0   "400"
+       0x55      2     -8   "01010101"
+*/
+
+
+/*-----------------------------------------------------------------------------*/
+#define xprintf(format, ...)            __xprintf(PSTR(format), ##__VA_ARGS__)
+#define xsprintf(str, format, ...)      __xsprintf(str, PSTR(format), ##__VA_ARGS__)
+#define xfprintf(func, format, ...)     __xfprintf(func, PSTR(format), ##__VA_ARGS__)
+
+void __xprintf(const char *format_p, ...);	/* Send formatted string to the registered device */
+// void __xsprintf(char*, const char *format_p, ...);	/* Put formatted string to the memory */
+// void __xfprintf(void(*func)(uint8_t), const char *format_p, ...); /* Send formatted string to the specified device */
+
+/* Format string is placed in the ROM. The format flags is similar to printf().
+
+   %[flag][width][size]type
+
+   flag
+     A '0' means filled with '0' when output is shorter than width.
+     ' ' is used in default. This is effective only numeral type.
+   width
+     Minimum width in decimal number. This is effective only numeral type.
+     Default width is zero.
+   size
+     A 'l' means the argument is long(32bit). Default is short(16bit).
+     This is effective only numeral type.
+   type
+     'c' : Character, argument is the value
+     's' : String placed on the RAM, argument is the pointer
+     'S' : String placed on the ROM, argument is the pointer
+     'd' : Signed decimal, argument is the value
+     'u' : Unsigned decimal, argument is the value
+     'X' : Hexdecimal, argument is the value
+     'b' : Binary, argument is the value
+     '%' : '%'
+
+*/
+
+
+/*-----------------------------------------------------------------------------*/
+char xatoi(char **str, long *ret);
+
+/* Get value of the numeral string.
+
+  str
+    Pointer to pointer to source string
+
+    "0b11001010" binary
+    "0377" octal
+    "0xff800" hexdecimal
+    "1250000" decimal
+    "-25000" decimal
+
+  ret
+    Pointer to return value
+*/
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
diff --git a/tmk_core/common/backlight.c b/tmk_core/common/backlight.c
index c9e8fd3fd2..0e0ad2d154 100644
--- a/tmk_core/common/backlight.c
+++ b/tmk_core/common/backlight.c
@@ -36,9 +36,9 @@ void backlight_increase(void)
     if(backlight_config.level < BACKLIGHT_LEVELS)
     {
         backlight_config.level++;
-        backlight_config.enable = 1;
-        eeconfig_update_backlight(backlight_config.raw);
     }
+    backlight_config.enable = 1;
+    eeconfig_update_backlight(backlight_config.raw);
     dprintf("backlight increase: %u\n", backlight_config.level);
     backlight_set(backlight_config.level);
 }
diff --git a/tmk_core/common/bootmagic.c b/tmk_core/common/bootmagic.c
index 6730a2a4aa..2c6bcbae56 100644
--- a/tmk_core/common/bootmagic.c
+++ b/tmk_core/common/bootmagic.c
@@ -83,10 +83,6 @@ void bootmagic(void)
     }
     eeconfig_update_keymap(keymap_config.raw);
 
-#ifdef NKRO_ENABLE
-    keyboard_nkro = keymap_config.nkro;
-#endif
-
     /* default layer */
     uint8_t default_layer = 0;
     if (bootmagic_scan_keycode(BOOTMAGIC_KEY_DEFAULT_LAYER_0)) { default_layer |= (1<<0); }
diff --git a/tmk_core/common/command.c b/tmk_core/common/command.c
index 084c9fe155..f79d5a257b 100644
--- a/tmk_core/common/command.c
+++ b/tmk_core/common/command.c
@@ -34,6 +34,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #include "command.h"
 #include "backlight.h"
 #include "quantum.h"
+#include "version.h"
 
 #ifdef MOUSEKEY_ENABLE
 #include "mousekey.h"
@@ -180,7 +181,7 @@ static void print_version(void)
     print("VID: " STR(VENDOR_ID) "(" STR(MANUFACTURER) ") "
           "PID: " STR(PRODUCT_ID) "(" STR(PRODUCT) ") "
           "VER: " STR(DEVICE_VER) "\n");
-    print("BUILD: " STR(VERSION) " (" __TIME__ " " __DATE__ ")\n");
+    print("BUILD: " STR(QMK_VERSION) " (" __TIME__ " " __DATE__ ")\n");
 
     /* build options */
     print("OPTIONS:"
@@ -234,10 +235,13 @@ static void print_status(void)
     print("\n\t- Status -\n");
 
     print_val_hex8(host_keyboard_leds());
+#ifndef PROTOCOL_VUSB
+    // these aren't set on the V-USB protocol, so we just ignore them for now
     print_val_hex8(keyboard_protocol);
     print_val_hex8(keyboard_idle);
+#endif
 #ifdef NKRO_ENABLE
-    print_val_hex8(keyboard_nkro);
+    print_val_hex8(keymap_config.nkro);
 #endif
     print_val_hex32(timer_read32());
 
@@ -260,7 +264,10 @@ static void print_status(void)
 #ifdef BOOTMAGIC_ENABLE
 static void print_eeconfig(void)
 {
-#ifndef NO_PRINT
+
+// Print these variables if NO_PRINT or USER_PRINT are not defined.
+#if !defined(NO_PRINT) && !defined(USER_PRINT)
+
     print("default_layer: "); print_dec(eeconfig_read_default_layer()); print("\n");
 
     debug_config_t dc;
@@ -375,9 +382,6 @@ static bool command_common(uint8_t code)
             debug_enable = !debug_enable;
             if (debug_enable) {
                 print("\ndebug: on\n");
-                debug_matrix   = true;
-                debug_keyboard = true;
-                debug_mouse    = true;
             } else {
                 print("\ndebug: off\n");
                 debug_matrix   = false;
@@ -434,8 +438,8 @@ static bool command_common(uint8_t code)
 		// NKRO toggle
         case MAGIC_KC(MAGIC_KEY_NKRO):
             clear_keyboard(); // clear to prevent stuck keys
-            keyboard_nkro = !keyboard_nkro;
-            if (keyboard_nkro) {
+            keymap_config.nkro = !keymap_config.nkro;
+            if (keymap_config.nkro) {
                 print("NKRO: on\n");
             } else {
                 print("NKRO: off\n");
@@ -570,7 +574,8 @@ static uint8_t mousekey_param = 0;
 
 static void mousekey_param_print(void)
 {
-#ifndef NO_PRINT
+// Print these variables if NO_PRINT or USER_PRINT are not defined.
+#if !defined(NO_PRINT) && !defined(USER_PRINT)
     print("\n\t- Values -\n");
     print("1: delay(*10ms): "); pdec(mk_delay); print("\n");
     print("2: interval(ms): "); pdec(mk_interval); print("\n");
diff --git a/tmk_core/common/host.c b/tmk_core/common/host.c
index 11a05c2ddd..e12b622165 100644
--- a/tmk_core/common/host.c
+++ b/tmk_core/common/host.c
@@ -22,11 +22,6 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #include "util.h"
 #include "debug.h"
 
-
-#ifdef NKRO_ENABLE
-bool keyboard_nkro = true;
-#endif
-
 static host_driver_t *driver;
 static uint16_t last_system_report = 0;
 static uint16_t last_consumer_report = 0;
diff --git a/tmk_core/common/host.h b/tmk_core/common/host.h
index 9814b10d2d..aeabba7107 100644
--- a/tmk_core/common/host.h
+++ b/tmk_core/common/host.h
@@ -28,10 +28,6 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 extern "C" {
 #endif
 
-#ifdef NKRO_ENABLE
-extern bool keyboard_nkro;
-#endif
-
 extern uint8_t keyboard_idle;
 extern uint8_t keyboard_protocol;
 
diff --git a/tmk_core/common/host_driver.h b/tmk_core/common/host_driver.h
index edb9e5dd9c..588d1c0be8 100644
--- a/tmk_core/common/host_driver.h
+++ b/tmk_core/common/host_driver.h
@@ -20,7 +20,9 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 #include <stdint.h>
 #include "report.h"
-
+#ifdef MIDI_ENABLE
+	#include "midi.h"
+#endif
 
 typedef struct {
     uint8_t (*keyboard_leds)(void);
@@ -28,6 +30,11 @@ typedef struct {
     void (*send_mouse)(report_mouse_t *);
     void (*send_system)(uint16_t);
     void (*send_consumer)(uint16_t);
+#ifdef MIDI_ENABLE
+    void (*usb_send_func)(MidiDevice *, uint16_t, uint8_t, uint8_t, uint8_t);
+    void (*usb_get_midi)(MidiDevice *);
+    void (*midi_usb_init)(MidiDevice *);
+#endif
 } host_driver_t;
 
 #endif
diff --git a/tmk_core/common/keyboard.c b/tmk_core/common/keyboard.c
index c46a701b3b..eac1f1dd81 100644
--- a/tmk_core/common/keyboard.c
+++ b/tmk_core/common/keyboard.c
@@ -14,6 +14,7 @@ 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/>.
 */
+
 #include <stdint.h>
 #include "keyboard.h"
 #include "matrix.h"
@@ -50,6 +51,9 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #ifdef RGBLIGHT_ENABLE
 #   include "rgblight.h"
 #endif
+#ifdef FAUXCLICKY_ENABLE
+#   include "fauxclicky.h"
+#endif
 #ifdef SERIAL_LINK_ENABLE
 #   include "serial_link/system/serial_link.h"
 #endif
@@ -57,6 +61,8 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #   include "visualizer/visualizer.h"
 #endif
 
+
+
 #ifdef MATRIX_HAS_GHOST
 static bool has_ghost_in_row(uint8_t row)
 {
@@ -105,8 +111,11 @@ void keyboard_init(void) {
 #ifdef RGBLIGHT_ENABLE
     rgblight_init();
 #endif
+#ifdef FAUXCLICKY_ENABLE
+    fauxclicky_init();
+#endif
 #if defined(NKRO_ENABLE) && defined(FORCE_NKRO)
-	keyboard_nkro = true;
+    keymap_config.nkro = 1;
 #endif
 }
 
@@ -186,7 +195,7 @@ MATRIX_LOOP_END:
 #endif
 
 #ifdef VISUALIZER_ENABLE
-    visualizer_update(default_layer_state, layer_state, host_keyboard_leds());
+    visualizer_update(default_layer_state, layer_state, visualizer_get_mods(), host_keyboard_leds());
 #endif
 
     // update LED
diff --git a/tmk_core/common/keycode.h b/tmk_core/common/keycode.h
index 2f208c54e0..54e9c322c1 100644
--- a/tmk_core/common/keycode.h
+++ b/tmk_core/common/keycode.h
@@ -85,7 +85,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #define KC_LCAP KC_LOCKING_CAPS
 #define KC_LNUM KC_LOCKING_NUM
 #define KC_LSCR KC_LOCKING_SCROLL
-#define KC_ERAS KC_ALT_ERASE,
+#define KC_ERAS KC_ALT_ERASE
 #define KC_CLR  KC_CLEAR
 /* Japanese specific */
 #define KC_ZKHK KC_GRAVE
diff --git a/tmk_core/common/magic.c b/tmk_core/common/magic.c
index 194e4cc026..49617a3d10 100644
--- a/tmk_core/common/magic.c
+++ b/tmk_core/common/magic.c
@@ -27,10 +27,6 @@ void magic(void)
     /* keymap config */
     keymap_config.raw = eeconfig_read_keymap();
 
-#ifdef NKRO_ENABLE
-    keyboard_nkro = keymap_config.nkro;
-#endif
-
     uint8_t default_layer = 0;
     default_layer = eeconfig_read_default_layer();
     default_layer_set((uint32_t)default_layer);
diff --git a/tmk_core/common/matrix.h b/tmk_core/common/matrix.h
index cee3593eee..2543f5abce 100644
--- a/tmk_core/common/matrix.h
+++ b/tmk_core/common/matrix.h
@@ -50,7 +50,7 @@ void matrix_init(void);
 uint8_t matrix_scan(void);
 /* whether modified from previous scan. used after matrix_scan. */
 bool matrix_is_modified(void) __attribute__ ((deprecated));
-/* whether a swtich is on */
+/* whether a switch is on */
 bool matrix_is_on(uint8_t row, uint8_t col);
 /* matrix state on row */
 matrix_row_t matrix_get_row(uint8_t row);
diff --git a/tmk_core/common/mbed/xprintf.cpp b/tmk_core/common/mbed/xprintf.cpp
index 3647ece751..b1aac2c99d 100644
--- a/tmk_core/common/mbed/xprintf.cpp
+++ b/tmk_core/common/mbed/xprintf.cpp
@@ -7,7 +7,7 @@
 #define STRING_STACK_LIMIT    120
 
 //TODO
-int xprintf(const char* format, ...) { return 0; }
+int __xprintf(const char* format, ...) { return 0; }
 
 #if 0
 /* mbed Serial */
diff --git a/tmk_core/common/mbed/xprintf.h b/tmk_core/common/mbed/xprintf.h
index 26bc529e5b..1e7a48c06d 100644
--- a/tmk_core/common/mbed/xprintf.h
+++ b/tmk_core/common/mbed/xprintf.h
@@ -7,7 +7,7 @@
 extern "C" {
 #endif
 
-int xprintf(const char *format, ...);
+int __xprintf(const char *format, ...);
 
 #ifdef __cplusplus
 }
diff --git a/tmk_core/common/print.h b/tmk_core/common/print.h
index 0368bcd4a1..8836c0fc7c 100644
--- a/tmk_core/common/print.h
+++ b/tmk_core/common/print.h
@@ -29,45 +29,147 @@
 #include <stdbool.h>
 #include "util.h"
 
-
+#if defined(PROTOCOL_CHIBIOS)
+#define PSTR(x) x
+#endif
 
 
 #ifndef NO_PRINT
 
+#if defined(__AVR__) /* __AVR__ */
+
+#  include "avr/xprintf.h"
+
+#  ifdef USER_PRINT /* USER_PRINT */
+
+// Remove normal print defines
+#    define print(s)
+#    define println(s)
+#    undef xprintf
+#    define xprintf(fmt, ...)
+
+// Create user print defines
+#    define uprint(s)          xputs(PSTR(s))
+#    define uprintln(s)        xputs(PSTR(s "\r\n"))
+#    define uprintf(fmt, ...)  __xprintf(PSTR(fmt), ##__VA_ARGS__)
+
+#  else /* NORMAL PRINT */
 
-#if defined(__AVR__)
+// Create user & normal print defines
+#    define print(s)           xputs(PSTR(s))
+#    define println(s)         xputs(PSTR(s "\r\n"))
+#    define uprint(s)          print(s)
+#    define uprintln(s)        println(s)
+#    define uprintf(fmt, ...)  xprintf(fmt, ...)
 
-#include "avr/xprintf.h"
-#define print(s)    xputs(PSTR(s))
-#define println(s)  xputs(PSTR(s "\r\n"))
+#  endif /* USER_PRINT / NORMAL PRINT */
 
-#ifdef __cplusplus
+#  ifdef __cplusplus
 extern "C"
-#endif
+#  endif
+
 /* function pointer of sendchar to be used by print utility */
 void print_set_sendchar(int8_t (*print_sendchar_func)(uint8_t));
 
-#elif defined(PROTOCOL_CHIBIOS) /* __AVR__ */
+#elif defined(PROTOCOL_CHIBIOS) /* PROTOCOL_CHIBIOS */
+
+#  include "chibios/printf.h"
+
+#  ifdef USER_PRINT /* USER_PRINT */
+
+// Remove normal print defines
+#    define print(s)
+#    define println(s)
+#    define xprintf(fmt, ...)
+
+// Create user print defines
+#    define uprint(s)    printf(s)
+#    define uprintln(s)  printf(s "\r\n")
+#    define uprintf      printf
+
+#  else /* NORMAL PRINT */
 
-#include "chibios/printf.h"
+// Create user & normal print defines
+#    define print(s)     printf(s)
+#    define println(s)   printf(s "\r\n")
+#    define xprintf      printf
+#    define uprint(s)    printf(s)
+#    define uprintln(s)  printf(s "\r\n")
+#    define uprintf      printf
 
-#define print(s)    printf(s)
-#define println(s)  printf(s "\r\n")
-#define xprintf  printf
+#  endif /* USER_PRINT / NORMAL PRINT */
 
-#elif defined(__arm__) /* __AVR__ */
+#elif defined(__arm__) /* __arm__ */
 
-#include "mbed/xprintf.h"
+#  include "mbed/xprintf.h"
 
-#define print(s)    xprintf(s)
-#define println(s)  xprintf(s "\r\n")
+#  ifdef USER_PRINT /* USER_PRINT */
+
+// Remove normal print defines
+#    define print(s)
+#    define println(s)
+#    define xprintf(fmt, ...)
+
+// Create user print defines
+#    define uprintf(fmt, ...)  __xprintf(fmt, ...)
+#    define uprint(s)          xprintf(s)
+#    define uprintln(s)        xprintf(s "\r\n")
+
+#  else /* NORMAL PRINT */
+
+// Create user & normal print defines
+#    define xprintf(fmt, ...)  __xprintf(fmt, ...)
+#    define print(s)           xprintf(s)
+#    define println(s)         xprintf(s "\r\n")
+#    define uprint(s)          print(s)
+#    define uprintln(s)        println(s)
+#    define uprintf(fmt, ...)  xprintf(fmt, ...)
+
+#  endif /* USER_PRINT / NORMAL PRINT */
 
 /* TODO: to select output destinations: UART/USBSerial */
-#define print_set_sendchar(func)
+#  define print_set_sendchar(func)
+
+#endif /* __AVR__ / PROTOCOL_CHIBIOS / __arm__ */
 
-#endif /* __AVR__ */
+// User print disables the normal print messages in the body of QMK/TMK code and
+// is meant as a lightweight alternative to NOPRINT. Use it when you only want to do
+// a spot of debugging but lack flash resources for allowing all of the codebase to
+// print (and store their wasteful strings).
+//
+// !!! DO NOT USE USER PRINT CALLS IN THE BODY OF QMK/TMK !!!
+//
+#ifdef USER_PRINT
+
+// Disable normal print
+#define print_dec(data)
+#define print_decs(data)
+#define print_hex4(data)
+#define print_hex8(data)
+#define print_hex16(data)
+#define print_hex32(data)
+#define print_bin4(data)
+#define print_bin8(data)
+#define print_bin16(data)
+#define print_bin32(data)
+#define print_bin_reverse8(data)
+#define print_bin_reverse16(data)
+#define print_bin_reverse32(data)
+#define print_val_dec(v)
+#define print_val_decs(v)
+#define print_val_hex8(v)
+#define print_val_hex16(v)
+#define print_val_hex32(v)
+#define print_val_bin8(v)
+#define print_val_bin16(v)
+#define print_val_bin32(v)
+#define print_val_bin_reverse8(v)
+#define print_val_bin_reverse16(v)
+#define print_val_bin_reverse32(v)
 
+#else /* NORMAL_PRINT */
 
+//Enable normal print
 /* decimal */
 #define print_dec(i)                xprintf("%u", i)
 #define print_decs(i)               xprintf("%d", i)
@@ -97,6 +199,39 @@ void print_set_sendchar(int8_t (*print_sendchar_func)(uint8_t));
 #define print_val_bin_reverse16(v)  xprintf(#v ": %016b\n", bitrev16(v))
 #define print_val_bin_reverse32(v)  xprintf(#v ": %032lb\n", bitrev32(v))
 
+#endif /* USER_PRINT / NORMAL_PRINT */
+
+// User Print
+
+/* decimal */
+#define uprint_dec(i)               uprintf("%u", i)
+#define uprint_decs(i)              uprintf("%d", i)
+/* hex */
+#define uprint_hex4(i)              uprintf("%X", i)
+#define uprint_hex8(i)              uprintf("%02X", i)
+#define uprint_hex16(i)             uprintf("%04X", i)
+#define uprint_hex32(i)             uprintf("%08lX", i)
+/* binary */
+#define uprint_bin4(i)              uprintf("%04b", i)
+#define uprint_bin8(i)              uprintf("%08b", i)
+#define uprint_bin16(i)             uprintf("%016b", i)
+#define uprint_bin32(i)             uprintf("%032lb", i)
+#define uprint_bin_reverse8(i)      uprintf("%08b", bitrev(i))
+#define uprint_bin_reverse16(i)     uprintf("%016b", bitrev16(i))
+#define uprint_bin_reverse32(i)     uprintf("%032lb", bitrev32(i))
+/* print value utility */
+#define uprint_val_dec(v)           uprintf(#v ": %u\n", v)
+#define uprint_val_decs(v)          uprintf(#v ": %d\n", v)
+#define uprint_val_hex8(v)          uprintf(#v ": %X\n", v)
+#define uprint_val_hex16(v)         uprintf(#v ": %02X\n", v)
+#define uprint_val_hex32(v)         uprintf(#v ": %04lX\n", v)
+#define uprint_val_bin8(v)          uprintf(#v ": %08b\n", v)
+#define uprint_val_bin16(v)         uprintf(#v ": %016b\n", v)
+#define uprint_val_bin32(v)         uprintf(#v ": %032lb\n", v)
+#define uprint_val_bin_reverse8(v)  uprintf(#v ": %08b\n", bitrev(v))
+#define uprint_val_bin_reverse16(v) uprintf(#v ": %016b\n", bitrev16(v))
+#define uprint_val_bin_reverse32(v) uprintf(#v ": %032lb\n", bitrev32(v))
+
 #else   /* NO_PRINT */
 
 #define xprintf(fmt, ...)
@@ -141,5 +276,4 @@ void print_set_sendchar(int8_t (*print_sendchar_func)(uint8_t));
 #define pbin_reverse(data)      print_bin_reverse8(data)
 #define pbin_reverse16(data)    print_bin_reverse16(data)
 
-
 #endif
diff --git a/tmk_core/common/raw_hid.h b/tmk_core/common/raw_hid.h
new file mode 100644
index 0000000000..86da02fd15
--- /dev/null
+++ b/tmk_core/common/raw_hid.h
@@ -0,0 +1,8 @@
+#ifndef _RAW_HID_H_
+#define _RAW_HID_H_
+
+void raw_hid_receive( uint8_t *data, uint8_t length );
+
+void raw_hid_send( uint8_t *data, uint8_t length );
+
+#endif
diff --git a/tmk_core/common/report.h b/tmk_core/common/report.h
index 0c799eca39..8fb28b6ce3 100644
--- a/tmk_core/common/report.h
+++ b/tmk_core/common/report.h
@@ -134,13 +134,6 @@ typedef union {
     } nkro;
 #endif
 } __attribute__ ((packed)) report_keyboard_t;
-/*
-typedef struct {
-    uint8_t mods;
-    uint8_t reserved;
-    uint8_t keys[REPORT_KEYS];
-} __attribute__ ((packed)) report_keyboard_t;
-*/
 
 typedef struct {
     uint8_t buttons;
diff --git a/tmk_core/common/virtser.h b/tmk_core/common/virtser.h
new file mode 100644
index 0000000000..74891b6ae0
--- /dev/null
+++ b/tmk_core/common/virtser.h
@@ -0,0 +1,10 @@
+#ifndef _VIRTSER_H_
+#define _VIRTSER_H_
+
+/* Define this function in your code to process incoming bytes */
+void virtser_recv(const uint8_t ch);
+
+/* Call this to send a character over the Virtual Serial Device */
+void virtser_send(const uint8_t byte);
+
+#endif
diff --git a/tmk_core/native.mk b/tmk_core/native.mk
new file mode 100644
index 0000000000..50232ee9b7
--- /dev/null
+++ b/tmk_core/native.mk
@@ -0,0 +1,24 @@
+CC = gcc
+OBJCOPY = 
+OBJDUMP = 
+SIZE = 
+AR = 
+NM = 
+HEX = 
+EEP = 
+BIN =
+
+
+COMPILEFLAGS += -funsigned-char
+COMPILEFLAGS += -funsigned-bitfields
+COMPILEFLAGS += -ffunction-sections
+COMPILEFLAGS += -fdata-sections
+COMPILEFLAGS += -fshort-enums
+
+CFLAGS += $(COMPILEFLAGS)
+CFLAGS += -fno-inline-small-functions
+CFLAGS += -fno-strict-aliasing
+
+CPPFLAGS += $(COMPILEFLAGS)
+CPPFLAGS += -fno-exceptions
+CPPFLAGS += -std=gnu++11
\ No newline at end of file
diff --git a/tmk_core/protocol/chibios/usb_main.c b/tmk_core/protocol/chibios/usb_main.c
index e2c9d9bf14..d0c72c46c7 100644
--- a/tmk_core/protocol/chibios/usb_main.c
+++ b/tmk_core/protocol/chibios/usb_main.c
@@ -28,6 +28,12 @@
 #include "led.h"
 #endif
 
+#ifdef NKRO_ENABLE
+  #include "keycode_config.h"
+
+  extern keymap_config_t keymap_config;
+#endif
+
 /* ---------------------------------------------------------
  *       Global interface variables and declarations
  * ---------------------------------------------------------
@@ -39,9 +45,6 @@ uint16_t keyboard_led_stats __attribute__((aligned(2))) = 0;
 volatile uint16_t keyboard_idle_count = 0;
 static virtual_timer_t keyboard_idle_timer;
 static void keyboard_idle_timer_cb(void *arg);
-#ifdef NKRO_ENABLE
-extern bool keyboard_nkro;
-#endif /* NKRO_ENABLE */
 
 report_keyboard_t keyboard_report_sent = {{0}};
 #ifdef MOUSE_ENABLE
@@ -943,8 +946,8 @@ static bool usb_request_hook_cb(USBDriver *usbp) {
         if((usbp->setup[4] == KBD_INTERFACE) && (usbp->setup[5] == 0)) {   /* wIndex */
           keyboard_protocol = ((usbp->setup[2]) != 0x00);   /* LSB(wValue) */
 #ifdef NKRO_ENABLE
-          keyboard_nkro = !!keyboard_protocol;
-          if(!keyboard_nkro && keyboard_idle) {
+          keymap_config.nkro = !!keyboard_protocol;
+          if(!keymap_config.nkro && keyboard_idle) {
 #else /* NKRO_ENABLE */
           if(keyboard_idle) {
 #endif /* NKRO_ENABLE */
@@ -962,7 +965,7 @@ static bool usb_request_hook_cb(USBDriver *usbp) {
         keyboard_idle = usbp->setup[3];     /* MSB(wValue) */
         /* arm the timer */
 #ifdef NKRO_ENABLE
-        if(!keyboard_nkro && keyboard_idle) {
+        if(!keymap_config.nkro && keyboard_idle) {
 #else /* NKRO_ENABLE */
         if(keyboard_idle) {
 #endif /* NKRO_ENABLE */
@@ -1089,7 +1092,7 @@ static void keyboard_idle_timer_cb(void *arg) {
   }
 
 #ifdef NKRO_ENABLE
-  if(!keyboard_nkro && keyboard_idle) {
+  if(!keymap_config.nkro && keyboard_idle) {
 #else /* NKRO_ENABLE */
   if(keyboard_idle) {
 #endif /* NKRO_ENABLE */
@@ -1122,7 +1125,7 @@ void send_keyboard(report_keyboard_t *report) {
   osalSysUnlock();
 
 #ifdef NKRO_ENABLE
-  if(keyboard_nkro) {  /* NKRO protocol */
+  if(keymap_config.nkro) {  /* NKRO protocol */
     /* need to wait until the previous packet has made it through */
     /* can rewrite this using the synchronous API, then would wait
      * until *after* the packet has been transmitted. I think
diff --git a/tmk_core/protocol/iwrap/suart.S b/tmk_core/protocol/iwrap/suart.S
index 1b02909638..a873515e10 100644
--- a/tmk_core/protocol/iwrap/suart.S
+++ b/tmk_core/protocol/iwrap/suart.S
@@ -1,156 +1,156 @@
-;---------------------------------------------------------------------------;

-; Software implemented UART module                                          ;

-; (C)ChaN, 2005 (http://elm-chan.org/)                                      ;

-;---------------------------------------------------------------------------;

-; Bit rate settings:

-;

-;            1MHz  2MHz  4MHz  6MHz  8MHz  10MHz  12MHz  16MHz  20MHz

-;   2.4kbps   138     -     -     -     -      -      -      -      -

-;   4.8kbps    68   138     -     -     -      -      -      -      -

-;   9.6kbps    33    68   138   208     -      -      -      -      -

-;  19.2kbps     -    33    68   102   138    173    208      -      -

-;  38.4kbps     -     -    33    50    68     85    102    138    172

-;  57.6kbps     -     -    21    33    44     56     68     91    114

-; 115.2kbps     -     -     -     -    21     27     33     44     56

-

-.nolist

-#include <avr/io.h>

-.list

-

-#define	BPS	102 	/* Bit delay. (see above table) */

-#define	BIDIR	0	/* 0:Separated Tx/Rx, 1:Shared Tx/Rx */

-

-#define	OUT_1		sbi _SFR_IO_ADDR(SUART_OUT_PORT), SUART_OUT_BIT	/* Output 1 */

-#define	OUT_0		cbi _SFR_IO_ADDR(SUART_OUT_PORT), SUART_OUT_BIT	/* Output 0 */

-#define	SKIP_IN_1	sbis _SFR_IO_ADDR(SUART_IN_PIN), SUART_IN_BIT	/* Skip if 1 */

-#define	SKIP_IN_0	sbic _SFR_IO_ADDR(SUART_IN_PIN), SUART_IN_BIT	/* Skip if 0 */

-

-

-

-#ifdef SPM_PAGESIZE

-.macro	_LPMI	reg

-	lpm	\reg, Z+

-.endm

-.macro	_MOVW	dh,dl, sh,sl

-	movw	\dl, \sl

-.endm

-#else

-.macro	_LPMI	reg

-	lpm

-	mov	\reg, r0

-	adiw	ZL, 1

-.endm

-.macro	_MOVW	dh,dl, sh,sl

-	mov	\dl, \sl

-	mov	\dh, \sh

-.endm

-#endif

-

-

-

-;---------------------------------------------------------------------------;

-; Transmit a byte in serial format of N81

-;

-;Prototype: void xmit (uint8_t data);

-;Size: 16 words

-

-.global xmit

-.func xmit

-xmit:

-#if BIDIR

-	ldi	r23, BPS-1	;Pre-idle time for bidirectional data line

-5:	dec	r23     	;

-	brne	5b		;/

-#endif

-	in	r0, _SFR_IO_ADDR(SREG)	;Save flags

-

-	com	r24		;C = start bit

-	ldi	r25, 10		;Bit counter

-	cli			;Start critical section

-

-1:	ldi	r23, BPS-1	;----- Bit transferring loop 

-2:	dec	r23     	;Wait for a bit time

-	brne	2b		;/

-	brcs	3f		;MISO = bit to be sent

-	OUT_1			;

-3:	brcc	4f		;

-	OUT_0			;/

-4:	lsr	r24     	;Get next bit into C

-	dec	r25     	;All bits sent?

-	brne	1b	     	;  no, coutinue

-

-	out	_SFR_IO_ADDR(SREG), r0	;End of critical section

-	ret

-.endfunc

-

-

-

-;---------------------------------------------------------------------------;

-; Receive a byte

-;

-;Prototype: uint8_t rcvr (void);

-;Size: 19 words

-

-.global rcvr

-.func rcvr

-rcvr:

-	in	r0, _SFR_IO_ADDR(SREG)	;Save flags

-

-	ldi	r24, 0x80	;Receiving shift reg

-	cli			;Start critical section

-

-1:	SKIP_IN_1		;Wait for idle

-	rjmp	1b

-2:	SKIP_IN_0		;Wait for start bit

-	rjmp	2b

-	ldi	r25, BPS/2	;Wait for half bit time

-3:	dec	r25

-	brne	3b

-

-4:	ldi	r25, BPS	;----- Bit receiving loop

-5:	dec	r25     	;Wait for a bit time

-	brne	5b		;/

-	lsr	r24     	;Next bit

-	SKIP_IN_0		;Get a data bit into r24.7

-	ori	r24, 0x80

-	brcc	4b	     	;All bits received?  no, continue

-

-	out	_SFR_IO_ADDR(SREG), r0	;End of critical section

-	ret

-.endfunc

-

-

-; Not wait for start bit. This should be called after detecting start bit.

-.global recv

-.func recv

-recv:

-	in	r0, _SFR_IO_ADDR(SREG)	;Save flags

-

-	ldi	r24, 0x80	;Receiving shift reg

-	cli			;Start critical section

-

-;1:	SKIP_IN_1		;Wait for idle

-;	rjmp	1b

-;2:	SKIP_IN_0		;Wait for start bit

-;	rjmp	2b

-	ldi	r25, BPS/2	;Wait for half bit time

-3:	dec	r25

-	brne	3b

-

-4:	ldi	r25, BPS	;----- Bit receiving loop

-5:	dec	r25     	;Wait for a bit time

-	brne	5b		;/

-	lsr	r24     	;Next bit

-	SKIP_IN_0		;Get a data bit into r24.7

-	ori	r24, 0x80

-	brcc	4b	     	;All bits received?  no, continue

-

-	ldi	r25, BPS/2	;Wait for half bit time

-6:	dec	r25

-	brne	6b

-7:	SKIP_IN_1		;Wait for stop bit

-	rjmp	7b

-

-	out	_SFR_IO_ADDR(SREG), r0	;End of critical section

-	ret

-.endfunc

+;---------------------------------------------------------------------------;
+; Software implemented UART module                                          ;
+; (C)ChaN, 2005 (http://elm-chan.org/)                                      ;
+;---------------------------------------------------------------------------;
+; Bit rate settings:
+;
+;            1MHz  2MHz  4MHz  6MHz  8MHz  10MHz  12MHz  16MHz  20MHz
+;   2.4kbps   138     -     -     -     -      -      -      -      -
+;   4.8kbps    68   138     -     -     -      -      -      -      -
+;   9.6kbps    33    68   138   208     -      -      -      -      -
+;  19.2kbps     -    33    68   102   138    173    208      -      -
+;  38.4kbps     -     -    33    50    68     85    102    138    172
+;  57.6kbps     -     -    21    33    44     56     68     91    114
+; 115.2kbps     -     -     -     -    21     27     33     44     56
+
+.nolist
+#include <avr/io.h>
+.list
+
+#define	BPS	102 	/* Bit delay. (see above table) */
+#define	BIDIR	0	/* 0:Separated Tx/Rx, 1:Shared Tx/Rx */
+
+#define	OUT_1		sbi _SFR_IO_ADDR(SUART_OUT_PORT), SUART_OUT_BIT	/* Output 1 */
+#define	OUT_0		cbi _SFR_IO_ADDR(SUART_OUT_PORT), SUART_OUT_BIT	/* Output 0 */
+#define	SKIP_IN_1	sbis _SFR_IO_ADDR(SUART_IN_PIN), SUART_IN_BIT	/* Skip if 1 */
+#define	SKIP_IN_0	sbic _SFR_IO_ADDR(SUART_IN_PIN), SUART_IN_BIT	/* Skip if 0 */
+
+
+
+#ifdef SPM_PAGESIZE
+.macro	_LPMI	reg
+	lpm	\reg, Z+
+.endm
+.macro	_MOVW	dh,dl, sh,sl
+	movw	\dl, \sl
+.endm
+#else
+.macro	_LPMI	reg
+	lpm
+	mov	\reg, r0
+	adiw	ZL, 1
+.endm
+.macro	_MOVW	dh,dl, sh,sl
+	mov	\dl, \sl
+	mov	\dh, \sh
+.endm
+#endif
+
+
+
+;---------------------------------------------------------------------------;
+; Transmit a byte in serial format of N81
+;
+;Prototype: void xmit (uint8_t data);
+;Size: 16 words
+
+.global xmit
+.func xmit
+xmit:
+#if BIDIR
+	ldi	r23, BPS-1	;Pre-idle time for bidirectional data line
+5:	dec	r23     	;
+	brne	5b		;/
+#endif
+	in	r0, _SFR_IO_ADDR(SREG)	;Save flags
+
+	com	r24		;C = start bit
+	ldi	r25, 10		;Bit counter
+	cli			;Start critical section
+
+1:	ldi	r23, BPS-1	;----- Bit transferring loop 
+2:	dec	r23     	;Wait for a bit time
+	brne	2b		;/
+	brcs	3f		;MISO = bit to be sent
+	OUT_1			;
+3:	brcc	4f		;
+	OUT_0			;/
+4:	lsr	r24     	;Get next bit into C
+	dec	r25     	;All bits sent?
+	brne	1b	     	;  no, coutinue
+
+	out	_SFR_IO_ADDR(SREG), r0	;End of critical section
+	ret
+.endfunc
+
+
+
+;---------------------------------------------------------------------------;
+; Receive a byte
+;
+;Prototype: uint8_t rcvr (void);
+;Size: 19 words
+
+.global rcvr
+.func rcvr
+rcvr:
+	in	r0, _SFR_IO_ADDR(SREG)	;Save flags
+
+	ldi	r24, 0x80	;Receiving shift reg
+	cli			;Start critical section
+
+1:	SKIP_IN_1		;Wait for idle
+	rjmp	1b
+2:	SKIP_IN_0		;Wait for start bit
+	rjmp	2b
+	ldi	r25, BPS/2	;Wait for half bit time
+3:	dec	r25
+	brne	3b
+
+4:	ldi	r25, BPS	;----- Bit receiving loop
+5:	dec	r25     	;Wait for a bit time
+	brne	5b		;/
+	lsr	r24     	;Next bit
+	SKIP_IN_0		;Get a data bit into r24.7
+	ori	r24, 0x80
+	brcc	4b	     	;All bits received?  no, continue
+
+	out	_SFR_IO_ADDR(SREG), r0	;End of critical section
+	ret
+.endfunc
+
+
+; Not wait for start bit. This should be called after detecting start bit.
+.global recv
+.func recv
+recv:
+	in	r0, _SFR_IO_ADDR(SREG)	;Save flags
+
+	ldi	r24, 0x80	;Receiving shift reg
+	cli			;Start critical section
+
+;1:	SKIP_IN_1		;Wait for idle
+;	rjmp	1b
+;2:	SKIP_IN_0		;Wait for start bit
+;	rjmp	2b
+	ldi	r25, BPS/2	;Wait for half bit time
+3:	dec	r25
+	brne	3b
+
+4:	ldi	r25, BPS	;----- Bit receiving loop
+5:	dec	r25     	;Wait for a bit time
+	brne	5b		;/
+	lsr	r24     	;Next bit
+	SKIP_IN_0		;Get a data bit into r24.7
+	ori	r24, 0x80
+	brcc	4b	     	;All bits received?  no, continue
+
+	ldi	r25, BPS/2	;Wait for half bit time
+6:	dec	r25
+	brne	6b
+7:	SKIP_IN_1		;Wait for stop bit
+	rjmp	7b
+
+	out	_SFR_IO_ADDR(SREG), r0	;End of critical section
+	ret
+.endfunc
diff --git a/tmk_core/protocol/iwrap/suart.h b/tmk_core/protocol/iwrap/suart.h
index 72725b998f..7d92be0692 100644
--- a/tmk_core/protocol/iwrap/suart.h
+++ b/tmk_core/protocol/iwrap/suart.h
@@ -1,8 +1,8 @@
-#ifndef SUART

-#define SUART

-

-void xmit(uint8_t);

-uint8_t rcvr(void);

-uint8_t recv(void);

-

-#endif	/* SUART */

+#ifndef SUART
+#define SUART
+
+void xmit(uint8_t);
+uint8_t rcvr(void);
+uint8_t recv(void);
+
+#endif	/* SUART */
diff --git a/tmk_core/protocol/iwrap/wd.h b/tmk_core/protocol/iwrap/wd.h
index 99058f0331..12395bf696 100644
--- a/tmk_core/protocol/iwrap/wd.h
+++ b/tmk_core/protocol/iwrap/wd.h
@@ -1,159 +1,159 @@
-/* This is from http://www.mtcnet.net/~henryvm/wdt/ */

-#ifndef _AVR_WD_H_

-#define _AVR_WD_H_

-

-#include <avr/io.h>

-

-/*

-Copyright (c) 2009, Curt Van Maanen

-

-Permission to use, copy, modify, and/or distribute this software for any

-purpose with or without fee is hereby granted, provided that the above

-copyright notice and this permission notice appear in all copies.

-

-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES

-WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF

-MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR

-ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES

-WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER 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 usage-

-    #include "wd.h"             //if in same directory as project

-    #include <avr/wd.h>         //if wd.h is in avr directory

-

-set watchdog modes and prescale

-

-usage-

-    WD_SET(mode,[timeout]);     //prescale always set

-

-modes-

-    WD_OFF                      disabled

-    WD_RST                      normal reset mode

-    WD_IRQ                      interrupt only mode (if supported)

-    WD_RST_IRQ                  interrupt+reset mode (if supported)

-

-timeout-

-    WDTO_15MS                   default if no timeout provided

-    WDTO_30MS

-    WDTO_60MS

-    WDTO_120MS

-    WDTO_250MS

-    WDTO_500MS

-    WDTO_1S

-    WDTO_2S

-    WDTO_4S                     (if supported)

-    WDTO_8S                     (if supported)

-

-examples-

-    WD_SET(WD_RST,WDTO_1S);     //reset mode, 1s timeout

-    WD_SET(WD_OFF);             //watchdog disabled (if not fused on)

-    WD_SET(WD_RST);             //reset mode, 15ms (default timeout)

-    WD_SET(WD_IRQ,WDTO_120MS);  //interrupt only mode, 120ms timeout

-    WD_SET(WD_RST_IRQ,WDTO_2S); //interrupt+reset mode, 2S timeout

-

-

-for enhanced watchdogs, if the watchdog is not being used WDRF should be

-cleared on every power up or reset, along with disabling the watchdog-

-    WD_DISABLE();               //clear WDRF, then turn off watchdog

-

-*/

-

-//reset registers to the same name (MCUCSR)

-#if !defined(MCUCSR)

-#define MCUCSR                  MCUSR

-#endif

-

-//watchdog registers to the same name (WDTCSR)

-#if !defined(WDTCSR)

-#define WDTCSR                  WDTCR

-#endif

-

-//if enhanced watchdog, define irq values, create disable macro

-#if defined(WDIF)

-#define WD_IRQ                  0xC0

-#define WD_RST_IRQ              0xC8

-#define WD_DISABLE()            do{                       \

-                                    MCUCSR &= ~(1<<WDRF); \

-                                    WD_SET(WD_OFF);       \

-                                }while(0)

-#endif

-

-//all watchdogs

-#define WD_RST                  8

-#define WD_OFF                  0

-

-//prescale values

-#define WDTO_15MS               0

-#define WDTO_30MS               1

-#define WDTO_60MS               2

-#define WDTO_120MS              3

-#define WDTO_250MS              4

-#define WDTO_500MS              5

-#define WDTO_1S                 6

-#define WDTO_2S                 7

-

-//prescale values for avrs with WDP3

-#if defined(WDP3)

-#define WDTO_4S                 0x20

-#define WDTO_8S                 0x21

-#endif

-

-//watchdog reset

-#define WDR()                   __asm__ __volatile__("wdr")

-

-//avr reset using watchdog

-#define WD_AVR_RESET()          do{                              \

-                                    __asm__ __volatile__("cli"); \

-                                    WD_SET_UNSAFE(WD_RST);       \

-                                    while(1);                    \

-                                }while(0)

-

-/*set the watchdog-

-1. save SREG

-2. turn off irq's

-3. reset watchdog timer

-4. enable watchdog change

-5. write watchdog value

-6. restore SREG (restoring irq status)

-*/

-#define WD_SET(val,...)                                 \

-    __asm__ __volatile__(                               \

-        "in __tmp_reg__,__SREG__"           "\n\t"      \

-        "cli"                               "\n\t"      \

-        "wdr"                               "\n\t"      \

-        "sts %[wdreg],%[wden]"              "\n\t"      \

-        "sts %[wdreg],%[wdval]"             "\n\t"      \

-        "out __SREG__,__tmp_reg__"          "\n\t"      \

-        :                                               \

-        : [wdreg] "M" (&WDTCSR),                        \

-          [wden]  "r" ((uint8_t)(0x18)),                \

-          [wdval] "r" ((uint8_t)(val|(__VA_ARGS__+0)))  \

-        : "r0"                                          \

-)

-

-/*set the watchdog when I bit in SREG known to be clear-

-1. reset watchdog timer

-2. enable watchdog change

-5. write watchdog value

-*/

-#define WD_SET_UNSAFE(val,...)                          \

-    __asm__ __volatile__(                               \

-        "wdr"                               "\n\t"      \

-        "sts %[wdreg],%[wden]"              "\n\t"      \

-        "sts %[wdreg],%[wdval]"             "\n\t"      \

-        :                                               \

-        : [wdreg] "M" (&WDTCSR),                        \

-          [wden]  "r" ((uint8_t)(0x18)),                \

-          [wdval] "r" ((uint8_t)(val|(__VA_ARGS__+0)))  \

-)

-

-

-//for compatibility with avr/wdt.h

-#define wdt_enable(val) WD_SET(WD_RST,val)

-#define wdt_disable()   WD_SET(WD_OFF)

-

-

-#endif /* _AVR_WD_H_ */

+/* This is from http://www.mtcnet.net/~henryvm/wdt/ */
+#ifndef _AVR_WD_H_
+#define _AVR_WD_H_
+
+#include <avr/io.h>
+
+/*
+Copyright (c) 2009, Curt Van Maanen
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER 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 usage-
+    #include "wd.h"             //if in same directory as project
+    #include <avr/wd.h>         //if wd.h is in avr directory
+
+set watchdog modes and prescale
+
+usage-
+    WD_SET(mode,[timeout]);     //prescale always set
+
+modes-
+    WD_OFF                      disabled
+    WD_RST                      normal reset mode
+    WD_IRQ                      interrupt only mode (if supported)
+    WD_RST_IRQ                  interrupt+reset mode (if supported)
+
+timeout-
+    WDTO_15MS                   default if no timeout provided
+    WDTO_30MS
+    WDTO_60MS
+    WDTO_120MS
+    WDTO_250MS
+    WDTO_500MS
+    WDTO_1S
+    WDTO_2S
+    WDTO_4S                     (if supported)
+    WDTO_8S                     (if supported)
+
+examples-
+    WD_SET(WD_RST,WDTO_1S);     //reset mode, 1s timeout
+    WD_SET(WD_OFF);             //watchdog disabled (if not fused on)
+    WD_SET(WD_RST);             //reset mode, 15ms (default timeout)
+    WD_SET(WD_IRQ,WDTO_120MS);  //interrupt only mode, 120ms timeout
+    WD_SET(WD_RST_IRQ,WDTO_2S); //interrupt+reset mode, 2S timeout
+
+
+for enhanced watchdogs, if the watchdog is not being used WDRF should be
+cleared on every power up or reset, along with disabling the watchdog-
+    WD_DISABLE();               //clear WDRF, then turn off watchdog
+
+*/
+
+//reset registers to the same name (MCUCSR)
+#if !defined(MCUCSR)
+#define MCUCSR                  MCUSR
+#endif
+
+//watchdog registers to the same name (WDTCSR)
+#if !defined(WDTCSR)
+#define WDTCSR                  WDTCR
+#endif
+
+//if enhanced watchdog, define irq values, create disable macro
+#if defined(WDIF)
+#define WD_IRQ                  0xC0
+#define WD_RST_IRQ              0xC8
+#define WD_DISABLE()            do{                       \
+                                    MCUCSR &= ~(1<<WDRF); \
+                                    WD_SET(WD_OFF);       \
+                                }while(0)
+#endif
+
+//all watchdogs
+#define WD_RST                  8
+#define WD_OFF                  0
+
+//prescale values
+#define WDTO_15MS               0
+#define WDTO_30MS               1
+#define WDTO_60MS               2
+#define WDTO_120MS              3
+#define WDTO_250MS              4
+#define WDTO_500MS              5
+#define WDTO_1S                 6
+#define WDTO_2S                 7
+
+//prescale values for avrs with WDP3
+#if defined(WDP3)
+#define WDTO_4S                 0x20
+#define WDTO_8S                 0x21
+#endif
+
+//watchdog reset
+#define WDR()                   __asm__ __volatile__("wdr")
+
+//avr reset using watchdog
+#define WD_AVR_RESET()          do{                              \
+                                    __asm__ __volatile__("cli"); \
+                                    WD_SET_UNSAFE(WD_RST);       \
+                                    while(1);                    \
+                                }while(0)
+
+/*set the watchdog-
+1. save SREG
+2. turn off irq's
+3. reset watchdog timer
+4. enable watchdog change
+5. write watchdog value
+6. restore SREG (restoring irq status)
+*/
+#define WD_SET(val,...)                                 \
+    __asm__ __volatile__(                               \
+        "in __tmp_reg__,__SREG__"           "\n\t"      \
+        "cli"                               "\n\t"      \
+        "wdr"                               "\n\t"      \
+        "sts %[wdreg],%[wden]"              "\n\t"      \
+        "sts %[wdreg],%[wdval]"             "\n\t"      \
+        "out __SREG__,__tmp_reg__"          "\n\t"      \
+        :                                               \
+        : [wdreg] "M" (&WDTCSR),                        \
+          [wden]  "r" ((uint8_t)(0x18)),                \
+          [wdval] "r" ((uint8_t)(val|(__VA_ARGS__+0)))  \
+        : "r0"                                          \
+)
+
+/*set the watchdog when I bit in SREG known to be clear-
+1. reset watchdog timer
+2. enable watchdog change
+5. write watchdog value
+*/
+#define WD_SET_UNSAFE(val,...)                          \
+    __asm__ __volatile__(                               \
+        "wdr"                               "\n\t"      \
+        "sts %[wdreg],%[wden]"              "\n\t"      \
+        "sts %[wdreg],%[wdval]"             "\n\t"      \
+        :                                               \
+        : [wdreg] "M" (&WDTCSR),                        \
+          [wden]  "r" ((uint8_t)(0x18)),                \
+          [wdval] "r" ((uint8_t)(val|(__VA_ARGS__+0)))  \
+)
+
+
+//for compatibility with avr/wdt.h
+#define wdt_enable(val) WD_SET(WD_RST,val)
+#define wdt_disable()   WD_SET(WD_OFF)
+
+
+#endif /* _AVR_WD_H_ */
diff --git a/tmk_core/protocol/lufa.mk b/tmk_core/protocol/lufa.mk
index 0eeace44ec..de0cc795f6 100644
--- a/tmk_core/protocol/lufa.mk
+++ b/tmk_core/protocol/lufa.mk
@@ -8,24 +8,33 @@ LUFA_PATH ?= $(LUFA_DIR)/LUFA-git
 ifneq (, $(wildcard $(TMK_PATH)/$(LUFA_PATH)/LUFA/Build/lufa_sources.mk))
     # New build system from 20120730
     LUFA_ROOT_PATH = $(LUFA_PATH)/LUFA
-    include $(TMK_PATH)/$(LUFA_PATH)/LUFA/Build/lufa_sources.mk 
+    include $(TMK_PATH)/$(LUFA_PATH)/LUFA/Build/lufa_sources.mk
 else
     include $(TMK_PATH)/$(LUFA_PATH)/LUFA/makefile
 endif
 
 LUFA_SRC = lufa.c \
 	   descriptor.c \
+	   outputselect.c \
 	   $(LUFA_SRC_USB)
 
 ifeq ($(strip $(MIDI_ENABLE)), yes)
 	include $(TMK_PATH)/protocol/midi.mk
 endif
 
+ifeq ($(strip $(ADAFRUIT_BLE_ENABLE)), yes)
+	LUFA_SRC += $(LUFA_DIR)/adafruit_ble.cpp
+endif
+
 ifeq ($(strip $(BLUETOOTH_ENABLE)), yes)
 	LUFA_SRC += $(LUFA_DIR)/bluetooth.c \
 	$(TMK_DIR)/protocol/serial_uart.c
 endif
 
+ifeq ($(strip $(VIRTSER_ENABLE)), yes)
+	LUFA_SRC += $(LUFA_ROOT_PATH)/Drivers/USB/Class/Device/CDCClassDevice.c
+endif
+
 SRC += $(LUFA_SRC)
 
 # Search Path
diff --git a/tmk_core/protocol/lufa/LUFA-git/Bootloaders/CDC/asf.xml b/tmk_core/protocol/lufa/LUFA-git/Bootloaders/CDC/asf.xml
index 72f3ff04c7..02e7063c66 100644
--- a/tmk_core/protocol/lufa/LUFA-git/Bootloaders/CDC/asf.xml
+++ b/tmk_core/protocol/lufa/LUFA-git/Bootloaders/CDC/asf.xml
@@ -1,161 +1,161 @@
-<asf xmlversion="1.0">

-	<project caption="CDC Bootloader - 128KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.cdc.avr8.128_4" force-caption="true" workspace-name="lufa_cdc_128kb_4kb_">

-		<require idref="lufa.bootloaders.cdc"/>

-		<require idref="lufa.boards.dummy.avr8"/>

-		<generator value="as5_8"/>

-

-		<device-support value="at90usb1287"/>

-		<config name="lufa.drivers.board.name" value="none"/>

-

-		<config name="config.compiler.optimization.level" value="size"/>

-

-		<build type="define" name="F_CPU" value="16000000UL"/>

-		<build type="define" name="F_USB" value="16000000UL"/>

-

-		<build type="define" name="BOOT_START_ADDR" value="0x1F000"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.text=0x1F000"/>

-

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x1FFA0"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x1FFE0"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x1FFF8"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>

-	</project>

-

-	<project caption="CDC Bootloader - 64KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.cdc.avr8.64_4" force-caption="true" workspace-name="lufa_cdc_64kb_4kb_">

-		<require idref="lufa.bootloaders.cdc"/>

-		<require idref="lufa.boards.dummy.avr8"/>

-		<generator value="as5_8"/>

-

-		<device-support value="at90usb647"/>

-		<config name="lufa.drivers.board.name" value="none"/>

-

-		<config name="config.compiler.optimization.level" value="size"/>

-

-		<build type="define" name="F_CPU" value="16000000UL"/>

-		<build type="define" name="F_USB" value="16000000UL"/>

-

-		<build type="define" name="BOOT_START_ADDR" value="0xF000"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.text=0xF000"/>

-

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0xFFA0"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0xFFE0"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0xFFF8"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>

-	</project>

-

-	<project caption="CDC Bootloader - 32KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.cdc.avr8.32_4" force-caption="true" workspace-name="lufa_cdc_32kb_4kb_">

-		<require idref="lufa.bootloaders.cdc"/>

-		<require idref="lufa.boards.dummy.avr8"/>

-		<generator value="as5_8"/>

-

-		<device-support value="atmega32u4"/>

-		<config name="lufa.drivers.board.name" value="none"/>

-

-		<config name="config.compiler.optimization.level" value="size"/>

-

-		<build type="define" name="F_CPU" value="16000000UL"/>

-		<build type="define" name="F_USB" value="16000000UL"/>

-

-		<build type="define" name="BOOT_START_ADDR" value="0x7000"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.text=0x7000"/>

-

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x7FA0"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x7FE0"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x7FF8"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>

-	</project>

-

-	<project caption="CDC Bootloader - 16KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.cdc.avr8.16_4" force-caption="true" workspace-name="lufa_cdc_16kb_4kb_">

-		<require idref="lufa.bootloaders.cdc"/>

-		<require idref="lufa.boards.dummy.avr8"/>

-		<generator value="as5_8"/>

-

-		<device-support value="atmega16u2"/>

-		<config name="lufa.drivers.board.name" value="none"/>

-

-		<config name="config.compiler.optimization.level" value="size"/>

-

-		<build type="define" name="F_CPU" value="16000000UL"/>

-		<build type="define" name="F_USB" value="16000000UL"/>

-

-		<build type="define" name="BOOT_START_ADDR" value="0x3000"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.text=0x3000"/>

-

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x3FA0"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x3FE0"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x3FF8"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>

-	</project>

-

-	<project caption="CDC Bootloader - 8KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.cdc.avr8.8_4" force-caption="true" workspace-name="lufa_cdc_8kb_4kb_">

-		<require idref="lufa.bootloaders.cdc"/>

-		<require idref="lufa.boards.dummy.avr8"/>

-		<generator value="as5_8"/>

-

-		<device-support value="atmega8u2"/>

-		<config name="lufa.drivers.board.name" value="none"/>

-

-		<config name="config.compiler.optimization.level" value="size"/>

-

-		<build type="define" name="F_CPU" value="16000000UL"/>

-		<build type="define" name="F_USB" value="16000000UL"/>

-

-		<build type="define" name="BOOT_START_ADDR" value="0x1000"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.text=0x1000"/>

-

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x1FA0"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x1FE0"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x1FF8"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>

-	</project>

-

-	<module type="application" id="lufa.bootloaders.cdc" caption="CDC Bootloader">

-		<info type="description" value="summary">

-		CDC Class Bootloader, capable of reprogramming a device using avrdude or other AVR109 protocol compliant software when plugged into a host.

-		</info>

-

- 		<info type="gui-flag" value="move-to-root"/>

-

-		<info type="keyword" value="Technology">

-			<keyword value="Bootloaders"/>

-			<keyword value="USB Device"/>

-		</info>

-

- 		<device-support-alias value="lufa_avr8"/>

-		<device-support-alias value="lufa_xmega"/>

-		<device-support-alias value="lufa_uc3"/>

-

-		<build type="include-path" value="."/>

-		<build type="c-source" value="BootloaderCDC.c"/>

-		<build type="header-file" value="BootloaderCDC.h"/>

-		<build type="c-source" value="Descriptors.c"/>

-		<build type="header-file" value="Descriptors.h"/>

-		<build type="c-source" value="BootloaderAPI.c"/>

-		<build type="header-file" value="BootloaderAPI.h"/>

-		<build type="asm-source" value="BootloaderAPITable.S"/>

-

-		<build type="module-config" subtype="path" value="Config"/>

-		<build type="header-file" value="Config/LUFAConfig.h"/>

-		<build type="header-file" value="Config/AppConfig.h"/>

-

-		<build type="distribute" subtype="user-file" value="doxyfile"/>

-		<build type="distribute" subtype="user-file" value="BootloaderCDC.txt"/>

-		<build type="distribute" subtype="user-file" value="LUFA CDC Bootloader.inf"/>

-

-		<require idref="lufa.common"/>

-		<require idref="lufa.platform"/>

-		<require idref="lufa.drivers.usb"/>

-		<require idref="lufa.drivers.board"/>

-		<require idref="lufa.drivers.board.leds"/>

-	</module>

-</asf>

+<asf xmlversion="1.0">
+	<project caption="CDC Bootloader - 128KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.cdc.avr8.128_4" force-caption="true" workspace-name="lufa_cdc_128kb_4kb_">
+		<require idref="lufa.bootloaders.cdc"/>
+		<require idref="lufa.boards.dummy.avr8"/>
+		<generator value="as5_8"/>
+
+		<device-support value="at90usb1287"/>
+		<config name="lufa.drivers.board.name" value="none"/>
+
+		<config name="config.compiler.optimization.level" value="size"/>
+
+		<build type="define" name="F_CPU" value="16000000UL"/>
+		<build type="define" name="F_USB" value="16000000UL"/>
+
+		<build type="define" name="BOOT_START_ADDR" value="0x1F000"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.text=0x1F000"/>
+
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x1FFA0"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x1FFE0"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x1FFF8"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>
+	</project>
+
+	<project caption="CDC Bootloader - 64KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.cdc.avr8.64_4" force-caption="true" workspace-name="lufa_cdc_64kb_4kb_">
+		<require idref="lufa.bootloaders.cdc"/>
+		<require idref="lufa.boards.dummy.avr8"/>
+		<generator value="as5_8"/>
+
+		<device-support value="at90usb647"/>
+		<config name="lufa.drivers.board.name" value="none"/>
+
+		<config name="config.compiler.optimization.level" value="size"/>
+
+		<build type="define" name="F_CPU" value="16000000UL"/>
+		<build type="define" name="F_USB" value="16000000UL"/>
+
+		<build type="define" name="BOOT_START_ADDR" value="0xF000"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.text=0xF000"/>
+
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0xFFA0"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0xFFE0"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0xFFF8"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>
+	</project>
+
+	<project caption="CDC Bootloader - 32KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.cdc.avr8.32_4" force-caption="true" workspace-name="lufa_cdc_32kb_4kb_">
+		<require idref="lufa.bootloaders.cdc"/>
+		<require idref="lufa.boards.dummy.avr8"/>
+		<generator value="as5_8"/>
+
+		<device-support value="atmega32u4"/>
+		<config name="lufa.drivers.board.name" value="none"/>
+
+		<config name="config.compiler.optimization.level" value="size"/>
+
+		<build type="define" name="F_CPU" value="16000000UL"/>
+		<build type="define" name="F_USB" value="16000000UL"/>
+
+		<build type="define" name="BOOT_START_ADDR" value="0x7000"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.text=0x7000"/>
+
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x7FA0"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x7FE0"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x7FF8"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>
+	</project>
+
+	<project caption="CDC Bootloader - 16KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.cdc.avr8.16_4" force-caption="true" workspace-name="lufa_cdc_16kb_4kb_">
+		<require idref="lufa.bootloaders.cdc"/>
+		<require idref="lufa.boards.dummy.avr8"/>
+		<generator value="as5_8"/>
+
+		<device-support value="atmega16u2"/>
+		<config name="lufa.drivers.board.name" value="none"/>
+
+		<config name="config.compiler.optimization.level" value="size"/>
+
+		<build type="define" name="F_CPU" value="16000000UL"/>
+		<build type="define" name="F_USB" value="16000000UL"/>
+
+		<build type="define" name="BOOT_START_ADDR" value="0x3000"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.text=0x3000"/>
+
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x3FA0"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x3FE0"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x3FF8"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>
+	</project>
+
+	<project caption="CDC Bootloader - 8KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.cdc.avr8.8_4" force-caption="true" workspace-name="lufa_cdc_8kb_4kb_">
+		<require idref="lufa.bootloaders.cdc"/>
+		<require idref="lufa.boards.dummy.avr8"/>
+		<generator value="as5_8"/>
+
+		<device-support value="atmega8u2"/>
+		<config name="lufa.drivers.board.name" value="none"/>
+
+		<config name="config.compiler.optimization.level" value="size"/>
+
+		<build type="define" name="F_CPU" value="16000000UL"/>
+		<build type="define" name="F_USB" value="16000000UL"/>
+
+		<build type="define" name="BOOT_START_ADDR" value="0x1000"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.text=0x1000"/>
+
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x1FA0"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x1FE0"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x1FF8"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>
+	</project>
+
+	<module type="application" id="lufa.bootloaders.cdc" caption="CDC Bootloader">
+		<info type="description" value="summary">
+		CDC Class Bootloader, capable of reprogramming a device using avrdude or other AVR109 protocol compliant software when plugged into a host.
+		</info>
+
+ 		<info type="gui-flag" value="move-to-root"/>
+
+		<info type="keyword" value="Technology">
+			<keyword value="Bootloaders"/>
+			<keyword value="USB Device"/>
+		</info>
+
+ 		<device-support-alias value="lufa_avr8"/>
+		<device-support-alias value="lufa_xmega"/>
+		<device-support-alias value="lufa_uc3"/>
+
+		<build type="include-path" value="."/>
+		<build type="c-source" value="BootloaderCDC.c"/>
+		<build type="header-file" value="BootloaderCDC.h"/>
+		<build type="c-source" value="Descriptors.c"/>
+		<build type="header-file" value="Descriptors.h"/>
+		<build type="c-source" value="BootloaderAPI.c"/>
+		<build type="header-file" value="BootloaderAPI.h"/>
+		<build type="asm-source" value="BootloaderAPITable.S"/>
+
+		<build type="module-config" subtype="path" value="Config"/>
+		<build type="header-file" value="Config/LUFAConfig.h"/>
+		<build type="header-file" value="Config/AppConfig.h"/>
+
+		<build type="distribute" subtype="user-file" value="doxyfile"/>
+		<build type="distribute" subtype="user-file" value="BootloaderCDC.txt"/>
+		<build type="distribute" subtype="user-file" value="LUFA CDC Bootloader.inf"/>
+
+		<require idref="lufa.common"/>
+		<require idref="lufa.platform"/>
+		<require idref="lufa.drivers.usb"/>
+		<require idref="lufa.drivers.board"/>
+		<require idref="lufa.drivers.board.leds"/>
+	</module>
+</asf>
diff --git a/tmk_core/protocol/lufa/LUFA-git/Bootloaders/DFU/asf.xml b/tmk_core/protocol/lufa/LUFA-git/Bootloaders/DFU/asf.xml
index 6f3312b764..f56aba69f5 100644
--- a/tmk_core/protocol/lufa/LUFA-git/Bootloaders/DFU/asf.xml
+++ b/tmk_core/protocol/lufa/LUFA-git/Bootloaders/DFU/asf.xml
@@ -1,156 +1,156 @@
-<asf xmlversion="1.0">

-	<project caption="DFU Bootloader - 128KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.dfu.avr8.128_4" force-caption="true" workspace-name="lufa_dfu_128kb_4kb_">

-		<require idref="lufa.bootloaders.dfu"/>

-		<require idref="lufa.boards.dummy.avr8"/>

-		<generator value="as5_8"/>

-

-		<device-support value="at90usb1287"/>

-		<config name="lufa.drivers.board.name" value="none"/>

-

-		<config name="config.compiler.optimization.level" value="size"/>

-

-		<build type="define" name="F_CPU" value="16000000UL"/>

-		<build type="define" name="F_USB" value="16000000UL"/>

-

-		<build type="define" name="BOOT_START_ADDR" value="0x1F000"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.text=0x1F000"/>

-

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x1FFA0"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x1FFE0"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x1FFF8"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>

-	</project>

-

-	<project caption="DFU Bootloader - 64KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.dfu.avr8.64_4" force-caption="true" workspace-name="lufa_dfu_64kb_4kb_">

-		<require idref="lufa.bootloaders.dfu"/>

-		<require idref="lufa.boards.dummy.avr8"/>

-		<generator value="as5_8"/>

-

-		<device-support value="at90usb647"/>

-		<config name="lufa.drivers.board.name" value="none"/>

-

-		<config name="config.compiler.optimization.level" value="size"/>

-

-		<build type="define" name="F_CPU" value="16000000UL"/>

-		<build type="define" name="F_USB" value="16000000UL"/>

-

-		<build type="define" name="BOOT_START_ADDR" value="0xF000"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.text=0xF000"/>

-

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0xFFA0"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0xFFE0"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0xFFF8"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>

-	</project>

-

-	<project caption="DFU Bootloader - 32KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.dfu.avr8.32_4" force-caption="true" workspace-name="lufa_dfu_32kb_4kb_">

-		<require idref="lufa.bootloaders.dfu"/>

-		<require idref="lufa.boards.dummy.avr8"/>

-		<generator value="as5_8"/>

-

-		<device-support value="atmega32u4"/>

-		<config name="lufa.drivers.board.name" value="none"/>

-

-		<config name="config.compiler.optimization.level" value="size"/>

-

-		<build type="define" name="F_CPU" value="16000000UL"/>

-		<build type="define" name="F_USB" value="16000000UL"/>

-

-		<build type="define" name="BOOT_START_ADDR" value="0x7000"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.text=0x7000"/>

-

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x7FA0"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x7FE0"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x7FF8"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>

-	</project>

-

-	<project caption="DFU Bootloader - 16KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.dfu.avr8.16_4" force-caption="true" workspace-name="lufa_dfu_16kb_4kb_">

-		<require idref="lufa.bootloaders.dfu"/>

-		<require idref="lufa.boards.dummy.avr8"/>

-		<generator value="as5_8"/>

-

-		<device-support value="atmega16u2"/>

-		<config name="lufa.drivers.board.name" value="none"/>

-

-		<build type="define" name="F_CPU" value="16000000UL"/>

-		<build type="define" name="F_USB" value="16000000UL"/>

-

-		<build type="define" name="BOOT_START_ADDR" value="0x3000"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.text=0x3000"/>

-

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x3FA0"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x3FE0"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x3FF8"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>

-	</project>

-

-	<project caption="DFU Bootloader - 8KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.dfu.avr8.8_4" force-caption="true" workspace-name="lufa_dfu_8kb_4kb_">

-		<require idref="lufa.bootloaders.dfu"/>

-		<require idref="lufa.boards.dummy.avr8"/>

-		<generator value="as5_8"/>

-

-		<device-support value="atmega8u2"/>

-		<config name="lufa.drivers.board.name" value="none"/>

-

-		<build type="define" name="F_CPU" value="16000000UL"/>

-		<build type="define" name="F_USB" value="16000000UL"/>

-

-		<build type="define" name="BOOT_START_ADDR" value="0x1000"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.text=0x1000"/>

-

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x1FA0"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x1FE0"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x1FF8"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>

-	</project>

-

-	<module type="application" id="lufa.bootloaders.dfu" caption="DFU Bootloader">

-		<info type="description" value="summary">

-		DFU Class Bootloader, capable of reprogramming a device using the Atmel FLIP or other AVR DFU programming software when plugged into a host.

-		</info>

-

- 		<info type="gui-flag" value="move-to-root"/>

-

-		<info type="keyword" value="Technology">

-			<keyword value="Bootloaders"/>

-			<keyword value="USB Device"/>

-		</info>

-

- 		<device-support-alias value="lufa_avr8"/>

-		<device-support-alias value="lufa_xmega"/>

-		<device-support-alias value="lufa_uc3"/>

-

-		<build type="include-path" value="."/>

-		<build type="c-source" value="BootloaderDFU.c"/>

-		<build type="header-file" value="BootloaderDFU.h"/>

-		<build type="c-source" value="Descriptors.c"/>

-		<build type="header-file" value="Descriptors.h"/>

-		<build type="c-source" value="BootloaderAPI.c"/>

-		<build type="header-file" value="BootloaderAPI.h"/>

-		<build type="asm-source" value="BootloaderAPITable.S"/>

-

-		<build type="module-config" subtype="path" value="Config"/>

-		<build type="header-file" value="Config/LUFAConfig.h"/>

-		<build type="header-file" value="Config/AppConfig.h"/>

-

-		<build type="distribute" subtype="user-file" value="doxyfile"/>

-		<build type="distribute" subtype="user-file" value="BootloaderDFU.txt"/>

-

-		<require idref="lufa.common"/>

-		<require idref="lufa.platform"/>

-		<require idref="lufa.drivers.usb"/>

-		<require idref="lufa.drivers.board"/>

-		<require idref="lufa.drivers.board.leds"/>

-	</module>

-</asf>

+<asf xmlversion="1.0">
+	<project caption="DFU Bootloader - 128KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.dfu.avr8.128_4" force-caption="true" workspace-name="lufa_dfu_128kb_4kb_">
+		<require idref="lufa.bootloaders.dfu"/>
+		<require idref="lufa.boards.dummy.avr8"/>
+		<generator value="as5_8"/>
+
+		<device-support value="at90usb1287"/>
+		<config name="lufa.drivers.board.name" value="none"/>
+
+		<config name="config.compiler.optimization.level" value="size"/>
+
+		<build type="define" name="F_CPU" value="16000000UL"/>
+		<build type="define" name="F_USB" value="16000000UL"/>
+
+		<build type="define" name="BOOT_START_ADDR" value="0x1F000"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.text=0x1F000"/>
+
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x1FFA0"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x1FFE0"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x1FFF8"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>
+	</project>
+
+	<project caption="DFU Bootloader - 64KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.dfu.avr8.64_4" force-caption="true" workspace-name="lufa_dfu_64kb_4kb_">
+		<require idref="lufa.bootloaders.dfu"/>
+		<require idref="lufa.boards.dummy.avr8"/>
+		<generator value="as5_8"/>
+
+		<device-support value="at90usb647"/>
+		<config name="lufa.drivers.board.name" value="none"/>
+
+		<config name="config.compiler.optimization.level" value="size"/>
+
+		<build type="define" name="F_CPU" value="16000000UL"/>
+		<build type="define" name="F_USB" value="16000000UL"/>
+
+		<build type="define" name="BOOT_START_ADDR" value="0xF000"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.text=0xF000"/>
+
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0xFFA0"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0xFFE0"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0xFFF8"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>
+	</project>
+
+	<project caption="DFU Bootloader - 32KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.dfu.avr8.32_4" force-caption="true" workspace-name="lufa_dfu_32kb_4kb_">
+		<require idref="lufa.bootloaders.dfu"/>
+		<require idref="lufa.boards.dummy.avr8"/>
+		<generator value="as5_8"/>
+
+		<device-support value="atmega32u4"/>
+		<config name="lufa.drivers.board.name" value="none"/>
+
+		<config name="config.compiler.optimization.level" value="size"/>
+
+		<build type="define" name="F_CPU" value="16000000UL"/>
+		<build type="define" name="F_USB" value="16000000UL"/>
+
+		<build type="define" name="BOOT_START_ADDR" value="0x7000"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.text=0x7000"/>
+
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x7FA0"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x7FE0"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x7FF8"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>
+	</project>
+
+	<project caption="DFU Bootloader - 16KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.dfu.avr8.16_4" force-caption="true" workspace-name="lufa_dfu_16kb_4kb_">
+		<require idref="lufa.bootloaders.dfu"/>
+		<require idref="lufa.boards.dummy.avr8"/>
+		<generator value="as5_8"/>
+
+		<device-support value="atmega16u2"/>
+		<config name="lufa.drivers.board.name" value="none"/>
+
+		<build type="define" name="F_CPU" value="16000000UL"/>
+		<build type="define" name="F_USB" value="16000000UL"/>
+
+		<build type="define" name="BOOT_START_ADDR" value="0x3000"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.text=0x3000"/>
+
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x3FA0"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x3FE0"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x3FF8"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>
+	</project>
+
+	<project caption="DFU Bootloader - 8KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.dfu.avr8.8_4" force-caption="true" workspace-name="lufa_dfu_8kb_4kb_">
+		<require idref="lufa.bootloaders.dfu"/>
+		<require idref="lufa.boards.dummy.avr8"/>
+		<generator value="as5_8"/>
+
+		<device-support value="atmega8u2"/>
+		<config name="lufa.drivers.board.name" value="none"/>
+
+		<build type="define" name="F_CPU" value="16000000UL"/>
+		<build type="define" name="F_USB" value="16000000UL"/>
+
+		<build type="define" name="BOOT_START_ADDR" value="0x1000"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.text=0x1000"/>
+
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x1FA0"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x1FE0"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x1FF8"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>
+	</project>
+
+	<module type="application" id="lufa.bootloaders.dfu" caption="DFU Bootloader">
+		<info type="description" value="summary">
+		DFU Class Bootloader, capable of reprogramming a device using the Atmel FLIP or other AVR DFU programming software when plugged into a host.
+		</info>
+
+ 		<info type="gui-flag" value="move-to-root"/>
+
+		<info type="keyword" value="Technology">
+			<keyword value="Bootloaders"/>
+			<keyword value="USB Device"/>
+		</info>
+
+ 		<device-support-alias value="lufa_avr8"/>
+		<device-support-alias value="lufa_xmega"/>
+		<device-support-alias value="lufa_uc3"/>
+
+		<build type="include-path" value="."/>
+		<build type="c-source" value="BootloaderDFU.c"/>
+		<build type="header-file" value="BootloaderDFU.h"/>
+		<build type="c-source" value="Descriptors.c"/>
+		<build type="header-file" value="Descriptors.h"/>
+		<build type="c-source" value="BootloaderAPI.c"/>
+		<build type="header-file" value="BootloaderAPI.h"/>
+		<build type="asm-source" value="BootloaderAPITable.S"/>
+
+		<build type="module-config" subtype="path" value="Config"/>
+		<build type="header-file" value="Config/LUFAConfig.h"/>
+		<build type="header-file" value="Config/AppConfig.h"/>
+
+		<build type="distribute" subtype="user-file" value="doxyfile"/>
+		<build type="distribute" subtype="user-file" value="BootloaderDFU.txt"/>
+
+		<require idref="lufa.common"/>
+		<require idref="lufa.platform"/>
+		<require idref="lufa.drivers.usb"/>
+		<require idref="lufa.drivers.board"/>
+		<require idref="lufa.drivers.board.leds"/>
+	</module>
+</asf>
diff --git a/tmk_core/protocol/lufa/LUFA-git/Bootloaders/HID/asf.xml b/tmk_core/protocol/lufa/LUFA-git/Bootloaders/HID/asf.xml
index 9394b13530..c67b9419ed 100644
--- a/tmk_core/protocol/lufa/LUFA-git/Bootloaders/HID/asf.xml
+++ b/tmk_core/protocol/lufa/LUFA-git/Bootloaders/HID/asf.xml
@@ -1,123 +1,123 @@
-<asf xmlversion="1.0">

-	<project caption="HID Bootloader - 128KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.hid.avr8.128_4" force-caption="true" workspace-name="lufa_hid_128kb_4kb_">

-		<require idref="lufa.bootloaders.hid"/>

-		<require idref="lufa.boards.dummy.avr8"/>

-		<generator value="as5_8"/>

-

-		<device-support value="at90usb1287"/>

-		<config name="lufa.drivers.board.name" value="none"/>

-

-		<config name="config.compiler.optimization.level" value="size"/>

-

-		<build type="define" name="F_CPU" value="16000000UL"/>

-		<build type="define" name="F_USB" value="16000000UL"/>

-

-		<build type="define" name="BOOT_START_ADDR" value="0x1F000"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.text=0x1F000"/>

-	</project>

-

-	<project caption="HID Bootloader - 64KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.hid.avr8.64_4" force-caption="true" workspace-name="lufa_hid_64kb_4kb_">

-		<require idref="lufa.bootloaders.hid"/>

-		<require idref="lufa.boards.dummy.avr8"/>

-		<generator value="as5_8"/>

-

-		<device-support value="at90usb647"/>

-		<config name="lufa.drivers.board.name" value="none"/>

-

-		<config name="config.compiler.optimization.level" value="size"/>

-

-		<build type="define" name="F_CPU" value="16000000UL"/>

-		<build type="define" name="F_USB" value="16000000UL"/>

-

-		<build type="define" name="BOOT_START_ADDR" value="0xF000"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.text=0xF000"/>

-	</project>

-

-	<project caption="HID Bootloader - 32KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.hid.avr8.32_4" force-caption="true" workspace-name="lufa_hid_32kb_4kb_">

-		<require idref="lufa.bootloaders.hid"/>

-		<require idref="lufa.boards.dummy.avr8"/>

-		<generator value="as5_8"/>

-

-		<device-support value="atmega32u4"/>

-		<config name="lufa.drivers.board.name" value="none"/>

-

-		<config name="config.compiler.optimization.level" value="size"/>

-

-		<build type="define" name="F_CPU" value="16000000UL"/>

-		<build type="define" name="F_USB" value="16000000UL"/>

-

-		<build type="define" name="BOOT_START_ADDR" value="0x7000"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.text=0x7000"/>

-	</project>

-

-	<project caption="HID Bootloader - 16KB FLASH / 2KB Boot - AVR8 Architecture" id="lufa.bootloaders.hid.avr8.16_2" force-caption="true" workspace-name="lufa_hid_16kb_2kb_">

-		<require idref="lufa.bootloaders.hid"/>

-		<require idref="lufa.boards.dummy.avr8"/>

-		<generator value="as5_8"/>

-

-		<device-support value="atmega16u2"/>

-		<config name="lufa.drivers.board.name" value="none"/>

-

-		<config name="config.compiler.optimization.level" value="size"/>

-

-		<build type="define" name="F_CPU" value="16000000UL"/>

-		<build type="define" name="F_USB" value="16000000UL"/>

-

-		<build type="define" name="BOOT_START_ADDR" value="0x3800"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.text=0x3800"/>

-	</project>

-

-	<project caption="HID Bootloader - 8KB FLASH / 2KB Boot - AVR8 Architecture" id="lufa.bootloaders.hid.avr8.8_2" force-caption="true" workspace-name="lufa_hid_8kb_2kb_">

-		<require idref="lufa.bootloaders.hid"/>

-		<require idref="lufa.boards.dummy.avr8"/>

-		<generator value="as5_8"/>

-

-		<device-support value="atmega8u2"/>

-		<config name="lufa.drivers.board.name" value="none"/>

-

-		<config name="config.compiler.optimization.level" value="size"/>

-

-		<build type="define" name="F_CPU" value="16000000UL"/>

-		<build type="define" name="F_USB" value="16000000UL"/>

-

-		<build type="define" name="BOOT_START_ADDR" value="0x1800"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.text=0x1800"/>

-	</project>

-

-	<module type="application" id="lufa.bootloaders.hid" caption="HID Bootloader">

-		<info type="description" value="summary">

-		HID Class Bootloader, capable of reprogramming a device via a custom cross-platform command line utility when plugged into a host.

-		</info>

-

- 		<info type="gui-flag" value="move-to-root"/>

-

-		<info type="keyword" value="Technology">

-			<keyword value="Bootloaders"/>

-			<keyword value="USB Device"/>

-		</info>

-

-		<device-support-alias value="lufa_avr8"/>

-		<device-support-alias value="lufa_xmega"/>

-		<device-support-alias value="lufa_uc3"/>

-

-		<build type="include-path" value="."/>

-		<build type="c-source" value="BootloaderHID.c"/>

-		<build type="header-file" value="BootloaderHID.h"/>

-		<build type="c-source" value="Descriptors.c"/>

-		<build type="header-file" value="Descriptors.h"/>

-

-		<build type="module-config" subtype="path" value="Config"/>

-		<build type="header-file" value="Config/LUFAConfig.h"/>

-

-		<build type="distribute" subtype="user-file" value="doxyfile"/>

-		<build type="distribute" subtype="user-file" value="BootloaderHID.txt"/>

-		<build type="distribute" subtype="directory" value="HostLoaderApp"/>

-		<build type="distribute" subtype="directory" value="HostLoaderApp_Python"/>

-

-		<require idref="lufa.common"/>

-		<require idref="lufa.platform"/>

-		<require idref="lufa.drivers.usb"/>

-		<require idref="lufa.drivers.board"/>

-		<require idref="lufa.drivers.board.leds"/>

-	</module>

-</asf>

+<asf xmlversion="1.0">
+	<project caption="HID Bootloader - 128KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.hid.avr8.128_4" force-caption="true" workspace-name="lufa_hid_128kb_4kb_">
+		<require idref="lufa.bootloaders.hid"/>
+		<require idref="lufa.boards.dummy.avr8"/>
+		<generator value="as5_8"/>
+
+		<device-support value="at90usb1287"/>
+		<config name="lufa.drivers.board.name" value="none"/>
+
+		<config name="config.compiler.optimization.level" value="size"/>
+
+		<build type="define" name="F_CPU" value="16000000UL"/>
+		<build type="define" name="F_USB" value="16000000UL"/>
+
+		<build type="define" name="BOOT_START_ADDR" value="0x1F000"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.text=0x1F000"/>
+	</project>
+
+	<project caption="HID Bootloader - 64KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.hid.avr8.64_4" force-caption="true" workspace-name="lufa_hid_64kb_4kb_">
+		<require idref="lufa.bootloaders.hid"/>
+		<require idref="lufa.boards.dummy.avr8"/>
+		<generator value="as5_8"/>
+
+		<device-support value="at90usb647"/>
+		<config name="lufa.drivers.board.name" value="none"/>
+
+		<config name="config.compiler.optimization.level" value="size"/>
+
+		<build type="define" name="F_CPU" value="16000000UL"/>
+		<build type="define" name="F_USB" value="16000000UL"/>
+
+		<build type="define" name="BOOT_START_ADDR" value="0xF000"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.text=0xF000"/>
+	</project>
+
+	<project caption="HID Bootloader - 32KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.hid.avr8.32_4" force-caption="true" workspace-name="lufa_hid_32kb_4kb_">
+		<require idref="lufa.bootloaders.hid"/>
+		<require idref="lufa.boards.dummy.avr8"/>
+		<generator value="as5_8"/>
+
+		<device-support value="atmega32u4"/>
+		<config name="lufa.drivers.board.name" value="none"/>
+
+		<config name="config.compiler.optimization.level" value="size"/>
+
+		<build type="define" name="F_CPU" value="16000000UL"/>
+		<build type="define" name="F_USB" value="16000000UL"/>
+
+		<build type="define" name="BOOT_START_ADDR" value="0x7000"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.text=0x7000"/>
+	</project>
+
+	<project caption="HID Bootloader - 16KB FLASH / 2KB Boot - AVR8 Architecture" id="lufa.bootloaders.hid.avr8.16_2" force-caption="true" workspace-name="lufa_hid_16kb_2kb_">
+		<require idref="lufa.bootloaders.hid"/>
+		<require idref="lufa.boards.dummy.avr8"/>
+		<generator value="as5_8"/>
+
+		<device-support value="atmega16u2"/>
+		<config name="lufa.drivers.board.name" value="none"/>
+
+		<config name="config.compiler.optimization.level" value="size"/>
+
+		<build type="define" name="F_CPU" value="16000000UL"/>
+		<build type="define" name="F_USB" value="16000000UL"/>
+
+		<build type="define" name="BOOT_START_ADDR" value="0x3800"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.text=0x3800"/>
+	</project>
+
+	<project caption="HID Bootloader - 8KB FLASH / 2KB Boot - AVR8 Architecture" id="lufa.bootloaders.hid.avr8.8_2" force-caption="true" workspace-name="lufa_hid_8kb_2kb_">
+		<require idref="lufa.bootloaders.hid"/>
+		<require idref="lufa.boards.dummy.avr8"/>
+		<generator value="as5_8"/>
+
+		<device-support value="atmega8u2"/>
+		<config name="lufa.drivers.board.name" value="none"/>
+
+		<config name="config.compiler.optimization.level" value="size"/>
+
+		<build type="define" name="F_CPU" value="16000000UL"/>
+		<build type="define" name="F_USB" value="16000000UL"/>
+
+		<build type="define" name="BOOT_START_ADDR" value="0x1800"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.text=0x1800"/>
+	</project>
+
+	<module type="application" id="lufa.bootloaders.hid" caption="HID Bootloader">
+		<info type="description" value="summary">
+		HID Class Bootloader, capable of reprogramming a device via a custom cross-platform command line utility when plugged into a host.
+		</info>
+
+ 		<info type="gui-flag" value="move-to-root"/>
+
+		<info type="keyword" value="Technology">
+			<keyword value="Bootloaders"/>
+			<keyword value="USB Device"/>
+		</info>
+
+		<device-support-alias value="lufa_avr8"/>
+		<device-support-alias value="lufa_xmega"/>
+		<device-support-alias value="lufa_uc3"/>
+
+		<build type="include-path" value="."/>
+		<build type="c-source" value="BootloaderHID.c"/>
+		<build type="header-file" value="BootloaderHID.h"/>
+		<build type="c-source" value="Descriptors.c"/>
+		<build type="header-file" value="Descriptors.h"/>
+
+		<build type="module-config" subtype="path" value="Config"/>
+		<build type="header-file" value="Config/LUFAConfig.h"/>
+
+		<build type="distribute" subtype="user-file" value="doxyfile"/>
+		<build type="distribute" subtype="user-file" value="BootloaderHID.txt"/>
+		<build type="distribute" subtype="directory" value="HostLoaderApp"/>
+		<build type="distribute" subtype="directory" value="HostLoaderApp_Python"/>
+
+		<require idref="lufa.common"/>
+		<require idref="lufa.platform"/>
+		<require idref="lufa.drivers.usb"/>
+		<require idref="lufa.drivers.board"/>
+		<require idref="lufa.drivers.board.leds"/>
+	</module>
+</asf>
diff --git a/tmk_core/protocol/lufa/LUFA-git/Bootloaders/MassStorage/BootloaderAPITable.S b/tmk_core/protocol/lufa/LUFA-git/Bootloaders/MassStorage/BootloaderAPITable.S
index 6844d4b01c..91fc949666 100644
--- a/tmk_core/protocol/lufa/LUFA-git/Bootloaders/MassStorage/BootloaderAPITable.S
+++ b/tmk_core/protocol/lufa/LUFA-git/Bootloaders/MassStorage/BootloaderAPITable.S
@@ -1,102 +1,102 @@
-/*

-             LUFA Library

-     Copyright (C) Dean Camera, 2014.

-

-  dean [at] fourwalledcubicle [dot] com

-           www.lufa-lib.org

-*/

-

-/*

-  Copyright 2014  Dean Camera (dean [at] fourwalledcubicle [dot] com)

-

-  Permission to use, copy, modify, distribute, and sell this

-  software and its documentation for any purpose is hereby granted

-  without fee, provided that the above copyright notice appear in

-  all copies and that both that the copyright notice and this

-  permission notice and warranty disclaimer appear in supporting

-  documentation, and that the name of the author not be used in

-  advertising or publicity pertaining to distribution of the

-  software without specific, written prior permission.

-

-  The author disclaims all warranties with regard to this

-  software, including all implied warranties of merchantability

-  and fitness.  In no event shall the author be liable for any

-  special, indirect or consequential damages or any damages

-  whatsoever resulting from loss of use, data or profits, whether

-  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 AUX_BOOT_SECTION_SIZE > 0

-#warning Using a AUX bootloader section in addition to the defined bootloader space (see documentation).

-

-; Trampoline to jump over the AUX bootloader section to the start of the bootloader,

-; on devices where an AUX bootloader section is used.

-.section .boot_aux_trampoline, "ax"

-.global Boot_AUX_Trampoline

-Boot_AUX_Trampoline:

-	jmp BOOT_START_ADDR

-#endif

-

-; Trampolines to actual API implementations if the target address is outside the

-; range of a rjmp instruction (can happen with large bootloader sections)

-.section .apitable_trampolines, "ax"

-.global BootloaderAPI_Trampolines

-BootloaderAPI_Trampolines:

-

-	BootloaderAPI_ErasePage_Trampoline:

-		jmp BootloaderAPI_ErasePage

-	BootloaderAPI_WritePage_Trampoline:

-		jmp BootloaderAPI_WritePage

-	BootloaderAPI_FillWord_Trampoline:

-		jmp BootloaderAPI_FillWord

-	BootloaderAPI_ReadSignature_Trampoline:

-		jmp BootloaderAPI_ReadSignature

-	BootloaderAPI_ReadFuse_Trampoline:

-		jmp BootloaderAPI_ReadFuse

-	BootloaderAPI_ReadLock_Trampoline:

-		jmp BootloaderAPI_ReadLock

-	BootloaderAPI_WriteLock_Trampoline:

-		jmp BootloaderAPI_WriteLock

-	BootloaderAPI_UNUSED1:

-		ret

-	BootloaderAPI_UNUSED2:

-		ret

-	BootloaderAPI_UNUSED3:

-		ret

-	BootloaderAPI_UNUSED4:

-		ret

-	BootloaderAPI_UNUSED5:

-		ret

-

-

-

-; API function jump table

-.section .apitable_jumptable, "ax"

-.global BootloaderAPI_JumpTable

-BootloaderAPI_JumpTable:

-

-	rjmp BootloaderAPI_ErasePage_Trampoline

-	rjmp BootloaderAPI_WritePage_Trampoline

-	rjmp BootloaderAPI_FillWord_Trampoline

-	rjmp BootloaderAPI_ReadSignature_Trampoline

-	rjmp BootloaderAPI_ReadFuse_Trampoline

-	rjmp BootloaderAPI_ReadLock_Trampoline

-	rjmp BootloaderAPI_WriteLock_Trampoline

-	rjmp BootloaderAPI_UNUSED1 ; UNUSED ENTRY 1

-	rjmp BootloaderAPI_UNUSED2 ; UNUSED ENTRY 2

-	rjmp BootloaderAPI_UNUSED3 ; UNUSED ENTRY 3

-	rjmp BootloaderAPI_UNUSED4 ; UNUSED ENTRY 4

-	rjmp BootloaderAPI_UNUSED5 ; UNUSED ENTRY 5

-

-

-

-; Bootloader table signatures and information

-.section .apitable_signatures, "ax"

-.global BootloaderAPI_Signatures

-BootloaderAPI_Signatures:

-

-	.long BOOT_START_ADDR ; Start address of the bootloader

-	.word 0xDF30 ; Signature for the MS class bootloader, V1

-	.word 0xDCFB ; Signature for a LUFA class bootloader

+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2014.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2014  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  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 AUX_BOOT_SECTION_SIZE > 0
+#warning Using a AUX bootloader section in addition to the defined bootloader space (see documentation).
+
+; Trampoline to jump over the AUX bootloader section to the start of the bootloader,
+; on devices where an AUX bootloader section is used.
+.section .boot_aux_trampoline, "ax"
+.global Boot_AUX_Trampoline
+Boot_AUX_Trampoline:
+	jmp BOOT_START_ADDR
+#endif
+
+; Trampolines to actual API implementations if the target address is outside the
+; range of a rjmp instruction (can happen with large bootloader sections)
+.section .apitable_trampolines, "ax"
+.global BootloaderAPI_Trampolines
+BootloaderAPI_Trampolines:
+
+	BootloaderAPI_ErasePage_Trampoline:
+		jmp BootloaderAPI_ErasePage
+	BootloaderAPI_WritePage_Trampoline:
+		jmp BootloaderAPI_WritePage
+	BootloaderAPI_FillWord_Trampoline:
+		jmp BootloaderAPI_FillWord
+	BootloaderAPI_ReadSignature_Trampoline:
+		jmp BootloaderAPI_ReadSignature
+	BootloaderAPI_ReadFuse_Trampoline:
+		jmp BootloaderAPI_ReadFuse
+	BootloaderAPI_ReadLock_Trampoline:
+		jmp BootloaderAPI_ReadLock
+	BootloaderAPI_WriteLock_Trampoline:
+		jmp BootloaderAPI_WriteLock
+	BootloaderAPI_UNUSED1:
+		ret
+	BootloaderAPI_UNUSED2:
+		ret
+	BootloaderAPI_UNUSED3:
+		ret
+	BootloaderAPI_UNUSED4:
+		ret
+	BootloaderAPI_UNUSED5:
+		ret
+
+
+
+; API function jump table
+.section .apitable_jumptable, "ax"
+.global BootloaderAPI_JumpTable
+BootloaderAPI_JumpTable:
+
+	rjmp BootloaderAPI_ErasePage_Trampoline
+	rjmp BootloaderAPI_WritePage_Trampoline
+	rjmp BootloaderAPI_FillWord_Trampoline
+	rjmp BootloaderAPI_ReadSignature_Trampoline
+	rjmp BootloaderAPI_ReadFuse_Trampoline
+	rjmp BootloaderAPI_ReadLock_Trampoline
+	rjmp BootloaderAPI_WriteLock_Trampoline
+	rjmp BootloaderAPI_UNUSED1 ; UNUSED ENTRY 1
+	rjmp BootloaderAPI_UNUSED2 ; UNUSED ENTRY 2
+	rjmp BootloaderAPI_UNUSED3 ; UNUSED ENTRY 3
+	rjmp BootloaderAPI_UNUSED4 ; UNUSED ENTRY 4
+	rjmp BootloaderAPI_UNUSED5 ; UNUSED ENTRY 5
+
+
+
+; Bootloader table signatures and information
+.section .apitable_signatures, "ax"
+.global BootloaderAPI_Signatures
+BootloaderAPI_Signatures:
+
+	.long BOOT_START_ADDR ; Start address of the bootloader
+	.word 0xDF30 ; Signature for the MS class bootloader, V1
+	.word 0xDCFB ; Signature for a LUFA class bootloader
diff --git a/tmk_core/protocol/lufa/LUFA-git/Bootloaders/MassStorage/asf.xml b/tmk_core/protocol/lufa/LUFA-git/Bootloaders/MassStorage/asf.xml
index f1d550d1eb..700ffa26ff 100644
--- a/tmk_core/protocol/lufa/LUFA-git/Bootloaders/MassStorage/asf.xml
+++ b/tmk_core/protocol/lufa/LUFA-git/Bootloaders/MassStorage/asf.xml
@@ -1,156 +1,156 @@
-<asf xmlversion="1.0">

-	<project caption="Mass Storage Bootloader - 128KB FLASH / 8KB Boot - AVR8 Architecture" id="lufa.bootloaders.mass_storage.avr8.128_8" force-caption="true" workspace-name="lufa_ms_128kb_8kb_">

-		<require idref="lufa.bootloaders.mass_storage"/>

-		<require idref="lufa.boards.dummy.avr8"/>

-		<generator value="as5_8"/>

-

-		<device-support value="at90usb1287"/>

-		<config name="lufa.drivers.board.name" value="none"/>

-

-		<config name="config.compiler.optimization.level" value="size"/>

-

-		<build type="define" name="F_CPU" value="16000000UL"/>

-		<build type="define" name="F_USB" value="16000000UL"/>

-

-		<build type="define" name="BOOT_START_ADDR" value="0x1E000"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.text=0x1E000"/>

-

-		<build type="define" name="AUX_BOOT_SECTION_SIZE" value="0"/>

-

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x1FFA0"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x1FFE0"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x1FFF8"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>

-	</project>

-

-	<project caption="Mass Storage Bootloader - 64KB FLASH / 8KB Boot - AVR8 Architecture" id="lufa.bootloaders.mass_storage.avr8.64_8" force-caption="true" workspace-name="lufa_ms_64kb_8kb_">

-		<require idref="lufa.bootloaders.mass_storage"/>

-		<require idref="lufa.boards.dummy.avr8"/>

-		<generator value="as5_8"/>

-

-		<device-support value="at90usb647"/>

-		<config name="lufa.drivers.board.name" value="none"/>

-

-		<config name="config.compiler.optimization.level" value="size"/>

-

-		<build type="define" name="F_CPU" value="16000000UL"/>

-		<build type="define" name="F_USB" value="16000000UL"/>

-

-		<build type="define" name="BOOT_START_ADDR" value="0xE000"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.text=0xE000"/>

-

-		<build type="define" name="AUX_BOOT_SECTION_SIZE" value="0"/>

-

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0xFFA0"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0xFFE0"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0xFFF8"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>

-	</project>

-

-	<project caption="Mass Storage Bootloader - 32KB FLASH / 4KB Boot (2KB AUX) - AVR8 Architecture" id="lufa.bootloaders.mass_storage.avr8.32_4" force-caption="true" workspace-name="lufa_ms_32kb_4kb_">

-		<require idref="lufa.bootloaders.mass_storage"/>

-		<require idref="lufa.boards.dummy.avr8"/>

-		<generator value="as5_8"/>

-

-		<device-support value="atmega32u4"/>

-		<config name="lufa.drivers.board.name" value="none"/>

-

-		<config name="config.compiler.optimization.level" value="size"/>

-

-		<build type="define" name="F_CPU" value="16000000UL"/>

-		<build type="define" name="F_USB" value="16000000UL"/>

-

-		<build type="define" name="BOOT_START_ADDR" value="0x7000"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.text=0x7000"/>

-

-		<build type="define" name="AUX_BOOT_SECTION_SIZE" value="2048"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.boot_aux=0x6810"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.boot_aux_trampoline=0x6800"/>

-		<build type="linker-config" subtype="flags" value="--undefined=Boot_AUX_Trampoline"/>

-

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x7FA0"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x7FE0"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x7FF8"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>

-	</project>

-

-	<project caption="Mass Storage Bootloader - 16KB FLASH / 4KB Boot (2KB AUX) - AVR8 Architecture" id="lufa.bootloaders.mass_storage.avr8.16_4" force-caption="true" workspace-name="lufa_ms_16kb_4kb_">

-		<require idref="lufa.bootloaders.mass_storage"/>

-		<require idref="lufa.boards.dummy.avr8"/>

-		<generator value="as5_8"/>

-

-		<device-support value="atmega16u2"/>

-		<config name="lufa.drivers.board.name" value="none"/>

-

-		<config name="config.compiler.optimization.level" value="size"/>

-

-		<build type="define" name="F_CPU" value="16000000UL"/>

-		<build type="define" name="F_USB" value="16000000UL"/>

-

-		<build type="define" name="BOOT_START_ADDR" value="0x3000"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.text=0x3000"/>

-

-		<build type="define" name="AUX_BOOT_SECTION_SIZE" value="2048"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.boot_aux=0x2810"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.boot_aux_trampoline=0x2800"/>

-		<build type="linker-config" subtype="flags" value="--undefined=Boot_AUX_Trampoline"/>

-

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x3FA0"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x3FE0"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x3FF8"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>

-	</project>

-

-	<module type="application" id="lufa.bootloaders.mass_storage" caption="Mass Storage Bootloader">

-		<info type="description" value="summary">

-		Mass Storage Class Bootloader, capable of reprogramming a device via binary BIN files copied to the virtual FAT12 file-system it creates when plugged into a host.

-		</info>

-

- 		<info type="gui-flag" value="move-to-root"/>

-

-		<info type="keyword" value="Technology">

-			<keyword value="Bootloaders"/>

-			<keyword value="USB Device"/>

-		</info>

-

-		<device-support-alias value="lufa_avr8"/>

-		<device-support-alias value="lufa_xmega"/>

-		<device-support-alias value="lufa_uc3"/>

-

-		<build type="include-path" value="."/>

-		<build type="c-source" value="BootloaderMassStorage.c"/>

-		<build type="header-file" value="BootloaderMassStorage.h"/>

-		<build type="c-source" value="Descriptors.c"/>

-		<build type="header-file" value="Descriptors.h"/>

-		<build type="c-source" value="BootloaderAPI.c"/>

-		<build type="header-file" value="BootloaderAPI.h"/>

-		<build type="asm-source" value="BootloaderAPITable.S"/>

-

-		<build type="module-config" subtype="path" value="Config"/>

-		<build type="header-file" value="Config/LUFAConfig.h"/>

-		<build type="header-file" value="Config/AppConfig.h"/>

-

-		<build type="include-path" value="Lib"/>

-		<build type="header-file" value="Lib/VirtualFAT.h"/>

-		<build type="c-source" value="Lib/VirtualFAT.c"/>

-		<build type="header-file" value="Lib/SCSI.h"/>

-		<build type="c-source" value="Lib/SCSI.c"/>

-

-		<build type="distribute" subtype="user-file" value="doxyfile"/>

-		<build type="distribute" subtype="user-file" value="BootloaderMassStorage.txt"/>

-

-		<require idref="lufa.common"/>

-		<require idref="lufa.platform"/>

-		<require idref="lufa.drivers.usb"/>

-		<require idref="lufa.drivers.board"/>

-		<require idref="lufa.drivers.board.leds"/>

-	</module>

-</asf>

+<asf xmlversion="1.0">
+	<project caption="Mass Storage Bootloader - 128KB FLASH / 8KB Boot - AVR8 Architecture" id="lufa.bootloaders.mass_storage.avr8.128_8" force-caption="true" workspace-name="lufa_ms_128kb_8kb_">
+		<require idref="lufa.bootloaders.mass_storage"/>
+		<require idref="lufa.boards.dummy.avr8"/>
+		<generator value="as5_8"/>
+
+		<device-support value="at90usb1287"/>
+		<config name="lufa.drivers.board.name" value="none"/>
+
+		<config name="config.compiler.optimization.level" value="size"/>
+
+		<build type="define" name="F_CPU" value="16000000UL"/>
+		<build type="define" name="F_USB" value="16000000UL"/>
+
+		<build type="define" name="BOOT_START_ADDR" value="0x1E000"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.text=0x1E000"/>
+
+		<build type="define" name="AUX_BOOT_SECTION_SIZE" value="0"/>
+
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x1FFA0"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x1FFE0"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x1FFF8"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>
+	</project>
+
+	<project caption="Mass Storage Bootloader - 64KB FLASH / 8KB Boot - AVR8 Architecture" id="lufa.bootloaders.mass_storage.avr8.64_8" force-caption="true" workspace-name="lufa_ms_64kb_8kb_">
+		<require idref="lufa.bootloaders.mass_storage"/>
+		<require idref="lufa.boards.dummy.avr8"/>
+		<generator value="as5_8"/>
+
+		<device-support value="at90usb647"/>
+		<config name="lufa.drivers.board.name" value="none"/>
+
+		<config name="config.compiler.optimization.level" value="size"/>
+
+		<build type="define" name="F_CPU" value="16000000UL"/>
+		<build type="define" name="F_USB" value="16000000UL"/>
+
+		<build type="define" name="BOOT_START_ADDR" value="0xE000"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.text=0xE000"/>
+
+		<build type="define" name="AUX_BOOT_SECTION_SIZE" value="0"/>
+
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0xFFA0"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0xFFE0"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0xFFF8"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>
+	</project>
+
+	<project caption="Mass Storage Bootloader - 32KB FLASH / 4KB Boot (2KB AUX) - AVR8 Architecture" id="lufa.bootloaders.mass_storage.avr8.32_4" force-caption="true" workspace-name="lufa_ms_32kb_4kb_">
+		<require idref="lufa.bootloaders.mass_storage"/>
+		<require idref="lufa.boards.dummy.avr8"/>
+		<generator value="as5_8"/>
+
+		<device-support value="atmega32u4"/>
+		<config name="lufa.drivers.board.name" value="none"/>
+
+		<config name="config.compiler.optimization.level" value="size"/>
+
+		<build type="define" name="F_CPU" value="16000000UL"/>
+		<build type="define" name="F_USB" value="16000000UL"/>
+
+		<build type="define" name="BOOT_START_ADDR" value="0x7000"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.text=0x7000"/>
+
+		<build type="define" name="AUX_BOOT_SECTION_SIZE" value="2048"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.boot_aux=0x6810"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.boot_aux_trampoline=0x6800"/>
+		<build type="linker-config" subtype="flags" value="--undefined=Boot_AUX_Trampoline"/>
+
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x7FA0"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x7FE0"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x7FF8"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>
+	</project>
+
+	<project caption="Mass Storage Bootloader - 16KB FLASH / 4KB Boot (2KB AUX) - AVR8 Architecture" id="lufa.bootloaders.mass_storage.avr8.16_4" force-caption="true" workspace-name="lufa_ms_16kb_4kb_">
+		<require idref="lufa.bootloaders.mass_storage"/>
+		<require idref="lufa.boards.dummy.avr8"/>
+		<generator value="as5_8"/>
+
+		<device-support value="atmega16u2"/>
+		<config name="lufa.drivers.board.name" value="none"/>
+
+		<config name="config.compiler.optimization.level" value="size"/>
+
+		<build type="define" name="F_CPU" value="16000000UL"/>
+		<build type="define" name="F_USB" value="16000000UL"/>
+
+		<build type="define" name="BOOT_START_ADDR" value="0x3000"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.text=0x3000"/>
+
+		<build type="define" name="AUX_BOOT_SECTION_SIZE" value="2048"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.boot_aux=0x2810"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.boot_aux_trampoline=0x2800"/>
+		<build type="linker-config" subtype="flags" value="--undefined=Boot_AUX_Trampoline"/>
+
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x3FA0"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x3FE0"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x3FF8"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>
+	</project>
+
+	<module type="application" id="lufa.bootloaders.mass_storage" caption="Mass Storage Bootloader">
+		<info type="description" value="summary">
+		Mass Storage Class Bootloader, capable of reprogramming a device via binary BIN files copied to the virtual FAT12 file-system it creates when plugged into a host.
+		</info>
+
+ 		<info type="gui-flag" value="move-to-root"/>
+
+		<info type="keyword" value="Technology">
+			<keyword value="Bootloaders"/>
+			<keyword value="USB Device"/>
+		</info>
+
+		<device-support-alias value="lufa_avr8"/>
+		<device-support-alias value="lufa_xmega"/>
+		<device-support-alias value="lufa_uc3"/>
+
+		<build type="include-path" value="."/>
+		<build type="c-source" value="BootloaderMassStorage.c"/>
+		<build type="header-file" value="BootloaderMassStorage.h"/>
+		<build type="c-source" value="Descriptors.c"/>
+		<build type="header-file" value="Descriptors.h"/>
+		<build type="c-source" value="BootloaderAPI.c"/>
+		<build type="header-file" value="BootloaderAPI.h"/>
+		<build type="asm-source" value="BootloaderAPITable.S"/>
+
+		<build type="module-config" subtype="path" value="Config"/>
+		<build type="header-file" value="Config/LUFAConfig.h"/>
+		<build type="header-file" value="Config/AppConfig.h"/>
+
+		<build type="include-path" value="Lib"/>
+		<build type="header-file" value="Lib/VirtualFAT.h"/>
+		<build type="c-source" value="Lib/VirtualFAT.c"/>
+		<build type="header-file" value="Lib/SCSI.h"/>
+		<build type="c-source" value="Lib/SCSI.c"/>
+
+		<build type="distribute" subtype="user-file" value="doxyfile"/>
+		<build type="distribute" subtype="user-file" value="BootloaderMassStorage.txt"/>
+
+		<require idref="lufa.common"/>
+		<require idref="lufa.platform"/>
+		<require idref="lufa.drivers.usb"/>
+		<require idref="lufa.drivers.board"/>
+		<require idref="lufa.drivers.board.leds"/>
+	</module>
+</asf>
diff --git a/tmk_core/protocol/lufa/LUFA-git/Bootloaders/MassStorage/makefile b/tmk_core/protocol/lufa/LUFA-git/Bootloaders/MassStorage/makefile
index 91bb4038e8..a0edb2c4f5 100644
--- a/tmk_core/protocol/lufa/LUFA-git/Bootloaders/MassStorage/makefile
+++ b/tmk_core/protocol/lufa/LUFA-git/Bootloaders/MassStorage/makefile
@@ -1,68 +1,68 @@
-#

-#             LUFA Library

-#     Copyright (C) Dean Camera, 2014.

-#

-#  dean [at] fourwalledcubicle [dot] com

-#           www.lufa-lib.org

-#

-# --------------------------------------

-#         LUFA Project Makefile.

-# --------------------------------------

-

-# Run "make help" for target help.

-

-MCU          = at90usb1287

-ARCH         = AVR8

-BOARD        = USBKEY

-F_CPU        = 8000000

-F_USB        = $(F_CPU)

-OPTIMIZATION = s

-TARGET       = BootloaderMassStorage

-SRC          = $(TARGET).c Descriptors.c BootloaderAPI.c BootloaderAPITable.S Lib/SCSI.c Lib/VirtualFAT.c $(LUFA_SRC_USB) $(LUFA_SRC_USBCLASS)

-LUFA_PATH    = ../../LUFA

-CC_FLAGS     = -DUSE_LUFA_CONFIG_HEADER -IConfig/ -DBOOT_START_ADDR=$(BOOT_START_OFFSET)

-LD_FLAGS     = -Wl,--section-start=.text=$(BOOT_START_OFFSET) $(BOOT_API_LD_FLAGS)

-

-# Flash size and bootloader section sizes of the target, in KB. These must

-# match the target's total FLASH size and the bootloader size set in the

-# device's fuses.

-FLASH_SIZE_KB         = 128

-BOOT_SECTION_SIZE_KB  = 8

-

-# Bootloader address calculation formulas

-# Do not modify these macros, but rather modify the dependent values above.

-CALC_ADDRESS_IN_HEX   = $(shell printf "0x%X" $$(( $(1) )) )

-BOOT_START_OFFSET     = $(call CALC_ADDRESS_IN_HEX, ($(FLASH_SIZE_KB) - $(BOOT_SECTION_SIZE_KB)) * 1024 )

-BOOT_SEC_OFFSET       = $(call CALC_ADDRESS_IN_HEX, ($(FLASH_SIZE_KB) * 1024) - ($(strip $(1))) )

-

-# Bootloader linker section flags for relocating the API table sections to

-# known FLASH addresses - these should not normally be user-edited.

-BOOT_SECTION_LD_FLAG  = -Wl,--section-start=$(strip $(1))=$(call BOOT_SEC_OFFSET, $(3)) -Wl,--undefined=$(strip $(2))

-BOOT_API_LD_FLAGS     = $(call BOOT_SECTION_LD_FLAG, .apitable_trampolines, BootloaderAPI_Trampolines, 96)

-BOOT_API_LD_FLAGS    += $(call BOOT_SECTION_LD_FLAG, .apitable_jumptable,   BootloaderAPI_JumpTable,   32)

-BOOT_API_LD_FLAGS    += $(call BOOT_SECTION_LD_FLAG, .apitable_signatures,  BootloaderAPI_Signatures,  8)

-

-# Check if the bootloader needs an AUX section, located before the real bootloader section to store some of the

-# bootloader code. This is required for 32KB and smaller devices, where the actual bootloader is 6KB but the maximum

-# bootloader section size is 4KB. The actual usable application space will be reduced by 6KB for these devices.

-ifeq ($(BOOT_SECTION_SIZE_KB),8)

-  CC_FLAGS           += -DAUX_BOOT_SECTION_SIZE=0

-else

-  AUX_BOOT_SECTION_SIZE_KB = (6 - $(BOOT_SECTION_SIZE_KB))

-

-  CC_FLAGS           += -DAUX_BOOT_SECTION_SIZE='($(AUX_BOOT_SECTION_SIZE_KB) * 1024)'

-  LD_FLAGS           += -Wl,--section-start=.boot_aux=$(call BOOT_SEC_OFFSET, (($(BOOT_SECTION_SIZE_KB) + $(AUX_BOOT_SECTION_SIZE_KB)) * 1024 - 16))

-  LD_FLAGS           += $(call BOOT_SECTION_LD_FLAG, .boot_aux_trampoline, Boot_AUX_Trampoline, ($(BOOT_SECTION_SIZE_KB) + $(AUX_BOOT_SECTION_SIZE_KB)) * 1024)

-endif

-

-# Default target

-all:

-

-# Include LUFA build script makefiles

-include $(LUFA_PATH)/Build/lufa_core.mk

-include $(LUFA_PATH)/Build/lufa_sources.mk

-include $(LUFA_PATH)/Build/lufa_build.mk

-include $(LUFA_PATH)/Build/lufa_cppcheck.mk

-include $(LUFA_PATH)/Build/lufa_doxygen.mk

-include $(LUFA_PATH)/Build/lufa_avrdude.mk

-include $(LUFA_PATH)/Build/lufa_atprogram.mk

+#
+#             LUFA Library
+#     Copyright (C) Dean Camera, 2014.
+#
+#  dean [at] fourwalledcubicle [dot] com
+#           www.lufa-lib.org
+#
+# --------------------------------------
+#         LUFA Project Makefile.
+# --------------------------------------
+
+# Run "make help" for target help.
+
+MCU          = at90usb1287
+ARCH         = AVR8
+BOARD        = USBKEY
+F_CPU        = 8000000
+F_USB        = $(F_CPU)
+OPTIMIZATION = s
+TARGET       = BootloaderMassStorage
+SRC          = $(TARGET).c Descriptors.c BootloaderAPI.c BootloaderAPITable.S Lib/SCSI.c Lib/VirtualFAT.c $(LUFA_SRC_USB) $(LUFA_SRC_USBCLASS)
+LUFA_PATH    = ../../LUFA
+CC_FLAGS     = -DUSE_LUFA_CONFIG_HEADER -IConfig/ -DBOOT_START_ADDR=$(BOOT_START_OFFSET)
+LD_FLAGS     = -Wl,--section-start=.text=$(BOOT_START_OFFSET) $(BOOT_API_LD_FLAGS)
+
+# Flash size and bootloader section sizes of the target, in KB. These must
+# match the target's total FLASH size and the bootloader size set in the
+# device's fuses.
+FLASH_SIZE_KB         = 128
+BOOT_SECTION_SIZE_KB  = 8
+
+# Bootloader address calculation formulas
+# Do not modify these macros, but rather modify the dependent values above.
+CALC_ADDRESS_IN_HEX   = $(shell printf "0x%X" $$(( $(1) )) )
+BOOT_START_OFFSET     = $(call CALC_ADDRESS_IN_HEX, ($(FLASH_SIZE_KB) - $(BOOT_SECTION_SIZE_KB)) * 1024 )
+BOOT_SEC_OFFSET       = $(call CALC_ADDRESS_IN_HEX, ($(FLASH_SIZE_KB) * 1024) - ($(strip $(1))) )
+
+# Bootloader linker section flags for relocating the API table sections to
+# known FLASH addresses - these should not normally be user-edited.
+BOOT_SECTION_LD_FLAG  = -Wl,--section-start=$(strip $(1))=$(call BOOT_SEC_OFFSET, $(3)) -Wl,--undefined=$(strip $(2))
+BOOT_API_LD_FLAGS     = $(call BOOT_SECTION_LD_FLAG, .apitable_trampolines, BootloaderAPI_Trampolines, 96)
+BOOT_API_LD_FLAGS    += $(call BOOT_SECTION_LD_FLAG, .apitable_jumptable,   BootloaderAPI_JumpTable,   32)
+BOOT_API_LD_FLAGS    += $(call BOOT_SECTION_LD_FLAG, .apitable_signatures,  BootloaderAPI_Signatures,  8)
+
+# Check if the bootloader needs an AUX section, located before the real bootloader section to store some of the
+# bootloader code. This is required for 32KB and smaller devices, where the actual bootloader is 6KB but the maximum
+# bootloader section size is 4KB. The actual usable application space will be reduced by 6KB for these devices.
+ifeq ($(BOOT_SECTION_SIZE_KB),8)
+  CC_FLAGS           += -DAUX_BOOT_SECTION_SIZE=0
+else
+  AUX_BOOT_SECTION_SIZE_KB = (6 - $(BOOT_SECTION_SIZE_KB))
+
+  CC_FLAGS           += -DAUX_BOOT_SECTION_SIZE='($(AUX_BOOT_SECTION_SIZE_KB) * 1024)'
+  LD_FLAGS           += -Wl,--section-start=.boot_aux=$(call BOOT_SEC_OFFSET, (($(BOOT_SECTION_SIZE_KB) + $(AUX_BOOT_SECTION_SIZE_KB)) * 1024 - 16))
+  LD_FLAGS           += $(call BOOT_SECTION_LD_FLAG, .boot_aux_trampoline, Boot_AUX_Trampoline, ($(BOOT_SECTION_SIZE_KB) + $(AUX_BOOT_SECTION_SIZE_KB)) * 1024)
+endif
+
+# Default target
+all:
+
+# Include LUFA build script makefiles
+include $(LUFA_PATH)/Build/lufa_core.mk
+include $(LUFA_PATH)/Build/lufa_sources.mk
+include $(LUFA_PATH)/Build/lufa_build.mk
+include $(LUFA_PATH)/Build/lufa_cppcheck.mk
+include $(LUFA_PATH)/Build/lufa_doxygen.mk
+include $(LUFA_PATH)/Build/lufa_avrdude.mk
+include $(LUFA_PATH)/Build/lufa_atprogram.mk
diff --git a/tmk_core/protocol/lufa/LUFA-git/Bootloaders/Printer/BootloaderAPITable.S b/tmk_core/protocol/lufa/LUFA-git/Bootloaders/Printer/BootloaderAPITable.S
index ec499b74e5..88c51da825 100644
--- a/tmk_core/protocol/lufa/LUFA-git/Bootloaders/Printer/BootloaderAPITable.S
+++ b/tmk_core/protocol/lufa/LUFA-git/Bootloaders/Printer/BootloaderAPITable.S
@@ -1,91 +1,91 @@
-/*

-             LUFA Library

-     Copyright (C) Dean Camera, 2014.

-

-  dean [at] fourwalledcubicle [dot] com

-           www.lufa-lib.org

-*/

-

-/*

-  Copyright 2014  Dean Camera (dean [at] fourwalledcubicle [dot] com)

-

-  Permission to use, copy, modify, distribute, and sell this

-  software and its documentation for any purpose is hereby granted

-  without fee, provided that the above copyright notice appear in

-  all copies and that both that the copyright notice and this

-  permission notice and warranty disclaimer appear in supporting

-  documentation, and that the name of the author not be used in

-  advertising or publicity pertaining to distribution of the

-  software without specific, written prior permission.

-

-  The author disclaims all warranties with regard to this

-  software, including all implied warranties of merchantability

-  and fitness.  In no event shall the author be liable for any

-  special, indirect or consequential damages or any damages

-  whatsoever resulting from loss of use, data or profits, whether

-  in an action of contract, negligence or other tortious action,

-  arising out of or in connection with the use or performance of

-  this software.

-*/

-

-; Trampolines to actual API implementations if the target address is outside the

-; range of a rjmp instruction (can happen with large bootloader sections)

-.section .apitable_trampolines, "ax"

-.global BootloaderAPI_Trampolines

-BootloaderAPI_Trampolines:

-

-	BootloaderAPI_ErasePage_Trampoline:

-		jmp BootloaderAPI_ErasePage

-	BootloaderAPI_WritePage_Trampoline:

-		jmp BootloaderAPI_WritePage

-	BootloaderAPI_FillWord_Trampoline:

-		jmp BootloaderAPI_FillWord

-	BootloaderAPI_ReadSignature_Trampoline:

-		jmp BootloaderAPI_ReadSignature

-	BootloaderAPI_ReadFuse_Trampoline:

-		jmp BootloaderAPI_ReadFuse

-	BootloaderAPI_ReadLock_Trampoline:

-		jmp BootloaderAPI_ReadLock

-	BootloaderAPI_WriteLock_Trampoline:

-		jmp BootloaderAPI_WriteLock

-	BootloaderAPI_UNUSED1:

-		ret

-	BootloaderAPI_UNUSED2:

-		ret

-	BootloaderAPI_UNUSED3:

-		ret

-	BootloaderAPI_UNUSED4:

-		ret

-	BootloaderAPI_UNUSED5:

-		ret

-

-

-

-; API function jump table

-.section .apitable_jumptable, "ax"

-.global BootloaderAPI_JumpTable

-BootloaderAPI_JumpTable:

-

-	rjmp BootloaderAPI_ErasePage_Trampoline

-	rjmp BootloaderAPI_WritePage_Trampoline

-	rjmp BootloaderAPI_FillWord_Trampoline

-	rjmp BootloaderAPI_ReadSignature_Trampoline

-	rjmp BootloaderAPI_ReadFuse_Trampoline

-	rjmp BootloaderAPI_ReadLock_Trampoline

-	rjmp BootloaderAPI_WriteLock_Trampoline

-	rjmp BootloaderAPI_UNUSED1 ; UNUSED ENTRY 1

-	rjmp BootloaderAPI_UNUSED2 ; UNUSED ENTRY 2

-	rjmp BootloaderAPI_UNUSED3 ; UNUSED ENTRY 3

-	rjmp BootloaderAPI_UNUSED4 ; UNUSED ENTRY 4

-	rjmp BootloaderAPI_UNUSED5 ; UNUSED ENTRY 5

-

-

-

-; Bootloader table signatures and information

-.section .apitable_signatures, "ax"

-.global BootloaderAPI_Signatures

-BootloaderAPI_Signatures:

-

-	.long BOOT_START_ADDR ; Start address of the bootloader

-	.word 0xDF20 ; Signature for the Printer class bootloader

-	.word 0xDCFB ; Signature for a LUFA class bootloader

+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2014.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2014  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
+  software without specific, written prior permission.
+
+  The author disclaims all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+; Trampolines to actual API implementations if the target address is outside the
+; range of a rjmp instruction (can happen with large bootloader sections)
+.section .apitable_trampolines, "ax"
+.global BootloaderAPI_Trampolines
+BootloaderAPI_Trampolines:
+
+	BootloaderAPI_ErasePage_Trampoline:
+		jmp BootloaderAPI_ErasePage
+	BootloaderAPI_WritePage_Trampoline:
+		jmp BootloaderAPI_WritePage
+	BootloaderAPI_FillWord_Trampoline:
+		jmp BootloaderAPI_FillWord
+	BootloaderAPI_ReadSignature_Trampoline:
+		jmp BootloaderAPI_ReadSignature
+	BootloaderAPI_ReadFuse_Trampoline:
+		jmp BootloaderAPI_ReadFuse
+	BootloaderAPI_ReadLock_Trampoline:
+		jmp BootloaderAPI_ReadLock
+	BootloaderAPI_WriteLock_Trampoline:
+		jmp BootloaderAPI_WriteLock
+	BootloaderAPI_UNUSED1:
+		ret
+	BootloaderAPI_UNUSED2:
+		ret
+	BootloaderAPI_UNUSED3:
+		ret
+	BootloaderAPI_UNUSED4:
+		ret
+	BootloaderAPI_UNUSED5:
+		ret
+
+
+
+; API function jump table
+.section .apitable_jumptable, "ax"
+.global BootloaderAPI_JumpTable
+BootloaderAPI_JumpTable:
+
+	rjmp BootloaderAPI_ErasePage_Trampoline
+	rjmp BootloaderAPI_WritePage_Trampoline
+	rjmp BootloaderAPI_FillWord_Trampoline
+	rjmp BootloaderAPI_ReadSignature_Trampoline
+	rjmp BootloaderAPI_ReadFuse_Trampoline
+	rjmp BootloaderAPI_ReadLock_Trampoline
+	rjmp BootloaderAPI_WriteLock_Trampoline
+	rjmp BootloaderAPI_UNUSED1 ; UNUSED ENTRY 1
+	rjmp BootloaderAPI_UNUSED2 ; UNUSED ENTRY 2
+	rjmp BootloaderAPI_UNUSED3 ; UNUSED ENTRY 3
+	rjmp BootloaderAPI_UNUSED4 ; UNUSED ENTRY 4
+	rjmp BootloaderAPI_UNUSED5 ; UNUSED ENTRY 5
+
+
+
+; Bootloader table signatures and information
+.section .apitable_signatures, "ax"
+.global BootloaderAPI_Signatures
+BootloaderAPI_Signatures:
+
+	.long BOOT_START_ADDR ; Start address of the bootloader
+	.word 0xDF20 ; Signature for the Printer class bootloader
+	.word 0xDCFB ; Signature for a LUFA class bootloader
diff --git a/tmk_core/protocol/lufa/LUFA-git/Bootloaders/Printer/asf.xml b/tmk_core/protocol/lufa/LUFA-git/Bootloaders/Printer/asf.xml
index 86a56911ed..b5c0c6b3a5 100644
--- a/tmk_core/protocol/lufa/LUFA-git/Bootloaders/Printer/asf.xml
+++ b/tmk_core/protocol/lufa/LUFA-git/Bootloaders/Printer/asf.xml
@@ -1,159 +1,159 @@
-<asf xmlversion="1.0">

-	<project caption="Printer Bootloader - 128KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.printer.avr8.128_4" force-caption="true" workspace-name="lufa_printer_128kb_4kb_">

-		<require idref="lufa.bootloaders.printer"/>

-		<require idref="lufa.boards.dummy.avr8"/>

-		<generator value="as5_8"/>

-

-		<device-support value="at90usb1287"/>

-		<config name="lufa.drivers.board.name" value="none"/>

-

-		<config name="config.compiler.optimization.level" value="size"/>

-

-		<build type="define" name="F_CPU" value="16000000UL"/>

-		<build type="define" name="F_USB" value="16000000UL"/>

-

-		<build type="define" name="BOOT_START_ADDR" value="0x1F000"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.text=0x1F000"/>

-

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x1FFA0"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x1FFE0"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x1FFF8"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>

-	</project>

-

-	<project caption="Printer Bootloader - 64KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.printer.avr8.64_4" force-caption="true" workspace-name="lufa_printer_64kb_4kb_">

-		<require idref="lufa.bootloaders.printer"/>

-		<require idref="lufa.boards.dummy.avr8"/>

-		<generator value="as5_8"/>

-

-		<device-support value="at90usb647"/>

-		<config name="lufa.drivers.board.name" value="none"/>

-

-		<config name="config.compiler.optimization.level" value="size"/>

-

-		<build type="define" name="F_CPU" value="16000000UL"/>

-		<build type="define" name="F_USB" value="16000000UL"/>

-

-		<build type="define" name="BOOT_START_ADDR" value="0xF000"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.text=0xF000"/>

-

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0xFFA0"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0xFFE0"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0xFFF8"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>

-	</project>

-

-	<project caption="Printer Bootloader - 32KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.printer.avr8.32_4" force-caption="true" workspace-name="lufa_printer_32kb_4kb_">

-		<require idref="lufa.bootloaders.printer"/>

-		<require idref="lufa.boards.dummy.avr8"/>

-		<generator value="as5_8"/>

-

-		<device-support value="atmega32u4"/>

-		<config name="lufa.drivers.board.name" value="none"/>

-

-		<config name="config.compiler.optimization.level" value="size"/>

-

-		<build type="define" name="F_CPU" value="16000000UL"/>

-		<build type="define" name="F_USB" value="16000000UL"/>

-

-		<build type="define" name="BOOT_START_ADDR" value="0x7000"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.text=0x7000"/>

-

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x7FA0"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x7FE0"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x7FF8"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>

-	</project>

-

-	<project caption="Printer Bootloader - 16KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.printer.avr8.16_4" force-caption="true" workspace-name="lufa_printer_16kb_4kb_">

-		<require idref="lufa.bootloaders.printer"/>

-		<require idref="lufa.boards.dummy.avr8"/>

-		<generator value="as5_8"/>

-

-		<device-support value="atmega16u2"/>

-		<config name="lufa.drivers.board.name" value="none"/>

-

-		<config name="config.compiler.optimization.level" value="size"/>

-

-		<build type="define" name="F_CPU" value="16000000UL"/>

-		<build type="define" name="F_USB" value="16000000UL"/>

-

-		<build type="define" name="BOOT_START_ADDR" value="0x3000"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.text=0x3000"/>

-

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x3FA0"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x3FE0"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x3FF8"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>

-	</project>

-

-	<project caption="Printer Bootloader - 8KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.printer.avr8.8_4" force-caption="true" workspace-name="lufa_printer_8kb_4kb_">

-		<require idref="lufa.bootloaders.printer"/>

-		<require idref="lufa.boards.dummy.avr8"/>

-		<generator value="as5_8"/>

-

-		<device-support value="atmega8u2"/>

-		<config name="lufa.drivers.board.name" value="none"/>

-

-		<config name="config.compiler.optimization.level" value="size"/>

-

-		<build type="define" name="F_CPU" value="16000000UL"/>

-		<build type="define" name="F_USB" value="16000000UL"/>

-

-		<build type="define" name="BOOT_START_ADDR" value="0x1000"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.text=0x1000"/>

-

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x1FA0"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x1FE0"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>

-		<build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x1FF8"/>

-		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>

-	</project>

-

-	<module type="application" id="lufa.bootloaders.printer" caption="Printer Bootloader">

-		<info type="description" value="summary">

-		Printer Class Bootloader, capable of reprogramming a device by "printing" new HEX files to the virtual Plain-Text printer it creates when plugged into a host.

-		</info>

-

- 		<info type="gui-flag" value="move-to-root"/>

-

-		<info type="keyword" value="Technology">

-			<keyword value="Bootloaders"/>

-			<keyword value="USB Device"/>

-		</info>

-

-		<device-support-alias value="lufa_avr8"/>

-		<device-support-alias value="lufa_xmega"/>

-		<device-support-alias value="lufa_uc3"/>

-

-		<build type="include-path" value="."/>

-		<build type="c-source" value="BootloaderPrinter.c"/>

-		<build type="header-file" value="BootloaderPrinter.h"/>

-		<build type="c-source" value="Descriptors.c"/>

-		<build type="header-file" value="Descriptors.h"/>

-		<build type="c-source" value="BootloaderAPI.c"/>

-		<build type="header-file" value="BootloaderAPI.h"/>

-		<build type="asm-source" value="BootloaderAPITable.S"/>

-

-		<build type="module-config" subtype="path" value="Config"/>

-		<build type="header-file" value="Config/LUFAConfig.h"/>

-

-		<build type="distribute" subtype="user-file" value="doxyfile"/>

-		<build type="distribute" subtype="user-file" value="BootloaderPrinter.txt"/>

-

-		<require idref="lufa.common"/>

-		<require idref="lufa.platform"/>

-		<require idref="lufa.drivers.usb"/>

-		<require idref="lufa.drivers.board"/>

-		<require idref="lufa.drivers.board.leds"/>

-	</module>

-</asf>

+<asf xmlversion="1.0">
+	<project caption="Printer Bootloader - 128KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.printer.avr8.128_4" force-caption="true" workspace-name="lufa_printer_128kb_4kb_">
+		<require idref="lufa.bootloaders.printer"/>
+		<require idref="lufa.boards.dummy.avr8"/>
+		<generator value="as5_8"/>
+
+		<device-support value="at90usb1287"/>
+		<config name="lufa.drivers.board.name" value="none"/>
+
+		<config name="config.compiler.optimization.level" value="size"/>
+
+		<build type="define" name="F_CPU" value="16000000UL"/>
+		<build type="define" name="F_USB" value="16000000UL"/>
+
+		<build type="define" name="BOOT_START_ADDR" value="0x1F000"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.text=0x1F000"/>
+
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x1FFA0"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x1FFE0"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x1FFF8"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>
+	</project>
+
+	<project caption="Printer Bootloader - 64KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.printer.avr8.64_4" force-caption="true" workspace-name="lufa_printer_64kb_4kb_">
+		<require idref="lufa.bootloaders.printer"/>
+		<require idref="lufa.boards.dummy.avr8"/>
+		<generator value="as5_8"/>
+
+		<device-support value="at90usb647"/>
+		<config name="lufa.drivers.board.name" value="none"/>
+
+		<config name="config.compiler.optimization.level" value="size"/>
+
+		<build type="define" name="F_CPU" value="16000000UL"/>
+		<build type="define" name="F_USB" value="16000000UL"/>
+
+		<build type="define" name="BOOT_START_ADDR" value="0xF000"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.text=0xF000"/>
+
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0xFFA0"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0xFFE0"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0xFFF8"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>
+	</project>
+
+	<project caption="Printer Bootloader - 32KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.printer.avr8.32_4" force-caption="true" workspace-name="lufa_printer_32kb_4kb_">
+		<require idref="lufa.bootloaders.printer"/>
+		<require idref="lufa.boards.dummy.avr8"/>
+		<generator value="as5_8"/>
+
+		<device-support value="atmega32u4"/>
+		<config name="lufa.drivers.board.name" value="none"/>
+
+		<config name="config.compiler.optimization.level" value="size"/>
+
+		<build type="define" name="F_CPU" value="16000000UL"/>
+		<build type="define" name="F_USB" value="16000000UL"/>
+
+		<build type="define" name="BOOT_START_ADDR" value="0x7000"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.text=0x7000"/>
+
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x7FA0"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x7FE0"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x7FF8"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>
+	</project>
+
+	<project caption="Printer Bootloader - 16KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.printer.avr8.16_4" force-caption="true" workspace-name="lufa_printer_16kb_4kb_">
+		<require idref="lufa.bootloaders.printer"/>
+		<require idref="lufa.boards.dummy.avr8"/>
+		<generator value="as5_8"/>
+
+		<device-support value="atmega16u2"/>
+		<config name="lufa.drivers.board.name" value="none"/>
+
+		<config name="config.compiler.optimization.level" value="size"/>
+
+		<build type="define" name="F_CPU" value="16000000UL"/>
+		<build type="define" name="F_USB" value="16000000UL"/>
+
+		<build type="define" name="BOOT_START_ADDR" value="0x3000"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.text=0x3000"/>
+
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x3FA0"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x3FE0"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x3FF8"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>
+	</project>
+
+	<project caption="Printer Bootloader - 8KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.printer.avr8.8_4" force-caption="true" workspace-name="lufa_printer_8kb_4kb_">
+		<require idref="lufa.bootloaders.printer"/>
+		<require idref="lufa.boards.dummy.avr8"/>
+		<generator value="as5_8"/>
+
+		<device-support value="atmega8u2"/>
+		<config name="lufa.drivers.board.name" value="none"/>
+
+		<config name="config.compiler.optimization.level" value="size"/>
+
+		<build type="define" name="F_CPU" value="16000000UL"/>
+		<build type="define" name="F_USB" value="16000000UL"/>
+
+		<build type="define" name="BOOT_START_ADDR" value="0x1000"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.text=0x1000"/>
+
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x1FA0"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x1FE0"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/>
+		<build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x1FF8"/>
+		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/>
+	</project>
+
+	<module type="application" id="lufa.bootloaders.printer" caption="Printer Bootloader">
+		<info type="description" value="summary">
+		Printer Class Bootloader, capable of reprogramming a device by "printing" new HEX files to the virtual Plain-Text printer it creates when plugged into a host.
+		</info>
+
+ 		<info type="gui-flag" value="move-to-root"/>
+
+		<info type="keyword" value="Technology">
+			<keyword value="Bootloaders"/>
+			<keyword value="USB Device"/>
+		</info>
+
+		<device-support-alias value="lufa_avr8"/>
+		<device-support-alias value="lufa_xmega"/>
+		<device-support-alias value="lufa_uc3"/>
+
+		<build type="include-path" value="."/>
+		<build type="c-source" value="BootloaderPrinter.c"/>
+		<build type="header-file" value="BootloaderPrinter.h"/>
+		<build type="c-source" value="Descriptors.c"/>
+		<build type="header-file" value="Descriptors.h"/>
+		<build type="c-source" value="BootloaderAPI.c"/>
+		<build type="header-file" value="BootloaderAPI.h"/>
+		<build type="asm-source" value="BootloaderAPITable.S"/>
+
+		<build type="module-config" subtype="path" value="Config"/>
+		<build type="header-file" value="Config/LUFAConfig.h"/>
+
+		<build type="distribute" subtype="user-file" value="doxyfile"/>
+		<build type="distribute" subtype="user-file" value="BootloaderPrinter.txt"/>
+
+		<require idref="lufa.common"/>
+		<require idref="lufa.platform"/>
+		<require idref="lufa.drivers.usb"/>
+		<require idref="lufa.drivers.board"/>
+		<require idref="lufa.drivers.board.leds"/>
+	</module>
+</asf>
diff --git a/tmk_core/protocol/lufa/LUFA-git/Bootloaders/Printer/makefile b/tmk_core/protocol/lufa/LUFA-git/Bootloaders/Printer/makefile
index 0716c3bbe8..0db035de3b 100644
--- a/tmk_core/protocol/lufa/LUFA-git/Bootloaders/Printer/makefile
+++ b/tmk_core/protocol/lufa/LUFA-git/Bootloaders/Printer/makefile
@@ -1,55 +1,55 @@
-#

-#             LUFA Library

-#     Copyright (C) Dean Camera, 2014.

-#

-#  dean [at] fourwalledcubicle [dot] com

-#           www.lufa-lib.org

-#

-# --------------------------------------

-#         LUFA Project Makefile.

-# --------------------------------------

-

-# Run "make help" for target help.

-

-MCU          = at90usb1287

-ARCH         = AVR8

-BOARD        = USBKEY

-F_CPU        = 8000000

-F_USB        = $(F_CPU)

-OPTIMIZATION = s

-TARGET       = BootloaderPrinter

-SRC          = $(TARGET).c Descriptors.c BootloaderAPI.c BootloaderAPITable.S $(LUFA_SRC_USB) $(LUFA_SRC_USBCLASS)

-LUFA_PATH    = ../../LUFA

-CC_FLAGS     = -DUSE_LUFA_CONFIG_HEADER -IConfig/ -DBOOT_START_ADDR=$(BOOT_START_OFFSET)

-LD_FLAGS     = -Wl,--section-start=.text=$(BOOT_START_OFFSET) $(BOOT_API_LD_FLAGS)

-

-# Flash size and bootloader section sizes of the target, in KB. These must

-# match the target's total FLASH size and the bootloader size set in the

-# device's fuses.

-FLASH_SIZE_KB         = 128

-BOOT_SECTION_SIZE_KB  = 8

-

-# Bootloader address calculation formulas

-# Do not modify these macros, but rather modify the dependent values above.

-CALC_ADDRESS_IN_HEX   = $(shell printf "0x%X" $$(( $(1) )) )

-BOOT_START_OFFSET     = $(call CALC_ADDRESS_IN_HEX, ($(FLASH_SIZE_KB) - $(BOOT_SECTION_SIZE_KB)) * 1024 )

-BOOT_SEC_OFFSET       = $(call CALC_ADDRESS_IN_HEX, ($(FLASH_SIZE_KB) * 1024) - ($(strip $(1))) )

-

-# Bootloader linker section flags for relocating the API table sections to

-# known FLASH addresses - these should not normally be user-edited.

-BOOT_SECTION_LD_FLAG  = -Wl,--section-start=$(strip $(1))=$(call BOOT_SEC_OFFSET, $(3)) -Wl,--undefined=$(strip $(2))

-BOOT_API_LD_FLAGS     = $(call BOOT_SECTION_LD_FLAG, .apitable_trampolines, BootloaderAPI_Trampolines, 96)

-BOOT_API_LD_FLAGS    += $(call BOOT_SECTION_LD_FLAG, .apitable_jumptable,   BootloaderAPI_JumpTable,   32)

-BOOT_API_LD_FLAGS    += $(call BOOT_SECTION_LD_FLAG, .apitable_signatures,  BootloaderAPI_Signatures,  8)

-

-# Default target

-all:

-

-# Include LUFA build script makefiles

-include $(LUFA_PATH)/Build/lufa_core.mk

-include $(LUFA_PATH)/Build/lufa_sources.mk

-include $(LUFA_PATH)/Build/lufa_build.mk

-include $(LUFA_PATH)/Build/lufa_cppcheck.mk

-include $(LUFA_PATH)/Build/lufa_doxygen.mk

-include $(LUFA_PATH)/Build/lufa_avrdude.mk

-include $(LUFA_PATH)/Build/lufa_atprogram.mk

+#
+#             LUFA Library
+#     Copyright (C) Dean Camera, 2014.
+#
+#  dean [at] fourwalledcubicle [dot] com
+#           www.lufa-lib.org
+#
+# --------------------------------------
+#         LUFA Project Makefile.
+# --------------------------------------
+
+# Run "make help" for target help.
+
+MCU          = at90usb1287
+ARCH         = AVR8
+BOARD        = USBKEY
+F_CPU        = 8000000
+F_USB        = $(F_CPU)
+OPTIMIZATION = s
+TARGET       = BootloaderPrinter
+SRC          = $(TARGET).c Descriptors.c BootloaderAPI.c BootloaderAPITable.S $(LUFA_SRC_USB) $(LUFA_SRC_USBCLASS)
+LUFA_PATH    = ../../LUFA
+CC_FLAGS     = -DUSE_LUFA_CONFIG_HEADER -IConfig/ -DBOOT_START_ADDR=$(BOOT_START_OFFSET)
+LD_FLAGS     = -Wl,--section-start=.text=$(BOOT_START_OFFSET) $(BOOT_API_LD_FLAGS)
+
+# Flash size and bootloader section sizes of the target, in KB. These must
+# match the target's total FLASH size and the bootloader size set in the
+# device's fuses.
+FLASH_SIZE_KB         = 128
+BOOT_SECTION_SIZE_KB  = 8
+
+# Bootloader address calculation formulas
+# Do not modify these macros, but rather modify the dependent values above.
+CALC_ADDRESS_IN_HEX   = $(shell printf "0x%X" $$(( $(1) )) )
+BOOT_START_OFFSET     = $(call CALC_ADDRESS_IN_HEX, ($(FLASH_SIZE_KB) - $(BOOT_SECTION_SIZE_KB)) * 1024 )
+BOOT_SEC_OFFSET       = $(call CALC_ADDRESS_IN_HEX, ($(FLASH_SIZE_KB) * 1024) - ($(strip $(1))) )
+
+# Bootloader linker section flags for relocating the API table sections to
+# known FLASH addresses - these should not normally be user-edited.
+BOOT_SECTION_LD_FLAG  = -Wl,--section-start=$(strip $(1))=$(call BOOT_SEC_OFFSET, $(3)) -Wl,--undefined=$(strip $(2))
+BOOT_API_LD_FLAGS     = $(call BOOT_SECTION_LD_FLAG, .apitable_trampolines, BootloaderAPI_Trampolines, 96)
+BOOT_API_LD_FLAGS    += $(call BOOT_SECTION_LD_FLAG, .apitable_jumptable,   BootloaderAPI_JumpTable,   32)
+BOOT_API_LD_FLAGS    += $(call BOOT_SECTION_LD_FLAG, .apitable_signatures,  BootloaderAPI_Signatures,  8)
+
+# Default target
+all:
+
+# Include LUFA build script makefiles
+include $(LUFA_PATH)/Build/lufa_core.mk
+include $(LUFA_PATH)/Build/lufa_sources.mk
+include $(LUFA_PATH)/Build/lufa_build.mk
+include $(LUFA_PATH)/Build/lufa_cppcheck.mk
+include $(LUFA_PATH)/Build/lufa_doxygen.mk
+include $(LUFA_PATH)/Build/lufa_avrdude.mk
+include $(LUFA_PATH)/Build/lufa_atprogram.mk
diff --git a/tmk_core/protocol/lufa/LUFA-git/LUFA/Build/HID_EEPROM_Loader/makefile b/tmk_core/protocol/lufa/LUFA-git/LUFA/Build/HID_EEPROM_Loader/makefile
index 9fd188c936..e839ba6b1d 100644
--- a/tmk_core/protocol/lufa/LUFA-git/LUFA/Build/HID_EEPROM_Loader/makefile
+++ b/tmk_core/protocol/lufa/LUFA-git/LUFA/Build/HID_EEPROM_Loader/makefile
@@ -1,42 +1,42 @@
-#

-#             LUFA Library

-#     Copyright (C) Dean Camera, 2014.

-#

-#  dean [at] fourwalledcubicle [dot] com

-#           www.lufa-lib.org

-#

-# --------------------------------------

-#         LUFA Project Makefile.

-# --------------------------------------

-

-# Run "make help" for target help.

-

-MCU          = at90usb1287

-ARCH         = AVR8

-F_CPU        = 1000000

-F_USB        = $(F_CPU)

-OPTIMIZATION = s

-TARGET       = HID_EEPROM_Loader

-SRC          = $(TARGET).c

-LUFA_PATH    = ../../../LUFA

-CC_FLAGS     =

-LD_FLAGS     =

-OBJECT_FILES = InputEEData.o

-

-# Default target

-all:

-

-# Determine the AVR sub-architecture of the build main application object file

-FIND_AVR_SUBARCH = avr$(shell avr-objdump -f $(TARGET).o | grep architecture | cut -d':' -f3 | cut -d',' -f1)

-

-# Create a linkable object file with the input binary EEPROM data stored in the FLASH section

-InputEEData.o: InputEEData.bin $(TARGET).o $(MAKEFILE_LIST)

-	@echo $(MSG_OBJCPY_CMD) Converting \"$<\" to a object file \"$@\"

-	avr-objcopy -I binary -O elf32-avr -B $(call FIND_AVR_SUBARCH) --rename-section .data=.progmem.data,contents,alloc,readonly,data $< $@

-

-# Include LUFA build script makefiles

-include $(LUFA_PATH)/Build/lufa_core.mk

-include $(LUFA_PATH)/Build/lufa_build.mk

-include $(LUFA_PATH)/Build/lufa_cppcheck.mk

-include $(LUFA_PATH)/Build/lufa_doxygen.mk

-include $(LUFA_PATH)/Build/lufa_hid.mk

+#
+#             LUFA Library
+#     Copyright (C) Dean Camera, 2014.
+#
+#  dean [at] fourwalledcubicle [dot] com
+#           www.lufa-lib.org
+#
+# --------------------------------------
+#         LUFA Project Makefile.
+# --------------------------------------
+
+# Run "make help" for target help.
+
+MCU          = at90usb1287
+ARCH         = AVR8
+F_CPU        = 1000000
+F_USB        = $(F_CPU)
+OPTIMIZATION = s
+TARGET       = HID_EEPROM_Loader
+SRC          = $(TARGET).c
+LUFA_PATH    = ../../../LUFA
+CC_FLAGS     =
+LD_FLAGS     =
+OBJECT_FILES = InputEEData.o
+
+# Default target
+all:
+
+# Determine the AVR sub-architecture of the build main application object file
+FIND_AVR_SUBARCH = avr$(shell avr-objdump -f $(TARGET).o | grep architecture | cut -d':' -f3 | cut -d',' -f1)
+
+# Create a linkable object file with the input binary EEPROM data stored in the FLASH section
+InputEEData.o: InputEEData.bin $(TARGET).o $(MAKEFILE_LIST)
+	@echo $(MSG_OBJCPY_CMD) Converting \"$<\" to a object file \"$@\"
+	avr-objcopy -I binary -O elf32-avr -B $(call FIND_AVR_SUBARCH) --rename-section .data=.progmem.data,contents,alloc,readonly,data $< $@
+
+# Include LUFA build script makefiles
+include $(LUFA_PATH)/Build/lufa_core.mk
+include $(LUFA_PATH)/Build/lufa_build.mk
+include $(LUFA_PATH)/Build/lufa_cppcheck.mk
+include $(LUFA_PATH)/Build/lufa_doxygen.mk
+include $(LUFA_PATH)/Build/lufa_hid.mk
diff --git a/tmk_core/protocol/lufa/LUFA-git/LUFA/CodeTemplates/DeviceTemplate/asf.xml b/tmk_core/protocol/lufa/LUFA-git/LUFA/CodeTemplates/DeviceTemplate/asf.xml
index fd65db283f..e952714e16 100644
--- a/tmk_core/protocol/lufa/LUFA-git/LUFA/CodeTemplates/DeviceTemplate/asf.xml
+++ b/tmk_core/protocol/lufa/LUFA-git/LUFA/CodeTemplates/DeviceTemplate/asf.xml
@@ -1,55 +1,55 @@
-<asf xmlversion="1.0">

-	<project caption="USB Device Template" id="lufa.templates.device.project.avr8">

-		<require idref="lufa.templates.device"/>

-		<require idref="lufa.boards.dummy.avr8"/>

-		<generator value="as5_8_template"/>

-

-		<device-support value="at90usb1287"/>

-		<config name="lufa.drivers.board.name" value="usbkey"/>

-

-		<build type="define" name="F_CPU" value="8000000UL"/>

-		<build type="define" name="F_USB" value="8000000UL"/>

-	</project>

-

-	<project caption="USB Device Template" id="lufa.templates.device.project.xmega">

-		<require idref="lufa.templates.device"/>

-		<require idref="lufa.boards.dummy.xmega"/>

-		<generator value="as5_8_template"/>

-

-		<device-support value="atxmega256a3bu"/>

-		<config name="lufa.drivers.board.name" value="a3bu_xplained"/>

-

-		<build type="define" name="F_CPU" value="32000000UL"/>

-		<build type="define" name="F_USB" value="48000000UL"/>

-	</project>

-

-	<module type="application" id="lufa.templates.device" caption="USB Device Template">

-		<info type="description" value="summary">

-		Template for a LUFA USB device mode application.

-		</info>

-

- 		<info type="gui-flag" value="move-to-root"/>

-

-		<info type="keyword" value="Technology">

-			<keyword value="USB Device"/>

-			<keyword value="Template Projects"/>

-		</info>

-

-		<device-support-alias value="lufa_avr8"/>

-		<device-support-alias value="lufa_xmega"/>

-		<device-support-alias value="lufa_uc3"/>

-

-		<build type="c-source" value="DeviceApplication.c"/>

-		<build type="c-source" value="Descriptors.c"/>

-		<build type="header-file" value="DeviceApplication.h"/>

-		<build type="header-file" value="Descriptors.h"/>

-

-		<build type="module-config" subtype="path" value=".."/>

-		<build type="header-file" value="../LUFAConfig.h"/>

-

-		<require idref="lufa.common"/>

-		<require idref="lufa.platform"/>

-		<require idref="lufa.drivers.usb"/>

-		<require idref="lufa.drivers.board"/>

-	</module>

-</asf>

+<asf xmlversion="1.0">
+	<project caption="USB Device Template" id="lufa.templates.device.project.avr8">
+		<require idref="lufa.templates.device"/>
+		<require idref="lufa.boards.dummy.avr8"/>
+		<generator value="as5_8_template"/>
+
+		<device-support value="at90usb1287"/>
+		<config name="lufa.drivers.board.name" value="usbkey"/>
+
+		<build type="define" name="F_CPU" value="8000000UL"/>
+		<build type="define" name="F_USB" value="8000000UL"/>
+	</project>
+
+	<project caption="USB Device Template" id="lufa.templates.device.project.xmega">
+		<require idref="lufa.templates.device"/>
+		<require idref="lufa.boards.dummy.xmega"/>
+		<generator value="as5_8_template"/>
+
+		<device-support value="atxmega256a3bu"/>
+		<config name="lufa.drivers.board.name" value="a3bu_xplained"/>
+
+		<build type="define" name="F_CPU" value="32000000UL"/>
+		<build type="define" name="F_USB" value="48000000UL"/>
+	</project>
+
+	<module type="application" id="lufa.templates.device" caption="USB Device Template">
+		<info type="description" value="summary">
+		Template for a LUFA USB device mode application.
+		</info>
+
+ 		<info type="gui-flag" value="move-to-root"/>
+
+		<info type="keyword" value="Technology">
+			<keyword value="USB Device"/>
+			<keyword value="Template Projects"/>
+		</info>
+
+		<device-support-alias value="lufa_avr8"/>
+		<device-support-alias value="lufa_xmega"/>
+		<device-support-alias value="lufa_uc3"/>
+
+		<build type="c-source" value="DeviceApplication.c"/>
+		<build type="c-source" value="Descriptors.c"/>
+		<build type="header-file" value="DeviceApplication.h"/>
+		<build type="header-file" value="Descriptors.h"/>
+
+		<build type="module-config" subtype="path" value=".."/>
+		<build type="header-file" value="../LUFAConfig.h"/>
+
+		<require idref="lufa.common"/>
+		<require idref="lufa.platform"/>
+		<require idref="lufa.drivers.usb"/>
+		<require idref="lufa.drivers.board"/>
+	</module>
+</asf>
diff --git a/tmk_core/protocol/lufa/LUFA-git/LUFA/CodeTemplates/HostTemplate/asf.xml b/tmk_core/protocol/lufa/LUFA-git/LUFA/CodeTemplates/HostTemplate/asf.xml
index c1996ec711..c3860c056d 100644
--- a/tmk_core/protocol/lufa/LUFA-git/LUFA/CodeTemplates/HostTemplate/asf.xml
+++ b/tmk_core/protocol/lufa/LUFA-git/LUFA/CodeTemplates/HostTemplate/asf.xml
@@ -1,41 +1,41 @@
-<asf xmlversion="1.0">

-	<project caption="USB Host Template" id="lufa.templates.host.project">

-		<require idref="lufa.templates.host"/>

-		<require idref="lufa.boards.dummy.avr8"/>

-		<generator value="as5_8_template"/>

-

-		<device-support value="at90usb1287"/>

-		<config name="lufa.drivers.board.name" value="usbkey"/>

-

-		<build type="define" name="F_CPU" value="8000000UL"/>

-		<build type="define" name="F_USB" value="8000000UL"/>

-	</project>

-

-	<module type="application" id="lufa.templates.host" caption="USB Host Template">

-		<info type="description" value="summary">

-		Template for a LUFA USB host mode application.

-		</info>

-

- 		<info type="gui-flag" value="move-to-root"/>

-

-		<info type="keyword" value="Technology">

-			<keyword value="USB Host"/>

-			<keyword value="Template Projects"/>

-		</info>

-

-		<device-support-alias value="lufa_avr8"/>

-		<device-support-alias value="lufa_xmega"/>

-		<device-support-alias value="lufa_uc3"/>

-

-		<build type="c-source" value="HostApplication.c"/>

-		<build type="header-file" value="HostApplication.h"/>

-

-		<build type="module-config" subtype="path" value=".."/>

-		<build type="header-file" value="../LUFAConfig.h"/>

-

-		<require idref="lufa.common"/>

-		<require idref="lufa.platform"/>

-		<require idref="lufa.drivers.usb"/>

-		<require idref="lufa.drivers.board"/>

-	</module>

-</asf>

+<asf xmlversion="1.0">
+	<project caption="USB Host Template" id="lufa.templates.host.project">
+		<require idref="lufa.templates.host"/>
+		<require idref="lufa.boards.dummy.avr8"/>
+		<generator value="as5_8_template"/>
+
+		<device-support value="at90usb1287"/>
+		<config name="lufa.drivers.board.name" value="usbkey"/>
+
+		<build type="define" name="F_CPU" value="8000000UL"/>
+		<build type="define" name="F_USB" value="8000000UL"/>
+	</project>
+
+	<module type="application" id="lufa.templates.host" caption="USB Host Template">
+		<info type="description" value="summary">
+		Template for a LUFA USB host mode application.
+		</info>
+
+ 		<info type="gui-flag" value="move-to-root"/>
+
+		<info type="keyword" value="Technology">
+			<keyword value="USB Host"/>
+			<keyword value="Template Projects"/>
+		</info>
+
+		<device-support-alias value="lufa_avr8"/>
+		<device-support-alias value="lufa_xmega"/>
+		<device-support-alias value="lufa_uc3"/>
+
+		<build type="c-source" value="HostApplication.c"/>
+		<build type="header-file" value="HostApplication.h"/>
+
+		<build type="module-config" subtype="path" value=".."/>
+		<build type="header-file" value="../LUFAConfig.h"/>
+
+		<require idref="lufa.common"/>
+		<require idref="lufa.platform"/>
+		<require idref="lufa.drivers.usb"/>
+		<require idref="lufa.drivers.board"/>
+	</module>
+</asf>
diff --git a/tmk_core/protocol/lufa/LUFA-git/LUFA/DoxygenPages/BuildSystem.txt b/tmk_core/protocol/lufa/LUFA-git/LUFA/DoxygenPages/BuildSystem.txt
index 7ddfa1be3f..0ae1dd678f 100644
--- a/tmk_core/protocol/lufa/LUFA-git/LUFA/DoxygenPages/BuildSystem.txt
+++ b/tmk_core/protocol/lufa/LUFA-git/LUFA/DoxygenPages/BuildSystem.txt
@@ -1,975 +1,975 @@
-/** \file

- *

- *  This file contains special DoxyGen information for the generation of the main page and other special

- *  documentation pages. It is not a project source file.

- */

-

-/** \page Page_BuildSystem The LUFA Build System

- *

- *  \section Sec_BuildSystem_Overview Overview of the LUFA Build System

- *  The LUFA build system is an attempt at making a set of re-usable, modular build make files which

- *  can be referenced in a LUFA powered project, to minimize the amount of code required in an

- *  application makefile. The system is written in GNU Make, and each module is independent of

- *  one-another.

- *

- *  For details on the prerequisites needed for Linux and Windows machines to be able to use the LUFA

- *  build system, see \ref Sec_CompilingApps_Prerequisites.

- *

- *  To use a LUFA build system module, simply add an include to your project makefile. All user projects

- *  should at a minimum include \ref Page_BuildModule_CORE for base functionality:

- *  \code

- *  include $(LUFA_PATH)/Build/lufa_core.mk

- *  \endcode

- *

- *  Once included in your project makefile, the associated build module targets will be added to your

- *  project's build makefile targets automatically. To call a build target, run <tt>make {TARGET_NAME}</tt>

- *  from the command line, substituting in the appropriate target name.

- *

- *  \see \ref Sec_ConfiguringApps_AppMakefileParams for a copy of the sample LUFA project makefile.

- *

- *  Each build module may have one or more mandatory parameters (GNU Make variables) which <i>must</i>

- *  be supplied in the project makefile for the module to work, and one or more optional parameters which

- *  may be defined and which will assume a sensible default if not.

- *

- *  \section SSec_BuildSystem_Modules Available Modules

- *

- *  The following modules are included in this LUFA release:

- *

- *  \li \subpage Page_BuildModule_ATPROGRAM - Device Programming

- *  \li \subpage Page_BuildModule_AVRDUDE - Device Programming

- *  \li \subpage Page_BuildModule_BUILD - Compiling/Assembling/Linking

- *  \li \subpage Page_BuildModule_CORE - Core Build System Functions

- *  \li \subpage Page_BuildModule_CPPCHECK - Static Code Analysis

- *  \li \subpage Page_BuildModule_DFU - Device Programming

- *  \li \subpage Page_BuildModule_DOXYGEN - Automated Source Code Documentation

- *  \li \subpage Page_BuildModule_HID - Device Programming

- *  \li \subpage Page_BuildModule_SOURCES - LUFA Module Source Code Variables

- *

- *  If you have problems building using the LUFA build system, see \subpage Page_BuildTroubleshooting for resolution steps.

- */

-

- /** \page Page_BuildModule_BUILD The BUILD build module

- *

- *  The BUILD LUFA build system module, providing targets for the compilation,

- *  assembling and linking of an application from source code into binary files

- *  suitable for programming into a target device, using the GCC compiler.

- *

- *  To use this module in your application makefile, add the following code:

- *  \code

- *  include $(LUFA_PATH)/Build/lufa_build.mk

- *  \endcode

- *

- *  \section SSec_BuildModule_BUILD_Requirements Requirements

- *  This module requires the the architecture appropriate binaries of the GCC compiler are available in your

- *  system's <b>PATH</b> variable. The GCC compiler and associated toolchain is distributed in Atmel AVR Studio

- *  5.x and Atmel Studio 6.x installation directories, as well as in many third party distribution packages.

- *

- *  \section SSec_BuildModule_BUILD_Targets Targets

- *

- *  <table>

- *   <tr>

- *    <td><tt>size</tt></td>

- *    <td>Display size of the compiled application FLASH and SRAM segments.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>symbol-sizes</tt></td>

- *    <td>Display a size-sorted list of symbols from the compiled application, in decimal bytes.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>lib</tt></td>

- *    <td>Build and archive all source files into a library A binary file.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>all</tt></td>

- *    <td>Build and link the application into ELF debug and HEX binary files.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>elf</tt></td>

- *    <td>Build and link the application into an ELF debug file.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>bin</tt></td>

- *    <td>Build and link the application and produce a BIN binary file.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>hex</tt></td>

- *    <td>Build and link the application and produce HEX and EEP binary files.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>lss</tt></td>

- *    <td>Build and link the application and produce a LSS source code/assembly code mixed listing file.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>clean</tt></td>

- *    <td>Remove all intermediary files and binary output files.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>mostlyclean</tt></td>

- *    <td>Remove all intermediary files but preserve any binary output files.</td>

- *   </tr>

- *   <tr>

- *    <td><tt><i>&lt;filename&gt;</i>.s</tt></td>

- *    <td>Create an assembly listing of a given input C/C++ source file.</td>

- *   </tr>

- *  </table>

- *

- *  \section SSec_BuildModule_BUILD_MandatoryParams Mandatory Parameters

- *

- *  <table>

- *   <tr>

- *    <td><tt>TARGET</tt></td>

- *    <td>Name of the application output file prefix (e.g. <tt>TestApplication</tt>).</td>

- *   </tr>

- *   <tr>

- *    <td><tt>ARCH</tt></td>

- *    <td>Architecture of the target processor (see \ref Page_DeviceSupport).</td>

- *   </tr>

- *   <tr>

- *    <td><tt>MCU</tt></td>

- *    <td>Name of the Atmel processor model (e.g. <tt>at90usb1287</tt>).</td>

- *   </tr>

- *   <tr>

- *    <td><tt>SRC</tt></td>

- *    <td>List of relative or absolute paths to the application C (.c), C++ (.cpp) and Assembly (.S) source files.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>F_USB</tt></td>

- *    <td>Speed in Hz of the input clock frequency to the target's USB controller.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>LUFA_PATH</tt></td>

- *    <td>Path to the LUFA library core, either relative or absolute (e.g. <tt>../LUFA-000000/LUFA/</tt>).</td>

- *   </tr>

- *  </table>

- *

- *  \section SSec_BuildModule_BUILD_OptionalParams Optional Parameters

- *

- *  <table>

- *   <tr>

- *    <td><tt>BOARD</tt></td>

- *    <td>LUFA board hardware drivers to use (see \ref Page_DeviceSupport).</td>

- *   </tr>

- *   <tr>

- *    <td><tt>OPTIMIZATION</tt></td>

- *    <td>Optimization level to use when compiling source files (see GCC manual).</td>

- *   </tr>

- *   <tr>

- *    <td><tt>C_STANDARD</tt></td>

- *    <td>Version of the C standard to apply when compiling C++ source files (see GCC manual).</td>

- *   </tr>

- *   <tr>

- *    <td><tt>CPP_STANDARD</tt></td>

- *    <td>Version of the C++ standard to apply when compiling C++ source files (see GCC manual).</td>

- *   </tr>

- *   <tr>

- *    <td><tt>DEBUG_FORMAT</tt></td>

- *    <td>Format of the debug information to embed in the generated object files (see GCC manual).</td>

- *   </tr>

- *   <tr>

- *    <td><tt>DEBUG_LEVEL</tt></td>

- *    <td>Level of the debugging information to embed in the generated object files (see GCC manual).</td>

- *   </tr>

- *   <tr>

- *    <td><tt>F_CPU</tt></td>

- *    <td>Speed of the processor CPU clock, in Hz.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>C_FLAGS</tt></td>

- *    <td>Flags to pass to the C compiler only, after the automatically generated flags.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>CPP_FLAGS</tt></td>

- *    <td>Flags to pass to the C++ compiler only, after the automatically generated flags.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>ASM_FLAGS</tt></td>

- *    <td>Flags to pass to the assembler only, after the automatically generated flags.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>CC_FLAGS</tt></td>

- *    <td>Common flags to pass to the C/C++ compiler and assembler, after the automatically generated flags.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>COMPILER_PATH</tt></td>

- *    <td>Directory where the C/C++ toolchain is located, if not available in the system <tt>PATH</tt>.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>LD_FLAGS</tt></td>

- *    <td>Flags to pass to the linker, after the automatically generated flags.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>LINKER_RELAXATIONS</tt></td>

- *    <td>Enables or disables linker relaxations when linking the application binary. This can reduce the total size

- *        of the application by replacing full \c CALL instructions with smaller \c RCALL instructions where possible.

- *        \note On some unpatched versions of binutils, this can cause link failures in some circumstances. If you

- *              receive a link error <tt>relocation truncated to fit: R_AVR_13_PCREL</tt>, disable this setting.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>OBJDIR</tt></td>

- *    <td>Directory to place the generated object and dependency files. If set to "." the same folder as the source file will be used.

- *        \note When this option is enabled, all source filenames <b>must</b> be unique.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>OBJECT_FILES</tt></td>

- *    <td>List of additional object files that should be linked into the resulting binary.</td>

- *   </tr>

- *  </table>

- *

- *  \section SSec_BuildModule_BUILD_ProvidedVariables Module Provided Variables

- *

- *  <table>

- *   <tr>

- *    <td><i>None</i></td>

- *   </tr>

- *  </table>

- *

- *  \section SSec_BuildModule_BUILD_ProvidedMacros Module Provided Macros

- *

- *  <table>

- *   <tr>

- *    <td><i>None</i></td>

- *   </tr>

- *  </table>

- */

-

-/** \page Page_BuildModule_CORE The CORE build module

- *

- *  The core LUFA build system module, providing common build system help and information targets.

- *

- *  To use this module in your application makefile, add the following code:

- *  \code

- *  include $(LUFA_PATH)/Build/lufa_core.mk

- *  \endcode

- *

- *  \section SSec_BuildModule_CORE_Requirements Requirements

- *  This module has no requirements outside a standard *nix shell like environment; the <tt>sh</tt>

- *  shell, GNU <tt>make</tt> and *nix CoreUtils (<tt>echo</tt>, <tt>printf</tt>, etc.).

- *

- *  \section SSec_BuildModule_CORE_Targets Targets

- *

- *  <table>

- *   <tr>

- *    <td><tt>help</tt></td>

- *    <td>Display build system help and configuration information.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>list_targets</tt></td>

- *    <td>List all available build targets from the build system.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>list_modules</tt></td>

- *    <td>List all available build modules from the build system.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>list_mandatory</tt></td>

- *    <td>List all mandatory parameters required by the included modules.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>list_optional</tt></td>

- *    <td>List all optional parameters required by the included modules.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>list_provided</tt></td>

- *    <td>List all variables provided by the included modules.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>list_macros</tt></td>

- *    <td>List all macros provided by the included modules.</td>

- *   </tr>

- *  </table>

- *

- *  \section SSec_BuildModule_CORE_MandatoryParams Mandatory Parameters

- *

- *  <table>

- *   <tr>

- *    <td><i>None</i></td>

- *   </tr>

- *  </table>

- *

- *  \section SSec_BuildModule_CORE_OptionalParams Optional Parameters

- *

- *  <table>

- *   <tr>

- *    <td><i>None</i></td>

- *   </tr>

- *  </table>

- *

- *  \section SSec_BuildModule_CORE_ProvidedVariables Module Provided Variables

- *

- *  <table>

- *   <tr>

- *    <td><i>None</i></td>

- *   </tr>

- *  </table>

- *

- *  \section SSec_BuildModule_CORE_ProvidedMacros Module Provided Macros

- *

- *  <table>

- *   <tr>

- *    <td><i>None</i></td>

- *   </tr>

- *  </table>

- */

-

-/** \page Page_BuildModule_ATPROGRAM The ATPROGRAM build module

- *

- *  The ATPROGRAM programming utility LUFA build system module, providing targets to reprogram an

- *  Atmel processor FLASH and EEPROM memories with a project's compiled binary output files.

- *

- *  To use this module in your application makefile, add the following code:

- *  \code

- *  include $(LUFA_PATH)/Build/lufa_atprogram.mk

- *  \endcode

- *

- *  \section SSec_BuildModule_ATPROGRAM_Requirements Requirements

- *  This module requires the <tt>atprogram.exe</tt> utility to be available in your system's <b>PATH</b>

- *  variable. The <tt>atprogram.exe</tt> utility is distributed in Atmel AVR Studio 5.x and Atmel Studio 6.x

- *  inside the application install folder's "\atbackend" subdirectory.

- *

- *  \section SSec_BuildModule_ATPROGRAM_Targets Targets

- *

- *  <table>

- *   <tr>

- *    <td><tt>atprogram</tt></td>

- *    <td>Program the device FLASH memory with the application's executable data.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>atprogram-ee</tt></td>

- *    <td>Program the device EEPROM memory with the application's EEPROM data.</td>

- *   </tr>

- *  </table>

- *

- *  \section SSec_BuildModule_ATPROGRAM_MandatoryParams Mandatory Parameters

- *

- *  <table>

- *   <tr>

- *    <td><tt>MCU</tt></td>

- *    <td>Name of the Atmel processor model (e.g. <tt>at90usb1287</tt>).</td>

- *   </tr>

- *   <tr>

- *    <td><tt>TARGET</tt></td>

- *    <td>Name of the application output file prefix (e.g. <tt>TestApplication</tt>).</td>

- *   </tr>

- *  </table>

- *

- *  \section SSec_BuildModule_ATPROGRAM_OptionalParams Optional Parameters

- *

- *  <table>

- *   <tr>

- *    <td><tt>ATPROGRAM_PROGRAMMER</tt></td>

- *    <td>Name of the Atmel programmer or debugger tool to communicate with (e.g. <tt>jtagice3</tt>).</td>

- *   </tr>

- *   <tr>

- *    <td><tt>ATPROGRAM_INTERFACE</tt></td>

- *    <td>Name of the programming interface to use when programming the target (e.g. <tt>spi</tt>).</td>

- *   </tr>

- *   <tr>

- *    <td><tt>ATPROGRAM_PORT</tt></td>

- *    <td>Name of the communication port to use when when programming with a serially connected tool (e.g. <tt>COM2</tt>).</td>

- *   </tr>

- *  </table>

- *

- *  \section SSec_BuildModule_ATPROGRAM_ProvidedVariables Module Provided Variables

- *

- *  <table>

- *   <tr>

- *    <td><i>None</i></td>

- *   </tr>

- *  </table>

- *

- *  \section SSec_BuildModule_ATPROGRAM_ProvidedMacros Module Provided Macros

- *

- *  <table>

- *   <tr>

- *    <td><i>None</i></td>

- *   </tr>

- *  </table>

- */

-

-/** \page Page_BuildModule_AVRDUDE The AVRDUDE build module

- *

- *  The AVRDUDE programming utility LUFA build system module, providing targets to reprogram an

- *  Atmel processor FLASH and EEPROM memories with a project's compiled binary output files.

- *

- *  To use this module in your application makefile, add the following code:

- *  \code

- *  include $(LUFA_PATH)/Build/lufa_avrdude.mk

- *  \endcode

- *

- *  \section SSec_BuildModule_AVRDUDE_Requirements Requirements

- *  This module requires the <tt>avrdude</tt> utility to be available in your system's <b>PATH</b>

- *  variable. The <tt>avrdude</tt> utility is distributed in the old WinAVR project releases for

- *  Windows (<a>http://winavr.sourceforge.net</a>) or can be installed on *nix systems via the project's

- *  source code (<a>https://savannah.nongnu.org/projects/avrdude</a>) or through the package manager.

- *

- *  \section SSec_BuildModule_AVRDUDE_Targets Targets

- *

- *  <table>

- *   <tr>

- *    <td><tt>avrdude</tt></td>

- *    <td>Program the device FLASH memory with the application's executable data.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>avrdude-ee</tt></td>

- *    <td>Program the device EEPROM memory with the application's EEPROM data.</td>

- *   </tr>

- *  </table>

- *

- *  \section SSec_BuildModule_AVRDUDE_MandatoryParams Mandatory Parameters

- *

- *  <table>

- *   <tr>

- *    <td><tt>MCU</tt></td>

- *    <td>Name of the Atmel processor model (e.g. <tt>at90usb1287</tt>).</td>

- *   </tr>

- *   <tr>

- *    <td><tt>TARGET</tt></td>

- *    <td>Name of the application output file prefix (e.g. <tt>TestApplication</tt>).</td>

- *   </tr>

- *  </table>

- *

- *  \section SSec_BuildModule_AVRDUDE_OptionalParams Optional Parameters

- *

- *  <table>

- *   <tr>

- *    <td><tt>AVRDUDE_PROGRAMMER</tt></td>

- *    <td>Name of the programmer or debugger tool to communicate with (e.g. <tt>jtagicemkii</tt>).</td>

- *   </tr>

- *   <tr>

- *    <td><tt>AVRDUDE_PORT</tt></td>

- *    <td>Name of the communication port to use when when programming with the connected tool (e.g. <tt>COM2</tt>, <tt>/dev/ttyUSB0</tt> or <tt>usb</tt>).</td>

- *   </tr>

- *   <tr>

- *    <td><tt>AVRDUDE_FLAGS</tt></td>

- *    <td>Additional flags to pass to avrdude when programming, applied after the automatically generated flags.</td>

- *   </tr>

- *  </table>

- *

- *  \section SSec_BuildModule_AVRDUDE_ProvidedVariables Module Provided Variables

- *

- *  <table>

- *   <tr>

- *    <td><i>None</i></td>

- *   </tr>

- *  </table>

- *

- *  \section SSec_BuildModule_AVRDUDE_ProvidedMacros Module Provided Macros

- *

- *  <table>

- *   <tr>

- *    <td><i>None</i></td>

- *   </tr>

- *  </table>

- */

-

- /** \page Page_BuildModule_CPPCHECK The CPPCHECK build module

- *

- *  The CPPCHECK programming utility LUFA build system module, providing targets to statically

- *  analyze C and C++ source code for errors and performance/style issues.

- *

- *  To use this module in your application makefile, add the following code:

- *  \code

- *  include $(LUFA_PATH)/Build/lufa_cppcheck.mk

- *  \endcode

- *

- *  \section SSec_BuildModule_CPPCHECK_Requirements Requirements

- *  This module requires the <tt>cppcheck</tt> utility to be available in your system's <b>PATH</b>

- *  variable. The <tt>cppcheck</tt> utility is distributed through the project's home page

- *  (<a>http://cppcheck.sourceforge.net</a>) for Windows, and can be installed on *nix systems via

- *  the project's source code or through the package manager.

- *

- *  \section SSec_BuildModule_CPPCHECK_Targets Targets

- *

- *  <table>

- *   <tr>

- *    <td><tt>cppcheck</tt></td>

- *    <td>Statically analyze the project source code for issues.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>cppcheck-config</tt></td>

- *    <td>Check the <tt>cppcheck</tt> configuration - scan source code and warn about missing header files and other issues.</td>

- *   </tr>

- *  </table>

- *

- *  \section SSec_BuildModule_CPPCHECK_MandatoryParams Mandatory Parameters

- *

- *  <table>

- *   <tr>

- *    <td><tt>SRC</tt></td>

- *    <td>List of source files to statically analyze.</td>

- *   </tr>

- *  </table>

- *

- *  \section SSec_BuildModule_CPPCHECK_OptionalParams Optional Parameters

- *

- *  <table>

- *   <tr>

- *    <td><tt>CPPCHECK_INCLUDES</tt></td>

- *    <td>Path of extra directories to check when attemting to resolve C/C++ header file includes.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>CPPCHECK_EXCLUDES</tt></td>

- *    <td>Paths or path fragments to exclude when analyzing.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>CPPCHECK_MSG_TEMPLATE</tt></td>

- *    <td>Output message template to use when printing errors, warnings and information (see <tt>cppcheck</tt> documentation).</td>

- *   </tr>

- *   <tr>

- *    <td><tt>CPPCHECK_ENABLE</tt></td>

- *    <td>Analysis rule categories to enable (see <tt>cppcheck</tt> documentation).</td>

- *   </tr>

- *   <tr>

- *    <td><tt>CPPCHECK_SUPPRESS</tt></td>

- *    <td>Specific analysis rules to suppress (see <tt>cppcheck</tt> documentation).</td>

- *   </tr>

- *   <tr>

- *    <td><tt>CPPCHECK_FAIL_ON_WARNING</tt></td>

- *    <td>Set to <b>Y</b> to fail the analysis job with an error exit code if warnings are found, <b>N</b> to continue without failing.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>CPPCHECK_QUIET</tt></td>

- *    <td>Set to <b>Y</b> to suppress all output except warnings and errors, <b>N</b> to show verbose output information.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>CPPCHECK_FLAGS</tt></td>

- *    <td>Extra flags to pass to <tt>cppcheck</tt>, after the automatically generated flags.</td>

- *   </tr>

- *  </table>

- *

- *  \section SSec_BuildModule_CPPCHECK_ProvidedVariables Module Provided Variables

- *

- *  <table>

- *   <tr>

- *    <td><i>None</i></td>

- *   </tr>

- *  </table>

- *

- *  \section SSec_BuildModule_CPPCHECK_ProvidedMacros Module Provided Macros

- *

- *  <table>

- *   <tr>

- *    <td><i>None</i></td>

- *   </tr>

- *  </table>

- */

-

- /** \page Page_BuildModule_DFU The DFU build module

- *

- *  The DFU programming utility LUFA build system module, providing targets to reprogram an

- *  Atmel processor FLASH and EEPROM memories with a project's compiled binary output files.

- *  This module requires a DFU class bootloader to be running in the target, compatible with

- *  the DFU bootloader protocol as published by Atmel.

- *

- *  To use this module in your application makefile, add the following code:

- *  \code

- *  include $(LUFA_PATH)/Build/lufa_dfu.mk

- *  \endcode

- *

- *  \section SSec_BuildModule_DFU_Requirements Requirements

- *  This module requires either the <tt>batchisp</tt> utility from Atmel's FLIP utility, or the open

- *  source <tt>dfu-programmer</tt> utility (<a>http://dfu-programmer.sourceforge.net/</a>) to be

- *  available in your system's <b>PATH</b> variable. On *nix systems the <tt>dfu-programmer</tt> utility

- *  can be installed via the project's source code or through the package manager.

- *

- *  \section SSec_BuildModule_DFU_Targets Targets

- *

- *  <table>

- *   <tr>

- *    <td><tt>dfu</tt></td>

- *    <td>Program the device FLASH memory with the application's executable data using <tt>dfu-programmer</tt>.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>dfu-ee</tt></td>

- *    <td>Program the device EEPROM memory with the application's EEPROM data using <tt>dfu-programmer</tt>.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>flip</tt></td>

- *    <td>Program the device FLASH memory with the application's executable data using <tt>batchisp</tt>.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>flip-ee</tt></td>

- *    <td>Program the device EEPROM memory with the application's EEPROM data using <tt>batchisp</tt>.</td>

- *   </tr>

- *  </table>

- *

- *  \section SSec_BuildModule_DFU_MandatoryParams Mandatory Parameters

- *

- *  <table>

- *   <tr>

- *    <td><tt>MCU</tt></td>

- *    <td>Name of the Atmel processor model (e.g. <tt>at90usb1287</tt>).</td>

- *   </tr>

- *   <tr>

- *    <td><tt>TARGET</tt></td>

- *    <td>Name of the application output file prefix (e.g. <tt>TestApplication</tt>).</td>

- *   </tr>

- *  </table>

- *

- *  \section SSec_BuildModule_DFU_OptionalParams Optional Parameters

- *

- *  <table>

- *   <tr>

- *    <td><i>None</i></td>

- *   </tr>

- *  </table>

- *

- *  \section SSec_BuildModule_DFU_ProvidedVariables Module Provided Variables

- *

- *  <table>

- *   <tr>

- *    <td><i>None</i></td>

- *   </tr>

- *  </table>

- *

- *  \section SSec_BuildModule_DFU_ProvidedMacros Module Provided Macros

- *

- *  <table>

- *   <tr>

- *    <td><i>None</i></td>

- *   </tr>

- *  </table>

- */

-

- /** \page Page_BuildModule_DOXYGEN The DOXYGEN build module

- *

- *  The DOXYGEN code documentation utility LUFA build system module, providing targets to generate

- *  project HTML and other format documentation from a set of source files that include special

- *  Doxygen comments.

- *

- *  To use this module in your application makefile, add the following code:

- *  \code

- *  include $(LUFA_PATH)/Build/lufa_doxygen.mk

- *  \endcode

- *

- *  \section SSec_BuildModule_DOXYGEN_Requirements Requirements

- *  This module requires the <tt>doxygen</tt> utility from the Doxygen website

- *  (<a>http://www.doxygen.org/</a>) to be available in your system's <b>PATH</b> variable. On *nix

- *  systems the <tt>doxygen</tt> utility can be installed via the project's source code or through

- *  the package manager.

- *

- *  \section SSec_BuildModule_DOXYGEN_Targets Targets

- *

- *  <table>

- *   <tr>

- *    <td><tt>doxygen</tt></td>

- *    <td>Generate project documentation.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>doxygen_create</tt></td>

- *    <td>Create a new Doxygen configuration file using the latest template.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>doxygen_upgrade</tt></td>

- *    <td>Upgrade an existing Doxygen configuration file to the latest template</td>

- *   </tr>

- *  </table>

- *

- *  \section SSec_BuildModule_DOXYGEN_MandatoryParams Mandatory Parameters

- *

- *  <table>

- *   <tr>

- *    <td><tt>LUFA_PATH</tt></td>

- *    <td>Path to the LUFA library core, either relative or absolute (e.g. <tt>../LUFA-000000/LUFA/</tt>).</td>

- *   </tr>

- *  </table>

- *

- *  \section SSec_BuildModule_DOXYGEN_OptionalParams Optional Parameters

- *

- *  <table>

- *   <tr>

- *    <td><tt>DOXYGEN_CONF</tt></td>

- *    <td>Name and path of the base Doxygen configuration file for the project.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>DOXYGEN_FAIL_ON_WARNING</tt></td>

- *    <td>Set to <b>Y</b> to fail the generation with an error exit code if warnings are found other than unsupported configuration parameters, <b>N</b> to continue without failing.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>DOXYGEN_OVERRIDE_PARAMS</tt></td>

- *    <td>Extra Doxygen configuration parameters to apply, overriding the corresponding config entry in the project's configuration file (e.g. <tt>QUIET=YES</tt>).</td>

- *   </tr>

- *  </table>

- *

- *  \section SSec_BuildModule_DOXYGEN_ProvidedVariables Module Provided Variables

- *

- *  <table>

- *   <tr>

- *    <td><i>None</i></td>

- *   </tr>

- *  </table>

- *

- *  \section SSec_BuildModule_DOXYGEN_ProvidedMacros Module Provided Macros

- *

- *  <table>

- *   <tr>

- *    <td><i>None</i></td>

- *   </tr>

- *  </table>

- */

-

- /** \page Page_BuildModule_HID The HID build module

- *

- *  The HID programming utility LUFA build system module, providing targets to reprogram an

- *  Atmel processor's FLASH memory with a project's compiled binary output file. This module

- *  requires a HID class bootloader to be running in the target, using a protocol compatible

- *  with the PJRC "HalfKay" protocol (<a>http://www.pjrc.com/teensy/halfkay_protocol.html</a>).

- *

- *  To use this module in your application makefile, add the following code:

- *  \code

- *  include $(LUFA_PATH)/Build/lufa_hid.mk

- *  \endcode

- *

- *  \section SSec_BuildModule_HID_Requirements Requirements

- *  This module requires either the <tt>hid_bootloader_cli</tt> utility from the included LUFA HID

- *  class bootloader API subdirectory, or the <tt>teensy_loader_cli</tt> utility from PJRC

- *  (<a>http://www.pjrc.com/teensy/loader_cli.html</a>) to be available in your system's <b>PATH</b>

- *  variable.

- *

- *  \section SSec_BuildModule_HID_Targets Targets

- *

- *  <table>

- *   <tr>

- *    <td><tt>hid</tt></td>

- *    <td>Program the device FLASH memory with the application's executable data using <tt>hid_bootloader_cli</tt>.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>hid-ee</tt></td>

- *    <td>Program the device EEPROM memory with the application's EEPROM data using <tt>hid_bootloader_cli</tt> and

- *        a temporary AVR application programmed into the target's FLASH.

- *        \note This will erase the currently loaded application in the target.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>teensy</tt></td>

- *    <td>Program the device FLASH memory with the application's executable data using <tt>teensy_loader_cli</tt>.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>teensy-ee</tt></td>

- *    <td>Program the device EEPROM memory with the application's EEPROM data using <tt>teensy_loader_cli</tt> and

- *        a temporary AVR application programmed into the target's FLASH.

- *        \note This will erase the currently loaded application in the target.</td>

- *   </tr>

- *  </table>

- *

- *  \section SSec_BuildModule_HID_MandatoryParams Mandatory Parameters

- *

- *  <table>

- *   <tr>

- *    <td><tt>MCU</tt></td>

- *    <td>Name of the Atmel processor model (e.g. <tt>at90usb1287</tt>).</td>

- *   </tr>

- *   <tr>

- *    <td><tt>TARGET</tt></td>

- *    <td>Name of the application output file prefix (e.g. <tt>TestApplication</tt>).</td>

- *   </tr>

- *  </table>

- *

- *  \section SSec_BuildModule_HID_OptionalParams Optional Parameters

- *

- *  <table>

- *   <tr>

- *    <td><i>None</i></td>

- *   </tr>

- *  </table>

- *

- *  \section SSec_BuildModule_HID_ProvidedVariables Module Provided Variables

- *

- *  <table>

- *   <tr>

- *    <td><i>None</i></td>

- *   </tr>

- *  </table>

- *

- *  \section SSec_BuildModule_HID_ProvidedMacros Module Provided Macros

- *

- *  <table>

- *   <tr>

- *    <td><i>None</i></td>

- *   </tr>

- *  </table>

- */

-

- /** \page Page_BuildModule_SOURCES The SOURCES build module

- *

- *  The SOURCES LUFA build system module, providing variables listing the various LUFA source files

- *  required to be build by a project for a given LUFA module. This module gives a way to reference

- *  LUFA source files symbolically, so that changes to the library structure do not break the library

- *  makefile.

- *

- *  To use this module in your application makefile, add the following code:

- *  \code

- *  include $(LUFA_PATH)/Build/lufa_sources.mk

- *  \endcode

- *

- *  \section SSec_BuildModule_SOURCES_Requirements Requirements

- *  None.

- *

- *  \section SSec_BuildModule_SOURCES_Targets Targets

- *

- *  <table>

- *   <tr>

- *    <td><i>None</i></td>

- *   </tr>

- *  </table>

- *

- *  \section SSec_BuildModule_SOURCES_MandatoryParams Mandatory Parameters

- *

- *  <table>

- *   <tr>

- *    <td><tt>LUFA_PATH</tt></td>

- *    <td>Path to the LUFA library core, either relative or absolute (e.g. <tt>../LUFA-000000/LUFA/</tt>).</td>

- *   </tr>

- *   <tr>

- *    <td><tt>ARCH</tt></td>

- *    <td>Architecture of the target processor (see \ref Page_DeviceSupport).</td>

- *   </tr>

- *  </table>

- *

- *  \section SSec_BuildModule_SOURCES_OptionalParams Optional Parameters

- *

- *  <table>

- *   <tr>

- *    <td><i>None</i></td>

- *   </tr>

- *  </table>

- *

- *  \section SSec_BuildModule_SOURCES_ProvidedVariables Module Provided Variables

- *

- *  <table>

- *   <tr>

- *    <td><tt>LUFA_SRC_USB</tt></td>

- *    <td>List of LUFA USB driver source files.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>LUFA_SRC_USBCLASS</tt></td>

- *    <td>List of LUFA USB Class driver source files.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>LUFA_SRC_TEMPERATURE</tt></td>

- *    <td>List of LUFA temperature sensor driver source files.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>LUFA_SRC_SERIAL</tt></td>

- *    <td>List of LUFA Serial U(S)ART driver source files.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>LUFA_SRC_TWI</tt></td>

- *    <td>List of LUFA TWI driver source files.</td>

- *   </tr>

- *   <tr>

- *    <td><tt>LUFA_SRC_PLATFORM</tt></td>

- *    <td>List of LUFA architecture specific platform management source files.</td>

- *   </tr>

- *  </table>

- *

- *  \section SSec_BuildModule_SOURCES_ProvidedMacros Module Provided Macros

- *

- *  <table>

- *   <tr>

- *    <td><i>None</i></td>

- *   </tr>

- *  </table>

- */

-

-/** \page Page_BuildTroubleshooting Troubleshooting Information

- *

- *  LUFA uses a lot of advanced features of the AVR-GCC compiler, linker, and surrounding binaries. This can sometimes lead to problems compiling applications if one of these

- *  features is buggy in the version of the tools used in a build environment. Missing utilities and incorrectly set makefile configuration options can also result in different

- *  errors being produced when compilation or other operations are attempted. The table below lists a set of commonly encountered errors and their resolutions.

- *

- *  <table>

- *    <tr>

- *    <th>Problem</th>

- *    <th>Resolution</th>

- *   </tr>

- *   <tr>

- *    <td>Error &quot;<b><tt>relocation truncated to fit: R_AVR_13_PCREL against symbol <i>{X}</i></tt></b>&quot; shown when compiling.</td>

- *    <td>Try compiling with the setting <tt>LINKER_RELAXATIONS=N</tt> in your LUFA Build System 2.0 makefile, or remove the line <tt>-Wl,--relax</tt>

- *        from other makefiles. Alternatively, make sure you have the latest version of the Atmel Toolchain installed for your system.</td>

- *   </tr>

- *   <tr>

- *    <td>Error &quot;<b><tt>error: ld terminated with signal 11 [Segmentation fault]</tt></b>&quot; shown when compiling.</td>

- *    <td>Try compiling with the setting <tt>DEBUG_LEVEL=2</tt> in your LUFA Build System 2.0 makefile, or make sure you are using <tt>binutils</tt> version 2.22 or later.</td>

- *   </tr>

- *   <tr>

- *    <td>Error &quot;<b><tt>EMERGENCY ABORT: INFINITE RECURSION DETECTED</tt></b>&quot; shown when compiling.</td>

- *    <td>Make sure you are using an up to date version of GNU Make when compiling. This error is a safety system added to the mid-level makefiles, to prevent an issue with

- *        GNU make or other variants of Make causing an infinitely recursive build.</td>

- *   </tr>

- *   <tr>

- *    <td>Error &quot;<b><tt>Unsupported architecture &quot;<i>{X}</i>&quot;</tt></b>&quot; shown when compiling.</td>

- *    <td>Ensure your makefile's <tt>ARCH</tt> setting is set to one of the architecture names (case-sensitive) supported by the version of LUFA you are compiling against.</td>

- *   </tr>

- *   <tr>

- *    <td>Error &quot;<b><tt>Makefile <i>{X}</i> value not set</tt></b>&quot; shown when compiling.</td>

- *    <td>The specified Makefile value was not configured in your project's makefile or on the command line, and the nominated setting is required by one or more LUFA

- *        build system modules. Define the value in your project makefile and try again.</td>

- *   </tr>

- *   <tr>

- *    <td>Error &quot;<b><tt>Makefile <i>{X}</i> option cannot be blank</tt></b>&quot; shown when compiling.</td>

- *    <td>The specified Makefile value was configured in your project's makefile or on the command line, but was set to an empty value. For the nominated configuration

- *        option, an empty value is not allowed. Define the nominated setting to a correct non-blank value and try again.</td>

- *   </tr>

- *   <tr>

- *    <td>Error &quot;<b><tt>Makefile <i>{X}</i> option must be Y or N</tt></b>&quot; shown when compiling.</td>

- *    <td>The specified Makefile value was configured in your project's makefile or on the command line, but was set to a value other than a Y (for "Yes") or "N" (for "No").

- *        This configuration option is required to be one of the aforementioned boolean values, and other values are invalid. Set this option to either Y or N and try again.</td>

- *   </tr>

- *   <tr>

- *    <td>Error &quot;<b><tt>Unknown input source file formats: <i>{X}</i></tt></b>&quot; shown when compiling.</td>

- *    <td>The nominated source files, specified in your project's makefile in the <tt>SRC</tt> configuration option, has an extension that the LUFA build system does not

- *        recognise. The file extensions are case sensitive, and must be one of the supported formats (<tt>*.c</tt>, <tt>*.cpp</tt> or <tt>*.S</tt>).</td>

- *   </tr>

- *   <tr>

- *    <td>Error &quot;<b><tt>Cannot build with OBJDIR parameter set - one or more object file name is not unique</tt></b>&quot; shown when compiling.</td>

- *    <td>When a project is built with a non-empty <tt>OBJDIR</tt> object directory name set, all input source files must have unique names, excluding extension and path.

- *        This means that input files that are named identically and differ only by their path or extension are invalid when this mode is used.</td>

- *   </tr>

- *   <tr>

- *    <td>Error &quot;<b><tt>Source file does not exist: <i>{X}</i></tt></b>&quot; shown when compiling.</td>

- *    <td>The nominated input source file, specified in the user project's <tt>SRC</tt> parameter, could not be found. Ensure the source file exists and the absolute or

- *        relative path given in the user project makefile is correct and try again.</td>

- *   </tr>

- *   <tr>

- *    <td>Error &quot;<b><tt>Doxygen configuration file <i>{X}</i> does not exist</tt></b>&quot; shown when upgrading a Doxygen configuration file.</td>

- *    <td>The nominated Doxygen configuration file, specified in the user project's <tt>DOXYGEN_CONF</tt> parameter, could not be found. Ensure the configuration file exists

- *        and the absolute or relative path given in the user project makefile is correct and try again, or run the appropriate makefile target to generate a new configuration

- *        file.</td>

- *   </tr>

- *   <tr>

- *    <td>Error &quot;<b><tt>avr-gcc: error: unrecognized option '<i>{X}</i>'</tt></b>&quot; shown when compiling.</td>

- *    <td>An unrecognised option was supplied to the compiler, usually in the <tt>C_FLAGS</tt>, <tt>CPP_FLAGS</tt>, <tt>ASM_FLAGS</tt> or <tt>CC_FLAGS</tt> configuration

- *        options. The nominated compiler switch may be invalid, or unsupported by the version of AVR-GCC on the host system. Remove the unrecognised flag if invalid, or

- *        upgrade to the latest AVR-GCC. If the option is a valid linker option, use the prefix "-Wl," to ensure it is passed to the linker correctly.</td>

- *   </tr>

- *   <tr>

- *    <td>Error &quot;<b><tt>makefile:{X}: {Y}.mk: No such file or directory</tt></b>&quot; shown when make is invoked.</td>

- *    <td>The path to the nominated makefile module was incorrect. This usually indicates that the makefile <tt>LUFA_PATH</tt> option is not set to a valid relative or

- *        absolute path to the LUFA library core.</td>

- *   </tr>

- *   <tr>

- *    <td>Error &quot;<b><tt>fatal error: LUFAConfig.h: No such file or directory</tt></b>&quot; shown when compiling.</td>

- *    <td>The <tt>USE_LUFA_CONFIG_HEADER</tt> compile time option was set in the user project makefile, but the user supplied <tt>LUFAConfig.h</tt> header could not be

- *        found. Ensure that the directory that contains this configuration file is correctly passed to the compiler via the -I switch in the makefile <tt>CC_FLAGS</tt>

- *        parameter.</td>

- *   </tr>

- *   <tr>

- *    <td>Error &quot;<b><tt>ld.exe: section .apitable_trampolines loaded at <i>{X}</i> overlaps section .text</tt></b>&quot; shown when compiling a bootloader.</td>

- *    <td>The bootloader is compiling too large for the given <tt>FLASH_SIZE_KB</tt> and <tt>BOOT_SECTION_SIZE_KB</tt> parameters set in the bootloader makefile. This

- *        usually indicates that these values are incorrect for the specified device the bootloader is targeting. If these values are correct, a newer version of the

- *        compiler may need to be used to ensure that the bootloader is built within the section size constraints of the target device.</td>

- *   </tr>

- *   <tr>

- *    <td>Error &quot;<b><tt>unknown MCU '<i>{X}</i>' specified</tt></b>&quot; shown when compiling.</td>

- *    <td>The specified microcontroller device model name set in the user application's makefile as the <tt>MCU</tt> parameter is incorrect, or unsupported by the

- *        version of the compiler being used. Make sure the model name is correct, or upgrade to the latest Atmel Toolchain to obtain newer device support.</td>

- *   </tr>

- *   <tr>

- *    <td>Error &quot;<b><tt>undefined reference to `<i>{X}</i>'</tt></b>&quot; shown when compiling.</td>

- *    <td>This is usually caused by a missing source file in the user application's <tt>SRC</tt> configuration parameter. If the indicated symbol is one from the LUFA

- *        library, you may be missing a LUFA source makefile module (see \ref Page_BuildModule_SOURCES).</td>

- *   </tr>

- *  </table>

- *

- *  For troubleshooting other errors you encounter, please see \ref Sec_ProjectHelp.

- */

+/** \file
+ *
+ *  This file contains special DoxyGen information for the generation of the main page and other special
+ *  documentation pages. It is not a project source file.
+ */
+
+/** \page Page_BuildSystem The LUFA Build System
+ *
+ *  \section Sec_BuildSystem_Overview Overview of the LUFA Build System
+ *  The LUFA build system is an attempt at making a set of re-usable, modular build make files which
+ *  can be referenced in a LUFA powered project, to minimize the amount of code required in an
+ *  application makefile. The system is written in GNU Make, and each module is independent of
+ *  one-another.
+ *
+ *  For details on the prerequisites needed for Linux and Windows machines to be able to use the LUFA
+ *  build system, see \ref Sec_CompilingApps_Prerequisites.
+ *
+ *  To use a LUFA build system module, simply add an include to your project makefile. All user projects
+ *  should at a minimum include \ref Page_BuildModule_CORE for base functionality:
+ *  \code
+ *  include $(LUFA_PATH)/Build/lufa_core.mk
+ *  \endcode
+ *
+ *  Once included in your project makefile, the associated build module targets will be added to your
+ *  project's build makefile targets automatically. To call a build target, run <tt>make {TARGET_NAME}</tt>
+ *  from the command line, substituting in the appropriate target name.
+ *
+ *  \see \ref Sec_ConfiguringApps_AppMakefileParams for a copy of the sample LUFA project makefile.
+ *
+ *  Each build module may have one or more mandatory parameters (GNU Make variables) which <i>must</i>
+ *  be supplied in the project makefile for the module to work, and one or more optional parameters which
+ *  may be defined and which will assume a sensible default if not.
+ *
+ *  \section SSec_BuildSystem_Modules Available Modules
+ *
+ *  The following modules are included in this LUFA release:
+ *
+ *  \li \subpage Page_BuildModule_ATPROGRAM - Device Programming
+ *  \li \subpage Page_BuildModule_AVRDUDE - Device Programming
+ *  \li \subpage Page_BuildModule_BUILD - Compiling/Assembling/Linking
+ *  \li \subpage Page_BuildModule_CORE - Core Build System Functions
+ *  \li \subpage Page_BuildModule_CPPCHECK - Static Code Analysis
+ *  \li \subpage Page_BuildModule_DFU - Device Programming
+ *  \li \subpage Page_BuildModule_DOXYGEN - Automated Source Code Documentation
+ *  \li \subpage Page_BuildModule_HID - Device Programming
+ *  \li \subpage Page_BuildModule_SOURCES - LUFA Module Source Code Variables
+ *
+ *  If you have problems building using the LUFA build system, see \subpage Page_BuildTroubleshooting for resolution steps.
+ */
+
+ /** \page Page_BuildModule_BUILD The BUILD build module
+ *
+ *  The BUILD LUFA build system module, providing targets for the compilation,
+ *  assembling and linking of an application from source code into binary files
+ *  suitable for programming into a target device, using the GCC compiler.
+ *
+ *  To use this module in your application makefile, add the following code:
+ *  \code
+ *  include $(LUFA_PATH)/Build/lufa_build.mk
+ *  \endcode
+ *
+ *  \section SSec_BuildModule_BUILD_Requirements Requirements
+ *  This module requires the the architecture appropriate binaries of the GCC compiler are available in your
+ *  system's <b>PATH</b> variable. The GCC compiler and associated toolchain is distributed in Atmel AVR Studio
+ *  5.x and Atmel Studio 6.x installation directories, as well as in many third party distribution packages.
+ *
+ *  \section SSec_BuildModule_BUILD_Targets Targets
+ *
+ *  <table>
+ *   <tr>
+ *    <td><tt>size</tt></td>
+ *    <td>Display size of the compiled application FLASH and SRAM segments.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>symbol-sizes</tt></td>
+ *    <td>Display a size-sorted list of symbols from the compiled application, in decimal bytes.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>lib</tt></td>
+ *    <td>Build and archive all source files into a library A binary file.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>all</tt></td>
+ *    <td>Build and link the application into ELF debug and HEX binary files.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>elf</tt></td>
+ *    <td>Build and link the application into an ELF debug file.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>bin</tt></td>
+ *    <td>Build and link the application and produce a BIN binary file.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>hex</tt></td>
+ *    <td>Build and link the application and produce HEX and EEP binary files.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>lss</tt></td>
+ *    <td>Build and link the application and produce a LSS source code/assembly code mixed listing file.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>clean</tt></td>
+ *    <td>Remove all intermediary files and binary output files.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>mostlyclean</tt></td>
+ *    <td>Remove all intermediary files but preserve any binary output files.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt><i>&lt;filename&gt;</i>.s</tt></td>
+ *    <td>Create an assembly listing of a given input C/C++ source file.</td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_BUILD_MandatoryParams Mandatory Parameters
+ *
+ *  <table>
+ *   <tr>
+ *    <td><tt>TARGET</tt></td>
+ *    <td>Name of the application output file prefix (e.g. <tt>TestApplication</tt>).</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>ARCH</tt></td>
+ *    <td>Architecture of the target processor (see \ref Page_DeviceSupport).</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>MCU</tt></td>
+ *    <td>Name of the Atmel processor model (e.g. <tt>at90usb1287</tt>).</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>SRC</tt></td>
+ *    <td>List of relative or absolute paths to the application C (.c), C++ (.cpp) and Assembly (.S) source files.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>F_USB</tt></td>
+ *    <td>Speed in Hz of the input clock frequency to the target's USB controller.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>LUFA_PATH</tt></td>
+ *    <td>Path to the LUFA library core, either relative or absolute (e.g. <tt>../LUFA-000000/LUFA/</tt>).</td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_BUILD_OptionalParams Optional Parameters
+ *
+ *  <table>
+ *   <tr>
+ *    <td><tt>BOARD</tt></td>
+ *    <td>LUFA board hardware drivers to use (see \ref Page_DeviceSupport).</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>OPTIMIZATION</tt></td>
+ *    <td>Optimization level to use when compiling source files (see GCC manual).</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>C_STANDARD</tt></td>
+ *    <td>Version of the C standard to apply when compiling C++ source files (see GCC manual).</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>CPP_STANDARD</tt></td>
+ *    <td>Version of the C++ standard to apply when compiling C++ source files (see GCC manual).</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>DEBUG_FORMAT</tt></td>
+ *    <td>Format of the debug information to embed in the generated object files (see GCC manual).</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>DEBUG_LEVEL</tt></td>
+ *    <td>Level of the debugging information to embed in the generated object files (see GCC manual).</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>F_CPU</tt></td>
+ *    <td>Speed of the processor CPU clock, in Hz.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>C_FLAGS</tt></td>
+ *    <td>Flags to pass to the C compiler only, after the automatically generated flags.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>CPP_FLAGS</tt></td>
+ *    <td>Flags to pass to the C++ compiler only, after the automatically generated flags.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>ASM_FLAGS</tt></td>
+ *    <td>Flags to pass to the assembler only, after the automatically generated flags.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>CC_FLAGS</tt></td>
+ *    <td>Common flags to pass to the C/C++ compiler and assembler, after the automatically generated flags.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>COMPILER_PATH</tt></td>
+ *    <td>Directory where the C/C++ toolchain is located, if not available in the system <tt>PATH</tt>.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>LD_FLAGS</tt></td>
+ *    <td>Flags to pass to the linker, after the automatically generated flags.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>LINKER_RELAXATIONS</tt></td>
+ *    <td>Enables or disables linker relaxations when linking the application binary. This can reduce the total size
+ *        of the application by replacing full \c CALL instructions with smaller \c RCALL instructions where possible.
+ *        \note On some unpatched versions of binutils, this can cause link failures in some circumstances. If you
+ *              receive a link error <tt>relocation truncated to fit: R_AVR_13_PCREL</tt>, disable this setting.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>OBJDIR</tt></td>
+ *    <td>Directory to place the generated object and dependency files. If set to "." the same folder as the source file will be used.
+ *        \note When this option is enabled, all source filenames <b>must</b> be unique.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>OBJECT_FILES</tt></td>
+ *    <td>List of additional object files that should be linked into the resulting binary.</td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_BUILD_ProvidedVariables Module Provided Variables
+ *
+ *  <table>
+ *   <tr>
+ *    <td><i>None</i></td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_BUILD_ProvidedMacros Module Provided Macros
+ *
+ *  <table>
+ *   <tr>
+ *    <td><i>None</i></td>
+ *   </tr>
+ *  </table>
+ */
+
+/** \page Page_BuildModule_CORE The CORE build module
+ *
+ *  The core LUFA build system module, providing common build system help and information targets.
+ *
+ *  To use this module in your application makefile, add the following code:
+ *  \code
+ *  include $(LUFA_PATH)/Build/lufa_core.mk
+ *  \endcode
+ *
+ *  \section SSec_BuildModule_CORE_Requirements Requirements
+ *  This module has no requirements outside a standard *nix shell like environment; the <tt>sh</tt>
+ *  shell, GNU <tt>make</tt> and *nix CoreUtils (<tt>echo</tt>, <tt>printf</tt>, etc.).
+ *
+ *  \section SSec_BuildModule_CORE_Targets Targets
+ *
+ *  <table>
+ *   <tr>
+ *    <td><tt>help</tt></td>
+ *    <td>Display build system help and configuration information.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>list_targets</tt></td>
+ *    <td>List all available build targets from the build system.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>list_modules</tt></td>
+ *    <td>List all available build modules from the build system.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>list_mandatory</tt></td>
+ *    <td>List all mandatory parameters required by the included modules.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>list_optional</tt></td>
+ *    <td>List all optional parameters required by the included modules.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>list_provided</tt></td>
+ *    <td>List all variables provided by the included modules.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>list_macros</tt></td>
+ *    <td>List all macros provided by the included modules.</td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_CORE_MandatoryParams Mandatory Parameters
+ *
+ *  <table>
+ *   <tr>
+ *    <td><i>None</i></td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_CORE_OptionalParams Optional Parameters
+ *
+ *  <table>
+ *   <tr>
+ *    <td><i>None</i></td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_CORE_ProvidedVariables Module Provided Variables
+ *
+ *  <table>
+ *   <tr>
+ *    <td><i>None</i></td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_CORE_ProvidedMacros Module Provided Macros
+ *
+ *  <table>
+ *   <tr>
+ *    <td><i>None</i></td>
+ *   </tr>
+ *  </table>
+ */
+
+/** \page Page_BuildModule_ATPROGRAM The ATPROGRAM build module
+ *
+ *  The ATPROGRAM programming utility LUFA build system module, providing targets to reprogram an
+ *  Atmel processor FLASH and EEPROM memories with a project's compiled binary output files.
+ *
+ *  To use this module in your application makefile, add the following code:
+ *  \code
+ *  include $(LUFA_PATH)/Build/lufa_atprogram.mk
+ *  \endcode
+ *
+ *  \section SSec_BuildModule_ATPROGRAM_Requirements Requirements
+ *  This module requires the <tt>atprogram.exe</tt> utility to be available in your system's <b>PATH</b>
+ *  variable. The <tt>atprogram.exe</tt> utility is distributed in Atmel AVR Studio 5.x and Atmel Studio 6.x
+ *  inside the application install folder's "\atbackend" subdirectory.
+ *
+ *  \section SSec_BuildModule_ATPROGRAM_Targets Targets
+ *
+ *  <table>
+ *   <tr>
+ *    <td><tt>atprogram</tt></td>
+ *    <td>Program the device FLASH memory with the application's executable data.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>atprogram-ee</tt></td>
+ *    <td>Program the device EEPROM memory with the application's EEPROM data.</td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_ATPROGRAM_MandatoryParams Mandatory Parameters
+ *
+ *  <table>
+ *   <tr>
+ *    <td><tt>MCU</tt></td>
+ *    <td>Name of the Atmel processor model (e.g. <tt>at90usb1287</tt>).</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>TARGET</tt></td>
+ *    <td>Name of the application output file prefix (e.g. <tt>TestApplication</tt>).</td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_ATPROGRAM_OptionalParams Optional Parameters
+ *
+ *  <table>
+ *   <tr>
+ *    <td><tt>ATPROGRAM_PROGRAMMER</tt></td>
+ *    <td>Name of the Atmel programmer or debugger tool to communicate with (e.g. <tt>jtagice3</tt>).</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>ATPROGRAM_INTERFACE</tt></td>
+ *    <td>Name of the programming interface to use when programming the target (e.g. <tt>spi</tt>).</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>ATPROGRAM_PORT</tt></td>
+ *    <td>Name of the communication port to use when when programming with a serially connected tool (e.g. <tt>COM2</tt>).</td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_ATPROGRAM_ProvidedVariables Module Provided Variables
+ *
+ *  <table>
+ *   <tr>
+ *    <td><i>None</i></td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_ATPROGRAM_ProvidedMacros Module Provided Macros
+ *
+ *  <table>
+ *   <tr>
+ *    <td><i>None</i></td>
+ *   </tr>
+ *  </table>
+ */
+
+/** \page Page_BuildModule_AVRDUDE The AVRDUDE build module
+ *
+ *  The AVRDUDE programming utility LUFA build system module, providing targets to reprogram an
+ *  Atmel processor FLASH and EEPROM memories with a project's compiled binary output files.
+ *
+ *  To use this module in your application makefile, add the following code:
+ *  \code
+ *  include $(LUFA_PATH)/Build/lufa_avrdude.mk
+ *  \endcode
+ *
+ *  \section SSec_BuildModule_AVRDUDE_Requirements Requirements
+ *  This module requires the <tt>avrdude</tt> utility to be available in your system's <b>PATH</b>
+ *  variable. The <tt>avrdude</tt> utility is distributed in the old WinAVR project releases for
+ *  Windows (<a>http://winavr.sourceforge.net</a>) or can be installed on *nix systems via the project's
+ *  source code (<a>https://savannah.nongnu.org/projects/avrdude</a>) or through the package manager.
+ *
+ *  \section SSec_BuildModule_AVRDUDE_Targets Targets
+ *
+ *  <table>
+ *   <tr>
+ *    <td><tt>avrdude</tt></td>
+ *    <td>Program the device FLASH memory with the application's executable data.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>avrdude-ee</tt></td>
+ *    <td>Program the device EEPROM memory with the application's EEPROM data.</td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_AVRDUDE_MandatoryParams Mandatory Parameters
+ *
+ *  <table>
+ *   <tr>
+ *    <td><tt>MCU</tt></td>
+ *    <td>Name of the Atmel processor model (e.g. <tt>at90usb1287</tt>).</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>TARGET</tt></td>
+ *    <td>Name of the application output file prefix (e.g. <tt>TestApplication</tt>).</td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_AVRDUDE_OptionalParams Optional Parameters
+ *
+ *  <table>
+ *   <tr>
+ *    <td><tt>AVRDUDE_PROGRAMMER</tt></td>
+ *    <td>Name of the programmer or debugger tool to communicate with (e.g. <tt>jtagicemkii</tt>).</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>AVRDUDE_PORT</tt></td>
+ *    <td>Name of the communication port to use when when programming with the connected tool (e.g. <tt>COM2</tt>, <tt>/dev/ttyUSB0</tt> or <tt>usb</tt>).</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>AVRDUDE_FLAGS</tt></td>
+ *    <td>Additional flags to pass to avrdude when programming, applied after the automatically generated flags.</td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_AVRDUDE_ProvidedVariables Module Provided Variables
+ *
+ *  <table>
+ *   <tr>
+ *    <td><i>None</i></td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_AVRDUDE_ProvidedMacros Module Provided Macros
+ *
+ *  <table>
+ *   <tr>
+ *    <td><i>None</i></td>
+ *   </tr>
+ *  </table>
+ */
+
+ /** \page Page_BuildModule_CPPCHECK The CPPCHECK build module
+ *
+ *  The CPPCHECK programming utility LUFA build system module, providing targets to statically
+ *  analyze C and C++ source code for errors and performance/style issues.
+ *
+ *  To use this module in your application makefile, add the following code:
+ *  \code
+ *  include $(LUFA_PATH)/Build/lufa_cppcheck.mk
+ *  \endcode
+ *
+ *  \section SSec_BuildModule_CPPCHECK_Requirements Requirements
+ *  This module requires the <tt>cppcheck</tt> utility to be available in your system's <b>PATH</b>
+ *  variable. The <tt>cppcheck</tt> utility is distributed through the project's home page
+ *  (<a>http://cppcheck.sourceforge.net</a>) for Windows, and can be installed on *nix systems via
+ *  the project's source code or through the package manager.
+ *
+ *  \section SSec_BuildModule_CPPCHECK_Targets Targets
+ *
+ *  <table>
+ *   <tr>
+ *    <td><tt>cppcheck</tt></td>
+ *    <td>Statically analyze the project source code for issues.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>cppcheck-config</tt></td>
+ *    <td>Check the <tt>cppcheck</tt> configuration - scan source code and warn about missing header files and other issues.</td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_CPPCHECK_MandatoryParams Mandatory Parameters
+ *
+ *  <table>
+ *   <tr>
+ *    <td><tt>SRC</tt></td>
+ *    <td>List of source files to statically analyze.</td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_CPPCHECK_OptionalParams Optional Parameters
+ *
+ *  <table>
+ *   <tr>
+ *    <td><tt>CPPCHECK_INCLUDES</tt></td>
+ *    <td>Path of extra directories to check when attemting to resolve C/C++ header file includes.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>CPPCHECK_EXCLUDES</tt></td>
+ *    <td>Paths or path fragments to exclude when analyzing.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>CPPCHECK_MSG_TEMPLATE</tt></td>
+ *    <td>Output message template to use when printing errors, warnings and information (see <tt>cppcheck</tt> documentation).</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>CPPCHECK_ENABLE</tt></td>
+ *    <td>Analysis rule categories to enable (see <tt>cppcheck</tt> documentation).</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>CPPCHECK_SUPPRESS</tt></td>
+ *    <td>Specific analysis rules to suppress (see <tt>cppcheck</tt> documentation).</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>CPPCHECK_FAIL_ON_WARNING</tt></td>
+ *    <td>Set to <b>Y</b> to fail the analysis job with an error exit code if warnings are found, <b>N</b> to continue without failing.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>CPPCHECK_QUIET</tt></td>
+ *    <td>Set to <b>Y</b> to suppress all output except warnings and errors, <b>N</b> to show verbose output information.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>CPPCHECK_FLAGS</tt></td>
+ *    <td>Extra flags to pass to <tt>cppcheck</tt>, after the automatically generated flags.</td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_CPPCHECK_ProvidedVariables Module Provided Variables
+ *
+ *  <table>
+ *   <tr>
+ *    <td><i>None</i></td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_CPPCHECK_ProvidedMacros Module Provided Macros
+ *
+ *  <table>
+ *   <tr>
+ *    <td><i>None</i></td>
+ *   </tr>
+ *  </table>
+ */
+
+ /** \page Page_BuildModule_DFU The DFU build module
+ *
+ *  The DFU programming utility LUFA build system module, providing targets to reprogram an
+ *  Atmel processor FLASH and EEPROM memories with a project's compiled binary output files.
+ *  This module requires a DFU class bootloader to be running in the target, compatible with
+ *  the DFU bootloader protocol as published by Atmel.
+ *
+ *  To use this module in your application makefile, add the following code:
+ *  \code
+ *  include $(LUFA_PATH)/Build/lufa_dfu.mk
+ *  \endcode
+ *
+ *  \section SSec_BuildModule_DFU_Requirements Requirements
+ *  This module requires either the <tt>batchisp</tt> utility from Atmel's FLIP utility, or the open
+ *  source <tt>dfu-programmer</tt> utility (<a>http://dfu-programmer.sourceforge.net/</a>) to be
+ *  available in your system's <b>PATH</b> variable. On *nix systems the <tt>dfu-programmer</tt> utility
+ *  can be installed via the project's source code or through the package manager.
+ *
+ *  \section SSec_BuildModule_DFU_Targets Targets
+ *
+ *  <table>
+ *   <tr>
+ *    <td><tt>dfu</tt></td>
+ *    <td>Program the device FLASH memory with the application's executable data using <tt>dfu-programmer</tt>.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>dfu-ee</tt></td>
+ *    <td>Program the device EEPROM memory with the application's EEPROM data using <tt>dfu-programmer</tt>.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>flip</tt></td>
+ *    <td>Program the device FLASH memory with the application's executable data using <tt>batchisp</tt>.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>flip-ee</tt></td>
+ *    <td>Program the device EEPROM memory with the application's EEPROM data using <tt>batchisp</tt>.</td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_DFU_MandatoryParams Mandatory Parameters
+ *
+ *  <table>
+ *   <tr>
+ *    <td><tt>MCU</tt></td>
+ *    <td>Name of the Atmel processor model (e.g. <tt>at90usb1287</tt>).</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>TARGET</tt></td>
+ *    <td>Name of the application output file prefix (e.g. <tt>TestApplication</tt>).</td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_DFU_OptionalParams Optional Parameters
+ *
+ *  <table>
+ *   <tr>
+ *    <td><i>None</i></td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_DFU_ProvidedVariables Module Provided Variables
+ *
+ *  <table>
+ *   <tr>
+ *    <td><i>None</i></td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_DFU_ProvidedMacros Module Provided Macros
+ *
+ *  <table>
+ *   <tr>
+ *    <td><i>None</i></td>
+ *   </tr>
+ *  </table>
+ */
+
+ /** \page Page_BuildModule_DOXYGEN The DOXYGEN build module
+ *
+ *  The DOXYGEN code documentation utility LUFA build system module, providing targets to generate
+ *  project HTML and other format documentation from a set of source files that include special
+ *  Doxygen comments.
+ *
+ *  To use this module in your application makefile, add the following code:
+ *  \code
+ *  include $(LUFA_PATH)/Build/lufa_doxygen.mk
+ *  \endcode
+ *
+ *  \section SSec_BuildModule_DOXYGEN_Requirements Requirements
+ *  This module requires the <tt>doxygen</tt> utility from the Doxygen website
+ *  (<a>http://www.doxygen.org/</a>) to be available in your system's <b>PATH</b> variable. On *nix
+ *  systems the <tt>doxygen</tt> utility can be installed via the project's source code or through
+ *  the package manager.
+ *
+ *  \section SSec_BuildModule_DOXYGEN_Targets Targets
+ *
+ *  <table>
+ *   <tr>
+ *    <td><tt>doxygen</tt></td>
+ *    <td>Generate project documentation.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>doxygen_create</tt></td>
+ *    <td>Create a new Doxygen configuration file using the latest template.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>doxygen_upgrade</tt></td>
+ *    <td>Upgrade an existing Doxygen configuration file to the latest template</td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_DOXYGEN_MandatoryParams Mandatory Parameters
+ *
+ *  <table>
+ *   <tr>
+ *    <td><tt>LUFA_PATH</tt></td>
+ *    <td>Path to the LUFA library core, either relative or absolute (e.g. <tt>../LUFA-000000/LUFA/</tt>).</td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_DOXYGEN_OptionalParams Optional Parameters
+ *
+ *  <table>
+ *   <tr>
+ *    <td><tt>DOXYGEN_CONF</tt></td>
+ *    <td>Name and path of the base Doxygen configuration file for the project.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>DOXYGEN_FAIL_ON_WARNING</tt></td>
+ *    <td>Set to <b>Y</b> to fail the generation with an error exit code if warnings are found other than unsupported configuration parameters, <b>N</b> to continue without failing.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>DOXYGEN_OVERRIDE_PARAMS</tt></td>
+ *    <td>Extra Doxygen configuration parameters to apply, overriding the corresponding config entry in the project's configuration file (e.g. <tt>QUIET=YES</tt>).</td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_DOXYGEN_ProvidedVariables Module Provided Variables
+ *
+ *  <table>
+ *   <tr>
+ *    <td><i>None</i></td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_DOXYGEN_ProvidedMacros Module Provided Macros
+ *
+ *  <table>
+ *   <tr>
+ *    <td><i>None</i></td>
+ *   </tr>
+ *  </table>
+ */
+
+ /** \page Page_BuildModule_HID The HID build module
+ *
+ *  The HID programming utility LUFA build system module, providing targets to reprogram an
+ *  Atmel processor's FLASH memory with a project's compiled binary output file. This module
+ *  requires a HID class bootloader to be running in the target, using a protocol compatible
+ *  with the PJRC "HalfKay" protocol (<a>http://www.pjrc.com/teensy/halfkay_protocol.html</a>).
+ *
+ *  To use this module in your application makefile, add the following code:
+ *  \code
+ *  include $(LUFA_PATH)/Build/lufa_hid.mk
+ *  \endcode
+ *
+ *  \section SSec_BuildModule_HID_Requirements Requirements
+ *  This module requires either the <tt>hid_bootloader_cli</tt> utility from the included LUFA HID
+ *  class bootloader API subdirectory, or the <tt>teensy_loader_cli</tt> utility from PJRC
+ *  (<a>http://www.pjrc.com/teensy/loader_cli.html</a>) to be available in your system's <b>PATH</b>
+ *  variable.
+ *
+ *  \section SSec_BuildModule_HID_Targets Targets
+ *
+ *  <table>
+ *   <tr>
+ *    <td><tt>hid</tt></td>
+ *    <td>Program the device FLASH memory with the application's executable data using <tt>hid_bootloader_cli</tt>.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>hid-ee</tt></td>
+ *    <td>Program the device EEPROM memory with the application's EEPROM data using <tt>hid_bootloader_cli</tt> and
+ *        a temporary AVR application programmed into the target's FLASH.
+ *        \note This will erase the currently loaded application in the target.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>teensy</tt></td>
+ *    <td>Program the device FLASH memory with the application's executable data using <tt>teensy_loader_cli</tt>.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>teensy-ee</tt></td>
+ *    <td>Program the device EEPROM memory with the application's EEPROM data using <tt>teensy_loader_cli</tt> and
+ *        a temporary AVR application programmed into the target's FLASH.
+ *        \note This will erase the currently loaded application in the target.</td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_HID_MandatoryParams Mandatory Parameters
+ *
+ *  <table>
+ *   <tr>
+ *    <td><tt>MCU</tt></td>
+ *    <td>Name of the Atmel processor model (e.g. <tt>at90usb1287</tt>).</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>TARGET</tt></td>
+ *    <td>Name of the application output file prefix (e.g. <tt>TestApplication</tt>).</td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_HID_OptionalParams Optional Parameters
+ *
+ *  <table>
+ *   <tr>
+ *    <td><i>None</i></td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_HID_ProvidedVariables Module Provided Variables
+ *
+ *  <table>
+ *   <tr>
+ *    <td><i>None</i></td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_HID_ProvidedMacros Module Provided Macros
+ *
+ *  <table>
+ *   <tr>
+ *    <td><i>None</i></td>
+ *   </tr>
+ *  </table>
+ */
+
+ /** \page Page_BuildModule_SOURCES The SOURCES build module
+ *
+ *  The SOURCES LUFA build system module, providing variables listing the various LUFA source files
+ *  required to be build by a project for a given LUFA module. This module gives a way to reference
+ *  LUFA source files symbolically, so that changes to the library structure do not break the library
+ *  makefile.
+ *
+ *  To use this module in your application makefile, add the following code:
+ *  \code
+ *  include $(LUFA_PATH)/Build/lufa_sources.mk
+ *  \endcode
+ *
+ *  \section SSec_BuildModule_SOURCES_Requirements Requirements
+ *  None.
+ *
+ *  \section SSec_BuildModule_SOURCES_Targets Targets
+ *
+ *  <table>
+ *   <tr>
+ *    <td><i>None</i></td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_SOURCES_MandatoryParams Mandatory Parameters
+ *
+ *  <table>
+ *   <tr>
+ *    <td><tt>LUFA_PATH</tt></td>
+ *    <td>Path to the LUFA library core, either relative or absolute (e.g. <tt>../LUFA-000000/LUFA/</tt>).</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>ARCH</tt></td>
+ *    <td>Architecture of the target processor (see \ref Page_DeviceSupport).</td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_SOURCES_OptionalParams Optional Parameters
+ *
+ *  <table>
+ *   <tr>
+ *    <td><i>None</i></td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_SOURCES_ProvidedVariables Module Provided Variables
+ *
+ *  <table>
+ *   <tr>
+ *    <td><tt>LUFA_SRC_USB</tt></td>
+ *    <td>List of LUFA USB driver source files.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>LUFA_SRC_USBCLASS</tt></td>
+ *    <td>List of LUFA USB Class driver source files.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>LUFA_SRC_TEMPERATURE</tt></td>
+ *    <td>List of LUFA temperature sensor driver source files.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>LUFA_SRC_SERIAL</tt></td>
+ *    <td>List of LUFA Serial U(S)ART driver source files.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>LUFA_SRC_TWI</tt></td>
+ *    <td>List of LUFA TWI driver source files.</td>
+ *   </tr>
+ *   <tr>
+ *    <td><tt>LUFA_SRC_PLATFORM</tt></td>
+ *    <td>List of LUFA architecture specific platform management source files.</td>
+ *   </tr>
+ *  </table>
+ *
+ *  \section SSec_BuildModule_SOURCES_ProvidedMacros Module Provided Macros
+ *
+ *  <table>
+ *   <tr>
+ *    <td><i>None</i></td>
+ *   </tr>
+ *  </table>
+ */
+
+/** \page Page_BuildTroubleshooting Troubleshooting Information
+ *
+ *  LUFA uses a lot of advanced features of the AVR-GCC compiler, linker, and surrounding binaries. This can sometimes lead to problems compiling applications if one of these
+ *  features is buggy in the version of the tools used in a build environment. Missing utilities and incorrectly set makefile configuration options can also result in different
+ *  errors being produced when compilation or other operations are attempted. The table below lists a set of commonly encountered errors and their resolutions.
+ *
+ *  <table>
+ *    <tr>
+ *    <th>Problem</th>
+ *    <th>Resolution</th>
+ *   </tr>
+ *   <tr>
+ *    <td>Error &quot;<b><tt>relocation truncated to fit: R_AVR_13_PCREL against symbol <i>{X}</i></tt></b>&quot; shown when compiling.</td>
+ *    <td>Try compiling with the setting <tt>LINKER_RELAXATIONS=N</tt> in your LUFA Build System 2.0 makefile, or remove the line <tt>-Wl,--relax</tt>
+ *        from other makefiles. Alternatively, make sure you have the latest version of the Atmel Toolchain installed for your system.</td>
+ *   </tr>
+ *   <tr>
+ *    <td>Error &quot;<b><tt>error: ld terminated with signal 11 [Segmentation fault]</tt></b>&quot; shown when compiling.</td>
+ *    <td>Try compiling with the setting <tt>DEBUG_LEVEL=2</tt> in your LUFA Build System 2.0 makefile, or make sure you are using <tt>binutils</tt> version 2.22 or later.</td>
+ *   </tr>
+ *   <tr>
+ *    <td>Error &quot;<b><tt>EMERGENCY ABORT: INFINITE RECURSION DETECTED</tt></b>&quot; shown when compiling.</td>
+ *    <td>Make sure you are using an up to date version of GNU Make when compiling. This error is a safety system added to the mid-level makefiles, to prevent an issue with
+ *        GNU make or other variants of Make causing an infinitely recursive build.</td>
+ *   </tr>
+ *   <tr>
+ *    <td>Error &quot;<b><tt>Unsupported architecture &quot;<i>{X}</i>&quot;</tt></b>&quot; shown when compiling.</td>
+ *    <td>Ensure your makefile's <tt>ARCH</tt> setting is set to one of the architecture names (case-sensitive) supported by the version of LUFA you are compiling against.</td>
+ *   </tr>
+ *   <tr>
+ *    <td>Error &quot;<b><tt>Makefile <i>{X}</i> value not set</tt></b>&quot; shown when compiling.</td>
+ *    <td>The specified Makefile value was not configured in your project's makefile or on the command line, and the nominated setting is required by one or more LUFA
+ *        build system modules. Define the value in your project makefile and try again.</td>
+ *   </tr>
+ *   <tr>
+ *    <td>Error &quot;<b><tt>Makefile <i>{X}</i> option cannot be blank</tt></b>&quot; shown when compiling.</td>
+ *    <td>The specified Makefile value was configured in your project's makefile or on the command line, but was set to an empty value. For the nominated configuration
+ *        option, an empty value is not allowed. Define the nominated setting to a correct non-blank value and try again.</td>
+ *   </tr>
+ *   <tr>
+ *    <td>Error &quot;<b><tt>Makefile <i>{X}</i> option must be Y or N</tt></b>&quot; shown when compiling.</td>
+ *    <td>The specified Makefile value was configured in your project's makefile or on the command line, but was set to a value other than a Y (for "Yes") or "N" (for "No").
+ *        This configuration option is required to be one of the aforementioned boolean values, and other values are invalid. Set this option to either Y or N and try again.</td>
+ *   </tr>
+ *   <tr>
+ *    <td>Error &quot;<b><tt>Unknown input source file formats: <i>{X}</i></tt></b>&quot; shown when compiling.</td>
+ *    <td>The nominated source files, specified in your project's makefile in the <tt>SRC</tt> configuration option, has an extension that the LUFA build system does not
+ *        recognise. The file extensions are case sensitive, and must be one of the supported formats (<tt>*.c</tt>, <tt>*.cpp</tt> or <tt>*.S</tt>).</td>
+ *   </tr>
+ *   <tr>
+ *    <td>Error &quot;<b><tt>Cannot build with OBJDIR parameter set - one or more object file name is not unique</tt></b>&quot; shown when compiling.</td>
+ *    <td>When a project is built with a non-empty <tt>OBJDIR</tt> object directory name set, all input source files must have unique names, excluding extension and path.
+ *        This means that input files that are named identically and differ only by their path or extension are invalid when this mode is used.</td>
+ *   </tr>
+ *   <tr>
+ *    <td>Error &quot;<b><tt>Source file does not exist: <i>{X}</i></tt></b>&quot; shown when compiling.</td>
+ *    <td>The nominated input source file, specified in the user project's <tt>SRC</tt> parameter, could not be found. Ensure the source file exists and the absolute or
+ *        relative path given in the user project makefile is correct and try again.</td>
+ *   </tr>
+ *   <tr>
+ *    <td>Error &quot;<b><tt>Doxygen configuration file <i>{X}</i> does not exist</tt></b>&quot; shown when upgrading a Doxygen configuration file.</td>
+ *    <td>The nominated Doxygen configuration file, specified in the user project's <tt>DOXYGEN_CONF</tt> parameter, could not be found. Ensure the configuration file exists
+ *        and the absolute or relative path given in the user project makefile is correct and try again, or run the appropriate makefile target to generate a new configuration
+ *        file.</td>
+ *   </tr>
+ *   <tr>
+ *    <td>Error &quot;<b><tt>avr-gcc: error: unrecognized option '<i>{X}</i>'</tt></b>&quot; shown when compiling.</td>
+ *    <td>An unrecognised option was supplied to the compiler, usually in the <tt>C_FLAGS</tt>, <tt>CPP_FLAGS</tt>, <tt>ASM_FLAGS</tt> or <tt>CC_FLAGS</tt> configuration
+ *        options. The nominated compiler switch may be invalid, or unsupported by the version of AVR-GCC on the host system. Remove the unrecognised flag if invalid, or
+ *        upgrade to the latest AVR-GCC. If the option is a valid linker option, use the prefix "-Wl," to ensure it is passed to the linker correctly.</td>
+ *   </tr>
+ *   <tr>
+ *    <td>Error &quot;<b><tt>makefile:{X}: {Y}.mk: No such file or directory</tt></b>&quot; shown when make is invoked.</td>
+ *    <td>The path to the nominated makefile module was incorrect. This usually indicates that the makefile <tt>LUFA_PATH</tt> option is not set to a valid relative or
+ *        absolute path to the LUFA library core.</td>
+ *   </tr>
+ *   <tr>
+ *    <td>Error &quot;<b><tt>fatal error: LUFAConfig.h: No such file or directory</tt></b>&quot; shown when compiling.</td>
+ *    <td>The <tt>USE_LUFA_CONFIG_HEADER</tt> compile time option was set in the user project makefile, but the user supplied <tt>LUFAConfig.h</tt> header could not be
+ *        found. Ensure that the directory that contains this configuration file is correctly passed to the compiler via the -I switch in the makefile <tt>CC_FLAGS</tt>
+ *        parameter.</td>
+ *   </tr>
+ *   <tr>
+ *    <td>Error &quot;<b><tt>ld.exe: section .apitable_trampolines loaded at <i>{X}</i> overlaps section .text</tt></b>&quot; shown when compiling a bootloader.</td>
+ *    <td>The bootloader is compiling too large for the given <tt>FLASH_SIZE_KB</tt> and <tt>BOOT_SECTION_SIZE_KB</tt> parameters set in the bootloader makefile. This
+ *        usually indicates that these values are incorrect for the specified device the bootloader is targeting. If these values are correct, a newer version of the
+ *        compiler may need to be used to ensure that the bootloader is built within the section size constraints of the target device.</td>
+ *   </tr>
+ *   <tr>
+ *    <td>Error &quot;<b><tt>unknown MCU '<i>{X}</i>' specified</tt></b>&quot; shown when compiling.</td>
+ *    <td>The specified microcontroller device model name set in the user application's makefile as the <tt>MCU</tt> parameter is incorrect, or unsupported by the
+ *        version of the compiler being used. Make sure the model name is correct, or upgrade to the latest Atmel Toolchain to obtain newer device support.</td>
+ *   </tr>
+ *   <tr>
+ *    <td>Error &quot;<b><tt>undefined reference to `<i>{X}</i>'</tt></b>&quot; shown when compiling.</td>
+ *    <td>This is usually caused by a missing source file in the user application's <tt>SRC</tt> configuration parameter. If the indicated symbol is one from the LUFA
+ *        library, you may be missing a LUFA source makefile module (see \ref Page_BuildModule_SOURCES).</td>
+ *   </tr>
+ *  </table>
+ *
+ *  For troubleshooting other errors you encounter, please see \ref Sec_ProjectHelp.
+ */
diff --git a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/Docbook/mshelp/placeholder.txt b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/Docbook/mshelp/placeholder.txt
index 486e9a4270..a34fd58dfa 100644
--- a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/Docbook/mshelp/placeholder.txt
+++ b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/Docbook/mshelp/placeholder.txt
@@ -1 +1 @@
-Copy the Microsoft HV1 Docbook transform contents into this directory (i.e. with the XSLT files in the current folder). The HV1 transform proposal can be found at http://sourceforge.net/tracker/?func=detail&aid=3610290&group_id=21935&atid=373750 .

+Copy the Microsoft HV1 Docbook transform contents into this directory (i.e. with the XSLT files in the current folder). The HV1 transform proposal can be found at http://sourceforge.net/tracker/?func=detail&aid=3610290&group_id=21935&atid=373750 .
diff --git a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/Docbook/placeholder.txt b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/Docbook/placeholder.txt
index c017acfd75..dd69b7e0bd 100644
--- a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/Docbook/placeholder.txt
+++ b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/Docbook/placeholder.txt
@@ -1 +1 @@
-Copy the Docbook XSLT docbook-xsl-1.78.1 release contents into this directory (i.e. with the root Docbook files in the current folder). The Docbook releases can be found at http://sourceforge.net/projects/docbook/files/docbook-xsl/ .

+Copy the Docbook XSLT docbook-xsl-1.78.1 release contents into this directory (i.e. with the root Docbook files in the current folder). The Docbook releases can be found at http://sourceforge.net/projects/docbook/files/docbook-xsl/ .
diff --git a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/HV1/lufa_hv1_transform.xslt b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/HV1/lufa_hv1_transform.xslt
index ee8a38340d..8aa4a9413e 100644
--- a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/HV1/lufa_hv1_transform.xslt
+++ b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/HV1/lufa_hv1_transform.xslt
@@ -1,45 +1,45 @@
-<!--

-             LUFA Library

-     Copyright (C) Dean Camera, 2013.

-

-  dean [at] fourwalledcubicle [dot] com

-           www.lufa-lib.org

--->

-

-<!-- Docbook XML to Microsoft Help Viewer 1.0 transform file -->

-

-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

-

-	<xsl:import href="../Docbook/mshelp/docbook.xsl"/>

-

-	<xsl:output method="xml" indent="no"/>

-

-	<xsl:template match="emphasis[@role = 'keyword' or @role = 'keywordtype' or @role = 'keywordflow']">

-		<span class="hl-keyword" style="color: #0079C1">

-			<xsl:apply-templates/>

-		</span>

-	</xsl:template>

-

-	<xsl:template match="emphasis[@role = 'stringliteral' or @role = 'charliteral']">

-		<span class="hl-string" style="color: #800000">

-			<xsl:apply-templates/>

-		</span>

-	</xsl:template>

-

-	<xsl:template match="emphasis[@role = 'comment']">

-		<em class="hl-comment" style="color: #008000">

-			<xsl:apply-templates/>

-		</em>

-	</xsl:template>

-

-	<xsl:template match="emphasis[@role = 'preprocessor']">

-		<span class="hl-preprocessor" style="color: #A000A0">

-			<xsl:apply-templates/>

-		</span>

-	</xsl:template>

-

-	<xsl:template match="emphasis[@role = 'normal' and ancestor::programlisting]">

-		<xsl:apply-templates />

-	</xsl:template>

-

-</xsl:stylesheet>

+<!--
+             LUFA Library
+     Copyright (C) Dean Camera, 2013.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+-->
+
+<!-- Docbook XML to Microsoft Help Viewer 1.0 transform file -->
+
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
+
+	<xsl:import href="../Docbook/mshelp/docbook.xsl"/>
+
+	<xsl:output method="xml" indent="no"/>
+
+	<xsl:template match="emphasis[@role = 'keyword' or @role = 'keywordtype' or @role = 'keywordflow']">
+		<span class="hl-keyword" style="color: #0079C1">
+			<xsl:apply-templates/>
+		</span>
+	</xsl:template>
+
+	<xsl:template match="emphasis[@role = 'stringliteral' or @role = 'charliteral']">
+		<span class="hl-string" style="color: #800000">
+			<xsl:apply-templates/>
+		</span>
+	</xsl:template>
+
+	<xsl:template match="emphasis[@role = 'comment']">
+		<em class="hl-comment" style="color: #008000">
+			<xsl:apply-templates/>
+		</em>
+	</xsl:template>
+
+	<xsl:template match="emphasis[@role = 'preprocessor']">
+		<span class="hl-preprocessor" style="color: #A000A0">
+			<xsl:apply-templates/>
+		</span>
+	</xsl:template>
+
+	<xsl:template match="emphasis[@role = 'normal' and ancestor::programlisting]">
+		<xsl:apply-templates />
+	</xsl:template>
+
+</xsl:stylesheet>
diff --git a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/HV1/lufa_studio_help_styling.css b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/HV1/lufa_studio_help_styling.css
index 49eb7e9706..0b6ccbd8c1 100644
--- a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/HV1/lufa_studio_help_styling.css
+++ b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/HV1/lufa_studio_help_styling.css
@@ -1,53 +1,53 @@
-/*

-             LUFA Library

-     Copyright (C) Dean Camera, 2013.

-

-  dean [at] fourwalledcubicle [dot] com

-           www.lufa-lib.org

-*/

-

-.programlisting {

- 	display: block;

- 	margin-left: 15px;

- 	padding: 10px;

- 	background-color: #f4f4f4;

- 	border: 1px solid #aaaaaa;

- 	font-family: "Consolas", "Courier New", sans-serif;

- }

-

- code {

- 	background-color: #f4f4f4;

- 	font-family: "Consolas", "Courier New", sans-serif;

- }

-

-.note, .warning, .tip {

-	display: block;

- 	margin-left: 15px;

- 	padding-left: 10px;

- 	padding-bottom: 5px;

- 	background-color: #f4f4f4;

- 	border: 1px solid #aaaaaa;

-}

-

-table {

-	border: 1px solid #aaaaaa;

-	border-collapse: collapse;

-	margin-left: 15px;

-	font-size: 10pt;

-}

-

-table thead {

- 	background-color: #f4f4f4;

-}

-

-table thead th {

-	padding: 5px;

-}

-

-table tbody td {

-	padding: 5px;

-}

-

-ul {

-	padding-left: 20px;

-}

+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2013.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+.programlisting {
+ 	display: block;
+ 	margin-left: 15px;
+ 	padding: 10px;
+ 	background-color: #f4f4f4;
+ 	border: 1px solid #aaaaaa;
+ 	font-family: "Consolas", "Courier New", sans-serif;
+ }
+
+ code {
+ 	background-color: #f4f4f4;
+ 	font-family: "Consolas", "Courier New", sans-serif;
+ }
+
+.note, .warning, .tip {
+	display: block;
+ 	margin-left: 15px;
+ 	padding-left: 10px;
+ 	padding-bottom: 5px;
+ 	background-color: #f4f4f4;
+ 	border: 1px solid #aaaaaa;
+}
+
+table {
+	border: 1px solid #aaaaaa;
+	border-collapse: collapse;
+	margin-left: 15px;
+	font-size: 10pt;
+}
+
+table thead {
+ 	background-color: #f4f4f4;
+}
+
+table thead th {
+	padding: 5px;
+}
+
+table tbody td {
+	padding: 5px;
+}
+
+ul {
+	padding-left: 20px;
+}
diff --git a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/VSIX/[Content_Types].xml b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/VSIX/[Content_Types].xml
index 05ef8b6ba4..112d169942 100644
--- a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/VSIX/[Content_Types].xml
+++ b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/VSIX/[Content_Types].xml
@@ -1,13 +1,13 @@
-<Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">

-	<Default Extension="vsixmanifest" ContentType="text/xml"/>

-	<Default Extension="cache" ContentType="text/xml"/>

-	<Default Extension="png" ContentType="application/octet-stream"/>

-	<Default Extension="txt" ContentType="text/plain"/>

-	<Default Extension="xml" ContentType="text/xml"/>

-	<Default Extension="zip" ContentType="application/octet-stream"/>

-	<Default Extension="dll" ContentType="application/octet-stream" />

-	<Default Extension="pkgdef" ContentType="text/plain" />

-	<Default Extension="htm" ContentType="text/html" />

-	<Default Extension="msha" ContentType="text/html" />

-	<Default Extension="mshc" ContentType="application/octet-stream"/>

-</Types>

+<Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">
+	<Default Extension="vsixmanifest" ContentType="text/xml"/>
+	<Default Extension="cache" ContentType="text/xml"/>
+	<Default Extension="png" ContentType="application/octet-stream"/>
+	<Default Extension="txt" ContentType="text/plain"/>
+	<Default Extension="xml" ContentType="text/xml"/>
+	<Default Extension="zip" ContentType="application/octet-stream"/>
+	<Default Extension="dll" ContentType="application/octet-stream" />
+	<Default Extension="pkgdef" ContentType="text/plain" />
+	<Default Extension="htm" ContentType="text/html" />
+	<Default Extension="msha" ContentType="text/html" />
+	<Default Extension="mshc" ContentType="application/octet-stream"/>
+</Types>
diff --git a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/VSIX/asf-manifest.xml b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/VSIX/asf-manifest.xml
index 794fd689e1..bd969518a1 100644
--- a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/VSIX/asf-manifest.xml
+++ b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/VSIX/asf-manifest.xml
@@ -1,18 +1,18 @@
-<AsfContentProvider Version="1.0.0">

-	<Identifier Id="0e160d5c-e331-48d9-850b-e0387912171b">

-		<Org>FourWalledCubicle</Org>

-		<ShortName>LUFA</ShortName>

-		<Author>Dean Camera</Author>

-		<Description/>

-		<FollowFolderStructure>True</FollowFolderStructure>

-	</Identifier>

-	<AsfContent Type="zip" Path="contents.zip">

-		<Content>

-			<Version>0</Version>

-			<HelpURL/>

-			<Locator/>

-			<DbXMLPath>content.xml.cache</DbXMLPath>

-			<Description/>

-		</Content>

-	</AsfContent>

-</AsfContentProvider>

+<AsfContentProvider Version="1.0.0">
+	<Identifier Id="0e160d5c-e331-48d9-850b-e0387912171b">
+		<Org>FourWalledCubicle</Org>
+		<ShortName>LUFA</ShortName>
+		<Author>Dean Camera</Author>
+		<Description/>
+		<FollowFolderStructure>True</FollowFolderStructure>
+	</Identifier>
+	<AsfContent Type="zip" Path="contents.zip">
+		<Content>
+			<Version>0</Version>
+			<HelpURL/>
+			<Locator/>
+			<DbXMLPath>content.xml.cache</DbXMLPath>
+			<Description/>
+		</Content>
+	</AsfContent>
+</AsfContentProvider>
diff --git a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/VSIX/extension.vsixmanifest b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/VSIX/extension.vsixmanifest
index ea6edeb258..8475017443 100644
--- a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/VSIX/extension.vsixmanifest
+++ b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/VSIX/extension.vsixmanifest
@@ -1,33 +1,33 @@
-<?xml version="1.0" encoding="utf-8"?>

-

-<Vsix xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Version="1.0.0" xmlns="http://schemas.microsoft.com/developer/vsx-schema/2010">

-	<Identifier Id="FourWalledCubicle.LUFA.0e160d5c-e331-48d9-850b-e0387912171b">

-		<Name>LUFA Library</Name>

-		<Author>Dean Camera</Author>

-		<Version>0</Version>

-		<MoreInfoUrl>http://www.lufa-lib.org</MoreInfoUrl>

-		<Description xml:space="preserve">LUFA, the Lightweight USB Framework for AVRs.</Description>

-

-		<License>License.txt</License>

-		<Icon>LUFA_thumb.png</Icon>

-		<PreviewImage>LUFA.png</PreviewImage>

-

-		<SupportedProducts>

-			<IsolatedShell Version="6.1">AtmelStudio</IsolatedShell>

-			<IsolatedShell Version="6.2">AtmelStudio</IsolatedShell>

-		</SupportedProducts>

-

-		<SupportedFrameworkRuntimeEdition MinVersion="4.0" MaxVersion="4.5"/>

-		<Locale>1033</Locale>

-

-	    <AllUsers>false</AllUsers>

-	</Identifier>

-

-	<References/>

-

-	<Content>

-		<VsPackage>LUFA.pkgdef</VsPackage>

-	    <CustomExtension Type="MSHelp">helpcontentsetup.msha</CustomExtension>

-		<CustomExtension Type="asf-manifest">asf-manifest.xml</CustomExtension>

-	</Content>

-</Vsix>

+<?xml version="1.0" encoding="utf-8"?>
+
+<Vsix xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Version="1.0.0" xmlns="http://schemas.microsoft.com/developer/vsx-schema/2010">
+	<Identifier Id="FourWalledCubicle.LUFA.0e160d5c-e331-48d9-850b-e0387912171b">
+		<Name>LUFA Library</Name>
+		<Author>Dean Camera</Author>
+		<Version>0</Version>
+		<MoreInfoUrl>http://www.lufa-lib.org</MoreInfoUrl>
+		<Description xml:space="preserve">LUFA, the Lightweight USB Framework for AVRs.</Description>
+
+		<License>License.txt</License>
+		<Icon>LUFA_thumb.png</Icon>
+		<PreviewImage>LUFA.png</PreviewImage>
+
+		<SupportedProducts>
+			<IsolatedShell Version="6.1">AtmelStudio</IsolatedShell>
+			<IsolatedShell Version="6.2">AtmelStudio</IsolatedShell>
+		</SupportedProducts>
+
+		<SupportedFrameworkRuntimeEdition MinVersion="4.0" MaxVersion="4.5"/>
+		<Locale>1033</Locale>
+
+	    <AllUsers>false</AllUsers>
+	</Identifier>
+
+	<References/>
+
+	<Content>
+		<VsPackage>LUFA.pkgdef</VsPackage>
+	    <CustomExtension Type="MSHelp">helpcontentsetup.msha</CustomExtension>
+		<CustomExtension Type="asf-manifest">asf-manifest.xml</CustomExtension>
+	</Content>
+</Vsix>
diff --git a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/VSIX/generate_caches.py b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/VSIX/generate_caches.py
index c51cff400d..eb4b71efdf 100644
--- a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/VSIX/generate_caches.py
+++ b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/VSIX/generate_caches.py
@@ -1,38 +1,38 @@
-"""

-             LUFA Library

-     Copyright (C) Dean Camera, 2013.

-

-  dean [at] fourwalledcubicle [dot] com

-           www.lufa-lib.org

-"""

-

-import sys

-sys.path.append("ProjectGenerator")

-

-

-def show_message(message):

-    print("[Project Generator] %s" % message)

-    sys.stdout.flush()

-

-

-def main(lufa_root_path):

-    try:

-        from asf_avrstudio5_interface import PythonFacade

-    except ImportError:

-        print("Fatal Error: The ASF project generator is missing.")

-        return 1

-

-    p = PythonFacade(lufa_root_path)

-

-    show_message("Checking database sanity...")

-    p.check_extension_database_sanity(lufa_root_path)

-

-    show_message("Building cache files...")

-    p.generate_extension_cache_files(lufa_root_path)

-

-    show_message("Cache files created.")

-    return 0

-

-

-if __name__ == "__main__":

-    sys.exit(main(sys.argv[1]))

+"""
+             LUFA Library
+     Copyright (C) Dean Camera, 2013.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+"""
+
+import sys
+sys.path.append("ProjectGenerator")
+
+
+def show_message(message):
+    print("[Project Generator] %s" % message)
+    sys.stdout.flush()
+
+
+def main(lufa_root_path):
+    try:
+        from asf_avrstudio5_interface import PythonFacade
+    except ImportError:
+        print("Fatal Error: The ASF project generator is missing.")
+        return 1
+
+    p = PythonFacade(lufa_root_path)
+
+    show_message("Checking database sanity...")
+    p.check_extension_database_sanity(lufa_root_path)
+
+    show_message("Building cache files...")
+    p.generate_extension_cache_files(lufa_root_path)
+
+    show_message("Cache files created.")
+    return 0
+
+
+if __name__ == "__main__":
+    sys.exit(main(sys.argv[1]))
diff --git a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa.xml b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa.xml
index 28afdda587..86cfc0409d 100644
--- a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa.xml
+++ b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa.xml
@@ -1,96 +1,96 @@
-<!--

-             LUFA Library

-     Copyright (C) Dean Camera, 2013.

-

-  dean [at] fourwalledcubicle [dot] com

-           www.lufa-lib.org

--->

-

-<!-- Atmel Studio framework integration file -->

-

-<lufa>

-	<extension-container>

-		<extension uuid="0e160d5c-e331-48d9-850b-e0387912171b" org="FourWalledCubicle" shortname="LUFA" version="" fullname="Lightweight USB Framework for AVRs (LUFA)">

-			<author name="Dean Camera" website="http://www.lufa-lib.org/" email="dean@fourwalledcubicle.com"/>

-			<description>Lightweight USB Framework for AVRs (LUFA), a USB software stack/framework.</description>

-			<icon-image path="LUFA/DoxygenPages/Images/LUFA_thumb.png"/>

-			<preview-image path="LUFA/DoxygenPages/Images/LUFA.png"/>

-			<license caption="LUFA License" path="LUFA/License.txt"/>

-			<release-notes caption="LUFA Information" url="http://www.lufa-lib.org"/>

-			<online-help>

-				<index-page caption="LUFA Documentation" url="http://www.lufa-lib.org/documentation/"/>

-				<module-help-page scheme="append" baseurl="http://www.lufa-lib.org/documentation/"/>

-				<module-guide-page scheme="append" baseurl="http://www.lufa-lib.org/documentation/"/>

-			</online-help>

-			<dependencies/>

-		</extension>

-	</extension-container>

-

-	<asf>

-		<device-alias-map name="lufa_avr8">

-			<device-support value="at90usb82"/>

-			<device-support value="atmega8u2"/>

-			<device-support value="at90usb162"/>

-			<device-support value="atmega16u2"/>

-			<device-support value="atmega16u4"/>

-			<device-support value="atmega32u2"/>

-			<device-support value="atmega32u4"/>

-			<device-support value="at90usb646"/>

-			<device-support value="at90usb647"/>

-			<device-support value="at90usb1286"/>

-			<device-support value="at90usb1287"/>

-		</device-alias-map>

-

-		<device-alias-map name="lufa_xmega">

-			<device-support value="atxmega16a4u"/>

-			<device-support value="atxmega32a4u"/>

-			<device-support value="atxmega64a4u"/>

-			<device-support value="atxmega128a4u"/>

-			<device-support value="atxmega64a3u"/>

-			<device-support value="atxmega128a3u"/>

-			<device-support value="atxmega192a3u"/>

-			<device-support value="atxmega256a3u"/>

-			<device-support value="atxmega256a3bu"/>

-			<device-support value="atxmega128a1u"/>

-			<device-support value="atxmega64b3"/>

-			<device-support value="atxmega128b3"/>

-			<device-support value="atxmega64b1"/>

-			<device-support value="atxmega128b1"/>

-			<device-support value="atxmega64c3"/>

-			<device-support value="atxmega128c3"/>

-			<!-- <device-support value="atxmega192c3"/> Wait for ASFP-3339 merge and release before enabling -->

-			<device-support value="atxmega256c3"/>

-			<device-support value="atxmega384c3"/>

-			<device-support value="atxmega16c4"/>

-		</device-alias-map>

-

-		<device-alias-map name="lufa_uc3">

-			<device-support value="at32uc3a364"/>

-			<device-support value="at32uc3a364s"/>

-			<device-support value="at32uc3a464"/>

-			<device-support value="at32uc3a464s"/>

-			<device-support value="at32uc3b064"/>

-			<device-support value="at32uc3b164"/>

-			<device-support value="at32uc3a0128"/>

-			<device-support value="at32uc3a1128"/>

-			<device-support value="at32uc3a3128"/>

-			<device-support value="at32uc3a3128s"/>

-			<device-support value="at32uc3a4128"/>

-			<device-support value="at32uc3a4128s"/>

-			<device-support value="at32uc3b0128"/>

-			<device-support value="at32uc3b1128"/>

-			<device-support value="at32uc3a0256"/>

-			<device-support value="at32uc3a1256"/>

-			<device-support value="at32uc3a3256"/>

-			<device-support value="at32uc3a3256s"/>

-			<device-support value="at32uc3a4256"/>

-			<device-support value="at32uc3a4256s"/>

-			<device-support value="at32uc3b0256"/>

-			<device-support value="at32uc3b1256"/>

-			<device-support value="at32uc3a0512"/>

-			<device-support value="at32uc3a1512"/>

-			<device-support value="at32uc3b0512"/>

-			<device-support value="at32uc3b1512"/>

-		</device-alias-map>

-	</asf>

-</lufa>

+<!--
+             LUFA Library
+     Copyright (C) Dean Camera, 2013.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+-->
+
+<!-- Atmel Studio framework integration file -->
+
+<lufa>
+	<extension-container>
+		<extension uuid="0e160d5c-e331-48d9-850b-e0387912171b" org="FourWalledCubicle" shortname="LUFA" version="" fullname="Lightweight USB Framework for AVRs (LUFA)">
+			<author name="Dean Camera" website="http://www.lufa-lib.org/" email="dean@fourwalledcubicle.com"/>
+			<description>Lightweight USB Framework for AVRs (LUFA), a USB software stack/framework.</description>
+			<icon-image path="LUFA/DoxygenPages/Images/LUFA_thumb.png"/>
+			<preview-image path="LUFA/DoxygenPages/Images/LUFA.png"/>
+			<license caption="LUFA License" path="LUFA/License.txt"/>
+			<release-notes caption="LUFA Information" url="http://www.lufa-lib.org"/>
+			<online-help>
+				<index-page caption="LUFA Documentation" url="http://www.lufa-lib.org/documentation/"/>
+				<module-help-page scheme="append" baseurl="http://www.lufa-lib.org/documentation/"/>
+				<module-guide-page scheme="append" baseurl="http://www.lufa-lib.org/documentation/"/>
+			</online-help>
+			<dependencies/>
+		</extension>
+	</extension-container>
+
+	<asf>
+		<device-alias-map name="lufa_avr8">
+			<device-support value="at90usb82"/>
+			<device-support value="atmega8u2"/>
+			<device-support value="at90usb162"/>
+			<device-support value="atmega16u2"/>
+			<device-support value="atmega16u4"/>
+			<device-support value="atmega32u2"/>
+			<device-support value="atmega32u4"/>
+			<device-support value="at90usb646"/>
+			<device-support value="at90usb647"/>
+			<device-support value="at90usb1286"/>
+			<device-support value="at90usb1287"/>
+		</device-alias-map>
+
+		<device-alias-map name="lufa_xmega">
+			<device-support value="atxmega16a4u"/>
+			<device-support value="atxmega32a4u"/>
+			<device-support value="atxmega64a4u"/>
+			<device-support value="atxmega128a4u"/>
+			<device-support value="atxmega64a3u"/>
+			<device-support value="atxmega128a3u"/>
+			<device-support value="atxmega192a3u"/>
+			<device-support value="atxmega256a3u"/>
+			<device-support value="atxmega256a3bu"/>
+			<device-support value="atxmega128a1u"/>
+			<device-support value="atxmega64b3"/>
+			<device-support value="atxmega128b3"/>
+			<device-support value="atxmega64b1"/>
+			<device-support value="atxmega128b1"/>
+			<device-support value="atxmega64c3"/>
+			<device-support value="atxmega128c3"/>
+			<!-- <device-support value="atxmega192c3"/> Wait for ASFP-3339 merge and release before enabling -->
+			<device-support value="atxmega256c3"/>
+			<device-support value="atxmega384c3"/>
+			<device-support value="atxmega16c4"/>
+		</device-alias-map>
+
+		<device-alias-map name="lufa_uc3">
+			<device-support value="at32uc3a364"/>
+			<device-support value="at32uc3a364s"/>
+			<device-support value="at32uc3a464"/>
+			<device-support value="at32uc3a464s"/>
+			<device-support value="at32uc3b064"/>
+			<device-support value="at32uc3b164"/>
+			<device-support value="at32uc3a0128"/>
+			<device-support value="at32uc3a1128"/>
+			<device-support value="at32uc3a3128"/>
+			<device-support value="at32uc3a3128s"/>
+			<device-support value="at32uc3a4128"/>
+			<device-support value="at32uc3a4128s"/>
+			<device-support value="at32uc3b0128"/>
+			<device-support value="at32uc3b1128"/>
+			<device-support value="at32uc3a0256"/>
+			<device-support value="at32uc3a1256"/>
+			<device-support value="at32uc3a3256"/>
+			<device-support value="at32uc3a3256s"/>
+			<device-support value="at32uc3a4256"/>
+			<device-support value="at32uc3a4256s"/>
+			<device-support value="at32uc3b0256"/>
+			<device-support value="at32uc3b1256"/>
+			<device-support value="at32uc3a0512"/>
+			<device-support value="at32uc3a1512"/>
+			<device-support value="at32uc3b0512"/>
+			<device-support value="at32uc3b1512"/>
+		</device-alias-map>
+	</asf>
+</lufa>
diff --git a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_common.xml b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_common.xml
index 9e17b188be..c2ef7af4c7 100644
--- a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_common.xml
+++ b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_common.xml
@@ -1,34 +1,34 @@
-<!--

-             LUFA Library

-     Copyright (C) Dean Camera, 2013.

-

-  dean [at] fourwalledcubicle [dot] com

-           www.lufa-lib.org

--->

-

-<!-- Atmel Studio framework integration file -->

-

-<lufa>

-	<asf>

-		<module type="service" id="lufa.common" caption="LUFA Common Infrastructure">

-			<device-support-alias value="lufa_avr8"/>

-			<device-support-alias value="lufa_xmega"/>

-			<device-support-alias value="lufa_uc3"/>

-

-			<info type="gui-flag" value="hidden"/>

-			<build type="doxygen-entry-point" value="Group_Common"/>

-

-			<build type="include-path" value=".."/>

-			<build type="header-file" subtype="api" value="Version.h"/>

-			<build type="distribute" subtype="license" value="License.txt"/>

-

-			<build type="header-file" subtype="api" value="Common/Common.h"/>

-			<build type="header-file" value="Common/Architectures.h"/>

-			<build type="header-file" value="Common/ArchitectureSpecific.h"/>

-			<build type="header-file" value="Common/Attributes.h"/>

-			<build type="header-file" value="Common/BoardTypes.h"/>

-			<build type="header-file" value="Common/CompilerSpecific.h"/>

-			<build type="header-file" value="Common/Endianness.h"/>

-		</module>

-	</asf>

-</lufa>

+<!--
+             LUFA Library
+     Copyright (C) Dean Camera, 2013.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+-->
+
+<!-- Atmel Studio framework integration file -->
+
+<lufa>
+	<asf>
+		<module type="service" id="lufa.common" caption="LUFA Common Infrastructure">
+			<device-support-alias value="lufa_avr8"/>
+			<device-support-alias value="lufa_xmega"/>
+			<device-support-alias value="lufa_uc3"/>
+
+			<info type="gui-flag" value="hidden"/>
+			<build type="doxygen-entry-point" value="Group_Common"/>
+
+			<build type="include-path" value=".."/>
+			<build type="header-file" subtype="api" value="Version.h"/>
+			<build type="distribute" subtype="license" value="License.txt"/>
+
+			<build type="header-file" subtype="api" value="Common/Common.h"/>
+			<build type="header-file" value="Common/Architectures.h"/>
+			<build type="header-file" value="Common/ArchitectureSpecific.h"/>
+			<build type="header-file" value="Common/Attributes.h"/>
+			<build type="header-file" value="Common/BoardTypes.h"/>
+			<build type="header-file" value="Common/CompilerSpecific.h"/>
+			<build type="header-file" value="Common/Endianness.h"/>
+		</module>
+	</asf>
+</lufa>
diff --git a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_board.xml b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_board.xml
index 3677d20036..e150aa6458 100644
--- a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_board.xml
+++ b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_board.xml
@@ -1,114 +1,114 @@
-<!--

-             LUFA Library

-     Copyright (C) Dean Camera, 2013.

-

-  dean [at] fourwalledcubicle [dot] com

-           www.lufa-lib.org

--->

-

-<!-- Atmel Studio framework integration file -->

-

-<lufa>

-	<asf>

-		<board id="lufa.boards.dummy.avr8" vendor="LUFA" caption="AVR8 Architecture">

-			<device-support value="mega"/>

-

-			<require idref="lufa.drivers.board"/>

-			<require idref="lufa.drivers.board.info"/>

-		</board>

-

-		<board id="lufa.boards.dummy.xmega" vendor="LUFA" caption="XMEGA Architecture">

-			<device-support value="xmega"/>

-

-			<require idref="lufa.drivers.board"/>

-			<require idref="lufa.drivers.board.info"/>

-		</board>

-

-		<board id="lufa.boards.dummy.uc3" vendor="LUFA" caption="UC3 Architecture">

-			<device-support value="uc3"/>

-

-			<require idref="lufa.drivers.board"/>

-			<require idref="lufa.drivers.board.info"/>

-		</board>

-

-		<module type="driver" id="lufa.drivers.board.info" caption="LUFA Board Hardware Information Driver">

-			<device-support-alias value="lufa_avr8"/>

-			<device-support-alias value="lufa_xmega"/>

-			<device-support-alias value="lufa_uc3"/>

-

-			<build type="doxygen-entry-point" value="Group_BoardInfo"/>

-

-			<require idref="lufa.common"/>

-

-			<build type="include-path" value=".."/>

-			<build type="header-file"  subtype="api" value="Drivers/Board/Board.h"/>

-		</module>

-

-		<module type="driver" id="lufa.drivers.board.leds" caption="LUFA Board LED Driver">

-			<device-support-alias value="lufa_avr8"/>

-			<device-support-alias value="lufa_xmega"/>

-			<device-support-alias value="lufa_uc3"/>

-

-			<build type="doxygen-entry-point" value="Group_LEDs"/>

-

-			<require idref="lufa.common"/>

-

-			<build type="include-path" value=".."/>

-			<build type="header-file"  subtype="api" value="Drivers/Board/LEDs.h"/>

-		</module>

-

-		<module type="driver" id="lufa.drivers.board.buttons" caption="LUFA Board Buttons Driver">

-			<device-support-alias value="lufa_avr8"/>

-			<device-support-alias value="lufa_xmega"/>

-			<device-support-alias value="lufa_uc3"/>

-

-			<build type="doxygen-entry-point" value="Group_Buttons"/>

-

-			<require idref="lufa.common"/>

-

-			<build type="include-path" value=".."/>

-			<build type="header-file"  subtype="api" value="Drivers/Board/Buttons.h"/>

-		</module>

-

-		<module type="driver" id="lufa.drivers.board.dataflash" caption="LUFA Board Dataflash Driver">

-			<device-support-alias value="lufa_avr8"/>

-			<device-support-alias value="lufa_xmega"/>

-			<device-support-alias value="lufa_uc3"/>

-

-			<build type="doxygen-entry-point" value="Group_Dataflash"/>

-

-			<require idref="lufa.common"/>

-

-			<build type="include-path" value=".."/>

-			<build type="header-file"  subtype="api" value="Drivers/Board/Dataflash.h"/>

-		</module>

-

-		<module type="driver" id="lufa.drivers.board.joystick" caption="LUFA Board Joystick Driver">

-			<device-support-alias value="lufa_avr8"/>

-			<device-support-alias value="lufa_xmega"/>

-			<device-support-alias value="lufa_uc3"/>

-

-			<build type="doxygen-entry-point" value="Group_Joystick"/>

-

-			<require idref="lufa.common"/>

-

-			<build type="include-path" value=".."/>

-			<build type="header-file"  subtype="api" value="Drivers/Board/Joystick.h"/>

-		</module>

-

-		<module type="driver" id="lufa.drivers.board.temperature" caption="LUFA Board Temperature Sensor Driver">

-			<device-support-alias value="lufa_avr8"/>

-			<device-support-alias value="lufa_xmega"/>

-			<device-support-alias value="lufa_uc3"/>

-

-			<build type="doxygen-entry-point" value="Group_Temperature"/>

-

-			<require idref="lufa.common"/>

-			<require idref="lufa.drivers.peripheral.adc"/>

-

-			<build type="c-source"     value="Drivers/Board/Temperature.c"/>

-			<build type="include-path" value=".."/>

-			<build type="header-file"  subtype="api" value="Drivers/Board/Temperature.h"/>

-		</module>

-	</asf>

-</lufa>

+<!--
+             LUFA Library
+     Copyright (C) Dean Camera, 2013.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+-->
+
+<!-- Atmel Studio framework integration file -->
+
+<lufa>
+	<asf>
+		<board id="lufa.boards.dummy.avr8" vendor="LUFA" caption="AVR8 Architecture">
+			<device-support value="mega"/>
+
+			<require idref="lufa.drivers.board"/>
+			<require idref="lufa.drivers.board.info"/>
+		</board>
+
+		<board id="lufa.boards.dummy.xmega" vendor="LUFA" caption="XMEGA Architecture">
+			<device-support value="xmega"/>
+
+			<require idref="lufa.drivers.board"/>
+			<require idref="lufa.drivers.board.info"/>
+		</board>
+
+		<board id="lufa.boards.dummy.uc3" vendor="LUFA" caption="UC3 Architecture">
+			<device-support value="uc3"/>
+
+			<require idref="lufa.drivers.board"/>
+			<require idref="lufa.drivers.board.info"/>
+		</board>
+
+		<module type="driver" id="lufa.drivers.board.info" caption="LUFA Board Hardware Information Driver">
+			<device-support-alias value="lufa_avr8"/>
+			<device-support-alias value="lufa_xmega"/>
+			<device-support-alias value="lufa_uc3"/>
+
+			<build type="doxygen-entry-point" value="Group_BoardInfo"/>
+
+			<require idref="lufa.common"/>
+
+			<build type="include-path" value=".."/>
+			<build type="header-file"  subtype="api" value="Drivers/Board/Board.h"/>
+		</module>
+
+		<module type="driver" id="lufa.drivers.board.leds" caption="LUFA Board LED Driver">
+			<device-support-alias value="lufa_avr8"/>
+			<device-support-alias value="lufa_xmega"/>
+			<device-support-alias value="lufa_uc3"/>
+
+			<build type="doxygen-entry-point" value="Group_LEDs"/>
+
+			<require idref="lufa.common"/>
+
+			<build type="include-path" value=".."/>
+			<build type="header-file"  subtype="api" value="Drivers/Board/LEDs.h"/>
+		</module>
+
+		<module type="driver" id="lufa.drivers.board.buttons" caption="LUFA Board Buttons Driver">
+			<device-support-alias value="lufa_avr8"/>
+			<device-support-alias value="lufa_xmega"/>
+			<device-support-alias value="lufa_uc3"/>
+
+			<build type="doxygen-entry-point" value="Group_Buttons"/>
+
+			<require idref="lufa.common"/>
+
+			<build type="include-path" value=".."/>
+			<build type="header-file"  subtype="api" value="Drivers/Board/Buttons.h"/>
+		</module>
+
+		<module type="driver" id="lufa.drivers.board.dataflash" caption="LUFA Board Dataflash Driver">
+			<device-support-alias value="lufa_avr8"/>
+			<device-support-alias value="lufa_xmega"/>
+			<device-support-alias value="lufa_uc3"/>
+
+			<build type="doxygen-entry-point" value="Group_Dataflash"/>
+
+			<require idref="lufa.common"/>
+
+			<build type="include-path" value=".."/>
+			<build type="header-file"  subtype="api" value="Drivers/Board/Dataflash.h"/>
+		</module>
+
+		<module type="driver" id="lufa.drivers.board.joystick" caption="LUFA Board Joystick Driver">
+			<device-support-alias value="lufa_avr8"/>
+			<device-support-alias value="lufa_xmega"/>
+			<device-support-alias value="lufa_uc3"/>
+
+			<build type="doxygen-entry-point" value="Group_Joystick"/>
+
+			<require idref="lufa.common"/>
+
+			<build type="include-path" value=".."/>
+			<build type="header-file"  subtype="api" value="Drivers/Board/Joystick.h"/>
+		</module>
+
+		<module type="driver" id="lufa.drivers.board.temperature" caption="LUFA Board Temperature Sensor Driver">
+			<device-support-alias value="lufa_avr8"/>
+			<device-support-alias value="lufa_xmega"/>
+			<device-support-alias value="lufa_uc3"/>
+
+			<build type="doxygen-entry-point" value="Group_Temperature"/>
+
+			<require idref="lufa.common"/>
+			<require idref="lufa.drivers.peripheral.adc"/>
+
+			<build type="c-source"     value="Drivers/Board/Temperature.c"/>
+			<build type="include-path" value=".."/>
+			<build type="header-file"  subtype="api" value="Drivers/Board/Temperature.h"/>
+		</module>
+	</asf>
+</lufa>
diff --git a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_board_names.xml b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_board_names.xml
index 4b099920b7..ab7e03e4e9 100644
--- a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_board_names.xml
+++ b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_board_names.xml
@@ -1,853 +1,853 @@
-<!--

-             LUFA Library

-     Copyright (C) Dean Camera, 2013.

-

-  dean [at] fourwalledcubicle [dot] com

-           www.lufa-lib.org

--->

-

-<!-- Atmel Studio framework integration file -->

-

-<lufa>

-	<asf>

-		<select-by-config id="lufa.drivers.board" name="lufa.drivers.board.name" default="none" caption="LUFA Board Support">

-			<info type="description" value="summary">

-				Board hardware (LEDs, Buttons, etc.) drivers for the preconfigured LUFA boards. Note that only the boards

-				compatible with the currently selected device will be shown.

-

-				To disable all hardware drivers silently, use NONE. To supply customer drivers, use USER (see manual).

-			</info>

-

-			<module type="driver" id="lufa.drivers.board#none" caption="Board Support - None">

-				<device-support value="avr"/>

-				<build type="define" name="BOARD" value="BOARD_NONE"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#user" caption="Board Support - User Supplied">

-				<device-support value="avr"/>

-				<build type="define" name="BOARD" value="BOARD_USER"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#adafruit_u4" caption="Board Support - ADAFRUITU4">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_ADAFRUITU4"/>

-

-				<device-support value="atmega32u4"/>

-				<build type="define" name="BOARD" value="BOARD_ADAFRUITU4"/>

-

-				<require idref="lufa.drivers.board.leds"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/ADAFRUITU4/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/ADAFRUITU4/LEDs.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#atavrusbrf01" caption="Board Support - ATAVRUSBRF01">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_ATAVRUSBRF01"/>

-

-				<device-support value="at90usb1287"/>

-				<build type="define" name="BOARD" value="BOARD_ATAVRUSBRF01"/>

-

-				<require idref="lufa.drivers.board.buttons"/>

-				<require idref="lufa.drivers.board.leds"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/ATAVRUSBRF01/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/ATAVRUSBRF01/Buttons.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/ATAVRUSBRF01/LEDs.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#benito" caption="Board Support - BENITO">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_BENITO"/>

-

-				<device-support value="at90usb162"/>

-				<build type="define" name="BOARD" value="BOARD_BENITO"/>

-

-				<require idref="lufa.drivers.board.buttons"/>

-				<require idref="lufa.drivers.board.leds"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/BENITO/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/BENITO/Buttons.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/BENITO/LEDs.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#big_multio" caption="Board Support - BIGMULTIO">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_BIGMULTIO"/>

-

-				<device-support value="atmega32u4"/>

-				<build type="define" name="BOARD" value="BOARD_BIGMULTIO"/>

-

-				<require idref="lufa.drivers.board.leds"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/BIGMULTIO/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/BIGMULTIO/LEDs.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#blackcat" caption="Board Support - BLACKCAT">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_BLACKCAT"/>

-

-				<device-support value="at90usb162"/>

-				<build type="define" name="BOARD" value="BOARD_BLACKCAT"/>

-

-				<require idref="lufa.drivers.board.leds"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/BLACKCAT/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/BLACKCAT/LEDs.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#bui" caption="Board Support - BUI">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_BUI"/>

-

-				<device-support value="at90usb646"/>

-				<build type="define" name="BOARD" value="BOARD_BUI"/>

-

-				<require idref="lufa.drivers.board.leds"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/BUI/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/BUI/LEDs.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#bumbleb" caption="Board Support - BUMBLEB">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_BUMBLEB"/>

-

-				<device-support value="at90usb162"/>

-				<build type="define" name="BOARD" value="BOARD_BUMBLEB"/>

-

-				<require idref="lufa.drivers.board.buttons"/>

-				<require idref="lufa.drivers.board.leds"/>

-				<require idref="lufa.drivers.board.joystick"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/BUMBLEB/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/BUMBLEB/Buttons.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/BUMBLEB/Joystick.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/BUMBLEB/LEDs.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#culv3" caption="Board Support - CULV3">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_CULV3"/>

-

-				<device-support value="atmega32u4"/>

-				<build type="define" name="BOARD" value="BOARD_CULV3"/>

-

-				<require idref="lufa.drivers.board.buttons"/>

-				<require idref="lufa.drivers.board.leds"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/CULV3/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/CULV3/Buttons.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/CULV3/LEDs.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#duce" caption="Board Support - DUCE">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_DUCE"/>

-

-				<device-support value="atmega32u2"/>

-				<build type="define" name="BOARD" value="BOARD_DUCE"/>

-

-				<require idref="lufa.drivers.board.leds"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/DUCE/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/DUCE/LEDs.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#evk527" caption="Board Support - EVK527">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_EVK527"/>

-

-				<device-support value="atmega32u4"/>

-				<build type="define" name="BOARD" value="BOARD_EVK527"/>

-

-				<require idref="lufa.drivers.misc.at45db321c"/>

-				<require idref="lufa.drivers.peripheral.spi"/>

-				<require idref="lufa.drivers.board.buttons"/>

-				<require idref="lufa.drivers.board.dataflash"/>

-				<require idref="lufa.drivers.board.joystick"/>

-				<require idref="lufa.drivers.board.leds"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/EVK527/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/EVK527/Buttons.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/EVK527/Dataflash.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/EVK527/Joystick.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/EVK527/LEDs.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#jm_db_u2" caption="Board Support - JMDBU2">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_JMDBU2"/>

-

-				<device-support value="atmega32u2"/>

-				<build type="define" name="BOARD" value="BOARD_JMDBU2"/>

-

-				<require idref="lufa.drivers.board.buttons"/>

-				<require idref="lufa.drivers.board.leds"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/JMDBU2/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/JMDBU2/Buttons.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/JMDBU2/LEDs.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#leonardo" caption="Board Support - LEONARDO">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_LEONARDO"/>

-

-				<device-support value="atmega32u4"/>

-				<build type="define" name="BOARD" value="BOARD_LEONARDO"/>

-

-				<require idref="lufa.drivers.board.leds"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/LEONARDO/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/LEONARDO/LEDs.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#maximus" caption="Board Support - MAXIMUS">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_MAXIMUS"/>

-

-				<device-support value="at90usb162"/>

-				<build type="define" name="BOARD" value="BOARD_MAXIMUS"/>

-

-				<require idref="lufa.drivers.board.leds"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/MAXIMUS/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/MAXIMUS/LEDs.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#micropendous_32u2" caption="Board Support - MICROPENDOUS_32U2">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_MICROPENDOUS_32U2"/>

-

-				<device-support value="atmega32u2"/>

-				<build type="define" name="BOARD" value="BOARD_MICROPENDOUS_32U2"/>

-

-				<require idref="lufa.drivers.board.leds"/>

-				<require idref="lufa.drivers.board.buttons"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/LEDs.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Buttons.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#micropendous_a" caption="Board Support - MICROPENDOUS_A">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_MICROPENDOUS_A"/>

-

-				<device-support value="at90usb1287"/>

-				<build type="define" name="BOARD" value="BOARD_MICROPENDOUS_A"/>

-

-				<require idref="lufa.drivers.board.buttons"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Buttons.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#micropendous_1" caption="Board Support - MICROPENDOUS_1">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_MICROPENDOUS_1"/>

-

-				<device-support value="at90usb162"/>

-				<build type="define" name="BOARD" value="BOARD_MICROPENDOUS_1"/>

-

-				<require idref="lufa.drivers.board.buttons"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Buttons.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#micropendous_2" caption="Board Support - MICROPENDOUS_2">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_MICROPENDOUS_2"/>

-

-				<device-support value="atmega32u4"/>

-				<build type="define" name="BOARD" value="BOARD_MICROPENDOUS_2"/>

-

-				<require idref="lufa.drivers.board.buttons"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Buttons.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#micropendous_3" caption="Board Support - MICROPENDOUS_3">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_MICROPENDOUS_3"/>

-

-				<device-support value="at90usb1287"/>

-				<build type="define" name="BOARD" value="BOARD_MICROPENDOUS_3"/>

-

-				<require idref="lufa.drivers.board.buttons"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Buttons.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#micropendous_4" caption="Board Support - MICROPENDOUS_4">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_MICROPENDOUS_4"/>

-

-				<device-support value="at90usb1287"/>

-				<build type="define" name="BOARD" value="BOARD_MICROPENDOUS_4"/>

-

-				<require idref="lufa.drivers.board.buttons"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Buttons.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#micropendous_dip" caption="Board Support - MICROPENDOUS_DIP">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_MICROPENDOUS_DIP"/>

-

-				<device-support value="at90usb1287"/>

-				<build type="define" name="BOARD" value="BOARD_MICROPENDOUS_DIP"/>

-

-				<require idref="lufa.drivers.board.buttons"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Buttons.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#micropendous_rev1" caption="Board Support - MICROPENDOUS_REV1">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_MICROPENDOUS_REV1"/>

-

-				<device-support value="at90usb1287"/>

-				<build type="define" name="BOARD" value="BOARD_MICROPENDOUS_REV1"/>

-

-				<require idref="lufa.drivers.board.leds"/>

-				<require idref="lufa.drivers.board.buttons"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/LEDs.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Buttons.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#micropendous_rev2" caption="Board Support - MICROPENDOUS_REV2">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_MICROPENDOUS_REV2"/>

-

-				<device-support value="at90usb1287"/>

-				<build type="define" name="BOARD" value="BOARD_MICROPENDOUS_REV2"/>

-

-				<require idref="lufa.drivers.board.leds"/>

-				<require idref="lufa.drivers.board.buttons"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/LEDs.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Buttons.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#microsin_162" caption="Board Support - MICROSIN162">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_MICROSIN162"/>

-

-				<device-support value="atmega162"/>

-				<build type="define" name="BOARD" value="BOARD_MICROSIN162"/>

-

-				<require idref="lufa.drivers.board.leds"/>

-				<require idref="lufa.drivers.board.buttons"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/MICROSIN162/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/MICROSIN162/LEDs.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/MICROSIN162/Buttons.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#minimus" caption="Board Support - MINIMUS">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_MINIMUS"/>

-

-				<device-support value="atmega32u2"/>

-				<build type="define" name="BOARD" value="BOARD_MINIMUS"/>

-

-				<require idref="lufa.drivers.board.leds"/>

-				<require idref="lufa.drivers.board.buttons"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/MINIMUS/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/MINIMUS/LEDs.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/MINIMUS/Buttons.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#multio" caption="Board Support - MULTIO">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_MULTIO"/>

-

-				<device-support value="at90usb162"/>

-				<build type="define" name="BOARD" value="BOARD_MULTIO"/>

-

-				<require idref="lufa.drivers.board.leds"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/MULTIO/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/MULTIO/LEDs.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#olimex_162" caption="Board Support - OLIMEX162">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_OLIMEX162"/>

-

-				<device-support value="at90usb162"/>

-				<build type="define" name="BOARD" value="BOARD_OLIMEX162"/>

-

-				<require idref="lufa.drivers.board.leds"/>

-				<require idref="lufa.drivers.board.buttons"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/OLIMEX162/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/OLIMEX162/LEDs.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/OLIMEX162/Buttons.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#olimex_32u4" caption="Board Support - OLIMEX32U4">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_OLIMEX32U4"/>

-

-				<device-support value="atmega32u4"/>

-				<build type="define" name="BOARD" value="BOARD_OLIMEX32U4"/>

-

-				<require idref="lufa.drivers.board.leds"/>

-				<require idref="lufa.drivers.board.buttons"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/OLIMEX32U4/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/OLIMEX32U4/LEDs.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/OLIMEX32U4/Buttons.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#olimex_isp_mkii" caption="Board Support - OLIMEXISPMK2">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_OLIMEXISPMK2"/>

-

-				<device-support value="at90usb162"/>

-				<build type="define" name="BOARD" value="BOARD_OLIMEXISPMK2"/>

-

-				<require idref="lufa.drivers.board.leds"/>

-				<require idref="lufa.drivers.board.buttons"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/OLIMEXISPMK2/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/OLIMEXISPMK2/LEDs.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/OLIMEXISPMK2/Buttons.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#olimex_t32u4" caption="Board Support - OLIMEX_T32U4">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_OLIMEXT32U4"/>

-

-				<device-support value="atmega32u4"/>

-				<build type="define" name="BOARD" value="BOARD_OLIMEXT32U4"/>

-

-				<require idref="lufa.drivers.board.leds"/>

-				<require idref="lufa.drivers.board.buttons"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/OLIMEXT32U4/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/OLIMEXT32U4/LEDs.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/OLIMEXT32U4/Buttons.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#rzusbstick" caption="Board Support - RZUSBSTICK">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_RZUSBSTICK"/>

-

-				<device-support value="at90usb1287"/>

-				<build type="define" name="BOARD" value="BOARD_RZUSBSTICK"/>

-

-				<require idref="lufa.drivers.board.leds"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/RZUSBSTICK/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/RZUSBSTICK/LEDs.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#sparkfun_8u2" caption="Board Support - SPARKFUN8U2">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_SPARKFUN8U2"/>

-

-				<device-support value="atmega8u2"/>

-				<build type="define" name="BOARD" value="BOARD_SPARKFUN8U2"/>

-

-				<require idref="lufa.drivers.board.leds"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/SPARKFUN8U2/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/SPARKFUN8U2/LEDs.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#stk525" caption="Board Support - STK525">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_STK525"/>

-

-				<device-support value="at90usb1287"/>

-				<device-support value="at90usb1286"/>

-				<device-support value="at90usb647"/>

-				<device-support value="at90usb646"/>

-				<build type="define" name="BOARD" value="BOARD_STK525"/>

-

-				<require idref="lufa.drivers.misc.at45db321c"/>

-				<require idref="lufa.drivers.peripheral.spi"/>

-				<require idref="lufa.drivers.board.buttons"/>

-				<require idref="lufa.drivers.board.dataflash"/>

-				<require idref="lufa.drivers.board.joystick"/>

-				<require idref="lufa.drivers.board.leds"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/STK525/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/STK525/Buttons.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/STK525/Dataflash.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/STK525/Joystick.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/STK525/LEDs.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#stk526" caption="Board Support - STK526">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_STK526"/>

-

-				<device-support value="at90usb162"/>

-				<device-support value="at90usb82"/>

-				<device-support value="atmega32u2"/>

-				<device-support value="atmega16u2"/>

-				<device-support value="atmega8u2"/>

-				<build type="define" name="BOARD" value="BOARD_STK526"/>

-

-				<require idref="lufa.drivers.misc.at45db642d"/>

-				<require idref="lufa.drivers.peripheral.spi"/>

-				<require idref="lufa.drivers.board.buttons"/>

-				<require idref="lufa.drivers.board.dataflash"/>

-				<require idref="lufa.drivers.board.joystick"/>

-				<require idref="lufa.drivers.board.leds"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/STK526/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/STK526/Buttons.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/STK526/Dataflash.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/STK526/Joystick.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/STK526/LEDs.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#teensy" caption="Board Support - TEENSY">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_TEENSY"/>

-

-				<device-support value="at90usb162"/>

-				<build type="define" name="BOARD" value="BOARD_TEENSY"/>

-

-				<require idref="lufa.drivers.board.leds"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/TEENSY/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/TEENSY/LEDs.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#teensy2" caption="Board Support - TEENSY2">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_TEENSY2"/>

-

-				<device-support value="at90usb646"/>

-				<build type="define" name="BOARD" value="BOARD_TEENSY2"/>

-

-				<require idref="lufa.drivers.board.leds"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/TEENSY/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/TEENSY/LEDs.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#tul" caption="Board Support - TUL">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_TUL"/>

-

-				<device-support value="atmega32u4"/>

-				<build type="define" name="BOARD" value="BOARD_TUL"/>

-

-				<require idref="lufa.drivers.board.buttons"/>

-				<require idref="lufa.drivers.board.leds"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/TUL/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/TUL/Buttons.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/TUL/LEDs.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#udip" caption="Board Support - UDIP">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_UDIP"/>

-

-				<device-support value="atmega32u2"/>

-				<build type="define" name="BOARD" value="BOARD_UDIP"/>

-

-				<require idref="lufa.drivers.board.buttons"/>

-				<require idref="lufa.drivers.board.leds"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/UDIP/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/UDIP/Buttons.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/UDIP/LEDs.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#uno" caption="Board Support - UNO">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_UNO"/>

-

-				<device-support value="atmega8u2"/>

-				<device-support value="atmega16u2"/>

-				<build type="define" name="BOARD" value="BOARD_UNO"/>

-

-				<require idref="lufa.drivers.board.leds"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/UNO/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/UNO/LEDs.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#usb2ax" caption="Board Support - USB2AX">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_USB2AX"/>

-

-				<device-support value="atmega32u2"/>

-				<build type="define" name="BOARD" value="BOARD_USB2AX"/>

-

-				<require idref="lufa.drivers.board.buttons"/>

-				<require idref="lufa.drivers.board.leds"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/USB2AX/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/USB2AX/Buttons.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/USB2AX/LEDs.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#usb2ax_v3" caption="Board Support - USB2AX_V3">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_USB2AX_V3"/>

-

-				<device-support value="atmega32u2"/>

-				<build type="define" name="BOARD" value="BOARD_USB2AX_V3"/>

-

-				<require idref="lufa.drivers.board.buttons"/>

-				<require idref="lufa.drivers.board.leds"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/USB2AX/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/USB2AX/Buttons.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/USB2AX/LEDs.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#usb2ax_v3_1" caption="Board Support - USB2AX_V31">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_USB2AX_V31"/>

-

-				<device-support value="atmega32u2"/>

-				<build type="define" name="BOARD" value="BOARD_USB2AX_V31"/>

-

-				<require idref="lufa.drivers.board.buttons"/>

-				<require idref="lufa.drivers.board.leds"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/USB2AX/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/USB2AX/Buttons.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/USB2AX/LEDs.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#usbfoo" caption="Board Support - USBFOO">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_USBFOO"/>

-

-				<device-support value="atmega162"/>

-				<build type="define" name="BOARD" value="BOARD_USBFOO"/>

-

-				<require idref="lufa.drivers.board.buttons"/>

-				<require idref="lufa.drivers.board.leds"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/USBFOO/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/USBFOO/Buttons.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/USBFOO/LEDs.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#usbkey" caption="Board Support - USBKEY">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_USBKEY"/>

-

-				<device-support value="at90usb1287"/>

-				<build type="define" name="BOARD" value="BOARD_USBKEY"/>

-

-				<require idref="lufa.drivers.misc.at45db642d"/>

-				<require idref="lufa.drivers.peripheral.spi"/>

-

-				<require idref="lufa.drivers.board.buttons"/>

-				<require idref="lufa.drivers.board.dataflash"/>

-				<require idref="lufa.drivers.board.joystick"/>

-				<require idref="lufa.drivers.board.leds"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/USBKEY/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/USBKEY/Buttons.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/USBKEY/Dataflash.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/USBKEY/Joystick.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/USBKEY/LEDs.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#usbtiny_mkii" caption="Board Support - USBTINYMKII">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_USBTINYMKII"/>

-

-				<device-support value="at90usb162"/>

-				<build type="define" name="BOARD" value="BOARD_USBTINYMKII"/>

-

-				<require idref="lufa.drivers.board.buttons"/>

-				<require idref="lufa.drivers.board.leds"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/USBTINYMKII/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/USBTINYMKII/Buttons.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/USBTINYMKII/LEDs.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#xplain_rev1" caption="Board Support - XPLAIN (HW Rev 1)">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_XPLAIN_REV1"/>

-

-				<device-support value="at90usb1287"/>

-

-				<require idref="lufa.drivers.misc.at45db642d"/>

-				<require idref="lufa.drivers.peripheral.spi"/>

-				<require idref="lufa.drivers.board.dataflash"/>

-				<require idref="lufa.drivers.board.leds"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/XPLAIN/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/XPLAIN/Dataflash.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/XPLAIN/LEDs.h"/>

-

-				<build type="define" name="BOARD" value="BOARD_XPLAIN_REV1"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#xplain" caption="Board Support - XPLAIN (HW Rev 2+)">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_XPLAIN"/>

-

-				<device-support value="at90usb1287"/>

-

-				<require idref="lufa.drivers.misc.at45db642d"/>

-				<require idref="lufa.drivers.peripheral.spi"/>

-				<require idref="lufa.drivers.board.dataflash"/>

-				<require idref="lufa.drivers.board.leds"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/XPLAIN/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/XPLAIN/Dataflash.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/XPLAIN/LEDs.h"/>

-

-				<build type="define" name="BOARD" value="BOARD_XPLAIN"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#a3bu_xplained" caption="Board Support - A3BU_XPLAINED">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_A3BU_XPLAINED"/>

-

-				<device-support value="atxmega256a3bu"/>

-

-				<require idref="lufa.drivers.misc.at45db642d"/>

-				<require idref="lufa.drivers.peripheral.usart_spi"/>

-

-				<require idref="lufa.drivers.board.buttons"/>

-				<require idref="lufa.drivers.board.dataflash"/>

-				<require idref="lufa.drivers.board.leds"/>

-

-				<build type="header-file" value="Drivers/Board/XMEGA/A3BU_XPLAINED/Board.h"/>

-				<build type="header-file" value="Drivers/Board/XMEGA/A3BU_XPLAINED/Buttons.h"/>

-				<build type="header-file" value="Drivers/Board/XMEGA/A3BU_XPLAINED/Dataflash.h"/>

-				<build type="header-file" value="Drivers/Board/XMEGA/A3BU_XPLAINED/LEDs.h"/>

-

-				<build type="define" name="BOARD" value="BOARD_A3BU_XPLAINED"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#b1_xplained" caption="Board Support - B1_XPLAINED">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_B1_XPLAINED"/>

-

-				<device-support value="atxmega128b1"/>

-

-				<require idref="lufa.drivers.misc.at45db642d"/>

-				<require idref="lufa.drivers.peripheral.usart_spi"/>

-				<require idref="lufa.drivers.board.buttons"/>

-				<require idref="lufa.drivers.board.dataflash"/>

-				<require idref="lufa.drivers.board.leds"/>

-

-				<build type="header-file" value="Drivers/Board/XMEGA/B1_XPLAINED/Board.h"/>

-				<build type="header-file" value="Drivers/Board/XMEGA/B1_XPLAINED/Buttons.h"/>

-				<build type="header-file" value="Drivers/Board/XMEGA/B1_XPLAINED/Dataflash.h"/>

-				<build type="header-file" value="Drivers/Board/XMEGA/B1_XPLAINED/LEDs.h"/>

-

-				<build type="define" name="BOARD" value="BOARD_B1_XPLAINED"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#evk1100" caption="Board Support - EVK1100">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_EVK1100"/>

-

-				<device-support value="at32uc3a0512"/>

-

-				<require idref="lufa.drivers.board.buttons"/>

-				<require idref="lufa.drivers.board.joystick"/>

-				<require idref="lufa.drivers.board.leds"/>

-

-				<build type="header-file" value="Drivers/Board/UC3/EVK1100/Board.h"/>

-				<build type="header-file" value="Drivers/Board/UC3/EVK1100/Buttons.h"/>

-				<build type="header-file" value="Drivers/Board/UC3/EVK1100/Joystick.h"/>

-				<build type="header-file" value="Drivers/Board/UC3/EVK1100/LEDs.h"/>

-

-				<build type="define" name="BOARD" value="BOARD_EVK1100"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#evk1101" caption="Board Support - EVK1101">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_EVK1101"/>

-

-				<device-support value="at32uc3b0256"/>

-

-				<require idref="lufa.drivers.board.buttons"/>

-				<require idref="lufa.drivers.board.joystick"/>

-				<require idref="lufa.drivers.board.leds"/>

-

-				<build type="header-file" value="Drivers/Board/UC3/EVK1101/Board.h"/>

-				<build type="header-file" value="Drivers/Board/UC3/EVK1101/Buttons.h"/>

-				<build type="header-file" value="Drivers/Board/UC3/EVK1101/Joystick.h"/>

-				<build type="header-file" value="Drivers/Board/UC3/EVK1101/LEDs.h"/>

-

-				<build type="define" name="BOARD" value="BOARD_EVK1101"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#evk1104" caption="Board Support - EVK1104">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_EVK1104"/>

-

-				<device-support value="at32uc3a3256"/>

-

-				<require idref="lufa.drivers.board.buttons"/>

-				<require idref="lufa.drivers.board.leds"/>

-

-				<build type="header-file" value="Drivers/Board/UC3/EVK1104/Board.h"/>

-				<build type="header-file" value="Drivers/Board/UC3/EVK1104/Buttons.h"/>

-				<build type="header-file" value="Drivers/Board/UC3/EVK1104/LEDs.h"/>

-

-				<build type="define" name="BOARD" value="BOARD_EVK1104"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#uc3a3_xplained" caption="Board Support - UC3A3_XPLAINED">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_UC3_A3_XPLAINED"/>

-

-				<device-support value="at32uc3a3256"/>

-

-				<require idref="lufa.drivers.board.buttons"/>

-				<require idref="lufa.drivers.board.leds"/>

-

-				<build type="header-file" value="Drivers/Board/UC3/UC3A3_XPLAINED/Board.h"/>

-				<build type="header-file" value="Drivers/Board/UC3/UC3A3_XPLAINED/Buttons.h"/>

-				<build type="header-file" value="Drivers/Board/UC3/UC3A3_XPLAINED/LEDs.h"/>

-

-				<build type="define" name="BOARD" value="BOARD_UC3A3_XPLAINED"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#stange_isp" caption="Board Support - STANGE_ISP">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_STANGE_ISP"/>

-

-				<device-support value="at90usb162"/>

-

-				<require idref="lufa.drivers.board.buttons"/>

-				<require idref="lufa.drivers.board.leds"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/STANGE_ISP/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/STANGE_ISP/Buttons.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/STANGE_ISP/LEDs.h"/>

-

-				<build type="define" name="BOARD" value="BOARD_STANGE_ISP"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#c3_xplained" caption="Board Support - C3_XPLAINED">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_C3_XPLAINED"/>

-

-				<device-support value="atxmega384c3"/>

-

-				<require idref="lufa.drivers.board.buttons"/>

-				<require idref="lufa.drivers.board.leds"/>

-

-				<build type="header-file" value="Drivers/Board/XMEGA/C3_XPLAINED/Board.h"/>

-				<build type="header-file" value="Drivers/Board/XMEGA/C3_XPLAINED/Buttons.h"/>

-				<build type="header-file" value="Drivers/Board/XMEGA/C3_XPLAINED/LEDs.h"/>

-

-				<build type="define" name="BOARD" value="BOARD_C3_XPLAINED"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#u2s" caption="Board Support - U2S">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_U2S"/>

-

-				<device-support value="atmega32u2"/>

-

-				<require idref="lufa.drivers.board.buttons"/>

-				<require idref="lufa.drivers.board.leds"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/U2S/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/U2S/Buttons.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/U2S/LEDs.h"/>

-

-				<build type="define" name="BOARD" value="BOARD_U2S"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#yun" caption="Board Support - YUN">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_YUN"/>

-

-				<device-support value="atmega32u4"/>

-

-				<require idref="lufa.drivers.board.leds"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/YUN/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/YUN/LEDs.h"/>

-

-				<build type="define" name="BOARD" value="BOARD_YUN"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.board#yun" caption="Board Support - MICRO">

-				<build type="doxygen-entry-point" value="Group_BoardInfo_MICRO"/>

-

-				<device-support value="atmega32u4"/>

-

-				<require idref="lufa.drivers.board.leds"/>

-

-				<build type="header-file" value="Drivers/Board/AVR8/MICRO/Board.h"/>

-				<build type="header-file" value="Drivers/Board/AVR8/MICRO/LEDs.h"/>

-

-				<build type="define" name="BOARD" value="BOARD_MICRO"/>

-			</module>

-		</select-by-config>

-	</asf>

-</lufa>

+<!--
+             LUFA Library
+     Copyright (C) Dean Camera, 2013.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+-->
+
+<!-- Atmel Studio framework integration file -->
+
+<lufa>
+	<asf>
+		<select-by-config id="lufa.drivers.board" name="lufa.drivers.board.name" default="none" caption="LUFA Board Support">
+			<info type="description" value="summary">
+				Board hardware (LEDs, Buttons, etc.) drivers for the preconfigured LUFA boards. Note that only the boards
+				compatible with the currently selected device will be shown.
+
+				To disable all hardware drivers silently, use NONE. To supply customer drivers, use USER (see manual).
+			</info>
+
+			<module type="driver" id="lufa.drivers.board#none" caption="Board Support - None">
+				<device-support value="avr"/>
+				<build type="define" name="BOARD" value="BOARD_NONE"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#user" caption="Board Support - User Supplied">
+				<device-support value="avr"/>
+				<build type="define" name="BOARD" value="BOARD_USER"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#adafruit_u4" caption="Board Support - ADAFRUITU4">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_ADAFRUITU4"/>
+
+				<device-support value="atmega32u4"/>
+				<build type="define" name="BOARD" value="BOARD_ADAFRUITU4"/>
+
+				<require idref="lufa.drivers.board.leds"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/ADAFRUITU4/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/ADAFRUITU4/LEDs.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#atavrusbrf01" caption="Board Support - ATAVRUSBRF01">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_ATAVRUSBRF01"/>
+
+				<device-support value="at90usb1287"/>
+				<build type="define" name="BOARD" value="BOARD_ATAVRUSBRF01"/>
+
+				<require idref="lufa.drivers.board.buttons"/>
+				<require idref="lufa.drivers.board.leds"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/ATAVRUSBRF01/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/ATAVRUSBRF01/Buttons.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/ATAVRUSBRF01/LEDs.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#benito" caption="Board Support - BENITO">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_BENITO"/>
+
+				<device-support value="at90usb162"/>
+				<build type="define" name="BOARD" value="BOARD_BENITO"/>
+
+				<require idref="lufa.drivers.board.buttons"/>
+				<require idref="lufa.drivers.board.leds"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/BENITO/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/BENITO/Buttons.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/BENITO/LEDs.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#big_multio" caption="Board Support - BIGMULTIO">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_BIGMULTIO"/>
+
+				<device-support value="atmega32u4"/>
+				<build type="define" name="BOARD" value="BOARD_BIGMULTIO"/>
+
+				<require idref="lufa.drivers.board.leds"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/BIGMULTIO/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/BIGMULTIO/LEDs.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#blackcat" caption="Board Support - BLACKCAT">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_BLACKCAT"/>
+
+				<device-support value="at90usb162"/>
+				<build type="define" name="BOARD" value="BOARD_BLACKCAT"/>
+
+				<require idref="lufa.drivers.board.leds"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/BLACKCAT/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/BLACKCAT/LEDs.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#bui" caption="Board Support - BUI">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_BUI"/>
+
+				<device-support value="at90usb646"/>
+				<build type="define" name="BOARD" value="BOARD_BUI"/>
+
+				<require idref="lufa.drivers.board.leds"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/BUI/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/BUI/LEDs.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#bumbleb" caption="Board Support - BUMBLEB">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_BUMBLEB"/>
+
+				<device-support value="at90usb162"/>
+				<build type="define" name="BOARD" value="BOARD_BUMBLEB"/>
+
+				<require idref="lufa.drivers.board.buttons"/>
+				<require idref="lufa.drivers.board.leds"/>
+				<require idref="lufa.drivers.board.joystick"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/BUMBLEB/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/BUMBLEB/Buttons.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/BUMBLEB/Joystick.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/BUMBLEB/LEDs.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#culv3" caption="Board Support - CULV3">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_CULV3"/>
+
+				<device-support value="atmega32u4"/>
+				<build type="define" name="BOARD" value="BOARD_CULV3"/>
+
+				<require idref="lufa.drivers.board.buttons"/>
+				<require idref="lufa.drivers.board.leds"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/CULV3/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/CULV3/Buttons.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/CULV3/LEDs.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#duce" caption="Board Support - DUCE">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_DUCE"/>
+
+				<device-support value="atmega32u2"/>
+				<build type="define" name="BOARD" value="BOARD_DUCE"/>
+
+				<require idref="lufa.drivers.board.leds"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/DUCE/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/DUCE/LEDs.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#evk527" caption="Board Support - EVK527">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_EVK527"/>
+
+				<device-support value="atmega32u4"/>
+				<build type="define" name="BOARD" value="BOARD_EVK527"/>
+
+				<require idref="lufa.drivers.misc.at45db321c"/>
+				<require idref="lufa.drivers.peripheral.spi"/>
+				<require idref="lufa.drivers.board.buttons"/>
+				<require idref="lufa.drivers.board.dataflash"/>
+				<require idref="lufa.drivers.board.joystick"/>
+				<require idref="lufa.drivers.board.leds"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/EVK527/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/EVK527/Buttons.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/EVK527/Dataflash.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/EVK527/Joystick.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/EVK527/LEDs.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#jm_db_u2" caption="Board Support - JMDBU2">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_JMDBU2"/>
+
+				<device-support value="atmega32u2"/>
+				<build type="define" name="BOARD" value="BOARD_JMDBU2"/>
+
+				<require idref="lufa.drivers.board.buttons"/>
+				<require idref="lufa.drivers.board.leds"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/JMDBU2/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/JMDBU2/Buttons.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/JMDBU2/LEDs.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#leonardo" caption="Board Support - LEONARDO">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_LEONARDO"/>
+
+				<device-support value="atmega32u4"/>
+				<build type="define" name="BOARD" value="BOARD_LEONARDO"/>
+
+				<require idref="lufa.drivers.board.leds"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/LEONARDO/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/LEONARDO/LEDs.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#maximus" caption="Board Support - MAXIMUS">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_MAXIMUS"/>
+
+				<device-support value="at90usb162"/>
+				<build type="define" name="BOARD" value="BOARD_MAXIMUS"/>
+
+				<require idref="lufa.drivers.board.leds"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/MAXIMUS/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/MAXIMUS/LEDs.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#micropendous_32u2" caption="Board Support - MICROPENDOUS_32U2">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_MICROPENDOUS_32U2"/>
+
+				<device-support value="atmega32u2"/>
+				<build type="define" name="BOARD" value="BOARD_MICROPENDOUS_32U2"/>
+
+				<require idref="lufa.drivers.board.leds"/>
+				<require idref="lufa.drivers.board.buttons"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/LEDs.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Buttons.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#micropendous_a" caption="Board Support - MICROPENDOUS_A">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_MICROPENDOUS_A"/>
+
+				<device-support value="at90usb1287"/>
+				<build type="define" name="BOARD" value="BOARD_MICROPENDOUS_A"/>
+
+				<require idref="lufa.drivers.board.buttons"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Buttons.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#micropendous_1" caption="Board Support - MICROPENDOUS_1">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_MICROPENDOUS_1"/>
+
+				<device-support value="at90usb162"/>
+				<build type="define" name="BOARD" value="BOARD_MICROPENDOUS_1"/>
+
+				<require idref="lufa.drivers.board.buttons"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Buttons.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#micropendous_2" caption="Board Support - MICROPENDOUS_2">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_MICROPENDOUS_2"/>
+
+				<device-support value="atmega32u4"/>
+				<build type="define" name="BOARD" value="BOARD_MICROPENDOUS_2"/>
+
+				<require idref="lufa.drivers.board.buttons"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Buttons.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#micropendous_3" caption="Board Support - MICROPENDOUS_3">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_MICROPENDOUS_3"/>
+
+				<device-support value="at90usb1287"/>
+				<build type="define" name="BOARD" value="BOARD_MICROPENDOUS_3"/>
+
+				<require idref="lufa.drivers.board.buttons"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Buttons.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#micropendous_4" caption="Board Support - MICROPENDOUS_4">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_MICROPENDOUS_4"/>
+
+				<device-support value="at90usb1287"/>
+				<build type="define" name="BOARD" value="BOARD_MICROPENDOUS_4"/>
+
+				<require idref="lufa.drivers.board.buttons"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Buttons.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#micropendous_dip" caption="Board Support - MICROPENDOUS_DIP">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_MICROPENDOUS_DIP"/>
+
+				<device-support value="at90usb1287"/>
+				<build type="define" name="BOARD" value="BOARD_MICROPENDOUS_DIP"/>
+
+				<require idref="lufa.drivers.board.buttons"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Buttons.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#micropendous_rev1" caption="Board Support - MICROPENDOUS_REV1">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_MICROPENDOUS_REV1"/>
+
+				<device-support value="at90usb1287"/>
+				<build type="define" name="BOARD" value="BOARD_MICROPENDOUS_REV1"/>
+
+				<require idref="lufa.drivers.board.leds"/>
+				<require idref="lufa.drivers.board.buttons"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/LEDs.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Buttons.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#micropendous_rev2" caption="Board Support - MICROPENDOUS_REV2">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_MICROPENDOUS_REV2"/>
+
+				<device-support value="at90usb1287"/>
+				<build type="define" name="BOARD" value="BOARD_MICROPENDOUS_REV2"/>
+
+				<require idref="lufa.drivers.board.leds"/>
+				<require idref="lufa.drivers.board.buttons"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/LEDs.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Buttons.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#microsin_162" caption="Board Support - MICROSIN162">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_MICROSIN162"/>
+
+				<device-support value="atmega162"/>
+				<build type="define" name="BOARD" value="BOARD_MICROSIN162"/>
+
+				<require idref="lufa.drivers.board.leds"/>
+				<require idref="lufa.drivers.board.buttons"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/MICROSIN162/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/MICROSIN162/LEDs.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/MICROSIN162/Buttons.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#minimus" caption="Board Support - MINIMUS">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_MINIMUS"/>
+
+				<device-support value="atmega32u2"/>
+				<build type="define" name="BOARD" value="BOARD_MINIMUS"/>
+
+				<require idref="lufa.drivers.board.leds"/>
+				<require idref="lufa.drivers.board.buttons"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/MINIMUS/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/MINIMUS/LEDs.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/MINIMUS/Buttons.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#multio" caption="Board Support - MULTIO">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_MULTIO"/>
+
+				<device-support value="at90usb162"/>
+				<build type="define" name="BOARD" value="BOARD_MULTIO"/>
+
+				<require idref="lufa.drivers.board.leds"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/MULTIO/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/MULTIO/LEDs.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#olimex_162" caption="Board Support - OLIMEX162">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_OLIMEX162"/>
+
+				<device-support value="at90usb162"/>
+				<build type="define" name="BOARD" value="BOARD_OLIMEX162"/>
+
+				<require idref="lufa.drivers.board.leds"/>
+				<require idref="lufa.drivers.board.buttons"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/OLIMEX162/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/OLIMEX162/LEDs.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/OLIMEX162/Buttons.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#olimex_32u4" caption="Board Support - OLIMEX32U4">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_OLIMEX32U4"/>
+
+				<device-support value="atmega32u4"/>
+				<build type="define" name="BOARD" value="BOARD_OLIMEX32U4"/>
+
+				<require idref="lufa.drivers.board.leds"/>
+				<require idref="lufa.drivers.board.buttons"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/OLIMEX32U4/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/OLIMEX32U4/LEDs.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/OLIMEX32U4/Buttons.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#olimex_isp_mkii" caption="Board Support - OLIMEXISPMK2">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_OLIMEXISPMK2"/>
+
+				<device-support value="at90usb162"/>
+				<build type="define" name="BOARD" value="BOARD_OLIMEXISPMK2"/>
+
+				<require idref="lufa.drivers.board.leds"/>
+				<require idref="lufa.drivers.board.buttons"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/OLIMEXISPMK2/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/OLIMEXISPMK2/LEDs.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/OLIMEXISPMK2/Buttons.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#olimex_t32u4" caption="Board Support - OLIMEX_T32U4">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_OLIMEXT32U4"/>
+
+				<device-support value="atmega32u4"/>
+				<build type="define" name="BOARD" value="BOARD_OLIMEXT32U4"/>
+
+				<require idref="lufa.drivers.board.leds"/>
+				<require idref="lufa.drivers.board.buttons"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/OLIMEXT32U4/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/OLIMEXT32U4/LEDs.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/OLIMEXT32U4/Buttons.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#rzusbstick" caption="Board Support - RZUSBSTICK">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_RZUSBSTICK"/>
+
+				<device-support value="at90usb1287"/>
+				<build type="define" name="BOARD" value="BOARD_RZUSBSTICK"/>
+
+				<require idref="lufa.drivers.board.leds"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/RZUSBSTICK/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/RZUSBSTICK/LEDs.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#sparkfun_8u2" caption="Board Support - SPARKFUN8U2">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_SPARKFUN8U2"/>
+
+				<device-support value="atmega8u2"/>
+				<build type="define" name="BOARD" value="BOARD_SPARKFUN8U2"/>
+
+				<require idref="lufa.drivers.board.leds"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/SPARKFUN8U2/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/SPARKFUN8U2/LEDs.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#stk525" caption="Board Support - STK525">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_STK525"/>
+
+				<device-support value="at90usb1287"/>
+				<device-support value="at90usb1286"/>
+				<device-support value="at90usb647"/>
+				<device-support value="at90usb646"/>
+				<build type="define" name="BOARD" value="BOARD_STK525"/>
+
+				<require idref="lufa.drivers.misc.at45db321c"/>
+				<require idref="lufa.drivers.peripheral.spi"/>
+				<require idref="lufa.drivers.board.buttons"/>
+				<require idref="lufa.drivers.board.dataflash"/>
+				<require idref="lufa.drivers.board.joystick"/>
+				<require idref="lufa.drivers.board.leds"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/STK525/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/STK525/Buttons.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/STK525/Dataflash.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/STK525/Joystick.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/STK525/LEDs.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#stk526" caption="Board Support - STK526">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_STK526"/>
+
+				<device-support value="at90usb162"/>
+				<device-support value="at90usb82"/>
+				<device-support value="atmega32u2"/>
+				<device-support value="atmega16u2"/>
+				<device-support value="atmega8u2"/>
+				<build type="define" name="BOARD" value="BOARD_STK526"/>
+
+				<require idref="lufa.drivers.misc.at45db642d"/>
+				<require idref="lufa.drivers.peripheral.spi"/>
+				<require idref="lufa.drivers.board.buttons"/>
+				<require idref="lufa.drivers.board.dataflash"/>
+				<require idref="lufa.drivers.board.joystick"/>
+				<require idref="lufa.drivers.board.leds"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/STK526/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/STK526/Buttons.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/STK526/Dataflash.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/STK526/Joystick.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/STK526/LEDs.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#teensy" caption="Board Support - TEENSY">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_TEENSY"/>
+
+				<device-support value="at90usb162"/>
+				<build type="define" name="BOARD" value="BOARD_TEENSY"/>
+
+				<require idref="lufa.drivers.board.leds"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/TEENSY/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/TEENSY/LEDs.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#teensy2" caption="Board Support - TEENSY2">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_TEENSY2"/>
+
+				<device-support value="at90usb646"/>
+				<build type="define" name="BOARD" value="BOARD_TEENSY2"/>
+
+				<require idref="lufa.drivers.board.leds"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/TEENSY/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/TEENSY/LEDs.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#tul" caption="Board Support - TUL">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_TUL"/>
+
+				<device-support value="atmega32u4"/>
+				<build type="define" name="BOARD" value="BOARD_TUL"/>
+
+				<require idref="lufa.drivers.board.buttons"/>
+				<require idref="lufa.drivers.board.leds"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/TUL/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/TUL/Buttons.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/TUL/LEDs.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#udip" caption="Board Support - UDIP">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_UDIP"/>
+
+				<device-support value="atmega32u2"/>
+				<build type="define" name="BOARD" value="BOARD_UDIP"/>
+
+				<require idref="lufa.drivers.board.buttons"/>
+				<require idref="lufa.drivers.board.leds"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/UDIP/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/UDIP/Buttons.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/UDIP/LEDs.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#uno" caption="Board Support - UNO">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_UNO"/>
+
+				<device-support value="atmega8u2"/>
+				<device-support value="atmega16u2"/>
+				<build type="define" name="BOARD" value="BOARD_UNO"/>
+
+				<require idref="lufa.drivers.board.leds"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/UNO/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/UNO/LEDs.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#usb2ax" caption="Board Support - USB2AX">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_USB2AX"/>
+
+				<device-support value="atmega32u2"/>
+				<build type="define" name="BOARD" value="BOARD_USB2AX"/>
+
+				<require idref="lufa.drivers.board.buttons"/>
+				<require idref="lufa.drivers.board.leds"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/USB2AX/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/USB2AX/Buttons.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/USB2AX/LEDs.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#usb2ax_v3" caption="Board Support - USB2AX_V3">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_USB2AX_V3"/>
+
+				<device-support value="atmega32u2"/>
+				<build type="define" name="BOARD" value="BOARD_USB2AX_V3"/>
+
+				<require idref="lufa.drivers.board.buttons"/>
+				<require idref="lufa.drivers.board.leds"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/USB2AX/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/USB2AX/Buttons.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/USB2AX/LEDs.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#usb2ax_v3_1" caption="Board Support - USB2AX_V31">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_USB2AX_V31"/>
+
+				<device-support value="atmega32u2"/>
+				<build type="define" name="BOARD" value="BOARD_USB2AX_V31"/>
+
+				<require idref="lufa.drivers.board.buttons"/>
+				<require idref="lufa.drivers.board.leds"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/USB2AX/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/USB2AX/Buttons.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/USB2AX/LEDs.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#usbfoo" caption="Board Support - USBFOO">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_USBFOO"/>
+
+				<device-support value="atmega162"/>
+				<build type="define" name="BOARD" value="BOARD_USBFOO"/>
+
+				<require idref="lufa.drivers.board.buttons"/>
+				<require idref="lufa.drivers.board.leds"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/USBFOO/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/USBFOO/Buttons.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/USBFOO/LEDs.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#usbkey" caption="Board Support - USBKEY">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_USBKEY"/>
+
+				<device-support value="at90usb1287"/>
+				<build type="define" name="BOARD" value="BOARD_USBKEY"/>
+
+				<require idref="lufa.drivers.misc.at45db642d"/>
+				<require idref="lufa.drivers.peripheral.spi"/>
+
+				<require idref="lufa.drivers.board.buttons"/>
+				<require idref="lufa.drivers.board.dataflash"/>
+				<require idref="lufa.drivers.board.joystick"/>
+				<require idref="lufa.drivers.board.leds"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/USBKEY/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/USBKEY/Buttons.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/USBKEY/Dataflash.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/USBKEY/Joystick.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/USBKEY/LEDs.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#usbtiny_mkii" caption="Board Support - USBTINYMKII">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_USBTINYMKII"/>
+
+				<device-support value="at90usb162"/>
+				<build type="define" name="BOARD" value="BOARD_USBTINYMKII"/>
+
+				<require idref="lufa.drivers.board.buttons"/>
+				<require idref="lufa.drivers.board.leds"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/USBTINYMKII/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/USBTINYMKII/Buttons.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/USBTINYMKII/LEDs.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#xplain_rev1" caption="Board Support - XPLAIN (HW Rev 1)">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_XPLAIN_REV1"/>
+
+				<device-support value="at90usb1287"/>
+
+				<require idref="lufa.drivers.misc.at45db642d"/>
+				<require idref="lufa.drivers.peripheral.spi"/>
+				<require idref="lufa.drivers.board.dataflash"/>
+				<require idref="lufa.drivers.board.leds"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/XPLAIN/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/XPLAIN/Dataflash.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/XPLAIN/LEDs.h"/>
+
+				<build type="define" name="BOARD" value="BOARD_XPLAIN_REV1"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#xplain" caption="Board Support - XPLAIN (HW Rev 2+)">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_XPLAIN"/>
+
+				<device-support value="at90usb1287"/>
+
+				<require idref="lufa.drivers.misc.at45db642d"/>
+				<require idref="lufa.drivers.peripheral.spi"/>
+				<require idref="lufa.drivers.board.dataflash"/>
+				<require idref="lufa.drivers.board.leds"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/XPLAIN/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/XPLAIN/Dataflash.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/XPLAIN/LEDs.h"/>
+
+				<build type="define" name="BOARD" value="BOARD_XPLAIN"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#a3bu_xplained" caption="Board Support - A3BU_XPLAINED">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_A3BU_XPLAINED"/>
+
+				<device-support value="atxmega256a3bu"/>
+
+				<require idref="lufa.drivers.misc.at45db642d"/>
+				<require idref="lufa.drivers.peripheral.usart_spi"/>
+
+				<require idref="lufa.drivers.board.buttons"/>
+				<require idref="lufa.drivers.board.dataflash"/>
+				<require idref="lufa.drivers.board.leds"/>
+
+				<build type="header-file" value="Drivers/Board/XMEGA/A3BU_XPLAINED/Board.h"/>
+				<build type="header-file" value="Drivers/Board/XMEGA/A3BU_XPLAINED/Buttons.h"/>
+				<build type="header-file" value="Drivers/Board/XMEGA/A3BU_XPLAINED/Dataflash.h"/>
+				<build type="header-file" value="Drivers/Board/XMEGA/A3BU_XPLAINED/LEDs.h"/>
+
+				<build type="define" name="BOARD" value="BOARD_A3BU_XPLAINED"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#b1_xplained" caption="Board Support - B1_XPLAINED">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_B1_XPLAINED"/>
+
+				<device-support value="atxmega128b1"/>
+
+				<require idref="lufa.drivers.misc.at45db642d"/>
+				<require idref="lufa.drivers.peripheral.usart_spi"/>
+				<require idref="lufa.drivers.board.buttons"/>
+				<require idref="lufa.drivers.board.dataflash"/>
+				<require idref="lufa.drivers.board.leds"/>
+
+				<build type="header-file" value="Drivers/Board/XMEGA/B1_XPLAINED/Board.h"/>
+				<build type="header-file" value="Drivers/Board/XMEGA/B1_XPLAINED/Buttons.h"/>
+				<build type="header-file" value="Drivers/Board/XMEGA/B1_XPLAINED/Dataflash.h"/>
+				<build type="header-file" value="Drivers/Board/XMEGA/B1_XPLAINED/LEDs.h"/>
+
+				<build type="define" name="BOARD" value="BOARD_B1_XPLAINED"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#evk1100" caption="Board Support - EVK1100">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_EVK1100"/>
+
+				<device-support value="at32uc3a0512"/>
+
+				<require idref="lufa.drivers.board.buttons"/>
+				<require idref="lufa.drivers.board.joystick"/>
+				<require idref="lufa.drivers.board.leds"/>
+
+				<build type="header-file" value="Drivers/Board/UC3/EVK1100/Board.h"/>
+				<build type="header-file" value="Drivers/Board/UC3/EVK1100/Buttons.h"/>
+				<build type="header-file" value="Drivers/Board/UC3/EVK1100/Joystick.h"/>
+				<build type="header-file" value="Drivers/Board/UC3/EVK1100/LEDs.h"/>
+
+				<build type="define" name="BOARD" value="BOARD_EVK1100"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#evk1101" caption="Board Support - EVK1101">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_EVK1101"/>
+
+				<device-support value="at32uc3b0256"/>
+
+				<require idref="lufa.drivers.board.buttons"/>
+				<require idref="lufa.drivers.board.joystick"/>
+				<require idref="lufa.drivers.board.leds"/>
+
+				<build type="header-file" value="Drivers/Board/UC3/EVK1101/Board.h"/>
+				<build type="header-file" value="Drivers/Board/UC3/EVK1101/Buttons.h"/>
+				<build type="header-file" value="Drivers/Board/UC3/EVK1101/Joystick.h"/>
+				<build type="header-file" value="Drivers/Board/UC3/EVK1101/LEDs.h"/>
+
+				<build type="define" name="BOARD" value="BOARD_EVK1101"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#evk1104" caption="Board Support - EVK1104">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_EVK1104"/>
+
+				<device-support value="at32uc3a3256"/>
+
+				<require idref="lufa.drivers.board.buttons"/>
+				<require idref="lufa.drivers.board.leds"/>
+
+				<build type="header-file" value="Drivers/Board/UC3/EVK1104/Board.h"/>
+				<build type="header-file" value="Drivers/Board/UC3/EVK1104/Buttons.h"/>
+				<build type="header-file" value="Drivers/Board/UC3/EVK1104/LEDs.h"/>
+
+				<build type="define" name="BOARD" value="BOARD_EVK1104"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#uc3a3_xplained" caption="Board Support - UC3A3_XPLAINED">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_UC3_A3_XPLAINED"/>
+
+				<device-support value="at32uc3a3256"/>
+
+				<require idref="lufa.drivers.board.buttons"/>
+				<require idref="lufa.drivers.board.leds"/>
+
+				<build type="header-file" value="Drivers/Board/UC3/UC3A3_XPLAINED/Board.h"/>
+				<build type="header-file" value="Drivers/Board/UC3/UC3A3_XPLAINED/Buttons.h"/>
+				<build type="header-file" value="Drivers/Board/UC3/UC3A3_XPLAINED/LEDs.h"/>
+
+				<build type="define" name="BOARD" value="BOARD_UC3A3_XPLAINED"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#stange_isp" caption="Board Support - STANGE_ISP">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_STANGE_ISP"/>
+
+				<device-support value="at90usb162"/>
+
+				<require idref="lufa.drivers.board.buttons"/>
+				<require idref="lufa.drivers.board.leds"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/STANGE_ISP/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/STANGE_ISP/Buttons.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/STANGE_ISP/LEDs.h"/>
+
+				<build type="define" name="BOARD" value="BOARD_STANGE_ISP"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#c3_xplained" caption="Board Support - C3_XPLAINED">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_C3_XPLAINED"/>
+
+				<device-support value="atxmega384c3"/>
+
+				<require idref="lufa.drivers.board.buttons"/>
+				<require idref="lufa.drivers.board.leds"/>
+
+				<build type="header-file" value="Drivers/Board/XMEGA/C3_XPLAINED/Board.h"/>
+				<build type="header-file" value="Drivers/Board/XMEGA/C3_XPLAINED/Buttons.h"/>
+				<build type="header-file" value="Drivers/Board/XMEGA/C3_XPLAINED/LEDs.h"/>
+
+				<build type="define" name="BOARD" value="BOARD_C3_XPLAINED"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#u2s" caption="Board Support - U2S">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_U2S"/>
+
+				<device-support value="atmega32u2"/>
+
+				<require idref="lufa.drivers.board.buttons"/>
+				<require idref="lufa.drivers.board.leds"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/U2S/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/U2S/Buttons.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/U2S/LEDs.h"/>
+
+				<build type="define" name="BOARD" value="BOARD_U2S"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#yun" caption="Board Support - YUN">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_YUN"/>
+
+				<device-support value="atmega32u4"/>
+
+				<require idref="lufa.drivers.board.leds"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/YUN/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/YUN/LEDs.h"/>
+
+				<build type="define" name="BOARD" value="BOARD_YUN"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.board#yun" caption="Board Support - MICRO">
+				<build type="doxygen-entry-point" value="Group_BoardInfo_MICRO"/>
+
+				<device-support value="atmega32u4"/>
+
+				<require idref="lufa.drivers.board.leds"/>
+
+				<build type="header-file" value="Drivers/Board/AVR8/MICRO/Board.h"/>
+				<build type="header-file" value="Drivers/Board/AVR8/MICRO/LEDs.h"/>
+
+				<build type="define" name="BOARD" value="BOARD_MICRO"/>
+			</module>
+		</select-by-config>
+	</asf>
+</lufa>
diff --git a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_misc.xml b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_misc.xml
index 8680ca2dff..4311ae87b7 100644
--- a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_misc.xml
+++ b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_misc.xml
@@ -1,57 +1,57 @@
-<!--

-             LUFA Library

-     Copyright (C) Dean Camera, 2013.

-

-  dean [at] fourwalledcubicle [dot] com

-           www.lufa-lib.org

--->

-

-<!-- Atmel Studio framework integration file -->

-

-<lufa>

-	<asf>

-		<module type="component" id="lufa.drivers.misc.at45db321c" caption="LUFA AT45DB321C Dataflash Commands">

-			<device-support-alias value="lufa_avr8"/>

-			<device-support-alias value="lufa_xmega"/>

-			<device-support-alias value="lufa_uc3"/>

-

-			<build type="doxygen-entry-point" value="Group_AT45DB321C"/>

-

-			<build type="include-path" value=".."/>

-			<build type="header-file" subtype="api" value="Drivers/Misc/AT45DB321C.h"/>

-		</module>

-

-		<module type="component" id="lufa.drivers.misc.at45db642d" caption="LUFA AT45DB642D Dataflash Commands">

-			<device-support-alias value="lufa_avr8"/>

-			<device-support-alias value="lufa_xmega"/>

-			<device-support-alias value="lufa_uc3"/>

-

-			<build type="doxygen-entry-point" value="Group_AT45DB321C"/>

-

-			<build type="include-path" value=".."/>

-			<build type="header-file" subtype="api" value="Drivers/Misc/AT45DB642D.h"/>

-		</module>

-

-		<module type="service" id="lufa.drivers.misc.ringbuffer" caption="LUFA Ring Buffer">

-			<device-support-alias value="lufa_avr8"/>

-			<device-support-alias value="lufa_xmega"/>

-			<device-support-alias value="lufa_uc3"/>

-

-			<build type="doxygen-entry-point" value="Group_RingBuff"/>

-

-			<build type="include-path" value=".."/>

-			<build type="header-file" subtype="api" value="Drivers/Misc/RingBuffer.h"/>

-		</module>

-

-		<module type="service" id="lufa.drivers.misc.ansi" caption="LUFA ANSI Terminal Commands">

-			<device-support-alias value="lufa_avr8"/>

-			<device-support-alias value="lufa_xmega"/>

-			<device-support-alias value="lufa_uc3"/>

-

-			<build type="doxygen-entry-point" value="Group_Terminal"/>

-

-			<build type="include-path" value=".."/>

-			<build type="header-file" subtype="api" value="Drivers/Misc/TerminalCodes.h"/>

-		</module>

-	</asf>

+<!--
+             LUFA Library
+     Copyright (C) Dean Camera, 2013.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+-->
+
+<!-- Atmel Studio framework integration file -->
+
+<lufa>
+	<asf>
+		<module type="component" id="lufa.drivers.misc.at45db321c" caption="LUFA AT45DB321C Dataflash Commands">
+			<device-support-alias value="lufa_avr8"/>
+			<device-support-alias value="lufa_xmega"/>
+			<device-support-alias value="lufa_uc3"/>
+
+			<build type="doxygen-entry-point" value="Group_AT45DB321C"/>
+
+			<build type="include-path" value=".."/>
+			<build type="header-file" subtype="api" value="Drivers/Misc/AT45DB321C.h"/>
+		</module>
+
+		<module type="component" id="lufa.drivers.misc.at45db642d" caption="LUFA AT45DB642D Dataflash Commands">
+			<device-support-alias value="lufa_avr8"/>
+			<device-support-alias value="lufa_xmega"/>
+			<device-support-alias value="lufa_uc3"/>
+
+			<build type="doxygen-entry-point" value="Group_AT45DB321C"/>
+
+			<build type="include-path" value=".."/>
+			<build type="header-file" subtype="api" value="Drivers/Misc/AT45DB642D.h"/>
+		</module>
+
+		<module type="service" id="lufa.drivers.misc.ringbuffer" caption="LUFA Ring Buffer">
+			<device-support-alias value="lufa_avr8"/>
+			<device-support-alias value="lufa_xmega"/>
+			<device-support-alias value="lufa_uc3"/>
+
+			<build type="doxygen-entry-point" value="Group_RingBuff"/>
+
+			<build type="include-path" value=".."/>
+			<build type="header-file" subtype="api" value="Drivers/Misc/RingBuffer.h"/>
+		</module>
+
+		<module type="service" id="lufa.drivers.misc.ansi" caption="LUFA ANSI Terminal Commands">
+			<device-support-alias value="lufa_avr8"/>
+			<device-support-alias value="lufa_xmega"/>
+			<device-support-alias value="lufa_uc3"/>
+
+			<build type="doxygen-entry-point" value="Group_Terminal"/>
+
+			<build type="include-path" value=".."/>
+			<build type="header-file" subtype="api" value="Drivers/Misc/TerminalCodes.h"/>
+		</module>
+	</asf>
 </lufa>
\ No newline at end of file
diff --git a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_peripheral.xml b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_peripheral.xml
index 3a982e565f..76ea516dbc 100644
--- a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_peripheral.xml
+++ b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_peripheral.xml
@@ -1,198 +1,198 @@
-<!--

-             LUFA Library

-     Copyright (C) Dean Camera, 2013.

-

-  dean [at] fourwalledcubicle [dot] com

-           www.lufa-lib.org

--->

-

-<!-- Atmel Studio framework integration file -->

-

-<lufa>

-	<asf>

-		<select-by-device id="lufa.drivers.peripheral.usart" caption="LUFA USART Driver">

-			<module type="driver" id="lufa.drivers.peripheral.usart#avr8" caption="LUFA USART Driver - AVR8">

-				<device-support-alias value="lufa_avr8"/>

-

-				<build type="doxygen-entry-point" value="Group_Serial"/>

-

-				<require idref="lufa.common"/>

-				<require idref="lufa.drivers.misc.ansi"/>

-

-				<build type="c-source" value="Drivers/Peripheral/AVR8/Serial_AVR8.c"/>

-				<build type="header-file" value="Drivers/Peripheral/AVR8/Serial_AVR8.h"/>

-				<build type="include-path" value=".."/>

-				<build type="header-file" subtype="api" value="Drivers/Peripheral/Serial.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.peripheral.usart#xmega" caption="LUFA USART Driver - AVR8">

-				<device-support-alias value="lufa_xmega"/>

-

-				<build type="doxygen-entry-point" value="Group_Serial"/>

-

-				<require idref="lufa.common"/>

-				<require idref="lufa.drivers.misc.ansi"/>

-

-				<build type="c-source" value="Drivers/Peripheral/XMEGA/Serial_XMEGA.c"/>

-				<build type="header-file" value="Drivers/Peripheral/XMEGA/Serial_XMEGA.h"/>

-				<build type="include-path" value=".."/>

-				<build type="header-file" subtype="api" value="Drivers/Peripheral/Serial.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.peripheral.usart#uc3" caption="LUFA USART Driver - UC3">

-				<device-support-alias value="lufa_uc3"/>

-

-				<build type="doxygen-entry-point" value="Group_Serial"/>

-

-				<require idref="lufa.common"/>

-				<require idref="lufa.drivers.misc.ansi"/>

-

-				<info type="gui-flag" value="hidden"/>

-			</module>

-		</select-by-device>

-

-		<select-by-device id="lufa.drivers.peripheral.spi" caption="LUFA SPI Driver">

-			<module type="driver" id="lufa.drivers.peripheral.spi#avr8" caption="LUFA SPI Driver - AVR8">

-				<device-support-alias value="lufa_avr8"/>

-

-				<build type="doxygen-entry-point" value="Group_SPI"/>

-

-				<require idref="lufa.common"/>

-

-				<build type="header-file" value="Drivers/Peripheral/AVR8/SPI_AVR8.h"/>

-				<build type="include-path" value=".."/>

-				<build type="header-file" subtype="api" value="Drivers/Peripheral/SPI.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.peripheral.spi#xmega" caption="LUFA SPI Driver - XMEGA">

-				<device-support-alias value="lufa_xmega"/>

-

-				<build type="doxygen-entry-point" value="Group_SPI"/>

-

-				<require idref="lufa.common"/>

-

-				<build type="header-file" value="Drivers/Peripheral/XMEGA/SPI_XMEGA.h"/>

-				<build type="include-path" value=".."/>

-				<build type="header-file" subtype="api" value="Drivers/Peripheral/SPI.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.peripheral.spi#uc3" caption="LUFA SPI Driver - UC3">

-				<device-support-alias value="lufa_uc3"/>

-

-				<build type="doxygen-entry-point" value="Group_SPI"/>

-

-				<require idref="lufa.common"/>

-

-				<info type="gui-flag" value="hidden"/>

-			</module>

-		</select-by-device>

-

-		<select-by-device id="lufa.drivers.peripheral.usart_spi" caption="LUFA USART SPI Driver">

-			<module type="driver" id="lufa.drivers.peripheral.usart_spi#avr8" caption="LUFA USART SPI Driver - AVR8">

-				<device-support-alias value="lufa_avr8"/>

-

-				<build type="doxygen-entry-point" value="Group_SerialSPI"/>

-

-				<require idref="lufa.common"/>

-

-				<build type="header-file" value="Drivers/Peripheral/AVR8/SerialSPI_AVR8.h"/>

-				<build type="include-path" value=".."/>

-				<build type="header-file" subtype="api"  value="Drivers/Peripheral/SerialSPI.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.peripheral.usart_spi#xmega" caption="LUFA USART SPI Driver - XMEGA">

-				<device-support-alias value="lufa_xmega"/>

-

-				<build type="doxygen-entry-point" value="Group_SerialSPI"/>

-

-				<require idref="lufa.common"/>

-

-				<build type="header-file" value="Drivers/Peripheral/XMEGA/SerialSPI_XMEGA.h"/>

-				<build type="include-path" value=".."/>

-				<build type="header-file" subtype="api" value="Drivers/Peripheral/SerialSPI.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.peripheral.usart_spi#uc3" caption="LUFA USART SPI Driver - UC3">

-				<device-support-alias value="lufa_uc3"/>

-

-				<build type="doxygen-entry-point" value="Group_SerialSPI"/>

-

-				<require idref="lufa.common"/>

-

-				<info type="gui-flag" value="hidden"/>

-			</module>

-		</select-by-device>

-

-		<select-by-device id="lufa.drivers.peripheral.twi" caption="LUFA TWI Master Driver">

-			<module type="driver" id="lufa.drivers.peripheral.twi#avr8" caption="LUFA TWI Master Driver - AVR8">

-				<device-support-alias value="lufa_avr8"/>

-

-				<build type="doxygen-entry-point" value="Group_TWI"/>

-

-				<require idref="lufa.common"/>

-

-				<build type="c-source" value="Drivers/Peripheral/AVR8/TWI_AVR8.c"/>

-				<build type="header-file" value="Drivers/Peripheral/AVR8/TWI_AVR8.h"/>

-				<build type="include-path" value=".."/>

-				<build type="header-file" subtype="api" value="Drivers/Peripheral/TWI.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.peripheral.twi#xmega" caption="LUFA TWI Master Driver - XMEGA">

-				<device-support-alias value="lufa_xmega"/>

-

-				<build type="doxygen-entry-point" value="Group_TWI"/>

-

-				<require idref="lufa.common"/>

-

-				<build type="c-source" value="Drivers/Peripheral/XMEGA/TWI_XMEGA.c"/>

-				<build type="header-file" value="Drivers/Peripheral/XMEGA/TWI_XMEGA.h"/>

-				<build type="include-path" value=".."/>

-				<build type="header-file" subtype="api" value="Drivers/Peripheral/TWI.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.peripheral.twi#uc3" caption="LUFA TWI Master Driver - UC3">

-				<device-support-alias value="lufa_uc3"/>

-

-				<build type="doxygen-entry-point" value="Group_TWI"/>

-

-				<require idref="lufa.common"/>

-

-				<info type="gui-flag" value="hidden"/>

-			</module>

-		</select-by-device>

-

-		<select-by-device id="lufa.drivers.peripheral.adc" caption="LUFA ADC Driver">

-			<module type="driver" id="lufa.drivers.peripheral.adc#avr8" caption="LUFA ADC Driver - AVR8">

-				<device-support-alias value="lufa_avr8"/>

-

-				<build type="doxygen-entry-point" value="Group_ADC"/>

-

-				<require idref="lufa.common"/>

-

-				<build type="header-file" value="Drivers/Peripheral/AVR8/ADC_AVR8.h"/>

-				<build type="include-path" value=".."/>

-				<build type="header-file" subtype="api" value="Drivers/Peripheral/ADC.h"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.peripheral.adc#xmega" caption="LUFA ADC Driver - XMEGA">

-				<device-support-alias value="lufa_xmega"/>

-

-				<build type="doxygen-entry-point" value="Group_ADC"/>

-

-				<require idref="lufa.common"/>

-

-				<info type="gui-flag" value="hidden"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.peripheral.adc#uc3" caption="LUFA ADC Driver - UC3">

-				<device-support-alias value="lufa_uc3"/>

-

-				<build type="doxygen-entry-point" value="Group_ADC"/>

-

-				<require idref="lufa.common"/>

-

-				<info type="gui-flag" value="hidden"/>

-			</module>

-		</select-by-device>

-	</asf>

-</lufa>

+<!--
+             LUFA Library
+     Copyright (C) Dean Camera, 2013.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+-->
+
+<!-- Atmel Studio framework integration file -->
+
+<lufa>
+	<asf>
+		<select-by-device id="lufa.drivers.peripheral.usart" caption="LUFA USART Driver">
+			<module type="driver" id="lufa.drivers.peripheral.usart#avr8" caption="LUFA USART Driver - AVR8">
+				<device-support-alias value="lufa_avr8"/>
+
+				<build type="doxygen-entry-point" value="Group_Serial"/>
+
+				<require idref="lufa.common"/>
+				<require idref="lufa.drivers.misc.ansi"/>
+
+				<build type="c-source" value="Drivers/Peripheral/AVR8/Serial_AVR8.c"/>
+				<build type="header-file" value="Drivers/Peripheral/AVR8/Serial_AVR8.h"/>
+				<build type="include-path" value=".."/>
+				<build type="header-file" subtype="api" value="Drivers/Peripheral/Serial.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.peripheral.usart#xmega" caption="LUFA USART Driver - AVR8">
+				<device-support-alias value="lufa_xmega"/>
+
+				<build type="doxygen-entry-point" value="Group_Serial"/>
+
+				<require idref="lufa.common"/>
+				<require idref="lufa.drivers.misc.ansi"/>
+
+				<build type="c-source" value="Drivers/Peripheral/XMEGA/Serial_XMEGA.c"/>
+				<build type="header-file" value="Drivers/Peripheral/XMEGA/Serial_XMEGA.h"/>
+				<build type="include-path" value=".."/>
+				<build type="header-file" subtype="api" value="Drivers/Peripheral/Serial.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.peripheral.usart#uc3" caption="LUFA USART Driver - UC3">
+				<device-support-alias value="lufa_uc3"/>
+
+				<build type="doxygen-entry-point" value="Group_Serial"/>
+
+				<require idref="lufa.common"/>
+				<require idref="lufa.drivers.misc.ansi"/>
+
+				<info type="gui-flag" value="hidden"/>
+			</module>
+		</select-by-device>
+
+		<select-by-device id="lufa.drivers.peripheral.spi" caption="LUFA SPI Driver">
+			<module type="driver" id="lufa.drivers.peripheral.spi#avr8" caption="LUFA SPI Driver - AVR8">
+				<device-support-alias value="lufa_avr8"/>
+
+				<build type="doxygen-entry-point" value="Group_SPI"/>
+
+				<require idref="lufa.common"/>
+
+				<build type="header-file" value="Drivers/Peripheral/AVR8/SPI_AVR8.h"/>
+				<build type="include-path" value=".."/>
+				<build type="header-file" subtype="api" value="Drivers/Peripheral/SPI.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.peripheral.spi#xmega" caption="LUFA SPI Driver - XMEGA">
+				<device-support-alias value="lufa_xmega"/>
+
+				<build type="doxygen-entry-point" value="Group_SPI"/>
+
+				<require idref="lufa.common"/>
+
+				<build type="header-file" value="Drivers/Peripheral/XMEGA/SPI_XMEGA.h"/>
+				<build type="include-path" value=".."/>
+				<build type="header-file" subtype="api" value="Drivers/Peripheral/SPI.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.peripheral.spi#uc3" caption="LUFA SPI Driver - UC3">
+				<device-support-alias value="lufa_uc3"/>
+
+				<build type="doxygen-entry-point" value="Group_SPI"/>
+
+				<require idref="lufa.common"/>
+
+				<info type="gui-flag" value="hidden"/>
+			</module>
+		</select-by-device>
+
+		<select-by-device id="lufa.drivers.peripheral.usart_spi" caption="LUFA USART SPI Driver">
+			<module type="driver" id="lufa.drivers.peripheral.usart_spi#avr8" caption="LUFA USART SPI Driver - AVR8">
+				<device-support-alias value="lufa_avr8"/>
+
+				<build type="doxygen-entry-point" value="Group_SerialSPI"/>
+
+				<require idref="lufa.common"/>
+
+				<build type="header-file" value="Drivers/Peripheral/AVR8/SerialSPI_AVR8.h"/>
+				<build type="include-path" value=".."/>
+				<build type="header-file" subtype="api"  value="Drivers/Peripheral/SerialSPI.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.peripheral.usart_spi#xmega" caption="LUFA USART SPI Driver - XMEGA">
+				<device-support-alias value="lufa_xmega"/>
+
+				<build type="doxygen-entry-point" value="Group_SerialSPI"/>
+
+				<require idref="lufa.common"/>
+
+				<build type="header-file" value="Drivers/Peripheral/XMEGA/SerialSPI_XMEGA.h"/>
+				<build type="include-path" value=".."/>
+				<build type="header-file" subtype="api" value="Drivers/Peripheral/SerialSPI.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.peripheral.usart_spi#uc3" caption="LUFA USART SPI Driver - UC3">
+				<device-support-alias value="lufa_uc3"/>
+
+				<build type="doxygen-entry-point" value="Group_SerialSPI"/>
+
+				<require idref="lufa.common"/>
+
+				<info type="gui-flag" value="hidden"/>
+			</module>
+		</select-by-device>
+
+		<select-by-device id="lufa.drivers.peripheral.twi" caption="LUFA TWI Master Driver">
+			<module type="driver" id="lufa.drivers.peripheral.twi#avr8" caption="LUFA TWI Master Driver - AVR8">
+				<device-support-alias value="lufa_avr8"/>
+
+				<build type="doxygen-entry-point" value="Group_TWI"/>
+
+				<require idref="lufa.common"/>
+
+				<build type="c-source" value="Drivers/Peripheral/AVR8/TWI_AVR8.c"/>
+				<build type="header-file" value="Drivers/Peripheral/AVR8/TWI_AVR8.h"/>
+				<build type="include-path" value=".."/>
+				<build type="header-file" subtype="api" value="Drivers/Peripheral/TWI.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.peripheral.twi#xmega" caption="LUFA TWI Master Driver - XMEGA">
+				<device-support-alias value="lufa_xmega"/>
+
+				<build type="doxygen-entry-point" value="Group_TWI"/>
+
+				<require idref="lufa.common"/>
+
+				<build type="c-source" value="Drivers/Peripheral/XMEGA/TWI_XMEGA.c"/>
+				<build type="header-file" value="Drivers/Peripheral/XMEGA/TWI_XMEGA.h"/>
+				<build type="include-path" value=".."/>
+				<build type="header-file" subtype="api" value="Drivers/Peripheral/TWI.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.peripheral.twi#uc3" caption="LUFA TWI Master Driver - UC3">
+				<device-support-alias value="lufa_uc3"/>
+
+				<build type="doxygen-entry-point" value="Group_TWI"/>
+
+				<require idref="lufa.common"/>
+
+				<info type="gui-flag" value="hidden"/>
+			</module>
+		</select-by-device>
+
+		<select-by-device id="lufa.drivers.peripheral.adc" caption="LUFA ADC Driver">
+			<module type="driver" id="lufa.drivers.peripheral.adc#avr8" caption="LUFA ADC Driver - AVR8">
+				<device-support-alias value="lufa_avr8"/>
+
+				<build type="doxygen-entry-point" value="Group_ADC"/>
+
+				<require idref="lufa.common"/>
+
+				<build type="header-file" value="Drivers/Peripheral/AVR8/ADC_AVR8.h"/>
+				<build type="include-path" value=".."/>
+				<build type="header-file" subtype="api" value="Drivers/Peripheral/ADC.h"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.peripheral.adc#xmega" caption="LUFA ADC Driver - XMEGA">
+				<device-support-alias value="lufa_xmega"/>
+
+				<build type="doxygen-entry-point" value="Group_ADC"/>
+
+				<require idref="lufa.common"/>
+
+				<info type="gui-flag" value="hidden"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.peripheral.adc#uc3" caption="LUFA ADC Driver - UC3">
+				<device-support-alias value="lufa_uc3"/>
+
+				<build type="doxygen-entry-point" value="Group_ADC"/>
+
+				<require idref="lufa.common"/>
+
+				<info type="gui-flag" value="hidden"/>
+			</module>
+		</select-by-device>
+	</asf>
+</lufa>
diff --git a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_usb.xml b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_usb.xml
index 7ff4b39492..263c411dff 100644
--- a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_usb.xml
+++ b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_usb.xml
@@ -1,32 +1,32 @@
-<!--

-             LUFA Library

-     Copyright (C) Dean Camera, 2013.

-

-  dean [at] fourwalledcubicle [dot] com

-           www.lufa-lib.org

--->

-

-<!-- Atmel Studio framework integration file -->

-

-<lufa>

-	<asf>

-		<module type="driver" id="lufa.drivers.usb" caption="LUFA USB Driver">

-			<device-support-alias value="lufa_avr8"/>

-			<device-support-alias value="lufa_xmega"/>

-			<device-support-alias value="lufa_uc3"/>

-

-			<build type="doxygen-entry-point" value="Group_USB"/>

-

-			<build type="define" name="USE_LUFA_CONFIG_HEADER" value=""/>

-			<build type="module-config" subtype="path" value="CodeTemplates"/>

-			<build type="module-config" subtype="required-header-file" value="LUFAConfig.h"/>

-

-			<build type="include-path" value=".."/>

-			<build type="header-file" subtype="api" value="Drivers/USB/USB.h"/>

-

-			<require idref="lufa.common"/>

-			<require idref="lufa.drivers.usb.class"/>

-			<require idref="lufa.drivers.usb.core"/>

-		</module>

-	</asf>

+<!--
+             LUFA Library
+     Copyright (C) Dean Camera, 2013.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+-->
+
+<!-- Atmel Studio framework integration file -->
+
+<lufa>
+	<asf>
+		<module type="driver" id="lufa.drivers.usb" caption="LUFA USB Driver">
+			<device-support-alias value="lufa_avr8"/>
+			<device-support-alias value="lufa_xmega"/>
+			<device-support-alias value="lufa_uc3"/>
+
+			<build type="doxygen-entry-point" value="Group_USB"/>
+
+			<build type="define" name="USE_LUFA_CONFIG_HEADER" value=""/>
+			<build type="module-config" subtype="path" value="CodeTemplates"/>
+			<build type="module-config" subtype="required-header-file" value="LUFAConfig.h"/>
+
+			<build type="include-path" value=".."/>
+			<build type="header-file" subtype="api" value="Drivers/USB/USB.h"/>
+
+			<require idref="lufa.common"/>
+			<require idref="lufa.drivers.usb.class"/>
+			<require idref="lufa.drivers.usb.core"/>
+		</module>
+	</asf>
 </lufa>
\ No newline at end of file
diff --git a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_usb_class.xml b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_usb_class.xml
index cd18bf10e7..67ab760d33 100644
--- a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_usb_class.xml
+++ b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_usb_class.xml
@@ -1,32 +1,32 @@
-<!--

-             LUFA Library

-     Copyright (C) Dean Camera, 2013.

-

-  dean [at] fourwalledcubicle [dot] com

-           www.lufa-lib.org

--->

-

-<!-- Atmel Studio framework integration file -->

-

-<lufa>

-	<asf>

-		<module type="service" id="lufa.drivers.usb.class" caption="LUFA USB Class Drivers">

-			<device-support-alias value="lufa_avr8"/>

-			<device-support-alias value="lufa_xmega"/>

-			<device-support-alias value="lufa_uc3"/>

-

-			<info type="gui-flag" value="hidden"/>

-			<build type="doxygen-entry-point" value="Group_USBClassDrivers"/>

-

-			<require idref="lufa.drivers.usb.class.android"/>

-			<require idref="lufa.drivers.usb.class.audio"/>

-			<require idref="lufa.drivers.usb.class.cdc"/>

-			<require idref="lufa.drivers.usb.class.hid"/>

-			<require idref="lufa.drivers.usb.class.ms"/>

-			<require idref="lufa.drivers.usb.class.midi"/>

-			<require idref="lufa.drivers.usb.class.printer"/>

-			<require idref="lufa.drivers.usb.class.rndis"/>

-			<require idref="lufa.drivers.usb.class.si"/>

-		</module>

-	</asf>

-</lufa>

+<!--
+             LUFA Library
+     Copyright (C) Dean Camera, 2013.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+-->
+
+<!-- Atmel Studio framework integration file -->
+
+<lufa>
+	<asf>
+		<module type="service" id="lufa.drivers.usb.class" caption="LUFA USB Class Drivers">
+			<device-support-alias value="lufa_avr8"/>
+			<device-support-alias value="lufa_xmega"/>
+			<device-support-alias value="lufa_uc3"/>
+
+			<info type="gui-flag" value="hidden"/>
+			<build type="doxygen-entry-point" value="Group_USBClassDrivers"/>
+
+			<require idref="lufa.drivers.usb.class.android"/>
+			<require idref="lufa.drivers.usb.class.audio"/>
+			<require idref="lufa.drivers.usb.class.cdc"/>
+			<require idref="lufa.drivers.usb.class.hid"/>
+			<require idref="lufa.drivers.usb.class.ms"/>
+			<require idref="lufa.drivers.usb.class.midi"/>
+			<require idref="lufa.drivers.usb.class.printer"/>
+			<require idref="lufa.drivers.usb.class.rndis"/>
+			<require idref="lufa.drivers.usb.class.si"/>
+		</module>
+	</asf>
+</lufa>
diff --git a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_usb_core.xml b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_usb_core.xml
index 58f8917ef4..58a0b388f6 100644
--- a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_usb_core.xml
+++ b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_usb_core.xml
@@ -1,85 +1,85 @@
-<!--

-             LUFA Library

-     Copyright (C) Dean Camera, 2013.

-

-  dean [at] fourwalledcubicle [dot] com

-           www.lufa-lib.org

--->

-

-<!-- Atmel Studio framework integration file -->

-

-<lufa>

-	<asf>

-		<module type="driver" id="lufa.drivers.usb.core.common" caption="LUFA USB Core Driver - Common">

-			<device-support-alias value="lufa_avr8"/>

-			<device-support-alias value="lufa_xmega"/>

-			<device-support-alias value="lufa_uc3"/>

-

-			<build type="doxygen-entry-point" value="Group_USBManagement"/>

-

-			<info type="gui-flag" value="hidden"/>

-

-			<build type="header-file" value="Drivers/USB/Core/Device.h"/>

-			<build type="header-file" value="Drivers/USB/Core/Endpoint.h"/>

-			<build type="header-file" value="Drivers/USB/Core/Host.h"/>

-			<build type="header-file" value="Drivers/USB/Core/Pipe.h"/>

-			<build type="header-file" value="Drivers/USB/Core/OTG.h"/>

-			<build type="header-file" value="Drivers/USB/Core/USBController.h"/>

-			<build type="header-file" value="Drivers/USB/Core/USBInterrupt.h"/>

-			<build type="header-file" value="Drivers/USB/Core/EndpointStream.h"/>

-			<build type="header-file" value="Drivers/USB/Core/PipeStream.h"/>

-	        <build type="c-source"    value="Drivers/USB/Core/ConfigDescriptors.c"/>

-			<build type="header-file" value="Drivers/USB/Core/ConfigDescriptors.h"/>

-	        <build type="c-source"    value="Drivers/USB/Core/DeviceStandardReq.c"/>

-			<build type="header-file" value="Drivers/USB/Core/DeviceStandardReq.h"/>

-	        <build type="c-source"    value="Drivers/USB/Core/Events.c"/>

-			<build type="header-file" value="Drivers/USB/Core/Events.h"/>

-	        <build type="c-source"    value="Drivers/USB/Core/HostStandardReq.c"/>

-			<build type="header-file" value="Drivers/USB/Core/HostStandardReq.h"/>

-	        <build type="c-source"    value="Drivers/USB/Core/USBTask.c"/>

-			<build type="header-file" value="Drivers/USB/Core/USBTask.h"/>

-			<build type="header-file" value="Drivers/USB/Core/USBMode.h"/>

-			<build type="header-file" value="Drivers/USB/Core/StdDescriptors.h"/>

-			<build type="header-file" value="Drivers/USB/Core/StdRequestType.h"/>

-

-	        <build type="c-source"    value="Drivers/USB/Class/Common/HIDParser.c"/>

-	        <build type="header-file" value="Drivers/USB/Class/Common/HIDParser.h"/>

-	        <build type="header-file" value="Drivers/USB/Class/Common/HIDReportData.h"/>

-	    </module>

-

-		<select-by-device id="lufa.drivers.usb.core" caption="LUFA USB Core Driver">

-			<module type="driver" id="lufa.drivers.usb.core#avr8" caption="LUFA USB Core Driver - AVR8">

-				<device-support-alias value="lufa_avr8"/>

-

-				<info type="gui-flag" value="hidden"/>

-

-				<build type="doxygen-entry-point" value="Group_USBManagement_AVR8"/>

-

-				<require idref="lufa.drivers.usb.core.common"/>

-				<require idref="lufa.drivers.usb.core.avr8"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.usb.core#xmega" caption="LUFA USB Core Driver - XMEGA">

-				<device-support-alias value="lufa_xmega"/>

-

-				<info type="gui-flag" value="hidden"/>

-

-				<build type="doxygen-entry-point" value="Group_USBManagement_XMEGA"/>

-

-				<require idref="lufa.drivers.usb.core.common"/>

-				<require idref="lufa.drivers.usb.core.xmega"/>

-			</module>

-

-			<module type="driver" id="lufa.drivers.usb.core#uc3" caption="LUFA USB Core Driver - UC3">

-				<device-support-alias value="lufa_uc3"/>

-

-				<info type="gui-flag" value="hidden"/>

-

-				<build type="doxygen-entry-point" value="Group_USBManagement_UC3"/>

-

-				<require idref="lufa.drivers.usb.core.common"/>

-				<require idref="lufa.drivers.usb.core.uc3"/>

-			</module>

-		</select-by-device>

-	</asf>

-</lufa>

+<!--
+             LUFA Library
+     Copyright (C) Dean Camera, 2013.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+-->
+
+<!-- Atmel Studio framework integration file -->
+
+<lufa>
+	<asf>
+		<module type="driver" id="lufa.drivers.usb.core.common" caption="LUFA USB Core Driver - Common">
+			<device-support-alias value="lufa_avr8"/>
+			<device-support-alias value="lufa_xmega"/>
+			<device-support-alias value="lufa_uc3"/>
+
+			<build type="doxygen-entry-point" value="Group_USBManagement"/>
+
+			<info type="gui-flag" value="hidden"/>
+
+			<build type="header-file" value="Drivers/USB/Core/Device.h"/>
+			<build type="header-file" value="Drivers/USB/Core/Endpoint.h"/>
+			<build type="header-file" value="Drivers/USB/Core/Host.h"/>
+			<build type="header-file" value="Drivers/USB/Core/Pipe.h"/>
+			<build type="header-file" value="Drivers/USB/Core/OTG.h"/>
+			<build type="header-file" value="Drivers/USB/Core/USBController.h"/>
+			<build type="header-file" value="Drivers/USB/Core/USBInterrupt.h"/>
+			<build type="header-file" value="Drivers/USB/Core/EndpointStream.h"/>
+			<build type="header-file" value="Drivers/USB/Core/PipeStream.h"/>
+	        <build type="c-source"    value="Drivers/USB/Core/ConfigDescriptors.c"/>
+			<build type="header-file" value="Drivers/USB/Core/ConfigDescriptors.h"/>
+	        <build type="c-source"    value="Drivers/USB/Core/DeviceStandardReq.c"/>
+			<build type="header-file" value="Drivers/USB/Core/DeviceStandardReq.h"/>
+	        <build type="c-source"    value="Drivers/USB/Core/Events.c"/>
+			<build type="header-file" value="Drivers/USB/Core/Events.h"/>
+	        <build type="c-source"    value="Drivers/USB/Core/HostStandardReq.c"/>
+			<build type="header-file" value="Drivers/USB/Core/HostStandardReq.h"/>
+	        <build type="c-source"    value="Drivers/USB/Core/USBTask.c"/>
+			<build type="header-file" value="Drivers/USB/Core/USBTask.h"/>
+			<build type="header-file" value="Drivers/USB/Core/USBMode.h"/>
+			<build type="header-file" value="Drivers/USB/Core/StdDescriptors.h"/>
+			<build type="header-file" value="Drivers/USB/Core/StdRequestType.h"/>
+
+	        <build type="c-source"    value="Drivers/USB/Class/Common/HIDParser.c"/>
+	        <build type="header-file" value="Drivers/USB/Class/Common/HIDParser.h"/>
+	        <build type="header-file" value="Drivers/USB/Class/Common/HIDReportData.h"/>
+	    </module>
+
+		<select-by-device id="lufa.drivers.usb.core" caption="LUFA USB Core Driver">
+			<module type="driver" id="lufa.drivers.usb.core#avr8" caption="LUFA USB Core Driver - AVR8">
+				<device-support-alias value="lufa_avr8"/>
+
+				<info type="gui-flag" value="hidden"/>
+
+				<build type="doxygen-entry-point" value="Group_USBManagement_AVR8"/>
+
+				<require idref="lufa.drivers.usb.core.common"/>
+				<require idref="lufa.drivers.usb.core.avr8"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.usb.core#xmega" caption="LUFA USB Core Driver - XMEGA">
+				<device-support-alias value="lufa_xmega"/>
+
+				<info type="gui-flag" value="hidden"/>
+
+				<build type="doxygen-entry-point" value="Group_USBManagement_XMEGA"/>
+
+				<require idref="lufa.drivers.usb.core.common"/>
+				<require idref="lufa.drivers.usb.core.xmega"/>
+			</module>
+
+			<module type="driver" id="lufa.drivers.usb.core#uc3" caption="LUFA USB Core Driver - UC3">
+				<device-support-alias value="lufa_uc3"/>
+
+				<info type="gui-flag" value="hidden"/>
+
+				<build type="doxygen-entry-point" value="Group_USBManagement_UC3"/>
+
+				<require idref="lufa.drivers.usb.core.common"/>
+				<require idref="lufa.drivers.usb.core.uc3"/>
+			</module>
+		</select-by-device>
+	</asf>
+</lufa>
diff --git a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_usb_core_avr8.xml b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_usb_core_avr8.xml
index 166b9257aa..4688f05f91 100644
--- a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_usb_core_avr8.xml
+++ b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_usb_core_avr8.xml
@@ -1,43 +1,43 @@
-<!--

-             LUFA Library

-     Copyright (C) Dean Camera, 2013.

-

-  dean [at] fourwalledcubicle [dot] com

-           www.lufa-lib.org

--->

-

-<!-- Atmel Studio framework integration file -->

-

-<lufa>

-	<asf>

-		<module type="driver" id="lufa.drivers.usb.core.avr8" caption="LUFA USB Core Driver for AVR8">

-			<device-support-alias value="lufa_avr8"/>

-

-			<info type="gui-flag" value="hidden"/>

-

-			<build type="doxygen-entry-point" value="Group_USBManagement_AVR8"/>

-

-			<build type="c-source"    value="Drivers/USB/Core/AVR8/Template/Template_Endpoint_Control_R.c"/>

-			<build type="c-source"    value="Drivers/USB/Core/AVR8/Template/Template_Endpoint_Control_W.c"/>

-			<build type="c-source"    value="Drivers/USB/Core/AVR8/Template/Template_Endpoint_RW.c"/>

-			<build type="c-source"    value="Drivers/USB/Core/AVR8/Template/Template_Pipe_RW.c"/>

-			<build type="c-source"    value="Drivers/USB/Core/AVR8/Device_AVR8.c"/>

-			<build type="header-file" value="Drivers/USB/Core/AVR8/Device_AVR8.h"/>

-			<build type="c-source"    value="Drivers/USB/Core/AVR8/Endpoint_AVR8.c"/>

-			<build type="header-file" value="Drivers/USB/Core/AVR8/Endpoint_AVR8.h"/>

-			<build type="c-source"    value="Drivers/USB/Core/AVR8/Host_AVR8.c"/>

-			<build type="header-file" value="Drivers/USB/Core/AVR8/Host_AVR8.h"/>

-			<build type="c-source"    value="Drivers/USB/Core/AVR8/Pipe_AVR8.c"/>

-			<build type="header-file" value="Drivers/USB/Core/AVR8/Pipe_AVR8.h"/>

-			<build type="header-file" value="Drivers/USB/Core/AVR8/OTG_AVR8.h"/>

-			<build type="c-source"    value="Drivers/USB/Core/AVR8/USBController_AVR8.c"/>

-			<build type="header-file" value="Drivers/USB/Core/AVR8/USBController_AVR8.h"/>

-			<build type="c-source"    value="Drivers/USB/Core/AVR8/USBInterrupt_AVR8.c"/>

-			<build type="header-file" value="Drivers/USB/Core/AVR8/USBInterrupt_AVR8.h"/>

-			<build type="c-source"    value="Drivers/USB/Core/AVR8/EndpointStream_AVR8.c"/>

-			<build type="header-file" value="Drivers/USB/Core/AVR8/EndpointStream_AVR8.h"/>

-			<build type="c-source"    value="Drivers/USB/Core/AVR8/PipeStream_AVR8.c"/>

-			<build type="header-file" value="Drivers/USB/Core/AVR8/PipeStream_AVR8.h"/>

-		</module>

-	</asf>

-</lufa>

+<!--
+             LUFA Library
+     Copyright (C) Dean Camera, 2013.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+-->
+
+<!-- Atmel Studio framework integration file -->
+
+<lufa>
+	<asf>
+		<module type="driver" id="lufa.drivers.usb.core.avr8" caption="LUFA USB Core Driver for AVR8">
+			<device-support-alias value="lufa_avr8"/>
+
+			<info type="gui-flag" value="hidden"/>
+
+			<build type="doxygen-entry-point" value="Group_USBManagement_AVR8"/>
+
+			<build type="c-source"    value="Drivers/USB/Core/AVR8/Template/Template_Endpoint_Control_R.c"/>
+			<build type="c-source"    value="Drivers/USB/Core/AVR8/Template/Template_Endpoint_Control_W.c"/>
+			<build type="c-source"    value="Drivers/USB/Core/AVR8/Template/Template_Endpoint_RW.c"/>
+			<build type="c-source"    value="Drivers/USB/Core/AVR8/Template/Template_Pipe_RW.c"/>
+			<build type="c-source"    value="Drivers/USB/Core/AVR8/Device_AVR8.c"/>
+			<build type="header-file" value="Drivers/USB/Core/AVR8/Device_AVR8.h"/>
+			<build type="c-source"    value="Drivers/USB/Core/AVR8/Endpoint_AVR8.c"/>
+			<build type="header-file" value="Drivers/USB/Core/AVR8/Endpoint_AVR8.h"/>
+			<build type="c-source"    value="Drivers/USB/Core/AVR8/Host_AVR8.c"/>
+			<build type="header-file" value="Drivers/USB/Core/AVR8/Host_AVR8.h"/>
+			<build type="c-source"    value="Drivers/USB/Core/AVR8/Pipe_AVR8.c"/>
+			<build type="header-file" value="Drivers/USB/Core/AVR8/Pipe_AVR8.h"/>
+			<build type="header-file" value="Drivers/USB/Core/AVR8/OTG_AVR8.h"/>
+			<build type="c-source"    value="Drivers/USB/Core/AVR8/USBController_AVR8.c"/>
+			<build type="header-file" value="Drivers/USB/Core/AVR8/USBController_AVR8.h"/>
+			<build type="c-source"    value="Drivers/USB/Core/AVR8/USBInterrupt_AVR8.c"/>
+			<build type="header-file" value="Drivers/USB/Core/AVR8/USBInterrupt_AVR8.h"/>
+			<build type="c-source"    value="Drivers/USB/Core/AVR8/EndpointStream_AVR8.c"/>
+			<build type="header-file" value="Drivers/USB/Core/AVR8/EndpointStream_AVR8.h"/>
+			<build type="c-source"    value="Drivers/USB/Core/AVR8/PipeStream_AVR8.c"/>
+			<build type="header-file" value="Drivers/USB/Core/AVR8/PipeStream_AVR8.h"/>
+		</module>
+	</asf>
+</lufa>
diff --git a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_usb_core_uc3.xml b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_usb_core_uc3.xml
index 7e0540cda7..2e7185f24a 100644
--- a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_usb_core_uc3.xml
+++ b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_usb_core_uc3.xml
@@ -1,42 +1,42 @@
-<!--

-             LUFA Library

-     Copyright (C) Dean Camera, 2013.

-

-  dean [at] fourwalledcubicle [dot] com

-           www.lufa-lib.org

--->

-

-<!-- Atmel Studio framework integration file -->

-

-<lufa>

-	<asf>

-		<module type="driver" id="lufa.drivers.usb.core.uc3" caption="LUFA USB Core Driver for UC3">

-			<device-support-alias value="lufa_uc3"/>

-

-			<info type="gui-flag" value="hidden"/>

-

-			<build type="doxygen-entry-point" value="Group_USBManagement_UC3"/>

-

-			<build type="c-source"    value="Drivers/USB/Core/UC3/Template/Template_Endpoint_Control_R.c"/>

-			<build type="c-source"    value="Drivers/USB/Core/UC3/Template/Template_Endpoint_Control_W.c"/>

-			<build type="c-source"    value="Drivers/USB/Core/UC3/Template/Template_Endpoint_RW.c"/>

-			<build type="c-source"    value="Drivers/USB/Core/UC3/Template/Template_Pipe_RW.c"/>

-			<build type="c-source"    value="Drivers/USB/Core/UC3/Device_UC3.c"/>

-			<build type="header-file" value="Drivers/USB/Core/UC3/Device_UC3.h"/>

-			<build type="c-source"    value="Drivers/USB/Core/UC3/Endpoint_UC3.c"/>

-			<build type="header-file" value="Drivers/USB/Core/UC3/Endpoint_UC3.h"/>

-			<build type="c-source"    value="Drivers/USB/Core/UC3/Host_UC3.c"/>

-			<build type="header-file" value="Drivers/USB/Core/UC3/Host_UC3.h"/>

-			<build type="c-source"    value="Drivers/USB/Core/UC3/Pipe_UC3.c"/>

-			<build type="header-file" value="Drivers/USB/Core/UC3/Pipe_UC3.h"/>

-			<build type="c-source"    value="Drivers/USB/Core/UC3/USBController_UC3.c"/>

-			<build type="header-file" value="Drivers/USB/Core/UC3/USBController_UC3.h"/>

-			<build type="c-source"    value="Drivers/USB/Core/UC3/USBInterrupt_UC3.c"/>

-			<build type="header-file" value="Drivers/USB/Core/UC3/USBInterrupt_UC3.h"/>

-			<build type="c-source"    value="Drivers/USB/Core/UC3/EndpointStream_UC3.c"/>

-			<build type="header-file" value="Drivers/USB/Core/UC3/EndpointStream_UC3.h"/>

-			<build type="c-source"    value="Drivers/USB/Core/UC3/PipeStream_UC3.c"/>

-			<build type="header-file" value="Drivers/USB/Core/UC3/PipeStream_UC3.h"/>

-		</module>

-	</asf>

-</lufa>

+<!--
+             LUFA Library
+     Copyright (C) Dean Camera, 2013.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+-->
+
+<!-- Atmel Studio framework integration file -->
+
+<lufa>
+	<asf>
+		<module type="driver" id="lufa.drivers.usb.core.uc3" caption="LUFA USB Core Driver for UC3">
+			<device-support-alias value="lufa_uc3"/>
+
+			<info type="gui-flag" value="hidden"/>
+
+			<build type="doxygen-entry-point" value="Group_USBManagement_UC3"/>
+
+			<build type="c-source"    value="Drivers/USB/Core/UC3/Template/Template_Endpoint_Control_R.c"/>
+			<build type="c-source"    value="Drivers/USB/Core/UC3/Template/Template_Endpoint_Control_W.c"/>
+			<build type="c-source"    value="Drivers/USB/Core/UC3/Template/Template_Endpoint_RW.c"/>
+			<build type="c-source"    value="Drivers/USB/Core/UC3/Template/Template_Pipe_RW.c"/>
+			<build type="c-source"    value="Drivers/USB/Core/UC3/Device_UC3.c"/>
+			<build type="header-file" value="Drivers/USB/Core/UC3/Device_UC3.h"/>
+			<build type="c-source"    value="Drivers/USB/Core/UC3/Endpoint_UC3.c"/>
+			<build type="header-file" value="Drivers/USB/Core/UC3/Endpoint_UC3.h"/>
+			<build type="c-source"    value="Drivers/USB/Core/UC3/Host_UC3.c"/>
+			<build type="header-file" value="Drivers/USB/Core/UC3/Host_UC3.h"/>
+			<build type="c-source"    value="Drivers/USB/Core/UC3/Pipe_UC3.c"/>
+			<build type="header-file" value="Drivers/USB/Core/UC3/Pipe_UC3.h"/>
+			<build type="c-source"    value="Drivers/USB/Core/UC3/USBController_UC3.c"/>
+			<build type="header-file" value="Drivers/USB/Core/UC3/USBController_UC3.h"/>
+			<build type="c-source"    value="Drivers/USB/Core/UC3/USBInterrupt_UC3.c"/>
+			<build type="header-file" value="Drivers/USB/Core/UC3/USBInterrupt_UC3.h"/>
+			<build type="c-source"    value="Drivers/USB/Core/UC3/EndpointStream_UC3.c"/>
+			<build type="header-file" value="Drivers/USB/Core/UC3/EndpointStream_UC3.h"/>
+			<build type="c-source"    value="Drivers/USB/Core/UC3/PipeStream_UC3.c"/>
+			<build type="header-file" value="Drivers/USB/Core/UC3/PipeStream_UC3.h"/>
+		</module>
+	</asf>
+</lufa>
diff --git a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_usb_core_xmega.xml b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_usb_core_xmega.xml
index 9e9f4f6a1d..c79a0f5b52 100644
--- a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_usb_core_xmega.xml
+++ b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_drivers_usb_core_xmega.xml
@@ -1,36 +1,36 @@
-<!--

-             LUFA Library

-     Copyright (C) Dean Camera, 2013.

-

-  dean [at] fourwalledcubicle [dot] com

-           www.lufa-lib.org

--->

-

-<!-- Atmel Studio framework integration file -->

-

-<lufa>

-	<asf>

-		<module type="driver" id="lufa.drivers.usb.core.xmega" caption="LUFA USB Core Driver for XMEGA">

-			<device-support-alias value="lufa_xmega"/>

-

-			<info type="gui-flag" value="hidden"/>

-

-			<build type="doxygen-entry-point" value="Group_USBManagement_XMEGA"/>

-

-			<build type="c-source"    value="Drivers/USB/Core/XMEGA/Template/Template_Endpoint_Control_R.c"/>

-			<build type="c-source"    value="Drivers/USB/Core/XMEGA/Template/Template_Endpoint_Control_W.c"/>

-			<build type="c-source"    value="Drivers/USB/Core/XMEGA/Template/Template_Endpoint_RW.c"/>

-			<build type="c-source"    value="Drivers/USB/Core/XMEGA/Device_XMEGA.c"/>

-			<build type="header-file" value="Drivers/USB/Core/XMEGA/Device_XMEGA.h"/>

-			<build type="c-source"    value="Drivers/USB/Core/XMEGA/Endpoint_XMEGA.c"/>

-			<build type="header-file" value="Drivers/USB/Core/XMEGA/Endpoint_XMEGA.h"/>

-			<build type="c-source"    value="Drivers/USB/Core/XMEGA/Pipe_XMEGA.c"/>

-			<build type="c-source"    value="Drivers/USB/Core/XMEGA/USBController_XMEGA.c"/>

-			<build type="header-file" value="Drivers/USB/Core/XMEGA/USBController_XMEGA.h"/>

-			<build type="c-source"    value="Drivers/USB/Core/XMEGA/USBInterrupt_XMEGA.c"/>

-			<build type="header-file" value="Drivers/USB/Core/XMEGA/USBInterrupt_XMEGA.h"/>

-			<build type="c-source"    value="Drivers/USB/Core/XMEGA/EndpointStream_XMEGA.c"/>

-			<build type="header-file" value="Drivers/USB/Core/XMEGA/EndpointStream_XMEGA.h"/>

-		</module>

-	</asf>

-</lufa>

+<!--
+             LUFA Library
+     Copyright (C) Dean Camera, 2013.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+-->
+
+<!-- Atmel Studio framework integration file -->
+
+<lufa>
+	<asf>
+		<module type="driver" id="lufa.drivers.usb.core.xmega" caption="LUFA USB Core Driver for XMEGA">
+			<device-support-alias value="lufa_xmega"/>
+
+			<info type="gui-flag" value="hidden"/>
+
+			<build type="doxygen-entry-point" value="Group_USBManagement_XMEGA"/>
+
+			<build type="c-source"    value="Drivers/USB/Core/XMEGA/Template/Template_Endpoint_Control_R.c"/>
+			<build type="c-source"    value="Drivers/USB/Core/XMEGA/Template/Template_Endpoint_Control_W.c"/>
+			<build type="c-source"    value="Drivers/USB/Core/XMEGA/Template/Template_Endpoint_RW.c"/>
+			<build type="c-source"    value="Drivers/USB/Core/XMEGA/Device_XMEGA.c"/>
+			<build type="header-file" value="Drivers/USB/Core/XMEGA/Device_XMEGA.h"/>
+			<build type="c-source"    value="Drivers/USB/Core/XMEGA/Endpoint_XMEGA.c"/>
+			<build type="header-file" value="Drivers/USB/Core/XMEGA/Endpoint_XMEGA.h"/>
+			<build type="c-source"    value="Drivers/USB/Core/XMEGA/Pipe_XMEGA.c"/>
+			<build type="c-source"    value="Drivers/USB/Core/XMEGA/USBController_XMEGA.c"/>
+			<build type="header-file" value="Drivers/USB/Core/XMEGA/USBController_XMEGA.h"/>
+			<build type="c-source"    value="Drivers/USB/Core/XMEGA/USBInterrupt_XMEGA.c"/>
+			<build type="header-file" value="Drivers/USB/Core/XMEGA/USBInterrupt_XMEGA.h"/>
+			<build type="c-source"    value="Drivers/USB/Core/XMEGA/EndpointStream_XMEGA.c"/>
+			<build type="header-file" value="Drivers/USB/Core/XMEGA/EndpointStream_XMEGA.h"/>
+		</module>
+	</asf>
+</lufa>
diff --git a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_platform.xml b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_platform.xml
index 02c7463ee5..4ee51f6ee0 100644
--- a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_platform.xml
+++ b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_platform.xml
@@ -1,60 +1,60 @@
-<!--

-             LUFA Library

-     Copyright (C) Dean Camera, 2013.

-

-  dean [at] fourwalledcubicle [dot] com

-           www.lufa-lib.org

--->

-

-<!-- Atmel Studio framework integration file -->

-

-<lufa>

-	<asf>

-		<select-by-device id="lufa.platform" caption="LUFA Platform Specific Support">

-			<module type="service" id="lufa.platform#avr8" caption="LUFA Platform Specific Support - AVR8">

-				<device-support-alias value="lufa_avr8"/>

-

-				<build type="define" name="ARCH" value="ARCH_AVR8"/>

-

-				<build type="doxygen-entry-point" value="Group_PlatformDrivers"/>

-

-				<build type="include-path" value=".."/>

-				<build type="header-file" subtype="api" value="Platform/Platform.h"/>

-

-				<require idref="lufa.common"/>

-			</module>

-

-			<module type="service" id="lufa.platform#xmega" caption="LUFA Platform Specific Support - XMEGA">

-				<device-support-alias value="lufa_xmega"/>

-

-				<build type="define" name="ARCH" value="ARCH_XMEGA"/>

-

-				<build type="doxygen-entry-point" value="Group_PlatformDrivers"/>

-

-				<build type="include-path" value=".."/>

-				<build type="header-file" subtype="api" value="Platform/Platform.h"/>

-

-				<build type="distribute" value="Platform/XMEGA/XMEGAExperimentalInfo.txt" subtype="license"/>

-

-				<require idref="lufa.platform.xmega"/>

-				<require idref="lufa.common"/>

-			</module>

-

-			<module type="service" id="lufa.platform#uc3" caption="LUFA Platform Specific Support - UC3">

-				<device-support-alias value="lufa_uc3"/>

-

-				<build type="define" name="ARCH" value="ARCH_UC3"/>

-

-				<build type="doxygen-entry-point" value="Group_PlatformDrivers"/>

-

-				<build type="include-path" value=".."/>

-				<build type="header-file" subtype="api" value="Platform/Platform.h"/>

-

-				<build type="distribute" value="Platform/UC3/UC3ExperimentalInfo.txt" subtype="license"/>

-

-				<require idref="lufa.platform.uc3"/>

-				<require idref="lufa.common"/>

-			</module>

-		</select-by-device>

-	</asf>

-</lufa>

+<!--
+             LUFA Library
+     Copyright (C) Dean Camera, 2013.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+-->
+
+<!-- Atmel Studio framework integration file -->
+
+<lufa>
+	<asf>
+		<select-by-device id="lufa.platform" caption="LUFA Platform Specific Support">
+			<module type="service" id="lufa.platform#avr8" caption="LUFA Platform Specific Support - AVR8">
+				<device-support-alias value="lufa_avr8"/>
+
+				<build type="define" name="ARCH" value="ARCH_AVR8"/>
+
+				<build type="doxygen-entry-point" value="Group_PlatformDrivers"/>
+
+				<build type="include-path" value=".."/>
+				<build type="header-file" subtype="api" value="Platform/Platform.h"/>
+
+				<require idref="lufa.common"/>
+			</module>
+
+			<module type="service" id="lufa.platform#xmega" caption="LUFA Platform Specific Support - XMEGA">
+				<device-support-alias value="lufa_xmega"/>
+
+				<build type="define" name="ARCH" value="ARCH_XMEGA"/>
+
+				<build type="doxygen-entry-point" value="Group_PlatformDrivers"/>
+
+				<build type="include-path" value=".."/>
+				<build type="header-file" subtype="api" value="Platform/Platform.h"/>
+
+				<build type="distribute" value="Platform/XMEGA/XMEGAExperimentalInfo.txt" subtype="license"/>
+
+				<require idref="lufa.platform.xmega"/>
+				<require idref="lufa.common"/>
+			</module>
+
+			<module type="service" id="lufa.platform#uc3" caption="LUFA Platform Specific Support - UC3">
+				<device-support-alias value="lufa_uc3"/>
+
+				<build type="define" name="ARCH" value="ARCH_UC3"/>
+
+				<build type="doxygen-entry-point" value="Group_PlatformDrivers"/>
+
+				<build type="include-path" value=".."/>
+				<build type="header-file" subtype="api" value="Platform/Platform.h"/>
+
+				<build type="distribute" value="Platform/UC3/UC3ExperimentalInfo.txt" subtype="license"/>
+
+				<require idref="lufa.platform.uc3"/>
+				<require idref="lufa.common"/>
+			</module>
+		</select-by-device>
+	</asf>
+</lufa>
diff --git a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_platform_uc3.xml b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_platform_uc3.xml
index a488c4b83d..98017b08ad 100644
--- a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_platform_uc3.xml
+++ b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_platform_uc3.xml
@@ -1,26 +1,26 @@
-<!--

-             LUFA Library

-     Copyright (C) Dean Camera, 2013.

-

-  dean [at] fourwalledcubicle [dot] com

-           www.lufa-lib.org

--->

-

-<!-- Atmel Studio framework integration file -->

-

-<lufa>

-	<asf>

-		<module type="driver" id="lufa.platform.uc3" caption="LUFA UC3 Platform Drivers">

-			<device-support-alias value="lufa_uc3"/>

-

-			<info type="gui-flag" value="hidden"/>

-

-			<build type="doxygen-entry-point" value="Group_PlatformDrivers_UC3"/>

-

-			<build type="header-file" value="Platform/UC3/ClockManagement.h"/>

-			<build type="header-file" value="Platform/UC3/InterruptManagement.h"/>

-			<build type="c-source" value="Platform/UC3/InterruptManagement.c"/>

-			<build type="asm-source" value="Platform/UC3/Exception.S"/>

-		</module>

-	</asf>

-</lufa>

+<!--
+             LUFA Library
+     Copyright (C) Dean Camera, 2013.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+-->
+
+<!-- Atmel Studio framework integration file -->
+
+<lufa>
+	<asf>
+		<module type="driver" id="lufa.platform.uc3" caption="LUFA UC3 Platform Drivers">
+			<device-support-alias value="lufa_uc3"/>
+
+			<info type="gui-flag" value="hidden"/>
+
+			<build type="doxygen-entry-point" value="Group_PlatformDrivers_UC3"/>
+
+			<build type="header-file" value="Platform/UC3/ClockManagement.h"/>
+			<build type="header-file" value="Platform/UC3/InterruptManagement.h"/>
+			<build type="c-source" value="Platform/UC3/InterruptManagement.c"/>
+			<build type="asm-source" value="Platform/UC3/Exception.S"/>
+		</module>
+	</asf>
+</lufa>
diff --git a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_platform_xmega.xml b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_platform_xmega.xml
index 1674a77b02..e613fe5206 100644
--- a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_platform_xmega.xml
+++ b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_platform_xmega.xml
@@ -1,23 +1,23 @@
-<!--

-             LUFA Library

-     Copyright (C) Dean Camera, 2013.

-

-  dean [at] fourwalledcubicle [dot] com

-           www.lufa-lib.org

--->

-

-<!-- Atmel Studio framework integration file -->

-

-<lufa>

-	<asf xmlversion="1.0">

-		<module type="driver" id="lufa.platform.xmega" caption="LUFA XMEGA Platform Drivers">

-			<device-support-alias value="lufa_xmega"/>

-

-			<info type="gui-flag" value="hidden"/>

-

-			<build type="doxygen-entry-point" value="Group_PlatformDrivers_XMEGA"/>

-

-			<build type="header-file" value="Platform/XMEGA/ClockManagement.h"/>

-		</module>

-	</asf>

-</lufa>

+<!--
+             LUFA Library
+     Copyright (C) Dean Camera, 2013.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+-->
+
+<!-- Atmel Studio framework integration file -->
+
+<lufa>
+	<asf xmlversion="1.0">
+		<module type="driver" id="lufa.platform.xmega" caption="LUFA XMEGA Platform Drivers">
+			<device-support-alias value="lufa_xmega"/>
+
+			<info type="gui-flag" value="hidden"/>
+
+			<build type="doxygen-entry-point" value="Group_PlatformDrivers_XMEGA"/>
+
+			<build type="header-file" value="Platform/XMEGA/ClockManagement.h"/>
+		</module>
+	</asf>
+</lufa>
diff --git a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_toolchain.xml b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_toolchain.xml
index 031c8a2be6..a76b6d0d3b 100644
--- a/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_toolchain.xml
+++ b/tmk_core/protocol/lufa/LUFA-git/LUFA/StudioIntegration/lufa_toolchain.xml
@@ -1,43 +1,43 @@
-<!--

-             LUFA Library

-     Copyright (C) Dean Camera, 2013.

-

-  dean [at] fourwalledcubicle [dot] com

-           www.lufa-lib.org

--->

-

-<!-- Atmel Studio framework integration file -->

-

-<lufa>

-	<asf>

-		<select-by-device id="common.utils.toolchain_config" caption="Toolchain configuration defaults">

-			<module type="build-specific" id="common.utils.toolchain_config#avr" caption="Toolchain configuration defaults for 8-bit AVR">

-				<info type="gui-flag" value="hidden"/>

-				<device-support value="avr"/>

-

-				<toolchain-config name="avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned" value="True" toolchain="avrgcc"/>

-				<toolchain-config name="avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned" value="True" toolchain="avrgcc"/>

-				<toolchain-config name="avrgcc.compiler.optimization.OtherFlags" value="-fdata-sections" toolchain="avrgcc"/>

-				<toolchain-config name="avrgcc.compiler.optimization.PrepareFunctionsForGarbageCollection" value="True" toolchain="avrgcc"/>

-				<toolchain-config name="avrgcc.compiler.warnings.AllWarnings" value="True" toolchain="avrgcc"/>

-				<toolchain-config name="avrgcc.compiler.miscellaneous.OtherFlags" value="-mrelax -std=gnu99 -fno-strict-aliasing -fno-jump-tables" toolchain="avrgcc"/>

-				<toolchain-config name="avrgcc.linker.optimization.GarbageCollectUnusedSections" value="True" toolchain="avrgcc"/>

-				<toolchain-config name="avrgcc.linker.optimization.RelaxBranches" value="True" toolchain="avrgcc"/>

-			</module>

-		</select-by-device>

-

-		<module type="build-specific" id="common.utils.toolchain_config#uc3" caption="Toolchain configuration defaults for 32-bit AVR">

-			<info type="gui-flag" value="hidden"/>

-			<device-support value="uc3"/>

-

-			<toolchain-config name="avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned" value="True" toolchain="avr32gcc"/>

-			<toolchain-config name="avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned" value="True" toolchain="avr32gcc"/>

-			<toolchain-config name="avr32gcc.compiler.optimization.OtherFlags" value="-fdata-sections" toolchain="avr32gcc"/>

-			<toolchain-config name="avr32gcc.compiler.optimization.PrepareFunctionsForGarbageCollection" value="True" toolchain="avr32gcc"/>

-			<toolchain-config name="avr32gcc.compiler.warnings.AllWarnings" value="True" toolchain="avr32gcc"/>

-			<toolchain-config name="avr32gcc.compiler.miscellaneous.OtherFlags" value="-mrelax -std=gnu99 -fno-strict-aliasing -mno-cond-exec-before-reload" toolchain="avr32gcc"/>

-			<toolchain-config name="avr32gcc.linker.optimization.GarbageCollectUnusedSections" value="True" toolchain="avr32gcc"/>

-			<toolchain-config name="avr32gcc.linker.optimization.RelaxBranches" value="True" toolchain="avr32gcc"/>

-		</module>

-	</asf>

-</lufa>

+<!--
+             LUFA Library
+     Copyright (C) Dean Camera, 2013.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+-->
+
+<!-- Atmel Studio framework integration file -->
+
+<lufa>
+	<asf>
+		<select-by-device id="common.utils.toolchain_config" caption="Toolchain configuration defaults">
+			<module type="build-specific" id="common.utils.toolchain_config#avr" caption="Toolchain configuration defaults for 8-bit AVR">
+				<info type="gui-flag" value="hidden"/>
+				<device-support value="avr"/>
+
+				<toolchain-config name="avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned" value="True" toolchain="avrgcc"/>
+				<toolchain-config name="avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned" value="True" toolchain="avrgcc"/>
+				<toolchain-config name="avrgcc.compiler.optimization.OtherFlags" value="-fdata-sections" toolchain="avrgcc"/>
+				<toolchain-config name="avrgcc.compiler.optimization.PrepareFunctionsForGarbageCollection" value="True" toolchain="avrgcc"/>
+				<toolchain-config name="avrgcc.compiler.warnings.AllWarnings" value="True" toolchain="avrgcc"/>
+				<toolchain-config name="avrgcc.compiler.miscellaneous.OtherFlags" value="-mrelax -std=gnu99 -fno-strict-aliasing -fno-jump-tables" toolchain="avrgcc"/>
+				<toolchain-config name="avrgcc.linker.optimization.GarbageCollectUnusedSections" value="True" toolchain="avrgcc"/>
+				<toolchain-config name="avrgcc.linker.optimization.RelaxBranches" value="True" toolchain="avrgcc"/>
+			</module>
+		</select-by-device>
+
+		<module type="build-specific" id="common.utils.toolchain_config#uc3" caption="Toolchain configuration defaults for 32-bit AVR">
+			<info type="gui-flag" value="hidden"/>
+			<device-support value="uc3"/>
+
+			<toolchain-config name="avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned" value="True" toolchain="avr32gcc"/>
+			<toolchain-config name="avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned" value="True" toolchain="avr32gcc"/>
+			<toolchain-config name="avr32gcc.compiler.optimization.OtherFlags" value="-fdata-sections" toolchain="avr32gcc"/>
+			<toolchain-config name="avr32gcc.compiler.optimization.PrepareFunctionsForGarbageCollection" value="True" toolchain="avr32gcc"/>
+			<toolchain-config name="avr32gcc.compiler.warnings.AllWarnings" value="True" toolchain="avr32gcc"/>
+			<toolchain-config name="avr32gcc.compiler.miscellaneous.OtherFlags" value="-mrelax -std=gnu99 -fno-strict-aliasing -mno-cond-exec-before-reload" toolchain="avr32gcc"/>
+			<toolchain-config name="avr32gcc.linker.optimization.GarbageCollectUnusedSections" value="True" toolchain="avr32gcc"/>
+			<toolchain-config name="avr32gcc.linker.optimization.RelaxBranches" value="True" toolchain="avr32gcc"/>
+		</module>
+	</asf>
+</lufa>
diff --git a/tmk_core/protocol/lufa/adafruit_ble.cpp b/tmk_core/protocol/lufa/adafruit_ble.cpp
new file mode 100644
index 0000000000..fd6edd42cf
--- /dev/null
+++ b/tmk_core/protocol/lufa/adafruit_ble.cpp
@@ -0,0 +1,805 @@
+#include "adafruit_ble.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <alloca.h>
+#include <util/delay.h>
+#include <util/atomic.h>
+#include "debug.h"
+#include "pincontrol.h"
+#include "timer.h"
+#include "action_util.h"
+#include "ringbuffer.hpp"
+#include <string.h>
+
+// These are the pin assignments for the 32u4 boards.
+// You may define them to something else in your config.h
+// if yours is wired up differently.
+#ifndef AdafruitBleResetPin
+#define AdafruitBleResetPin D4
+#endif
+
+#ifndef AdafruitBleCSPin
+#define AdafruitBleCSPin    B4
+#endif
+
+#ifndef AdafruitBleIRQPin
+#define AdafruitBleIRQPin   E6
+#endif
+
+
+#define SAMPLE_BATTERY
+#define ConnectionUpdateInterval 1000 /* milliseconds */
+
+static struct {
+  bool is_connected;
+  bool initialized;
+  bool configured;
+
+#define ProbedEvents 1
+#define UsingEvents 2
+  bool event_flags;
+
+#ifdef SAMPLE_BATTERY
+  uint16_t last_battery_update;
+  uint32_t vbat;
+#endif
+  uint16_t last_connection_update;
+} state;
+
+// Commands are encoded using SDEP and sent via SPI
+// https://github.com/adafruit/Adafruit_BluefruitLE_nRF51/blob/master/SDEP.md
+
+#define SdepMaxPayload 16
+struct sdep_msg {
+  uint8_t type;
+  uint8_t cmd_low;
+  uint8_t cmd_high;
+  struct __attribute__((packed)) {
+    uint8_t len:7;
+    uint8_t more:1;
+  };
+  uint8_t payload[SdepMaxPayload];
+} __attribute__((packed));
+
+// The recv latency is relatively high, so when we're hammering keys quickly,
+// we want to avoid waiting for the responses in the matrix loop.  We maintain
+// a short queue for that.  Since there is quite a lot of space overhead for
+// the AT command representation wrapped up in SDEP, we queue the minimal
+// information here.
+
+enum queue_type {
+  QTKeyReport, // 1-byte modifier + 6-byte key report
+  QTConsumer,  // 16-bit key code
+#ifdef MOUSE_ENABLE
+  QTMouseMove, // 4-byte mouse report
+#endif
+};
+
+struct queue_item {
+  enum queue_type queue_type;
+  uint16_t added;
+  union __attribute__((packed)) {
+    struct __attribute__((packed)) {
+      uint8_t modifier;
+      uint8_t keys[6];
+    } key;
+
+    uint16_t consumer;
+    struct __attribute__((packed)) {
+      int8_t x, y, scroll, pan;
+    } mousemove;
+  };
+};
+
+// Items that we wish to send
+static RingBuffer<queue_item, 40> send_buf;
+// Pending response; while pending, we can't send any more requests.
+// This records the time at which we sent the command for which we
+// are expecting a response.
+static RingBuffer<uint16_t, 2> resp_buf;
+
+static bool process_queue_item(struct queue_item *item, uint16_t timeout);
+
+enum sdep_type {
+  SdepCommand = 0x10,
+  SdepResponse = 0x20,
+  SdepAlert = 0x40,
+  SdepError = 0x80,
+  SdepSlaveNotReady = 0xfe, // Try again later
+  SdepSlaveOverflow = 0xff, // You read more data than is available
+};
+
+enum ble_cmd {
+  BleInitialize = 0xbeef,
+  BleAtWrapper = 0x0a00,
+  BleUartTx = 0x0a01,
+  BleUartRx = 0x0a02,
+};
+
+enum ble_system_event_bits {
+  BleSystemConnected = 0,
+  BleSystemDisconnected = 1,
+  BleSystemUartRx = 8,
+  BleSystemMidiRx = 10,
+};
+
+// The SDEP.md file says 2MHz but the web page and the sample driver
+// both use 4MHz
+#define SpiBusSpeed 4000000
+
+#define SdepTimeout 150 /* milliseconds */
+#define SdepShortTimeout 10 /* milliseconds */
+#define SdepBackOff 25 /* microseconds */
+#define BatteryUpdateInterval 10000 /* milliseconds */
+
+static bool at_command(const char *cmd, char *resp, uint16_t resplen,
+                       bool verbose, uint16_t timeout = SdepTimeout);
+static bool at_command_P(const char *cmd, char *resp, uint16_t resplen,
+                         bool verbose = false);
+
+struct SPI_Settings {
+  uint8_t spcr, spsr;
+};
+
+static struct SPI_Settings spi;
+
+// Initialize 4Mhz MSBFIRST MODE0
+void SPI_init(struct SPI_Settings *spi) {
+  spi->spcr = _BV(SPE) | _BV(MSTR);
+  spi->spsr = _BV(SPI2X);
+
+  static_assert(SpiBusSpeed == F_CPU / 2, "hard coded at 4Mhz");
+
+  ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
+    // Ensure that SS is OUTPUT High
+    digitalWrite(B0, PinLevelHigh);
+    pinMode(B0, PinDirectionOutput);
+
+    SPCR |= _BV(MSTR);
+    SPCR |= _BV(SPE);
+    pinMode(B1 /* SCK */, PinDirectionOutput);
+    pinMode(B2 /* MOSI */, PinDirectionOutput);
+  }
+}
+
+static inline void SPI_begin(struct SPI_Settings*spi) {
+  SPCR = spi->spcr;
+  SPSR = spi->spsr;
+}
+
+static inline uint8_t SPI_TransferByte(uint8_t data) {
+  SPDR = data;
+  asm volatile("nop");
+  while (!(SPSR & _BV(SPIF))) {
+    ; // wait
+  }
+  return SPDR;
+}
+
+static inline void spi_send_bytes(const uint8_t *buf, uint8_t len) {
+  if (len == 0) return;
+  const uint8_t *end = buf + len;
+  while (buf < end) {
+    SPDR = *buf;
+    while (!(SPSR & _BV(SPIF))) {
+      ; // wait
+    }
+    ++buf;
+  }
+}
+
+static inline uint16_t spi_read_byte(void) {
+  return SPI_TransferByte(0x00 /* dummy */);
+}
+
+static inline void spi_recv_bytes(uint8_t *buf, uint8_t len) {
+  const uint8_t *end = buf + len;
+  if (len == 0) return;
+  while (buf < end) {
+    SPDR = 0; // write a dummy to initiate read
+    while (!(SPSR & _BV(SPIF))) {
+      ; // wait
+    }
+    *buf = SPDR;
+    ++buf;
+  }
+}
+
+#if 0
+static void dump_pkt(const struct sdep_msg *msg) {
+  print("pkt: type=");
+  print_hex8(msg->type);
+  print(" cmd=");
+  print_hex8(msg->cmd_high);
+  print_hex8(msg->cmd_low);
+  print(" len=");
+  print_hex8(msg->len);
+  print(" more=");
+  print_hex8(msg->more);
+  print("\n");
+}
+#endif
+
+// Send a single SDEP packet
+static bool sdep_send_pkt(const struct sdep_msg *msg, uint16_t timeout) {
+  SPI_begin(&spi);
+
+  digitalWrite(AdafruitBleCSPin, PinLevelLow);
+  uint16_t timerStart = timer_read();
+  bool success = false;
+  bool ready = false;
+
+  do {
+    ready = SPI_TransferByte(msg->type) != SdepSlaveNotReady;
+    if (ready) {
+      break;
+    }
+
+    // Release it and let it initialize
+    digitalWrite(AdafruitBleCSPin, PinLevelHigh);
+    _delay_us(SdepBackOff);
+    digitalWrite(AdafruitBleCSPin, PinLevelLow);
+  } while (timer_elapsed(timerStart) < timeout);
+
+  if (ready) {
+    // Slave is ready; send the rest of the packet
+    spi_send_bytes(&msg->cmd_low,
+                   sizeof(*msg) - (1 + sizeof(msg->payload)) + msg->len);
+    success = true;
+  }
+
+  digitalWrite(AdafruitBleCSPin, PinLevelHigh);
+
+  return success;
+}
+
+static inline void sdep_build_pkt(struct sdep_msg *msg, uint16_t command,
+                                  const uint8_t *payload, uint8_t len,
+                                  bool moredata) {
+  msg->type = SdepCommand;
+  msg->cmd_low = command & 0xff;
+  msg->cmd_high = command >> 8;
+  msg->len = len;
+  msg->more = (moredata && len == SdepMaxPayload) ? 1 : 0;
+
+  static_assert(sizeof(*msg) == 20, "msg is correctly packed");
+
+  memcpy(msg->payload, payload, len);
+}
+
+// Read a single SDEP packet
+static bool sdep_recv_pkt(struct sdep_msg *msg, uint16_t timeout) {
+  bool success = false;
+  uint16_t timerStart = timer_read();
+  bool ready = false;
+
+  do {
+    ready = digitalRead(AdafruitBleIRQPin);
+    if (ready) {
+      break;
+    }
+    _delay_us(1);
+  } while (timer_elapsed(timerStart) < timeout);
+
+  if (ready) {
+    SPI_begin(&spi);
+
+    digitalWrite(AdafruitBleCSPin, PinLevelLow);
+
+    do {
+      // Read the command type, waiting for the data to be ready
+      msg->type = spi_read_byte();
+      if (msg->type == SdepSlaveNotReady || msg->type == SdepSlaveOverflow) {
+        // Release it and let it initialize
+        digitalWrite(AdafruitBleCSPin, PinLevelHigh);
+        _delay_us(SdepBackOff);
+        digitalWrite(AdafruitBleCSPin, PinLevelLow);
+        continue;
+      }
+
+      // Read the rest of the header
+      spi_recv_bytes(&msg->cmd_low, sizeof(*msg) - (1 + sizeof(msg->payload)));
+
+      // and get the payload if there is any
+      if (msg->len <= SdepMaxPayload) {
+        spi_recv_bytes(msg->payload, msg->len);
+      }
+      success = true;
+      break;
+    } while (timer_elapsed(timerStart) < timeout);
+
+    digitalWrite(AdafruitBleCSPin, PinLevelHigh);
+  }
+  return success;
+}
+
+static void resp_buf_read_one(bool greedy) {
+  uint16_t last_send;
+  if (!resp_buf.peek(last_send)) {
+    return;
+  }
+
+  if (digitalRead(AdafruitBleIRQPin)) {
+    struct sdep_msg msg;
+
+again:
+    if (sdep_recv_pkt(&msg, SdepTimeout)) {
+      if (!msg.more) {
+        // We got it; consume this entry
+        resp_buf.get(last_send);
+        dprintf("recv latency %dms\n", TIMER_DIFF_16(timer_read(), last_send));
+      }
+
+      if (greedy && resp_buf.peek(last_send) && digitalRead(AdafruitBleIRQPin)) {
+        goto again;
+      }
+    }
+
+  } else if (timer_elapsed(last_send) > SdepTimeout * 2) {
+    dprintf("waiting_for_result: timeout, resp_buf size %d\n",
+            (int)resp_buf.size());
+
+    // Timed out: consume this entry
+    resp_buf.get(last_send);
+  }
+}
+
+static void send_buf_send_one(uint16_t timeout = SdepTimeout) {
+  struct queue_item item;
+
+  // Don't send anything more until we get an ACK
+  if (!resp_buf.empty()) {
+    return;
+  }
+
+  if (!send_buf.peek(item)) {
+    return;
+  }
+  if (process_queue_item(&item, timeout)) {
+    // commit that peek
+    send_buf.get(item);
+    dprintf("send_buf_send_one: have %d remaining\n", (int)send_buf.size());
+  } else {
+    dprint("failed to send, will retry\n");
+    _delay_ms(SdepTimeout);
+    resp_buf_read_one(true);
+  }
+}
+
+static void resp_buf_wait(const char *cmd) {
+  bool didPrint = false;
+  while (!resp_buf.empty()) {
+    if (!didPrint) {
+      dprintf("wait on buf for %s\n", cmd);
+      didPrint = true;
+    }
+    resp_buf_read_one(true);
+  }
+}
+
+static bool ble_init(void) {
+  state.initialized = false;
+  state.configured = false;
+  state.is_connected = false;
+
+  pinMode(AdafruitBleIRQPin, PinDirectionInput);
+  pinMode(AdafruitBleCSPin, PinDirectionOutput);
+  digitalWrite(AdafruitBleCSPin, PinLevelHigh);
+
+  SPI_init(&spi);
+
+  // Perform a hardware reset
+  pinMode(AdafruitBleResetPin, PinDirectionOutput);
+  digitalWrite(AdafruitBleResetPin, PinLevelHigh);
+  digitalWrite(AdafruitBleResetPin, PinLevelLow);
+  _delay_ms(10);
+  digitalWrite(AdafruitBleResetPin, PinLevelHigh);
+
+  _delay_ms(1000); // Give it a second to initialize
+
+  state.initialized = true;
+  return state.initialized;
+}
+
+static inline uint8_t min(uint8_t a, uint8_t b) {
+  return a < b ? a : b;
+}
+
+static bool read_response(char *resp, uint16_t resplen, bool verbose) {
+  char *dest = resp;
+  char *end = dest + resplen;
+
+  while (true) {
+    struct sdep_msg msg;
+
+    if (!sdep_recv_pkt(&msg, 2 * SdepTimeout)) {
+      dprint("sdep_recv_pkt failed\n");
+      return false;
+    }
+
+    if (msg.type != SdepResponse) {
+      *resp = 0;
+      return false;
+    }
+
+    uint8_t len = min(msg.len, end - dest);
+    if (len > 0) {
+      memcpy(dest, msg.payload, len);
+      dest += len;
+    }
+
+    if (!msg.more) {
+      // No more data is expected!
+      break;
+    }
+  }
+
+  // Ensure the response is NUL terminated
+  *dest = 0;
+
+  // "Parse" the result text; we want to snip off the trailing OK or ERROR line
+  // Rewind past the possible trailing CRLF so that we can strip it
+  --dest;
+  while (dest > resp && (dest[0] == '\n' || dest[0] == '\r')) {
+    *dest = 0;
+    --dest;
+  }
+
+  // Look back for start of preceeding line
+  char *last_line = strrchr(resp, '\n');
+  if (last_line) {
+    ++last_line;
+  } else {
+    last_line = resp;
+  }
+
+  bool success = false;
+  static const char kOK[] PROGMEM = "OK";
+
+  success = !strcmp_P(last_line, kOK );
+
+  if (verbose || !success) {
+    dprintf("result: %s\n", resp);
+  }
+  return success;
+}
+
+static bool at_command(const char *cmd, char *resp, uint16_t resplen,
+                       bool verbose, uint16_t timeout) {
+  const char *end = cmd + strlen(cmd);
+  struct sdep_msg msg;
+
+  if (verbose) {
+    dprintf("ble send: %s\n", cmd);
+  }
+
+  if (resp) {
+    // They want to decode the response, so we need to flush and wait
+    // for all pending I/O to finish before we start this one, so
+    // that we don't confuse the results
+    resp_buf_wait(cmd);
+    *resp = 0;
+  }
+
+  // Fragment the command into a series of SDEP packets
+  while (end - cmd > SdepMaxPayload) {
+    sdep_build_pkt(&msg, BleAtWrapper, (uint8_t *)cmd, SdepMaxPayload, true);
+    if (!sdep_send_pkt(&msg, timeout)) {
+      return false;
+    }
+    cmd += SdepMaxPayload;
+  }
+
+  sdep_build_pkt(&msg, BleAtWrapper, (uint8_t *)cmd, end - cmd, false);
+  if (!sdep_send_pkt(&msg, timeout)) {
+    return false;
+  }
+
+  if (resp == NULL) {
+    auto now = timer_read();
+    while (!resp_buf.enqueue(now)) {
+      resp_buf_read_one(false);
+    }
+    auto later = timer_read();
+    if (TIMER_DIFF_16(later, now) > 0) {
+      dprintf("waited %dms for resp_buf\n", TIMER_DIFF_16(later, now));
+    }
+    return true;
+  }
+
+  return read_response(resp, resplen, verbose);
+}
+
+bool at_command_P(const char *cmd, char *resp, uint16_t resplen, bool verbose) {
+  auto cmdbuf = (char *)alloca(strlen_P(cmd) + 1);
+  strcpy_P(cmdbuf, cmd);
+  return at_command(cmdbuf, resp, resplen, verbose);
+}
+
+bool adafruit_ble_is_connected(void) {
+  return state.is_connected;
+}
+
+bool adafruit_ble_enable_keyboard(void) {
+  char resbuf[128];
+
+  if (!state.initialized && !ble_init()) {
+    return false;
+  }
+
+  state.configured = false;
+
+  // Disable command echo
+  static const char kEcho[] PROGMEM = "ATE=0";
+  // Make the advertised name match the keyboard
+  static const char kGapDevName[] PROGMEM =
+      "AT+GAPDEVNAME=" STR(PRODUCT) " " STR(DESCRIPTION);
+  // Turn on keyboard support
+  static const char kHidEnOn[] PROGMEM = "AT+BLEHIDEN=1";
+
+  // Adjust intervals to improve latency.  This causes the "central"
+  // system (computer/tablet) to poll us every 10-30 ms.  We can't
+  // set a smaller value than 10ms, and 30ms seems to be the natural
+  // processing time on my macbook.  Keeping it constrained to that
+  // feels reasonable to type to.
+  static const char kGapIntervals[] PROGMEM = "AT+GAPINTERVALS=10,30,,";
+
+  // Reset the device so that it picks up the above changes
+  static const char kATZ[] PROGMEM = "ATZ";
+
+  // Turn down the power level a bit
+  static const char kPower[] PROGMEM = "AT+BLEPOWERLEVEL=-12";
+  static PGM_P const configure_commands[] PROGMEM = {
+    kEcho,
+    kGapIntervals,
+    kGapDevName,
+    kHidEnOn,
+    kPower,
+    kATZ,
+  };
+
+  uint8_t i;
+  for (i = 0; i < sizeof(configure_commands) / sizeof(configure_commands[0]);
+       ++i) {
+    PGM_P cmd;
+    memcpy_P(&cmd, configure_commands + i, sizeof(cmd));
+
+    if (!at_command_P(cmd, resbuf, sizeof(resbuf))) {
+      dprintf("failed BLE command: %S: %s\n", cmd, resbuf);
+      goto fail;
+    }
+  }
+
+  state.configured = true;
+
+  // Check connection status in a little while; allow the ATZ time
+  // to kick in.
+  state.last_connection_update = timer_read();
+fail:
+  return state.configured;
+}
+
+static void set_connected(bool connected) {
+  if (connected != state.is_connected) {
+    if (connected) {
+      print("****** BLE CONNECT!!!!\n");
+    } else {
+      print("****** BLE DISCONNECT!!!!\n");
+    }
+    state.is_connected = connected;
+
+    // TODO: if modifiers are down on the USB interface and
+    // we cut over to BLE or vice versa, they will remain stuck.
+    // This feels like a good point to do something like clearing
+    // the keyboard and/or generating a fake all keys up message.
+    // However, I've noticed that it takes a couple of seconds
+    // for macOS to to start recognizing key presses after BLE
+    // is in the connected state, so I worry that doing that
+    // here may not be good enough.
+  }
+}
+
+void adafruit_ble_task(void) {
+  char resbuf[48];
+
+  if (!state.configured && !adafruit_ble_enable_keyboard()) {
+    return;
+  }
+  resp_buf_read_one(true);
+  send_buf_send_one(SdepShortTimeout);
+
+  if (resp_buf.empty() && (state.event_flags & UsingEvents) &&
+      digitalRead(AdafruitBleIRQPin)) {
+    // Must be an event update
+    if (at_command_P(PSTR("AT+EVENTSTATUS"), resbuf, sizeof(resbuf))) {
+      uint32_t mask = strtoul(resbuf, NULL, 16);
+
+      if (mask & BleSystemConnected) {
+        set_connected(true);
+      } else if (mask & BleSystemDisconnected) {
+        set_connected(false);
+      }
+    }
+  }
+
+  if (timer_elapsed(state.last_connection_update) > ConnectionUpdateInterval) {
+    bool shouldPoll = true;
+    if (!(state.event_flags & ProbedEvents)) {
+      // Request notifications about connection status changes.
+      // This only works in SPIFRIEND firmware > 0.6.7, which is why
+      // we check for this conditionally here.
+      // Note that at the time of writing, HID reports only work correctly
+      // with Apple products on firmware version 0.6.7!
+      // https://forums.adafruit.com/viewtopic.php?f=8&t=104052
+      if (at_command_P(PSTR("AT+EVENTENABLE=0x1"), resbuf, sizeof(resbuf))) {
+        at_command_P(PSTR("AT+EVENTENABLE=0x2"), resbuf, sizeof(resbuf));
+        state.event_flags |= UsingEvents;
+      }
+      state.event_flags |= ProbedEvents;
+
+      // leave shouldPoll == true so that we check at least once
+      // before relying solely on events
+    } else {
+      shouldPoll = false;
+    }
+
+    static const char kGetConn[] PROGMEM = "AT+GAPGETCONN";
+    state.last_connection_update = timer_read();
+
+    if (at_command_P(kGetConn, resbuf, sizeof(resbuf))) {
+      set_connected(atoi(resbuf));
+    }
+  }
+
+#ifdef SAMPLE_BATTERY
+  // I don't know if this really does anything useful yet; the reported
+  // voltage level always seems to be around 3200mV.  We may want to just rip
+  // this code out.
+  if (timer_elapsed(state.last_battery_update) > BatteryUpdateInterval &&
+      resp_buf.empty()) {
+    state.last_battery_update = timer_read();
+
+    if (at_command_P(PSTR("AT+HWVBAT"), resbuf, sizeof(resbuf))) {
+      state.vbat = atoi(resbuf);
+    }
+  }
+#endif
+}
+
+static bool process_queue_item(struct queue_item *item, uint16_t timeout) {
+  char cmdbuf[48];
+  char fmtbuf[64];
+
+  // Arrange to re-check connection after keys have settled
+  state.last_connection_update = timer_read();
+
+#if 1
+  if (TIMER_DIFF_16(state.last_connection_update, item->added) > 0) {
+    dprintf("send latency %dms\n",
+            TIMER_DIFF_16(state.last_connection_update, item->added));
+  }
+#endif
+
+  switch (item->queue_type) {
+    case QTKeyReport:
+      strcpy_P(fmtbuf,
+          PSTR("AT+BLEKEYBOARDCODE=%02x-00-%02x-%02x-%02x-%02x-%02x-%02x"));
+      snprintf(cmdbuf, sizeof(cmdbuf), fmtbuf, item->key.modifier,
+               item->key.keys[0], item->key.keys[1], item->key.keys[2],
+               item->key.keys[3], item->key.keys[4], item->key.keys[5]);
+      return at_command(cmdbuf, NULL, 0, true, timeout);
+
+    case QTConsumer:
+      strcpy_P(fmtbuf, PSTR("AT+BLEHIDCONTROLKEY=0x%04x"));
+      snprintf(cmdbuf, sizeof(cmdbuf), fmtbuf, item->consumer);
+      return at_command(cmdbuf, NULL, 0, true, timeout);
+
+#ifdef MOUSE_ENABLE
+    case QTMouseMove:
+      strcpy_P(fmtbuf, PSTR("AT+BLEHIDMOUSEMOVE=%d,%d,%d,%d"));
+      snprintf(cmdbuf, sizeof(cmdbuf), fmtbuf, item->mousemove.x,
+          item->mousemove.y, item->mousemove.scroll, item->mousemove.pan);
+      return at_command(cmdbuf, NULL, 0, true, timeout);
+#endif
+    default:
+      return true;
+  }
+}
+
+bool adafruit_ble_send_keys(uint8_t hid_modifier_mask, uint8_t *keys,
+                            uint8_t nkeys) {
+  struct queue_item item;
+  bool didWait = false;
+
+  item.queue_type = QTKeyReport;
+  item.key.modifier = hid_modifier_mask;
+  item.added = timer_read();
+
+  while (nkeys >= 0) {
+    item.key.keys[0] = keys[0];
+    item.key.keys[1] = nkeys >= 1 ? keys[1] : 0;
+    item.key.keys[2] = nkeys >= 2 ? keys[2] : 0;
+    item.key.keys[3] = nkeys >= 3 ? keys[3] : 0;
+    item.key.keys[4] = nkeys >= 4 ? keys[4] : 0;
+    item.key.keys[5] = nkeys >= 5 ? keys[5] : 0;
+
+    if (!send_buf.enqueue(item)) {
+      if (!didWait) {
+        dprint("wait for buf space\n");
+        didWait = true;
+      }
+      send_buf_send_one();
+      continue;
+    }
+
+    if (nkeys <= 6) {
+      return true;
+    }
+
+    nkeys -= 6;
+    keys += 6;
+  }
+
+  return true;
+}
+
+bool adafruit_ble_send_consumer_key(uint16_t keycode, int hold_duration) {
+  struct queue_item item;
+
+  item.queue_type = QTConsumer;
+  item.consumer = keycode;
+
+  while (!send_buf.enqueue(item)) {
+    send_buf_send_one();
+  }
+  return true;
+}
+
+#ifdef MOUSE_ENABLE
+bool adafruit_ble_send_mouse_move(int8_t x, int8_t y, int8_t scroll,
+                                  int8_t pan) {
+  struct queue_item item;
+
+  item.queue_type = QTMouseMove;
+  item.mousemove.x = x;
+  item.mousemove.y = y;
+  item.mousemove.scroll = scroll;
+  item.mousemove.pan = pan;
+
+  while (!send_buf.enqueue(item)) {
+    send_buf_send_one();
+  }
+  return true;
+}
+#endif
+
+uint32_t adafruit_ble_read_battery_voltage(void) {
+  return state.vbat;
+}
+
+bool adafruit_ble_set_mode_leds(bool on) {
+  if (!state.configured) {
+    return false;
+  }
+
+  // The "mode" led is the red blinky one
+  at_command_P(on ? PSTR("AT+HWMODELED=1") : PSTR("AT+HWMODELED=0"), NULL, 0);
+
+  // Pin 19 is the blue "connected" LED; turn that off too.
+  // When turning LEDs back on, don't turn that LED on if we're
+  // not connected, as that would be confusing.
+  at_command_P(on && state.is_connected ? PSTR("AT+HWGPIO=19,1")
+                                        : PSTR("AT+HWGPIO=19,0"),
+               NULL, 0);
+  return true;
+}
+
+// https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le/ble-generic#at-plus-blepowerlevel
+bool adafruit_ble_set_power_level(int8_t level) {
+  char cmd[46];
+  if (!state.configured) {
+    return false;
+  }
+  snprintf(cmd, sizeof(cmd), "AT+BLEPOWERLEVEL=%d", level);
+  return at_command(cmd, NULL, 0, false);
+}
diff --git a/tmk_core/protocol/lufa/adafruit_ble.h b/tmk_core/protocol/lufa/adafruit_ble.h
new file mode 100644
index 0000000000..351fd55ae9
--- /dev/null
+++ b/tmk_core/protocol/lufa/adafruit_ble.h
@@ -0,0 +1,60 @@
+/* Bluetooth Low Energy Protocol for QMK.
+ * Author: Wez Furlong, 2016
+ * Supports the Adafruit BLE board built around the nRF51822 chip.
+ */
+#pragma once
+#ifdef ADAFRUIT_BLE_ENABLE
+#include <stdbool.h>
+#include <stdint.h>
+#include <string.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Instruct the module to enable HID keyboard support and reset */
+extern bool adafruit_ble_enable_keyboard(void);
+
+/* Query to see if the BLE module is connected */
+extern bool adafruit_ble_query_is_connected(void);
+
+/* Returns true if we believe that the BLE module is connected.
+ * This uses our cached understanding that is maintained by
+ * calling ble_task() periodically. */
+extern bool adafruit_ble_is_connected(void);
+
+/* Call this periodically to process BLE-originated things */
+extern void adafruit_ble_task(void);
+
+/* Generates keypress events for a set of keys.
+ * The hid modifier mask specifies the state of the modifier keys for
+ * this set of keys.
+ * Also sends a key release indicator, so that the keys do not remain
+ * held down. */
+extern bool adafruit_ble_send_keys(uint8_t hid_modifier_mask, uint8_t *keys,
+                                   uint8_t nkeys);
+
+/* Send a consumer keycode, holding it down for the specified duration
+ * (milliseconds) */
+extern bool adafruit_ble_send_consumer_key(uint16_t keycode, int hold_duration);
+
+#ifdef MOUSE_ENABLE
+/* Send a mouse/wheel movement report.
+ * The parameters are signed and indicate positive of negative direction
+ * change. */
+extern bool adafruit_ble_send_mouse_move(int8_t x, int8_t y, int8_t scroll,
+                                         int8_t pan);
+#endif
+
+/* Compute battery voltage by reading an analog pin.
+ * Returns the integer number of millivolts */
+extern uint32_t adafruit_ble_read_battery_voltage(void);
+
+extern bool adafruit_ble_set_mode_leds(bool on);
+extern bool adafruit_ble_set_power_level(int8_t level);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // ADAFRUIT_BLE_ENABLE
diff --git a/tmk_core/protocol/lufa/descriptor.c b/tmk_core/protocol/lufa/descriptor.c
index 850a20fdb3..feeea76df0 100644
--- a/tmk_core/protocol/lufa/descriptor.c
+++ b/tmk_core/protocol/lufa/descriptor.c
@@ -40,6 +40,9 @@
 #include "report.h"
 #include "descriptor.h"
 
+#ifndef USB_MAX_POWER_CONSUMPTION
+#define USB_MAX_POWER_CONSUMPTION 500
+#endif
 
 /*******************************************************************************
  * HID Report Descriptors
@@ -141,9 +144,9 @@ const USB_Descriptor_HIDReport_Datatype_t PROGMEM ExtrakeyReport[] =
     HID_RI_COLLECTION(8, 0x01), /* Application */
         HID_RI_REPORT_ID(8, REPORT_ID_SYSTEM),
         HID_RI_LOGICAL_MINIMUM(16, 0x0001),
-        HID_RI_LOGICAL_MAXIMUM(16, 0x00B7),
-        HID_RI_USAGE_MINIMUM(16, 0x0001), /* System Power Down */
-        HID_RI_USAGE_MAXIMUM(16, 0x00B7), /* System Display LCD Autoscale */
+        HID_RI_LOGICAL_MAXIMUM(16, 0x0003),
+        HID_RI_USAGE_MINIMUM(16, 0x0081), /* System Power Down */
+        HID_RI_USAGE_MAXIMUM(16, 0x0083), /* System Wake Up */
         HID_RI_REPORT_SIZE(8, 16),
         HID_RI_REPORT_COUNT(8, 1),
         HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_ARRAY | HID_IOF_ABSOLUTE),
@@ -164,6 +167,28 @@ const USB_Descriptor_HIDReport_Datatype_t PROGMEM ExtrakeyReport[] =
 };
 #endif
 
+#ifdef RAW_ENABLE
+const USB_Descriptor_HIDReport_Datatype_t PROGMEM RawReport[] =
+{
+    HID_RI_USAGE_PAGE(16, 0xFF60), /* Vendor Page 0xFF60 */
+    HID_RI_USAGE(8, 0x61), /* Vendor Usage 0x61 */
+    HID_RI_COLLECTION(8, 0x01), /* Application */
+        HID_RI_USAGE(8, 0x62), /* Vendor Usage 0x62 */
+        HID_RI_LOGICAL_MINIMUM(8, 0x00),
+        HID_RI_LOGICAL_MAXIMUM(16, 0x00FF),
+        HID_RI_REPORT_COUNT(8, RAW_EPSIZE),
+        HID_RI_REPORT_SIZE(8, 0x08),
+        HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE),
+        HID_RI_USAGE(8, 0x63), /* Vendor Usage 0x63 */
+        HID_RI_LOGICAL_MINIMUM(8, 0x00),
+        HID_RI_LOGICAL_MAXIMUM(16, 0x00FF),
+        HID_RI_REPORT_COUNT(8, RAW_EPSIZE),
+        HID_RI_REPORT_SIZE(8, 0x08),
+        HID_RI_OUTPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE),
+    HID_RI_END_COLLECTION(0),
+};
+#endif
+
 #ifdef CONSOLE_ENABLE
 const USB_Descriptor_HIDReport_Datatype_t PROGMEM ConsoleReport[] =
 {
@@ -231,9 +256,15 @@ const USB_Descriptor_Device_t PROGMEM DeviceDescriptor =
     .Header                 = {.Size = sizeof(USB_Descriptor_Device_t), .Type = DTYPE_Device},
 
     .USBSpecification       = VERSION_BCD(1,1,0),
+#if VIRTSER_ENABLE
+    .Class                  = USB_CSCP_IADDeviceClass,
+    .SubClass               = USB_CSCP_IADDeviceSubclass,
+    .Protocol               = USB_CSCP_IADDeviceProtocol,
+#else
     .Class                  = USB_CSCP_NoDeviceClass,
     .SubClass               = USB_CSCP_NoDeviceSubclass,
     .Protocol               = USB_CSCP_NoDeviceProtocol,
+#endif
 
     .Endpoint0Size          = FIXED_CONTROL_ENDPOINT_SIZE,
 
@@ -266,7 +297,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
 
             .ConfigAttributes       = (USB_CONFIG_ATTR_RESERVED | USB_CONFIG_ATTR_REMOTEWAKEUP),
 
-            .MaxPowerConsumption    = USB_CONFIG_POWER_MA(500)
+            .MaxPowerConsumption    = USB_CONFIG_POWER_MA(USB_MAX_POWER_CONSUMPTION)
         },
 
     /*
@@ -393,6 +424,58 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
         },
 #endif
 
+		/*
+	     * Raw
+	     */
+	#ifdef RAW_ENABLE
+	    .Raw_Interface =
+	        {
+	            .Header                 = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface},
+
+	            .InterfaceNumber        = RAW_INTERFACE,
+	            .AlternateSetting       = 0x00,
+
+	            .TotalEndpoints         = 2,
+
+	            .Class                  = HID_CSCP_HIDClass,
+	            .SubClass               = HID_CSCP_NonBootSubclass,
+	            .Protocol               = HID_CSCP_NonBootProtocol,
+
+	            .InterfaceStrIndex      = NO_DESCRIPTOR
+	        },
+
+	    .Raw_HID =
+	        {
+	            .Header                 = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID},
+
+	            .HIDSpec                = VERSION_BCD(1,1,1),
+	            .CountryCode            = 0x00,
+	            .TotalReportDescriptors = 1,
+	            .HIDReportType          = HID_DTYPE_Report,
+	            .HIDReportLength        = sizeof(RawReport)
+	        },
+
+	    .Raw_INEndpoint =
+	        {
+	            .Header                 = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
+
+	            .EndpointAddress        = (ENDPOINT_DIR_IN | RAW_IN_EPNUM),
+	            .Attributes             = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
+	            .EndpointSize           = RAW_EPSIZE,
+	            .PollingIntervalMS      = 0x01
+	        },
+
+	    .Raw_OUTEndpoint =
+	        {
+	            .Header                 = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
+
+	            .EndpointAddress        = (ENDPOINT_DIR_OUT | RAW_OUT_EPNUM),
+	            .Attributes             = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
+	            .EndpointSize           = RAW_EPSIZE,
+	            .PollingIntervalMS      = 0x01
+	        },
+	#endif
+
     /*
      * Console
      */
@@ -643,7 +726,110 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
 
             .TotalEmbeddedJacks       = 0x01,
             .AssociatedJackID         = {0x03}
-        }
+        },
+#endif
+
+#ifdef VIRTSER_ENABLE
+    .CDC_Interface_Association =
+            {
+                    .Header                 = {.Size = sizeof(USB_Descriptor_Interface_Association_t), .Type = DTYPE_InterfaceAssociation},
+
+                    .FirstInterfaceIndex    = CCI_INTERFACE,
+                    .TotalInterfaces        = 2,
+
+                    .Class                  = CDC_CSCP_CDCClass,
+                    .SubClass               = CDC_CSCP_ACMSubclass,
+                    .Protocol               = CDC_CSCP_ATCommandProtocol,
+
+                    .IADStrIndex            = NO_DESCRIPTOR,
+            },
+
+    .CDC_CCI_Interface =
+            {
+                    .Header                 = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface},
+
+                    .InterfaceNumber        = CCI_INTERFACE,
+                    .AlternateSetting       = 0,
+
+                    .TotalEndpoints         = 1,
+
+                    .Class                  = CDC_CSCP_CDCClass,
+                    .SubClass               = CDC_CSCP_ACMSubclass,
+                    .Protocol               = CDC_CSCP_ATCommandProtocol,
+
+                    .InterfaceStrIndex      = NO_DESCRIPTOR
+            },
+
+    .CDC_Functional_Header =
+            {
+                    .Header                 = {.Size = sizeof(USB_CDC_Descriptor_FunctionalHeader_t), .Type = DTYPE_CSInterface},
+                    .Subtype                = 0x00,
+
+                    .CDCSpecification       = VERSION_BCD(1,1,0),
+            },
+
+    .CDC_Functional_ACM =
+            {
+                    .Header                 = {.Size = sizeof(USB_CDC_Descriptor_FunctionalACM_t), .Type = DTYPE_CSInterface},
+                    .Subtype                = 0x02,
+
+                    .Capabilities           = 0x02,
+            },
+
+    .CDC_Functional_Union =
+            {
+                    .Header                 = {.Size = sizeof(USB_CDC_Descriptor_FunctionalUnion_t), .Type = DTYPE_CSInterface},
+                    .Subtype                = 0x06,
+
+                    .MasterInterfaceNumber  = CCI_INTERFACE,
+                    .SlaveInterfaceNumber   = CDI_INTERFACE,
+            },
+
+    .CDC_NotificationEndpoint =
+            {
+                    .Header                 = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
+
+                    .EndpointAddress        = CDC_NOTIFICATION_EPADDR,
+                    .Attributes             = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
+                    .EndpointSize           = CDC_NOTIFICATION_EPSIZE,
+                    .PollingIntervalMS      = 0xFF
+            },
+
+    .CDC_DCI_Interface =
+            {
+                    .Header                 = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface},
+
+                    .InterfaceNumber        = CDI_INTERFACE,
+                    .AlternateSetting       = 0,
+
+                    .TotalEndpoints         = 2,
+
+                    .Class                  = CDC_CSCP_CDCDataClass,
+                    .SubClass               = CDC_CSCP_NoDataSubclass,
+                    .Protocol               = CDC_CSCP_NoDataProtocol,
+
+                    .InterfaceStrIndex      = NO_DESCRIPTOR
+            },
+
+    .CDC_DataOutEndpoint =
+            {
+                    .Header                 = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
+
+                    .EndpointAddress        = CDC_OUT_EPADDR,
+                    .Attributes             = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
+                    .EndpointSize           = CDC_EPSIZE,
+                    .PollingIntervalMS      = 0x05
+            },
+
+    .CDC_DataInEndpoint =
+            {
+                    .Header                 = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
+
+                    .EndpointAddress        = CDC_IN_EPADDR,
+                    .Attributes             = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
+                    .EndpointSize           = CDC_EPSIZE,
+                    .PollingIntervalMS      = 0x05
+            },
 #endif
 };
 
@@ -736,6 +922,12 @@ uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue,
                 Size    = sizeof(USB_HID_Descriptor_HID_t);
                 break;
 #endif
+#ifdef RAW_ENABLE
+            case RAW_INTERFACE:
+                Address = &ConfigurationDescriptor.Raw_HID;
+                Size    = sizeof(USB_HID_Descriptor_HID_t);
+                break;
+#endif
 #ifdef CONSOLE_ENABLE
             case CONSOLE_INTERFACE:
                 Address = &ConfigurationDescriptor.Console_HID;
@@ -768,6 +960,12 @@ uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue,
                 Size    = sizeof(ExtrakeyReport);
                 break;
 #endif
+#ifdef RAW_ENABLE
+            case RAW_INTERFACE:
+                Address = &RawReport;
+                Size    = sizeof(RawReport);
+                break;
+#endif
 #ifdef CONSOLE_ENABLE
             case CONSOLE_INTERFACE:
                 Address = &ConsoleReport;
diff --git a/tmk_core/protocol/lufa/descriptor.h b/tmk_core/protocol/lufa/descriptor.h
index 4fd81a0e87..24ce420e6a 100644
--- a/tmk_core/protocol/lufa/descriptor.h
+++ b/tmk_core/protocol/lufa/descriptor.h
@@ -1,4 +1,4 @@
-/* 
+/*
  * Copyright 2012,2013 Jun Wako <wakojun@gmail.com>
  * This file is based on:
  *     LUFA-120219/Demos/Device/Lowlevel/KeyboardMouse
@@ -71,6 +71,14 @@ typedef struct
     USB_Descriptor_Endpoint_t             Extrakey_INEndpoint;
 #endif
 
+#ifdef RAW_ENABLE
+    // Raw HID Interface
+    USB_Descriptor_Interface_t            Raw_Interface;
+    USB_HID_Descriptor_HID_t              Raw_HID;
+    USB_Descriptor_Endpoint_t             Raw_INEndpoint;
+    USB_Descriptor_Endpoint_t             Raw_OUTEndpoint;
+#endif
+
 #ifdef CONSOLE_ENABLE
     // Console HID Interface
     USB_Descriptor_Interface_t            Console_Interface;
@@ -104,6 +112,21 @@ typedef struct
       USB_MIDI_Descriptor_Jack_Endpoint_t       MIDI_Out_Jack_Endpoint_SPC;
 #endif
 
+#ifdef VIRTSER_ENABLE
+        USB_Descriptor_Interface_Association_t   CDC_Interface_Association;
+
+	// CDC Control Interface
+	USB_Descriptor_Interface_t               CDC_CCI_Interface;
+	USB_CDC_Descriptor_FunctionalHeader_t    CDC_Functional_Header;
+	USB_CDC_Descriptor_FunctionalACM_t       CDC_Functional_ACM;
+	USB_CDC_Descriptor_FunctionalUnion_t     CDC_Functional_Union;
+	USB_Descriptor_Endpoint_t                CDC_NotificationEndpoint;
+
+	// CDC Data Interface
+	USB_Descriptor_Interface_t               CDC_DCI_Interface;
+	USB_Descriptor_Endpoint_t                CDC_DataOutEndpoint;
+	USB_Descriptor_Endpoint_t                CDC_DataInEndpoint;
+#endif
 } USB_Descriptor_Configuration_t;
 
 
@@ -114,18 +137,24 @@ typedef struct
 #   define MOUSE_INTERFACE          (KEYBOARD_INTERFACE + 1)
 #else
 #   define MOUSE_INTERFACE          KEYBOARD_INTERFACE
-#endif 
+#endif
 
 #ifdef EXTRAKEY_ENABLE
 #   define EXTRAKEY_INTERFACE       (MOUSE_INTERFACE + 1)
 #else
 #   define EXTRAKEY_INTERFACE       MOUSE_INTERFACE
-#endif 
+#endif
+
+#ifdef RAW_ENABLE
+#   define RAW_INTERFACE        	(EXTRAKEY_INTERFACE + 1)
+#else
+#   define RAW_INTERFACE        	EXTRAKEY_INTERFACE
+#endif
 
 #ifdef CONSOLE_ENABLE
-#   define CONSOLE_INTERFACE        (EXTRAKEY_INTERFACE + 1)
+#   define CONSOLE_INTERFACE        (RAW_INTERFACE + 1)
 #else
-#   define CONSOLE_INTERFACE        EXTRAKEY_INTERFACE
+#   define CONSOLE_INTERFACE        RAW_INTERFACE
 #endif
 
 #ifdef NKRO_ENABLE
@@ -141,15 +170,22 @@ typedef struct
 #   define AS_INTERFACE           NKRO_INTERFACE
 #endif
 
+#ifdef VIRTSER_ENABLE
+#   define CCI_INTERFACE         (AS_INTERFACE + 1)
+#   define CDI_INTERFACE         (AS_INTERFACE + 2)
+#else
+#   define CDI_INTERFACE         AS_INTERFACE
+#endif
+
 /* nubmer of interfaces */
-#define TOTAL_INTERFACES            AS_INTERFACE + 1
+#define TOTAL_INTERFACES            (CDI_INTERFACE + 1)
 
 
 // Endopoint number and size
 #define KEYBOARD_IN_EPNUM           1
 
 #ifdef MOUSE_ENABLE
-#   define MOUSE_IN_EPNUM           (KEYBOARD_IN_EPNUM + 1) 
+#   define MOUSE_IN_EPNUM           (KEYBOARD_IN_EPNUM + 1)
 #else
 #   define MOUSE_IN_EPNUM           KEYBOARD_IN_EPNUM
 #endif
@@ -157,15 +193,22 @@ typedef struct
 #ifdef EXTRAKEY_ENABLE
 #   define EXTRAKEY_IN_EPNUM        (MOUSE_IN_EPNUM + 1)
 #else
-#   define EXTRAKEY_IN_EPNUM        MOUSE_IN_EPNUM 
+#   define EXTRAKEY_IN_EPNUM        MOUSE_IN_EPNUM
+#endif
+
+#ifdef RAW_ENABLE
+#   define RAW_IN_EPNUM         (EXTRAKEY_IN_EPNUM + 1)
+#   define RAW_OUT_EPNUM        (EXTRAKEY_IN_EPNUM + 2)
+#else
+#   define RAW_OUT_EPNUM        EXTRAKEY_IN_EPNUM
 #endif
 
 #ifdef CONSOLE_ENABLE
-#   define CONSOLE_IN_EPNUM         (EXTRAKEY_IN_EPNUM + 1)
-#   define CONSOLE_OUT_EPNUM        (EXTRAKEY_IN_EPNUM + 1)
-//#   define CONSOLE_OUT_EPNUM        (EXTRAKEY_IN_EPNUM + 2)
+#   define CONSOLE_IN_EPNUM         (RAW_OUT_EPNUM + 1)
+//#   define CONSOLE_OUT_EPNUM        (RAW_OUT_EPNUM + 2)
+#   define CONSOLE_OUT_EPNUM        (RAW_OUT_EPNUM + 1)
 #else
-#   define CONSOLE_OUT_EPNUM        EXTRAKEY_IN_EPNUM
+#   define CONSOLE_OUT_EPNUM        RAW_OUT_EPNUM
 #endif
 
 #ifdef NKRO_ENABLE
@@ -180,19 +223,34 @@ typedef struct
 #   define MIDI_STREAM_OUT_EPNUM    (NKRO_IN_EPNUM + 2)
 #   define MIDI_STREAM_IN_EPADDR    (ENDPOINT_DIR_IN | MIDI_STREAM_IN_EPNUM)
 #   define MIDI_STREAM_OUT_EPADDR   (ENDPOINT_DIR_OUT | MIDI_STREAM_OUT_EPNUM)
+#else
+#   define MIDI_STREAM_OUT_EPNUM     NKRO_IN_EPNUM
 #endif
 
+#ifdef VIRTSER_ENABLE
+#   define CDC_NOTIFICATION_EPNUM   (MIDI_STREAM_OUT_EPNUM + 1)
+#   define CDC_IN_EPNUM		    (MIDI_STREAM_OUT_EPNUM + 2)
+#   define CDC_OUT_EPNUM		    (MIDI_STREAM_OUT_EPNUM + 3)
+#   define CDC_NOTIFICATION_EPADDR        (ENDPOINT_DIR_IN | CDC_NOTIFICATION_EPNUM)
+#   define CDC_IN_EPADDR                  (ENDPOINT_DIR_IN | CDC_IN_EPNUM)
+#   define CDC_OUT_EPADDR                  (ENDPOINT_DIR_OUT | CDC_OUT_EPNUM)
+#else
+#   define CDC_OUT_EPNUM	MIDI_STREAM_OUT_EPNUM
+#endif
 
-#if defined(__AVR_ATmega32U2__) && MIDI_STREAM_OUT_EPADDR > 4
-# error "Endpoints are not available enough to support all functions. Remove some in Makefile.(MOUSEKEY, EXTRAKEY, CONSOLE, NKRO, MIDI)"
+#if defined(__AVR_ATmega32U2__) && CDC_OUT_EPNUM > 4
+# error "Endpoints are not available enough to support all functions. Remove some in Makefile.(MOUSEKEY, EXTRAKEY, CONSOLE, NKRO, MIDI, SERIAL)"
 #endif
 
 #define KEYBOARD_EPSIZE             8
 #define MOUSE_EPSIZE                8
 #define EXTRAKEY_EPSIZE             8
+#define RAW_EPSIZE              	32
 #define CONSOLE_EPSIZE              32
-#define NKRO_EPSIZE                 16
+#define NKRO_EPSIZE                 32
 #define MIDI_STREAM_EPSIZE          64
+#define CDC_NOTIFICATION_EPSIZE     8
+#define CDC_EPSIZE                  16
 
 
 uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue,
diff --git a/tmk_core/protocol/lufa/lufa.c b/tmk_core/protocol/lufa/lufa.c
index 9ca55dbc9d..ba49284c9b 100644
--- a/tmk_core/protocol/lufa/lufa.c
+++ b/tmk_core/protocol/lufa/lufa.c
@@ -51,6 +51,16 @@
 
 #include "descriptor.h"
 #include "lufa.h"
+#include "quantum.h"
+#include <util/atomic.h>
+#include "outputselect.h"
+
+#ifdef NKRO_ENABLE
+  #include "keycode_config.h"
+
+  extern keymap_config_t keymap_config;
+#endif
+
 
 #ifdef AUDIO_ENABLE
     #include <audio.h>
@@ -59,6 +69,25 @@
 #ifdef BLUETOOTH_ENABLE
     #include "bluetooth.h"
 #endif
+#ifdef ADAFRUIT_BLE_ENABLE
+    #include "adafruit_ble.h"
+#endif
+
+#ifdef VIRTSER_ENABLE
+    #include "virtser.h"
+#endif
+
+#if (defined(RGB_MIDI) | defined(RGBLIGHT_ANIMATIONS)) & defined(RGBLIGHT_ENABLE)
+    #include "rgblight.h"
+#endif
+
+#ifdef MIDI_ENABLE
+  #include "sysex_tools.h"
+#endif
+
+#ifdef RAW_ENABLE
+	#include "raw_hid.h"
+#endif
 
 uint8_t keyboard_idle = 0;
 /* 0: Boot Protocol, 1: Report Protocol(default) */
@@ -68,9 +97,9 @@ static uint8_t keyboard_led_stats = 0;
 static report_keyboard_t keyboard_report_sent;
 
 #ifdef MIDI_ENABLE
-void usb_send_func(MidiDevice * device, uint16_t cnt, uint8_t byte0, uint8_t byte1, uint8_t byte2);
-void usb_get_midi(MidiDevice * device);
-void midi_usb_init(MidiDevice * device);
+static void usb_send_func(MidiDevice * device, uint16_t cnt, uint8_t byte0, uint8_t byte1, uint8_t byte2);
+static void usb_get_midi(MidiDevice * device);
+static void midi_usb_init(MidiDevice * device);
 #endif
 
 /* Host driver */
@@ -127,6 +156,108 @@ USB_ClassInfo_MIDI_Device_t USB_MIDI_Interface =
 #define SYS_COMMON_3 0x30
 #endif
 
+#ifdef VIRTSER_ENABLE
+USB_ClassInfo_CDC_Device_t cdc_device =
+{
+  .Config =
+  {
+    .ControlInterfaceNumber = CCI_INTERFACE,
+    .DataINEndpoint         =
+    {
+      .Address		= CDC_IN_EPADDR,
+      .Size		= CDC_EPSIZE,
+      .Banks		= 1,
+    },
+    .DataOUTEndpoint	    =
+    {
+      .Address		= CDC_OUT_EPADDR,
+      .Size		= CDC_EPSIZE,
+      .Banks		= 1,
+    },
+    .NotificationEndpoint   =
+    {
+      .Address		= CDC_NOTIFICATION_EPADDR,
+      .Size		= CDC_NOTIFICATION_EPSIZE,
+      .Banks		= 1,
+    },
+  },
+};
+#endif
+
+#ifdef RAW_ENABLE
+
+void raw_hid_send( uint8_t *data, uint8_t length )
+{
+	// TODO: implement variable size packet
+	if ( length != RAW_EPSIZE )
+	{
+		return;
+	}
+
+	if (USB_DeviceState != DEVICE_STATE_Configured)
+	{
+		return;
+	}
+
+	// TODO: decide if we allow calls to raw_hid_send() in the middle
+	// of other endpoint usage.
+	uint8_t ep = Endpoint_GetCurrentEndpoint();
+
+	Endpoint_SelectEndpoint(RAW_IN_EPNUM);
+
+	// Check to see if the host is ready to accept another packet
+	if (Endpoint_IsINReady())
+	{
+		// Write data
+		Endpoint_Write_Stream_LE(data, RAW_EPSIZE, NULL);
+		// Finalize the stream transfer to send the last packet
+		Endpoint_ClearIN();
+	}
+
+	Endpoint_SelectEndpoint(ep);
+}
+
+__attribute__ ((weak))
+void raw_hid_receive( uint8_t *data, uint8_t length )
+{
+	// Users should #include "raw_hid.h" in their own code
+	// and implement this function there. Leave this as weak linkage
+	// so users can opt to not handle data coming in.
+}
+
+static void raw_hid_task(void)
+{
+	// Create a temporary buffer to hold the read in data from the host
+	uint8_t data[RAW_EPSIZE];
+	bool data_read = false;
+
+	// Device must be connected and configured for the task to run
+	if (USB_DeviceState != DEVICE_STATE_Configured)
+	return;
+
+	Endpoint_SelectEndpoint(RAW_OUT_EPNUM);
+
+	// Check to see if a packet has been sent from the host
+	if (Endpoint_IsOUTReceived())
+	{
+		// Check to see if the packet contains data
+		if (Endpoint_IsReadWriteAllowed())
+		{
+			/* Read data */
+			Endpoint_Read_Stream_LE(data, sizeof(data), NULL);
+			data_read = true;
+		}
+
+		// Finalize the stream transfer to receive the last packet
+		Endpoint_ClearOUT();
+
+		if ( data_read )
+		{
+			raw_hid_receive( data, sizeof(data) );
+		}
+	}
+}
+#endif
 
 /*******************************************************************************
  * Console
@@ -246,10 +377,14 @@ void EVENT_USB_Device_WakeUp()
 #endif
 }
 
+
+
 #ifdef CONSOLE_ENABLE
 static bool console_flush = false;
 #define CONSOLE_FLUSH_SET(b)   do { \
-    uint8_t sreg = SREG; cli(); console_flush = b; SREG = sreg; \
+  ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {\
+    console_flush = b; \
+  } \
 } while (0)
 
 // called every 1ms
@@ -263,6 +398,7 @@ void EVENT_USB_Device_StartOfFrame(void)
     Console_Task();
     console_flush = false;
 }
+
 #endif
 
 /** Event handler for the USB_ConfigurationChanged event.
@@ -291,6 +427,14 @@ void EVENT_USB_Device_ConfigurationChanged(void)
                                      EXTRAKEY_EPSIZE, ENDPOINT_BANK_SINGLE);
 #endif
 
+#ifdef RAW_ENABLE
+    /* Setup Raw HID Report Endpoints */
+    ConfigSuccess &= ENDPOINT_CONFIG(RAW_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN,
+									 RAW_EPSIZE, ENDPOINT_BANK_SINGLE);
+    ConfigSuccess &= ENDPOINT_CONFIG(RAW_OUT_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_OUT,
+									 RAW_EPSIZE, ENDPOINT_BANK_SINGLE);
+#endif
+
 #ifdef CONSOLE_ENABLE
     /* Setup Console HID Report Endpoints */
     ConfigSuccess &= ENDPOINT_CONFIG(CONSOLE_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN,
@@ -311,6 +455,12 @@ void EVENT_USB_Device_ConfigurationChanged(void)
     ConfigSuccess &= Endpoint_ConfigureEndpoint(MIDI_STREAM_IN_EPADDR, EP_TYPE_BULK, MIDI_STREAM_EPSIZE, ENDPOINT_BANK_SINGLE);
     ConfigSuccess &= Endpoint_ConfigureEndpoint(MIDI_STREAM_OUT_EPADDR, EP_TYPE_BULK, MIDI_STREAM_EPSIZE, ENDPOINT_BANK_SINGLE);
 #endif
+
+#ifdef VIRTSER_ENABLE
+    ConfigSuccess &= Endpoint_ConfigureEndpoint(CDC_NOTIFICATION_EPADDR, EP_TYPE_INTERRUPT, CDC_NOTIFICATION_EPSIZE, ENDPOINT_BANK_SINGLE);
+    ConfigSuccess &= Endpoint_ConfigureEndpoint(CDC_OUT_EPADDR, EP_TYPE_BULK, CDC_EPSIZE, ENDPOINT_BANK_SINGLE);
+    ConfigSuccess &= Endpoint_ConfigureEndpoint(CDC_IN_EPADDR, EP_TYPE_BULK, CDC_EPSIZE, ENDPOINT_BANK_SINGLE);
+#endif
 }
 
 /*
@@ -432,6 +582,10 @@ void EVENT_USB_Device_ControlRequest(void)
 
             break;
     }
+
+#ifdef VIRTSER_ENABLE
+    CDC_Device_ProcessControlRequest(&cdc_device);
+#endif
 }
 
 /*******************************************************************************
@@ -444,22 +598,31 @@ static uint8_t keyboard_leds(void)
 
 static void send_keyboard(report_keyboard_t *report)
 {
+    uint8_t timeout = 255;
+    uint8_t where = where_to_send();
 
 #ifdef BLUETOOTH_ENABLE
-    bluefruit_serial_send(0xFD);
-    for (uint8_t i = 0; i < KEYBOARD_EPSIZE; i++) {
-        bluefruit_serial_send(report->raw[i]);
+    if (where == OUTPUT_BLUETOOTH || where == OUTPUT_USB_AND_BT) {
+        bluefruit_serial_send(0xFD);
+        for (uint8_t i = 0; i < KEYBOARD_EPSIZE; i++) {
+            bluefruit_serial_send(report->raw[i]);
+        }
     }
 #endif
 
-    uint8_t timeout = 255;
+#ifdef ADAFRUIT_BLE_ENABLE
+    if (where == OUTPUT_ADAFRUIT_BLE) {
+      adafruit_ble_send_keys(report->mods, report->keys, sizeof(report->keys));
+    }
+#endif
 
-    if (USB_DeviceState != DEVICE_STATE_Configured)
-        return;
+    if (where != OUTPUT_USB && where != OUTPUT_USB_AND_BT) {
+      return;
+    }
 
     /* Select the Keyboard Report Endpoint */
 #ifdef NKRO_ENABLE
-    if (keyboard_protocol && keyboard_nkro) {
+    if (keyboard_protocol && keymap_config.nkro) {
         /* Report protocol - NKRO */
         Endpoint_SelectEndpoint(NKRO_IN_EPNUM);
 
@@ -493,23 +656,33 @@ static void send_keyboard(report_keyboard_t *report)
 static void send_mouse(report_mouse_t *report)
 {
 #ifdef MOUSE_ENABLE
+    uint8_t timeout = 255;
+    uint8_t where = where_to_send();
 
 #ifdef BLUETOOTH_ENABLE
-    bluefruit_serial_send(0xFD);
-    bluefruit_serial_send(0x00);
-    bluefruit_serial_send(0x03);
-    bluefruit_serial_send(report->buttons);
-    bluefruit_serial_send(report->x);
-    bluefruit_serial_send(report->y);
-    bluefruit_serial_send(report->v); // should try sending the wheel v here
-    bluefruit_serial_send(report->h); // should try sending the wheel h here
-    bluefruit_serial_send(0x00);
+    if (where == OUTPUT_BLUETOOTH || where == OUTPUT_USB_AND_BT) {
+        bluefruit_serial_send(0xFD);
+        bluefruit_serial_send(0x00);
+        bluefruit_serial_send(0x03);
+        bluefruit_serial_send(report->buttons);
+        bluefruit_serial_send(report->x);
+        bluefruit_serial_send(report->y);
+        bluefruit_serial_send(report->v); // should try sending the wheel v here
+        bluefruit_serial_send(report->h); // should try sending the wheel h here
+        bluefruit_serial_send(0x00);
+    }
 #endif
 
-    uint8_t timeout = 255;
+#ifdef ADAFRUIT_BLE_ENABLE
+    if (where == OUTPUT_ADAFRUIT_BLE) {
+      // FIXME: mouse buttons
+      adafruit_ble_send_mouse_move(report->x, report->y, report->v, report->h);
+    }
+#endif
 
-    if (USB_DeviceState != DEVICE_STATE_Configured)
-        return;
+    if (where != OUTPUT_USB && where != OUTPUT_USB_AND_BT) {
+      return;
+    }
 
     /* Select the Mouse Report Endpoint */
     Endpoint_SelectEndpoint(MOUSE_IN_EPNUM);
@@ -535,7 +708,7 @@ static void send_system(uint16_t data)
 
     report_extra_t r = {
         .report_id = REPORT_ID_SYSTEM,
-        .usage = data
+        .usage = data - SYSTEM_POWER_DOWN + 1
     };
     Endpoint_SelectEndpoint(EXTRAKEY_IN_EPNUM);
 
@@ -549,27 +722,36 @@ static void send_system(uint16_t data)
 
 static void send_consumer(uint16_t data)
 {
+    uint8_t timeout = 255;
+    uint8_t where = where_to_send();
 
 #ifdef BLUETOOTH_ENABLE
-    static uint16_t last_data = 0;
-    if (data == last_data) return;
-    last_data = data;
-    uint16_t bitmap = CONSUMER2BLUEFRUIT(data);
-    bluefruit_serial_send(0xFD);
-    bluefruit_serial_send(0x00);
-    bluefruit_serial_send(0x02);
-    bluefruit_serial_send((bitmap>>8)&0xFF);
-    bluefruit_serial_send(bitmap&0xFF);
-    bluefruit_serial_send(0x00);
-    bluefruit_serial_send(0x00);
-    bluefruit_serial_send(0x00);
-    bluefruit_serial_send(0x00);
+    if (where == OUTPUT_BLUETOOTH || where == OUTPUT_USB_AND_BT) {
+        static uint16_t last_data = 0;
+        if (data == last_data) return;
+        last_data = data;
+        uint16_t bitmap = CONSUMER2BLUEFRUIT(data);
+        bluefruit_serial_send(0xFD);
+        bluefruit_serial_send(0x00);
+        bluefruit_serial_send(0x02);
+        bluefruit_serial_send((bitmap>>8)&0xFF);
+        bluefruit_serial_send(bitmap&0xFF);
+        bluefruit_serial_send(0x00);
+        bluefruit_serial_send(0x00);
+        bluefruit_serial_send(0x00);
+        bluefruit_serial_send(0x00);
+    }
 #endif
 
-    uint8_t timeout = 255;
+#ifdef ADAFRUIT_BLE_ENABLE
+    if (where == OUTPUT_ADAFRUIT_BLE) {
+      adafruit_ble_send_consumer_key(data, 0);
+    }
+#endif
 
-    if (USB_DeviceState != DEVICE_STATE_Configured)
-        return;
+    if (where != OUTPUT_USB && where != OUTPUT_USB_AND_BT) {
+      return;
+    }
 
     report_extra_t r = {
         .report_id = REPORT_ID_CONSUMER,
@@ -659,7 +841,7 @@ int8_t sendchar(uint8_t c)
  ******************************************************************************/
 
 #ifdef MIDI_ENABLE
-void usb_send_func(MidiDevice * device, uint16_t cnt, uint8_t byte0, uint8_t byte1, uint8_t byte2) {
+static void usb_send_func(MidiDevice * device, uint16_t cnt, uint8_t byte0, uint8_t byte1, uint8_t byte2) {
   MIDI_EventPacket_t event;
   event.Data1 = byte0;
   event.Data2 = byte1;
@@ -719,7 +901,7 @@ void usb_send_func(MidiDevice * device, uint16_t cnt, uint8_t byte0, uint8_t byt
   USB_USBTask();
 }
 
-void usb_get_midi(MidiDevice * device) {
+static void usb_get_midi(MidiDevice * device) {
   MIDI_EventPacket_t event;
   while (MIDI_Device_ReceiveEventPacket(&USB_MIDI_Interface, &event)) {
 
@@ -749,12 +931,12 @@ void usb_get_midi(MidiDevice * device) {
   USB_USBTask();
 }
 
-void midi_usb_init(MidiDevice * device){
+static void midi_usb_init(MidiDevice * device){
   midi_device_init(device);
   midi_device_set_send_func(device, usb_send_func);
   midi_device_set_pre_input_process_func(device, usb_get_midi);
 
-  SetupHardware();
+  // SetupHardware();
   sei();
 }
 
@@ -827,6 +1009,61 @@ void MIDI_Task(void)
 
 #endif
 
+/*******************************************************************************
+ * VIRTUAL SERIAL
+ ******************************************************************************/
+
+#ifdef VIRTSER_ENABLE
+void virtser_init(void)
+{
+  cdc_device.State.ControlLineStates.DeviceToHost = CDC_CONTROL_LINE_IN_DSR ;
+  CDC_Device_SendControlLineStateChange(&cdc_device);
+}
+
+void virtser_recv(uint8_t c) __attribute__ ((weak));
+void virtser_recv(uint8_t c)
+{
+  // Ignore by default
+}
+
+void virtser_task(void)
+{
+  uint16_t count = CDC_Device_BytesReceived(&cdc_device);
+  uint8_t ch;
+  if (count)
+  {
+    ch = CDC_Device_ReceiveByte(&cdc_device);
+    virtser_recv(ch);
+  }
+}
+void virtser_send(const uint8_t byte)
+{
+  uint8_t timeout = 255;
+  uint8_t ep = Endpoint_GetCurrentEndpoint();
+
+  if (cdc_device.State.ControlLineStates.HostToDevice & CDC_CONTROL_LINE_OUT_DTR)
+  {
+    /* IN packet */
+    Endpoint_SelectEndpoint(cdc_device.Config.DataINEndpoint.Address);
+
+    if (!Endpoint_IsEnabled() || !Endpoint_IsConfigured()) {
+        Endpoint_SelectEndpoint(ep);
+        return;
+    }
+
+    while (timeout-- && !Endpoint_IsReadWriteAllowed()) _delay_us(40);
+
+    Endpoint_Write_8(byte);
+    CDC_Device_Flush(&cdc_device);
+
+    if (Endpoint_IsINReady()) {
+      Endpoint_ClearIN();
+    }
+
+    Endpoint_SelectEndpoint(ep);
+  }
+}
+#endif
 
 /*******************************************************************************
  * main
@@ -918,9 +1155,13 @@ int main(void)
     sleep_led_init();
 #endif
 
+#ifdef VIRTSER_ENABLE
+    virtser_init();
+#endif
+
     print("Keyboard start.\n");
     while (1) {
-        #ifndef BLUETOOTH_ENABLE
+        #if !defined(BLUETOOTH_ENABLE) && !defined(ADAFRUIT_BLE_ENABLE)
         while (USB_DeviceState == DEVICE_STATE_Suspended) {
             print("[s]");
             suspend_power_down();
@@ -930,15 +1171,34 @@ int main(void)
         }
         #endif
 
+        keyboard_task();
+
 #ifdef MIDI_ENABLE
         midi_device_process(&midi_device);
         // MIDI_Task();
 #endif
-        keyboard_task();
+
+#if defined(RGBLIGHT_ANIMATIONS) & defined(RGBLIGHT_ENABLE)
+        rgblight_task();
+#endif
+
+#ifdef ADAFRUIT_BLE_ENABLE
+        adafruit_ble_task();
+#endif
+
+#ifdef VIRTSER_ENABLE
+        virtser_task();
+        CDC_Device_USBTask(&cdc_device);
+#endif
+
+#ifdef RAW_ENABLE
+        raw_hid_task();
+#endif
 
 #if !defined(INTERRUPT_CONTROL_ENDPOINT)
         USB_USBTask();
 #endif
+
     }
 }
 
@@ -963,15 +1223,50 @@ void fallthrough_callback(MidiDevice * device,
 #endif
 }
 
+
 void cc_callback(MidiDevice * device,
     uint8_t chan, uint8_t num, uint8_t val) {
   //sending it back on the next channel
-  midi_send_cc(device, (chan + 1) % 16, num, val);
+  // midi_send_cc(device, (chan + 1) % 16, num, val);
 }
 
-void sysex_callback(MidiDevice * device,
-    uint16_t start, uint8_t length, uint8_t * data) {
-  for (int i = 0; i < length; i++)
-    midi_send_cc(device, 15, 0x7F & data[i], 0x7F & (start + i));
+#ifdef API_SYSEX_ENABLE
+uint8_t midi_buffer[MIDI_SYSEX_BUFFER] = {0};
+#endif
+
+void sysex_callback(MidiDevice * device, uint16_t start, uint8_t length, uint8_t * data) {
+    #ifdef API_SYSEX_ENABLE
+        // SEND_STRING("\n");
+        // send_word(start);
+        // SEND_STRING(": ");
+        // Don't store the header
+        int16_t pos = start - 4;
+        for (uint8_t place = 0; place < length; place++) {
+            // send_byte(*data);
+            if (pos >= 0) {
+                if (*data == 0xF7) {
+                    // SEND_STRING("\nRD: ");
+                    // for (uint8_t i = 0; i < start + place + 1; i++){
+                    //     send_byte(midi_buffer[i]);
+                    // SEND_STRING(" ");
+                    // }
+                    const unsigned decoded_length = sysex_decoded_length(pos);
+                    uint8_t decoded[API_SYSEX_MAX_SIZE];
+                    sysex_decode(decoded, midi_buffer, pos);
+                    process_api(decoded_length, decoded);
+                    return;
+                }
+                else if (pos >= MIDI_SYSEX_BUFFER) {
+                    return;
+                }
+                midi_buffer[pos] = *data;
+            }
+            // SEND_STRING(" ");
+            data++;
+            pos++;
+        }
+    #endif
 }
+
+
 #endif
diff --git a/tmk_core/protocol/lufa/lufa.h b/tmk_core/protocol/lufa/lufa.h
index aad08d6407..a049fd43c9 100644
--- a/tmk_core/protocol/lufa/lufa.h
+++ b/tmk_core/protocol/lufa/lufa.h
@@ -68,8 +68,19 @@ typedef struct {
 } __attribute__ ((packed)) report_extra_t;
 
 #ifdef MIDI_ENABLE
-void MIDI_Task(void);
-MidiDevice midi_device;
+  void MIDI_Task(void);
+  MidiDevice midi_device;
+#endif
+
+#ifdef API_ENABLE
+  #include "api.h"
+#endif
+
+#ifdef API_SYSEX_ENABLE
+  #include "api_sysex.h"
+  // Allocate space for encoding overhead.
+  //The header and terminator are not stored to save a few bytes of precious ram
+  #define MIDI_SYSEX_BUFFER (API_SYSEX_MAX_SIZE + API_SYSEX_MAX_SIZE / 7 + (API_SYSEX_MAX_SIZE % 7 ? 1 : 0))
 #endif
 
 // #if LUFA_VERSION_INTEGER < 0x120730
diff --git a/tmk_core/protocol/lufa/outputselect.c b/tmk_core/protocol/lufa/outputselect.c
new file mode 100644
index 0000000000..5d2457bfff
--- /dev/null
+++ b/tmk_core/protocol/lufa/outputselect.c
@@ -0,0 +1,56 @@
+/*
+Copyright 2017 Priyadi Iman Nurcahyo
+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/>.
+*/
+
+#include "lufa.h"
+#include "outputselect.h"
+#ifdef ADAFRUIT_BLE_ENABLE
+    #include "adafruit_ble.h"
+#endif
+
+uint8_t desired_output = OUTPUT_DEFAULT;
+
+void set_output(uint8_t output) {
+    set_output_user(output);
+    desired_output = output;
+}
+
+__attribute__((weak))
+void set_output_user(uint8_t output) {
+}
+
+uint8_t auto_detect_output(void) {
+    if (USB_DeviceState == DEVICE_STATE_Configured) {
+        return OUTPUT_USB;
+    }
+
+#ifdef ADAFRUIT_BLE_ENABLE
+    if (adafruit_ble_is_connected()) {
+        return OUTPUT_ADAFRUIT_BLE;
+    }
+#endif
+
+#ifdef BLUETOOTH_ENABLE
+    return OUTPUT_BLUETOOTH; // should check if BT is connected here
+#endif
+
+    return OUTPUT_NONE;
+}
+
+uint8_t where_to_send(void) {
+    if (desired_output == OUTPUT_AUTO) {
+        return auto_detect_output();
+    }
+    return desired_output;
+}
+
diff --git a/tmk_core/protocol/lufa/outputselect.h b/tmk_core/protocol/lufa/outputselect.h
new file mode 100644
index 0000000000..79b4dd35dd
--- /dev/null
+++ b/tmk_core/protocol/lufa/outputselect.h
@@ -0,0 +1,41 @@
+/*
+Copyright 2017 Priyadi Iman Nurcahyo
+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/>.
+*/
+
+enum outputs {
+    OUTPUT_AUTO,
+
+    OUTPUT_NONE,
+    OUTPUT_USB,
+    OUTPUT_BLUETOOTH,
+    OUTPUT_ADAFRUIT_BLE,
+
+    // backward compatibility
+    OUTPUT_USB_AND_BT
+};
+
+/**
+ * backward compatibility for BLUETOOTH_ENABLE, send to BT and USB by default
+ */
+#ifndef OUTPUT_DEFAULT
+    #ifdef BLUETOOTH_ENABLE
+        #define OUTPUT_DEFAULT OUTPUT_USB_AND_BT
+    #else
+        #define OUTPUT_DEFAULT OUTPUT_AUTO
+    #endif
+#endif
+
+void set_output(uint8_t output);
+void set_output_user(uint8_t output);
+uint8_t auto_detect_output(void);
+uint8_t where_to_send(void);
\ No newline at end of file
diff --git a/tmk_core/protocol/lufa/ringbuffer.hpp b/tmk_core/protocol/lufa/ringbuffer.hpp
new file mode 100644
index 0000000000..70a3c4881d
--- /dev/null
+++ b/tmk_core/protocol/lufa/ringbuffer.hpp
@@ -0,0 +1,66 @@
+#pragma once
+// A simple ringbuffer holding Size elements of type T
+template <typename T, uint8_t Size>
+class RingBuffer {
+ protected:
+  T buf_[Size];
+  uint8_t head_{0}, tail_{0};
+ public:
+  inline uint8_t nextPosition(uint8_t position) {
+    return (position + 1) % Size;
+  }
+
+  inline uint8_t prevPosition(uint8_t position) {
+    if (position == 0) {
+      return Size - 1;
+    }
+    return position - 1;
+  }
+
+  inline bool enqueue(const T &item) {
+    static_assert(Size > 1, "RingBuffer size must be > 1");
+    uint8_t next = nextPosition(head_);
+    if (next == tail_) {
+      // Full
+      return false;
+    }
+
+    buf_[head_] = item;
+    head_ = next;
+    return true;
+  }
+
+  inline bool get(T &dest, bool commit = true) {
+    auto tail = tail_;
+    if (tail == head_) {
+      // No more data
+      return false;
+    }
+
+    dest = buf_[tail];
+    tail = nextPosition(tail);
+
+    if (commit) {
+      tail_ = tail;
+    }
+    return true;
+  }
+
+  inline bool empty() const { return head_ == tail_; }
+
+  inline uint8_t size() const {
+    int diff = head_ - tail_;
+    if (diff >= 0) {
+      return diff;
+    }
+    return Size + diff;
+  }
+
+  inline T& front() {
+    return buf_[tail_];
+  }
+
+  inline bool peek(T &item) {
+    return get(item, false);
+  }
+};
diff --git a/tmk_core/protocol/midi.mk b/tmk_core/protocol/midi.mk
index c85ae42ff2..4855b23d30 100644
--- a/tmk_core/protocol/midi.mk
+++ b/tmk_core/protocol/midi.mk
@@ -4,6 +4,7 @@ SRC += midi.c \
 	   midi_device.c \
 	   bytequeue/bytequeue.c \
 	   bytequeue/interrupt_setting.c \
+	   sysex_tools.c \
 	   $(LUFA_SRC_USBCLASS)
 
 VPATH += $(TMK_PATH)/$(MIDI_DIR)
\ No newline at end of file
diff --git a/tmk_core/protocol/midi/Config/LUFAConfig.h b/tmk_core/protocol/midi/Config/LUFAConfig.h
index fa9404498f..a1d7482672 100755
--- a/tmk_core/protocol/midi/Config/LUFAConfig.h
+++ b/tmk_core/protocol/midi/Config/LUFAConfig.h
@@ -1,93 +1,93 @@
-/*

-             LUFA Library

-     Copyright (C) Dean Camera, 2012.

-

-  dean [at] fourwalledcubicle [dot] com

-           www.lufa-lib.org

-*/

-

-/*

-  Copyright 2012  Dean Camera (dean [at] fourwalledcubicle [dot] com)

-

-  Permission to use, copy, modify, distribute, and sell this

-  software and its documentation for any purpose is hereby granted

-  without fee, provided that the above copyright notice appear in

-  all copies and that both that the copyright notice and this

-  permission notice and warranty disclaimer appear in supporting

-  documentation, and that the 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 LUFA Library Configuration Header File

- *

- *  This header file is used to configure LUFA's compile time options,

- *  as an alternative to the compile time constants supplied through

- *  a makefile.

- *

- *  For information on what each token does, refer to the LUFA

- *  manual section "Summary of Compile Tokens".

- */

-

-#ifndef _LUFA_CONFIG_H_

-#define _LUFA_CONFIG_H_

-

-	#if (ARCH == ARCH_AVR8)

-

-		/* Non-USB Related Configuration Tokens: */

-//		#define DISABLE_TERMINAL_CODES

-

-		/* USB Class Driver Related Tokens: */

-//		#define HID_HOST_BOOT_PROTOCOL_ONLY

-//		#define HID_STATETABLE_STACK_DEPTH       {Insert Value Here}

-//		#define HID_USAGE_STACK_DEPTH            {Insert Value Here}

-//		#define HID_MAX_COLLECTIONS              {Insert Value Here}

-//		#define HID_MAX_REPORTITEMS              {Insert Value Here}

-//		#define HID_MAX_REPORT_IDS               {Insert Value Here}

-//		#define NO_CLASS_DRIVER_AUTOFLUSH

-

-		/* General USB Driver Related Tokens: */

-//		#define ORDERED_EP_CONFIG

-		#define USE_STATIC_OPTIONS               (USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)

-		#define USB_DEVICE_ONLY

-//		#define USB_HOST_ONLY

-//		#define USB_STREAM_TIMEOUT_MS            {Insert Value Here}

-//		#define NO_LIMITED_CONTROLLER_CONNECT

-//		#define NO_SOF_EVENTS

-

-		/* USB Device Mode Driver Related Tokens: */

-//		#define USE_RAM_DESCRIPTORS

-		#define USE_FLASH_DESCRIPTORS

-//		#define USE_EEPROM_DESCRIPTORS

-//		#define NO_INTERNAL_SERIAL

-		#define FIXED_CONTROL_ENDPOINT_SIZE      8

-//		#define DEVICE_STATE_AS_GPIOR            {Insert Value Here}

-		#define FIXED_NUM_CONFIGURATIONS         1

-//		#define CONTROL_ONLY_DEVICE

-//		#define INTERRUPT_CONTROL_ENDPOINT

-//		#define NO_DEVICE_REMOTE_WAKEUP

-//		#define NO_DEVICE_SELF_POWER

-

-		/* USB Host Mode Driver Related Tokens: */

-//		#define HOST_STATE_AS_GPIOR              {Insert Value Here}

-//		#define USB_HOST_TIMEOUT_MS              {Insert Value Here}

-//		#define HOST_DEVICE_SETTLE_DELAY_MS	     {Insert Value Here}

-//      #define NO_AUTO_VBUS_MANAGEMENT

-//      #define INVERTED_VBUS_ENABLE_LINE

-

-	#else

-

-		#error Unsupported architecture for this LUFA configuration file.

-

-	#endif

-#endif

+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2012.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2012  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the 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 LUFA Library Configuration Header File
+ *
+ *  This header file is used to configure LUFA's compile time options,
+ *  as an alternative to the compile time constants supplied through
+ *  a makefile.
+ *
+ *  For information on what each token does, refer to the LUFA
+ *  manual section "Summary of Compile Tokens".
+ */
+
+#ifndef _LUFA_CONFIG_H_
+#define _LUFA_CONFIG_H_
+
+	#if (ARCH == ARCH_AVR8)
+
+		/* Non-USB Related Configuration Tokens: */
+//		#define DISABLE_TERMINAL_CODES
+
+		/* USB Class Driver Related Tokens: */
+//		#define HID_HOST_BOOT_PROTOCOL_ONLY
+//		#define HID_STATETABLE_STACK_DEPTH       {Insert Value Here}
+//		#define HID_USAGE_STACK_DEPTH            {Insert Value Here}
+//		#define HID_MAX_COLLECTIONS              {Insert Value Here}
+//		#define HID_MAX_REPORTITEMS              {Insert Value Here}
+//		#define HID_MAX_REPORT_IDS               {Insert Value Here}
+//		#define NO_CLASS_DRIVER_AUTOFLUSH
+
+		/* General USB Driver Related Tokens: */
+//		#define ORDERED_EP_CONFIG
+		#define USE_STATIC_OPTIONS               (USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)
+		#define USB_DEVICE_ONLY
+//		#define USB_HOST_ONLY
+//		#define USB_STREAM_TIMEOUT_MS            {Insert Value Here}
+//		#define NO_LIMITED_CONTROLLER_CONNECT
+//		#define NO_SOF_EVENTS
+
+		/* USB Device Mode Driver Related Tokens: */
+//		#define USE_RAM_DESCRIPTORS
+		#define USE_FLASH_DESCRIPTORS
+//		#define USE_EEPROM_DESCRIPTORS
+//		#define NO_INTERNAL_SERIAL
+		#define FIXED_CONTROL_ENDPOINT_SIZE      8
+//		#define DEVICE_STATE_AS_GPIOR            {Insert Value Here}
+		#define FIXED_NUM_CONFIGURATIONS         1
+//		#define CONTROL_ONLY_DEVICE
+//		#define INTERRUPT_CONTROL_ENDPOINT
+//		#define NO_DEVICE_REMOTE_WAKEUP
+//		#define NO_DEVICE_SELF_POWER
+
+		/* USB Host Mode Driver Related Tokens: */
+//		#define HOST_STATE_AS_GPIOR              {Insert Value Here}
+//		#define USB_HOST_TIMEOUT_MS              {Insert Value Here}
+//		#define HOST_DEVICE_SETTLE_DELAY_MS	     {Insert Value Here}
+//      #define NO_AUTO_VBUS_MANAGEMENT
+//      #define INVERTED_VBUS_ENABLE_LINE
+
+	#else
+
+		#error Unsupported architecture for this LUFA configuration file.
+
+	#endif
+#endif
diff --git a/tmk_core/protocol/pjrc/usb.c b/tmk_core/protocol/pjrc/usb.c
index 1e6ba8719a..09efbe0762 100644
--- a/tmk_core/protocol/pjrc/usb.c
+++ b/tmk_core/protocol/pjrc/usb.c
@@ -1,17 +1,17 @@
 /* USB Keyboard Plus Debug Channel Example for Teensy USB Development Board
  * http://www.pjrc.com/teensy/usb_keyboard.html
  * Copyright (c) 2009 PJRC.COM, LLC
- * 
+ *
  * Permission is hereby granted, free of charge, to any person obtaining a copy
  * of this software and associated documentation files (the "Software"), to deal
  * in the Software without restriction, including without limitation the rights
  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  * copies of the Software, and to permit persons to whom the Software is
  * furnished to do so, subject to the following conditions:
- * 
+ *
  * The above copyright notice and this permission notice shall be included in
  * all copies or substantial portions of the Software.
- * 
+ *
  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
@@ -41,6 +41,12 @@
 #include "action.h"
 #include "action_util.h"
 
+#ifdef NKRO_ENABLE
+  #include "keycode_config.h"
+
+  extern keymap_config_t keymap_config;
+#endif
+
 
 /**************************************************************************
  *
@@ -694,7 +700,7 @@ ISR(USB_GEN_vect)
 		}
                 /* TODO: should keep IDLE rate on each keyboard interface */
 #ifdef NKRO_ENABLE
-		if (!keyboard_nkro && keyboard_idle && (++div4 & 3) == 0) {
+		if (!keymap_config.nkro && keyboard_idle && (++div4 & 3) == 0) {
 #else
 		if (keyboard_idle && (++div4 & 3) == 0) {
 #endif
@@ -881,7 +887,7 @@ ISR(USB_COM_vect)
 #endif
                     if (bmRequestType == 0x00 && wValue == DEVICE_REMOTE_WAKEUP) {
                         if (bRequest == SET_FEATURE) {
-                            remote_wakeup = true;   
+                            remote_wakeup = true;
                         } else {
                             remote_wakeup = false;
                         }
@@ -932,7 +938,7 @@ ISR(USB_COM_vect)
 				if (bRequest == HID_SET_PROTOCOL) {
 					keyboard_protocol = wValue;
 #ifdef NKRO_ENABLE
-                                        keyboard_nkro = !!keyboard_protocol;
+                                        keymap_config.nkro = !!keyboard_protocol;
 #endif
                                         clear_keyboard();
 					//usb_wait_in_ready();
diff --git a/tmk_core/protocol/pjrc/usb_keyboard.c b/tmk_core/protocol/pjrc/usb_keyboard.c
index 4b87b5d7b5..05f4797340 100644
--- a/tmk_core/protocol/pjrc/usb_keyboard.c
+++ b/tmk_core/protocol/pjrc/usb_keyboard.c
@@ -30,6 +30,12 @@
 #include "util.h"
 #include "host.h"
 
+#ifdef NKRO_ENABLE
+  #include "keycode_config.h"
+
+  extern keymap_config_t keymap_config;
+#endif
+
 
 // protocol setting from the host.  We use exactly the same report
 // either way, so this variable only stores the setting since we
@@ -56,7 +62,7 @@ int8_t usb_keyboard_send_report(report_keyboard_t *report)
     int8_t result = 0;
 
 #ifdef NKRO_ENABLE
-    if (keyboard_nkro)
+    if (keymap_config.nkro)
         result = send_report(report, KBD2_ENDPOINT, 0, KBD2_SIZE);
     else
 #endif
diff --git a/tmk_core/protocol/ps2_mouse.c b/tmk_core/protocol/ps2_mouse.c
index c3e8b3c1c3..d9ccbecb43 100644
--- a/tmk_core/protocol/ps2_mouse.c
+++ b/tmk_core/protocol/ps2_mouse.c
@@ -18,60 +18,59 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #include <stdbool.h>
 #include<avr/io.h>
 #include<util/delay.h>
-#include "ps2.h"
 #include "ps2_mouse.h"
-#include "report.h"
 #include "host.h"
 #include "timer.h"
 #include "print.h"
+#include "report.h"
 #include "debug.h"
+#include "ps2.h"
 
+/* ============================= MACROS ============================ */
 
 static report_mouse_t mouse_report = {};
 
+static inline void ps2_mouse_print_report(report_mouse_t *mouse_report);
+static inline void ps2_mouse_convert_report_to_hid(report_mouse_t *mouse_report);
+static inline void ps2_mouse_clear_report(report_mouse_t *mouse_report);
+static inline void ps2_mouse_enable_scrolling(void);
+static inline void ps2_mouse_scroll_button_task(report_mouse_t *mouse_report);
 
-static void print_usb_data(void);
-
+/* ============================= IMPLEMENTATION ============================ */
 
 /* supports only 3 button mouse at this time */
-uint8_t ps2_mouse_init(void) {
-    uint8_t rcv;
-
+void ps2_mouse_init(void) {
     ps2_host_init();
 
-    _delay_ms(1000);    // wait for powering up
+    _delay_ms(PS2_MOUSE_INIT_DELAY);    // wait for powering up
 
-    // send Reset
-    rcv = ps2_host_send(0xFF);
-    print("ps2_mouse_init: send Reset: ");
-    phex(rcv); phex(ps2_error); print("\n");
+    PS2_MOUSE_SEND(PS2_MOUSE_RESET, "ps2_mouse_init: sending reset");
 
-    // read completion code of BAT
-    rcv = ps2_host_recv_response();
-    print("ps2_mouse_init: read BAT: ");
-    phex(rcv); phex(ps2_error); print("\n");
+    PS2_MOUSE_RECEIVE("ps2_mouse_init: read BAT");
+    PS2_MOUSE_RECEIVE("ps2_mouse_init: read DevID");
 
-    // read Device ID
-    rcv = ps2_host_recv_response();
-    print("ps2_mouse_init: read DevID: ");
-    phex(rcv); phex(ps2_error); print("\n");
+#ifdef PS2_MOUSE_USE_REMOTE_MODE
+    ps2_mouse_set_remote_mode();
+#else
+    ps2_mouse_enable_data_reporting();
+#endif
+
+#ifdef PS2_MOUSE_ENABLE_SCROLLING
+    ps2_mouse_enable_scrolling();
+#endif
 
-    // send Set Remote mode
-    rcv = ps2_host_send(0xF0);
-    print("ps2_mouse_init: send 0xF0: ");
-    phex(rcv); phex(ps2_error); print("\n");
+#ifdef PS2_MOUSE_USE_2_1_SCALING
+    ps2_mouse_set_scaling_2_1();
+#endif
 
-    return 0;
+    ps2_mouse_init_user();
 }
 
-#define X_IS_NEG  (mouse_report.buttons & (1<<PS2_MOUSE_X_SIGN))
-#define Y_IS_NEG  (mouse_report.buttons & (1<<PS2_MOUSE_Y_SIGN))
-#define X_IS_OVF  (mouse_report.buttons & (1<<PS2_MOUSE_X_OVFLW))
-#define Y_IS_OVF  (mouse_report.buttons & (1<<PS2_MOUSE_Y_OVFLW))
-void ps2_mouse_task(void)
-{
-    enum { SCROLL_NONE, SCROLL_BTN, SCROLL_SENT };
-    static uint8_t scroll_state = SCROLL_NONE;
+__attribute__((weak))
+void ps2_mouse_init_user(void) {
+}
+
+void ps2_mouse_task(void) {
     static uint8_t buttons_prev = 0;
 
     /* receives packet from mouse */
@@ -79,142 +78,169 @@ void ps2_mouse_task(void)
     rcv = ps2_host_send(PS2_MOUSE_READ_DATA);
     if (rcv == PS2_ACK) {
         mouse_report.buttons = ps2_host_recv_response();
-        mouse_report.x = ps2_host_recv_response();
-        mouse_report.y = ps2_host_recv_response();
+        mouse_report.x = ps2_host_recv_response() * PS2_MOUSE_X_MULTIPLIER;
+        mouse_report.y = ps2_host_recv_response() * PS2_MOUSE_Y_MULTIPLIER;
+#ifdef PS2_MOUSE_ENABLE_SCROLLING
+        mouse_report.v = -(ps2_host_recv_response() & PS2_MOUSE_SCROLL_MASK) * PS2_MOUSE_V_MULTIPLIER;
+#endif
     } else {
         if (debug_mouse) print("ps2_mouse: fail to get mouse packet\n");
         return;
     }
-        xprintf("%ud ", timer_read());
-        print("ps2_mouse raw: [");
-        phex(mouse_report.buttons); print("|");
-        print_hex8((uint8_t)mouse_report.x); print(" ");
-        print_hex8((uint8_t)mouse_report.y); print("]\n");
 
     /* if mouse moves or buttons state changes */
-    if (mouse_report.x || mouse_report.y ||
+    if (mouse_report.x || mouse_report.y || mouse_report.v ||
             ((mouse_report.buttons ^ buttons_prev) & PS2_MOUSE_BTN_MASK)) {
-
-#ifdef PS2_MOUSE_DEBUG
-        print("ps2_mouse raw: [");
-        phex(mouse_report.buttons); print("|");
-        print_hex8((uint8_t)mouse_report.x); print(" ");
-        print_hex8((uint8_t)mouse_report.y); print("]\n");
+#ifdef PS2_MOUSE_DEBUG_RAW
+        // Used to debug raw ps2 bytes from mouse
+        ps2_mouse_print_report(&mouse_report);
 #endif
-
         buttons_prev = mouse_report.buttons;
+        ps2_mouse_convert_report_to_hid(&mouse_report);
+#if PS2_MOUSE_SCROLL_BTN_MASK
+        ps2_mouse_scroll_button_task(&mouse_report);
+#endif
+#ifdef PS2_MOUSE_DEBUG_HID
+        // Used to debug the bytes sent to the host
+        ps2_mouse_print_report(&mouse_report);
+#endif
+        host_mouse_send(&mouse_report);
+    }
+    
+    ps2_mouse_clear_report(&mouse_report);
+}
 
-        // PS/2 mouse data is '9-bit integer'(-256 to 255) which is comprised of sign-bit and 8-bit value.
-        // bit: 8    7 ... 0
-        //      sign \8-bit/
-        //
-        // Meanwhile USB HID mouse indicates 8bit data(-127 to 127), note that -128 is not used.
-        //
-        // This converts PS/2 data into HID value. Use only -127-127 out of PS/2 9-bit.
-        mouse_report.x = X_IS_NEG ?
-                          ((!X_IS_OVF && -127 <= mouse_report.x && mouse_report.x <= -1) ?  mouse_report.x : -127) :
-                          ((!X_IS_OVF && 0 <= mouse_report.x && mouse_report.x <= 127) ? mouse_report.x : 127);
-        mouse_report.y = Y_IS_NEG ?
-                          ((!Y_IS_OVF && -127 <= mouse_report.y && mouse_report.y <= -1) ?  mouse_report.y : -127) :
-                          ((!Y_IS_OVF && 0 <= mouse_report.y && mouse_report.y <= 127) ? mouse_report.y : 127);
+void ps2_mouse_disable_data_reporting(void) {
+    PS2_MOUSE_SEND(PS2_MOUSE_DISABLE_DATA_REPORTING, "ps2 mouse disable data reporting"); 
+}
 
-        // remove sign and overflow flags
-        mouse_report.buttons &= PS2_MOUSE_BTN_MASK;
+void ps2_mouse_enable_data_reporting(void) {
+    PS2_MOUSE_SEND(PS2_MOUSE_ENABLE_DATA_REPORTING, "ps2 mouse enable data reporting");
+}
 
-        // invert coordinate of y to conform to USB HID mouse
-        mouse_report.y = -mouse_report.y;
+void ps2_mouse_set_remote_mode(void) { 
+    PS2_MOUSE_SEND_SAFE(PS2_MOUSE_SET_REMOTE_MODE, "ps2 mouse set remote mode"); 
+    ps2_mouse_mode = PS2_MOUSE_REMOTE_MODE;
+}
 
+void ps2_mouse_set_stream_mode(void) { 
+    PS2_MOUSE_SEND_SAFE(PS2_MOUSE_SET_STREAM_MODE, "ps2 mouse set stream mode"); 
+    ps2_mouse_mode = PS2_MOUSE_STREAM_MODE;
+}
 
-#if PS2_MOUSE_SCROLL_BTN_MASK
-        static uint16_t scroll_button_time = 0;
-        if ((mouse_report.buttons & (PS2_MOUSE_SCROLL_BTN_MASK)) == (PS2_MOUSE_SCROLL_BTN_MASK)) {
-            if (scroll_state == SCROLL_NONE) {
-                scroll_button_time = timer_read();
-                scroll_state = SCROLL_BTN;
-            }
-
-            // doesn't send Scroll Button
-            //mouse_report.buttons &= ~(PS2_MOUSE_SCROLL_BTN_MASK);
-
-            if (mouse_report.x || mouse_report.y) {
-                scroll_state = SCROLL_SENT;
-
-                mouse_report.v = -mouse_report.y/(PS2_MOUSE_SCROLL_DIVISOR_V);
-                mouse_report.h =  mouse_report.x/(PS2_MOUSE_SCROLL_DIVISOR_H);
-                mouse_report.x = 0;
-                mouse_report.y = 0;
-                //host_mouse_send(&mouse_report);
-            }
+void ps2_mouse_set_scaling_2_1(void) {
+    PS2_MOUSE_SEND_SAFE(PS2_MOUSE_SET_SCALING_2_1, "ps2 mouse set scaling 2:1"); 
+}
+
+void ps2_mouse_set_scaling_1_1(void) {
+    PS2_MOUSE_SEND_SAFE(PS2_MOUSE_SET_SCALING_1_1, "ps2 mouse set scaling 1:1"); 
+}
+
+void ps2_mouse_set_resolution(ps2_mouse_resolution_t resolution) {
+    PS2_MOUSE_SET_SAFE(PS2_MOUSE_SET_RESOLUTION, resolution, "ps2 mouse set resolution");
+}
+
+void ps2_mouse_set_sample_rate(ps2_mouse_sample_rate_t sample_rate) {
+    PS2_MOUSE_SET_SAFE(PS2_MOUSE_SET_SAMPLE_RATE, sample_rate, "ps2 mouse set sample rate");
+}
+
+/* ============================= HELPERS ============================ */
+
+#define X_IS_NEG  (mouse_report->buttons & (1<<PS2_MOUSE_X_SIGN))
+#define Y_IS_NEG  (mouse_report->buttons & (1<<PS2_MOUSE_Y_SIGN))
+#define X_IS_OVF  (mouse_report->buttons & (1<<PS2_MOUSE_X_OVFLW))
+#define Y_IS_OVF  (mouse_report->buttons & (1<<PS2_MOUSE_Y_OVFLW))
+static inline void ps2_mouse_convert_report_to_hid(report_mouse_t *mouse_report) {
+    // PS/2 mouse data is '9-bit integer'(-256 to 255) which is comprised of sign-bit and 8-bit value.
+    // bit: 8    7 ... 0
+    //      sign \8-bit/
+    //
+    // Meanwhile USB HID mouse indicates 8bit data(-127 to 127), note that -128 is not used.
+    //
+    // This converts PS/2 data into HID value. Use only -127-127 out of PS/2 9-bit.
+    mouse_report->x = X_IS_NEG ?
+        ((!X_IS_OVF && -127 <= mouse_report->x && mouse_report->x <= -1) ?  mouse_report->x : -127) :
+        ((!X_IS_OVF && 0 <= mouse_report->x && mouse_report->x <= 127) ? mouse_report->x : 127);
+    mouse_report->y = Y_IS_NEG ?
+        ((!Y_IS_OVF && -127 <= mouse_report->y && mouse_report->y <= -1) ?  mouse_report->y : -127) :
+        ((!Y_IS_OVF && 0 <= mouse_report->y && mouse_report->y <= 127) ? mouse_report->y : 127);
+
+    // remove sign and overflow flags
+    mouse_report->buttons &= PS2_MOUSE_BTN_MASK;
+
+    // invert coordinate of y to conform to USB HID mouse
+    mouse_report->y = -mouse_report->y;
+}
+
+static inline void ps2_mouse_clear_report(report_mouse_t *mouse_report) {
+    mouse_report->x = 0;
+    mouse_report->y = 0;
+    mouse_report->v = 0;
+    mouse_report->h = 0;
+    mouse_report->buttons = 0;
+}
+
+static inline void ps2_mouse_print_report(report_mouse_t *mouse_report) {
+    if (!debug_mouse) return;
+    print("ps2_mouse: [");
+    phex(mouse_report->buttons); print("|");
+    print_hex8((uint8_t)mouse_report->x); print(" ");
+    print_hex8((uint8_t)mouse_report->y); print(" ");
+    print_hex8((uint8_t)mouse_report->v); print(" ");
+    print_hex8((uint8_t)mouse_report->h); print("]\n");
+}
+
+static inline void ps2_mouse_enable_scrolling(void) {
+    PS2_MOUSE_SEND(PS2_MOUSE_SET_SAMPLE_RATE, "Initiaing scroll wheel enable: Set sample rate");
+    PS2_MOUSE_SEND(200, "200");
+    PS2_MOUSE_SEND(PS2_MOUSE_SET_SAMPLE_RATE, "Set sample rate");
+    PS2_MOUSE_SEND(100, "100");
+    PS2_MOUSE_SEND(PS2_MOUSE_SET_SAMPLE_RATE, "Set sample rate");
+    PS2_MOUSE_SEND(80, "80");
+    PS2_MOUSE_SEND(PS2_MOUSE_GET_DEVICE_ID, "Finished enabling scroll wheel");
+    _delay_ms(20);
+}
+
+#define PRESS_SCROLL_BUTTONS    mouse_report->buttons |= (PS2_MOUSE_SCROLL_BTN_MASK)
+#define RELEASE_SCROLL_BUTTONS  mouse_report->buttons &= ~(PS2_MOUSE_SCROLL_BTN_MASK)
+static inline void ps2_mouse_scroll_button_task(report_mouse_t *mouse_report) {
+    static enum { 
+        SCROLL_NONE, 
+        SCROLL_BTN, 
+        SCROLL_SENT,
+    } scroll_state = SCROLL_NONE;
+    static uint16_t scroll_button_time = 0;
+
+    if (PS2_MOUSE_SCROLL_BTN_MASK == (mouse_report->buttons & (PS2_MOUSE_SCROLL_BTN_MASK))) {
+        // All scroll buttons are pressed
+
+        if (scroll_state == SCROLL_NONE) {
+            scroll_button_time = timer_read();
+            scroll_state = SCROLL_BTN;
         }
-        else if ((mouse_report.buttons & (PS2_MOUSE_SCROLL_BTN_MASK)) == 0) {
+
+        // If the mouse has moved, update the report to scroll instead of move the mouse
+        if (mouse_report->x || mouse_report->y) {
+            scroll_state = SCROLL_SENT;
+            mouse_report->v = -mouse_report->y/(PS2_MOUSE_SCROLL_DIVISOR_V);
+            mouse_report->h =  mouse_report->x/(PS2_MOUSE_SCROLL_DIVISOR_H);
+            mouse_report->x = 0;
+            mouse_report->y = 0;
+        }
+    } else if (0 == (PS2_MOUSE_SCROLL_BTN_MASK & mouse_report->buttons)) {
+        // None of the scroll buttons are pressed 
+
 #if PS2_MOUSE_SCROLL_BTN_SEND
-            if (scroll_state == SCROLL_BTN &&
-                    TIMER_DIFF_16(timer_read(), scroll_button_time) < PS2_MOUSE_SCROLL_BTN_SEND) {
-                // send Scroll Button(down and up at once) when not scrolled
-                mouse_report.buttons |= (PS2_MOUSE_SCROLL_BTN_MASK);
-                host_mouse_send(&mouse_report);
-                _delay_ms(100);
-                mouse_report.buttons &= ~(PS2_MOUSE_SCROLL_BTN_MASK);
-            }
-#endif
-            scroll_state = SCROLL_NONE;
+        if (scroll_state == SCROLL_BTN 
+                && timer_elapsed(scroll_button_time) < PS2_MOUSE_SCROLL_BTN_SEND) {
+            PRESS_SCROLL_BUTTONS;
+            host_mouse_send(mouse_report);
+            _delay_ms(100);
+            RELEASE_SCROLL_BUTTONS;
         }
-        // doesn't send Scroll Button
-        mouse_report.buttons &= ~(PS2_MOUSE_SCROLL_BTN_MASK);
 #endif
-
-
-        host_mouse_send(&mouse_report);
-        print_usb_data();
+        scroll_state = SCROLL_NONE;
     }
-    // clear report
-    mouse_report.x = 0;
-    mouse_report.y = 0;
-    mouse_report.v = 0;
-    mouse_report.h = 0;
-    mouse_report.buttons = 0;
-}
 
-static void print_usb_data(void)
-{
-    if (!debug_mouse) return;
-    print("ps2_mouse usb: [");
-    phex(mouse_report.buttons); print("|");
-    print_hex8((uint8_t)mouse_report.x); print(" ");
-    print_hex8((uint8_t)mouse_report.y); print(" ");
-    print_hex8((uint8_t)mouse_report.v); print(" ");
-    print_hex8((uint8_t)mouse_report.h); print("]\n");
-}
-
-
-/* PS/2 Mouse Synopsis
- * http://www.computer-engineering.org/ps2mouse/
- *
- * Command:
- * 0xFF: Reset
- * 0xF6: Set Defaults Sampling; rate=100, resolution=4cnt/mm, scaling=1:1, reporting=disabled
- * 0xF5: Disable Data Reporting
- * 0xF4: Enable Data Reporting
- * 0xF3: Set Sample Rate
- * 0xF2: Get Device ID
- * 0xF0: Set Remote Mode
- * 0xEB: Read Data
- * 0xEA: Set Stream Mode
- * 0xE9: Status Request
- * 0xE8: Set Resolution
- * 0xE7: Set Scaling 2:1
- * 0xE6: Set Scaling 1:1
- *
- * Mode:
- * Stream Mode: devices sends the data when it changs its state
- * Remote Mode: host polls the data periodically
- *
- * This code uses Remote Mode and polls the data with Read Data(0xEB).
- *
- * Data format:
- * byte|7       6       5       4       3       2       1       0
- * ----+--------------------------------------------------------------
- *    0|Yovflw  Xovflw  Ysign   Xsign   1       Middle  Right   Left
- *    1|                    X movement
- *    2|                    Y movement
- */
+    RELEASE_SCROLL_BUTTONS;
+}
diff --git a/tmk_core/protocol/ps2_mouse.h b/tmk_core/protocol/ps2_mouse.h
index 27d9790d43..eeeffe4d80 100644
--- a/tmk_core/protocol/ps2_mouse.h
+++ b/tmk_core/protocol/ps2_mouse.h
@@ -19,16 +19,62 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #define  PS2_MOUSE_H
 
 #include <stdbool.h>
+#include "debug.h"
 
-#define PS2_MOUSE_READ_DATA     0xEB
+#define PS2_MOUSE_SEND(command, message) \
+do { \
+   __attribute__ ((unused)) uint8_t rcv = ps2_host_send(command); \
+   if (debug_mouse) { \
+        print((message)); \
+        xprintf(" command: %X, result: %X, error: %X \n", command, rcv, ps2_error); \
+    } \
+} while(0)
+
+#define PS2_MOUSE_SEND_SAFE(command, message) \
+do { \
+    if (PS2_MOUSE_STREAM_MODE == ps2_mouse_mode) { \
+        ps2_mouse_disable_data_reporting(); \
+    } \
+    PS2_MOUSE_SEND(command, message); \
+    if (PS2_MOUSE_STREAM_MODE == ps2_mouse_mode) { \
+        ps2_mouse_enable_data_reporting(); \
+    } \
+} while(0)
+
+#define PS2_MOUSE_SET_SAFE(command, value, message) \
+do { \
+    if (PS2_MOUSE_STREAM_MODE == ps2_mouse_mode) { \
+        ps2_mouse_disable_data_reporting(); \
+    } \
+    PS2_MOUSE_SEND(command, message); \
+    PS2_MOUSE_SEND(value, "Sending value"); \
+    if (PS2_MOUSE_STREAM_MODE == ps2_mouse_mode) { \
+        ps2_mouse_enable_data_reporting(); \
+    } \
+} while(0)
+
+#define PS2_MOUSE_RECEIVE(message) \
+do { \
+   __attribute__ ((unused)) uint8_t rcv = ps2_host_recv_response(); \
+   if (debug_mouse) { \
+        print((message)); \
+        xprintf(" result: %X, error: %X \n", rcv, ps2_error); \
+    } \
+} while(0)
+
+__attribute__ ((unused))
+static enum ps2_mouse_mode_e {
+    PS2_MOUSE_STREAM_MODE,
+    PS2_MOUSE_REMOTE_MODE,
+} ps2_mouse_mode = PS2_MOUSE_STREAM_MODE;
 
 /*
  * Data format:
  * byte|7       6       5       4       3       2       1       0
- * ----+--------------------------------------------------------------
- *    0|Yovflw  Xovflw  Ysign   Xsign   1       Middle  Right   Left
- *    1|                    X movement(0-255)
- *    2|                    Y movement(0-255)
+ * ----+----------------------------------------------------------------
+ *    0|[Yovflw][Xovflw][Ysign ][Xsign ][ 1    ][Middle][Right ][Left  ]
+ *    1|[                    X movement(0-255)                         ]
+ *    2|[                    Y movement(0-255)                         ]
  */
 #define PS2_MOUSE_BTN_MASK      0x07
 #define PS2_MOUSE_BTN_LEFT      0
@@ -39,10 +85,6 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #define PS2_MOUSE_X_OVFLW       6
 #define PS2_MOUSE_Y_OVFLW       7
 
-
-/*
- * Scroll by mouse move with pressing button
- */
 /* mouse button to start scrolling; set 0 to disable scroll */
 #ifndef PS2_MOUSE_SCROLL_BTN_MASK
 #define PS2_MOUSE_SCROLL_BTN_MASK       (1<<PS2_MOUSE_BTN_MIDDLE)
@@ -58,9 +100,79 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #ifndef PS2_MOUSE_SCROLL_DIVISOR_H
 #define PS2_MOUSE_SCROLL_DIVISOR_H      2
 #endif
+/* multiply reported mouse values by these */
+#ifndef PS2_MOUSE_X_MULTIPLIER
+#define PS2_MOUSE_X_MULTIPLIER          1
+#endif
+#ifndef PS2_MOUSE_Y_MULTIPLIER
+#define PS2_MOUSE_Y_MULTIPLIER          1
+#endif
+#ifndef PS2_MOUSE_V_MULTIPLIER
+#define PS2_MOUSE_V_MULTIPLIER          1
+#endif
+/* For some mice this will need to be 0x0F */
+#ifndef PS2_MOUSE_SCROLL_MASK       
+#define PS2_MOUSE_SCROLL_MASK           0xFF 
+#endif
+#ifndef PS2_MOUSE_INIT_DELAY
+#define PS2_MOUSE_INIT_DELAY            1000
+#endif
 
+enum ps2_mouse_command_e {
+    PS2_MOUSE_RESET = 0xFF,
+    PS2_MOUSE_RESEND = 0xFE,
+    PS2_MOSUE_SET_DEFAULTS = 0xF6,
+    PS2_MOUSE_DISABLE_DATA_REPORTING = 0xF5,
+    PS2_MOUSE_ENABLE_DATA_REPORTING = 0xF4,
+    PS2_MOUSE_SET_SAMPLE_RATE = 0xF3,
+    PS2_MOUSE_GET_DEVICE_ID = 0xF2,
+    PS2_MOUSE_SET_REMOTE_MODE = 0xF0,
+    PS2_MOUSE_SET_WRAP_MODE = 0xEC,
+    PS2_MOUSE_READ_DATA = 0xEB,
+    PS2_MOUSE_SET_STREAM_MODE = 0xEA,
+    PS2_MOUSE_STATUS_REQUEST = 0xE9,
+    PS2_MOUSE_SET_RESOLUTION = 0xE8,
+    PS2_MOUSE_SET_SCALING_2_1 = 0xE7,
+    PS2_MOUSE_SET_SCALING_1_1 = 0xE6,
+};
+
+typedef enum ps2_mouse_resolution_e {
+    PS2_MOUSE_1_COUNT_MM,
+    PS2_MOUSE_2_COUNT_MM,
+    PS2_MOUSE_4_COUNT_MM,
+    PS2_MOUSE_8_COUNT_MM,   
+} ps2_mouse_resolution_t;
+
+typedef enum ps2_mouse_sample_rate_e {
+    PS2_MOUSE_10_SAMPLES_SEC = 10,
+    PS2_MOUSE_20_SAMPLES_SEC = 20,
+    PS2_MOUSE_40_SAMPLES_SEC = 40,
+    PS2_MOUSE_60_SAMPLES_SEC = 60,
+    PS2_MOUSE_80_SAMPLES_SEC = 80,
+    PS2_MOUSE_100_SAMPLES_SEC = 100,
+    PS2_MOUSE_200_SAMPLES_SEC = 200,
+} ps2_mouse_sample_rate_t;
+
+void ps2_mouse_init(void);
+
+void ps2_mouse_init_user(void);
 
-uint8_t ps2_mouse_init(void);
 void ps2_mouse_task(void);
 
+void ps2_mouse_disable_data_reporting(void);
+
+void ps2_mouse_enable_data_reporting(void);
+
+void ps2_mouse_set_remote_mode(void);
+
+void ps2_mouse_set_stream_mode(void);
+
+void ps2_mouse_set_scaling_2_1(void);
+
+void ps2_mouse_set_scaling_1_1(void);
+
+void ps2_mouse_set_resolution(ps2_mouse_resolution_t resolution);
+
+void ps2_mouse_set_sample_rate(ps2_mouse_sample_rate_t sample_rate);
+
 #endif
diff --git a/tmk_core/protocol/vusb.mk b/tmk_core/protocol/vusb.mk
index 3cba3f71a3..897b833e1a 100644
--- a/tmk_core/protocol/vusb.mk
+++ b/tmk_core/protocol/vusb.mk
@@ -18,4 +18,5 @@ endif
 
 
 # Search Path
-VPATH += $(TMK_DIR)/protocol/vusb:$(TMK_DIR)/protocol/vusb/usbdrv
+VPATH += $(TMK_PATH)/$(VUSB_DIR)
+VPATH += $(TMK_PATH)/$(VUSB_DIR)/usbdrv
diff --git a/tmk_core/protocol/vusb/main.c b/tmk_core/protocol/vusb/main.c
index 8e4a266e9b..f6a0c7e9a4 100644
--- a/tmk_core/protocol/vusb/main.c
+++ b/tmk_core/protocol/vusb/main.c
@@ -48,8 +48,12 @@ int main(void)
     uint16_t last_timer = timer_read();
 #endif
 
+#ifdef CLKPR
+    // avoid unintentional changes of clock frequency in devices that have a
+    // clock prescaler
     CLKPR = 0x80, CLKPR = 0;
-#ifndef PS2_USE_USART
+#endif
+#ifndef NO_UART
     uart_init(UART_BAUD_RATE);
 #endif
 
diff --git a/tmk_core/protocol/vusb/vusb.c b/tmk_core/protocol/vusb/vusb.c
index eaa1c512d8..022ac6f6bd 100644
--- a/tmk_core/protocol/vusb/vusb.c
+++ b/tmk_core/protocol/vusb/vusb.c
@@ -15,6 +15,8 @@ You should have received a copy of the GNU General Public License
 along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
+#include <avr/eeprom.h>
+#include <avr/wdt.h>
 #include <stdint.h>
 #include "usbdrv.h"
 #include "usbconfig.h"
@@ -24,6 +26,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #include "debug.h"
 #include "host_driver.h"
 #include "vusb.h"
+#include "bootloader.h"
 
 
 static uint8_t vusb_keyboard_leds = 0;
@@ -163,6 +166,7 @@ static struct {
     uint16_t        len;
     enum {
         NONE,
+        BOOTLOADER,
         SET_LED
     }               kind;
 } last_req;
@@ -193,6 +197,11 @@ usbRequest_t    *rq = (void *)data;
                 debug("SET_LED: ");
                 last_req.kind = SET_LED;
                 last_req.len = rq->wLength.word;
+#ifdef BOOTLOADER_SIZE
+            } else if(rq->wValue.word == 0x0301) {
+                last_req.kind = BOOTLOADER;
+                last_req.len = rq->wLength.word;
+#endif
             }
             return USB_NO_MSG; // to get data in usbFunctionWrite
         } else {
@@ -220,6 +229,11 @@ uchar usbFunctionWrite(uchar *data, uchar len)
             last_req.len = 0;
             return 1;
             break;
+        case BOOTLOADER:
+            usbDeviceDisconnect();
+            bootloader_jump();
+            return 1;
+            break;
         case NONE:
         default:
             return -1;
@@ -266,7 +280,7 @@ const PROGMEM uchar keyboard_hid_report[] = {
     0x95, 0x06,          //   Report Count (6),
     0x75, 0x08,          //   Report Size (8),
     0x15, 0x00,          //   Logical Minimum (0),
-    0x25, 0xFF, 0x00     //   Logical Maximum(255),
+    0x26, 0xFF, 0x00,    //   Logical Maximum(255),
     0x05, 0x07,          //   Usage Page (Key Codes),
     0x19, 0x00,          //   Usage Minimum (0),
     0x29, 0xFF,          //   Usage Maximum (255),
@@ -336,7 +350,7 @@ const PROGMEM uchar mouse_hid_report[] = {
     0xa1, 0x01,                    // COLLECTION (Application)
     0x85, REPORT_ID_SYSTEM,        //   REPORT_ID (2)
     0x15, 0x01,                    //   LOGICAL_MINIMUM (0x1)
-    0x25, 0xb7, 0x00               //   LOGICAL_MAXIMUM (0xb7)
+    0x26, 0xb7, 0x00,              //   LOGICAL_MAXIMUM (0xb7)
     0x19, 0x01,                    //   USAGE_MINIMUM (0x1)
     0x29, 0xb7,                    //   USAGE_MAXIMUM (0xb7)
     0x75, 0x10,                    //   REPORT_SIZE (16)
@@ -481,11 +495,11 @@ USB_PUBLIC usbMsgLen_t usbFunctionDescriptor(struct usbRequest *rq)
             /* interface index */
             switch (rq->wIndex.word) {
                 case 0:
-                    usbMsgPtr = keyboard_hid_report;
+                    usbMsgPtr = (unsigned char *)keyboard_hid_report;
                     len = sizeof(keyboard_hid_report);
                     break;
                 case 1:
-                    usbMsgPtr = mouse_hid_report;
+                    usbMsgPtr = (unsigned char *)mouse_hid_report;
                     len = sizeof(mouse_hid_report);
                     break;
             }
diff --git a/tmk_core/readme.md b/tmk_core/readme.md
index f460d0ed44..5f135617c4 100644
--- a/tmk_core/readme.md
+++ b/tmk_core/readme.md
@@ -23,7 +23,7 @@ These features can be used in your keyboard.
 * Mouse key           - Mouse control with keyboard
 * System Control Key  - Power Down, Sleep, Wake Up and USB Remote Wake up
 * Media Control Key   - Volume Down/Up, Mute, Next/Prev track, Play, Stop and etc
-* USB NKRO            - 120 keys(+ 8 modifiers) simultaneously
+* USB NKRO            - 248 keys(+ 8 modifiers) simultaneously
 * PS/2 mouse support  - PS/2 mouse(TrackPoint) as composite device
 * Keyboard protocols  - PS/2, ADB, M0110, Sun and other old keyboard protocols
 * User Function       - Customizable function of key with writing code
diff --git a/tmk_core/ring_buffer.h b/tmk_core/ring_buffer.h
index 7bdebbcf34..005d1be613 100644
--- a/tmk_core/ring_buffer.h
+++ b/tmk_core/ring_buffer.h
@@ -4,13 +4,13 @@
  * Ring buffer to store scan codes from keyboard
  *------------------------------------------------------------------*/
 #define RBUF_SIZE 32
+#include <util/atomic.h>
 static uint8_t rbuf[RBUF_SIZE];
 static uint8_t rbuf_head = 0;
 static uint8_t rbuf_tail = 0;
 static inline void rbuf_enqueue(uint8_t data)
 {
-    uint8_t sreg = SREG;
-    cli();
+  ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
     uint8_t next = (rbuf_head + 1) % RBUF_SIZE;
     if (next != rbuf_tail) {
         rbuf[rbuf_head] = data;
@@ -18,36 +18,34 @@ static inline void rbuf_enqueue(uint8_t data)
     } else {
         print("rbuf: full\n");
     }
-    SREG = sreg;
+  }
 }
 static inline uint8_t rbuf_dequeue(void)
 {
     uint8_t val = 0;
+  ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
 
-    uint8_t sreg = SREG;
-    cli();
     if (rbuf_head != rbuf_tail) {
         val = rbuf[rbuf_tail];
         rbuf_tail = (rbuf_tail + 1) % RBUF_SIZE;
     }
-    SREG = sreg;
+  }
 
     return val;
 }
 static inline bool rbuf_has_data(void)
 {
-    uint8_t sreg = SREG;
-    cli();
-    bool has_data = (rbuf_head != rbuf_tail);
-    SREG = sreg;
-    return has_data;
+  bool has_data;
+  ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
+    has_data = (rbuf_head != rbuf_tail);
+  }
+  return has_data;
 }
 static inline void rbuf_clear(void)
 {
-    uint8_t sreg = SREG;
-    cli();
+  ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
     rbuf_head = rbuf_tail = 0;
-    SREG = sreg;
+  }
 }
 
 #endif  /* RING_BUFFER_H */
diff --git a/tmk_core/rules.mk b/tmk_core/rules.mk
index f13351ea19..e4c8aecb2c 100644
--- a/tmk_core/rules.mk
+++ b/tmk_core/rules.mk
@@ -15,6 +15,29 @@
 # Carlos Lamas
 #
 
+# Enable vpath seraching for source files only
+# Without this, output files, could be read from the wrong .build directories
+VPATH_SRC := $(VPATH)
+vpath %.c $(VPATH_SRC)
+vpath %.h $(VPATH_SRC)
+vpath %.cpp $(VPATH_SRC)
+vpath %.cc $(VPATH_SRC)
+vpath %.hpp $(VPATH_SRC)
+vpath %.S $(VPATH_SRC)
+VPATH :=
+
+# Convert all SRC to OBJ
+define OBJ_FROM_SRC
+$(patsubst %.c,$1/%.o,$(patsubst %.cpp,$1/%.o,$(patsubst %.cc,$1/%.o,$(patsubst %.S,$1/%.o,$($1_SRC)))))
+endef
+$(foreach OUTPUT,$(OUTPUTS),$(eval $(OUTPUT)_OBJ +=$(call OBJ_FROM_SRC,$(OUTPUT))))
+
+# Define a list of all objects
+OBJ := $(foreach OUTPUT,$(OUTPUTS),$($(OUTPUT)_OBJ))
+
+MASTER_OUTPUT := $(firstword $(OUTPUTS))
+
+
 
 # Output format. (can be srec, ihex, binary)
 FORMAT = ihex
@@ -24,55 +47,8 @@ FORMAT = ihex
 #     (Note: 3 is not always the best optimization level. See avr-libc FAQ.)
 OPT = s
 
-COLOR ?= true
-
-ifeq ($(COLOR),true)
-	NO_COLOR=\033[0m
-	OK_COLOR=\033[32;01m
-	ERROR_COLOR=\033[31;01m
-	WARN_COLOR=\033[33;01m
-	BLUE=\033[0;34m
-	BOLD=\033[1m
-endif
-
-ifdef quick
-	QUICK = $(quick)
-endif
-
-QUICK ?= false
 AUTOGEN ?= false
 
-ifneq ($(shell awk --version 2>/dev/null),)
-	AWK=awk
-else
-	AWK=cat && test
-endif
-
-OK_STRING=$(OK_COLOR)[OK]$(NO_COLOR)\n
-ERROR_STRING=$(ERROR_COLOR)[ERRORS]$(NO_COLOR)\n
-WARN_STRING=$(WARN_COLOR)[WARNINGS]$(NO_COLOR)\n
-
-ifndef $(SILENT)
-	SILENT = false
-endif
-
-TAB_LOG = printf "\n$$LOG\n\n" | $(AWK) '{ sub(/^/," | "); print }'
-TAB_LOG_PLAIN = printf "$$LOG\n"
-AWK_STATUS = $(AWK) '{ printf " %-10s\n", $$1; }'
-AWK_CMD = $(AWK) '{ printf "%-99s", $$0; }'
-PRINT_ERROR = ($(SILENT) ||printf " $(ERROR_STRING)" | $(AWK_STATUS)) && $(TAB_LOG) && false
-PRINT_WARNING = ($(SILENT) || printf " $(WARN_STRING)" | $(AWK_STATUS)) && $(TAB_LOG)
-PRINT_ERROR_PLAIN = ($(SILENT) ||printf " $(ERROR_STRING)" | $(AWK_STATUS)) && $(TAB_LOG_PLAIN) && false && break
-PRINT_WARNING_PLAIN = ($(SILENT) || printf " $(WARN_STRING)" | $(AWK_STATUS)) && $(TAB_LOG_PLAIN)
-PRINT_OK = $(SILENT) || printf " $(OK_STRING)" | $(AWK_STATUS)
-BUILD_CMD = LOG=$$($(CMD) 2>&1) ; if [ $$? -gt 0 ]; then $(PRINT_ERROR); elif [ "$$LOG" != "" ] ; then $(PRINT_WARNING); else $(PRINT_OK); fi;
-
-# List any extra directories to look for include files here.
-#     Each directory must be seperated by a space.
-#     Use forward slashes for directory separators.
-#     For a directory that has spaces, enclose it in quotes.
-EXTRAINCDIRS += $(subst :, ,$(VPATH))
-
 
 # Compiler flag to set the C Standard level.
 #     c89   = "ANSI" C
@@ -83,17 +59,18 @@ CSTANDARD = -std=gnu99
 
 
 # Place -D or -U options here for C sources
-CDEFS += $(OPT_DEFS)
+#CDEFS +=
 
 
 # Place -D or -U options here for ASM sources
-ADEFS += $(OPT_DEFS)
+#ADEFS +=
 
 
 # Place -D or -U options here for C++ sources
 #CPPDEFS += -D__STDC_LIMIT_MACROS
 #CPPDEFS += -D__STDC_CONSTANT_MACROS
-CPPDEFS += $(OPT_DEFS)
+#CPPDEFS +=
+
 
 
 
@@ -121,11 +98,7 @@ CFLAGS += -Wstrict-prototypes
 #CFLAGS += -Wunreachable-code
 #CFLAGS += -Wsign-compare
 CFLAGS += -Wa,-adhlns=$(@:%.o=%.lst)
-CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS))
 CFLAGS += $(CSTANDARD)
-ifdef CONFIG_H
-    CFLAGS += -include $(CONFIG_H)
-endif
 
 
 #---------------- Compiler Options C++ ----------------
@@ -148,12 +121,7 @@ CPPFLAGS += -Wundef
 #CPPFLAGS += -Wunreachable-code
 #CPPFLAGS += -Wsign-compare
 CPPFLAGS += -Wa,-adhlns=$(@:%.o=%.lst)
-CPPFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS))
 #CPPFLAGS += $(CSTANDARD)
-ifdef CONFIG_H
-    CPPFLAGS += -include $(CONFIG_H)
-endif
-
 
 #---------------- Assembler Options ----------------
 #  -Wa,...:   tell GCC to pass this to the assembler.
@@ -164,11 +132,8 @@ endif
 #             files -- see avr-libc docs [FIXME: not yet described there]
 #  -listing-cont-lines: Sets the maximum number of continuation lines of hex
 #       dump that will be displayed for a given single line of source input.
-ASFLAGS += $(ADEFS) -Wa,-adhlns=$(@:%.o=%.lst),-gstabs,--listing-cont-lines=100
-ASFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS))
-ifdef CONFIG_H
-    ASFLAGS += -include $(CONFIG_H)
-endif
+ASFLAGS += $(ADEFS) 
+ASFLAGS += -Wa,-adhlns=$(@:%.o=%.lst),-gstabs,--listing-cont-lines=100
 
 #---------------- Library Options ----------------
 # Minimalistic printf version
@@ -196,6 +161,7 @@ SCANF_LIB =
 
 
 MATH_LIB = -lm
+CREATE_MAP ?= yes
 
 
 #---------------- Linker Options ----------------
@@ -206,7 +172,10 @@ MATH_LIB = -lm
 # Comennt out "--relax" option to avoid a error such:
 # 	(.vectors+0x30): relocation truncated to fit: R_AVR_13_PCREL against symbol `__vector_12'
 #
-LDFLAGS += -Wl,-Map=$(BUILD_DIR)/$(TARGET).map,--cref
+
+ifeq ($(CREATE_MAP),yes)
+	LDFLAGS += -Wl,-Map=$(BUILD_DIR)/$(TARGET).map,--cref
+endif
 #LDFLAGS += -Wl,--relax
 LDFLAGS += $(EXTMEMOPTS)
 LDFLAGS += $(patsubst %,-L%,$(EXTRALIBDIRS))
@@ -223,63 +192,20 @@ COPY = cp
 WINSHELL = cmd
 SECHO = $(SILENT) || echo
 
-# Define Messages
-# English
-MSG_ERRORS_NONE = Errors: none
-MSG_BEGIN = -------- begin --------
-MSG_END = --------  end  --------
-MSG_SIZE_BEFORE = Size before:
-MSG_SIZE_AFTER = Size after:
-MSG_COFF = Converting to AVR COFF:
-MSG_EXTENDED_COFF = Converting to AVR Extended COFF:
-MSG_FLASH = Creating load file for Flash:
-MSG_EEPROM = Creating load file for EEPROM:
-MSG_BIN = Creating binary load file for Flash:
-MSG_EXTENDED_LISTING = Creating Extended Listing:
-MSG_SYMBOL_TABLE = Creating Symbol Table:
-MSG_LINKING = Linking:
-MSG_COMPILING = Compiling:
-MSG_COMPILING_CPP = Compiling:
-MSG_ASSEMBLING = Assembling:
-MSG_CLEANING = Cleaning project:
-MSG_CREATING_LIBRARY = Creating library:
-MSG_SUBMODULE_DIRTY = $(WARN_COLOR)WARNING:$(NO_COLOR)\n \
-	Some git sub-modules are out of date or modified, please consider runnning:$(BOLD)\n\
-	git submodule sync --recursive\n\
-	git submodule update --init --recursive$(NO_COLOR)\n\n\
-	You can ignore this warning if you are not compiling any ChibiOS keyboards,\n\
-	or if you have modified the ChibiOS libraries yourself. \n\n
-
-
-# Define all object files.
-OBJ = $(patsubst %.c,$(OBJDIR)/%.o,$(patsubst %.cpp,$(OBJDIR)/%.o,$(patsubst %.S,$(OBJDIR)/%.o,$(SRC))))
-
-# Define all listing files.
-LST = $(patsubst %.c,$(OBJDIR)/%.lst,$(patsubst %.cpp,$(OBJDIR)/%.lst,$(patsubst %.S,$(OBJDIR)/%.lst,$(SRC))))
-
 
 # Compiler flags to generate dependency files.
 #GENDEPFLAGS = -MMD -MP -MF .dep/$(@F).d
-GENDEPFLAGS = -MMD -MP -MF $(BUILD_DIR)/.dep/$(subst /,_,$(subst $(BUILD_DIR)/,,$@)).d
+GENDEPFLAGS = -MMD -MP -MF $(patsubst %.o,%.td,$@)
 
 
 # Combine all necessary flags and optional flags.
 # Add target processor to flags.
 # You can give extra flags at 'make' command line like: make EXTRAFLAGS=-DFOO=bar
-ALL_CFLAGS = $(MCUFLAGS) $(CFLAGS) $(GENDEPFLAGS) $(EXTRAFLAGS)
-ALL_CPPFLAGS = $(MCUFLAGS) -x c++ $(CPPFLAGS) $(GENDEPFLAGS) $(EXTRAFLAGS)
+ALL_CFLAGS = $(MCUFLAGS) $(CFLAGS) $(EXTRAFLAGS)
+ALL_CPPFLAGS = $(MCUFLAGS) -x c++ $(CPPFLAGS) $(EXTRAFLAGS)
 ALL_ASFLAGS = $(MCUFLAGS) -x assembler-with-cpp $(ASFLAGS) $(EXTRAFLAGS)
 
-# Default target.
-all: build sizeafter
-
-# Quick make that doesn't clean
-quick: build sizeafter
-
-# Change the build target to build a HEX file or a library.
-build: elf hex
-#build: elf hex eep lss sym
-#build: lib
+MOVE_DEP = mv -f $(patsubst %.o,%.td,$@) $(patsubst %.o,%.d,$@)
 
 
 elf: $(BUILD_DIR)/$(TARGET).elf
@@ -290,15 +216,6 @@ sym: $(BUILD_DIR)/$(TARGET).sym
 LIBNAME=lib$(TARGET).a
 lib: $(LIBNAME)
 
-check_submodule:
-	git submodule status --recursive | \
-	while IFS= read -r x; do \
-		case "$$x" in \
-			\ *) ;; \
-			*) printf "$(MSG_SUBMODULE_DIRTY)";break;; \
-		esac \
-	done
-
 # Display size of file.
 HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex
 #ELFSIZE = $(SIZE) --mcu=$(MCU) --format=avr $(TARGET).elf
@@ -352,150 +269,114 @@ gccversion :
 	$(eval CMD=$(BIN) $< $@ || exit 0)
 	@$(BUILD_CMD)
 
-# Create library from object files.
-.SECONDARY : $(BUILD_DIR)/$(TARGET).a
-.PRECIOUS : $(OBJ)
-%.a: $(OBJ)
-	@$(SILENT) || printf "$(MSG_CREATING_LIBRARY) $@" | $(AWK_CMD)
-	$(eval CMD=$(AR) $@ $(OBJ) )
-	@$(BUILD_CMD)
-
-BEGIN = gccversion check_submodule sizebefore
+BEGIN = gccversion sizebefore
 
 # Link: create ELF output file from object files.
 .SECONDARY : $(BUILD_DIR)/$(TARGET).elf
 .PRECIOUS : $(OBJ)
-%.elf: $(OBJ) | $(BEGIN)
+# Note the obj.txt depeendency is there to force linking if a source file is deleted
+%.elf: $(OBJ) $(MASTER_OUTPUT)/cflags.txt $(MASTER_OUTPUT)/ldflags.txt $(MASTER_OUTPUT)/obj.txt | $(BEGIN)
 	@$(SILENT) || printf "$(MSG_LINKING) $@" | $(AWK_CMD)
-	$(eval CMD=$(CC) $(ALL_CFLAGS) $^ --output $@ $(LDFLAGS))
+	$(eval CMD=$(CC) $(ALL_CFLAGS) $(filter-out %.txt,$^) --output $@ $(LDFLAGS))
 	@$(BUILD_CMD)
+	
+
+define GEN_OBJRULE
+$1_INCFLAGS := $$(patsubst %,-I%,$$($1_INC))
+ifdef $1_CONFIG
+$1_CONFIG_FLAGS += -include $$($1_CONFIG)
+endif
+$1_CFLAGS = $$(ALL_CFLAGS) $$($1_DEFS) $$($1_INCFLAGS) $$($1_CONFIG_FLAGS)
+$1_CPPFLAGS= $$(ALL_CPPFLAGS) $$($1_DEFS) $$($1_INCFLAGS) $$($1_CONFIG_FLAGS)
+$1_ASFLAGS= $$(ALL_ASFLAGS) $$($1_DEFS) $$($1_INCFLAGS) $$($1_CONFIG_FLAGS)
 
 # Compile: create object files from C source files.
-$(OBJDIR)/%.o : %.c | $(BEGIN)
-	@mkdir -p $(@D)
-	@$(SILENT) || printf "$(MSG_COMPILING) $<" | $(AWK_CMD)
-	$(eval CMD=$(CC) -c $(ALL_CFLAGS) $< -o $@)
-	@$(BUILD_CMD)
+$1/%.o : %.c $1/%.d $1/cflags.txt $1/compiler.txt | $(BEGIN)
+	@mkdir -p $$(@D)
+	@$$(SILENT) || printf "$$(MSG_COMPILING) $$<" | $$(AWK_CMD)
+	$$(eval CMD := $$(CC) -c $$($1_CFLAGS) $$(GENDEPFLAGS) $$< -o $$@ && $$(MOVE_DEP))
+	@$$(BUILD_CMD)
 
 # Compile: create object files from C++ source files.
-$(OBJDIR)/%.o : %.cpp | $(BEGIN)
-	@mkdir -p $(@D)
-	@$(SILENT) || printf "$(MSG_COMPILING_CPP) $<" | $(AWK_CMD)
-	$(eval CMD=$(CC) -c $(ALL_CPPFLAGS) $< -o $@)
-	@$(BUILD_CMD)
+$1/%.o : %.cpp $1/%.d $1/cppflags.txt $1/compiler.txt | $(BEGIN)
+	@mkdir -p $$(@D)
+	@$$(SILENT) || printf "$$(MSG_COMPILING_CPP) $$<" | $$(AWK_CMD)
+	$$(eval CMD=$$(CC) -c $$($1_CPPFLAGS) $$(GENDEPFLAGS) $$< -o $$@ && $$(MOVE_DEP))
+	@$$(BUILD_CMD)
+
+$1/%.o : %.cc $1/%.d $1/cppflags.txt $1/compiler.txt | $(BEGIN)
+	@mkdir -p $$(@D)
+	@$$(SILENT) || printf "$$(MSG_COMPILING_CPP) $$<" | $$(AWK_CMD)
+	$$(eval CMD=$$(CC) -c $$($1_CPPFLAGS) $$(GENDEPFLAGS) $$< -o $$@ && $$(MOVE_DEP))
+	@$$(BUILD_CMD)
 
-# Compile: create assembler files from C source files.
-%.s : %.c | $(BEGIN)
-	@$(SILENT) || printf "$(MSG_ASSEMBLING) $<" | $(AWK_CMD)
-	$(eval CMD=$(CC) -S $(ALL_CFLAGS) $< -o $@)
-	@$(BUILD_CMD)
+# Assemble: create object files from assembler source files.
+$1/%.o : %.S $1/asflags.txt $1/compiler.txt | $(BEGIN)
+	@mkdir -p $$(@D)
+	@$(SILENT) || printf "$$(MSG_ASSEMBLING) $$<" | $$(AWK_CMD)
+	$$(eval CMD=$$(CC) -c $$($1_ASFLAGS) $$< -o $$@)
+	@$$(BUILD_CMD)
 
-# Compile: create assembler files from C++ source files.
-%.s : %.cpp | $(BEGIN)
-	@$(SILENT) || printf "$(MSG_ASSEMBLING) $<" | $(AWK_CMD)
-	$(eval CMD=$(CC) -S $(ALL_CPPFLAGS) $< -o $@)
-	@$(BUILD_CMD)
+$1/force:
 
-# Assemble: create object files from assembler source files.
-$(OBJDIR)/%.o : %.S | $(BEGIN)
-	@mkdir -p $(@D)
-	@$(SILENT) || printf "$(MSG_ASSEMBLING) $<" | $(AWK_CMD)
-	$(eval CMD=$(CC) -c $(ALL_ASFLAGS) $< -o $@)
-	@$(BUILD_CMD)
+$1/cflags.txt: $1/force
+	echo '$$($1_CFLAGS)' | cmp -s - $$@ || echo '$$($1_CFLAGS)' > $$@
+
+$1/cppflags.txt: $1/force
+	echo '$$($1_CPPFLAGS)' | cmp -s - $$@ || echo '$$($1_CPPFLAGS)' > $$@
+
+$1/asflags.txt: $1/force
+	echo '$$($1_ASFLAGS)' | cmp -s - $$@ || echo '$$($1_ASFLAGS)' > $$@
+
+$1/compiler.txt: $1/force
+	$$(CC) --version | cmp -s - $$@ || $$(CC) --version > $$@
+endef
+
+.PRECIOUS: $(MASTER_OUTPUT)/obj.txt
+$(MASTER_OUTPUT)/obj.txt: $(MASTER_OUTPUT)/force
+	echo '$(OBJ)' | cmp -s - $@ || echo '$(OBJ)' > $@
+
+.PRECIOUS: $(MASTER_OUTPUT)/ldflags.txt
+$(MASTER_OUTPUT)/ldflags.txt: $(MASTER_OUTPUT)/force
+	echo '$(LDFLAGS)' | cmp -s - $@ || echo '$(LDFLAGS)' > $@
+
+
+# We have to use static rules for the .d files for some reason
+DEPS = $(patsubst %.o,%.d,$(OBJ))
+# Keep the .d files
+.PRECIOUS: $(DEPS)
+# Empty rule to force recompilation if the .d file is missing
+$(DEPS):
+	
+
+$(foreach OUTPUT,$(OUTPUTS),$(eval $(call GEN_OBJRULE,$(OUTPUT))))
 
 # Create preprocessed source for use in sending a bug report.
 %.i : %.c | $(BEGIN)
 	$(CC) -E -mmcu=$(MCU) $(CFLAGS) $< -o $@
 
 # Target: clean project.
-clean: 
+clean:
+	$(foreach OUTPUT,$(OUTPUTS), $(REMOVE) -r $(OUTPUT) 2>/dev/null)
+	$(REMOVE) $(BUILD_DIR)/$(TARGET).*
 
 show_path:
 	@echo VPATH=$(VPATH)
 	@echo SRC=$(SRC)
-
-SUBDIRS := $(filter-out %/util/ %/doc/ %/keymaps/ %/old_keymap_files/,$(dir $(wildcard $(TOP_DIR)/keyboards/**/*/Makefile)))
-SUBDIRS := $(SUBDIRS) $(dir $(wildcard $(TOP_DIR)/keyboards/*/.))
-SUBDIRS := $(sort $(SUBDIRS))
-# $(error $(SUBDIRS))
-all-keyboards-defaults-%:
-	@for x in $(SUBDIRS) ; do \
-		printf "Compiling with default: $$x" | $(AWK_CMD); \
-		LOG=$$($(MAKE) -C $$x $(subst all-keyboards-defaults-,,$@) VERBOSE=$(VERBOSE) COLOR=$(COLOR) SILENT=true 2>&1) ; if [ $$? -gt 0 ]; then $(PRINT_ERROR_PLAIN); elif [ "$$LOG" != "" ] ; then $(PRINT_WARNING_PLAIN); else $(PRINT_OK); fi; \
-	done
-
-all-keyboards-defaults: all-keyboards-defaults-all
-
-KEYBOARDS := $(SUBDIRS:$(TOP_DIR)/keyboards/%/=/keyboards/%)
-all-keyboards-all: $(addsuffix -all,$(KEYBOARDS))
-all-keyboards-quick: $(addsuffix -quick,$(KEYBOARDS))
-all-keyboards-clean: $(addsuffix -clean,$(KEYBOARDS))
-all-keyboards: all-keyboards-all
-
-define make_keyboard
-$(eval KEYBOARD=$(patsubst /keyboards/%,%,$1))
-$(eval SUBPROJECT=$(lastword $(subst /, ,$(KEYBOARD))))
-$(eval KEYBOARD=$(firstword $(subst /, ,$(KEYBOARD))))
-$(eval KEYMAPS=$(notdir $(patsubst %/.,%,$(wildcard $(TOP_DIR)/keyboards/$(KEYBOARD)/keymaps/*/.))))
-$(eval KEYMAPS+=$(notdir $(patsubst %/.,%,$(wildcard $(TOP_DIR)/keyboards/$(KEYBOARD)/$(SUBPROJECT)/keymaps/*/.))))
-@for x in $(KEYMAPS) ; do \
-	printf "Compiling $(BOLD)$(KEYBOARD)/$(SUBPROJECT)$(NO_COLOR) with $(BOLD)$$x$(NO_COLOR)" | $(AWK) '{ printf "%-118s", $$0; }'; \
-	LOG=$$($(MAKE) -C $(TOP_DIR)$1 $2 keymap=$$x VERBOSE=$(VERBOSE) COLOR=$(COLOR) SILENT=true 2>&1) ; if [ $$? -gt 0 ]; then $(PRINT_ERROR_PLAIN); elif [ "$$LOG" != "" ] ; then $(PRINT_WARNING_PLAIN); else $(PRINT_OK); fi; \
-done
-endef
-
-define make_keyboard_helper
-# Just remove the -quick, -all and so on from the first argument and pass it forward
-$(call make_keyboard,$(subst -$2,,$1),$2)
-endef
-
-/keyboards/%-quick:
-	$(call make_keyboard_helper,$@,quick)
-/keyboards/%-all:
-	$(call make_keyboard_helper,$@,all)
-/keyboards/%-clean:
-	$(call make_keyboard_helper,$@,clean)
-/keyboards/%:
-	$(call make_keyboard_helper,$@,all)
-
-all-keymaps-%:
-	$(eval MAKECONFIG=$(call get_target,all-keymaps,$@))
-	$(eval KEYMAPS=$(notdir $(patsubst %/.,%,$(wildcard $(TOP_DIR)/keyboards/$(KEYBOARD)/keymaps/*/.))))
-	@for x in $(KEYMAPS) ; do \
-		printf "Compiling $(BOLD)$(KEYBOARD)$(NO_COLOR) with $(BOLD)$$x$(NO_COLOR)" | $(AWK) '{ printf "%-118s", $$0; }'; \
-		LOG=$$($(MAKE) $(subst all-keymaps-,,$@) keyboard=$(KEYBOARD) keymap=$$x VERBOSE=$(VERBOSE) COLOR=$(COLOR) SILENT=true 2>&1) ; if [ $$? -gt 0 ]; then $(PRINT_ERROR_PLAIN); elif [ "$$LOG" != "" ] ; then $(PRINT_WARNING_PLAIN); else $(PRINT_OK); fi; \
-	done
-
-all-keymaps: all-keymaps-all
-
-GOAL=$(MAKECMDGOALS)
-ifeq ($(MAKECMDGOALS),)
-GOAL = all
-endif
-CLEANING_GOALS=clean clean_list all
-ifneq ($(findstring $(GOAL),$(CLEANING_GOALS)),)
-$(shell $(REMOVE) -r $(BUILD_DIR) 2>/dev/null)
-$(shell $(REMOVE) -r $(TOP_DIR)/$(BUILD_DIR))
-$(shell $(REMOVE) -r $(KEYBOARD_PATH)/$(BUILD_DIR))
-$(shell if $$SUBPROJECT; then $(REMOVE) -r $(SUBPROJECT_PATH)/$(BUILD_DIR); fi)
-$(shell $(REMOVE) -r $(KEYMAP_PATH)/$(BUILD_DIR))
-endif
+	@echo OBJ=$(OBJ)
 
 # Create build directory
-$(shell mkdir $(BUILD_DIR) 2>/dev/null)
+$(shell mkdir -p $(BUILD_DIR) 2>/dev/null)
 
 # Create object files directory
-$(shell mkdir $(OBJDIR) 2>/dev/null)
-
+$(eval $(foreach OUTPUT,$(OUTPUTS),$(shell mkdir -p $(OUTPUT) 2>/dev/null)))
 
 # Include the dependency files.
--include $(shell mkdir $(BUILD_DIR)/.dep 2>/dev/null) $(wildcard $(BUILD_DIR)/.dep/*)
+-include $(patsubst %.o,%.d,$(OBJ))
 
 
 # Listing of phony targets.
-.PHONY : all quick finish sizebefore sizeafter gccversion \
-build elf hex eep lss sym coff extcoff check_submodule \
+.PHONY : all finish sizebefore sizeafter gccversion \
+build elf hex eep lss sym coff extcoff \
 clean clean_list debug gdb-config show_path \
-program teensy dfu flip dfu-ee flip-ee dfu-start \
-all-keyboards-defaults all-keyboards all-keymaps \
-all-keyboards-defaults-% all-keyboards-% all-keymaps-%
+program teensy dfu flip dfu-ee flip-ee dfu-start 
\ No newline at end of file
diff --git a/tmk_core/tool/chibios/ch-bootloader-jump.patch b/tmk_core/tool/chibios/ch-bootloader-jump.patch
index d886576214..c6eb2405c9 100644
--- a/tmk_core/tool/chibios/ch-bootloader-jump.patch
+++ b/tmk_core/tool/chibios/ch-bootloader-jump.patch
@@ -3,114 +3,114 @@ index 51a79bb..42d07bd 100644
 --- a/os/common/ports/ARMCMx/compilers/GCC/crt0_v6m.s
 +++ b/os/common/ports/ARMCMx/compilers/GCC/crt0_v6m.s
 @@ -105,6 +105,13 @@
- #define CRT0_CALL_DESTRUCTORS               TRUE

- #endif

- 

-+/**

-+ * @brief   Magic number for jumping to bootloader.

-+ */

-+#if !defined(MAGIC_BOOTLOADER_NUMBER) || defined(__DOXYGEN__)

-+#define MAGIC_BOOTLOADER_NUMBER 0xDEADBEEF

-+#endif

-+

- /*===========================================================================*/

- /* Code section.                                                             */

- /*===========================================================================*/

+ #define CRT0_CALL_DESTRUCTORS               TRUE
+ #endif
+ 
++/**
++ * @brief   Magic number for jumping to bootloader.
++ */
++#if !defined(MAGIC_BOOTLOADER_NUMBER) || defined(__DOXYGEN__)
++#define MAGIC_BOOTLOADER_NUMBER 0xDEADBEEF
++#endif
++
+ /*===========================================================================*/
+ /* Code section.                                                             */
+ /*===========================================================================*/
 @@ -124,6 +131,17 @@
-                 .thumb_func

-                 .global Reset_Handler

- Reset_Handler:

-+

-+#ifdef STM32_BOOTLOADER_ADDRESS

-+                /* jump to bootloader code */

-+                ldr        r0, =__ram0_end__-4

-+                ldr        r1, =MAGIC_BOOTLOADER_NUMBER

-+                ldr        r2, [r0, #0]

-+                str        r0, [r0, #0] /* erase stored magic */

-+                cmp        r2, r1

-+                beq        Bootloader_Jump

-+#endif /* STM32_BOOTLOADER_ADDRESS */

-+

-                 /* Interrupts are globally masked initially.*/

-                 cpsid   i

- 

+                 .thumb_func
+                 .global Reset_Handler
+ Reset_Handler:
++
++#ifdef STM32_BOOTLOADER_ADDRESS
++                /* jump to bootloader code */
++                ldr        r0, =__ram0_end__-4
++                ldr        r1, =MAGIC_BOOTLOADER_NUMBER
++                ldr        r2, [r0, #0]
++                str        r0, [r0, #0] /* erase stored magic */
++                cmp        r2, r1
++                beq        Bootloader_Jump
++#endif /* STM32_BOOTLOADER_ADDRESS */
++
+                 /* Interrupts are globally masked initially.*/
+                 cpsid   i
+ 
 @@ -242,6 +260,21 @@ endfiniloop:
-                 ldr     r1, =__default_exit

-                 bx      r1

- 

-+#ifdef STM32_BOOTLOADER_ADDRESS

-+/*

-+ * Jump-to-bootloader function.

-+ */

-+

-+                .align  2

-+                .thumb_func

-+Bootloader_Jump:

-+                ldr     r0, =STM32_BOOTLOADER_ADDRESS

-+                ldr     r1, [r0, #0]

-+                mov     sp, r1

-+                ldr     r0, [r0, #4]

-+                bx      r0

-+#endif /* STM32_BOOTLOADER_ADDRESS */

-+

- #endif

- 

- /** @} */

+                 ldr     r1, =__default_exit
+                 bx      r1
+ 
++#ifdef STM32_BOOTLOADER_ADDRESS
++/*
++ * Jump-to-bootloader function.
++ */
++
++                .align  2
++                .thumb_func
++Bootloader_Jump:
++                ldr     r0, =STM32_BOOTLOADER_ADDRESS
++                ldr     r1, [r0, #0]
++                mov     sp, r1
++                ldr     r0, [r0, #4]
++                bx      r0
++#endif /* STM32_BOOTLOADER_ADDRESS */
++
+ #endif
+ 
+ /** @} */
 diff --git a/os/common/ports/ARMCMx/compilers/GCC/crt0_v7m.s b/os/common/ports/ARMCMx/compilers/GCC/crt0_v7m.s
 index 4812a29..dca9f88 100644
 --- a/os/common/ports/ARMCMx/compilers/GCC/crt0_v7m.s
 +++ b/os/common/ports/ARMCMx/compilers/GCC/crt0_v7m.s
 @@ -140,6 +140,13 @@
- #define CRT0_CPACR_INIT                     0x00F00000

- #endif

- 

-+/**

-+ * @brief   Magic number for jumping to bootloader.

-+ */

-+#if !defined(MAGIC_BOOTLOADER_NUMBER) || defined(__DOXYGEN__)

-+#define MAGIC_BOOTLOADER_NUMBER 0xDEADBEEF

-+#endif

-+

- /*===========================================================================*/

- /* Code section.                                                             */

- /*===========================================================================*/

+ #define CRT0_CPACR_INIT                     0x00F00000
+ #endif
+ 
++/**
++ * @brief   Magic number for jumping to bootloader.
++ */
++#if !defined(MAGIC_BOOTLOADER_NUMBER) || defined(__DOXYGEN__)
++#define MAGIC_BOOTLOADER_NUMBER 0xDEADBEEF
++#endif
++
+ /*===========================================================================*/
+ /* Code section.                                                             */
+ /*===========================================================================*/
 @@ -164,6 +171,17 @@
-                 .thumb_func

-                 .global Reset_Handler

- Reset_Handler:

-+

-+#ifdef STM32_BOOTLOADER_ADDRESS

-+                /* jump to bootloader code */

-+                ldr        r0, =__ram0_end__-4

-+                ldr        r1, =MAGIC_BOOTLOADER_NUMBER

-+                ldr        r2, [r0, #0]

-+                str        r0, [r0, #0] /* erase stored magic */

-+                cmp        r2, r1

-+                beq        Bootloader_Jump

-+#endif /* STM32_BOOTLOADER_ADDRESS */

-+

-                 /* Interrupts are globally masked initially.*/

-                 cpsid   i

- 

+                 .thumb_func
+                 .global Reset_Handler
+ Reset_Handler:
++
++#ifdef STM32_BOOTLOADER_ADDRESS
++                /* jump to bootloader code */
++                ldr        r0, =__ram0_end__-4
++                ldr        r1, =MAGIC_BOOTLOADER_NUMBER
++                ldr        r2, [r0, #0]
++                str        r0, [r0, #0] /* erase stored magic */
++                cmp        r2, r1
++                beq        Bootloader_Jump
++#endif /* STM32_BOOTLOADER_ADDRESS */
++
+                 /* Interrupts are globally masked initially.*/
+                 cpsid   i
+ 
 @@ -305,6 +323,21 @@ endfiniloop:
-                 /* Branching to the defined exit handler.*/

-                 b       __default_exit

- 

-+#ifdef STM32_BOOTLOADER_ADDRESS

-+/*

-+ * Jump-to-bootloader function.

-+ */

-+

-+                .align  2

-+                .thumb_func

-+Bootloader_Jump:

-+                ldr     r0, =STM32_BOOTLOADER_ADDRESS

-+                ldr     r1, [r0, #0]

-+                mov     sp, r1

-+                ldr     r0, [r0, #4]

-+                bx      r0

-+#endif /* STM32_BOOTLOADER_ADDRESS */

-+

- #endif /* !defined(__DOXYGEN__) */

- 

- /** @} */

+                 /* Branching to the defined exit handler.*/
+                 b       __default_exit
+ 
++#ifdef STM32_BOOTLOADER_ADDRESS
++/*
++ * Jump-to-bootloader function.
++ */
++
++                .align  2
++                .thumb_func
++Bootloader_Jump:
++                ldr     r0, =STM32_BOOTLOADER_ADDRESS
++                ldr     r1, [r0, #0]
++                mov     sp, r1
++                ldr     r0, [r0, #4]
++                bx      r0
++#endif /* STM32_BOOTLOADER_ADDRESS */
++
+ #endif /* !defined(__DOXYGEN__) */
+ 
+ /** @} */