diff --git a/keyboard/ergodox_ez/Makefile b/keyboard/ergodox_ez/Makefile
index f9260b1ce..16ced9032 100644
--- a/keyboard/ergodox_ez/Makefile
+++ b/keyboard/ergodox_ez/Makefile
@@ -27,7 +27,8 @@ TARGET_DIR = .
 
 # # project specific files
 SRC = ergodox_ez.c \
-	  twimaster.c
+	  twimaster.c \
+	  matrix.c
 
 ifdef KEYMAP
     SRC := keymaps/keymap_$(KEYMAP).c $(SRC)
@@ -84,17 +85,18 @@ OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
 #   Atmel DFU loader 4096
 #   LUFA bootloader  4096
 #   USBaspLoader     2048
-OPT_DEFS += -DBOOTLOADER_SIZE=4096
+OPT_DEFS += -DBOOTLOADER_SIZE=512
 
 
 # Build Options
 #   comment out to disable the options.
 #
-BOOTMAGIC_ENABLE = yes	# Virtual DIP switch configuration(+1000)
-MOUSEKEY_ENABLE = yes	# Mouse keys(+4700)
-EXTRAKEY_ENABLE = yes	# Audio control and System control(+450)
-CONSOLE_ENABLE = yes	# Console for debug(+400)
-COMMAND_ENABLE = yes    # Commands for debug and configuration
+BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000)
+MOUSEKEY_ENABLE  = yes # Mouse keys(+4700)
+EXTRAKEY_ENABLE  = yes # Audio control and System control(+450)
+CONSOLE_ENABLE   = yes # Console for debug(+400)
+COMMAND_ENABLE   = yes # Commands for debug and configuration
+CUSTOM_MATRIX    = yes # Custom matrix file for the ErgoDox EZ
 # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
 # SLEEP_LED_ENABLE = yes  # Breathing sleep LED during USB suspend
 # NKRO_ENABLE = yes		# USB Nkey Rollover - not yet supported in LUFA
diff --git a/keyboard/ergodox_ez/config.h b/keyboard/ergodox_ez/config.h
index 850d24579..583ad84f5 100644
--- a/keyboard/ergodox_ez/config.h
+++ b/keyboard/ergodox_ez/config.h
@@ -52,7 +52,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 /* Set 0 if debouncing isn't needed */
 #define DEBOUNCE    2
-#define TAPPING_TERM    100
+#define TAPPING_TERM    200
 
 /* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
 #define LOCKING_SUPPORT_ENABLE
diff --git a/keyboard/ergodox_ez/ergodox_ez.c b/keyboard/ergodox_ez/ergodox_ez.c
index f7e156b31..78e956a04 100644
--- a/keyboard/ergodox_ez/ergodox_ez.c
+++ b/keyboard/ergodox_ez/ergodox_ez.c
@@ -4,10 +4,6 @@
 bool i2c_initialized = 0;
 uint8_t mcp23018_status = 0x20;
 
-bool ergodox_left_led_1 = 0;  // left top
-bool ergodox_left_led_2 = 0;  // left middle
-bool ergodox_left_led_3 = 0;  // left bottom
-
 __attribute__ ((weak))
 void * matrix_init_user(void) {
 
@@ -92,32 +88,7 @@ uint8_t init_mcp23018(void) {
 out:
     i2c_stop();
 
-    if (!mcp23018_status) mcp23018_status = ergodox_left_leds_update();
-
     return mcp23018_status;
 }
 
-uint8_t ergodox_left_leds_update(void) {
-    if (mcp23018_status) { // if there was an error
-        return mcp23018_status;
-    }
-
-    // set logical value (doesn't matter on inputs)
-    // - unused  : hi-Z : 1
-    // - input   : hi-Z : 1
-    // - driving : hi-Z : 1
-    mcp23018_status = i2c_start(I2C_ADDR_WRITE);    if (mcp23018_status) goto out;
-    mcp23018_status = i2c_write(OLATA);             if (mcp23018_status) goto out;
-    mcp23018_status = i2c_write(0b11111111
-            & ~(ergodox_left_led_3<<LEFT_LED_3_SHIFT)
-          );                                        if (mcp23018_status) goto out;
-    mcp23018_status = i2c_write(0b11111111
-            & ~(ergodox_left_led_2<<LEFT_LED_2_SHIFT)
-            & ~(ergodox_left_led_1<<LEFT_LED_1_SHIFT)
-          );                                        if (mcp23018_status) goto out;
-
-out:
-    i2c_stop();
-    return mcp23018_status;
-}
 
diff --git a/keyboard/ergodox_ez/ergodox_ez.h b/keyboard/ergodox_ez/ergodox_ez.h
index 219b4bd0b..3989a2f3a 100644
--- a/keyboard/ergodox_ez/ergodox_ez.h
+++ b/keyboard/ergodox_ez/ergodox_ez.h
@@ -37,29 +37,16 @@ uint8_t ergodox_left_leds_update(void);
 #define LED_BRIGHTNESS_LO       31
 #define LED_BRIGHTNESS_HI       255
 
-#define LEFT_LED_1_SHIFT        7       // in MCP23018 port B
-#define LEFT_LED_2_SHIFT        6       // in MCP23018 port B
-#define LEFT_LED_3_SHIFT        7       // in MCP23018 port A
-
-extern bool ergodox_left_led_1;         // left top
-extern bool ergodox_left_led_2;         // left middle
-extern bool ergodox_left_led_3;         // left bottom
 
 inline void ergodox_board_led_on(void)      { DDRD |=  (1<<6); PORTD |=  (1<<6); }
 inline void ergodox_right_led_1_on(void)    { DDRB |=  (1<<5); PORTB |=  (1<<5); }
 inline void ergodox_right_led_2_on(void)    { DDRB |=  (1<<6); PORTB |=  (1<<6); }
 inline void ergodox_right_led_3_on(void)    { DDRB |=  (1<<7); PORTB |=  (1<<7); }
-inline void ergodox_left_led_1_on(void)     { ergodox_left_led_1 = 1; }
-inline void ergodox_left_led_2_on(void)     { ergodox_left_led_2 = 1; }
-inline void ergodox_left_led_3_on(void)     { ergodox_left_led_3 = 1; }
 
 inline void ergodox_board_led_off(void)     { DDRD &= ~(1<<6); PORTD &= ~(1<<6); }
 inline void ergodox_right_led_1_off(void)   { DDRB &= ~(1<<5); PORTB &= ~(1<<5); }
 inline void ergodox_right_led_2_off(void)   { DDRB &= ~(1<<6); PORTB &= ~(1<<6); }
 inline void ergodox_right_led_3_off(void)   { DDRB &= ~(1<<7); PORTB &= ~(1<<7); }
-inline void ergodox_left_led_1_off(void)    { ergodox_left_led_1 = 0; }
-inline void ergodox_left_led_2_off(void)    { ergodox_left_led_2 = 0; }
-inline void ergodox_left_led_3_off(void)    { ergodox_left_led_3 = 0; }
 
 inline void ergodox_led_all_on(void)
 {
@@ -67,10 +54,6 @@ inline void ergodox_led_all_on(void)
     ergodox_right_led_1_on();
     ergodox_right_led_2_on();
     ergodox_right_led_3_on();
-    ergodox_left_led_1_on();
-    ergodox_left_led_2_on();
-    ergodox_left_led_3_on();
-    ergodox_left_leds_update();
 }
 
 inline void ergodox_led_all_off(void)
@@ -79,10 +62,6 @@ inline void ergodox_led_all_off(void)
     ergodox_right_led_1_off();
     ergodox_right_led_2_off();
     ergodox_right_led_3_off();
-    ergodox_left_led_1_off();
-    ergodox_left_led_2_off();
-    ergodox_left_led_3_off();
-    ergodox_left_leds_update();
 }
 
 inline void ergodox_right_led_1_set(uint8_t n)    { OCR1A = n; }
diff --git a/keyboard/ergodox_ez/ergodox_ez.hex b/keyboard/ergodox_ez/ergodox_ez.hex
index 21b6a9f91..00cfd73a7 100644
Binary files a/keyboard/ergodox_ez/ergodox_ez.hex and b/keyboard/ergodox_ez/ergodox_ez.hex differ
diff --git a/keyboard/ergodox_ez/keymaps/keymap_default.c b/keyboard/ergodox_ez/keymaps/keymap_default.c
index 2965dc74e..870f804ec 100644
--- a/keyboard/ergodox_ez/keymaps/keymap_default.c
+++ b/keyboard/ergodox_ez/keymaps/keymap_default.c
@@ -46,15 +46,15 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
              KC_COLN,KC_Y,   KC_U,   KC_I,   KC_O,   KC_P,             KC_BSLS,
                      KC_H,   KC_J,   KC_K,   KC_L,   LT(MDIA, KC_SCLN),KC_QUOT,
              TG(1),  KC_N,   KC_M,   KC_COMM,KC_DOT, CTL_T(KC_SLSH),   KC_RSFT,
-                             KC_UP,  KC_DOWN,KC_RBRC,KC_LBRC,          KC_FN1,
-             KC_RALT,        CTL_T(KC_ESC),
+                             KC_UP,  KC_DOWN,KC_LBRC,KC_RBRC,          KC_FN1,
+             KC_LALT,        CTL_T(KC_ESC),
              KC_PGUP,
              KC_PGDN,KC_TAB, KC_ENT
     ),
 /* Keymap 1: Symbol Layer
  *
  * ,--------------------------------------------------.           ,--------------------------------------------------.
- * |  Flash |  F1  |  F2  |  F3  |  F4  |  F5  |      |           |      |  F6  |  F7  |  F8  |  F9  |  F10 |   F11  |
+ * |        |  F1  |  F2  |  F3  |  F4  |  F5  |      |           |      |  F6  |  F7  |  F8  |  F9  |  F10 |   F11  |
  * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
  * |        |   !  |   @  |   {  |   }  |   |  |      |           |      |   Up |   7  |   8  |   9  |   *  |   F12  |
  * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
@@ -75,7 +75,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 // SYMBOLS
 [SYMB] = KEYMAP(
        // left hand
-       RESET,  KC_F1,  KC_F2,  KC_F3,  KC_F4,  KC_F5,  KC_TRNS,
+       KC_TRNS,KC_F1,  KC_F2,  KC_F3,  KC_F4,  KC_F5,  KC_TRNS,
        KC_TRNS,KC_EXLM,KC_AT,  KC_LCBR,KC_RCBR,KC_PIPE,KC_TRNS,
        KC_COLN,KC_HASH,KC_DLR, KC_LPRN,KC_RPRN,KC_GRV,
        KC_TRNS,KC_PERC,KC_CIRC,KC_LBRC,KC_RBRC,KC_TILD,KC_TRNS,
@@ -162,50 +162,24 @@ void * matrix_init_user(void) {
 
 // Runs constantly in the background, in a loop.
 void * matrix_scan_user(void) {
+
     uint8_t layer = biton32(layer_state);
 
     ergodox_board_led_off();
-    ergodox_left_led_1_off();
-    ergodox_left_led_2_off();
-    ergodox_left_led_3_off();
+    ergodox_right_led_1_off();
+    ergodox_right_led_2_off();
+    ergodox_right_led_3_off();
     switch (layer) {
       // TODO: Make this relevant to the ErgoDox EZ.
         case 1:
-            // all
-            ergodox_left_led_1_on();
-            ergodox_left_led_2_on();
-            ergodox_left_led_3_on();
+            ergodox_right_led_1_on();
             break;
         case 2:
-            // blue
-            ergodox_left_led_2_on();
-            break;
-        case 8:
-            // blue and green
-            ergodox_left_led_2_on();
-            // break missed intentionally
-        case 3:
-            // green
-            ergodox_left_led_3_on();
-            break;
-        case 6:
-            ergodox_board_led_on();
-            // break missed intentionally
-        case 4:
-        case 5:
-        case 7:
-            // white
-            ergodox_left_led_1_on();
-            break;
-        case 9:
-            // white+green
-            ergodox_left_led_1_on();
-            ergodox_left_led_3_on();
+            ergodox_right_led_2_on();
             break;
         default:
             // none
             break;
     }
 
-    mcp23018_status = ergodox_left_leds_update();
 };
diff --git a/keyboard/ergodox_ez/matrix.c b/keyboard/ergodox_ez/matrix.c
index 09380d308..3e1d69444 100644
--- a/keyboard/ergodox_ez/matrix.c
+++ b/keyboard/ergodox_ez/matrix.c
@@ -277,7 +277,7 @@ static void unselect_rows(void)
         mcp23018_status = i2c_start(I2C_ADDR_WRITE);    if (mcp23018_status) goto out;
         mcp23018_status = i2c_write(GPIOA);             if (mcp23018_status) goto out;
         mcp23018_status = i2c_write( 0xFF
-                              & ~(ergodox_left_led_3<<LEFT_LED_3_SHIFT)
+                              & ~(0<<7)
                           );                            if (mcp23018_status) goto out;
     out:
         i2c_stop();
@@ -305,7 +305,7 @@ static void select_row(uint8_t row)
             mcp23018_status = i2c_start(I2C_ADDR_WRITE);        if (mcp23018_status) goto out;
             mcp23018_status = i2c_write(GPIOA);                 if (mcp23018_status) goto out;
             mcp23018_status = i2c_write( 0xFF & ~(1<<row)
-                                  & ~(ergodox_left_led_3<<LEFT_LED_3_SHIFT)
+                                  & ~(0<<7)
                               );                                if (mcp23018_status) goto out;
         out:
             i2c_stop();
diff --git a/quantum/keymap_common.c b/quantum/keymap_common.c
index fc889a308..6cc7adf51 100644
--- a/quantum/keymap_common.c
+++ b/quantum/keymap_common.c
@@ -19,6 +19,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #include "report.h"
 #include "keycode.h"
 #include "action_layer.h"
+#include <util/delay.h>
 #include "action.h"
 #include "action_macro.h"
 #include "debug.h"
@@ -71,6 +72,8 @@ action_t action_for_key(uint8_t layer, keypos_t key)
         return action;
 #endif
     } else if (keycode == RESET) { // RESET is 0x5000, which is why this is here
+        clear_keyboard();
+        _delay_ms(250);
         bootloader_jump();
         return;
     } else if (keycode == DEBUG) { // DEBUG is 0x5001
@@ -78,7 +81,7 @@ action_t action_for_key(uint8_t layer, keypos_t key)
         print("\nDEBUG: enabled.\n");
         debug_enable = true;
         return;
-    } else if (keycode >= 0x5000 && keycode < 0x6000) { 
+    } else if (keycode >= 0x5000 && keycode < 0x6000) {
         // Layer movement shortcuts
         // See .h to see constraints/usage
         int type = (keycode >> 0x8) & 0xF;
@@ -107,7 +110,7 @@ action_t action_for_key(uint8_t layer, keypos_t key)
             action_t action;
             action.code = ACTION_LAYER_TOGGLE(layer);
             return action;
-        } 
+        }
 #ifdef MIDI_ENABLE
     } else if (keycode >= 0x6000 && keycode < 0x7000) {
         action_t action;
diff --git a/quantum/keymap_common.h b/quantum/keymap_common.h
index 5735631d9..2da01251d 100644
--- a/quantum/keymap_common.h
+++ b/quantum/keymap_common.h
@@ -190,12 +190,7 @@ extern const uint16_t fn_actions[];
 #define GUI_T(kc) MT(0x8, kc)
 
 // L-ayer, T-ap - 256 keycode max, 16 layer max
-#define LT(layer, kc) (kc | 0x7000 | ((layer & 0xF) << 8))
-
-// For sending unicode codes.
-// You may not send codes over 1FFF -- this supports most of UTF8.
-// To have a key that sends out Œ, go UC(0x0152)
-#define UNICODE(n) (n | 0x8000)
+#define LT(layer, kc) (kc | 0x8000 | ((layer & 0xF) << 8))
 #define UC(n) UNICODE(n)