From 320822d75b785401809f45007320e6fb6885b3fd Mon Sep 17 00:00:00 2001
From: Wilba <Jason.S.Williams@gmail.com>
Date: Sat, 4 Jan 2020 07:52:00 +1100
Subject: [PATCH] VIA Configurator Refactor (#7268)

* VIA Refactor

* Remove old code

* review changes

* review changes

* Fix cannonkeys/satisfaction75/prototype:via build

* Add via.h to quantum.h

* Move backlight init to after backlight config load

* Merge branch 'master' into via_refactor_pr

* Update user's rules.mk to new way of enabling VIA

* Added id_switch_matrix_state

* Review changes
---
 common_features.mk                            |  40 +-
 keyboards/aeboards/aegis/config.h             |  20 -
 keyboards/aeboards/aegis/keymaps/via/rules.mk |  69 +--
 keyboards/aeboards/aegis/rules.mk             |   4 +-
 keyboards/aeboards/ext65/config.h             |  21 -
 .../aeboards/ext65/keymaps/default/keymap.c   |   8 +-
 keyboards/aeboards/ext65/keymaps/via/keymap.c |   8 +-
 keyboards/aeboards/ext65/keymaps/via/rules.mk |  69 +--
 keyboards/aeboards/ext65/rules.mk             |   5 +-
 keyboards/ai03/lunar/config.h                 |  22 -
 keyboards/ai03/lunar/keymaps/via/rules.mk     |  86 +---
 keyboards/cannonkeys/an_c/config.h            |  23 +-
 .../cannonkeys/an_c/keymaps/via/rules.mk      |   6 +-
 keyboards/cannonkeys/an_c/rules.mk            |   3 -
 keyboards/cannonkeys/chimera65/config.h       |  20 -
 .../cannonkeys/chimera65/keymaps/via/rules.mk |   6 +-
 keyboards/cannonkeys/chimera65/rules.mk       |   3 -
 keyboards/cannonkeys/instant60/config.h       |  23 +-
 .../cannonkeys/instant60/keymaps/via/rules.mk |   6 +-
 .../instant60/keymaps/via_standard/rules.mk   |   6 +-
 keyboards/cannonkeys/instant60/rules.mk       |   3 -
 keyboards/cannonkeys/iron165/config.h         |  22 +-
 keyboards/cannonkeys/satisfaction75/config.h  |  43 +-
 .../satisfaction75/keymaps/boy_314/rules.mk   |   3 +-
 .../satisfaction75/keymaps/via/rules.mk       |   6 +-
 .../satisfaction75/prototype/prototype.h      |  17 +
 keyboards/cannonkeys/satisfaction75/rules.mk  |   3 -
 .../satisfaction75/satisfaction75.c           | 288 ++++--------
 .../satisfaction75/satisfaction75.h           |  10 +-
 .../satisfaction75/satisfaction_encoder.c     |   6 +-
 keyboards/cannonkeys/savage65/config.h        |  22 +-
 keyboards/cannonkeys/stm32f072/keyboard.c     | 268 +++--------
 keyboards/cannonkeys/stm32f072/keyboard.h     |   4 +-
 keyboards/cannonkeys/tmov2/config.h           |  22 +-
 keyboards/dp60/config.h                       |  22 +-
 keyboards/dp60/keymaps/via/rules.mk           |  40 +-
 keyboards/handwired/prime_exl/config.h        |  20 -
 .../handwired/prime_exl/keymaps/via/rules.mk  |  87 +---
 keyboards/hs60/v2/config.h                    |  20 +-
 keyboards/hs60/v2/keymaps/ansi_via/rules.mk   |  68 +--
 .../hs60/v2/keymaps/default_via/rules.mk      |  68 +--
 keyboards/hs60/v2/keymaps/goatmaster/rules.mk |  68 +--
 keyboards/hs60/v2/keymaps/hhkb_via/rules.mk   |  68 +--
 keyboards/hs60/v2/keymaps/iso_andys8/rules.mk |  68 +--
 keyboards/hs60/v2/keymaps/stanrc85/rules.mk   |  68 +--
 .../hs60/v2/keymaps/win_osx_dual/rules.mk     |  68 +--
 keyboards/hs60/v2/rules.mk                    |   2 -
 keyboards/hs60/v2/v2.h                        |   2 +-
 keyboards/idb_60/config.h                     |  20 -
 keyboards/illuminati/is0/keymaps/via/keymap.c |  31 ++
 .../illuminati/is0/keymaps/via/readme.md      |   1 +
 keyboards/illuminati/is0/keymaps/via/rules.mk |   1 +
 keyboards/keebio/iris/iris.h                  |   2 +-
 keyboards/keebio/iris/keymaps/osiris/rules.mk |   5 -
 keyboards/keebio/iris/keymaps/via/config.h    |  20 -
 keyboards/keebio/iris/keymaps/via/rules.mk    |   8 +-
 keyboards/keebio/iris/rev1/config.h           |  20 -
 keyboards/keebio/iris/rev1_led/config.h       |  20 -
 keyboards/keebio/iris/rev2/config.h           |  20 -
 keyboards/keebio/iris/rev3/config.h           |  20 -
 keyboards/keebio/iris/rev4/config.h           |  20 -
 keyboards/kingly_keys/romac/config.h          |   4 +-
 .../kingly_keys/romac/keymaps/via/keymap.c    |  44 ++
 .../kingly_keys/romac/keymaps/via/rules.mk    |   1 +
 keyboards/maartenwut/plain60/config.h         |  21 -
 .../plain60/keymaps/kwerdenker/rules.mk       |   5 +-
 .../maartenwut/plain60/keymaps/via/rules.mk   |   6 +-
 keyboards/nk65/config.h                       |  21 +-
 keyboards/nk65/keymaps/default_via/rules.mk   |  68 +--
 keyboards/nk65/nk65.h                         |   2 +-
 keyboards/nk65/rules.mk                       |   2 -
 keyboards/primekb/prime_e/config.h            |  20 -
 .../primekb/prime_e/keymaps/via/rules.mk      |  86 +---
 keyboards/projectkb/alice/config.h            |  26 +-
 keyboards/projectkb/alice/rules.mk            |   3 -
 keyboards/sck/osa/config.h                    |   4 +-
 keyboards/sck/osa/keymaps/via/keymap.c        |  49 ++
 keyboards/sck/osa/keymaps/via/readme.md       |   1 +
 keyboards/sck/osa/keymaps/via/rules.mk        |   2 +
 keyboards/snagpad/config.h                    |  20 -
 keyboards/snagpad/keymaps/via/rules.mk        |  77 +---
 keyboards/westfoxtrot/aanzee/config.h         |  23 -
 .../westfoxtrot/aanzee/keymaps/via/rules.mk   |  70 +--
 keyboards/wilba_tech/rama_works_koyu/config.h |  26 +-
 .../rama_works_koyu/keymaps/via/keymap.c      |  36 ++
 .../rama_works_koyu/keymaps/via/rules.mk      |   1 +
 .../rama_works_koyu/rama_works_koyu.h         |   2 +-
 keyboards/wilba_tech/rama_works_koyu/rules.mk |   4 +-
 .../wilba_tech/rama_works_m10_b/config.h      |  27 +-
 .../rama_works_m10_b/keymaps/knops/config.h   |   1 +
 .../rama_works_m10_b/keymaps/via/keymap.c     |  13 +
 .../rama_works_m10_b/keymaps/via/rules.mk     |   1 +
 .../wilba_tech/rama_works_m10_b/rules.mk      |   8 +-
 .../wilba_tech/rama_works_m60_a/config.h      |  26 +-
 .../rama_works_m60_a/keymaps/via/keymap.c     |  40 ++
 .../rama_works_m60_a/keymaps/via/rules.mk     |   1 +
 .../rama_works_m60_a/rama_works_m60_a.h       |   2 +-
 .../wilba_tech/rama_works_m60_a/rules.mk      |   4 +-
 keyboards/wilba_tech/rama_works_m6_a/config.h |  26 +-
 .../rama_works_m6_a/keymaps/via/keymap.c      |  16 +
 .../rama_works_m6_a/keymaps/via/rules.mk      |   1 +
 keyboards/wilba_tech/rama_works_m6_a/rules.mk |   9 +-
 keyboards/wilba_tech/rama_works_m6_b/config.h |  26 +-
 .../rama_works_m6_b/keymaps/via/keymap.c      |  16 +
 .../rama_works_m6_b/keymaps/via/rules.mk      |   1 +
 keyboards/wilba_tech/rama_works_m6_b/rules.mk |   4 +-
 .../wilba_tech/rama_works_u80_a/config.h      |  27 +-
 .../rama_works_u80_a/keymaps/via/keymap.c     |  37 ++
 .../rama_works_u80_a/keymaps/via/rules.mk     |   1 +
 .../rama_works_u80_a/rama_works_u80_a.h       |   2 +-
 .../wilba_tech/rama_works_u80_a/rules.mk      |   5 +-
 keyboards/wilba_tech/via_api.h                |  49 --
 keyboards/wilba_tech/via_keycodes.h           |  77 ----
 keyboards/wilba_tech/wt60_a/config.h          |  23 +-
 .../wilba_tech/wt60_a/keymaps/via/rules.mk    |   3 +-
 keyboards/wilba_tech/wt60_a/rules.mk          |   2 +-
 keyboards/wilba_tech/wt60_d/config.h          |  20 -
 .../wilba_tech/wt60_d/keymaps/via/rules.mk    |   3 +-
 keyboards/wilba_tech/wt60_d/rules.mk          |   8 +-
 keyboards/wilba_tech/wt60_d/wt60_d.c          |  18 +-
 keyboards/wilba_tech/wt65_a/config.h          |  23 +-
 .../wilba_tech/wt65_a/keymaps/via/rules.mk    |   3 +-
 keyboards/wilba_tech/wt65_a/rules.mk          |   2 +-
 keyboards/wilba_tech/wt65_b/config.h          |  23 +-
 .../wilba_tech/wt65_b/keymaps/via/rules.mk    |   3 +-
 keyboards/wilba_tech/wt65_b/rules.mk          |   2 +-
 keyboards/wilba_tech/wt69_a/config.h          |  23 -
 .../wilba_tech/wt69_a/keymaps/via/rules.mk    |   3 +-
 keyboards/wilba_tech/wt69_a/rules.mk          |   2 +-
 keyboards/wilba_tech/wt75_a/config.h          |  23 +-
 .../wilba_tech/wt75_a/keymaps/via/rules.mk    |   3 +-
 keyboards/wilba_tech/wt75_a/rules.mk          |   2 +-
 keyboards/wilba_tech/wt75_b/config.h          |  23 +-
 .../wilba_tech/wt75_b/keymaps/via/rules.mk    |   3 +-
 keyboards/wilba_tech/wt75_b/rules.mk          |   2 +-
 keyboards/wilba_tech/wt75_c/config.h          |  25 +-
 .../wilba_tech/wt75_c/keymaps/via/rules.mk    |   3 +-
 keyboards/wilba_tech/wt75_c/rules.mk          |   2 +-
 keyboards/wilba_tech/wt80_a/config.h          |  24 +-
 .../wilba_tech/wt80_a/keymaps/via/rules.mk    |   3 +-
 keyboards/wilba_tech/wt80_a/rules.mk          |   2 +-
 keyboards/wilba_tech/wt8_a/config.h           |  23 -
 .../wilba_tech/wt8_a/keymaps/via/rules.mk     |  69 +--
 keyboards/wilba_tech/wt8_a/rules.mk           |   2 +-
 keyboards/wilba_tech/wt_main.c                | 434 +++++-------------
 keyboards/wilba_tech/wt_mono_backlight.c      |   9 +-
 keyboards/wilba_tech/wt_rgb_backlight.c       |   8 +-
 keyboards/wilba_tech/zeal60/config.h          |  24 +-
 .../wilba_tech/zeal60/keymaps/via/keymap.c    |  38 ++
 .../wilba_tech/zeal60/keymaps/via/rules.mk    |   1 +
 keyboards/wilba_tech/zeal60/rules.mk          |   4 +-
 keyboards/wilba_tech/zeal60/zeal60.h          |   2 +-
 keyboards/wilba_tech/zeal65/config.h          |  24 +-
 keyboards/wilba_tech/zeal65/info.json         |   2 +-
 .../zeal65/keymaps/split_bs/keymap.c          |   8 +-
 .../wilba_tech/zeal65/keymaps/via/keymap.c    |  38 ++
 .../wilba_tech/zeal65/keymaps/via/rules.mk    |   1 +
 keyboards/wilba_tech/zeal65/rules.mk          |   4 +-
 keyboards/wilba_tech/zeal65/zeal65.h          |   4 +-
 quantum/dynamic_keymap.c                      |  45 +-
 quantum/quantum.c                             |   7 +-
 quantum/quantum.h                             |   8 +
 quantum/via.c                                 | 400 ++++++++++++++++
 quantum/via.h                                 | 151 ++++++
 show_options.mk                               |   3 +-
 tmk_core/common/eeconfig.h                    |   2 +
 tmk_core/common/keyboard.c                    |   6 +
 167 files changed, 1502 insertions(+), 3157 deletions(-)
 create mode 100644 keyboards/illuminati/is0/keymaps/via/keymap.c
 create mode 100644 keyboards/illuminati/is0/keymaps/via/readme.md
 create mode 100644 keyboards/illuminati/is0/keymaps/via/rules.mk
 delete mode 100644 keyboards/keebio/iris/keymaps/via/config.h
 create mode 100644 keyboards/kingly_keys/romac/keymaps/via/keymap.c
 create mode 100644 keyboards/kingly_keys/romac/keymaps/via/rules.mk
 create mode 100644 keyboards/sck/osa/keymaps/via/keymap.c
 create mode 100644 keyboards/sck/osa/keymaps/via/readme.md
 create mode 100644 keyboards/sck/osa/keymaps/via/rules.mk
 create mode 100644 keyboards/wilba_tech/rama_works_koyu/keymaps/via/keymap.c
 create mode 100644 keyboards/wilba_tech/rama_works_koyu/keymaps/via/rules.mk
 create mode 100644 keyboards/wilba_tech/rama_works_m10_b/keymaps/via/keymap.c
 create mode 100644 keyboards/wilba_tech/rama_works_m10_b/keymaps/via/rules.mk
 create mode 100644 keyboards/wilba_tech/rama_works_m60_a/keymaps/via/keymap.c
 create mode 100644 keyboards/wilba_tech/rama_works_m60_a/keymaps/via/rules.mk
 create mode 100644 keyboards/wilba_tech/rama_works_m6_a/keymaps/via/keymap.c
 create mode 100644 keyboards/wilba_tech/rama_works_m6_a/keymaps/via/rules.mk
 create mode 100644 keyboards/wilba_tech/rama_works_m6_b/keymaps/via/keymap.c
 create mode 100644 keyboards/wilba_tech/rama_works_m6_b/keymaps/via/rules.mk
 create mode 100644 keyboards/wilba_tech/rama_works_u80_a/keymaps/via/keymap.c
 create mode 100644 keyboards/wilba_tech/rama_works_u80_a/keymaps/via/rules.mk
 delete mode 100644 keyboards/wilba_tech/via_api.h
 delete mode 100644 keyboards/wilba_tech/via_keycodes.h
 create mode 100644 keyboards/wilba_tech/zeal60/keymaps/via/keymap.c
 create mode 100644 keyboards/wilba_tech/zeal60/keymaps/via/rules.mk
 create mode 100644 keyboards/wilba_tech/zeal65/keymaps/via/keymap.c
 create mode 100644 keyboards/wilba_tech/zeal65/keymaps/via/rules.mk
 create mode 100644 quantum/via.c
 create mode 100644 quantum/via.h

diff --git a/common_features.mk b/common_features.mk
index 640539fd6f..92b24bb200 100644
--- a/common_features.mk
+++ b/common_features.mk
@@ -82,19 +82,19 @@ endif
 
 ifeq ($(strip $(UCIS_ENABLE)), yes)
     OPT_DEFS += -DUCIS_ENABLE
-    UNICODE_COMMON = yes
+    UNICODE_COMMON := yes
     SRC += $(QUANTUM_DIR)/process_keycode/process_ucis.c
 endif
 
 ifeq ($(strip $(UNICODEMAP_ENABLE)), yes)
     OPT_DEFS += -DUNICODEMAP_ENABLE
-    UNICODE_COMMON = yes
+    UNICODE_COMMON := yes
     SRC += $(QUANTUM_DIR)/process_keycode/process_unicodemap.c
 endif
 
 ifeq ($(strip $(UNICODE_ENABLE)), yes)
     OPT_DEFS += -DUNICODE_ENABLE
-    UNICODE_COMMON = yes
+    UNICODE_COMMON := yes
     SRC += $(QUANTUM_DIR)/process_keycode/process_unicode.c
 endif
 
@@ -107,13 +107,13 @@ ifeq ($(strip $(RGBLIGHT_ENABLE)), yes)
     OPT_DEFS += -DRGBLIGHT_ENABLE
     SRC += $(QUANTUM_DIR)/color.c
     SRC += $(QUANTUM_DIR)/rgblight.c
-    CIE1931_CURVE = yes
-    LED_BREATHING_TABLE = yes
-    RGB_KEYCODES_ENABLE = yes
+    CIE1931_CURVE := yes
+    LED_BREATHING_TABLE := yes
+    RGB_KEYCODES_ENABLE := yes
     ifeq ($(strip $(RGBLIGHT_CUSTOM_DRIVER)), yes)
         OPT_DEFS += -DRGBLIGHT_CUSTOM_DRIVER
     else
-        WS2812_DRIVER_REQUIRED = yes
+        WS2812_DRIVER_REQUIRED := yes
     endif
 endif
 
@@ -147,12 +147,12 @@ endif
     SRC += $(QUANTUM_DIR)/color.c
     SRC += $(QUANTUM_DIR)/rgb_matrix.c
     SRC += $(QUANTUM_DIR)/rgb_matrix_drivers.c
-    CIE1931_CURVE = yes
-    RGB_KEYCODES_ENABLE = yes
+    CIE1931_CURVE := yes
+    RGB_KEYCODES_ENABLE := yes
 endif
 
 ifeq ($(strip $(RGB_MATRIX_ENABLE)), yes)
-	RGB_MATRIX_ENABLE = IS31FL3731
+	RGB_MATRIX_ENABLE := IS31FL3731
 endif
 
 ifeq ($(strip $(RGB_MATRIX_ENABLE)), IS31FL3731)
@@ -178,7 +178,7 @@ endif
 
 ifeq ($(strip $(RGB_MATRIX_ENABLE)), WS2812)
     OPT_DEFS += -DWS2812
-    WS2812_DRIVER_REQUIRED = yes
+    WS2812_DRIVER_REQUIRED := yes
 endif
 
 ifeq ($(strip $(RGB_MATRIX_CUSTOM_KB)), yes)
@@ -232,12 +232,12 @@ endif
 endif
 
 ifeq ($(strip $(LCD_ENABLE)), yes)
-    CIE1931_CURVE = yes
+    CIE1931_CURVE := yes
 endif
 
 # backward compat
 ifeq ($(strip $(BACKLIGHT_CUSTOM_DRIVER)), yes)
-    BACKLIGHT_DRIVER = custom
+    BACKLIGHT_DRIVER := custom
 endif
 
 VALID_BACKLIGHT_TYPES := pwm software custom
@@ -250,7 +250,7 @@ ifeq ($(strip $(BACKLIGHT_ENABLE)), yes)
     endif
 
     ifeq ($(strip $(VISUALIZER_ENABLE)), yes)
-        CIE1931_CURVE = yes
+        CIE1931_CURVE := yes
     endif
 
     COMMON_VPATH += $(QUANTUM_DIR)/backlight
@@ -294,12 +294,12 @@ endif
 
 ifeq ($(strip $(CIE1931_CURVE)), yes)
     OPT_DEFS += -DUSE_CIE1931_CURVE
-    LED_TABLES = yes
+    LED_TABLES := yes
 endif
 
 ifeq ($(strip $(LED_BREATHING_TABLE)), yes)
     OPT_DEFS += -DUSE_LED_BREATHING_TABLE
-    LED_TABLES = yes
+    LED_TABLES := yes
 endif
 
 ifeq ($(strip $(LED_TABLES)), yes)
@@ -349,6 +349,14 @@ ifeq ($(strip $(VELOCIKEY_ENABLE)), yes)
     SRC += $(QUANTUM_DIR)/velocikey.c
 endif
 
+ifeq ($(strip $(VIA_ENABLE)), yes)
+    DYNAMIC_KEYMAP_ENABLE := yes
+    RAW_ENABLE := yes
+    BOOTMAGIC_ENABLE := lite
+    SRC += $(QUANTUM_DIR)/via.c
+    OPT_DEFS += -DVIA_ENABLE
+endif
+
 ifeq ($(strip $(DYNAMIC_KEYMAP_ENABLE)), yes)
     OPT_DEFS += -DDYNAMIC_KEYMAP_ENABLE
     SRC += $(QUANTUM_DIR)/dynamic_keymap.c
diff --git a/keyboards/aeboards/aegis/config.h b/keyboards/aeboards/aegis/config.h
index 2a35897300..5836f02bc0 100644
--- a/keyboards/aeboards/aegis/config.h
+++ b/keyboards/aeboards/aegis/config.h
@@ -46,23 +46,3 @@
 
 /* Locking resynchronize hack */
 #define LOCKING_RESYNC_ENABLE
-
-#define DYNAMIC_KEYMAP_LAYER_COUNT 4
-
-// EEPROM usage
-
-// TODO: refactor with new user EEPROM code (coming soon)
-#define EEPROM_MAGIC 0x451F
-#define EEPROM_MAGIC_ADDR 34
-// Bump this every time we change what we store
-// This will automatically reset the EEPROM with defaults
-// and avoid loading invalid data from the EEPROM
-#define EEPROM_VERSION 0x08
-#define EEPROM_VERSION_ADDR 36
-
-// Dynamic keymap starts after EEPROM version
-#define DYNAMIC_KEYMAP_EEPROM_ADDR 37
-// Dynamic macro starts after dynamic keymaps (37+(4*12*9*2)) = (37+864)
-#define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR 901
-#define DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE 123
-#define DYNAMIC_KEYMAP_MACRO_COUNT 16
diff --git a/keyboards/aeboards/aegis/keymaps/via/rules.mk b/keyboards/aeboards/aegis/keymaps/via/rules.mk
index 70258b9ead..1e5b99807c 100644
--- a/keyboards/aeboards/aegis/keymaps/via/rules.mk
+++ b/keyboards/aeboards/aegis/keymaps/via/rules.mk
@@ -1,68 +1 @@
-# project specific files
-SRC =	keyboards/wilba_tech/wt_main.c
-
-# MCU name
-MCU = atmega32u4
-
-# Processor frequency.
-#     This will define a symbol, F_CPU, in all source code files equal to the
-#     processor frequency in Hz. You can then use this symbol in your source code to
-#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
-#     automatically to create a 32-bit value in your source code.
-#
-#     This will be an integer division of F_USB below, as it is sourced by
-#     F_USB after it has run through any CPU prescalers. Note that this value
-#     does not *change* the processor frequency - it should merely be updated to
-#     reflect the processor speed set externally so that the code can use accurate
-#     software delays.
-F_CPU = 16000000
-
-
-#
-# LUFA specific
-#
-# Target architecture (see library "Board Types" documentation).
-ARCH = AVR8
-
-# Input clock frequency.
-#     This will define a symbol, F_USB, in all source code files equal to the
-#     input clock frequency (before any prescaling is performed) in Hz. This value may
-#     differ from F_CPU if prescaling is used on the latter, and is required as the
-#     raw input clock is fed directly to the PLL sections of the AVR for high speed
-#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
-#     at the end, this will be done automatically to create a 32-bit value in your
-#     source code.
-#
-#     If no clock division is performed on the input clock inside the AVR (via the
-#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
-F_USB = $(F_CPU)
-
-# Interrupt driven control endpoint task(+60)
-OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
-
-
-# Boot Section
-BOOTLOADER = atmel-dfu
-
-
-# Build Options
-#   change yes to no to disable
-#
-BOOTMAGIC_ENABLE = no      # Virtual DIP switch configuration(+1000)
-MOUSEKEY_ENABLE = no       # Mouse keys(+4700)
-EXTRAKEY_ENABLE = yes       # Audio control and System control(+450)
-CONSOLE_ENABLE = no        # Console for debug(+400)
-COMMAND_ENABLE = no        # Commands for debug and configuration
-# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
-SLEEP_LED_ENABLE = no       # Breathing sleep LED during USB suspend
-# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
-NKRO_ENABLE = yes            # USB Nkey Rollover
-BACKLIGHT_ENABLE = no       # Enable keyboard backlight functionality on B7 by default
-MIDI_ENABLE = no            # MIDI support (+2400 to 4200, depending on config)
-UNICODE_ENABLE = no         # Unicode
-BLUETOOTH_ENABLE = no       # Enable Bluetooth with the Adafruit EZ-Key HID
-AUDIO_ENABLE = no           # Audio output on port C6
-FAUXCLICKY_ENABLE = no      # Use buzzer to emulate clicky switches
-
-RAW_ENABLE = yes
-DYNAMIC_KEYMAP_ENABLE = yes
+VIA_ENABLE = yes
diff --git a/keyboards/aeboards/aegis/rules.mk b/keyboards/aeboards/aegis/rules.mk
index 602da86786..2e39dae173 100644
--- a/keyboards/aeboards/aegis/rules.mk
+++ b/keyboards/aeboards/aegis/rules.mk
@@ -14,7 +14,7 @@ BOOTLOADER = atmel-dfu
 # Build Options
 #   change yes to no to disable
 #
-BOOTMAGIC_ENABLE = no      # Virtual DIP switch configuration(+1000)
+BOOTMAGIC_ENABLE = lite    # Virtual DIP switch configuration(+1000)
 MOUSEKEY_ENABLE = no       # Mouse keys(+4700)
 EXTRAKEY_ENABLE = yes       # Audio control and System control(+450)
 CONSOLE_ENABLE = no        # Console for debug(+400)
@@ -30,5 +30,3 @@ BLUETOOTH_ENABLE = no       # Enable Bluetooth with the Adafruit EZ-Key HID
 AUDIO_ENABLE = no           # Audio output on port C6
 FAUXCLICKY_ENABLE = no      # Use buzzer to emulate clicky switches
 
-# project specific files
-SRC = keyboards/wilba_tech/wt_main.c
diff --git a/keyboards/aeboards/ext65/config.h b/keyboards/aeboards/ext65/config.h
index 7255b463fc..c6e6ac8900 100644
--- a/keyboards/aeboards/ext65/config.h
+++ b/keyboards/aeboards/ext65/config.h
@@ -46,24 +46,3 @@
 
 /* Locking resynchronize hack */
 #define LOCKING_RESYNC_ENABLE
-
-#define DYNAMIC_KEYMAP_LAYER_COUNT 4
-
-// EEPROM usage
-
-// TODO: refactor with new user EEPROM code (coming soon)
-#define EEPROM_MAGIC 0x451F
-#define EEPROM_MAGIC_ADDR 34
-// Bump this every time we change what we store
-// This will automatically reset the EEPROM with defaults
-// and avoid loading invalid data from the EEPROM
-#define EEPROM_VERSION 0x08
-#define EEPROM_VERSION_ADDR 36
-
-// Dynamic keymap starts after EEPROM version
-#define DYNAMIC_KEYMAP_EEPROM_ADDR 37
-// Dynamic macro starts after dynamic keymaps (37+(4*10*10*2)) = (37+800)
-#define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR 837
-#define DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE 187
-#define DYNAMIC_KEYMAP_MACRO_COUNT 16
-
diff --git a/keyboards/aeboards/ext65/keymaps/default/keymap.c b/keyboards/aeboards/ext65/keymaps/default/keymap.c
index 339fe2c484..54eab23aec 100644
--- a/keyboards/aeboards/ext65/keymaps/default/keymap.c
+++ b/keyboards/aeboards/ext65/keymaps/default/keymap.c
@@ -38,9 +38,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
   ),
 
   [1] = LAYOUT_ext65(
-    KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RESET  ,
+    KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
     KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,          KC_TRNS,
-    KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGDN, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,                   KC_TRNS,
+    KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,                   KC_TRNS,
     KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,                   KC_TRNS, KC_TRNS,
     KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,                            KC_TRNS,                   KC_TRNS, KC_TRNS,                   KC_TRNS, KC_TRNS, KC_TRNS
   ),
@@ -48,7 +48,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
   [2] = LAYOUT_ext65(
     KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
     KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,          KC_TRNS,
-    KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGDN, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,                   KC_TRNS,
+    KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,                   KC_TRNS,
     KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,                   KC_TRNS, KC_TRNS,
     KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,                            KC_TRNS,                   KC_TRNS, KC_TRNS,                   KC_TRNS, KC_TRNS, KC_TRNS
   ),
@@ -56,7 +56,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
   [3] = LAYOUT_ext65(
     KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
     KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,          KC_TRNS,
-    KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGDN, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,                   KC_TRNS,
+    KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,                   KC_TRNS,
     KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,                   KC_TRNS, KC_TRNS,
     KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,                            KC_TRNS,                   KC_TRNS, KC_TRNS,                   KC_TRNS, KC_TRNS, KC_TRNS
   )
diff --git a/keyboards/aeboards/ext65/keymaps/via/keymap.c b/keyboards/aeboards/ext65/keymaps/via/keymap.c
index efa11cd0fd..ab6a93043a 100644
--- a/keyboards/aeboards/ext65/keymaps/via/keymap.c
+++ b/keyboards/aeboards/ext65/keymaps/via/keymap.c
@@ -38,9 +38,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
   ),
 
   [1] = LAYOUT_ext65(
-    KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RESET  ,
+    KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
     KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,          KC_TRNS,
-    KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGDN, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,                   KC_TRNS,
+    KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,                   KC_TRNS,
     KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,                   KC_TRNS, KC_TRNS,
     KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,                            KC_TRNS,                   KC_TRNS, KC_TRNS,                   KC_TRNS, KC_TRNS, KC_TRNS
   ),
@@ -48,7 +48,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
   [2] = LAYOUT_ext65(
     KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
     KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,          KC_TRNS,
-    KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGDN, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,                   KC_TRNS,
+    KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,                   KC_TRNS,
     KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,                   KC_TRNS, KC_TRNS,
     KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,                            KC_TRNS,                   KC_TRNS, KC_TRNS,                   KC_TRNS, KC_TRNS, KC_TRNS
   ),
@@ -56,7 +56,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
   [3] = LAYOUT_ext65(
     KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
     KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,          KC_TRNS,
-    KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGDN, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,                   KC_TRNS,
+    KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,                   KC_TRNS,
     KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,                   KC_TRNS, KC_TRNS,
     KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,                            KC_TRNS,                   KC_TRNS, KC_TRNS,                   KC_TRNS, KC_TRNS, KC_TRNS
   )
diff --git a/keyboards/aeboards/ext65/keymaps/via/rules.mk b/keyboards/aeboards/ext65/keymaps/via/rules.mk
index 70258b9ead..1e5b99807c 100644
--- a/keyboards/aeboards/ext65/keymaps/via/rules.mk
+++ b/keyboards/aeboards/ext65/keymaps/via/rules.mk
@@ -1,68 +1 @@
-# project specific files
-SRC =	keyboards/wilba_tech/wt_main.c
-
-# MCU name
-MCU = atmega32u4
-
-# Processor frequency.
-#     This will define a symbol, F_CPU, in all source code files equal to the
-#     processor frequency in Hz. You can then use this symbol in your source code to
-#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
-#     automatically to create a 32-bit value in your source code.
-#
-#     This will be an integer division of F_USB below, as it is sourced by
-#     F_USB after it has run through any CPU prescalers. Note that this value
-#     does not *change* the processor frequency - it should merely be updated to
-#     reflect the processor speed set externally so that the code can use accurate
-#     software delays.
-F_CPU = 16000000
-
-
-#
-# LUFA specific
-#
-# Target architecture (see library "Board Types" documentation).
-ARCH = AVR8
-
-# Input clock frequency.
-#     This will define a symbol, F_USB, in all source code files equal to the
-#     input clock frequency (before any prescaling is performed) in Hz. This value may
-#     differ from F_CPU if prescaling is used on the latter, and is required as the
-#     raw input clock is fed directly to the PLL sections of the AVR for high speed
-#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
-#     at the end, this will be done automatically to create a 32-bit value in your
-#     source code.
-#
-#     If no clock division is performed on the input clock inside the AVR (via the
-#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
-F_USB = $(F_CPU)
-
-# Interrupt driven control endpoint task(+60)
-OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
-
-
-# Boot Section
-BOOTLOADER = atmel-dfu
-
-
-# Build Options
-#   change yes to no to disable
-#
-BOOTMAGIC_ENABLE = no      # Virtual DIP switch configuration(+1000)
-MOUSEKEY_ENABLE = no       # Mouse keys(+4700)
-EXTRAKEY_ENABLE = yes       # Audio control and System control(+450)
-CONSOLE_ENABLE = no        # Console for debug(+400)
-COMMAND_ENABLE = no        # Commands for debug and configuration
-# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
-SLEEP_LED_ENABLE = no       # Breathing sleep LED during USB suspend
-# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
-NKRO_ENABLE = yes            # USB Nkey Rollover
-BACKLIGHT_ENABLE = no       # Enable keyboard backlight functionality on B7 by default
-MIDI_ENABLE = no            # MIDI support (+2400 to 4200, depending on config)
-UNICODE_ENABLE = no         # Unicode
-BLUETOOTH_ENABLE = no       # Enable Bluetooth with the Adafruit EZ-Key HID
-AUDIO_ENABLE = no           # Audio output on port C6
-FAUXCLICKY_ENABLE = no      # Use buzzer to emulate clicky switches
-
-RAW_ENABLE = yes
-DYNAMIC_KEYMAP_ENABLE = yes
+VIA_ENABLE = yes
diff --git a/keyboards/aeboards/ext65/rules.mk b/keyboards/aeboards/ext65/rules.mk
index bac979ad0c..a5c98a1c60 100644
--- a/keyboards/aeboards/ext65/rules.mk
+++ b/keyboards/aeboards/ext65/rules.mk
@@ -14,7 +14,7 @@ BOOTLOADER = atmel-dfu
 # Build Options
 #   change yes to no to disable
 #
-BOOTMAGIC_ENABLE = no      # Virtual DIP switch configuration(+1000)
+BOOTMAGIC_ENABLE = lite      # Virtual DIP switch configuration(+1000)
 MOUSEKEY_ENABLE = no       # Mouse keys(+4700)
 EXTRAKEY_ENABLE = yes       # Audio control and System control(+450)
 CONSOLE_ENABLE = no        # Console for debug(+400)
@@ -29,6 +29,3 @@ UNICODE_ENABLE = no         # Unicode
 BLUETOOTH_ENABLE = no       # Enable Bluetooth with the Adafruit EZ-Key HID
 AUDIO_ENABLE = no           # Audio output on port C6
 FAUXCLICKY_ENABLE = no      # Use buzzer to emulate clicky switches
-
-# project specific files
-SRC += keyboards/wilba_tech/wt_main.c
diff --git a/keyboards/ai03/lunar/config.h b/keyboards/ai03/lunar/config.h
index f7f3262ac7..5bc0a0c49b 100644
--- a/keyboards/ai03/lunar/config.h
+++ b/keyboards/ai03/lunar/config.h
@@ -242,25 +242,3 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 /* Bootmagic Lite key configuration */
 // #define BOOTMAGIC_LITE_ROW 0
 // #define BOOTMAGIC_LITE_COLUMN 0
-
-/* VIA Configurator Compatibility */
-
-#define DYNAMIC_KEYMAP_LAYER_COUNT 4
-
-// EEPROM usage
-
-#define EEPROM_MAGIC 0x451F
-#define EEPROM_MAGIC_ADDR 34
-// Bump this every time we change what we store
-// This will automatically reset the EEPROM with defaults
-// and avoid loading invalid data from the EEPROM
-#define EEPROM_VERSION 0x08
-#define EEPROM_VERSION_ADDR 36
-
-// Dynamic keymap starts after EEPROM version
-#define DYNAMIC_KEYMAP_EEPROM_ADDR 37
-// DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR = DYNAMIC_KEYMAP_EEPROM_ADDR + (DYNAMIC_KEYMAP_LAYER_COUNT * MATRIX_ROWS * MATRIX_COLS * 2)
-#define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR 637
-// DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE = 1024 - DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR
-#define DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE 387
-#define DYNAMIC_KEYMAP_MACRO_COUNT 16
diff --git a/keyboards/ai03/lunar/keymaps/via/rules.mk b/keyboards/ai03/lunar/keymaps/via/rules.mk
index 01fcd55e8d..1e5b99807c 100644
--- a/keyboards/ai03/lunar/keymaps/via/rules.mk
+++ b/keyboards/ai03/lunar/keymaps/via/rules.mk
@@ -1,85 +1 @@
-# MCU name
-MCU = atmega32u4
-
-# Processor frequency.
-#     This will define a symbol, F_CPU, in all source code files equal to the
-#     processor frequency in Hz. You can then use this symbol in your source code to
-#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
-#     automatically to create a 32-bit value in your source code.
-#
-#     This will be an integer division of F_USB below, as it is sourced by
-#     F_USB after it has run through any CPU prescalers. Note that this value
-#     does not *change* the processor frequency - it should merely be updated to
-#     reflect the processor speed set externally so that the code can use accurate
-#     software delays.
-F_CPU = 16000000
-
-
-#
-# LUFA specific
-#
-# Target architecture (see library "Board Types" documentation).
-ARCH = AVR8
-
-# Input clock frequency.
-#     This will define a symbol, F_USB, in all source code files equal to the
-#     input clock frequency (before any prescaling is performed) in Hz. This value may
-#     differ from F_CPU if prescaling is used on the latter, and is required as the
-#     raw input clock is fed directly to the PLL sections of the AVR for high speed
-#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
-#     at the end, this will be done automatically to create a 32-bit value in your
-#     source code.
-#
-#     If no clock division is performed on the input clock inside the AVR (via the
-#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
-F_USB = $(F_CPU)
-
-# Interrupt driven control endpoint task(+60)
-OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
-
-
-# Bootloader selection
-#   Teensy       halfkay
-#   Pro Micro    caterina
-#   Atmel DFU    atmel-dfu
-#   LUFA DFU     lufa-dfu
-#   QMK DFU      qmk-dfu
-#   atmega32a    bootloadHID
-BOOTLOADER = atmel-dfu
-
-
-# If you don't know the bootloader type, then you can specify the
-# Boot Section Size in *bytes* by uncommenting out the OPT_DEFS line
-#   Teensy halfKay      512
-#   Teensy++ halfKay    1024
-#   Atmel DFU loader    4096
-#   LUFA bootloader     4096
-#   USBaspLoader        2048
-# OPT_DEFS += -DBOOTLOADER_SIZE=4096
-
-
-# Build Options
-#   change yes to no to disable
-#
-BOOTMAGIC_ENABLE = no      # 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
-# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
-SLEEP_LED_ENABLE = no       # Breathing sleep LED during USB suspend
-# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
-NKRO_ENABLE = yes            # USB Nkey Rollover
-BACKLIGHT_ENABLE = no       # Enable keyboard backlight functionality on B7 by default
-RGBLIGHT_ENABLE = no        # Enable keyboard RGB underglow
-MIDI_ENABLE = no            # MIDI support (+2400 to 4200, depending on config)
-UNICODE_ENABLE = no         # Unicode
-BLUETOOTH_ENABLE = no       # Enable Bluetooth with the Adafruit EZ-Key HID
-AUDIO_ENABLE = no           # Audio output on port C6
-FAUXCLICKY_ENABLE = no      # Use buzzer to emulate clicky switches
-HD44780_ENABLE = no 		# Enable support for HD44780 based LCDs (+400)
-
-SRC += keyboards/wilba_tech/wt_main.c
-
-RAW_ENABLE = yes
-DYNAMIC_KEYMAP_ENABLE = yes
+VIA_ENABLE = yes
diff --git a/keyboards/cannonkeys/an_c/config.h b/keyboards/cannonkeys/an_c/config.h
index ef480521bc..55414ba509 100644
--- a/keyboards/cannonkeys/an_c/config.h
+++ b/keyboards/cannonkeys/an_c/config.h
@@ -58,26 +58,9 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #define PIN_WS2812      15
 #define WS2812_SPI SPID2
 
-
-// EEPROM usage
-// TODO: refactor with new user EEPROM code (coming soon)
-#define EEPROM_MAGIC 0x451F
-#define EEPROM_MAGIC_ADDR 40
-// Bump this every time we change what we store
-// This will automatically reset the EEPROM with defaults
-// and avoid loading invalid data from the EEPROM
-#define EEPROM_VERSION 0x03
-#define EEPROM_VERSION_ADDR 42
-
-
-#define DYNAMIC_KEYMAP_LAYER_COUNT 4
-// Dynamic macro starts after dynamic keymaps (35+(4*5*15*2)) = (35+600) = 635
-// start + layer * rows * col * 2
-#define DYNAMIC_KEYMAP_EEPROM_ADDR 43
-#define EEPROM_CUSTOM_BACKLIGHT 644
-#define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR 645
-#define DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE 192
-#define DYNAMIC_KEYMAP_MACRO_COUNT 16
+// Backlight config starts after VIA's EEPROM usage,
+// dynamic keymaps start after this.
+#define VIA_EEPROM_CUSTOM_CONFIG_SIZE 1
 
 /*
  * Feature disable options
diff --git a/keyboards/cannonkeys/an_c/keymaps/via/rules.mk b/keyboards/cannonkeys/an_c/keymaps/via/rules.mk
index d12497792d..1e5b99807c 100644
--- a/keyboards/cannonkeys/an_c/keymaps/via/rules.mk
+++ b/keyboards/cannonkeys/an_c/keymaps/via/rules.mk
@@ -1,5 +1 @@
-# rules.mk overrides to enable VIA
-
-RAW_ENABLE = yes
-DYNAMIC_KEYMAP_ENABLE = yes
-
+VIA_ENABLE = yes
diff --git a/keyboards/cannonkeys/an_c/rules.mk b/keyboards/cannonkeys/an_c/rules.mk
index 2f30956e7d..f99075d815 100644
--- a/keyboards/cannonkeys/an_c/rules.mk
+++ b/keyboards/cannonkeys/an_c/rules.mk
@@ -53,7 +53,4 @@ CUSTOM_MATRIX = no # Custom matrix file
 # BACKLIGHT_ENABLE = yes # This is broken on 072 for some reason
 RGBLIGHT_ENABLE = yes
 
-# RAW_ENABLE = yes
-# DYNAMIC_KEYMAP_ENABLE = yes
-
 LAYOUTS = 60_ansi 60_tsangan_hhkb
diff --git a/keyboards/cannonkeys/chimera65/config.h b/keyboards/cannonkeys/chimera65/config.h
index ace3565bea..c76fd6c1c5 100644
--- a/keyboards/cannonkeys/chimera65/config.h
+++ b/keyboards/cannonkeys/chimera65/config.h
@@ -50,26 +50,6 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 /* Locking resynchronize hack */
 #define LOCKING_RESYNC_ENABLE
 
-// EEPROM usage
-// TODO: refactor with new user EEPROM code (coming soon)
-#define EEPROM_MAGIC 0x451F
-#define EEPROM_MAGIC_ADDR 34
-// Bump this every time we change what we store
-// This will automatically reset the EEPROM with defaults
-// and avoid loading invalid data from the EEPROM
-#define EEPROM_VERSION 0x02
-#define EEPROM_VERSION_ADDR 36
-
-
-#define DYNAMIC_KEYMAP_LAYER_COUNT 4
-// Dynamic macro starts after dynamic keymaps (35+(4*5*15*2)) = (35+600) = 635
-// start + layer * rows * col * 2
-#define DYNAMIC_KEYMAP_EEPROM_ADDR 37
-#define EEPROM_CUSTOM_BACKLIGHT 678
-#define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR 679
-#define DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE 202
-#define DYNAMIC_KEYMAP_MACRO_COUNT 16
-
 /*
  * Feature disable options
  *  These options are also useful to firmware size reduction.
diff --git a/keyboards/cannonkeys/chimera65/keymaps/via/rules.mk b/keyboards/cannonkeys/chimera65/keymaps/via/rules.mk
index d12497792d..1e5b99807c 100644
--- a/keyboards/cannonkeys/chimera65/keymaps/via/rules.mk
+++ b/keyboards/cannonkeys/chimera65/keymaps/via/rules.mk
@@ -1,5 +1 @@
-# rules.mk overrides to enable VIA
-
-RAW_ENABLE = yes
-DYNAMIC_KEYMAP_ENABLE = yes
-
+VIA_ENABLE = yes
diff --git a/keyboards/cannonkeys/chimera65/rules.mk b/keyboards/cannonkeys/chimera65/rules.mk
index 580a7712c6..cd6734a312 100644
--- a/keyboards/cannonkeys/chimera65/rules.mk
+++ b/keyboards/cannonkeys/chimera65/rules.mk
@@ -52,6 +52,3 @@ NKRO_ENABLE = yes	    # USB Nkey Rollover
 CUSTOM_MATRIX = no # Custom matrix file
 # BACKLIGHT_ENABLE = yes # This is broken on 072 for some reason
 RGBLIGHT_ENABLE = no
-
-# RAW_ENABLE = yes
-# DYNAMIC_KEYMAP_ENABLE = yes
diff --git a/keyboards/cannonkeys/instant60/config.h b/keyboards/cannonkeys/instant60/config.h
index 9da2043d2f..2d23d5f83c 100644
--- a/keyboards/cannonkeys/instant60/config.h
+++ b/keyboards/cannonkeys/instant60/config.h
@@ -58,26 +58,9 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #define PIN_WS2812      15
 #define WS2812_SPI SPID2
 
-
-// EEPROM usage
-// TODO: refactor with new user EEPROM code (coming soon)
-#define EEPROM_MAGIC 0x451F
-#define EEPROM_MAGIC_ADDR 40
-// Bump this every time we change what we store
-// This will automatically reset the EEPROM with defaults
-// and avoid loading invalid data from the EEPROM
-#define EEPROM_VERSION 0x03
-#define EEPROM_VERSION_ADDR 42
-
-
-#define DYNAMIC_KEYMAP_LAYER_COUNT 4
-// Dynamic macro starts after dynamic keymaps (35+(4*5*15*2)) = (35+600) = 635
-// start + layer * rows * col * 2
-#define DYNAMIC_KEYMAP_EEPROM_ADDR 43
-#define EEPROM_CUSTOM_BACKLIGHT 644
-#define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR 645
-#define DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE 192
-#define DYNAMIC_KEYMAP_MACRO_COUNT 16
+// Backlight config starts after VIA's EEPROM usage,
+// dynamic keymaps start after this.
+#define VIA_EEPROM_CUSTOM_CONFIG_SIZE 1
 
 /*
  * Feature disable options
diff --git a/keyboards/cannonkeys/instant60/keymaps/via/rules.mk b/keyboards/cannonkeys/instant60/keymaps/via/rules.mk
index d12497792d..1e5b99807c 100644
--- a/keyboards/cannonkeys/instant60/keymaps/via/rules.mk
+++ b/keyboards/cannonkeys/instant60/keymaps/via/rules.mk
@@ -1,5 +1 @@
-# rules.mk overrides to enable VIA
-
-RAW_ENABLE = yes
-DYNAMIC_KEYMAP_ENABLE = yes
-
+VIA_ENABLE = yes
diff --git a/keyboards/cannonkeys/instant60/keymaps/via_standard/rules.mk b/keyboards/cannonkeys/instant60/keymaps/via_standard/rules.mk
index d12497792d..1e5b99807c 100644
--- a/keyboards/cannonkeys/instant60/keymaps/via_standard/rules.mk
+++ b/keyboards/cannonkeys/instant60/keymaps/via_standard/rules.mk
@@ -1,5 +1 @@
-# rules.mk overrides to enable VIA
-
-RAW_ENABLE = yes
-DYNAMIC_KEYMAP_ENABLE = yes
-
+VIA_ENABLE = yes
diff --git a/keyboards/cannonkeys/instant60/rules.mk b/keyboards/cannonkeys/instant60/rules.mk
index 1ce6fa3b26..d1dd3b2899 100644
--- a/keyboards/cannonkeys/instant60/rules.mk
+++ b/keyboards/cannonkeys/instant60/rules.mk
@@ -55,7 +55,4 @@ CUSTOM_MATRIX = no # Custom matrix file
 # BACKLIGHT_ENABLE = yes # This is broken on 072 for some reason
 RGBLIGHT_ENABLE = yes
 
-# RAW_ENABLE = yes
-# DYNAMIC_KEYMAP_ENABLE = yes
-
 LAYOUTS = 60_ansi 60_tsangan_hhkb
diff --git a/keyboards/cannonkeys/iron165/config.h b/keyboards/cannonkeys/iron165/config.h
index c5fcd4518a..640f6fb659 100644
--- a/keyboards/cannonkeys/iron165/config.h
+++ b/keyboards/cannonkeys/iron165/config.h
@@ -50,25 +50,9 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 /* Locking resynchronize hack */
 #define LOCKING_RESYNC_ENABLE
 
-// EEPROM usage
-// TODO: refactor with new user EEPROM code (coming soon)
-#define EEPROM_MAGIC 0x451F
-#define EEPROM_MAGIC_ADDR 40
-// Bump this every time we change what we store
-// This will automatically reset the EEPROM with defaults
-// and avoid loading invalid data from the EEPROM
-#define EEPROM_VERSION 0x02
-#define EEPROM_VERSION_ADDR 42
-
-
-#define DYNAMIC_KEYMAP_LAYER_COUNT 4
-// Dynamic macro starts after dynamic keymaps (35+(4*5*15*2)) = (35+600) = 635
-// start + layer * rows * col * 2
-#define DYNAMIC_KEYMAP_EEPROM_ADDR 43
-#define EEPROM_CUSTOM_BACKLIGHT 684
-#define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR 685
-#define DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE 192
-#define DYNAMIC_KEYMAP_MACRO_COUNT 16
+// Backlight config starts after VIA's EEPROM usage,
+// dynamic keymaps start after this.
+#define VIA_EEPROM_CUSTOM_CONFIG_SIZE 1
 
 /*
  * Feature disable options
diff --git a/keyboards/cannonkeys/satisfaction75/config.h b/keyboards/cannonkeys/satisfaction75/config.h
index 8387289d87..7a4354c8a7 100644
--- a/keyboards/cannonkeys/satisfaction75/config.h
+++ b/keyboards/cannonkeys/satisfaction75/config.h
@@ -64,41 +64,14 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 #endif
 
-
-#define DYNAMIC_KEYMAP_LAYER_COUNT 4
-
-// EEPROM usage
-
-// TODO: refactor with new user EEPROM code (coming soon)
-#define EEPROM_MAGIC 0x451F
-#define EEPROM_MAGIC_ADDR 40
-// Bump this every time we change what we store
-// This will automatically reset the EEPROM with defaults
-// and avoid loading invalid data from the EEPROM
-#define EEPROM_VERSION 0x01
-#define EEPROM_VERSION_ADDR 42
-
-// Dynamic keymap starts after EEPROM version
-#define DYNAMIC_KEYMAP_EEPROM_ADDR 43
-
-// Dynamic macro starts after dynamic keymaps (35+(4*6*16*2)) = (35+768) = 803
-
-// I'm also putting my custom stuff after that
-// 1 for enabled encoder modes
-// 1 for custom backlighting controls
-// 1 for OLED default mode
-// 6 for 3x custom encoder settings, left, right, and press (18 total)
-
-#define DYNAMIC_KEYMAP_ENABLED_ENCODER_MODES 811
-#define DYNAMIC_KEYMAP_CUSTOM_BACKLIGHT 812
-#define DYNAMIC_KEYMAP_DEFAULT_OLED 813
-#define DYNAMIC_KEYMAP_CUSTOM_ENCODER 814
-
-#define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR 832
-#define DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE 192
-#define DYNAMIC_KEYMAP_MACRO_COUNT 16
-
-
+// Custom config starts after VIA's EEPROM usage,
+// dynamic keymaps start after this.
+// Custom config Usage:
+// 1 for enabled encoder modes (1 byte)
+// 1 for custom backlighting controls (1 byte)
+// 1 for OLED default mode (1 byte)
+// 6 for 3x custom encoder settings, left, right, and press (18 bytes)
+#define VIA_EEPROM_CUSTOM_CONFIG_SIZE 21
 
 /*
  * Feature disable options
diff --git a/keyboards/cannonkeys/satisfaction75/keymaps/boy_314/rules.mk b/keyboards/cannonkeys/satisfaction75/keymaps/boy_314/rules.mk
index 0dcaa73183..6f45dc73ed 100644
--- a/keyboards/cannonkeys/satisfaction75/keymaps/boy_314/rules.mk
+++ b/keyboards/cannonkeys/satisfaction75/keymaps/boy_314/rules.mk
@@ -1,4 +1,3 @@
 # rules.mk overrides to enable VIA
 
-RAW_ENABLE = yes
-DYNAMIC_KEYMAP_ENABLE = yes
+VIA_ENABLE = yes
\ No newline at end of file
diff --git a/keyboards/cannonkeys/satisfaction75/keymaps/via/rules.mk b/keyboards/cannonkeys/satisfaction75/keymaps/via/rules.mk
index d12497792d..1e5b99807c 100644
--- a/keyboards/cannonkeys/satisfaction75/keymaps/via/rules.mk
+++ b/keyboards/cannonkeys/satisfaction75/keymaps/via/rules.mk
@@ -1,5 +1 @@
-# rules.mk overrides to enable VIA
-
-RAW_ENABLE = yes
-DYNAMIC_KEYMAP_ENABLE = yes
-
+VIA_ENABLE = yes
diff --git a/keyboards/cannonkeys/satisfaction75/prototype/prototype.h b/keyboards/cannonkeys/satisfaction75/prototype/prototype.h
index 42e574f3ea..ed4c7d793d 100644
--- a/keyboards/cannonkeys/satisfaction75/prototype/prototype.h
+++ b/keyboards/cannonkeys/satisfaction75/prototype/prototype.h
@@ -17,3 +17,20 @@
 	{ K400,  K401,  K402,  K403,  K404,  K405,  K406,  K407,  K408,  K409,  K410,  K411,  KC_NO, K413,  KC_NO,  K415 }, \
 	{ K500,  K501,  K502,  KC_NO, KC_NO, K505,  KC_NO, KC_NO, KC_NO, K509,  K510,  K511,  K512,  K513,  KC_NO,  K515 } \
 }
+
+// Expose All Keys - Split backspace - ISO Extra keys - Split space bottom row
+#define LAYOUT_all( \
+	K000,       K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013,             \
+	K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, \
+	K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213,       K215, \
+	K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313,       K315, \
+	K400, K401, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K413,       K415, \
+	K500, K501, K502, K503,       K505,       K507,       K509, K510, K511, K512, K513,       K515  \
+) { \
+	{ K000,  KC_NO, K002,  K003,  K004,  K005,  K006,  K007,  K008,  K009,  K010,  K011,  K012,  K013,  KC_NO,  KC_NO }, \
+	{ K100,  K101,  K102,  K103,  K104,  K105,  K106,  K107,  K108,  K109,  K110,  K111,  K112,  K113,  K114,   K115 }, \
+	{ K200,  K201,  K202,  K203,  K204,  K205,  K206,  K207,  K208,  K209,  K210,  K211,  K212,  K213,  KC_NO,  K215 }, \
+	{ K300,  K301,  K302,  K303,  K304,  K305,  K306,  K307,  K308,  K309,  K310,  K311,  K312,  K313,  KC_NO,  K315 }, \
+	{ K400,  K401,  K402,  K403,  K404,  K405,  K406,  K407,  K408,  K409,  K410,  K411,  K412,  K413,  KC_NO,  K415 }, \
+	{ K500,  K501,  K502,  K503,  KC_NO, K505,  KC_NO, K507,  KC_NO, K509,  K510,  K511,  K512,  K513,  KC_NO,  K515 } \
+}
diff --git a/keyboards/cannonkeys/satisfaction75/rules.mk b/keyboards/cannonkeys/satisfaction75/rules.mk
index 3e2877200e..e81448d626 100644
--- a/keyboards/cannonkeys/satisfaction75/rules.mk
+++ b/keyboards/cannonkeys/satisfaction75/rules.mk
@@ -51,7 +51,4 @@ ENCODER_ENABLE = yes
 QWIIC_ENABLE += MICRO_OLED
 #BACKLIGHT_ENABLE = yes
 
-# RAW_ENABLE = yes
-# DYNAMIC_KEYMAP_ENABLE = yes
-
 DEFAULT_FOLDER = cannonkeys/satisfaction75/rev1
diff --git a/keyboards/cannonkeys/satisfaction75/satisfaction75.c b/keyboards/cannonkeys/satisfaction75/satisfaction75.c
index 12d3660dae..0fe09c384f 100644
--- a/keyboards/cannonkeys/satisfaction75/satisfaction75.c
+++ b/keyboards/cannonkeys/satisfaction75/satisfaction75.c
@@ -15,11 +15,7 @@
 #include "raw_hid.h"
 #include "dynamic_keymap.h"
 #include "tmk_core/common/eeprom.h"
-
-// HACK
-#include "keyboards/wilba_tech/via_api.h" // Temporary hack
-#include "keyboards/wilba_tech/via_keycodes.h" // Temporary hack
-
+#include "version.h" // for QMK_BUILDDATE used in EEPROM magic
 
 /* Artificial delay added to get media keys to work in the encoder*/
 #define MEDIA_KEY_DELAY 10
@@ -58,56 +54,20 @@ backlight_config_t kb_backlight_config = {
   .level = BACKLIGHT_LEVELS
 };
 
-bool eeprom_is_valid(void)
+#ifdef VIA_ENABLE
+void raw_hid_receive_kb( uint8_t *data, uint8_t length )
 {
-	return (eeprom_read_word(((void*)EEPROM_MAGIC_ADDR)) == EEPROM_MAGIC &&
-			eeprom_read_byte(((void*)EEPROM_VERSION_ADDR)) == EEPROM_VERSION);
-}
-
-void eeprom_set_valid(bool valid)
-{
-	eeprom_update_word(((void*)EEPROM_MAGIC_ADDR), valid ? EEPROM_MAGIC : 0xFFFF);
-	eeprom_update_byte(((void*)EEPROM_VERSION_ADDR), valid ? EEPROM_VERSION : 0xFF);
-}
-
-void eeprom_reset(void)
-{
-	// Set the VIA specific EEPROM state as invalid.
-	eeprom_set_valid(false);
-	// Set the TMK/QMK EEPROM state as invalid.
-	eeconfig_disable();
-}
-
-#ifdef RAW_ENABLE
-
-void raw_hid_receive( uint8_t *data, uint8_t length )
-{
-	uint8_t *command_id = &(data[0]);
-	uint8_t *command_data = &(data[1]);
-	switch ( *command_id )
-	{
-		case id_get_protocol_version:
-		{
-			command_data[0] = PROTOCOL_VERSION >> 8;
-			command_data[1] = PROTOCOL_VERSION & 0xFF;
-			break;
-		}
-		case id_get_keyboard_value:
-		{
+  uint8_t *command_id = &(data[0]);
+  uint8_t *command_data = &(data[1]);
+  switch ( *command_id )
+  {
+    case id_get_keyboard_value:
+    {
             switch( command_data[0])
             {
-                case id_uptime:
-                {
-                uint32_t value = timer_read32();
-                command_data[1] = (value >> 24 ) & 0xFF;
-                command_data[2] = (value >> 16 ) & 0xFF;
-                command_data[3] = (value >> 8 ) & 0xFF;
-                command_data[4] = value & 0xFF;
-                break;
-                }
                 case id_oled_default_mode:
                 {
-                    uint8_t default_oled = eeprom_read_byte((uint8_t*)DYNAMIC_KEYMAP_DEFAULT_OLED);
+                    uint8_t default_oled = eeprom_read_byte((uint8_t*)EEPROM_DEFAULT_OLED);
                     command_data[1] = default_oled;
                     break;
                 }
@@ -141,15 +101,14 @@ void raw_hid_receive( uint8_t *data, uint8_t length )
                     break;
                 }
             }
-			break;
+      break;
     }
-#ifdef DYNAMIC_KEYMAP_ENABLE
     case id_set_keyboard_value:
     {
       switch(command_data[0]){
         case id_oled_default_mode:
         {
-          eeprom_update_byte((uint8_t*)DYNAMIC_KEYMAP_DEFAULT_OLED, command_data[1]);
+          eeprom_update_byte((uint8_t*)EEPROM_DEFAULT_OLED, command_data[1]);
           break;
         }
         case id_oled_mode:
@@ -161,7 +120,7 @@ void raw_hid_receive( uint8_t *data, uint8_t length )
         case id_encoder_modes:
         {
           enabled_encoder_modes = command_data[1];
-          eeprom_update_byte((uint8_t*)DYNAMIC_KEYMAP_ENABLED_ENCODER_MODES, enabled_encoder_modes);
+          eeprom_update_byte((uint8_t*)EEPROM_ENABLED_ENCODER_MODES, enabled_encoder_modes);
           break;
         }
         case id_encoder_custom:
@@ -180,95 +139,15 @@ void raw_hid_receive( uint8_t *data, uint8_t length )
       }
       break;
     }
-		case id_dynamic_keymap_get_keycode:
-		{
-			uint16_t keycode = dynamic_keymap_get_keycode( command_data[0], command_data[1], command_data[2] );
-			command_data[3] = keycode >> 8;
-			command_data[4] = keycode & 0xFF;
-			break;
-		}
-		case id_dynamic_keymap_set_keycode:
-		{
-			dynamic_keymap_set_keycode( command_data[0], command_data[1], command_data[2], ( command_data[3] << 8 ) | command_data[4] );
-			break;
-		}
-		case id_dynamic_keymap_reset:
-		{
-			dynamic_keymap_reset();
-			break;
-		}
-		case id_dynamic_keymap_macro_get_count:
-		{
-			command_data[0] = dynamic_keymap_macro_get_count();
-			break;
-		}
-		case id_dynamic_keymap_macro_get_buffer_size:
-		{
-			uint16_t size = dynamic_keymap_macro_get_buffer_size();
-			command_data[0] = size >> 8;
-			command_data[1] = size & 0xFF;
-			break;
-		}
-		case id_dynamic_keymap_macro_get_buffer:
-		{
-			uint16_t offset = ( command_data[0] << 8 ) | command_data[1];
-			uint16_t size = command_data[2]; // size <= 28
-			dynamic_keymap_macro_set_buffer( offset, size, &command_data[3] );
-			break;
-		}
-		case id_dynamic_keymap_macro_reset:
-		{
-			dynamic_keymap_macro_reset();
-			break;
-		}
-		case id_dynamic_keymap_get_layer_count:
-		{
-			command_data[0] = dynamic_keymap_get_layer_count();
-			break;
-		}
-		case id_dynamic_keymap_get_buffer:
-		{
-			uint16_t offset = ( command_data[0] << 8 ) | command_data[1];
-			uint16_t size = command_data[2]; // size <= 28
-			dynamic_keymap_get_buffer( offset, size, &command_data[3] );
-			break;
-		}
-		case id_dynamic_keymap_set_buffer:
-		{
-			uint16_t offset = ( command_data[0] << 8 ) | command_data[1];
-			uint16_t size = command_data[2]; // size <= 28
-			dynamic_keymap_set_buffer( offset, size, &command_data[3] );
-			break;
-		}
-#endif // DYNAMIC_KEYMAP_ENABLE
-		case id_eeprom_reset:
-		{
-			eeprom_reset();
-			break;
-		}
-		case id_bootloader_jump:
-		{
-			// Need to send data back before the jump
-			// Informs host that the command is handled
-			raw_hid_send( data, length );
-			// Give host time to read it
-			wait_ms(100);
-			bootloader_jump();
-			break;
-		}
-		default:
-		{
-			// Unhandled message.
-			*command_id = id_unhandled;
-			break;
-		}
-	}
-
-	// Return same buffer with values changed
-	raw_hid_send( data, length );
-
+    default:
+    {
+      // Unhandled message.
+      *command_id = id_unhandled;
+      break;
+    }
+  }
+  // DO NOT call raw_hid_send(data,length) here, let caller do this
 }
-
 #endif
 
 
@@ -349,18 +228,6 @@ bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
       break;
   }
 
-#ifdef DYNAMIC_KEYMAP_ENABLE
-	// Handle macros
-	if (record->event.pressed) {
-		if ( keycode >= MACRO00 && keycode <= MACRO15 )
-		{
-			uint8_t id = keycode - MACRO00;
-			dynamic_keymap_macro_send(id);
-			return false;
-		}
-	}
-#endif //DYNAMIC_KEYMAP_ENABLE
-
   return process_record_user(keycode, record);
 }
 
@@ -392,59 +259,56 @@ void encoder_update_kb(uint8_t index, bool clockwise) {
   }
 }
 
-void dynamic_keymap_custom_reset(void){
-  void *p = (void*)(DYNAMIC_KEYMAP_CUSTOM_BACKLIGHT);
-	void *end = (void*)(DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR);
-	while ( p != end ) {
-		eeprom_update_byte(p, 0);
-		++p;
-	}
-  eeprom_update_byte((uint8_t*)DYNAMIC_KEYMAP_ENABLED_ENCODER_MODES, 0x1F);
+void custom_config_reset(void){
+  void *p = (void*)(VIA_EEPROM_CUSTOM_CONFIG_ADDR);
+  void *end = (void*)(VIA_EEPROM_CUSTOM_CONFIG_ADDR+VIA_EEPROM_CUSTOM_CONFIG_SIZE);
+  while ( p != end ) {
+    eeprom_update_byte(p, 0);
+    ++p;
+  }
+  eeprom_update_byte((uint8_t*)EEPROM_ENABLED_ENCODER_MODES, 0x1F);
 }
 
-void save_backlight_config_to_eeprom(){
-  eeprom_update_byte((uint8_t*)DYNAMIC_KEYMAP_CUSTOM_BACKLIGHT, kb_backlight_config.raw);
+void backlight_config_save(){
+  eeprom_update_byte((uint8_t*)EEPROM_CUSTOM_BACKLIGHT, kb_backlight_config.raw);
 }
 
-void load_custom_config(){
-  kb_backlight_config.raw = eeprom_read_byte((uint8_t*)DYNAMIC_KEYMAP_CUSTOM_BACKLIGHT);
+void custom_config_load(){
+  kb_backlight_config.raw = eeprom_read_byte((uint8_t*)EEPROM_CUSTOM_BACKLIGHT);
 #ifdef DYNAMIC_KEYMAP_ENABLE
-  oled_mode = eeprom_read_byte((uint8_t*)DYNAMIC_KEYMAP_DEFAULT_OLED);
-  enabled_encoder_modes = eeprom_read_byte((uint8_t*)DYNAMIC_KEYMAP_ENABLED_ENCODER_MODES);
+  oled_mode = eeprom_read_byte((uint8_t*)EEPROM_DEFAULT_OLED);
+  enabled_encoder_modes = eeprom_read_byte((uint8_t*)EEPROM_ENABLED_ENCODER_MODES);
 #endif
 }
 
-void eeprom_init_kb(void)
+// Called from via_init() if VIA_ENABLE
+// Called from matrix_init_kb() if not VIA_ENABLE
+void via_init_kb(void)
 {
-	// If the EEPROM has the magic, the data is good.
-	// OK to load from EEPROM.
-	if (eeprom_is_valid()) {
-		load_custom_config();
-	} else	{
-		// If the EEPROM has not been saved before, or is out of date,
-		// save the default values to the EEPROM. Default values
-		// come from construction of the zeal_backlight_config instance.
-		//backlight_config_save();
+  // If the EEPROM has the magic, the data is good.
+  // OK to load from EEPROM.
+  if (via_eeprom_is_valid()) {
+    custom_config_load();
+  } else	{
 #ifdef DYNAMIC_KEYMAP_ENABLE
-		// This resets the keymaps in EEPROM to what is in flash.
-		dynamic_keymap_reset();
-		// This resets the macros in EEPROM to nothing.
-		dynamic_keymap_macro_reset();
     // Reset the custom stuff
-    dynamic_keymap_custom_reset();
+    custom_config_reset();
 #endif
-		// Save the magic number last, in case saving was interrupted
-		eeprom_set_valid(true);
-	}
+    // DO NOT set EEPROM valid here, let caller do this
+  }
 }
 
 void matrix_init_kb(void)
 {
-	eeprom_init_kb();
+#ifndef VIA_ENABLE
+  via_init_kb();
+  via_eeprom_set_valid(true);
+#endif // VIA_ENABLE
+
   rtcGetTime(&RTCD1, &last_timespec);
   queue_for_send = true;
   backlight_init_ports();
-	matrix_init_user();
+  matrix_init_user();
 }
 
 
@@ -472,3 +336,51 @@ void matrix_scan_kb(void) {
 #endif
 }
 
+//
+// In the case of VIA being disabled, we still need to check if
+// keyboard level EEPROM memory is valid before loading.
+// Thus these are copies of the same functions in VIA, since
+// the backlight settings reuse VIA's EEPROM magic/version,
+// and the ones in via.c won't be compiled in.
+//
+// Yes, this is sub-optimal, and is only here for completeness
+// (i.e. catering to the 1% of people that want wilba.tech LED bling
+// AND want persistent settings BUT DON'T want to use dynamic keymaps/VIA).
+//
+#ifndef VIA_ENABLE
+
+bool via_eeprom_is_valid(void)
+{
+    char *p = QMK_BUILDDATE; // e.g. "2019-11-05-11:29:54"
+    uint8_t magic0 = ( ( p[2] & 0x0F ) << 4 ) | ( p[3]  & 0x0F );
+    uint8_t magic1 = ( ( p[5] & 0x0F ) << 4 ) | ( p[6]  & 0x0F );
+    uint8_t magic2 = ( ( p[8] & 0x0F ) << 4 ) | ( p[9]  & 0x0F );
+
+    return (eeprom_read_byte( (void*)VIA_EEPROM_MAGIC_ADDR+0 ) == magic0 &&
+            eeprom_read_byte( (void*)VIA_EEPROM_MAGIC_ADDR+1 ) == magic1 &&
+            eeprom_read_byte( (void*)VIA_EEPROM_MAGIC_ADDR+2 ) == magic2 );
+}
+
+// Sets VIA/keyboard level usage of EEPROM to valid/invalid
+// Keyboard level code (eg. via_init_kb()) should not call this
+void via_eeprom_set_valid(bool valid)
+{
+    char *p = QMK_BUILDDATE; // e.g. "2019-11-05-11:29:54"
+    uint8_t magic0 = ( ( p[2] & 0x0F ) << 4 ) | ( p[3]  & 0x0F );
+    uint8_t magic1 = ( ( p[5] & 0x0F ) << 4 ) | ( p[6]  & 0x0F );
+    uint8_t magic2 = ( ( p[8] & 0x0F ) << 4 ) | ( p[9]  & 0x0F );
+
+    eeprom_update_byte( (void*)VIA_EEPROM_MAGIC_ADDR+0, valid ? magic0 : 0xFF);
+    eeprom_update_byte( (void*)VIA_EEPROM_MAGIC_ADDR+1, valid ? magic1 : 0xFF);
+    eeprom_update_byte( (void*)VIA_EEPROM_MAGIC_ADDR+2, valid ? magic2 : 0xFF);
+}
+
+void via_eeprom_reset(void)
+{
+    // Set the VIA specific EEPROM state as invalid.
+    via_eeprom_set_valid(false);
+    // Set the TMK/QMK EEPROM state as invalid.
+    eeconfig_disable();
+}
+
+#endif // VIA_ENABLE
\ No newline at end of file
diff --git a/keyboards/cannonkeys/satisfaction75/satisfaction75.h b/keyboards/cannonkeys/satisfaction75/satisfaction75.h
index 188a1d4970..13aaf68882 100644
--- a/keyboards/cannonkeys/satisfaction75/satisfaction75.h
+++ b/keyboards/cannonkeys/satisfaction75/satisfaction75.h
@@ -8,6 +8,12 @@
     #include "rev1.h"
 #endif
 
+#include "via.h" // only for EEPROM address
+#define EEPROM_ENABLED_ENCODER_MODES (VIA_EEPROM_CUSTOM_CONFIG_ADDR)
+#define EEPROM_CUSTOM_BACKLIGHT (VIA_EEPROM_CUSTOM_CONFIG_ADDR+1)
+#define EEPROM_DEFAULT_OLED (VIA_EEPROM_CUSTOM_CONFIG_ADDR+2)
+#define EEPROM_CUSTOM_ENCODER (VIA_EEPROM_CUSTOM_CONFIG_ADDR+3)
+
 /* screen off after this many milliseconds */
 #define ScreenOffInterval 60000 /* milliseconds */
 
@@ -117,5 +123,5 @@ void backlight_set(uint8_t level);
 bool is_breathing(void);
 void breathing_enable(void);
 void breathing_disable(void);
-void load_custom_config(void);
-void save_backlight_config_to_eeprom(void);
+void custom_config_load(void);
+void backlight_config_save(void);
diff --git a/keyboards/cannonkeys/satisfaction75/satisfaction_encoder.c b/keyboards/cannonkeys/satisfaction75/satisfaction_encoder.c
index e866d897c7..8fcd720e2f 100644
--- a/keyboards/cannonkeys/satisfaction75/satisfaction_encoder.c
+++ b/keyboards/cannonkeys/satisfaction75/satisfaction_encoder.c
@@ -12,7 +12,7 @@ void pre_encoder_mode_change(){
     timespec.millisecond = (hour_config * 60 + minute_config) * 60 * 1000;
     rtcSetTime(&RTCD1, &timespec);
   } else if (encoder_mode == ENC_MODE_BACKLIGHT){
-    save_backlight_config_to_eeprom();
+    backlight_config_save();
   }
 }
 
@@ -221,7 +221,7 @@ uint16_t handle_encoder_press(){
 
 uint16_t retrieve_custom_encoder_config(uint8_t encoder_idx, uint8_t behavior){
 #ifdef DYNAMIC_KEYMAP_ENABLE
-    void* addr = (void*)(DYNAMIC_KEYMAP_CUSTOM_ENCODER + (encoder_idx * 6) + (behavior * 2));
+    void* addr = (void*)(EEPROM_CUSTOM_ENCODER + (encoder_idx * 6) + (behavior * 2));
     //big endian
     uint16_t keycode = eeprom_read_byte(addr) << 8;
     keycode |= eeprom_read_byte(addr + 1);
@@ -233,7 +233,7 @@ uint16_t retrieve_custom_encoder_config(uint8_t encoder_idx, uint8_t behavior){
 
 void set_custom_encoder_config(uint8_t encoder_idx, uint8_t behavior, uint16_t new_code){
 #ifdef DYNAMIC_KEYMAP_ENABLE
-    void* addr = (void*)(DYNAMIC_KEYMAP_CUSTOM_ENCODER + (encoder_idx * 6) + (behavior * 2));
+    void* addr = (void*)(EEPROM_CUSTOM_ENCODER + (encoder_idx * 6) + (behavior * 2));
     eeprom_update_byte(addr, (uint8_t)(new_code >> 8));
     eeprom_update_byte(addr + 1, (uint8_t)(new_code & 0xFF));
 #endif
diff --git a/keyboards/cannonkeys/savage65/config.h b/keyboards/cannonkeys/savage65/config.h
index 996b939515..b69aba39eb 100644
--- a/keyboards/cannonkeys/savage65/config.h
+++ b/keyboards/cannonkeys/savage65/config.h
@@ -58,25 +58,9 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #define PIN_WS2812      15
 #define WS2812_SPI SPID2
 
-// EEPROM usage
-// TODO: refactor with new user EEPROM code (coming soon)
-#define EEPROM_MAGIC 0x451F
-#define EEPROM_MAGIC_ADDR 40
-// Bump this every time we change what we store
-// This will automatically reset the EEPROM with defaults
-// and avoid loading invalid data from the EEPROM
-#define EEPROM_VERSION 0x02
-#define EEPROM_VERSION_ADDR 42
-
-
-#define DYNAMIC_KEYMAP_LAYER_COUNT 4
-// Dynamic macro starts after dynamic keymaps (35+(4*5*15*2)) = (35+600) = 635
-// start + layer * rows * col * 2
-#define DYNAMIC_KEYMAP_EEPROM_ADDR 43
-#define EEPROM_CUSTOM_BACKLIGHT 684
-#define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR 685
-#define DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE 192
-#define DYNAMIC_KEYMAP_MACRO_COUNT 16
+// Backlight config starts after VIA's EEPROM usage,
+// dynamic keymaps start after this.
+#define VIA_EEPROM_CUSTOM_CONFIG_SIZE 1
 
 /*
  * Feature disable options
diff --git a/keyboards/cannonkeys/stm32f072/keyboard.c b/keyboards/cannonkeys/stm32f072/keyboard.c
index 5a9ccafff7..32e30f3348 100644
--- a/keyboards/cannonkeys/stm32f072/keyboard.c
+++ b/keyboards/cannonkeys/stm32f072/keyboard.c
@@ -10,11 +10,10 @@
 #include "raw_hid.h"
 #include "dynamic_keymap.h"
 #include "tmk_core/common/eeprom.h"
+#include "version.h" // for QMK_BUILDDATE used in EEPROM magic
 
-// HACK
-#include "keyboards/wilba_tech/via_api.h" // Temporary hack
-#include "keyboards/wilba_tech/via_keycodes.h" // Temporary hack
-
+#include "via.h"
+#define EEPROM_CUSTOM_BACKLIGHT (VIA_EEPROM_CUSTOM_CONFIG_ADDR)
 
 backlight_config_t kb_backlight_config = {
   .enable = true,
@@ -22,61 +21,29 @@ backlight_config_t kb_backlight_config = {
   .level = BACKLIGHT_LEVELS
 };
 
-bool eeprom_is_valid(void)
-{
-	return (eeprom_read_word(((void*)EEPROM_MAGIC_ADDR)) == EEPROM_MAGIC &&
-			eeprom_read_byte(((void*)EEPROM_VERSION_ADDR)) == EEPROM_VERSION);
-}
-
-void eeprom_set_valid(bool valid)
-{
-	eeprom_update_word(((void*)EEPROM_MAGIC_ADDR), valid ? EEPROM_MAGIC : 0xFFFF);
-	eeprom_update_byte(((void*)EEPROM_VERSION_ADDR), valid ? EEPROM_VERSION : 0xFF);
-}
-
-void eeprom_reset(void)
-{
-	eeprom_set_valid(false);
-	eeconfig_disable();
-}
-
-void save_backlight_config_to_eeprom(){
+void backlight_config_save(){
   eeprom_update_byte((uint8_t*)EEPROM_CUSTOM_BACKLIGHT, kb_backlight_config.raw);
 }
 
-void load_custom_config(){
+void backlight_config_load(){
   kb_backlight_config.raw = eeprom_read_byte((uint8_t*)EEPROM_CUSTOM_BACKLIGHT);
 }
 
-#ifdef DYNAMIC_KEYMAP_ENABLE
-void dynamic_keymap_custom_reset(void){
-    void *p = (void*)(EEPROM_CUSTOM_BACKLIGHT);
-	void *end = (void*)(DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR);
-	while ( p != end ) {
-		eeprom_update_byte(p, 0);
-		++p;
-	}
-}
-#endif
-
-void eeprom_init_kb(void)
+// Called from via_init() if VIA_ENABLE
+// Called from matrix_init_kb() if not VIA_ENABLE
+void via_init_kb(void)
 {
 	// If the EEPROM has the magic, the data is good.
 	// OK to load from EEPROM.
-	if (eeprom_is_valid()) {
-		load_custom_config();
+	if (via_eeprom_is_valid()) {
+		backlight_config_load();
 	} else	{
-#ifdef DYNAMIC_KEYMAP_ENABLE
-		// This resets the keymaps in EEPROM to what is in flash.
-		dynamic_keymap_reset();
-		// This resets the macros in EEPROM to nothing.
-		dynamic_keymap_macro_reset();
-        // Reset the custom stuff
-        dynamic_keymap_custom_reset();
-#endif
-		// Save the magic number last, in case saving was interrupted
-        save_backlight_config_to_eeprom();
-		eeprom_set_valid(true);
+		// If the EEPROM has not been saved before, or is out of date,
+		// save the default values to the EEPROM. Default values
+		// come from construction of the backlight_config instance.
+		backlight_config_save();
+
+		// DO NOT set EEPROM valid here, let caller do this
 	}
 }
 
@@ -84,7 +51,13 @@ __attribute__ ((weak))
 void matrix_init_board(void);
 
 void matrix_init_kb(void){
-  	eeprom_init_kb();
+	// If VIA is disabled, we still need to load backlight settings.
+	// Call via_init_kb() the same way as via_init(), with setting
+	// EEPROM valid afterwards.
+#ifndef VIA_ENABLE
+	via_init_kb();
+	via_eeprom_set_valid(true);
+#endif // VIA_ENABLE
       /* MOSI pin*/
 #ifdef RGBLIGHT_ENABLE
     palSetPadMode(PORT_WS2812, PIN_WS2812, PAL_MODE_ALTERNATE(0));
@@ -112,7 +85,7 @@ bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
           kb_backlight_config.level = BACKLIGHT_LEVELS;
         }
         backlight_set(kb_backlight_config.level);
-        save_backlight_config_to_eeprom();
+        backlight_config_save();
       }
       return false;
     case BL_TOGG:
@@ -123,7 +96,7 @@ bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
         } else {
           backlight_set(0);
         }
-        save_backlight_config_to_eeprom();
+        backlight_config_save();
       }
       return false;
 
@@ -135,168 +108,71 @@ bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
           kb_backlight_config.level = kb_backlight_config.level - 1;
         }
         backlight_set(kb_backlight_config.level);
-        save_backlight_config_to_eeprom();
+        backlight_config_save();
       }
       return false;
     case BL_BRTG:
       if (record->event.pressed) {
         kb_backlight_config.breathing = !kb_backlight_config.breathing;
         breathing_toggle();
-        save_backlight_config_to_eeprom();
+        backlight_config_save();
       }
       return false;
     default:
         break;
   }
 
-  #ifdef DYNAMIC_KEYMAP_ENABLE
-	// Handle macros
-	if (record->event.pressed) {
-		if ( keycode >= MACRO00 && keycode <= MACRO15 )
-		{
-			uint8_t id = keycode - MACRO00;
-			dynamic_keymap_macro_send(id);
-			return false;
-		}
-	}
-    #endif //DYNAMIC_KEYMAP_ENABLE
-
   return process_record_user(keycode, record);;
 }
 
 
-// Start Dynamic Keymap code
-#ifdef RAW_ENABLE
 
-void raw_hid_receive( uint8_t *data, uint8_t length )
+
+//
+// In the case of VIA being disabled, we still need to check if
+// keyboard level EEPROM memory is valid before loading.
+// Thus these are copies of the same functions in VIA, since
+// the backlight settings reuse VIA's EEPROM magic/version,
+// and the ones in via.c won't be compiled in.
+//
+// Yes, this is sub-optimal, and is only here for completeness
+// (i.e. catering to the 1% of people that want wilba.tech LED bling
+// AND want persistent settings BUT DON'T want to use dynamic keymaps/VIA).
+//
+#ifndef VIA_ENABLE
+
+bool via_eeprom_is_valid(void)
 {
-	uint8_t *command_id = &(data[0]);
-	uint8_t *command_data = &(data[1]);
-	switch ( *command_id )
-	{
-		case id_get_protocol_version:
-		{
-			command_data[0] = PROTOCOL_VERSION >> 8;
-			command_data[1] = PROTOCOL_VERSION & 0xFF;
-			break;
-		}
-		case id_get_keyboard_value:
-		{
-            switch( command_data[0])
-            {
-                case id_uptime:
-                {
-                uint32_t value = timer_read32();
-                command_data[1] = (value >> 24 ) & 0xFF;
-                command_data[2] = (value >> 16 ) & 0xFF;
-                command_data[3] = (value >> 8 ) & 0xFF;
-                command_data[4] = value & 0xFF;
-                break;
-                }
-                default:
-                {
-                *command_id = id_unhandled;
-                break;
-                }
-            }
-            break;
-        }
-#ifdef DYNAMIC_KEYMAP_ENABLE
-
-		case id_dynamic_keymap_get_keycode:
-		{
-			uint16_t keycode = dynamic_keymap_get_keycode( command_data[0], command_data[1], command_data[2] );
-			command_data[3] = keycode >> 8;
-			command_data[4] = keycode & 0xFF;
-			break;
-		}
-		case id_dynamic_keymap_set_keycode:
-		{
-			dynamic_keymap_set_keycode( command_data[0], command_data[1], command_data[2], ( command_data[3] << 8 ) | command_data[4] );
-			break;
-		}
-		case id_dynamic_keymap_reset:
-		{
-			dynamic_keymap_reset();
-			break;
-		}
-		case id_dynamic_keymap_macro_get_count:
-		{
-			command_data[0] = dynamic_keymap_macro_get_count();
-			break;
-		}
-		case id_dynamic_keymap_macro_get_buffer_size:
-		{
-			uint16_t size = dynamic_keymap_macro_get_buffer_size();
-			command_data[0] = size >> 8;
-			command_data[1] = size & 0xFF;
-			break;
-		}
-		case id_dynamic_keymap_macro_get_buffer:
-		{
-			uint16_t offset = ( command_data[0] << 8 ) | command_data[1];
-			uint16_t size = command_data[2]; // size <= 28
-			dynamic_keymap_macro_get_buffer( offset, size, &command_data[3] );
-			break;
-		}
-		case id_dynamic_keymap_macro_set_buffer:
-		{
-			uint16_t offset = ( command_data[0] << 8 ) | command_data[1];
-			uint16_t size = command_data[2]; // size <= 28
-			dynamic_keymap_macro_set_buffer( offset, size, &command_data[3] );
-			break;
-		}
-		case id_dynamic_keymap_macro_reset:
-		{
-			dynamic_keymap_macro_reset();
-			break;
-		}
-		case id_dynamic_keymap_get_layer_count:
-		{
-			command_data[0] = dynamic_keymap_get_layer_count();
-			break;
-		}
-		case id_dynamic_keymap_get_buffer:
-		{
-			uint16_t offset = ( command_data[0] << 8 ) | command_data[1];
-			uint16_t size = command_data[2]; // size <= 28
-			dynamic_keymap_get_buffer( offset, size, &command_data[3] );
-			break;
-		}
-		case id_dynamic_keymap_set_buffer:
-		{
-			uint16_t offset = ( command_data[0] << 8 ) | command_data[1];
-			uint16_t size = command_data[2]; // size <= 28
-			dynamic_keymap_set_buffer( offset, size, &command_data[3] );
-			break;
-		}
-#endif // DYNAMIC_KEYMAP_ENABLE
-		case id_eeprom_reset:
-		{
-			eeprom_reset();
-			break;
-		}
-		case id_bootloader_jump:
-		{
-			// Need to send data back before the jump
-			// Informs host that the command is handled
-			raw_hid_send( data, length );
-			// Give host time to read it
-			wait_ms(100);
-			bootloader_jump();
-			break;
-		}
-		default:
-		{
-			// Unhandled message.
-			*command_id = id_unhandled;
-			break;
-		}
-	}
-
-	// Return same buffer with values changed
-	raw_hid_send( data, length );
+    char *p = QMK_BUILDDATE; // e.g. "2019-11-05-11:29:54"
+    uint8_t magic0 = ( ( p[2] & 0x0F ) << 4 ) | ( p[3]  & 0x0F );
+    uint8_t magic1 = ( ( p[5] & 0x0F ) << 4 ) | ( p[6]  & 0x0F );
+    uint8_t magic2 = ( ( p[8] & 0x0F ) << 4 ) | ( p[9]  & 0x0F );
 
+    return (eeprom_read_byte( (void*)VIA_EEPROM_MAGIC_ADDR+0 ) == magic0 &&
+            eeprom_read_byte( (void*)VIA_EEPROM_MAGIC_ADDR+1 ) == magic1 &&
+            eeprom_read_byte( (void*)VIA_EEPROM_MAGIC_ADDR+2 ) == magic2 );
 }
 
-#endif
+// Sets VIA/keyboard level usage of EEPROM to valid/invalid
+// Keyboard level code (eg. via_init_kb()) should not call this
+void via_eeprom_set_valid(bool valid)
+{
+    char *p = QMK_BUILDDATE; // e.g. "2019-11-05-11:29:54"
+    uint8_t magic0 = ( ( p[2] & 0x0F ) << 4 ) | ( p[3]  & 0x0F );
+    uint8_t magic1 = ( ( p[5] & 0x0F ) << 4 ) | ( p[6]  & 0x0F );
+    uint8_t magic2 = ( ( p[8] & 0x0F ) << 4 ) | ( p[9]  & 0x0F );
+
+    eeprom_update_byte( (void*)VIA_EEPROM_MAGIC_ADDR+0, valid ? magic0 : 0xFF);
+    eeprom_update_byte( (void*)VIA_EEPROM_MAGIC_ADDR+1, valid ? magic1 : 0xFF);
+    eeprom_update_byte( (void*)VIA_EEPROM_MAGIC_ADDR+2, valid ? magic2 : 0xFF);
+}
+
+void via_eeprom_reset(void)
+{
+    // Set the VIA specific EEPROM state as invalid.
+    via_eeprom_set_valid(false);
+    // Set the TMK/QMK EEPROM state as invalid.
+    eeconfig_disable();
+}
+
+#endif // VIA_ENABLE
\ No newline at end of file
diff --git a/keyboards/cannonkeys/stm32f072/keyboard.h b/keyboards/cannonkeys/stm32f072/keyboard.h
index 94c973d615..81dd1b704e 100644
--- a/keyboards/cannonkeys/stm32f072/keyboard.h
+++ b/keyboards/cannonkeys/stm32f072/keyboard.h
@@ -19,5 +19,5 @@ void backlight_set(uint8_t level);
 bool is_breathing(void);
 void breathing_enable(void);
 void breathing_disable(void);
-void load_custom_config(void);
-void save_backlight_config_to_eeprom(void);
+void backlight_config_load(void);
+void backlight_config_save(void);
diff --git a/keyboards/cannonkeys/tmov2/config.h b/keyboards/cannonkeys/tmov2/config.h
index 0c586de9e5..d5f1d07884 100644
--- a/keyboards/cannonkeys/tmov2/config.h
+++ b/keyboards/cannonkeys/tmov2/config.h
@@ -58,25 +58,9 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #define PIN_WS2812      15
 #define WS2812_SPI SPID2
 
-// EEPROM usage
-// TODO: refactor with new user EEPROM code (coming soon)
-#define EEPROM_MAGIC 0x451F
-#define EEPROM_MAGIC_ADDR 40
-// Bump this every time we change what we store
-// This will automatically reset the EEPROM with defaults
-// and avoid loading invalid data from the EEPROM
-#define EEPROM_VERSION 0x02
-#define EEPROM_VERSION_ADDR 42
-
-
-#define DYNAMIC_KEYMAP_LAYER_COUNT 4
-// Dynamic macro starts after dynamic keymaps (43+(4*4*15*2)) = (43+480) = 523
-// start + layer * rows * col * 2c
-#define DYNAMIC_KEYMAP_EEPROM_ADDR 43
-#define EEPROM_CUSTOM_BACKLIGHT 523
-#define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR 524
-#define DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE 200
-#define DYNAMIC_KEYMAP_MACRO_COUNT 16
+// Backlight config starts after VIA's EEPROM usage,
+// dynamic keymaps start after this.
+#define VIA_EEPROM_CUSTOM_CONFIG_SIZE 1
 
 /*
  * Feature disable options
diff --git a/keyboards/dp60/config.h b/keyboards/dp60/config.h
index 87eebbe197..29d5e3c2a4 100644
--- a/keyboards/dp60/config.h
+++ b/keyboards/dp60/config.h
@@ -50,24 +50,6 @@
 #define DRIVER_2_LED_TOTAL 36
 #define DRIVER_LED_TOTAL (DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL)
 
-#if defined(RAW_ENABLE)
-//VIA
-#define DYNAMIC_KEYMAP_LAYER_COUNT 2
-// EEPROM usage
-
-// TODO: refactor with new user EEPROM code (coming soon)
-#define EEPROM_MAGIC 0x451F
-#define EEPROM_MAGIC_ADDR 34
-// Bump this every time we change what we store
-// This will automatically reset the EEPROM with defaults
-// and avoid loading invalid data from the EEPROM
-#define EEPROM_VERSION 0x08
-#define EEPROM_VERSION_ADDR 36
-
-// Dynamic keymap starts after EEPROM version
-#define DYNAMIC_KEYMAP_EEPROM_ADDR 37
-// Dynamic macro starts after dynamic keymaps (35+(4*10*6*2)) = (35+480)
-#define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR 637
-#define DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE 391    // 1024-DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR
-#define DYNAMIC_KEYMAP_MACRO_COUNT 16
+#if defined(VIA_ENABLE)
+#   define DYNAMIC_KEYMAP_LAYER_COUNT 2
 #endif
diff --git a/keyboards/dp60/keymaps/via/rules.mk b/keyboards/dp60/keymaps/via/rules.mk
index 6d2a738643..036bd6d1c3 100644
--- a/keyboards/dp60/keymaps/via/rules.mk
+++ b/keyboards/dp60/keymaps/via/rules.mk
@@ -1,39 +1 @@
-# MCU name
-MCU = atmega32u4
-
-# Bootloader selection
-#   Teensy       halfkay
-#   Pro Micro    caterina
-#   Atmel DFU    atmel-dfu
-#   LUFA DFU     lufa-dfu
-#   QMK DFU      qmk-dfu
-#   ATmega32A    bootloadHID
-#   ATmega328P   USBasp
-BOOTLOADER = atmel-dfu
-
-# Build Options
-#   change yes to no to disable
-#
-BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration
-MOUSEKEY_ENABLE = no        # Mouse keys
-EXTRAKEY_ENABLE = yes # Audio control and System control
-CONSOLE_ENABLE = no         # Console for debug
-COMMAND_ENABLE = no         # Commands for debug and configuration
-# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
-SLEEP_LED_ENABLE = no       # Breathing sleep LED during USB suspend
-# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
-NKRO_ENABLE = no # USB Nkey Rollover
-BACKLIGHT_ENABLE = no       # Enable keyboard backlight functionality on B7 by default
-MIDI_ENABLE = no            # MIDI support
-UNICODE_ENABLE = no         # Unicode
-BLUETOOTH_ENABLE = no       # Enable Bluetooth with the Adafruit EZ-Key HID
-AUDIO_ENABLE = no           # Audio output on port C6
-FAUXCLICKY_ENABLE = no      # Use buzzer to emulate clicky switches
-RGBLIGHT_ENABLE = yes       # Use RGB bottom light
-RGB_MATRIX_ENABLE = yes     # Use RGB matrix
-
-RAW_ENABLE = yes
-DYNAMIC_KEYMAP_ENABLE = yes
-
-CUSTOM_MATRIX = yes
-SRC += matrix.c keyboards/wilba_tech/wt_main.c
+VIA_ENABLE = yes
\ No newline at end of file
diff --git a/keyboards/handwired/prime_exl/config.h b/keyboards/handwired/prime_exl/config.h
index ef6e204ec4..8e5692fa86 100644
--- a/keyboards/handwired/prime_exl/config.h
+++ b/keyboards/handwired/prime_exl/config.h
@@ -49,23 +49,3 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #define LOCKING_SUPPORT_ENABLE
 /* Locking resynchronize hack */
 #define LOCKING_RESYNC_ENABLE
-
-#define DYNAMIC_KEYMAP_LAYER_COUNT 4
-
-// EEPROM usage
-
-// TODO: refactor with new user EEPROM code (coming soon)
-#define EEPROM_MAGIC 0x451F
-#define EEPROM_MAGIC_ADDR 34
-// Bump this every time we change what we store
-// This will automatically reset the EEPROM with defaults
-// and avoid loading invalid data from the EEPROM
-#define EEPROM_VERSION 0x08
-#define EEPROM_VERSION_ADDR 36
-
-// Dynamic keymap starts after EEPROM version
-#define DYNAMIC_KEYMAP_EEPROM_ADDR 37
-// Dynamic macro starts after dynamic keymaps (37+(4*10*9*2)) = (37+720)
-#define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR 757
-#define DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE 267    // 1024-DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR
-#define DYNAMIC_KEYMAP_MACRO_COUNT 16
\ No newline at end of file
diff --git a/keyboards/handwired/prime_exl/keymaps/via/rules.mk b/keyboards/handwired/prime_exl/keymaps/via/rules.mk
index e726a8a0e0..1e5b99807c 100644
--- a/keyboards/handwired/prime_exl/keymaps/via/rules.mk
+++ b/keyboards/handwired/prime_exl/keymaps/via/rules.mk
@@ -1,86 +1 @@
-# MCU name
-MCU = atmega32u4
-
-# Processor frequency.
-#     This will define a symbol, F_CPU, in all source code files equal to the
-#     processor frequency in Hz. You can then use this symbol in your source code to
-#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
-#     automatically to create a 32-bit value in your source code.
-#
-#     This will be an integer division of F_USB below, as it is sourced by
-#     F_USB after it has run through any CPU prescalers. Note that this value
-#     does not *change* the processor frequency - it should merely be updated to
-#     reflect the processor speed set externally so that the code can use accurate
-#     software delays.
-F_CPU = 16000000
-
-
-#
-# LUFA specific
-#
-# Target architecture (see library "Board Types" documentation).
-ARCH = AVR8
-
-# Input clock frequency.
-#     This will define a symbol, F_USB, in all source code files equal to the
-#     input clock frequency (before any prescaling is performed) in Hz. This value may
-#     differ from F_CPU if prescaling is used on the latter, and is required as the
-#     raw input clock is fed directly to the PLL sections of the AVR for high speed
-#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
-#     at the end, this will be done automatically to create a 32-bit value in your
-#     source code.
-#
-#     If no clock division is performed on the input clock inside the AVR (via the
-#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
-F_USB = $(F_CPU)
-
-# Interrupt driven control endpoint task(+60)
-OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
-
-
-# Bootloader selection
-#   Teensy       halfkay
-#   Pro Micro    caterina
-#   Atmel DFU    atmel-dfu
-#   LUFA DFU     lufa-dfu
-#   QMK DFU      qmk-dfu
-#   atmega32a    bootloadHID
-BOOTLOADER = atmel-dfu
-
-
-# If you don't know the bootloader type, then you can specify the
-# Boot Section Size in *bytes* by uncommenting out the OPT_DEFS line
-#   Teensy halfKay      512
-#   Teensy++ halfKay    1024
-#   Atmel DFU loader    4096
-#   LUFA bootloader     4096
-#   USBaspLoader        2048
-# OPT_DEFS += -DBOOTLOADER_SIZE=4096
-
-
-# Build Options
-#   change yes to no to disable
-#
-BOOTMAGIC_ENABLE = no      # Virtual DIP switch configuration(+1000)
-MOUSEKEY_ENABLE = no       # Mouse keys(+4700)
-EXTRAKEY_ENABLE = yes       # Audio control and System control(+450)
-CONSOLE_ENABLE = no        # Console for debug(+400)
-COMMAND_ENABLE = no        # Commands for debug and configuration
-# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
-SLEEP_LED_ENABLE = no       # Breathing sleep LED during USB suspend
-# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
-NKRO_ENABLE = yes            # USB Nkey Rollover
-BACKLIGHT_ENABLE = yes       # Enable keyboard backlight functionality on B7 by default
-RGBLIGHT_ENABLE = no        # Enable keyboard RGB underglow
-MIDI_ENABLE = no            # MIDI support (+2400 to 4200, depending on config)
-UNICODE_ENABLE = no         # Unicode
-BLUETOOTH_ENABLE = no       # Enable Bluetooth with the Adafruit EZ-Key HID
-AUDIO_ENABLE = no           # Audio output on port C6
-FAUXCLICKY_ENABLE = no      # Use buzzer to emulate clicky switches
-HD44780_ENABLE = no 		# Enable support for HD44780 based LCDs (+400)
-
-# This is the VIA magic
-RAW_ENABLE = yes
-DYNAMIC_KEYMAP_ENABLE = yes
-SRC += keyboards/wilba_tech/wt_main.c
-
+VIA_ENABLE = yes
diff --git a/keyboards/hs60/v2/config.h b/keyboards/hs60/v2/config.h
index 02df0074cc..91fdf60809 100644
--- a/keyboards/hs60/v2/config.h
+++ b/keyboards/hs60/v2/config.h
@@ -134,21 +134,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #define RGB_BACKLIGHT_LAYER_2_INDICATOR { .color = { .h = 0, .s = 0 }, .index = 255 }
 #define RGB_BACKLIGHT_LAYER_3_INDICATOR { .color = { .h = 0, .s = 0 }, .index = 255 }
 
-// TODO: refactor with new user EEPROM code (coming soon)
-#define EEPROM_MAGIC 0x451F
-#define EEPROM_MAGIC_ADDR 34
-// Bump this every time we change what we store
-// This will automatically reset the EEPROM with defaults
-// and avoid loading invalid data from the EEPROM
-#define EEPROM_VERSION 0x08
-#define EEPROM_VERSION_ADDR 36
+// Backlight config starts after VIA's EEPROM usage,
+// dynamic keymaps start after this.
+#define VIA_EEPROM_CUSTOM_CONFIG_SIZE 31
 
-// Backlight config starts after EEPROM version
-#define RGB_BACKLIGHT_CONFIG_EEPROM_ADDR 37
-// Dynamic keymap starts after backlight config (37+32)
-#define DYNAMIC_KEYMAP_EEPROM_ADDR 69
-#define DYNAMIC_KEYMAP_LAYER_COUNT 4
-// Dynamic macro starts after dynamic keymaps (69+(4*5*14*2)) = (69+560)
-#define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR 629
-#define DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE 396
-#define DYNAMIC_KEYMAP_MACRO_COUNT 16
diff --git a/keyboards/hs60/v2/keymaps/ansi_via/rules.mk b/keyboards/hs60/v2/keymaps/ansi_via/rules.mk
index b8311f5e7f..1e5b99807c 100644
--- a/keyboards/hs60/v2/keymaps/ansi_via/rules.mk
+++ b/keyboards/hs60/v2/keymaps/ansi_via/rules.mk
@@ -1,67 +1 @@
-# project specific files
-SRC =	keyboards/wilba_tech/wt_main.c \
-		keyboards/wilba_tech/wt_rgb_backlight.c \
-		drivers/issi/is31fl3733.c \
-		quantum/color.c \
-		drivers/arm/i2c_master.c
-
-## chip/board settings
-#   the next two should match the directories in
-#   <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
-MCU_FAMILY = STM32
-MCU_SERIES = STM32F3xx
-
-# Linker script to use
-#   it should exist either in <chibios>/os/common/ports/ARMCMx/compilers/GCC/ld/
-#   or <this_dir>/ld/
-MCU_LDSCRIPT = STM32F303xC
-
-# Startup code to use
-#  - it should exist in <chibios>/os/common/startup/ARMCMx/compilers/GCC/mk/
-MCU_STARTUP = stm32f3xx
-
-# Board: it should exist either in <chibios>/os/hal/boards/
-#  or <this_dir>/boards
-BOARD = GENERIC_STM32_F303XC
-
-# Cortex version
-MCU  = cortex-m4
-
-# ARM version, CORTEX-M0/M1 are 6, CORTEX-M3/M4/M7 are 7
-ARMV = 7
-
-USE_FPU = yes
-
-# Vector table for application
-# 0x00000000-0x00001000 area is occupied by bootlaoder.*/
-# The CORTEX_VTOR... is needed only for MCHCK/Infinity KB
-# OPT_DEFS = -DCORTEX_VTOR_INIT=0x08005000
-OPT_DEFS =
-
-# Do not put the microcontroller into power saving mode
-# when we get USB suspend event. We want it to keep updating
-# backlight effects.
-OPT_DEFS += -DNO_SUSPEND_POWER_DOWN
-
-# Options to pass to dfu-util when flashing
-DFU_ARGS = -d 0483:df11 -a 0 -s 0x08000000:leave
-DFU_SUFFIX_ARGS = -p DF11 -v 0483
-
-# Build Options
-#   comment out to disable the options.
-#
-BACKLIGHT_ENABLE = no              # Enable keyboard backlight functionality
-BOOTMAGIC_ENABLE = no              # Virtual DIP switch configuration
-MOUSEKEY_ENABLE = yes              # Mouse keys
-EXTRAKEY_ENABLE = yes              # Audio control and System control
-CONSOLE_ENABLE = no                # Console for debug
-COMMAND_ENABLE = no                # Commands for debug and configuration
-SLEEP_LED_ENABLE = no              # Breathing sleep LED during USB suspend
-NKRO_ENABLE = yes                  # USB Nkey Rollover
-AUDIO_ENABLE = no                  # Audio output on port C6
-NO_USB_STARTUP_CHECK = no          # Disable initialization only when usb is plugged in
-#SERIAL_LINK_ENABLE = yes
-
-RAW_ENABLE = yes
-DYNAMIC_KEYMAP_ENABLE = yes
-CIE1931_CURVE = yes
+VIA_ENABLE = yes
diff --git a/keyboards/hs60/v2/keymaps/default_via/rules.mk b/keyboards/hs60/v2/keymaps/default_via/rules.mk
index b8311f5e7f..1e5b99807c 100644
--- a/keyboards/hs60/v2/keymaps/default_via/rules.mk
+++ b/keyboards/hs60/v2/keymaps/default_via/rules.mk
@@ -1,67 +1 @@
-# project specific files
-SRC =	keyboards/wilba_tech/wt_main.c \
-		keyboards/wilba_tech/wt_rgb_backlight.c \
-		drivers/issi/is31fl3733.c \
-		quantum/color.c \
-		drivers/arm/i2c_master.c
-
-## chip/board settings
-#   the next two should match the directories in
-#   <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
-MCU_FAMILY = STM32
-MCU_SERIES = STM32F3xx
-
-# Linker script to use
-#   it should exist either in <chibios>/os/common/ports/ARMCMx/compilers/GCC/ld/
-#   or <this_dir>/ld/
-MCU_LDSCRIPT = STM32F303xC
-
-# Startup code to use
-#  - it should exist in <chibios>/os/common/startup/ARMCMx/compilers/GCC/mk/
-MCU_STARTUP = stm32f3xx
-
-# Board: it should exist either in <chibios>/os/hal/boards/
-#  or <this_dir>/boards
-BOARD = GENERIC_STM32_F303XC
-
-# Cortex version
-MCU  = cortex-m4
-
-# ARM version, CORTEX-M0/M1 are 6, CORTEX-M3/M4/M7 are 7
-ARMV = 7
-
-USE_FPU = yes
-
-# Vector table for application
-# 0x00000000-0x00001000 area is occupied by bootlaoder.*/
-# The CORTEX_VTOR... is needed only for MCHCK/Infinity KB
-# OPT_DEFS = -DCORTEX_VTOR_INIT=0x08005000
-OPT_DEFS =
-
-# Do not put the microcontroller into power saving mode
-# when we get USB suspend event. We want it to keep updating
-# backlight effects.
-OPT_DEFS += -DNO_SUSPEND_POWER_DOWN
-
-# Options to pass to dfu-util when flashing
-DFU_ARGS = -d 0483:df11 -a 0 -s 0x08000000:leave
-DFU_SUFFIX_ARGS = -p DF11 -v 0483
-
-# Build Options
-#   comment out to disable the options.
-#
-BACKLIGHT_ENABLE = no              # Enable keyboard backlight functionality
-BOOTMAGIC_ENABLE = no              # Virtual DIP switch configuration
-MOUSEKEY_ENABLE = yes              # Mouse keys
-EXTRAKEY_ENABLE = yes              # Audio control and System control
-CONSOLE_ENABLE = no                # Console for debug
-COMMAND_ENABLE = no                # Commands for debug and configuration
-SLEEP_LED_ENABLE = no              # Breathing sleep LED during USB suspend
-NKRO_ENABLE = yes                  # USB Nkey Rollover
-AUDIO_ENABLE = no                  # Audio output on port C6
-NO_USB_STARTUP_CHECK = no          # Disable initialization only when usb is plugged in
-#SERIAL_LINK_ENABLE = yes
-
-RAW_ENABLE = yes
-DYNAMIC_KEYMAP_ENABLE = yes
-CIE1931_CURVE = yes
+VIA_ENABLE = yes
diff --git a/keyboards/hs60/v2/keymaps/goatmaster/rules.mk b/keyboards/hs60/v2/keymaps/goatmaster/rules.mk
index b8311f5e7f..1e5b99807c 100644
--- a/keyboards/hs60/v2/keymaps/goatmaster/rules.mk
+++ b/keyboards/hs60/v2/keymaps/goatmaster/rules.mk
@@ -1,67 +1 @@
-# project specific files
-SRC =	keyboards/wilba_tech/wt_main.c \
-		keyboards/wilba_tech/wt_rgb_backlight.c \
-		drivers/issi/is31fl3733.c \
-		quantum/color.c \
-		drivers/arm/i2c_master.c
-
-## chip/board settings
-#   the next two should match the directories in
-#   <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
-MCU_FAMILY = STM32
-MCU_SERIES = STM32F3xx
-
-# Linker script to use
-#   it should exist either in <chibios>/os/common/ports/ARMCMx/compilers/GCC/ld/
-#   or <this_dir>/ld/
-MCU_LDSCRIPT = STM32F303xC
-
-# Startup code to use
-#  - it should exist in <chibios>/os/common/startup/ARMCMx/compilers/GCC/mk/
-MCU_STARTUP = stm32f3xx
-
-# Board: it should exist either in <chibios>/os/hal/boards/
-#  or <this_dir>/boards
-BOARD = GENERIC_STM32_F303XC
-
-# Cortex version
-MCU  = cortex-m4
-
-# ARM version, CORTEX-M0/M1 are 6, CORTEX-M3/M4/M7 are 7
-ARMV = 7
-
-USE_FPU = yes
-
-# Vector table for application
-# 0x00000000-0x00001000 area is occupied by bootlaoder.*/
-# The CORTEX_VTOR... is needed only for MCHCK/Infinity KB
-# OPT_DEFS = -DCORTEX_VTOR_INIT=0x08005000
-OPT_DEFS =
-
-# Do not put the microcontroller into power saving mode
-# when we get USB suspend event. We want it to keep updating
-# backlight effects.
-OPT_DEFS += -DNO_SUSPEND_POWER_DOWN
-
-# Options to pass to dfu-util when flashing
-DFU_ARGS = -d 0483:df11 -a 0 -s 0x08000000:leave
-DFU_SUFFIX_ARGS = -p DF11 -v 0483
-
-# Build Options
-#   comment out to disable the options.
-#
-BACKLIGHT_ENABLE = no              # Enable keyboard backlight functionality
-BOOTMAGIC_ENABLE = no              # Virtual DIP switch configuration
-MOUSEKEY_ENABLE = yes              # Mouse keys
-EXTRAKEY_ENABLE = yes              # Audio control and System control
-CONSOLE_ENABLE = no                # Console for debug
-COMMAND_ENABLE = no                # Commands for debug and configuration
-SLEEP_LED_ENABLE = no              # Breathing sleep LED during USB suspend
-NKRO_ENABLE = yes                  # USB Nkey Rollover
-AUDIO_ENABLE = no                  # Audio output on port C6
-NO_USB_STARTUP_CHECK = no          # Disable initialization only when usb is plugged in
-#SERIAL_LINK_ENABLE = yes
-
-RAW_ENABLE = yes
-DYNAMIC_KEYMAP_ENABLE = yes
-CIE1931_CURVE = yes
+VIA_ENABLE = yes
diff --git a/keyboards/hs60/v2/keymaps/hhkb_via/rules.mk b/keyboards/hs60/v2/keymaps/hhkb_via/rules.mk
index b8311f5e7f..1e5b99807c 100644
--- a/keyboards/hs60/v2/keymaps/hhkb_via/rules.mk
+++ b/keyboards/hs60/v2/keymaps/hhkb_via/rules.mk
@@ -1,67 +1 @@
-# project specific files
-SRC =	keyboards/wilba_tech/wt_main.c \
-		keyboards/wilba_tech/wt_rgb_backlight.c \
-		drivers/issi/is31fl3733.c \
-		quantum/color.c \
-		drivers/arm/i2c_master.c
-
-## chip/board settings
-#   the next two should match the directories in
-#   <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
-MCU_FAMILY = STM32
-MCU_SERIES = STM32F3xx
-
-# Linker script to use
-#   it should exist either in <chibios>/os/common/ports/ARMCMx/compilers/GCC/ld/
-#   or <this_dir>/ld/
-MCU_LDSCRIPT = STM32F303xC
-
-# Startup code to use
-#  - it should exist in <chibios>/os/common/startup/ARMCMx/compilers/GCC/mk/
-MCU_STARTUP = stm32f3xx
-
-# Board: it should exist either in <chibios>/os/hal/boards/
-#  or <this_dir>/boards
-BOARD = GENERIC_STM32_F303XC
-
-# Cortex version
-MCU  = cortex-m4
-
-# ARM version, CORTEX-M0/M1 are 6, CORTEX-M3/M4/M7 are 7
-ARMV = 7
-
-USE_FPU = yes
-
-# Vector table for application
-# 0x00000000-0x00001000 area is occupied by bootlaoder.*/
-# The CORTEX_VTOR... is needed only for MCHCK/Infinity KB
-# OPT_DEFS = -DCORTEX_VTOR_INIT=0x08005000
-OPT_DEFS =
-
-# Do not put the microcontroller into power saving mode
-# when we get USB suspend event. We want it to keep updating
-# backlight effects.
-OPT_DEFS += -DNO_SUSPEND_POWER_DOWN
-
-# Options to pass to dfu-util when flashing
-DFU_ARGS = -d 0483:df11 -a 0 -s 0x08000000:leave
-DFU_SUFFIX_ARGS = -p DF11 -v 0483
-
-# Build Options
-#   comment out to disable the options.
-#
-BACKLIGHT_ENABLE = no              # Enable keyboard backlight functionality
-BOOTMAGIC_ENABLE = no              # Virtual DIP switch configuration
-MOUSEKEY_ENABLE = yes              # Mouse keys
-EXTRAKEY_ENABLE = yes              # Audio control and System control
-CONSOLE_ENABLE = no                # Console for debug
-COMMAND_ENABLE = no                # Commands for debug and configuration
-SLEEP_LED_ENABLE = no              # Breathing sleep LED during USB suspend
-NKRO_ENABLE = yes                  # USB Nkey Rollover
-AUDIO_ENABLE = no                  # Audio output on port C6
-NO_USB_STARTUP_CHECK = no          # Disable initialization only when usb is plugged in
-#SERIAL_LINK_ENABLE = yes
-
-RAW_ENABLE = yes
-DYNAMIC_KEYMAP_ENABLE = yes
-CIE1931_CURVE = yes
+VIA_ENABLE = yes
diff --git a/keyboards/hs60/v2/keymaps/iso_andys8/rules.mk b/keyboards/hs60/v2/keymaps/iso_andys8/rules.mk
index b8311f5e7f..1e5b99807c 100644
--- a/keyboards/hs60/v2/keymaps/iso_andys8/rules.mk
+++ b/keyboards/hs60/v2/keymaps/iso_andys8/rules.mk
@@ -1,67 +1 @@
-# project specific files
-SRC =	keyboards/wilba_tech/wt_main.c \
-		keyboards/wilba_tech/wt_rgb_backlight.c \
-		drivers/issi/is31fl3733.c \
-		quantum/color.c \
-		drivers/arm/i2c_master.c
-
-## chip/board settings
-#   the next two should match the directories in
-#   <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
-MCU_FAMILY = STM32
-MCU_SERIES = STM32F3xx
-
-# Linker script to use
-#   it should exist either in <chibios>/os/common/ports/ARMCMx/compilers/GCC/ld/
-#   or <this_dir>/ld/
-MCU_LDSCRIPT = STM32F303xC
-
-# Startup code to use
-#  - it should exist in <chibios>/os/common/startup/ARMCMx/compilers/GCC/mk/
-MCU_STARTUP = stm32f3xx
-
-# Board: it should exist either in <chibios>/os/hal/boards/
-#  or <this_dir>/boards
-BOARD = GENERIC_STM32_F303XC
-
-# Cortex version
-MCU  = cortex-m4
-
-# ARM version, CORTEX-M0/M1 are 6, CORTEX-M3/M4/M7 are 7
-ARMV = 7
-
-USE_FPU = yes
-
-# Vector table for application
-# 0x00000000-0x00001000 area is occupied by bootlaoder.*/
-# The CORTEX_VTOR... is needed only for MCHCK/Infinity KB
-# OPT_DEFS = -DCORTEX_VTOR_INIT=0x08005000
-OPT_DEFS =
-
-# Do not put the microcontroller into power saving mode
-# when we get USB suspend event. We want it to keep updating
-# backlight effects.
-OPT_DEFS += -DNO_SUSPEND_POWER_DOWN
-
-# Options to pass to dfu-util when flashing
-DFU_ARGS = -d 0483:df11 -a 0 -s 0x08000000:leave
-DFU_SUFFIX_ARGS = -p DF11 -v 0483
-
-# Build Options
-#   comment out to disable the options.
-#
-BACKLIGHT_ENABLE = no              # Enable keyboard backlight functionality
-BOOTMAGIC_ENABLE = no              # Virtual DIP switch configuration
-MOUSEKEY_ENABLE = yes              # Mouse keys
-EXTRAKEY_ENABLE = yes              # Audio control and System control
-CONSOLE_ENABLE = no                # Console for debug
-COMMAND_ENABLE = no                # Commands for debug and configuration
-SLEEP_LED_ENABLE = no              # Breathing sleep LED during USB suspend
-NKRO_ENABLE = yes                  # USB Nkey Rollover
-AUDIO_ENABLE = no                  # Audio output on port C6
-NO_USB_STARTUP_CHECK = no          # Disable initialization only when usb is plugged in
-#SERIAL_LINK_ENABLE = yes
-
-RAW_ENABLE = yes
-DYNAMIC_KEYMAP_ENABLE = yes
-CIE1931_CURVE = yes
+VIA_ENABLE = yes
diff --git a/keyboards/hs60/v2/keymaps/stanrc85/rules.mk b/keyboards/hs60/v2/keymaps/stanrc85/rules.mk
index 69592d06c7..1e5b99807c 100644
--- a/keyboards/hs60/v2/keymaps/stanrc85/rules.mk
+++ b/keyboards/hs60/v2/keymaps/stanrc85/rules.mk
@@ -1,67 +1 @@
-# project specific files
-SRC =	keyboards/wilba_tech/wt_main.c \
-        keyboards/wilba_tech/wt_rgb_backlight.c \
-	    drivers/issi/is31fl3733.c \
-	    quantum/color.c \
-	    drivers/arm/i2c_master.c
-
-## chip/board settings
-#   the next two should match the directories in
-#   <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
-MCU_FAMILY = STM32
-MCU_SERIES = STM32F3xx
-
-# Linker script to use
-#   it should exist either in <chibios>/os/common/ports/ARMCMx/compilers/GCC/ld/
-#   or <this_dir>/ld/
-MCU_LDSCRIPT = STM32F303xC
-
-# Startup code to use
-#  - it should exist in <chibios>/os/common/startup/ARMCMx/compilers/GCC/mk/
-MCU_STARTUP = stm32f3xx
-
-# Board: it should exist either in <chibios>/os/hal/boards/
-#  or <this_dir>/boards
-BOARD = GENERIC_STM32_F303XC
-
-# Cortex version
-MCU  = cortex-m4
-
-# ARM version, CORTEX-M0/M1 are 6, CORTEX-M3/M4/M7 are 7
-ARMV = 7
-
-USE_FPU = yes
-
-# Vector table for application
-# 0x00000000-0x00001000 area is occupied by bootlaoder.*/
-# The CORTEX_VTOR... is needed only for MCHCK/Infinity KB
-# OPT_DEFS = -DCORTEX_VTOR_INIT=0x08005000
-OPT_DEFS =
-
-# Do not put the microcontroller into power saving mode
-# when we get USB suspend event. We want it to keep updating
-# backlight effects.
-OPT_DEFS += -DNO_SUSPEND_POWER_DOWN
-
-# Options to pass to dfu-util when flashing
-DFU_ARGS = -d 0483:df11 -a 0 -s 0x08000000:leave
-DFU_SUFFIX_ARGS = -p DF11 -v 0483
-
-# Build Options
-#   comment out to disable the options.
-#
-BACKLIGHT_ENABLE = no              # Enable keyboard backlight functionality
-BOOTMAGIC_ENABLE = no              # Virtual DIP switch configuration
-MOUSEKEY_ENABLE = yes              # Mouse keys
-EXTRAKEY_ENABLE = yes              # Audio control and System control
-CONSOLE_ENABLE = no                # Console for debug
-COMMAND_ENABLE = no                # Commands for debug and configuration
-SLEEP_LED_ENABLE = no              # Breathing sleep LED during USB suspend
-NKRO_ENABLE = yes                  # USB Nkey Rollover
-AUDIO_ENABLE = no                  # Audio output on port C6
-NO_USB_STARTUP_CHECK = no          # Disable initialization only when usb is plugged in
-#SERIAL_LINK_ENABLE = yes
-
-RAW_ENABLE = yes
-DYNAMIC_KEYMAP_ENABLE = yes
-CIE1931_CURVE = yes
+VIA_ENABLE = yes
diff --git a/keyboards/hs60/v2/keymaps/win_osx_dual/rules.mk b/keyboards/hs60/v2/keymaps/win_osx_dual/rules.mk
index 1dc96d04be..1e5b99807c 100644
--- a/keyboards/hs60/v2/keymaps/win_osx_dual/rules.mk
+++ b/keyboards/hs60/v2/keymaps/win_osx_dual/rules.mk
@@ -1,67 +1 @@
-# project specific files
-SRC =	keyboards/wilba_tech/wt_main.c \
-		keyboards/wilba_tech/wt_rgb_backlight.c \
-		drivers/issi/is31fl3733.c \
-		quantum/color.c \
-		drivers/arm/i2c_master.c
-
-## chip/board settings
-#   the next two should match the directories in
-#   <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
-MCU_FAMILY = STM32
-MCU_SERIES = STM32F3xx
-
-# Linker script to use
-#   it should exist either in <chibios>/os/common/ports/ARMCMx/compilers/GCC/ld/
-#   or <this_dir>/ld/
-MCU_LDSCRIPT = STM32F303xC
-
-# Startup code to use
-#  - it should exist in <chibios>/os/common/startup/ARMCMx/compilers/GCC/mk/
-MCU_STARTUP = stm32f3xx
-
-# Board: it should exist either in <chibios>/os/hal/boards/
-#  or <this_dir>/boards
-BOARD = GENERIC_STM32_F303XC
-
-# Cortex version
-MCU  = cortex-m4
-
-# ARM version, CORTEX-M0/M1 are 6, CORTEX-M3/M4/M7 are 7
-ARMV = 7
-
-USE_FPU = yes
-
-# Vector table for application
-# 0x00000000-0x00001000 area is occupied by bootlaoder.*/
-# The CORTEX_VTOR... is needed only for MCHCK/Infinity KB
-# OPT_DEFS = -DCORTEX_VTOR_INIT=0x08005000
-OPT_DEFS =
-
-# Do not put the microcontroller into power saving mode
-# when we get USB suspend event. We want it to keep updating
-# backlight effects.
-OPT_DEFS += -DNO_SUSPEND_POWER_DOWN
-
-# Options to pass to dfu-util when flashing
-DFU_ARGS = -d 0483:df11 -a 0 -s 0x08000000:leave
-DFU_SUFFIX_ARGS = -p DF11 -v 0483
-
-# Build Options
-#   comment out to disable the options.
-#
-BACKLIGHT_ENABLE = no              # Enable keyboard backlight functionality
-BOOTMAGIC_ENABLE = yes             # Virtual DIP switch configuration
-MOUSEKEY_ENABLE = yes              # Mouse keys
-EXTRAKEY_ENABLE = yes              # Audio control and System control
-CONSOLE_ENABLE = no                # Console for debug
-COMMAND_ENABLE = no                # Commands for debug and configuration
-SLEEP_LED_ENABLE = no              # Breathing sleep LED during USB suspend
-NKRO_ENABLE = yes                  # USB Nkey Rollover
-AUDIO_ENABLE = no                  # Audio output on port C6
-NO_USB_STARTUP_CHECK = no          # Disable initialization only when usb is plugged in
-#SERIAL_LINK_ENABLE = yes
-
-RAW_ENABLE = yes
-DYNAMIC_KEYMAP_ENABLE = yes
-CIE1931_CURVE = yes
+VIA_ENABLE = yes
diff --git a/keyboards/hs60/v2/rules.mk b/keyboards/hs60/v2/rules.mk
index 6c32342589..37deb63be7 100644
--- a/keyboards/hs60/v2/rules.mk
+++ b/keyboards/hs60/v2/rules.mk
@@ -21,8 +21,6 @@ AUDIO_ENABLE = no                  # Audio output on port C6
 NO_USB_STARTUP_CHECK = no          # Disable initialization only when usb is plugged in
 #SERIAL_LINK_ENABLE = yes
 
-RAW_ENABLE = no
-DYNAMIC_KEYMAP_ENABLE = no
 CIE1931_CURVE = yes
 
 LAYOUTS = 60_ansi 60_iso
diff --git a/keyboards/hs60/v2/v2.h b/keyboards/hs60/v2/v2.h
index da32c3026a..e770764862 100644
--- a/keyboards/hs60/v2/v2.h
+++ b/keyboards/hs60/v2/v2.h
@@ -19,7 +19,7 @@
 
 #include "quantum.h"
 #include "../../wilba_tech/wt_rgb_backlight_keycodes.h"
-#include "../../wilba_tech/via_keycodes.h"
+#include "via.h"
 
 // This a shortcut to help you visually see your layout.
 
diff --git a/keyboards/idb_60/config.h b/keyboards/idb_60/config.h
index 0120e470e5..f5538c291e 100644
--- a/keyboards/idb_60/config.h
+++ b/keyboards/idb_60/config.h
@@ -148,23 +148,3 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
 //#define NO_ACTION_ONESHOT
 //#define NO_ACTION_MACRO
 //#define NO_ACTION_FUNCTION
-
-#define DYNAMIC_KEYMAP_LAYER_COUNT 4
-
-// EEPROM usage
-
-// TODO: refactor with new user EEPROM code (coming soon)
-#define EEPROM_MAGIC 0x451F
-#define EEPROM_MAGIC_ADDR 34
-// Bump this every time we change what we store
-// This will automatically reset the EEPROM with defaults
-// and avoid loading invalid data from the EEPROM
-#define EEPROM_VERSION 0x08
-#define EEPROM_VERSION_ADDR 36
-
-// Dynamic keymap starts after EEPROM version
-#define DYNAMIC_KEYMAP_EEPROM_ADDR 37
-// Dynamic macro starts after dynamic keymaps (37+(4*10*6*2)) = (37+480)
-#define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR 677    // **** CHANGE THIS BASED ON MATRIX_ROWS & MATRIX_COLS ****
-#define DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE 347    // **** CHANGE THIS BASED ON 1024-DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR ****
-#define DYNAMIC_KEYMAP_MACRO_COUNT 16
diff --git a/keyboards/illuminati/is0/keymaps/via/keymap.c b/keyboards/illuminati/is0/keymaps/via/keymap.c
new file mode 100644
index 0000000000..6b8df505ed
--- /dev/null
+++ b/keyboards/illuminati/is0/keymaps/via/keymap.c
@@ -0,0 +1,31 @@
+/* Copyright 2019 Ryota Goto
+ *
+ * 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 QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+  [0] = LAYOUT(
+    KC_ENT
+  ),
+  [1] = LAYOUT(
+    KC_TRNS
+  ),
+  [2] = LAYOUT(
+    KC_TRNS
+  ),
+  [3] = LAYOUT(
+    KC_TRNS
+  ),
+};
diff --git a/keyboards/illuminati/is0/keymaps/via/readme.md b/keyboards/illuminati/is0/keymaps/via/readme.md
new file mode 100644
index 0000000000..1c12e45303
--- /dev/null
+++ b/keyboards/illuminati/is0/keymaps/via/readme.md
@@ -0,0 +1 @@
+# The VIA keymap for is0
diff --git a/keyboards/illuminati/is0/keymaps/via/rules.mk b/keyboards/illuminati/is0/keymaps/via/rules.mk
new file mode 100644
index 0000000000..1e5b99807c
--- /dev/null
+++ b/keyboards/illuminati/is0/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
diff --git a/keyboards/keebio/iris/iris.h b/keyboards/keebio/iris/iris.h
index 5e6bc5b582..878d57897b 100644
--- a/keyboards/keebio/iris/iris.h
+++ b/keyboards/keebio/iris/iris.h
@@ -13,7 +13,7 @@
 #endif
 
 #include "quantum.h"
-#include "../../wilba_tech/via_keycodes.h"
+#include "via.h"
 
 // Used to create a keymap using only KC_ prefixed keys
 #define LAYOUT_kc( \
diff --git a/keyboards/keebio/iris/keymaps/osiris/rules.mk b/keyboards/keebio/iris/keymaps/osiris/rules.mk
index f2788b5f75..45c570a3b6 100644
--- a/keyboards/keebio/iris/keymaps/osiris/rules.mk
+++ b/keyboards/keebio/iris/keymaps/osiris/rules.mk
@@ -1,8 +1,3 @@
 RGBLIGHT_ENABLE = yes
 BACKLIGHT_ENABLE = yes
 MOUSEKEY_ENABLE = yes
-
-# VIA Support - Comment these 3 lines out to disable
-# RAW_ENABLE = yes
-# DYNAMIC_KEYMAP_ENABLE = yes
-# SRC += keyboards/wilba_tech/wt_main.c
\ No newline at end of file
diff --git a/keyboards/keebio/iris/keymaps/via/config.h b/keyboards/keebio/iris/keymaps/via/config.h
deleted file mode 100644
index f2498e5927..0000000000
--- a/keyboards/keebio/iris/keymaps/via/config.h
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
-Copyright 2017 Danny Nguyen <danny@keeb.io>
-
-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/>.
-*/
-
-#pragma once
-
-#define RGBLIGHT_ANIMATIONS
diff --git a/keyboards/keebio/iris/keymaps/via/rules.mk b/keyboards/keebio/iris/keymaps/via/rules.mk
index ca2680325e..1e5b99807c 100644
--- a/keyboards/keebio/iris/keymaps/via/rules.mk
+++ b/keyboards/keebio/iris/keymaps/via/rules.mk
@@ -1,7 +1 @@
-RGBLIGHT_ENABLE = yes
-BACKLIGHT_ENABLE = yes
-
-# VIA Support - Comment these 3 lines out to disable
-RAW_ENABLE = yes
-DYNAMIC_KEYMAP_ENABLE = yes
-SRC += keyboards/wilba_tech/wt_main.c
+VIA_ENABLE = yes
diff --git a/keyboards/keebio/iris/rev1/config.h b/keyboards/keebio/iris/rev1/config.h
index 7b88fe5de7..a6b14138e4 100644
--- a/keyboards/keebio/iris/rev1/config.h
+++ b/keyboards/keebio/iris/rev1/config.h
@@ -60,23 +60,3 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 /* ws2812 RGB LED */
 #define RGB_DI_PIN D3
 #define RGBLED_NUM 12    // Number of LEDs
-
-#define DYNAMIC_KEYMAP_LAYER_COUNT 4
-
-// EEPROM usage
-
-// TODO: refactor with new user EEPROM code (coming soon)
-#define EEPROM_MAGIC 0x451F
-#define EEPROM_MAGIC_ADDR 34
-// Bump this every time we change what we store
-// This will automatically reset the EEPROM with defaults
-// and avoid loading invalid data from the EEPROM
-#define EEPROM_VERSION 0x08
-#define EEPROM_VERSION_ADDR 36
-
-// Dynamic keymap starts after EEPROM version
-#define DYNAMIC_KEYMAP_EEPROM_ADDR 37
-// Dynamic macro starts after dynamic keymaps (37+(4*10*6*2)) = (37+480)
-#define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR 517
-#define DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE 507    // 1024-DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR
-#define DYNAMIC_KEYMAP_MACRO_COUNT 16
diff --git a/keyboards/keebio/iris/rev1_led/config.h b/keyboards/keebio/iris/rev1_led/config.h
index ec78ef67f4..5f93a61dfc 100644
--- a/keyboards/keebio/iris/rev1_led/config.h
+++ b/keyboards/keebio/iris/rev1_led/config.h
@@ -60,23 +60,3 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 /* ws2812 RGB LED */
 #define RGB_DI_PIN D3
 #define RGBLED_NUM 12    // Number of LEDs
-
-#define DYNAMIC_KEYMAP_LAYER_COUNT 4
-
-// EEPROM usage
-
-// TODO: refactor with new user EEPROM code (coming soon)
-#define EEPROM_MAGIC 0x451F
-#define EEPROM_MAGIC_ADDR 34
-// Bump this every time we change what we store
-// This will automatically reset the EEPROM with defaults
-// and avoid loading invalid data from the EEPROM
-#define EEPROM_VERSION 0x08
-#define EEPROM_VERSION_ADDR 36
-
-// Dynamic keymap starts after EEPROM version
-#define DYNAMIC_KEYMAP_EEPROM_ADDR 37
-// Dynamic macro starts after dynamic keymaps (37+(4*10*6*2)) = (37+480)
-#define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR 517
-#define DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE 507    // 1024-DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR
-#define DYNAMIC_KEYMAP_MACRO_COUNT 16
diff --git a/keyboards/keebio/iris/rev2/config.h b/keyboards/keebio/iris/rev2/config.h
index 500b0fcbd1..ab55bf77b2 100644
--- a/keyboards/keebio/iris/rev2/config.h
+++ b/keyboards/keebio/iris/rev2/config.h
@@ -60,23 +60,3 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 /* ws2812 RGB LED */
 #define RGB_DI_PIN D3
 #define RGBLED_NUM 12    // Number of LEDs
-
-#define DYNAMIC_KEYMAP_LAYER_COUNT 4
-
-// EEPROM usage
-
-// TODO: refactor with new user EEPROM code (coming soon)
-#define EEPROM_MAGIC 0x451F
-#define EEPROM_MAGIC_ADDR 34
-// Bump this every time we change what we store
-// This will automatically reset the EEPROM with defaults
-// and avoid loading invalid data from the EEPROM
-#define EEPROM_VERSION 0x08
-#define EEPROM_VERSION_ADDR 36
-
-// Dynamic keymap starts after EEPROM version
-#define DYNAMIC_KEYMAP_EEPROM_ADDR 37
-// Dynamic macro starts after dynamic keymaps (37+(4*10*6*2)) = (37+480)
-#define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR 517
-#define DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE 507    // 1024-DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR
-#define DYNAMIC_KEYMAP_MACRO_COUNT 16
diff --git a/keyboards/keebio/iris/rev3/config.h b/keyboards/keebio/iris/rev3/config.h
index eeb999ad4f..8c6f4ad085 100644
--- a/keyboards/keebio/iris/rev3/config.h
+++ b/keyboards/keebio/iris/rev3/config.h
@@ -69,23 +69,3 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #define RGB_DI_PIN F7
 #define RGBLED_NUM 12    // Number of LEDs
 #define RGBLED_SPLIT { 6, 6 }
-
-#define DYNAMIC_KEYMAP_LAYER_COUNT 4
-
-// EEPROM usage
-
-// TODO: refactor with new user EEPROM code (coming soon)
-#define EEPROM_MAGIC 0x451F
-#define EEPROM_MAGIC_ADDR 34
-// Bump this every time we change what we store
-// This will automatically reset the EEPROM with defaults
-// and avoid loading invalid data from the EEPROM
-#define EEPROM_VERSION 0x08
-#define EEPROM_VERSION_ADDR 36
-
-// Dynamic keymap starts after EEPROM version
-#define DYNAMIC_KEYMAP_EEPROM_ADDR 37
-// Dynamic macro starts after dynamic keymaps (37+(4*10*6*2)) = (37+480)
-#define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR 517
-#define DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE 507    // 1024-DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR
-#define DYNAMIC_KEYMAP_MACRO_COUNT 16
diff --git a/keyboards/keebio/iris/rev4/config.h b/keyboards/keebio/iris/rev4/config.h
index b4bcd6139b..87fdafcd5b 100644
--- a/keyboards/keebio/iris/rev4/config.h
+++ b/keyboards/keebio/iris/rev4/config.h
@@ -73,23 +73,3 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #define RGB_DI_PIN D6
 #define RGBLED_NUM 12    // Number of LEDs
 #define RGBLED_SPLIT { 6, 6 }
-
-#define DYNAMIC_KEYMAP_LAYER_COUNT 4
-
-// EEPROM usage
-
-// TODO: refactor with new user EEPROM code (coming soon)
-#define EEPROM_MAGIC 0x451F
-#define EEPROM_MAGIC_ADDR 34
-// Bump this every time we change what we store
-// This will automatically reset the EEPROM with defaults
-// and avoid loading invalid data from the EEPROM
-#define EEPROM_VERSION 0x08
-#define EEPROM_VERSION_ADDR 36
-
-// Dynamic keymap starts after EEPROM version
-#define DYNAMIC_KEYMAP_EEPROM_ADDR 37
-// Dynamic macro starts after dynamic keymaps (37+(4*10*6*2)) = (37+480)
-#define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR 517
-#define DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE 507    // 1024-DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR
-#define DYNAMIC_KEYMAP_MACRO_COUNT 16
diff --git a/keyboards/kingly_keys/romac/config.h b/keyboards/kingly_keys/romac/config.h
index da236c5004..59b084e8c9 100644
--- a/keyboards/kingly_keys/romac/config.h
+++ b/keyboards/kingly_keys/romac/config.h
@@ -3,8 +3,8 @@
 #include "config_common.h"
 
 /* USB Device descriptor parameter */
-#define VENDOR_ID       0xFEED
-#define PRODUCT_ID      0x6060
+#define VENDOR_ID       0x4b4b // "KK"
+#define PRODUCT_ID      0x0001
 #define DEVICE_VER      0x0001
 #define MANUFACTURER    TheRoyalSweatshirt
 #define PRODUCT         romac
diff --git a/keyboards/kingly_keys/romac/keymaps/via/keymap.c b/keyboards/kingly_keys/romac/keymaps/via/keymap.c
new file mode 100644
index 0000000000..833336b531
--- /dev/null
+++ b/keyboards/kingly_keys/romac/keymaps/via/keymap.c
@@ -0,0 +1,44 @@
+/* Copyright 2018 Jack Humbert
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+	[0] = LAYOUT(
+		KC_KP_7, KC_KP_8, KC_KP_9, \
+		KC_KP_4, KC_KP_5, KC_KP_6, \
+		KC_KP_1, KC_KP_2, KC_KP_3, \
+		MO(1),   KC_KP_0, KC_KP_DOT \
+	),
+	[1] = LAYOUT(
+		KC_TRNS, KC_TRNS, KC_TRNS, \
+		KC_TRNS, KC_TRNS, KC_TRNS, \
+		KC_TRNS, KC_TRNS, KC_TRNS, \
+		KC_TRNS, KC_TRNS, KC_TRNS \
+	),
+	[2] = LAYOUT(
+		KC_TRNS, KC_TRNS, KC_TRNS, \
+		KC_TRNS, KC_TRNS, KC_TRNS, \
+		KC_TRNS, KC_TRNS, KC_TRNS, \
+		KC_TRNS, KC_TRNS, KC_TRNS \
+	),
+	[3] = LAYOUT(
+		KC_TRNS, KC_TRNS, KC_TRNS, \
+		KC_TRNS, KC_TRNS, KC_TRNS, \
+		KC_TRNS, KC_TRNS, KC_TRNS, \
+		KC_TRNS, KC_TRNS, KC_TRNS \
+	)
+};
diff --git a/keyboards/kingly_keys/romac/keymaps/via/rules.mk b/keyboards/kingly_keys/romac/keymaps/via/rules.mk
new file mode 100644
index 0000000000..1e5b99807c
--- /dev/null
+++ b/keyboards/kingly_keys/romac/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
diff --git a/keyboards/maartenwut/plain60/config.h b/keyboards/maartenwut/plain60/config.h
index d17481617f..af4fb62311 100644
--- a/keyboards/maartenwut/plain60/config.h
+++ b/keyboards/maartenwut/plain60/config.h
@@ -47,24 +47,3 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 #define QMK_ESC_OUTPUT D2 // usually COL
 #define QMK_ESC_INPUT B4 // usually ROW
-
-//VIA
-#define DYNAMIC_KEYMAP_LAYER_COUNT 4
-
-// EEPROM usage
-
-// TODO: refactor with new user EEPROM code (coming soon)
-#define EEPROM_MAGIC 0x451F
-#define EEPROM_MAGIC_ADDR 34
-// Bump this every time we change what we store
-// This will automatically reset the EEPROM with defaults
-// and avoid loading invalid data from the EEPROM
-#define EEPROM_VERSION 0x08
-#define EEPROM_VERSION_ADDR 36
-
-// Dynamic keymap starts after EEPROM version
-#define DYNAMIC_KEYMAP_EEPROM_ADDR 37
-// Dynamic macro starts after dynamic keymaps (37+(4*10*6*2)) = (37+480)
-#define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR 637
-#define DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE 387    // 1024-DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR
-#define DYNAMIC_KEYMAP_MACRO_COUNT 16
diff --git a/keyboards/maartenwut/plain60/keymaps/kwerdenker/rules.mk b/keyboards/maartenwut/plain60/keymaps/kwerdenker/rules.mk
index 793bd869ae..facc9dc7e6 100644
--- a/keyboards/maartenwut/plain60/keymaps/kwerdenker/rules.mk
+++ b/keyboards/maartenwut/plain60/keymaps/kwerdenker/rules.mk
@@ -16,8 +16,7 @@
 # Build Options
 #   comment out to disable the options.
 #
-BOOTMAGIC_ENABLE = no	# Virtual DIP switch configuration(+1000)
+BOOTMAGIC_ENABLE = lite	# Virtual DIP switch configuration(+1000)
 NKRO_ENABLE = yes		# USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
 RGBLIGHT_ENABLE = yes   # Enable keyboard underlight functionality (+4870)
-RAW_ENABLE = no
-DYNAMIC_KEYMAP_ENABLE = no
+
diff --git a/keyboards/maartenwut/plain60/keymaps/via/rules.mk b/keyboards/maartenwut/plain60/keymaps/via/rules.mk
index 2b23b188b4..1e5b99807c 100644
--- a/keyboards/maartenwut/plain60/keymaps/via/rules.mk
+++ b/keyboards/maartenwut/plain60/keymaps/via/rules.mk
@@ -1,5 +1 @@
-# rules.mk overrides to enable VIA
-SRC += keyboards/wilba_tech/wt_main.c
-
-RAW_ENABLE = yes
-DYNAMIC_KEYMAP_ENABLE = yes
+VIA_ENABLE = yes
diff --git a/keyboards/nk65/config.h b/keyboards/nk65/config.h
index 51e101cde5..423714c54c 100755
--- a/keyboards/nk65/config.h
+++ b/keyboards/nk65/config.h
@@ -134,21 +134,6 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #define RGB_BACKLIGHT_LAYER_2_INDICATOR { .color = { .h = 0, .s = 0 }, .index = 255 }
 #define RGB_BACKLIGHT_LAYER_3_INDICATOR { .color = { .h = 0, .s = 0 }, .index = 255 }
 
-// TODO: refactor with new user EEPROM code (coming soon)
-#define EEPROM_MAGIC 0x451F
-#define EEPROM_MAGIC_ADDR 34
-// Bump this every time we change what we store
-// This will automatically reset the EEPROM with defaults
-// and avoid loading invalid data from the EEPROM
-#define EEPROM_VERSION 0x08
-#define EEPROM_VERSION_ADDR 36
-
-// Backlight config starts after EEPROM version
-#define RGB_BACKLIGHT_CONFIG_EEPROM_ADDR 37
-// Dynamic keymap starts after backlight config (37+32)
-#define DYNAMIC_KEYMAP_EEPROM_ADDR 69
-#define DYNAMIC_KEYMAP_LAYER_COUNT 4
-// Dynamic macro starts after dynamic keymaps (69+(4*5*15*2)) = (69+600)
-#define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR 669
-#define DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE 396
-#define DYNAMIC_KEYMAP_MACRO_COUNT 16
+// Backlight config starts after VIA's EEPROM usage,
+// dynamic keymaps start after this.
+#define VIA_EEPROM_CUSTOM_CONFIG_SIZE 31
diff --git a/keyboards/nk65/keymaps/default_via/rules.mk b/keyboards/nk65/keymaps/default_via/rules.mk
index b8311f5e7f..1e5b99807c 100755
--- a/keyboards/nk65/keymaps/default_via/rules.mk
+++ b/keyboards/nk65/keymaps/default_via/rules.mk
@@ -1,67 +1 @@
-# project specific files
-SRC =	keyboards/wilba_tech/wt_main.c \
-		keyboards/wilba_tech/wt_rgb_backlight.c \
-		drivers/issi/is31fl3733.c \
-		quantum/color.c \
-		drivers/arm/i2c_master.c
-
-## chip/board settings
-#   the next two should match the directories in
-#   <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
-MCU_FAMILY = STM32
-MCU_SERIES = STM32F3xx
-
-# Linker script to use
-#   it should exist either in <chibios>/os/common/ports/ARMCMx/compilers/GCC/ld/
-#   or <this_dir>/ld/
-MCU_LDSCRIPT = STM32F303xC
-
-# Startup code to use
-#  - it should exist in <chibios>/os/common/startup/ARMCMx/compilers/GCC/mk/
-MCU_STARTUP = stm32f3xx
-
-# Board: it should exist either in <chibios>/os/hal/boards/
-#  or <this_dir>/boards
-BOARD = GENERIC_STM32_F303XC
-
-# Cortex version
-MCU  = cortex-m4
-
-# ARM version, CORTEX-M0/M1 are 6, CORTEX-M3/M4/M7 are 7
-ARMV = 7
-
-USE_FPU = yes
-
-# Vector table for application
-# 0x00000000-0x00001000 area is occupied by bootlaoder.*/
-# The CORTEX_VTOR... is needed only for MCHCK/Infinity KB
-# OPT_DEFS = -DCORTEX_VTOR_INIT=0x08005000
-OPT_DEFS =
-
-# Do not put the microcontroller into power saving mode
-# when we get USB suspend event. We want it to keep updating
-# backlight effects.
-OPT_DEFS += -DNO_SUSPEND_POWER_DOWN
-
-# Options to pass to dfu-util when flashing
-DFU_ARGS = -d 0483:df11 -a 0 -s 0x08000000:leave
-DFU_SUFFIX_ARGS = -p DF11 -v 0483
-
-# Build Options
-#   comment out to disable the options.
-#
-BACKLIGHT_ENABLE = no              # Enable keyboard backlight functionality
-BOOTMAGIC_ENABLE = no              # Virtual DIP switch configuration
-MOUSEKEY_ENABLE = yes              # Mouse keys
-EXTRAKEY_ENABLE = yes              # Audio control and System control
-CONSOLE_ENABLE = no                # Console for debug
-COMMAND_ENABLE = no                # Commands for debug and configuration
-SLEEP_LED_ENABLE = no              # Breathing sleep LED during USB suspend
-NKRO_ENABLE = yes                  # USB Nkey Rollover
-AUDIO_ENABLE = no                  # Audio output on port C6
-NO_USB_STARTUP_CHECK = no          # Disable initialization only when usb is plugged in
-#SERIAL_LINK_ENABLE = yes
-
-RAW_ENABLE = yes
-DYNAMIC_KEYMAP_ENABLE = yes
-CIE1931_CURVE = yes
+VIA_ENABLE = yes
diff --git a/keyboards/nk65/nk65.h b/keyboards/nk65/nk65.h
index 49725a7e64..35aca2a64c 100755
--- a/keyboards/nk65/nk65.h
+++ b/keyboards/nk65/nk65.h
@@ -19,7 +19,7 @@
 
 #include "quantum.h"
 #include "../wilba_tech/wt_rgb_backlight_keycodes.h"
-#include "../wilba_tech/via_keycodes.h"
+#include "via.h"
 
 // This a shortcut to help you visually see your layout.
 
diff --git a/keyboards/nk65/rules.mk b/keyboards/nk65/rules.mk
index 0840daf376..01765538a2 100755
--- a/keyboards/nk65/rules.mk
+++ b/keyboards/nk65/rules.mk
@@ -21,8 +21,6 @@ AUDIO_ENABLE = no                  # Audio output on port C6
 NO_USB_STARTUP_CHECK = no          # Disable initialization only when usb is plugged in
 #SERIAL_LINK_ENABLE = yes
 
-RAW_ENABLE = no
-DYNAMIC_KEYMAP_ENABLE = no
 CIE1931_CURVE = yes
 
 LAYOUTS = 65_ansi
diff --git a/keyboards/primekb/prime_e/config.h b/keyboards/primekb/prime_e/config.h
index 46124973de..bf5061b1ae 100644
--- a/keyboards/primekb/prime_e/config.h
+++ b/keyboards/primekb/prime_e/config.h
@@ -50,23 +50,3 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #define LOCKING_SUPPORT_ENABLE
 /* Locking resynchronize hack */
 #define LOCKING_RESYNC_ENABLE
-
-#define DYNAMIC_KEYMAP_LAYER_COUNT 4
-
-// EEPROM usage
-
-// TODO: refactor with new user EEPROM code (coming soon)
-#define EEPROM_MAGIC 0x451F
-#define EEPROM_MAGIC_ADDR 34
-// Bump this every time we change what we store
-// This will automatically reset the EEPROM with defaults
-// and avoid loading invalid data from the EEPROM
-#define EEPROM_VERSION 0x08
-#define EEPROM_VERSION_ADDR 36
-
-// Dynamic keymap starts after EEPROM version
-#define DYNAMIC_KEYMAP_EEPROM_ADDR 37
-// Dynamic macro starts after dynamic keymaps (37+(4*13*4*2)) = (37+416)
-#define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR 453
-#define DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE 571    // 1024-DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR
-#define DYNAMIC_KEYMAP_MACRO_COUNT 16
diff --git a/keyboards/primekb/prime_e/keymaps/via/rules.mk b/keyboards/primekb/prime_e/keymaps/via/rules.mk
index c981a2f261..1e5b99807c 100644
--- a/keyboards/primekb/prime_e/keymaps/via/rules.mk
+++ b/keyboards/primekb/prime_e/keymaps/via/rules.mk
@@ -1,85 +1 @@
-# MCU name
-MCU = atmega32u4
-
-# Processor frequency.
-#     This will define a symbol, F_CPU, in all source code files equal to the
-#     processor frequency in Hz. You can then use this symbol in your source code to
-#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
-#     automatically to create a 32-bit value in your source code.
-#
-#     This will be an integer division of F_USB below, as it is sourced by
-#     F_USB after it has run through any CPU prescalers. Note that this value
-#     does not *change* the processor frequency - it should merely be updated to
-#     reflect the processor speed set externally so that the code can use accurate
-#     software delays.
-F_CPU = 16000000
-
-
-#
-# LUFA specific
-#
-# Target architecture (see library "Board Types" documentation).
-ARCH = AVR8
-
-# Input clock frequency.
-#     This will define a symbol, F_USB, in all source code files equal to the
-#     input clock frequency (before any prescaling is performed) in Hz. This value may
-#     differ from F_CPU if prescaling is used on the latter, and is required as the
-#     raw input clock is fed directly to the PLL sections of the AVR for high speed
-#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
-#     at the end, this will be done automatically to create a 32-bit value in your
-#     source code.
-#
-#     If no clock division is performed on the input clock inside the AVR (via the
-#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
-F_USB = $(F_CPU)
-
-# Interrupt driven control endpoint task(+60)
-OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
-
-
-# Bootloader selection
-#   Teensy       halfkay
-#   Pro Micro    caterina
-#   Atmel DFU    atmel-dfu
-#   LUFA DFU     lufa-dfu
-#   QMK DFU      qmk-dfu
-#   atmega32a    bootloadHID
-BOOTLOADER = atmel-dfu
-
-
-# If you don't know the bootloader type, then you can specify the
-# Boot Section Size in *bytes* by uncommenting out the OPT_DEFS line
-#   Teensy halfKay      512
-#   Teensy++ halfKay    1024
-#   Atmel DFU loader    4096
-#   LUFA bootloader     4096
-#   USBaspLoader        2048
-# OPT_DEFS += -DBOOTLOADER_SIZE=4096
-
-
-# Build Options
-#   change yes to no to disable
-#
-BOOTMAGIC_ENABLE = no      # Virtual DIP switch configuration(+1000)
-MOUSEKEY_ENABLE = no       # Mouse keys(+4700)
-EXTRAKEY_ENABLE = yes       # Audio control and System control(+450)
-CONSOLE_ENABLE = no        # Console for debug(+400)
-COMMAND_ENABLE = no        # Commands for debug and configuration
-# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
-SLEEP_LED_ENABLE = no       # Breathing sleep LED during USB suspend
-# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
-NKRO_ENABLE = yes            # USB Nkey Rollover
-BACKLIGHT_ENABLE = yes       # Enable keyboard backlight functionality on B7 by default
-RGBLIGHT_ENABLE = no        # Enable keyboard RGB underglow
-MIDI_ENABLE = no            # MIDI support (+2400 to 4200, depending on config)
-UNICODE_ENABLE = no         # Unicode
-BLUETOOTH_ENABLE = no       # Enable Bluetooth with the Adafruit EZ-Key HID
-AUDIO_ENABLE = no           # Audio output on port C6
-FAUXCLICKY_ENABLE = no      # Use buzzer to emulate clicky switches
-HD44780_ENABLE = no 		# Enable support for HD44780 based LCDs (+400)
-
-# This is the VIA magic
-RAW_ENABLE = yes
-DYNAMIC_KEYMAP_ENABLE = yes
-SRC += keyboards/wilba_tech/wt_main.c
\ No newline at end of file
+VIA_ENABLE = yes
diff --git a/keyboards/projectkb/alice/config.h b/keyboards/projectkb/alice/config.h
index cc0386ae68..4a068a8893 100644
--- a/keyboards/projectkb/alice/config.h
+++ b/keyboards/projectkb/alice/config.h
@@ -58,29 +58,9 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #define PIN_WS2812      15
 #define WS2812_SPI SPID2
 
-
-// EEPROM usage
-// TODO: refactor with new user EEPROM code (coming soon)
-#define EEPROM_MAGIC 0x451F
-#define EEPROM_MAGIC_ADDR 32
-// Bump this every time we change what we store
-// This will automatically reset the EEPROM with defaults
-// and avoid loading invalid data from the EEPROM
-#define EEPROM_VERSION 0x01
-#define EEPROM_VERSION_ADDR 34
-
-#define EEPROM_CUSTOM_BACKLIGHT 804
-
-#undef EEPROM_MAGIC_ADDR
-#define EEPROM_MAGIC_ADDR 34
-#undef EEPROM_VERSION_ADDR
-#define EEPROM_VERSION_ADDR 36
-#undef RGB_BACKLIGHT_CONFIG_EEPROM_ADDR
-#define RGB_BACKLIGHT_CONFIG_EEPROM_ADDR 37
-#undef DYNAMIC_KEYMAP_EEPROM_ADDR 
-#define DYNAMIC_KEYMAP_EEPROM_ADDR 68
-#undef DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR 
-#define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR 66
+// Backlight config starts after VIA's EEPROM usage,
+// dynamic keymaps start after this.
+#define VIA_EEPROM_CUSTOM_CONFIG_SIZE 1
 
 /*
  * Feature disable options
diff --git a/keyboards/projectkb/alice/rules.mk b/keyboards/projectkb/alice/rules.mk
index 606ffda183..9288783352 100644
--- a/keyboards/projectkb/alice/rules.mk
+++ b/keyboards/projectkb/alice/rules.mk
@@ -51,7 +51,4 @@ CUSTOM_MATRIX = no # Custom matrix file
 # BACKLIGHT_ENABLE = yes # This is broken on 072 for some reason
 RGBLIGHT_ENABLE = yes
 
-# RAW_ENABLE = yes
-# DYNAMIC_KEYMAP_ENABLE = yes
-
 DFU_ARGS = -d 0483:df11 -a 0 -s 0x08000000:leave
diff --git a/keyboards/sck/osa/config.h b/keyboards/sck/osa/config.h
index 1b574a0997..6710134400 100644
--- a/keyboards/sck/osa/config.h
+++ b/keyboards/sck/osa/config.h
@@ -20,8 +20,8 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #include "config_common.h"
 
 /* USB Device descriptor parameter */
-#define VENDOR_ID       0xFEED
-#define PRODUCT_ID      0x0000
+#define VENDOR_ID       0x5343 // "SC"
+#define PRODUCT_ID      0x0001
 #define DEVICE_VER      0x0001
 #define MANUFACTURER    Space City Keyboards
 #define PRODUCT         OSA
diff --git a/keyboards/sck/osa/keymaps/via/keymap.c b/keyboards/sck/osa/keymaps/via/keymap.c
new file mode 100644
index 0000000000..2c1af07318
--- /dev/null
+++ b/keyboards/sck/osa/keymaps/via/keymap.c
@@ -0,0 +1,49 @@
+/* Copyright 2019 jrfhoutx
+ *
+ * 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 QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+[0] = LAYOUT_all(
+  KC_DEL,  KC_ESC,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,             KC_7,    KC_8,    KC_9,    KC_0,    KC_MINS, KC_EQL,  KC_BSPC, KC_BSPC,
+  KC_PGUP, KC_TAB,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,             KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_LBRC, KC_RBRC, KC_BSLS,
+  KC_PGDN, KC_CAPS, KC_A,    KC_S,    KC_D,    KC_F,    KC_G,             KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT,          KC_ENT,
+           KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,	                     KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_RSFT, KC_RSFT,
+           KC_LCTL,          KC_LALT,          KC_SPC,  MO(1),                     KC_SPC,                    KC_RALT,                            KC_RCTL
+  ),
+[1] = LAYOUT_all(
+  KC_TRNS, KC_TRNS, KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,            KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,  KC_TRNS, KC_TRNS,
+  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,          KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,          KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,          KC_TRNS,
+           KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,                   KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+           KC_TRNS,          KC_TRNS,          KC_TRNS, KC_TRNS,                   KC_TRNS,                   KC_TRNS,                            KC_TRNS
+  ),
+
+[2] = LAYOUT_all(
+  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,          KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,          KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,          KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,          KC_TRNS,
+           KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,                   KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+           KC_TRNS,          KC_TRNS,          KC_TRNS, KC_TRNS,                   KC_TRNS,                   KC_TRNS,                            KC_TRNS
+  ),
+
+[3] = LAYOUT_all(
+  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,          KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,          KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,          KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,          KC_TRNS,
+           KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,                   KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+           KC_TRNS,          KC_TRNS,          KC_TRNS, KC_TRNS,                   KC_TRNS,                   KC_TRNS,                            KC_TRNS
+  ),
+};
diff --git a/keyboards/sck/osa/keymaps/via/readme.md b/keyboards/sck/osa/keymaps/via/readme.md
new file mode 100644
index 0000000000..3f8300bb1f
--- /dev/null
+++ b/keyboards/sck/osa/keymaps/via/readme.md
@@ -0,0 +1 @@
+# The VIA keymap for OSA
diff --git a/keyboards/sck/osa/keymaps/via/rules.mk b/keyboards/sck/osa/keymaps/via/rules.mk
new file mode 100644
index 0000000000..bee21da528
--- /dev/null
+++ b/keyboards/sck/osa/keymaps/via/rules.mk
@@ -0,0 +1,2 @@
+VIA_ENABLE = yes
+MOUSEKEY_ENABLE = no
\ No newline at end of file
diff --git a/keyboards/snagpad/config.h b/keyboards/snagpad/config.h
index a4ab9d5e26..339bdd1be6 100644
--- a/keyboards/snagpad/config.h
+++ b/keyboards/snagpad/config.h
@@ -47,23 +47,3 @@
 #define RGBLIGHT_SAT_STEP 8
 #define RGBLIGHT_VAL_STEP 8
 #endif
-
-#define DYNAMIC_KEYMAP_LAYER_COUNT 4
-
-// EEPROM usage
-
-// TODO: refactor with new user EEPROM code (coming soon)
-#define EEPROM_MAGIC 0x451F
-#define EEPROM_MAGIC_ADDR 34
-// Bump this every time we change what we store
-// This will automatically reset the EEPROM with defaults
-// and avoid loading invalid data from the EEPROM
-#define EEPROM_VERSION 0x08
-#define EEPROM_VERSION_ADDR 36
-
-// Dynamic keymap starts after EEPROM version
-#define DYNAMIC_KEYMAP_EEPROM_ADDR 37
-// Dynamic macro starts after dynamic keymaps (37+(4*5*4*2)) = (37+160)
-#define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR 197
-#define DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE 827
-#define DYNAMIC_KEYMAP_MACRO_COUNT 16
\ No newline at end of file
diff --git a/keyboards/snagpad/keymaps/via/rules.mk b/keyboards/snagpad/keymaps/via/rules.mk
index 032d68c5e9..1e5b99807c 100644
--- a/keyboards/snagpad/keymaps/via/rules.mk
+++ b/keyboards/snagpad/keymaps/via/rules.mk
@@ -1,76 +1 @@
-# MCU name
-MCU = atmega32u4
-
-# Processor frequency.
-#     This will define a symbol, F_CPU, in all source code files equal to the
-#     processor frequency in Hz. You can then use this symbol in your source code to
-#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
-#     automatically to create a 32-bit value in your source code.
-#
-#     This will be an integer division of F_USB below, as it is sourced by
-#     F_USB after it has run through any CPU prescalers. Note that this value
-#     does not *change* the processor frequency - it should merely be updated to
-#     reflect the processor speed set externally so that the code can use accurate
-#     software delays.
-F_CPU = 16000000
-
-#
-# LUFA specific
-#
-# Target architecture (see library "Board Types" documentation).
-ARCH = AVR8
-
-# Input clock frequency.
-#     This will define a symbol, F_USB, in all source code files equal to the
-#     input clock frequency (before any prescaling is performed) in Hz. This value may
-#     differ from F_CPU if prescaling is used on the latter, and is required as the
-#     raw input clock is fed directly to the PLL sections of the AVR for high speed
-#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
-#     at the end, this will be done automatically to create a 32-bit value in your
-#     source code.
-#
-#     If no clock division is performed on the input clock inside the AVR (via the
-#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
-F_USB = $(F_CPU)
-
-# Interrupt driven control endpoint task(+60)
-OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
-
-# Bootloader selection
-#   Teensy       halfkay
-#   Pro Micro    caterina
-#   Atmel DFU    atmel-dfu
-#   LUFA DFU     lufa-dfu
-#   QMK DFU      qmk-dfu
-#   atmega32a    bootloadHID
-BOOTLOADER = caterina
-
-# Boot Section Size in *bytes*
-# OPT_DEFS += -DBOOTLOADER_SIZE=4096
-
-
-# Build Options
-#   change yes to no to disable
-#
-BOOTMAGIC_ENABLE = no      # Virtual DIP switch configuration(+1000)
-MOUSEKEY_ENABLE = no       # Mouse keys(+4700)
-EXTRAKEY_ENABLE = yes       # Audio control and System control(+450)
-CONSOLE_ENABLE = no        # Console for debug(+400)
-COMMAND_ENABLE = no        # Commands for debug and configuration
-# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
-SLEEP_LED_ENABLE = no       # Breathing sleep LED during USB suspend
-# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
-NKRO_ENABLE = yes            # USB Nkey Rollover
-BACKLIGHT_ENABLE = no       # Enable keyboard backlight functionality on B7 by default
-MIDI_ENABLE = no            # MIDI support (+2400 to 4200, depending on config)
-UNICODE_ENABLE = no         # Unicode
-BLUETOOTH_ENABLE = no       # Enable Bluetooth with the Adafruit EZ-Key HID
-AUDIO_ENABLE = no           # Audio output on port C6
-FAUXCLICKY_ENABLE = no      # Use buzzer to emulate clicky switches
-
-# This is the VIA magic
-RAW_ENABLE = yes
-DYNAMIC_KEYMAP_ENABLE = yes
-SRC += keyboards/wilba_tech/wt_main.c
-
-LAYOUTS = ortho_5x4 numpad_5x4
+VIA_ENABLE = yes
diff --git a/keyboards/westfoxtrot/aanzee/config.h b/keyboards/westfoxtrot/aanzee/config.h
index 4a5b65c583..69fc613879 100644
--- a/keyboards/westfoxtrot/aanzee/config.h
+++ b/keyboards/westfoxtrot/aanzee/config.h
@@ -117,26 +117,3 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
  * useful if your keyboard/keypad is missing keys and you want magic key support.
  *
  */
-
-
-//dynamic keymap and via support
-
-#define DYNAMIC_KEYMAP_LAYER_COUNT 4
-
-// EEPROM usage
-
-// TODO: refactor with new user EEPROM code (coming soon)
-#define EEPROM_MAGIC 0x451F
-#define EEPROM_MAGIC_ADDR 34
-// Bump this every time we change what we store
-// This will automatically reset the EEPROM with defaults
-// and avoid loading invalid data from the EEPROM
-#define EEPROM_VERSION 0x08
-#define EEPROM_VERSION_ADDR 36
-
-// Dynamic keymap starts after EEPROM version
-#define DYNAMIC_KEYMAP_EEPROM_ADDR 37
-// Dynamic macro starts after dynamic keymaps (37+(4*10*6*2)) = (37+480)
-#define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR 677    // **** CHANGE THIS BASED ON MATRIX_ROWS & MATRIX_COLS ****
-#define DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE 347    // **** CHANGE THIS BASED ON 1024-DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR ****
-#define DYNAMIC_KEYMAP_MACRO_COUNT 16
diff --git a/keyboards/westfoxtrot/aanzee/keymaps/via/rules.mk b/keyboards/westfoxtrot/aanzee/keymaps/via/rules.mk
index bcc5dc530a..1e5b99807c 100644
--- a/keyboards/westfoxtrot/aanzee/keymaps/via/rules.mk
+++ b/keyboards/westfoxtrot/aanzee/keymaps/via/rules.mk
@@ -1,69 +1 @@
-# MCU name
-MCU = atmega32u4
-
-# Processor frequency.
-#     This will define a symbol, F_CPU, in all source code files equal to the
-#     processor frequency in Hz. You can then use this symbol in your source code to
-#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
-#     automatically to create a 32-bit value in your source code.
-#
-#     This will be an integer division of F_USB below, as it is sourced by
-#     F_USB after it has run through any CPU prescalers. Note that this value
-#     does not *change* the processor frequency - it should merely be updated to
-#     reflect the processor speed set externally so that the code can use accurate
-#     software delays.
-F_CPU = 16000000
-
-
-#
-# LUFA specific
-#
-# Target architecture (see library "Board Types" documentation).
-ARCH = AVR8
-
-# Input clock frequency.
-#     This will define a symbol, F_USB, in all source code files equal to the
-#     input clock frequency (before any prescaling is performed) in Hz. This value may
-#     differ from F_CPU if prescaling is used on the latter, and is required as the
-#     raw input clock is fed directly to the PLL sections of the AVR for high speed
-#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
-#     at the end, this will be done automatically to create a 32-bit value in your
-#     source code.
-#
-#     If no clock division is performed on the input clock inside the AVR (via the
-#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
-F_USB = $(F_CPU)
-
-# Interrupt driven control endpoint task(+60)
-OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
-
-# Bootloader selection
-#   Teensy       halfkay
-#   Pro Micro    caterina
-#   Atmel DFU    atmel-dfu
-#   LUFA DFU     lufa-dfu
-#   QMK DFU      qmk-dfu
-#   atmega32a    bootloadHID
-BOOTLOADER = atmel-dfu
-
-# Build Options
-#   comment out to disable the options.
-#
-BOOTMAGIC_ENABLE = no	# Virtual DIP switch configuration(+1000)
-MOUSEKEY_ENABLE = no	# Mouse keys(+4700)
-EXTRAKEY_ENABLE = yes	# Audio control and System control(+450)
-CONSOLE_ENABLE = no	# Console for debug(+400)
-COMMAND_ENABLE = no    # Commands for debug and configuration
-NKRO_ENABLE = yes		# USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
-RGBLIGHT_ENABLE = yes   # Enable keyboard underlight functionality (+4870)
-BACKLIGHT_ENABLE = yes  # Enable keyboard backlight functionality (+1150)
-MIDI_ENABLE = no 		# MIDI controls
-AUDIO_ENABLE = no
-UNICODE_ENABLE = no 		# Unicode
-BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
-
-#add files needed for via
-
-RAW_ENABLE = yes
-DYNAMIC_KEYMAP_ENABLE = yes
-SRC += keyboards/wilba_tech/wt_main.c
+VIA_ENABLE = yes
diff --git a/keyboards/wilba_tech/rama_works_koyu/config.h b/keyboards/wilba_tech/rama_works_koyu/config.h
index f3e21aa15f..9cbbd6620b 100644
--- a/keyboards/wilba_tech/rama_works_koyu/config.h
+++ b/keyboards/wilba_tech/rama_works_koyu/config.h
@@ -18,7 +18,7 @@
 #include "config_common.h"
 
 // USB Device descriptor parameter
-#define VENDOR_ID       0x5241 // "RW"
+#define VENDOR_ID       0x5241 // "RA"
 #define PRODUCT_ID      0x4B59 // "KY"
 #define DEVICE_VER      0x0001
 #define MANUFACTURER    RAMA WORKS
@@ -119,24 +119,6 @@
 #define RGB_BACKLIGHT_LAYER_2_INDICATOR { .color = { .h = 0, .s = 0 }, .index = 255 }
 #define RGB_BACKLIGHT_LAYER_3_INDICATOR { .color = { .h = 0, .s = 0 }, .index = 255 }
 
-#define DYNAMIC_KEYMAP_LAYER_COUNT 4
-
-// EEPROM usage
-
-// TODO: refactor with new user EEPROM code (coming soon)
-#define EEPROM_MAGIC 0x451F
-#define EEPROM_MAGIC_ADDR 34
-// Bump this every time we change what we store
-// This will automatically reset the EEPROM with defaults
-// and avoid loading invalid data from the EEPROM
-#define EEPROM_VERSION 0x08
-#define EEPROM_VERSION_ADDR 36
-
-// Backlight config starts after EEPROM version
-#define RGB_BACKLIGHT_CONFIG_EEPROM_ADDR 37
-// Dynamic keymap starts after backlight config (37+31)
-#define DYNAMIC_KEYMAP_EEPROM_ADDR 68
-// Dynamic macro starts after dynamic keymaps (68+(4*5*15*2)) = (68+600)
-#define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR 668
-#define DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE 356
-#define DYNAMIC_KEYMAP_MACRO_COUNT 16
+// Backlight config starts after VIA's EEPROM usage,
+// dynamic keymaps start after this.
+#define VIA_EEPROM_CUSTOM_CONFIG_SIZE 31
\ No newline at end of file
diff --git a/keyboards/wilba_tech/rama_works_koyu/keymaps/via/keymap.c b/keyboards/wilba_tech/rama_works_koyu/keymaps/via/keymap.c
new file mode 100644
index 0000000000..f6bc94fbd6
--- /dev/null
+++ b/keyboards/wilba_tech/rama_works_koyu/keymaps/via/keymap.c
@@ -0,0 +1,36 @@
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+	// Default layer
+	[0] = LAYOUT_all(
+		KC_ESC,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_MINS, KC_EQL,  KC_BSLS, KC_DEL,  KC_HOME,
+		KC_TAB,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_LBRC, KC_RBRC, KC_BSPC,          KC_PGUP,
+		KC_LCTL, KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT, KC_ENT,                    KC_PGDN,
+		KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_RSFT,                   KC_UP,   KC_END,
+		MO(1),   KC_LGUI, KC_LALT,                            KC_SPC,                                      MO(2),            KC_LEFT, KC_DOWN, KC_RGHT),
+
+	// Fn1 Layer
+	[1] = LAYOUT_all(
+		KC_GRV,  KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,  KC_INS,  KC_DEL,  KC_TRNS,
+		KC_CAPS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PSCR, KC_SLCK, KC_PAUS, KC_TRNS, KC_TRNS, KC_TRNS,          KC_TRNS,
+		KC_TRNS, KC_VOLD, KC_VOLU, KC_MUTE, KC_EJCT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,                   KC_TRNS,
+		KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,                   KC_TRNS, KC_TRNS,
+		KC_TRNS, KC_TRNS, KC_TRNS,                            KC_TRNS,                                     KC_TRNS,          KC_TRNS, KC_TRNS, KC_TRNS),
+
+	// Fn2 Layer
+	[2] = LAYOUT_all(
+		KC_TRNS, EF_DEC,  EF_INC,  H1_DEC,  H1_INC,  H2_DEC,  H2_INC,  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, BR_DEC,  BR_INC,  KC_TRNS, KC_TRNS, KC_TRNS,
+		KC_TRNS, KC_TRNS, KC_TRNS, S1_DEC,  S1_INC,  S2_DEC,  S2_INC,  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, ES_DEC,  ES_INC,  KC_TRNS,          KC_TRNS,
+		KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,                   KC_TRNS,
+		KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,                   KC_TRNS, KC_TRNS,
+		KC_TRNS, KC_TRNS, KC_TRNS,                            KC_TRNS,                                     KC_TRNS,          KC_TRNS, KC_TRNS, KC_TRNS),
+
+	// Fn3 Layer
+	[3] = LAYOUT_all(
+		KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+		KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,          KC_TRNS,
+		KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,                   KC_TRNS,
+		KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,                   KC_TRNS, KC_TRNS,
+		KC_TRNS, KC_TRNS, KC_TRNS,                            KC_TRNS,                                     KC_TRNS,          KC_TRNS, KC_TRNS, KC_TRNS),
+};
diff --git a/keyboards/wilba_tech/rama_works_koyu/keymaps/via/rules.mk b/keyboards/wilba_tech/rama_works_koyu/keymaps/via/rules.mk
new file mode 100644
index 0000000000..1e5b99807c
--- /dev/null
+++ b/keyboards/wilba_tech/rama_works_koyu/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
diff --git a/keyboards/wilba_tech/rama_works_koyu/rama_works_koyu.h b/keyboards/wilba_tech/rama_works_koyu/rama_works_koyu.h
index f51bc5c613..b9c033e095 100644
--- a/keyboards/wilba_tech/rama_works_koyu/rama_works_koyu.h
+++ b/keyboards/wilba_tech/rama_works_koyu/rama_works_koyu.h
@@ -18,7 +18,7 @@
 
 #include "quantum.h"
 #include "keyboards/wilba_tech/wt_rgb_backlight_keycodes.h"
-#include "keyboards/wilba_tech/via_keycodes.h"
+#include "via.h"
 
 #define ____ KC_NO
 
diff --git a/keyboards/wilba_tech/rama_works_koyu/rules.mk b/keyboards/wilba_tech/rama_works_koyu/rules.mk
index cf6a8a96a0..80a3b32b2b 100644
--- a/keyboards/wilba_tech/rama_works_koyu/rules.mk
+++ b/keyboards/wilba_tech/rama_works_koyu/rules.mk
@@ -20,7 +20,7 @@ OPT_DEFS += -DNO_SUSPEND_POWER_DOWN
 #   change to "no" to disable the options, or define them in the Makefile in
 #   the appropriate keymap folder that will get included automatically
 #
-BOOTMAGIC_ENABLE = no       # Virtual DIP switch configuration(+1000)
+BOOTMAGIC_ENABLE = lite     # Virtual DIP switch configuration(+1000)
 MOUSEKEY_ENABLE = no       # Mouse keys(+4700)
 EXTRAKEY_ENABLE = yes       # Audio control and System control(+450)
 CONSOLE_ENABLE = no         # Console for debug(+400)
@@ -36,8 +36,6 @@ RGBLIGHT_ENABLE = no        # Enable WS2812 RGB underlight.
 # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
 SLEEP_LED_ENABLE = no    # Breathing sleep LED during USB suspend
 
-RAW_ENABLE = yes
-DYNAMIC_KEYMAP_ENABLE = yes
 CIE1931_CURVE = yes
 
 # project specific files
diff --git a/keyboards/wilba_tech/rama_works_m10_b/config.h b/keyboards/wilba_tech/rama_works_m10_b/config.h
index f72ecae85c..d2e67e0c97 100644
--- a/keyboards/wilba_tech/rama_works_m10_b/config.h
+++ b/keyboards/wilba_tech/rama_works_m10_b/config.h
@@ -15,13 +15,12 @@ You should have received a copy of the GNU General Public License
 along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
-#ifndef CONFIG_H
-#define CONFIG_H
+#pragma once
 
 #include "config_common.h"
 
 /* USB Device descriptor parameter */
-#define VENDOR_ID       0x5241 // "RW"
+#define VENDOR_ID       0x5241 // "RA"
 #define PRODUCT_ID      0x00AB // 10-B
 #define DEVICE_VER      0x0001
 #define MANUFACTURER    RAMA WORKS
@@ -180,25 +179,3 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 /* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */
 //#define MIDI_TONE_KEYCODE_OCTAVES 1
-
-#define DYNAMIC_KEYMAP_LAYER_COUNT 4
-
-// EEPROM usage
-
-// TODO: refactor with new user EEPROM code (coming soon)
-#define EEPROM_MAGIC 0x451F
-#define EEPROM_MAGIC_ADDR 34
-// Bump this every time we change what we store
-// This will automatically reset the EEPROM with defaults
-// and avoid loading invalid data from the EEPROM
-#define EEPROM_VERSION 0x08
-#define EEPROM_VERSION_ADDR 36
-
-// Dynamic keymap starts after EEPROM version
-#define DYNAMIC_KEYMAP_EEPROM_ADDR 37
-// Dynamic macro starts after dynamic keymaps (37+(4*10*2)) = (37+80)
-#define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR 117
-#define DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE 907
-#define DYNAMIC_KEYMAP_MACRO_COUNT 16
-
-#endif
diff --git a/keyboards/wilba_tech/rama_works_m10_b/keymaps/knops/config.h b/keyboards/wilba_tech/rama_works_m10_b/keymaps/knops/config.h
index 7c3ec9601d..511dc9537e 100644
--- a/keyboards/wilba_tech/rama_works_m10_b/keymaps/knops/config.h
+++ b/keyboards/wilba_tech/rama_works_m10_b/keymaps/knops/config.h
@@ -19,6 +19,7 @@
 
 #include "../../config.h"
 
+#undef VIA_ENABLE
 #undef RAW_ENABLE
 #undef DYNAMIC_KEYMAP_ENABLE
 
diff --git a/keyboards/wilba_tech/rama_works_m10_b/keymaps/via/keymap.c b/keyboards/wilba_tech/rama_works_m10_b/keymaps/via/keymap.c
new file mode 100644
index 0000000000..8c97a5cfb6
--- /dev/null
+++ b/keyboards/wilba_tech/rama_works_m10_b/keymaps/via/keymap.c
@@ -0,0 +1,13 @@
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+    LAYOUT(
+    		KC_KP_7, KC_KP_8, KC_KP_9, KC_KP_4, KC_KP_5, KC_KP_6, KC_KP_1, KC_KP_2, KC_KP_3, KC_KP_0 ),
+    LAYOUT(
+    		KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ),
+    LAYOUT(
+    		KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ),
+    LAYOUT(
+    		KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS )
+};
diff --git a/keyboards/wilba_tech/rama_works_m10_b/keymaps/via/rules.mk b/keyboards/wilba_tech/rama_works_m10_b/keymaps/via/rules.mk
new file mode 100644
index 0000000000..1e5b99807c
--- /dev/null
+++ b/keyboards/wilba_tech/rama_works_m10_b/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
diff --git a/keyboards/wilba_tech/rama_works_m10_b/rules.mk b/keyboards/wilba_tech/rama_works_m10_b/rules.mk
index 07372d0ac2..e970f6c7a2 100644
--- a/keyboards/wilba_tech/rama_works_m10_b/rules.mk
+++ b/keyboards/wilba_tech/rama_works_m10_b/rules.mk
@@ -14,7 +14,7 @@ BOOTLOADER = atmel-dfu
 # Build Options
 #   change yes to no to disable
 #
-BOOTMAGIC_ENABLE = no      # Virtual DIP switch configuration(+1000)
+BOOTMAGIC_ENABLE = lite    # Virtual DIP switch configuration(+1000)
 MOUSEKEY_ENABLE = no       # Mouse keys(+4700)
 EXTRAKEY_ENABLE = yes       # Audio control and System control(+450)
 CONSOLE_ENABLE = no        # Console for debug(+400)
@@ -29,9 +29,3 @@ UNICODE_ENABLE = no         # Unicode
 BLUETOOTH_ENABLE = no       # Enable Bluetooth with the Adafruit EZ-Key HID
 AUDIO_ENABLE = no           # Audio output on port C6
 FAUXCLICKY_ENABLE = no      # Use buzzer to emulate clicky switches
-
-RAW_ENABLE = yes
-DYNAMIC_KEYMAP_ENABLE = yes
-
-# project specific files
-SRC =	keyboards/wilba_tech/wt_main.c
diff --git a/keyboards/wilba_tech/rama_works_m60_a/config.h b/keyboards/wilba_tech/rama_works_m60_a/config.h
index 1ee76750c1..8381a4db00 100644
--- a/keyboards/wilba_tech/rama_works_m60_a/config.h
+++ b/keyboards/wilba_tech/rama_works_m60_a/config.h
@@ -18,7 +18,7 @@
 #include "config_common.h"
 
 // USB Device descriptor parameter
-#define VENDOR_ID       0x5241 // "RW"
+#define VENDOR_ID       0x5241 // "RA"
 #define PRODUCT_ID      0x060A // 60-A
 #define DEVICE_VER      0x0001
 #define MANUFACTURER    RAMA WORKS
@@ -116,24 +116,6 @@
 #define RGB_BACKLIGHT_LAYER_2_INDICATOR { .color = { .h = 0, .s = 0 }, .index = 255 }
 #define RGB_BACKLIGHT_LAYER_3_INDICATOR { .color = { .h = 0, .s = 0 }, .index = 255 }
 
-#define DYNAMIC_KEYMAP_LAYER_COUNT 4
-
-// EEPROM usage
-
-// TODO: refactor with new user EEPROM code (coming soon)
-#define EEPROM_MAGIC 0x451F
-#define EEPROM_MAGIC_ADDR 34
-// Bump this every time we change what we store
-// This will automatically reset the EEPROM with defaults
-// and avoid loading invalid data from the EEPROM
-#define EEPROM_VERSION 0x08
-#define EEPROM_VERSION_ADDR 36
-
-// Backlight config starts after EEPROM version
-#define RGB_BACKLIGHT_CONFIG_EEPROM_ADDR 37
-// Dynamic keymap starts after backlight config (37+31)
-#define DYNAMIC_KEYMAP_EEPROM_ADDR 68
-// Dynamic macro starts after dynamic keymaps (68+(4*5*14*2)) = (68+560)
-#define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR 628
-#define DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE 396
-#define DYNAMIC_KEYMAP_MACRO_COUNT 16
+// Backlight config starts after VIA's EEPROM usage,
+// dynamic keymaps start after this.
+#define VIA_EEPROM_CUSTOM_CONFIG_SIZE 31
diff --git a/keyboards/wilba_tech/rama_works_m60_a/keymaps/via/keymap.c b/keyboards/wilba_tech/rama_works_m60_a/keymaps/via/keymap.c
new file mode 100644
index 0000000000..7b6d9b756c
--- /dev/null
+++ b/keyboards/wilba_tech/rama_works_m60_a/keymaps/via/keymap.c
@@ -0,0 +1,40 @@
+// M60-A layout
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+// Default layer
+[0] = LAYOUT_60_hhkb(
+	KC_ESC,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_MINS, KC_EQL,  KC_BSLS, KC_DEL,
+	KC_TAB,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_LBRC, KC_RBRC, KC_BSPC,
+	KC_LCTL, KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT, KC_ENT,
+	KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_RSFT, FN_MO13,
+	         KC_LGUI, KC_LALT,                            KC_SPC,                             KC_RALT, FN_MO23),
+
+// Fn1 Layer
+[1] = LAYOUT_60_hhkb(
+	KC_GRV,  KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,  KC_INS,  KC_DEL,
+	KC_CAPS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PSCR, KC_SLCK, KC_PAUS, KC_UP,   KC_TRNS, KC_TRNS,
+	KC_TRNS, KC_VOLD, KC_VOLU, KC_MUTE, KC_EJCT, KC_TRNS, KC_PAST, KC_PSLS, KC_HOME, KC_PGUP, KC_LEFT, KC_RGHT, KC_TRNS,
+	KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PPLS, KC_PMNS, KC_END,  KC_PGDN, KC_DOWN, KC_TRNS, KC_TRNS,
+	         KC_TRNS, KC_TRNS,                            KC_TRNS,                            KC_TRNS, KC_TRNS),
+
+// Fn2 Layer
+[2] = LAYOUT_60_hhkb(
+	KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+	KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+	KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+	KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+	         KC_TRNS, KC_TRNS,                            KC_TRNS,                            KC_TRNS, KC_TRNS),
+
+// Fn3 Layer (zeal60 Configuration)
+[3] = LAYOUT_60_hhkb(
+	KC_TRNS, EF_DEC,  EF_INC,  H1_DEC,  H1_INC,  H2_DEC,  H2_INC,  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, BR_DEC,  BR_INC,  KC_TRNS, KC_TRNS,
+	KC_TRNS, KC_TRNS, KC_TRNS, S1_DEC,  S1_INC,  S2_DEC,  S2_INC,  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, ES_DEC,  ES_INC,  KC_TRNS,
+	KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+	KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+	         KC_TRNS, KC_TRNS,                            KC_TRNS,                            KC_TRNS, KC_TRNS),
+
+};
+
+
diff --git a/keyboards/wilba_tech/rama_works_m60_a/keymaps/via/rules.mk b/keyboards/wilba_tech/rama_works_m60_a/keymaps/via/rules.mk
new file mode 100644
index 0000000000..1e5b99807c
--- /dev/null
+++ b/keyboards/wilba_tech/rama_works_m60_a/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
diff --git a/keyboards/wilba_tech/rama_works_m60_a/rama_works_m60_a.h b/keyboards/wilba_tech/rama_works_m60_a/rama_works_m60_a.h
index 01e096fee6..2c690122ba 100644
--- a/keyboards/wilba_tech/rama_works_m60_a/rama_works_m60_a.h
+++ b/keyboards/wilba_tech/rama_works_m60_a/rama_works_m60_a.h
@@ -17,7 +17,7 @@
 
 #include "quantum.h"
 #include "keyboards/wilba_tech/wt_rgb_backlight_keycodes.h"
-#include "keyboards/wilba_tech/via_keycodes.h"
+#include "via.h"
 
 #define XXX KC_NO
 
diff --git a/keyboards/wilba_tech/rama_works_m60_a/rules.mk b/keyboards/wilba_tech/rama_works_m60_a/rules.mk
index 1dec6c074f..e4e934bdba 100644
--- a/keyboards/wilba_tech/rama_works_m60_a/rules.mk
+++ b/keyboards/wilba_tech/rama_works_m60_a/rules.mk
@@ -20,7 +20,7 @@ OPT_DEFS += -DNO_SUSPEND_POWER_DOWN
 #   change to "no" to disable the options, or define them in the Makefile in
 #   the appropriate keymap folder that will get included automatically
 #
-BOOTMAGIC_ENABLE = no       # Virtual DIP switch configuration(+1000)
+BOOTMAGIC_ENABLE = lite     # Virtual DIP switch configuration(+1000)
 MOUSEKEY_ENABLE = no       # Mouse keys(+4700)
 EXTRAKEY_ENABLE = yes       # Audio control and System control(+450)
 CONSOLE_ENABLE = no         # Console for debug(+400)
@@ -36,8 +36,6 @@ RGBLIGHT_ENABLE = no        # Enable WS2812 RGB underlight.
 # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
 SLEEP_LED_ENABLE = no    # Breathing sleep LED during USB suspend
 
-RAW_ENABLE = yes
-DYNAMIC_KEYMAP_ENABLE = yes
 CIE1931_CURVE = yes
 
 LAYOUTS = 60_hhkb
diff --git a/keyboards/wilba_tech/rama_works_m6_a/config.h b/keyboards/wilba_tech/rama_works_m6_a/config.h
index 07396450d6..1a61604bb4 100644
--- a/keyboards/wilba_tech/rama_works_m6_a/config.h
+++ b/keyboards/wilba_tech/rama_works_m6_a/config.h
@@ -18,7 +18,7 @@
 #include "config_common.h"
 
 /* USB Device descriptor parameter */
-#define VENDOR_ID       0x5241 // "RW"
+#define VENDOR_ID       0x5241 // "RA"
 #define PRODUCT_ID      0x006A // 6-A
 #define DEVICE_VER      0x0001
 #define MANUFACTURER    RAMA WORKS
@@ -103,27 +103,9 @@
 
 #define RGB_BACKLIGHT_ENABLED 0
 
-#define DYNAMIC_KEYMAP_LAYER_COUNT 4
-
-// EEPROM usage
-
-// TODO: refactor with new user EEPROM code (coming soon)
-#define EEPROM_MAGIC 0x451F
-#define EEPROM_MAGIC_ADDR 34
-// Bump this every time we change what we store
-// This will automatically reset the EEPROM with defaults
-// and avoid loading invalid data from the EEPROM
-#define EEPROM_VERSION 0x08
-#define EEPROM_VERSION_ADDR 36
-
 // NOTE: M6-A doesn't use RGB backlight, but we keep this
 // consistent with M6-B which does.
 
-// Backlight config starts after EEPROM version
-#define RGB_BACKLIGHT_CONFIG_EEPROM_ADDR 37
-// Dynamic keymap starts after backlight config (37+43)
-#define DYNAMIC_KEYMAP_EEPROM_ADDR 80
-// Dynamic macro starts after dynamic keymaps (80+(4*6*2)) = (80+48)
-#define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR 128
-#define DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE 896
-#define DYNAMIC_KEYMAP_MACRO_COUNT 16
+// Backlight config starts after VIA's EEPROM usage,
+// dynamic keymaps start after this.
+#define VIA_EEPROM_CUSTOM_CONFIG_SIZE 43
diff --git a/keyboards/wilba_tech/rama_works_m6_a/keymaps/via/keymap.c b/keyboards/wilba_tech/rama_works_m6_a/keymaps/via/keymap.c
new file mode 100644
index 0000000000..7a408fa8aa
--- /dev/null
+++ b/keyboards/wilba_tech/rama_works_m6_a/keymaps/via/keymap.c
@@ -0,0 +1,16 @@
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+    LAYOUT(
+        KC_1, KC_2, KC_3, KC_4, KC_5, KC_6),
+
+    LAYOUT(
+        KC_NO,  KC_NO, KC_NO, KC_NO, KC_NO, KC_NO),
+
+    LAYOUT(
+        KC_NO,  KC_NO, KC_NO, KC_NO, KC_NO, KC_NO),
+
+    LAYOUT(
+        KC_NO,  KC_NO, KC_NO, KC_NO, KC_NO, KC_NO) };
+
diff --git a/keyboards/wilba_tech/rama_works_m6_a/keymaps/via/rules.mk b/keyboards/wilba_tech/rama_works_m6_a/keymaps/via/rules.mk
new file mode 100644
index 0000000000..1e5b99807c
--- /dev/null
+++ b/keyboards/wilba_tech/rama_works_m6_a/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
diff --git a/keyboards/wilba_tech/rama_works_m6_a/rules.mk b/keyboards/wilba_tech/rama_works_m6_a/rules.mk
index 5feee31120..26185cb38f 100644
--- a/keyboards/wilba_tech/rama_works_m6_a/rules.mk
+++ b/keyboards/wilba_tech/rama_works_m6_a/rules.mk
@@ -19,7 +19,7 @@ OPT_DEFS += -DNO_SUSPEND_POWER_DOWN
 # Build Options
 #   change yes to no to disable
 #
-BOOTMAGIC_ENABLE = no       # Virtual DIP switch configuration(+1000)
+BOOTMAGIC_ENABLE = lite       # Virtual DIP switch configuration(+1000)
 MOUSEKEY_ENABLE = no       # Mouse keys(+4700)
 EXTRAKEY_ENABLE = yes       # Audio control and System control(+450)
 CONSOLE_ENABLE = no         # Console for debug(+400)
@@ -34,10 +34,3 @@ RGBLIGHT_ENABLE = no        # Enable WS2812 RGB underlight.  Do not enable this
 
 # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
 SLEEP_LED_ENABLE = no    # Breathing sleep LED during USB suspend
-
-RAW_ENABLE = yes
-DYNAMIC_KEYMAP_ENABLE = yes
-CIE1931_CURVE = no
-
-# project specific files
-SRC =	keyboards/wilba_tech/wt_main.c
diff --git a/keyboards/wilba_tech/rama_works_m6_b/config.h b/keyboards/wilba_tech/rama_works_m6_b/config.h
index 535c64b80f..3ebfd80dab 100644
--- a/keyboards/wilba_tech/rama_works_m6_b/config.h
+++ b/keyboards/wilba_tech/rama_works_m6_b/config.h
@@ -18,7 +18,7 @@
 #include "config_common.h"
 
 /* USB Device descriptor parameter */
-#define VENDOR_ID       0x5241 // "RW"
+#define VENDOR_ID       0x5241 // "RA"
 #define PRODUCT_ID      0x006B // 6-B
 #define DEVICE_VER      0x0001
 #define MANUFACTURER    RAMA WORKS
@@ -149,24 +149,6 @@
 #define RGB_BACKLIGHT_LAYER_2_INDICATOR { .color = { .h = 0, .s = 0 }, .index = 255 }
 #define RGB_BACKLIGHT_LAYER_3_INDICATOR { .color = { .h = 0, .s = 0 }, .index = 255 }
 
-#define DYNAMIC_KEYMAP_LAYER_COUNT 4
-
-// EEPROM usage
-
-// TODO: refactor with new user EEPROM code (coming soon)
-#define EEPROM_MAGIC 0x451F
-#define EEPROM_MAGIC_ADDR 34
-// Bump this every time we change what we store
-// This will automatically reset the EEPROM with defaults
-// and avoid loading invalid data from the EEPROM
-#define EEPROM_VERSION 0x08
-#define EEPROM_VERSION_ADDR 36
-
-// Backlight config starts after EEPROM version
-#define RGB_BACKLIGHT_CONFIG_EEPROM_ADDR 37
-// Dynamic keymap starts after backlight config (37+43)
-#define DYNAMIC_KEYMAP_EEPROM_ADDR 80
-// Dynamic macro starts after dynamic keymaps (80+(4*6*2)) = (80+48)
-#define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR 128
-#define DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE 896
-#define DYNAMIC_KEYMAP_MACRO_COUNT 16
+// Backlight config starts after VIA's EEPROM usage,
+// dynamic keymaps start after this.
+#define VIA_EEPROM_CUSTOM_CONFIG_SIZE 43
diff --git a/keyboards/wilba_tech/rama_works_m6_b/keymaps/via/keymap.c b/keyboards/wilba_tech/rama_works_m6_b/keymaps/via/keymap.c
new file mode 100644
index 0000000000..7a408fa8aa
--- /dev/null
+++ b/keyboards/wilba_tech/rama_works_m6_b/keymaps/via/keymap.c
@@ -0,0 +1,16 @@
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+    LAYOUT(
+        KC_1, KC_2, KC_3, KC_4, KC_5, KC_6),
+
+    LAYOUT(
+        KC_NO,  KC_NO, KC_NO, KC_NO, KC_NO, KC_NO),
+
+    LAYOUT(
+        KC_NO,  KC_NO, KC_NO, KC_NO, KC_NO, KC_NO),
+
+    LAYOUT(
+        KC_NO,  KC_NO, KC_NO, KC_NO, KC_NO, KC_NO) };
+
diff --git a/keyboards/wilba_tech/rama_works_m6_b/keymaps/via/rules.mk b/keyboards/wilba_tech/rama_works_m6_b/keymaps/via/rules.mk
new file mode 100644
index 0000000000..1e5b99807c
--- /dev/null
+++ b/keyboards/wilba_tech/rama_works_m6_b/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
diff --git a/keyboards/wilba_tech/rama_works_m6_b/rules.mk b/keyboards/wilba_tech/rama_works_m6_b/rules.mk
index 4c14af06c4..05212a3be2 100644
--- a/keyboards/wilba_tech/rama_works_m6_b/rules.mk
+++ b/keyboards/wilba_tech/rama_works_m6_b/rules.mk
@@ -19,7 +19,7 @@ OPT_DEFS += -DNO_SUSPEND_POWER_DOWN
 # Build Options
 #   change yes to no to disable
 #
-BOOTMAGIC_ENABLE = no       # Virtual DIP switch configuration(+1000)
+BOOTMAGIC_ENABLE = lite     # Virtual DIP switch configuration(+1000)
 MOUSEKEY_ENABLE = no       # Mouse keys(+4700)
 EXTRAKEY_ENABLE = yes       # Audio control and System control(+450)
 CONSOLE_ENABLE = no         # Console for debug(+400)
@@ -35,8 +35,6 @@ RGBLIGHT_ENABLE = no        # Enable WS2812 RGB underlight.  Do not enable this
 # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
 SLEEP_LED_ENABLE = no    # Breathing sleep LED during USB suspend
 
-RAW_ENABLE = yes
-DYNAMIC_KEYMAP_ENABLE = yes
 CIE1931_CURVE = yes
 
 # project specific files
diff --git a/keyboards/wilba_tech/rama_works_u80_a/config.h b/keyboards/wilba_tech/rama_works_u80_a/config.h
index d0bf0ed1e3..748b2cb291 100644
--- a/keyboards/wilba_tech/rama_works_u80_a/config.h
+++ b/keyboards/wilba_tech/rama_works_u80_a/config.h
@@ -19,7 +19,7 @@
 #include "config_common.h"
 
 /* USB Device descriptor parameter */
-#define VENDOR_ID       0x5241 // "RW"
+#define VENDOR_ID       0x5241 // "RA"
 #define PRODUCT_ID      0x080A // 80-A
 #define DEVICE_VER      0x0001
 #define MANUFACTURER    RAMA WORKS
@@ -232,25 +232,6 @@
 #define RGB_BACKLIGHT_LAYER_2_INDICATOR { .color = { .h = 0, .s = 0 }, .index = 255 }
 #define RGB_BACKLIGHT_LAYER_3_INDICATOR { .color = { .h = 0, .s = 0 }, .index = 255 }
 
-
-#define DYNAMIC_KEYMAP_LAYER_COUNT 4
-
-// EEPROM usage
-
-// TODO: refactor with new user EEPROM code (coming soon)
-#define EEPROM_MAGIC 0x451F
-#define EEPROM_MAGIC_ADDR 34
-// Bump this every time we change what we store
-// This will automatically reset the EEPROM with defaults
-// and avoid loading invalid data from the EEPROM
-#define EEPROM_VERSION 0x07
-#define EEPROM_VERSION_ADDR 36
-
-// Backlight config starts after EEPROM version
-#define RGB_BACKLIGHT_CONFIG_EEPROM_ADDR 37
-// Dynamic keymap starts after backlight config (37+31)
-#define DYNAMIC_KEYMAP_EEPROM_ADDR 68
-// Dynamic macro starts after dynamic keymaps (68+(4*6*17*2)) = (68+816)
-#define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR 884
-#define DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE 140
-#define DYNAMIC_KEYMAP_MACRO_COUNT 16
+// Backlight config starts after VIA's EEPROM usage,
+// dynamic keymaps start after this.
+#define VIA_EEPROM_CUSTOM_CONFIG_SIZE 31
diff --git a/keyboards/wilba_tech/rama_works_u80_a/keymaps/via/keymap.c b/keyboards/wilba_tech/rama_works_u80_a/keymaps/via/keymap.c
new file mode 100644
index 0000000000..548843427c
--- /dev/null
+++ b/keyboards/wilba_tech/rama_works_u80_a/keymaps/via/keymap.c
@@ -0,0 +1,37 @@
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+	  [0] = LAYOUT_all(
+	    KC_ESC,  KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,                    KC_PSCR, KC_SLCK, KC_PAUS,
+	    KC_GRV,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_MINS, KC_EQL,  KC_BSPC,          KC_INS,  KC_HOME, KC_PGUP,
+	    KC_TAB,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_LBRC, KC_RBRC, KC_BSLS,          KC_DEL,  KC_END,  KC_PGDN,
+	    KC_CAPS, KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT, KC_ENT,
+	    KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_RSFT,                                     KC_UP,
+	    KC_LCTL, KC_LGUI, KC_LALT,                            KC_SPC,                                      KC_RALT, MO(1),   KC_RCTL,          KC_LEFT, KC_DOWN, KC_RGHT),
+
+	  [1] = LAYOUT_all(
+	    KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,                   KC_TRNS, KC_TRNS, KC_TRNS,
+	    KC_TRNS, EF_DEC,  EF_INC,  H1_DEC,  H1_INC,  H2_DEC,  H2_INC,  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, BR_DEC,  BR_INC,  KC_TRNS,          KC_TRNS, KC_TRNS, KC_TRNS,
+	    KC_TRNS, KC_TRNS, KC_TRNS, S1_DEC,  S1_INC,  S2_DEC,  S2_INC,  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, ES_DEC,  ES_INC,  KC_TRNS,          KC_TRNS, KC_TRNS, KC_TRNS,
+	    KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+	    KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,                                     KC_TRNS,
+	    KC_TRNS, KC_TRNS, KC_TRNS,                            KC_TRNS,                                     KC_TRNS, KC_TRNS, KC_TRNS,          KC_TRNS, KC_TRNS, KC_TRNS),
+
+	  [2] = LAYOUT_all(
+	    KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,                   KC_TRNS, KC_TRNS, KC_TRNS,
+	    KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,          KC_TRNS, KC_TRNS, KC_TRNS,
+	    KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,          KC_TRNS, KC_TRNS, KC_TRNS,
+	    KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+	    KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,                                     KC_TRNS,
+	    KC_TRNS, KC_TRNS, KC_TRNS,                            KC_TRNS,                                     KC_TRNS, KC_TRNS, KC_TRNS,          KC_TRNS, KC_TRNS, KC_TRNS),
+
+	  [3] = LAYOUT_all(
+	    KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,                   KC_TRNS, KC_TRNS, KC_TRNS,
+	    KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,          KC_TRNS, KC_TRNS, KC_TRNS,
+	    KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,          KC_TRNS, KC_TRNS, KC_TRNS,
+	    KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+	    KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,                                     KC_TRNS,
+	    KC_TRNS, KC_TRNS, KC_TRNS,                            KC_TRNS,                                     KC_TRNS, KC_TRNS, KC_TRNS,          KC_TRNS, KC_TRNS, KC_TRNS)
+};
+
diff --git a/keyboards/wilba_tech/rama_works_u80_a/keymaps/via/rules.mk b/keyboards/wilba_tech/rama_works_u80_a/keymaps/via/rules.mk
new file mode 100644
index 0000000000..1e5b99807c
--- /dev/null
+++ b/keyboards/wilba_tech/rama_works_u80_a/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
diff --git a/keyboards/wilba_tech/rama_works_u80_a/rama_works_u80_a.h b/keyboards/wilba_tech/rama_works_u80_a/rama_works_u80_a.h
index c057db4ccd..c5380e4a6b 100644
--- a/keyboards/wilba_tech/rama_works_u80_a/rama_works_u80_a.h
+++ b/keyboards/wilba_tech/rama_works_u80_a/rama_works_u80_a.h
@@ -18,7 +18,7 @@
 
 #include "quantum.h"
 #include "keyboards/wilba_tech/wt_rgb_backlight_keycodes.h"
-#include "keyboards/wilba_tech/via_keycodes.h"
+#include "via.h"
 
 #define ____ KC_NO
 
diff --git a/keyboards/wilba_tech/rama_works_u80_a/rules.mk b/keyboards/wilba_tech/rama_works_u80_a/rules.mk
index 0f02cd04f3..443776d4a3 100644
--- a/keyboards/wilba_tech/rama_works_u80_a/rules.mk
+++ b/keyboards/wilba_tech/rama_works_u80_a/rules.mk
@@ -14,7 +14,7 @@ BOOTLOADER = atmel-dfu
 # Build Options
 #   change yes to no to disable
 #
-BOOTMAGIC_ENABLE = no      # Virtual DIP switch configuration(+1000)
+BOOTMAGIC_ENABLE = lite    # Virtual DIP switch configuration(+1000)
 MOUSEKEY_ENABLE = no       # Mouse keys(+4700)
 EXTRAKEY_ENABLE = yes       # Audio control and System control(+450)
 CONSOLE_ENABLE = no        # Console for debug(+400)
@@ -29,9 +29,6 @@ UNICODE_ENABLE = no         # Unicode
 BLUETOOTH_ENABLE = no       # Enable Bluetooth with the Adafruit EZ-Key HID
 AUDIO_ENABLE = no           # Audio output on port C6
 FAUXCLICKY_ENABLE = no      # Use buzzer to emulate clicky switches
-
-RAW_ENABLE = yes
-DYNAMIC_KEYMAP_ENABLE = yes
 CIE1931_CURVE = yes
 
 # project specific files
diff --git a/keyboards/wilba_tech/via_api.h b/keyboards/wilba_tech/via_api.h
deleted file mode 100644
index f04bb1b46a..0000000000
--- a/keyboards/wilba_tech/via_api.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/* Copyright 2017 Jason Williams (Wilba)
- *
- * 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/>.
- */
-#pragma once
-
-#define PROTOCOL_VERSION 0x0008
-
-enum via_command_id
-{
-	id_get_protocol_version = 0x01, // always 0x01
-	id_get_keyboard_value,
-	id_set_keyboard_value,
-	id_dynamic_keymap_get_keycode,
-	id_dynamic_keymap_set_keycode,
-	id_dynamic_keymap_reset,
-	id_backlight_config_set_value,
-	id_backlight_config_get_value,
-	id_backlight_config_save,
-	id_eeprom_reset,
-	id_bootloader_jump,
-	id_dynamic_keymap_macro_get_count,
-	id_dynamic_keymap_macro_get_buffer_size,
-	id_dynamic_keymap_macro_get_buffer,
-	id_dynamic_keymap_macro_set_buffer,
-	id_dynamic_keymap_macro_reset,
-	id_dynamic_keymap_get_layer_count,
-	id_dynamic_keymap_get_buffer,
-	id_dynamic_keymap_set_buffer,
-	id_unhandled = 0xFF,
-};
-
-enum via_keyboard_value_id
-{
-  id_uptime = 0x01,
-  id_firmware_version
-};
-
diff --git a/keyboards/wilba_tech/via_keycodes.h b/keyboards/wilba_tech/via_keycodes.h
deleted file mode 100644
index bed48d64b0..0000000000
--- a/keyboards/wilba_tech/via_keycodes.h
+++ /dev/null
@@ -1,77 +0,0 @@
-/* Copyright 2017 Jason Williams (Wilba)
- *
- * 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/>.
- */
-#pragma once
-
-// Can't use SAFE_RANGE here, it might change if someone adds
-// new values to enum quantum_keycodes.
-// Need to keep checking 0x5F10 is still in the safe range.
-// TODO: merge this into quantum_keycodes
-// Backlight keycodes are in range 0x5F00-0x5F0F
-enum via_keycodes {
-	FN_MO13 = 0x5F10,
-	FN_MO23,
-	MACRO00,
-	MACRO01,
-	MACRO02,
-	MACRO03,
-	MACRO04,
-	MACRO05,
-	MACRO06,
-	MACRO07,
-	MACRO08,
-	MACRO09,
-	MACRO10,
-	MACRO11,
-	MACRO12,
-	MACRO13,
-	MACRO14,
-	MACRO15,
-};
-
-enum user_keycodes {
-  USER00 = 0x5F80,
-  USER01,
-  USER02,
-  USER03,
-  USER04,
-  USER05,
-  USER06,
-  USER07,
-  USER08,
-  USER09,
-  USER10,
-  USER11,
-  USER12,
-  USER13,
-  USER14,
-  USER15,
-};
-
-// VIA specific "action functions", introduced with Zeal60
-// These are only valid IDs in action_function()
-// Use FN_TT13, FN_TT23, etc. in keymaps
-enum via_action_functions {
-	TRIPLE_TAP_1_3 = 0x31,
-	TRIPLE_TAP_2_3 = 0x32
-};
-
-// Bitwise OR the above with 0x0F00 to use in F(x) macro
-// This reserves the top 256 of the 4096 range of F(x) keycodes,
-// leaving the rest for use in fn_actions[] or actions in EEPROM.
-#define FN_TT13 F((0x0F00|TRIPLE_TAP_1_3))
-#define FN_TT23 F((0x0F00|TRIPLE_TAP_2_3))
-
-#define TG_NKRO             MAGIC_TOGGLE_NKRO
diff --git a/keyboards/wilba_tech/wt60_a/config.h b/keyboards/wilba_tech/wt60_a/config.h
index 6e1e0e81cc..269afbcb8b 100644
--- a/keyboards/wilba_tech/wt60_a/config.h
+++ b/keyboards/wilba_tech/wt60_a/config.h
@@ -200,24 +200,7 @@
 // the default effect speed (0-3)
 #define MONO_BACKLIGHT_EFFECT_SPEED 0
 
-#define DYNAMIC_KEYMAP_LAYER_COUNT 4
+// Backlight config starts after VIA's EEPROM usage,
+// dynamic keymaps start after this.
+#define VIA_EEPROM_CUSTOM_CONFIG_SIZE 7
 
-// EEPROM usage
-
-// TODO: refactor with new user EEPROM code (coming soon)
-#define EEPROM_MAGIC 0x4520
-#define EEPROM_MAGIC_ADDR 34
-// Bump this every time we change what we store
-// This will automatically reset the EEPROM with defaults
-// and avoid loading invalid data from the EEPROM
-#define EEPROM_VERSION 0x08
-#define EEPROM_VERSION_ADDR 36
-
-// Backlight config starts after EEPROM version
-#define MONO_BACKLIGHT_CONFIG_EEPROM_ADDR 37
-// Dynamic keymap starts after backlight config (37+7)
-#define DYNAMIC_KEYMAP_EEPROM_ADDR 44
-// Dynamic macro starts after dynamic keymaps (44+(4*5*14*2)) = (44+560)
-#define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR 604
-#define DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE 420
-#define DYNAMIC_KEYMAP_MACRO_COUNT 16
diff --git a/keyboards/wilba_tech/wt60_a/keymaps/via/rules.mk b/keyboards/wilba_tech/wt60_a/keymaps/via/rules.mk
index 4880a57bec..1e5b99807c 100644
--- a/keyboards/wilba_tech/wt60_a/keymaps/via/rules.mk
+++ b/keyboards/wilba_tech/wt60_a/keymaps/via/rules.mk
@@ -1,2 +1 @@
-RAW_ENABLE = yes
-DYNAMIC_KEYMAP_ENABLE = yes
+VIA_ENABLE = yes
diff --git a/keyboards/wilba_tech/wt60_a/rules.mk b/keyboards/wilba_tech/wt60_a/rules.mk
index 111c94ee80..c59e94e83c 100644
--- a/keyboards/wilba_tech/wt60_a/rules.mk
+++ b/keyboards/wilba_tech/wt60_a/rules.mk
@@ -14,7 +14,7 @@ BOOTLOADER = atmel-dfu
 # Build Options
 #   change yes to no to disable
 #
-BOOTMAGIC_ENABLE = no      # Virtual DIP switch configuration(+1000)
+BOOTMAGIC_ENABLE = lite    # Virtual DIP switch configuration(+1000)
 MOUSEKEY_ENABLE = no       # Mouse keys(+4700)
 EXTRAKEY_ENABLE = yes       # Audio control and System control(+450)
 CONSOLE_ENABLE = no        # Console for debug(+400)
diff --git a/keyboards/wilba_tech/wt60_d/config.h b/keyboards/wilba_tech/wt60_d/config.h
index 066465d424..acb69ba042 100644
--- a/keyboards/wilba_tech/wt60_d/config.h
+++ b/keyboards/wilba_tech/wt60_d/config.h
@@ -178,23 +178,3 @@
 
 /* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */
 //#define MIDI_TONE_KEYCODE_OCTAVES 1
-
-#define DYNAMIC_KEYMAP_LAYER_COUNT 4
-
-// EEPROM usage
-
-// TODO: refactor with new user EEPROM code (coming soon)
-#define EEPROM_MAGIC 0x451F
-#define EEPROM_MAGIC_ADDR 34
-// Bump this every time we change what we store
-// This will automatically reset the EEPROM with defaults
-// and avoid loading invalid data from the EEPROM
-#define EEPROM_VERSION 0x08
-#define EEPROM_VERSION_ADDR 36
-
-// Dynamic keymap starts after EEPROM version
-#define DYNAMIC_KEYMAP_EEPROM_ADDR 37
-// Dynamic macro starts after dynamic keymaps (37+(4*5*14*2)) = (37+560)
-#define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR 597
-#define DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE 427
-#define DYNAMIC_KEYMAP_MACRO_COUNT 16
diff --git a/keyboards/wilba_tech/wt60_d/keymaps/via/rules.mk b/keyboards/wilba_tech/wt60_d/keymaps/via/rules.mk
index 4880a57bec..1e5b99807c 100644
--- a/keyboards/wilba_tech/wt60_d/keymaps/via/rules.mk
+++ b/keyboards/wilba_tech/wt60_d/keymaps/via/rules.mk
@@ -1,2 +1 @@
-RAW_ENABLE = yes
-DYNAMIC_KEYMAP_ENABLE = yes
+VIA_ENABLE = yes
diff --git a/keyboards/wilba_tech/wt60_d/rules.mk b/keyboards/wilba_tech/wt60_d/rules.mk
index 07372d0ac2..a5c98a1c60 100644
--- a/keyboards/wilba_tech/wt60_d/rules.mk
+++ b/keyboards/wilba_tech/wt60_d/rules.mk
@@ -14,7 +14,7 @@ BOOTLOADER = atmel-dfu
 # Build Options
 #   change yes to no to disable
 #
-BOOTMAGIC_ENABLE = no      # Virtual DIP switch configuration(+1000)
+BOOTMAGIC_ENABLE = lite      # Virtual DIP switch configuration(+1000)
 MOUSEKEY_ENABLE = no       # Mouse keys(+4700)
 EXTRAKEY_ENABLE = yes       # Audio control and System control(+450)
 CONSOLE_ENABLE = no        # Console for debug(+400)
@@ -29,9 +29,3 @@ UNICODE_ENABLE = no         # Unicode
 BLUETOOTH_ENABLE = no       # Enable Bluetooth with the Adafruit EZ-Key HID
 AUDIO_ENABLE = no           # Audio output on port C6
 FAUXCLICKY_ENABLE = no      # Use buzzer to emulate clicky switches
-
-RAW_ENABLE = yes
-DYNAMIC_KEYMAP_ENABLE = yes
-
-# project specific files
-SRC =	keyboards/wilba_tech/wt_main.c
diff --git a/keyboards/wilba_tech/wt60_d/wt60_d.c b/keyboards/wilba_tech/wt60_d/wt60_d.c
index ccff6d62c9..52a7733683 100644
--- a/keyboards/wilba_tech/wt60_d/wt60_d.c
+++ b/keyboards/wilba_tech/wt60_d/wt60_d.c
@@ -1,17 +1 @@
-/* Copyright 2018 Jason Williams (Wilba)
- *
- * 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/>.
- */
-
-// Nothing to see here, move along... ;-)
+#include "wt60_d.h"
diff --git a/keyboards/wilba_tech/wt65_a/config.h b/keyboards/wilba_tech/wt65_a/config.h
index 9d67c317b2..ad4c120f4d 100644
--- a/keyboards/wilba_tech/wt65_a/config.h
+++ b/keyboards/wilba_tech/wt65_a/config.h
@@ -197,24 +197,7 @@
 // the default effect speed (0-3)
 #define MONO_BACKLIGHT_EFFECT_SPEED 0
 
-#define DYNAMIC_KEYMAP_LAYER_COUNT 4
+// Backlight config starts after VIA's EEPROM usage,
+// dynamic keymaps start after this.
+#define VIA_EEPROM_CUSTOM_CONFIG_SIZE 7
 
-// EEPROM usage
-
-// TODO: refactor with new user EEPROM code (coming soon)
-#define EEPROM_MAGIC 0x4520
-#define EEPROM_MAGIC_ADDR 34
-// Bump this every time we change what we store
-// This will automatically reset the EEPROM with defaults
-// and avoid loading invalid data from the EEPROM
-#define EEPROM_VERSION 0x08
-#define EEPROM_VERSION_ADDR 36
-
-// Backlight config starts after EEPROM version
-#define MONO_BACKLIGHT_CONFIG_EEPROM_ADDR 37
-// Dynamic keymap starts after  backlight config (37+7)
-#define DYNAMIC_KEYMAP_EEPROM_ADDR 44
-// Dynamic macro starts after dynamic keymaps (44+(4*5*15*2)) = (44+600)
-#define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR 644
-#define DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE 380
-#define DYNAMIC_KEYMAP_MACRO_COUNT 16
diff --git a/keyboards/wilba_tech/wt65_a/keymaps/via/rules.mk b/keyboards/wilba_tech/wt65_a/keymaps/via/rules.mk
index 4880a57bec..1e5b99807c 100644
--- a/keyboards/wilba_tech/wt65_a/keymaps/via/rules.mk
+++ b/keyboards/wilba_tech/wt65_a/keymaps/via/rules.mk
@@ -1,2 +1 @@
-RAW_ENABLE = yes
-DYNAMIC_KEYMAP_ENABLE = yes
+VIA_ENABLE = yes
diff --git a/keyboards/wilba_tech/wt65_a/rules.mk b/keyboards/wilba_tech/wt65_a/rules.mk
index 111c94ee80..c59e94e83c 100644
--- a/keyboards/wilba_tech/wt65_a/rules.mk
+++ b/keyboards/wilba_tech/wt65_a/rules.mk
@@ -14,7 +14,7 @@ BOOTLOADER = atmel-dfu
 # Build Options
 #   change yes to no to disable
 #
-BOOTMAGIC_ENABLE = no      # Virtual DIP switch configuration(+1000)
+BOOTMAGIC_ENABLE = lite    # Virtual DIP switch configuration(+1000)
 MOUSEKEY_ENABLE = no       # Mouse keys(+4700)
 EXTRAKEY_ENABLE = yes       # Audio control and System control(+450)
 CONSOLE_ENABLE = no        # Console for debug(+400)
diff --git a/keyboards/wilba_tech/wt65_b/config.h b/keyboards/wilba_tech/wt65_b/config.h
index 8b2437fc92..f98fa4e729 100644
--- a/keyboards/wilba_tech/wt65_b/config.h
+++ b/keyboards/wilba_tech/wt65_b/config.h
@@ -197,24 +197,7 @@
 // the default effect speed (0-3)
 #define MONO_BACKLIGHT_EFFECT_SPEED 0
 
-#define DYNAMIC_KEYMAP_LAYER_COUNT 4
+// Backlight config starts after VIA's EEPROM usage,
+// dynamic keymaps start after this.
+#define VIA_EEPROM_CUSTOM_CONFIG_SIZE 7
 
-// EEPROM usage
-
-// TODO: refactor with new user EEPROM code (coming soon)
-#define EEPROM_MAGIC 0x4520
-#define EEPROM_MAGIC_ADDR 34
-// Bump this every time we change what we store
-// This will automatically reset the EEPROM with defaults
-// and avoid loading invalid data from the EEPROM
-#define EEPROM_VERSION 0x08
-#define EEPROM_VERSION_ADDR 36
-
-// Backlight config starts after EEPROM version
-#define MONO_BACKLIGHT_CONFIG_EEPROM_ADDR 37
-// Dynamic keymap starts after  backlight config (37+7)
-#define DYNAMIC_KEYMAP_EEPROM_ADDR 44
-// Dynamic macro starts after dynamic keymaps (44+(4*5*15*2)) = (44+600)
-#define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR 644
-#define DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE 380
-#define DYNAMIC_KEYMAP_MACRO_COUNT 16
diff --git a/keyboards/wilba_tech/wt65_b/keymaps/via/rules.mk b/keyboards/wilba_tech/wt65_b/keymaps/via/rules.mk
index 4880a57bec..1e5b99807c 100644
--- a/keyboards/wilba_tech/wt65_b/keymaps/via/rules.mk
+++ b/keyboards/wilba_tech/wt65_b/keymaps/via/rules.mk
@@ -1,2 +1 @@
-RAW_ENABLE = yes
-DYNAMIC_KEYMAP_ENABLE = yes
+VIA_ENABLE = yes
diff --git a/keyboards/wilba_tech/wt65_b/rules.mk b/keyboards/wilba_tech/wt65_b/rules.mk
index 111c94ee80..c59e94e83c 100644
--- a/keyboards/wilba_tech/wt65_b/rules.mk
+++ b/keyboards/wilba_tech/wt65_b/rules.mk
@@ -14,7 +14,7 @@ BOOTLOADER = atmel-dfu
 # Build Options
 #   change yes to no to disable
 #
-BOOTMAGIC_ENABLE = no      # Virtual DIP switch configuration(+1000)
+BOOTMAGIC_ENABLE = lite    # Virtual DIP switch configuration(+1000)
 MOUSEKEY_ENABLE = no       # Mouse keys(+4700)
 EXTRAKEY_ENABLE = yes       # Audio control and System control(+450)
 CONSOLE_ENABLE = no        # Console for debug(+400)
diff --git a/keyboards/wilba_tech/wt69_a/config.h b/keyboards/wilba_tech/wt69_a/config.h
index 57546cb491..b107453441 100644
--- a/keyboards/wilba_tech/wt69_a/config.h
+++ b/keyboards/wilba_tech/wt69_a/config.h
@@ -178,26 +178,3 @@
 
 /* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */
 //#define MIDI_TONE_KEYCODE_OCTAVES 1
-
-// Does not use WT_MONO_BACKLIGHT
-//#define WT_MONO_BACKLIGHT
-
-#define DYNAMIC_KEYMAP_LAYER_COUNT 4
-
-// EEPROM usage
-
-// TODO: refactor with new user EEPROM code (coming soon)
-#define EEPROM_MAGIC 0x451F
-#define EEPROM_MAGIC_ADDR 34
-// Bump this every time we change what we store
-// This will automatically reset the EEPROM with defaults
-// and avoid loading invalid data from the EEPROM
-#define EEPROM_VERSION 0x08
-#define EEPROM_VERSION_ADDR 36
-
-// Dynamic keymap starts after EEPROM version
-#define DYNAMIC_KEYMAP_EEPROM_ADDR 37
-// Dynamic macro starts after dynamic keymaps (37+(4*5*17*2)) = (37+680)
-#define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR 717
-#define DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE 307
-#define DYNAMIC_KEYMAP_MACRO_COUNT 16
diff --git a/keyboards/wilba_tech/wt69_a/keymaps/via/rules.mk b/keyboards/wilba_tech/wt69_a/keymaps/via/rules.mk
index 4880a57bec..1e5b99807c 100644
--- a/keyboards/wilba_tech/wt69_a/keymaps/via/rules.mk
+++ b/keyboards/wilba_tech/wt69_a/keymaps/via/rules.mk
@@ -1,2 +1 @@
-RAW_ENABLE = yes
-DYNAMIC_KEYMAP_ENABLE = yes
+VIA_ENABLE = yes
diff --git a/keyboards/wilba_tech/wt69_a/rules.mk b/keyboards/wilba_tech/wt69_a/rules.mk
index 7d1c2aa1b1..25f3ecbf19 100644
--- a/keyboards/wilba_tech/wt69_a/rules.mk
+++ b/keyboards/wilba_tech/wt69_a/rules.mk
@@ -14,7 +14,7 @@ BOOTLOADER = atmel-dfu
 # Build Options
 #   change yes to no to disable
 #
-BOOTMAGIC_ENABLE = no      # Virtual DIP switch configuration(+1000)
+BOOTMAGIC_ENABLE = lite    # Virtual DIP switch configuration(+1000)
 MOUSEKEY_ENABLE = no       # Mouse keys(+4700)
 EXTRAKEY_ENABLE = yes       # Audio control and System control(+450)
 CONSOLE_ENABLE = no        # Console for debug(+400)
diff --git a/keyboards/wilba_tech/wt75_a/config.h b/keyboards/wilba_tech/wt75_a/config.h
index f63bbf69c7..0c0a2ff082 100644
--- a/keyboards/wilba_tech/wt75_a/config.h
+++ b/keyboards/wilba_tech/wt75_a/config.h
@@ -200,24 +200,7 @@
 // the default effect speed (0-3)
 #define MONO_BACKLIGHT_EFFECT_SPEED 0
 
-#define DYNAMIC_KEYMAP_LAYER_COUNT 4
+// Backlight config starts after VIA's EEPROM usage,
+// dynamic keymaps start after this.
+#define VIA_EEPROM_CUSTOM_CONFIG_SIZE 7
 
-// EEPROM usage
-
-// TODO: refactor with new user EEPROM code (coming soon)
-#define EEPROM_MAGIC 0x4520
-#define EEPROM_MAGIC_ADDR 34
-// Bump this every time we change what we store
-// This will automatically reset the EEPROM with defaults
-// and avoid loading invalid data from the EEPROM
-#define EEPROM_VERSION 0x08
-#define EEPROM_VERSION_ADDR 36
-
-// Backlight config starts after EEPROM version
-#define MONO_BACKLIGHT_CONFIG_EEPROM_ADDR 37
-// Dynamic keymap starts after backlight config (37+7)
-#define DYNAMIC_KEYMAP_EEPROM_ADDR 44
-// Dynamic macro starts after dynamic keymaps (44+(4*6*15*2)) = (44+720)
-#define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR 764
-#define DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE 260
-#define DYNAMIC_KEYMAP_MACRO_COUNT 16
diff --git a/keyboards/wilba_tech/wt75_a/keymaps/via/rules.mk b/keyboards/wilba_tech/wt75_a/keymaps/via/rules.mk
index 4880a57bec..1e5b99807c 100644
--- a/keyboards/wilba_tech/wt75_a/keymaps/via/rules.mk
+++ b/keyboards/wilba_tech/wt75_a/keymaps/via/rules.mk
@@ -1,2 +1 @@
-RAW_ENABLE = yes
-DYNAMIC_KEYMAP_ENABLE = yes
+VIA_ENABLE = yes
diff --git a/keyboards/wilba_tech/wt75_a/rules.mk b/keyboards/wilba_tech/wt75_a/rules.mk
index 111c94ee80..c59e94e83c 100644
--- a/keyboards/wilba_tech/wt75_a/rules.mk
+++ b/keyboards/wilba_tech/wt75_a/rules.mk
@@ -14,7 +14,7 @@ BOOTLOADER = atmel-dfu
 # Build Options
 #   change yes to no to disable
 #
-BOOTMAGIC_ENABLE = no      # Virtual DIP switch configuration(+1000)
+BOOTMAGIC_ENABLE = lite    # Virtual DIP switch configuration(+1000)
 MOUSEKEY_ENABLE = no       # Mouse keys(+4700)
 EXTRAKEY_ENABLE = yes       # Audio control and System control(+450)
 CONSOLE_ENABLE = no        # Console for debug(+400)
diff --git a/keyboards/wilba_tech/wt75_b/config.h b/keyboards/wilba_tech/wt75_b/config.h
index b173b02417..0c7b3dbfad 100644
--- a/keyboards/wilba_tech/wt75_b/config.h
+++ b/keyboards/wilba_tech/wt75_b/config.h
@@ -200,24 +200,7 @@
 // the default effect speed (0-3)
 #define MONO_BACKLIGHT_EFFECT_SPEED 0
 
-#define DYNAMIC_KEYMAP_LAYER_COUNT 4
+// Backlight config starts after VIA's EEPROM usage,
+// dynamic keymaps start after this.
+#define VIA_EEPROM_CUSTOM_CONFIG_SIZE 7
 
-// EEPROM usage
-
-// TODO: refactor with new user EEPROM code (coming soon)
-#define EEPROM_MAGIC 0x4520
-#define EEPROM_MAGIC_ADDR 34
-// Bump this every time we change what we store
-// This will automatically reset the EEPROM with defaults
-// and avoid loading invalid data from the EEPROM
-#define EEPROM_VERSION 0x08
-#define EEPROM_VERSION_ADDR 36
-
-// Backlight config starts after EEPROM version
-#define MONO_BACKLIGHT_CONFIG_EEPROM_ADDR 37
-// Dynamic keymap starts after backlight config (37+7)
-#define DYNAMIC_KEYMAP_EEPROM_ADDR 44
-// Dynamic macro starts after dynamic keymaps (44+(4*6*16*2)) = (44+768)
-#define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR 812
-#define DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE 212
-#define DYNAMIC_KEYMAP_MACRO_COUNT 16
diff --git a/keyboards/wilba_tech/wt75_b/keymaps/via/rules.mk b/keyboards/wilba_tech/wt75_b/keymaps/via/rules.mk
index 4880a57bec..1e5b99807c 100644
--- a/keyboards/wilba_tech/wt75_b/keymaps/via/rules.mk
+++ b/keyboards/wilba_tech/wt75_b/keymaps/via/rules.mk
@@ -1,2 +1 @@
-RAW_ENABLE = yes
-DYNAMIC_KEYMAP_ENABLE = yes
+VIA_ENABLE = yes
diff --git a/keyboards/wilba_tech/wt75_b/rules.mk b/keyboards/wilba_tech/wt75_b/rules.mk
index 111c94ee80..c59e94e83c 100644
--- a/keyboards/wilba_tech/wt75_b/rules.mk
+++ b/keyboards/wilba_tech/wt75_b/rules.mk
@@ -14,7 +14,7 @@ BOOTLOADER = atmel-dfu
 # Build Options
 #   change yes to no to disable
 #
-BOOTMAGIC_ENABLE = no      # Virtual DIP switch configuration(+1000)
+BOOTMAGIC_ENABLE = lite    # Virtual DIP switch configuration(+1000)
 MOUSEKEY_ENABLE = no       # Mouse keys(+4700)
 EXTRAKEY_ENABLE = yes       # Audio control and System control(+450)
 CONSOLE_ENABLE = no        # Console for debug(+400)
diff --git a/keyboards/wilba_tech/wt75_c/config.h b/keyboards/wilba_tech/wt75_c/config.h
index 7105998774..b84f2444d8 100644
--- a/keyboards/wilba_tech/wt75_c/config.h
+++ b/keyboards/wilba_tech/wt75_c/config.h
@@ -198,26 +198,9 @@
 #define MONO_BACKLIGHT_EFFECT 1
 
 // the default effect speed (0-3)
-#define MONO_BACKLIGHT_EFFECT_SPEED 0
+#define MONO_BACKLIGHT_EFFECT_SPEED 000
 
-#define DYNAMIC_KEYMAP_LAYER_COUNT 4
+// Backlight config starts after VIA's EEPROM usage,
+// dynamic keymaps start after this.
+#define VIA_EEPROM_CUSTOM_CONFIG_SIZE 7
 
-// EEPROM usage
-
-// TODO: refactor with new user EEPROM code (coming soon)
-#define EEPROM_MAGIC 0x4520
-#define EEPROM_MAGIC_ADDR 34
-// Bump this every time we change what we store
-// This will automatically reset the EEPROM with defaults
-// and avoid loading invalid data from the EEPROM
-#define EEPROM_VERSION 0x08
-#define EEPROM_VERSION_ADDR 36
-
-// Backlight config starts after EEPROM version
-#define MONO_BACKLIGHT_CONFIG_EEPROM_ADDR 37
-// Dynamic keymap starts after backlight config (37+7)
-#define DYNAMIC_KEYMAP_EEPROM_ADDR 44
-// Dynamic macro starts after dynamic keymaps (44+(4*6*16*2)) = (44+768)
-#define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR 812
-#define DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE 212
-#define DYNAMIC_KEYMAP_MACRO_COUNT 16
diff --git a/keyboards/wilba_tech/wt75_c/keymaps/via/rules.mk b/keyboards/wilba_tech/wt75_c/keymaps/via/rules.mk
index 4880a57bec..1e5b99807c 100644
--- a/keyboards/wilba_tech/wt75_c/keymaps/via/rules.mk
+++ b/keyboards/wilba_tech/wt75_c/keymaps/via/rules.mk
@@ -1,2 +1 @@
-RAW_ENABLE = yes
-DYNAMIC_KEYMAP_ENABLE = yes
+VIA_ENABLE = yes
diff --git a/keyboards/wilba_tech/wt75_c/rules.mk b/keyboards/wilba_tech/wt75_c/rules.mk
index 111c94ee80..c59e94e83c 100644
--- a/keyboards/wilba_tech/wt75_c/rules.mk
+++ b/keyboards/wilba_tech/wt75_c/rules.mk
@@ -14,7 +14,7 @@ BOOTLOADER = atmel-dfu
 # Build Options
 #   change yes to no to disable
 #
-BOOTMAGIC_ENABLE = no      # Virtual DIP switch configuration(+1000)
+BOOTMAGIC_ENABLE = lite    # Virtual DIP switch configuration(+1000)
 MOUSEKEY_ENABLE = no       # Mouse keys(+4700)
 EXTRAKEY_ENABLE = yes       # Audio control and System control(+450)
 CONSOLE_ENABLE = no        # Console for debug(+400)
diff --git a/keyboards/wilba_tech/wt80_a/config.h b/keyboards/wilba_tech/wt80_a/config.h
index 15dac9047f..b706956ef9 100644
--- a/keyboards/wilba_tech/wt80_a/config.h
+++ b/keyboards/wilba_tech/wt80_a/config.h
@@ -197,24 +197,6 @@
 // the default effect speed (0-3)
 #define MONO_BACKLIGHT_EFFECT_SPEED 0
 
-#define DYNAMIC_KEYMAP_LAYER_COUNT 4
-
-// EEPROM usage
-
-// TODO: refactor with new user EEPROM code (coming soon)
-#define EEPROM_MAGIC 0x4520
-#define EEPROM_MAGIC_ADDR 34
-// Bump this every time we change what we store
-// This will automatically reset the EEPROM with defaults
-// and avoid loading invalid data from the EEPROM
-#define EEPROM_VERSION 0x08
-#define EEPROM_VERSION_ADDR 36
-
-// Backlight config starts after EEPROM version
-#define MONO_BACKLIGHT_CONFIG_EEPROM_ADDR 37
-// Dynamic keymap starts after backlight config (37+7)
-#define DYNAMIC_KEYMAP_EEPROM_ADDR 44
-// Dynamic macro starts after dynamic keymaps (44+(4*6*17*2)) = (44+816)
-#define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR 860
-#define DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE 164
-#define DYNAMIC_KEYMAP_MACRO_COUNT 16
+// Backlight config starts after VIA's EEPROM usage,
+// dynamic keymaps start after this.
+#define VIA_EEPROM_CUSTOM_CONFIG_SIZE 7
diff --git a/keyboards/wilba_tech/wt80_a/keymaps/via/rules.mk b/keyboards/wilba_tech/wt80_a/keymaps/via/rules.mk
index 4880a57bec..1e5b99807c 100644
--- a/keyboards/wilba_tech/wt80_a/keymaps/via/rules.mk
+++ b/keyboards/wilba_tech/wt80_a/keymaps/via/rules.mk
@@ -1,2 +1 @@
-RAW_ENABLE = yes
-DYNAMIC_KEYMAP_ENABLE = yes
+VIA_ENABLE = yes
diff --git a/keyboards/wilba_tech/wt80_a/rules.mk b/keyboards/wilba_tech/wt80_a/rules.mk
index 111c94ee80..c59e94e83c 100644
--- a/keyboards/wilba_tech/wt80_a/rules.mk
+++ b/keyboards/wilba_tech/wt80_a/rules.mk
@@ -14,7 +14,7 @@ BOOTLOADER = atmel-dfu
 # Build Options
 #   change yes to no to disable
 #
-BOOTMAGIC_ENABLE = no      # Virtual DIP switch configuration(+1000)
+BOOTMAGIC_ENABLE = lite    # Virtual DIP switch configuration(+1000)
 MOUSEKEY_ENABLE = no       # Mouse keys(+4700)
 EXTRAKEY_ENABLE = yes       # Audio control and System control(+450)
 CONSOLE_ENABLE = no        # Console for debug(+400)
diff --git a/keyboards/wilba_tech/wt8_a/config.h b/keyboards/wilba_tech/wt8_a/config.h
index 08556650da..9af0d00507 100644
--- a/keyboards/wilba_tech/wt8_a/config.h
+++ b/keyboards/wilba_tech/wt8_a/config.h
@@ -90,26 +90,3 @@
  *
  */
 //#define FORCE_NKRO
-
-// Does not use WT_MONO_BACKLIGHT
-// #define WT_MONO_BACKLIGHT
-
-#define DYNAMIC_KEYMAP_LAYER_COUNT 4
-
-// EEPROM usage
-
-// TODO: refactor with new user EEPROM code (coming soon)
-#define EEPROM_MAGIC 0x451F
-#define EEPROM_MAGIC_ADDR 34
-// Bump this every time we change what we store
-// This will automatically reset the EEPROM with defaults
-// and avoid loading invalid data from the EEPROM
-#define EEPROM_VERSION 0x08
-#define EEPROM_VERSION_ADDR 36
-
-// Dynamic keymap starts after EEPROM version
-#define DYNAMIC_KEYMAP_EEPROM_ADDR 37
-// Dynamic macro starts after dynamic keymaps (37+(4*1*8*2)) = (37+64)
-#define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR 101
-#define DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE 923
-#define DYNAMIC_KEYMAP_MACRO_COUNT 16
diff --git a/keyboards/wilba_tech/wt8_a/keymaps/via/rules.mk b/keyboards/wilba_tech/wt8_a/keymaps/via/rules.mk
index f072c67198..1e5b99807c 100644
--- a/keyboards/wilba_tech/wt8_a/keymaps/via/rules.mk
+++ b/keyboards/wilba_tech/wt8_a/keymaps/via/rules.mk
@@ -1,68 +1 @@
-# project specific files
-SRC =	keyboards/wilba_tech/wt_main.c
-		
-# MCU name
-MCU = atmega32u4
-
-# Processor frequency.
-#     This will define a symbol, F_CPU, in all source code files equal to the
-#     processor frequency in Hz. You can then use this symbol in your source code to
-#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
-#     automatically to create a 32-bit value in your source code.
-#
-#     This will be an integer division of F_USB below, as it is sourced by
-#     F_USB after it has run through any CPU prescalers. Note that this value
-#     does not *change* the processor frequency - it should merely be updated to
-#     reflect the processor speed set externally so that the code can use accurate
-#     software delays.
-F_CPU = 16000000
-
-
-#
-# LUFA specific
-#
-# Target architecture (see library "Board Types" documentation).
-ARCH = AVR8
-
-# Input clock frequency.
-#     This will define a symbol, F_USB, in all source code files equal to the
-#     input clock frequency (before any prescaling is performed) in Hz. This value may
-#     differ from F_CPU if prescaling is used on the latter, and is required as the
-#     raw input clock is fed directly to the PLL sections of the AVR for high speed
-#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
-#     at the end, this will be done automatically to create a 32-bit value in your
-#     source code.
-#
-#     If no clock division is performed on the input clock inside the AVR (via the
-#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
-F_USB = $(F_CPU)
-
-# Interrupt driven control endpoint task(+60)
-OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
-
-
-# Boot Section
-BOOTLOADER = atmel-dfu
-
-
-# Build Options
-#   change yes to no to disable
-#
-BOOTMAGIC_ENABLE = no      # Virtual DIP switch configuration(+1000)
-MOUSEKEY_ENABLE = no       # Mouse keys(+4700)
-EXTRAKEY_ENABLE = yes       # Audio control and System control(+450)
-CONSOLE_ENABLE = no        # Console for debug(+400)
-COMMAND_ENABLE = no        # Commands for debug and configuration
-# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
-SLEEP_LED_ENABLE = no       # Breathing sleep LED during USB suspend
-# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
-NKRO_ENABLE = yes            # USB Nkey Rollover
-BACKLIGHT_ENABLE = no       # Enable keyboard backlight functionality on B7 by default
-MIDI_ENABLE = no            # MIDI support (+2400 to 4200, depending on config)
-UNICODE_ENABLE = no         # Unicode
-BLUETOOTH_ENABLE = no       # Enable Bluetooth with the Adafruit EZ-Key HID
-AUDIO_ENABLE = no           # Audio output on port C6
-FAUXCLICKY_ENABLE = no      # Use buzzer to emulate clicky switches
-
-RAW_ENABLE = yes
-DYNAMIC_KEYMAP_ENABLE = yes
\ No newline at end of file
+VIA_ENABLE = yes
diff --git a/keyboards/wilba_tech/wt8_a/rules.mk b/keyboards/wilba_tech/wt8_a/rules.mk
index 7d1c2aa1b1..25f3ecbf19 100644
--- a/keyboards/wilba_tech/wt8_a/rules.mk
+++ b/keyboards/wilba_tech/wt8_a/rules.mk
@@ -14,7 +14,7 @@ BOOTLOADER = atmel-dfu
 # Build Options
 #   change yes to no to disable
 #
-BOOTMAGIC_ENABLE = no      # Virtual DIP switch configuration(+1000)
+BOOTMAGIC_ENABLE = lite    # Virtual DIP switch configuration(+1000)
 MOUSEKEY_ENABLE = no       # Mouse keys(+4700)
 EXTRAKEY_ENABLE = yes       # Audio control and System control(+450)
 CONSOLE_ENABLE = no        # Console for debug(+400)
diff --git a/keyboards/wilba_tech/wt_main.c b/keyboards/wilba_tech/wt_main.c
index 32fc6f9e44..1ad12ee4a5 100644
--- a/keyboards/wilba_tech/wt_main.c
+++ b/keyboards/wilba_tech/wt_main.c
@@ -23,361 +23,177 @@
 #if MONO_BACKLIGHT_ENABLED
 #include "keyboards/wilba_tech/wt_mono_backlight.h"
 #endif // MONO_BACKLIGHT_ENABLED
-#include "keyboards/wilba_tech/via_api.h" // Temporary hack
-#include "keyboards/wilba_tech/via_keycodes.h" // Temporary hack
 
-#include "raw_hid.h"
-#include "dynamic_keymap.h"
-#include "timer.h"
+#include "via.h"
+
+#ifndef VIA_ENABLE
 #include "tmk_core/common/eeprom.h"
-
-bool eeprom_is_valid(void)
-{
-	return (eeprom_read_word(((void*)EEPROM_MAGIC_ADDR)) == EEPROM_MAGIC &&
-			eeprom_read_byte(((void*)EEPROM_VERSION_ADDR)) == EEPROM_VERSION);
-}
-
-void eeprom_set_valid(bool valid)
-{
-	eeprom_update_word(((void*)EEPROM_MAGIC_ADDR), valid ? EEPROM_MAGIC : 0xFFFF);
-	eeprom_update_byte(((void*)EEPROM_VERSION_ADDR), valid ? EEPROM_VERSION : 0xFF);
-}
-
-void eeprom_reset(void)
-{
-	// Set the Zeal60 specific EEPROM state as invalid.
-	eeprom_set_valid(false);
-	// Set the TMK/QMK EEPROM state as invalid.
-	eeconfig_disable();
-}
-
-#ifdef RAW_ENABLE
-
-void raw_hid_receive( uint8_t *data, uint8_t length )
-{
-	uint8_t *command_id = &(data[0]);
-	uint8_t *command_data = &(data[1]);
-	switch ( *command_id )
-	{
-		case id_get_protocol_version:
-		{
-			command_data[0] = PROTOCOL_VERSION >> 8;
-			command_data[1] = PROTOCOL_VERSION & 0xFF;
-			break;
-		}
-		case id_get_keyboard_value:
-		{
-			if ( command_data[0] == id_uptime )
-			{
-				uint32_t value = timer_read32();
-				command_data[1] = (value >> 24 ) & 0xFF;
-				command_data[2] = (value >> 16 ) & 0xFF;
-				command_data[3] = (value >> 8 ) & 0xFF;
-				command_data[4] = value & 0xFF;
-			}
-			else
-			{
-				*command_id = id_unhandled;
-			}
-			break;
-		}
-#ifdef DYNAMIC_KEYMAP_ENABLE
-		case id_dynamic_keymap_get_keycode:
-		{
-			uint16_t keycode = dynamic_keymap_get_keycode( command_data[0], command_data[1], command_data[2] );
-			command_data[3] = keycode >> 8;
-			command_data[4] = keycode & 0xFF;
-			break;
-		}
-		case id_dynamic_keymap_set_keycode:
-		{
-			dynamic_keymap_set_keycode( command_data[0], command_data[1], command_data[2], ( command_data[3] << 8 ) | command_data[4] );
-			break;
-		}
-		case id_dynamic_keymap_reset:
-		{
-			dynamic_keymap_reset();
-			break;
-		}
-		case id_dynamic_keymap_macro_get_count:
-		{
-			command_data[0] = dynamic_keymap_macro_get_count();
-			break;
-		}
-		case id_dynamic_keymap_macro_get_buffer_size:
-		{
-			uint16_t size = dynamic_keymap_macro_get_buffer_size();
-			command_data[0] = size >> 8;
-			command_data[1] = size & 0xFF;
-			break;
-		}
-		case id_dynamic_keymap_macro_get_buffer:
-		{
-			uint16_t offset = ( command_data[0] << 8 ) | command_data[1];
-			uint16_t size = command_data[2]; // size <= 28
-			dynamic_keymap_macro_get_buffer( offset, size, &command_data[3] );
-			break;
-		}
-		case id_dynamic_keymap_macro_set_buffer:
-		{
-			uint16_t offset = ( command_data[0] << 8 ) | command_data[1];
-			uint16_t size = command_data[2]; // size <= 28
-			dynamic_keymap_macro_set_buffer( offset, size, &command_data[3] );
-			break;
-		}
-		case id_dynamic_keymap_macro_reset:
-		{
-			dynamic_keymap_macro_reset();
-			break;
-		}
-		case id_dynamic_keymap_get_layer_count:
-		{
-			command_data[0] = dynamic_keymap_get_layer_count();
-			break;
-		}
-		case id_dynamic_keymap_get_buffer:
-		{
-			uint16_t offset = ( command_data[0] << 8 ) | command_data[1];
-			uint16_t size = command_data[2]; // size <= 28
-			dynamic_keymap_get_buffer( offset, size, &command_data[3] );
-			break;
-		}
-		case id_dynamic_keymap_set_buffer:
-		{
-			uint16_t offset = ( command_data[0] << 8 ) | command_data[1];
-			uint16_t size = command_data[2]; // size <= 28
-			dynamic_keymap_set_buffer( offset, size, &command_data[3] );
-			break;
-		}
-#endif // DYNAMIC_KEYMAP_ENABLE
-#if RGB_BACKLIGHT_ENABLED || MONO_BACKLIGHT_ENABLED
-		case id_backlight_config_set_value:
-		{
-			backlight_config_set_value(command_data);
-			break;
-		}
-		case id_backlight_config_get_value:
-		{
-			backlight_config_get_value(command_data);
-			break;
-		}
-		case id_backlight_config_save:
-		{
-			backlight_config_save();
-			break;
-		}
-#endif // RGB_BACKLIGHT_ENABLED || MONO_BACKLIGHT_ENABLED
-		case id_eeprom_reset:
-		{
-			eeprom_reset();
-			break;
-		}
-		case id_bootloader_jump:
-		{
-			// Need to send data back before the jump
-			// Informs host that the command is handled
-			raw_hid_send( data, length );
-			// Give host time to read it
-			wait_ms(100);
-			bootloader_jump();
-			break;
-		}
-		default:
-		{
-			// Unhandled message.
-			*command_id = id_unhandled;
-			break;
-		}
-	}
-
-	// Return same buffer with values changed
-	raw_hid_send( data, length );
-
-}
-
+#include "version.h" // for QMK_BUILDDATE used in EEPROM magic
 #endif
 
-void main_init(void)
+// Called from via_init() if VIA_ENABLE
+// Called from matrix_init_kb() if not VIA_ENABLE
+void via_init_kb(void)
 {
-	// If the EEPROM has the magic, the data is good.
-	// OK to load from EEPROM.
-	if (eeprom_is_valid()) {
+    // If the EEPROM has the magic, the data is good.
+    // OK to load from EEPROM
+    if (via_eeprom_is_valid()) {
 #if RGB_BACKLIGHT_ENABLED || MONO_BACKLIGHT_ENABLED
-		backlight_config_load();
+        backlight_config_load();
 #endif // RGB_BACKLIGHT_ENABLED || MONO_BACKLIGHT_ENABLED
-	} else	{
+    } else	{
 #if RGB_BACKLIGHT_ENABLED || MONO_BACKLIGHT_ENABLED
-		// If the EEPROM has not been saved before, or is out of date,
-		// save the default values to the EEPROM. Default values
-		// come from construction of the backlight_config instance.
-		backlight_config_save();
+        // If the EEPROM has not been saved before, or is out of date,
+        // save the default values to the EEPROM. Default values
+        // come from construction of the backlight_config instance.
+        backlight_config_save();
 #endif // RGB_BACKLIGHT_ENABLED || MONO_BACKLIGHT_ENABLED
-#ifdef DYNAMIC_KEYMAP_ENABLE
-		// This resets the keymaps in EEPROM to what is in flash.
-		dynamic_keymap_reset();
-		// This resets the macros in EEPROM to nothing.
-		dynamic_keymap_macro_reset();
-#endif // DYNAMIC_KEYMAP_ENABLE
-		// Save the magic number last, in case saving was interrupted
-		eeprom_set_valid(true);
-	}
-	
+
+        // DO NOT set EEPROM valid here, let caller do this
+    }
+
 #if RGB_BACKLIGHT_ENABLED || MONO_BACKLIGHT_ENABLED
-	// Initialize LED drivers for backlight.
-	backlight_init_drivers();
+    // Initialize LED drivers for backlight.
+    backlight_init_drivers();
 
-	backlight_timer_init();
-	backlight_timer_enable();
+    backlight_timer_init();
+    backlight_timer_enable();
 #endif // RGB_BACKLIGHT_ENABLED || MONO_BACKLIGHT_ENABLED
 }
 
-void bootmagic_lite(void)
-{
-	// The lite version of TMK's bootmagic.
-	// 100% less potential for accidentally making the
-	// keyboard do stupid things.
-
-	// We need multiple scans because debouncing can't be turned off.
-	matrix_scan();
-	wait_ms(DEBOUNCE);
-	wait_ms(DEBOUNCE);
-	matrix_scan();
-
-	// If the Esc (matrix 0,0) is held down on power up,
-	// reset the EEPROM valid state and jump to bootloader.
-	if ( matrix_get_row(0) & (1<<0) ) {
-		eeprom_reset();
-		bootloader_jump();
-	}
-}
-
 void matrix_init_kb(void)
 {
-	bootmagic_lite();
-	main_init();
-	matrix_init_user();
+    // If VIA is disabled, we still need to load backlight settings.
+    // Call via_init_kb() the same way as via_init(), with setting
+    // EEPROM valid afterwards.
+#ifndef VIA_ENABLE
+    via_init_kb();
+    via_eeprom_set_valid(true);
+#endif // VIA_ENABLE
+
+    matrix_init_user();
 }
 
 void matrix_scan_kb(void)
 {
 #if RGB_BACKLIGHT_ENABLED || MONO_BACKLIGHT_ENABLED
-	// This only updates the LED driver buffers if something has changed.
-	backlight_update_pwm_buffers();
+    // This only updates the LED driver buffers if something has changed.
+    backlight_update_pwm_buffers();
 #endif // RGB_BACKLIGHT_ENABLED || MONO_BACKLIGHT_ENABLED
-	matrix_scan_user();
+    matrix_scan_user();
 }
 
 bool process_record_kb(uint16_t keycode, keyrecord_t *record)
 {
 #if RGB_BACKLIGHT_ENABLED || MONO_BACKLIGHT_ENABLED
-	process_record_backlight(keycode, record);
+    process_record_backlight(keycode, record);
 #endif // RGB_BACKLIGHT_ENABLED || MONO_BACKLIGHT_ENABLED
 
-	switch(keycode) {
-		case FN_MO13:
-			if (record->event.pressed) {
-				layer_on(1);
-				update_tri_layer(1, 2, 3);
-			} else {
-				layer_off(1);
-				update_tri_layer(1, 2, 3);
-			}
-			return false;
-			break;
-		case FN_MO23:
-			if (record->event.pressed) {
-				layer_on(2);
-				update_tri_layer(1, 2, 3);
-			} else {
-				layer_off(2);
-				update_tri_layer(1, 2, 3);
-			}
-			return false;
-			break;
-	}
-
-#ifdef DYNAMIC_KEYMAP_ENABLE
-	// Handle macros
-	if (record->event.pressed) {
-		if ( keycode >= MACRO00 && keycode <= MACRO15 )
-		{
-			uint8_t id = keycode - MACRO00;
-			dynamic_keymap_macro_send(id);
-			return false;
-		}
-	}
-#endif //DYNAMIC_KEYMAP_ENABLE
-
-	return process_record_user(keycode, record);
-}
-
-// This overrides the one in quantum/keymap_common.c
-uint16_t keymap_function_id_to_action( uint16_t function_id )
-{
-	// Zeal60 specific "action functions" are 0xF00 to 0xFFF
-	// i.e. F(0xF00) to F(0xFFF) are mapped to
-	// enum zeal60_action_functions by masking last 8 bits.
-	if ( function_id >= 0x0F00 && function_id <= 0x0FFF )
-	{
-		uint8_t id = function_id & 0xFF;
-		switch ( id ) {
-			case TRIPLE_TAP_1_3:
-			case TRIPLE_TAP_2_3:
-			{
-				return ACTION_FUNCTION_TAP(id);
-				break;
-			}
-			default:
-				break;
-		}
-	}
-
-	return pgm_read_word(&fn_actions[function_id]);
-}
-
-
-// Zeal60 specific "action functions"
-void action_function(keyrecord_t *record, uint8_t id, uint8_t opt)
-{
-	switch (id)
-	{
-	case TRIPLE_TAP_1_3:
-	case TRIPLE_TAP_2_3:
-		if (record->event.pressed) {
-			layer_on( id == TRIPLE_TAP_1_3 ? 1 : 2 );
-			if (record->tap.count && !record->tap.interrupted) {
-				if (record->tap.count >= 3) {
-					layer_invert(3);
-				}
-			} else {
-				record->tap.count = 0;
-			}
-		} else {
-			layer_off( id == TRIPLE_TAP_1_3 ? 1 : 2 );
-		}
-		break;
-	}
+    return process_record_user(keycode, record);
 }
 
 void led_set_kb(uint8_t usb_led)
 {
 #if RGB_BACKLIGHT_ENABLED || MONO_BACKLIGHT_ENABLED
-	backlight_set_indicator_state(usb_led);
+    backlight_set_indicator_state(usb_led);
 #endif // RGB_BACKLIGHT_ENABLED || MONO_BACKLIGHT_ENABLED
-	led_set_user(usb_led);
+    led_set_user(usb_led);
 }
 
 void suspend_power_down_kb(void)
 {
 #if RGB_BACKLIGHT_ENABLED || MONO_BACKLIGHT_ENABLED
-	backlight_set_suspend_state(true);
+    backlight_set_suspend_state(true);
 #endif // RGB_BACKLIGHT_ENABLED || MONO_BACKLIGHT_ENABLED
 }
 
 void suspend_wakeup_init_kb(void)
 {
 #if RGB_BACKLIGHT_ENABLED || MONO_BACKLIGHT_ENABLED
-	backlight_set_suspend_state(false);
+    backlight_set_suspend_state(false);
 #endif // RGB_BACKLIGHT_ENABLED || MONO_BACKLIGHT_ENABLED
 }
 
+// Moving this to the bottom of this source file is a workaround
+// for an intermittent compiler error for Atmel compiler.
+#ifdef VIA_ENABLE
+void raw_hid_receive_kb(uint8_t *data, uint8_t length) {
+    uint8_t *command_id = &(data[0]);
+    uint8_t *command_data = &(data[1]);
+    switch ( *command_id )
+    {
+#if RGB_BACKLIGHT_ENABLED || MONO_BACKLIGHT_ENABLED
+        case id_backlight_config_set_value:
+        {
+            backlight_config_set_value(command_data);
+            break;
+        }
+        case id_backlight_config_get_value:
+        {
+            backlight_config_get_value(command_data);
+            break;
+        }
+        case id_backlight_config_save:
+        {
+            backlight_config_save();
+            break;
+        }
+#endif // RGB_BACKLIGHT_ENABLED || MONO_BACKLIGHT_ENABLED
+        default:
+        {
+            // Unhandled message.
+            *command_id = id_unhandled;
+            *command_data = *command_data; // force use of variable
+            break;
+        }
+    }
+    // DO NOT call raw_hid_send(data,length) here, let caller do this
+}
+#endif // VIA_ENABLE
+
+//
+// In the case of VIA being disabled, we still need to check if
+// keyboard level EEPROM memory is valid before loading.
+// Thus these are copies of the same functions in VIA, since
+// the backlight settings reuse VIA's EEPROM magic/version,
+// and the ones in via.c won't be compiled in.
+//
+// Yes, this is sub-optimal, and is only here for completeness
+// (i.e. catering to the 1% of people that want wilba.tech LED bling
+// AND want persistent settings BUT DON'T want to use dynamic keymaps/VIA).
+//
+#ifndef VIA_ENABLE
+
+bool via_eeprom_is_valid(void)
+{
+    char *p = QMK_BUILDDATE; // e.g. "2019-11-05-11:29:54"
+    uint8_t magic0 = ( ( p[2] & 0x0F ) << 4 ) | ( p[3]  & 0x0F );
+    uint8_t magic1 = ( ( p[5] & 0x0F ) << 4 ) | ( p[6]  & 0x0F );
+    uint8_t magic2 = ( ( p[8] & 0x0F ) << 4 ) | ( p[9]  & 0x0F );
+
+    return (eeprom_read_byte( (void*)VIA_EEPROM_MAGIC_ADDR+0 ) == magic0 &&
+            eeprom_read_byte( (void*)VIA_EEPROM_MAGIC_ADDR+1 ) == magic1 &&
+            eeprom_read_byte( (void*)VIA_EEPROM_MAGIC_ADDR+2 ) == magic2 );
+}
+
+void via_eeprom_set_valid(bool valid)
+{
+    char *p = QMK_BUILDDATE; // e.g. "2019-11-05-11:29:54"
+    uint8_t magic0 = ( ( p[2] & 0x0F ) << 4 ) | ( p[3]  & 0x0F );
+    uint8_t magic1 = ( ( p[5] & 0x0F ) << 4 ) | ( p[6]  & 0x0F );
+    uint8_t magic2 = ( ( p[8] & 0x0F ) << 4 ) | ( p[9]  & 0x0F );
+
+    eeprom_update_byte( (void*)VIA_EEPROM_MAGIC_ADDR+0, valid ? magic0 : 0xFF);
+    eeprom_update_byte( (void*)VIA_EEPROM_MAGIC_ADDR+1, valid ? magic1 : 0xFF);
+    eeprom_update_byte( (void*)VIA_EEPROM_MAGIC_ADDR+2, valid ? magic2 : 0xFF);
+}
+
+void via_eeprom_reset(void)
+{
+    // Set the VIA specific EEPROM state as invalid.
+    via_eeprom_set_valid(false);
+    // Set the TMK/QMK EEPROM state as invalid.
+    eeconfig_disable();
+}
+
+#endif // VIA_ENABLE
diff --git a/keyboards/wilba_tech/wt_mono_backlight.c b/keyboards/wilba_tech/wt_mono_backlight.c
index 69d82e582a..daf738da2e 100644
--- a/keyboards/wilba_tech/wt_mono_backlight.c
+++ b/keyboards/wilba_tech/wt_mono_backlight.c
@@ -19,12 +19,17 @@
 #include "wt_rgb_backlight_api.h" // reuse these for now
 #include "wt_rgb_backlight_keycodes.h" // reuse these for now
 
-#include "drivers/avr/i2c_master.h"
-#include "drivers/issi/is31fl3736.h"
 #include <avr/interrupt.h>
+#include "drivers/avr/i2c_master.h"
 
 #include "progmem.h"
 #include "quantum/color.h"
+#include "tmk_core/common/eeprom.h"
+
+#include "via.h" // uses only the EEPROM address
+#define MONO_BACKLIGHT_CONFIG_EEPROM_ADDR (VIA_EEPROM_CUSTOM_CONFIG_ADDR)
+
+#include "drivers/issi/is31fl3736.h"
 
 #define ISSI_ADDR_DEFAULT 0x50
 
diff --git a/keyboards/wilba_tech/wt_rgb_backlight.c b/keyboards/wilba_tech/wt_rgb_backlight.c
index ca8c3269f6..31cfabddd7 100644
--- a/keyboards/wilba_tech/wt_rgb_backlight.c
+++ b/keyboards/wilba_tech/wt_rgb_backlight.c
@@ -33,18 +33,20 @@
 #include "wt_rgb_backlight_keycodes.h"
 
 #if !defined(RGB_BACKLIGHT_HS60) && !defined(RGB_BACKLIGHT_NK65)
-#include <avr/io.h>
-#include <util/delay.h>
 #include <avr/interrupt.h>
 #include "drivers/avr/i2c_master.h"
 #else
 #include "ch.h"
 #include "hal.h"
 #include "drivers/arm/i2c_master.h"
-#include "tmk_core/common/eeprom.h"
 #endif
+
 #include "progmem.h"
 #include "quantum/color.h"
+#include "tmk_core/common/eeprom.h"
+
+#include "via.h" // uses only the EEPROM address
+#define RGB_BACKLIGHT_CONFIG_EEPROM_ADDR (VIA_EEPROM_CUSTOM_CONFIG_ADDR)
 
 #if defined(RGB_BACKLIGHT_M6_B)
 #include "drivers/issi/is31fl3218.h"
diff --git a/keyboards/wilba_tech/zeal60/config.h b/keyboards/wilba_tech/zeal60/config.h
index 6b9529a6f9..cb2f6a96bd 100644
--- a/keyboards/wilba_tech/zeal60/config.h
+++ b/keyboards/wilba_tech/zeal60/config.h
@@ -115,24 +115,6 @@
 #define RGB_BACKLIGHT_LAYER_2_INDICATOR { .color = { .h = 0, .s = 0 }, .index = 255 }
 #define RGB_BACKLIGHT_LAYER_3_INDICATOR { .color = { .h = 0, .s = 0 }, .index = 255 }
 
-#define DYNAMIC_KEYMAP_LAYER_COUNT 4
-
-// EEPROM usage
-
-// TODO: refactor with new user EEPROM code (coming soon)
-#define EEPROM_MAGIC 0x451F
-#define EEPROM_MAGIC_ADDR 34
-// Bump this every time we change what we store
-// This will automatically reset the EEPROM with defaults
-// and avoid loading invalid data from the EEPROM
-#define EEPROM_VERSION 0x08
-#define EEPROM_VERSION_ADDR 36
-
-// Backlight config starts after EEPROM version
-#define RGB_BACKLIGHT_CONFIG_EEPROM_ADDR 37
-// Dynamic keymap starts after backlight config (37+31)
-#define DYNAMIC_KEYMAP_EEPROM_ADDR 68
-// Dynamic macro starts after dynamic keymaps (68+(4*5*14*2)) = (68+560)
-#define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR 628
-#define DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE 396
-#define DYNAMIC_KEYMAP_MACRO_COUNT 16
+// Backlight config starts after VIA's EEPROM usage,
+// dynamic keymaps start after this.
+#define VIA_EEPROM_CUSTOM_CONFIG_SIZE 31
\ No newline at end of file
diff --git a/keyboards/wilba_tech/zeal60/keymaps/via/keymap.c b/keyboards/wilba_tech/zeal60/keymaps/via/keymap.c
new file mode 100644
index 0000000000..395790d290
--- /dev/null
+++ b/keyboards/wilba_tech/zeal60/keymaps/via/keymap.c
@@ -0,0 +1,38 @@
+// Default layout for Zeal60
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+// Default layer
+[0] = LAYOUT_60_all(
+	KC_ESC,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_MINS, KC_EQL,  KC_BSPC, KC_BSPC,
+	KC_TAB,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_LBRC, KC_RBRC, KC_BSLS,
+	KC_CAPS, KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT, KC_ENT,
+	KC_LSFT, KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_RSFT, KC_RSFT,
+	KC_LCTL, KC_LGUI, KC_LALT,                            KC_SPC,                             KC_RALT, FN_MO13, FN_MO23, KC_RCTL),
+
+// Fn1 Layer
+[1] = LAYOUT_60_all(
+	KC_GRV,  KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,  KC_DEL,  KC_TRNS,
+	KC_CAPS, KC_TRNS, KC_UP,   KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_INS,  KC_TRNS, KC_PSCR, KC_SLCK, KC_PAUS, KC_TRNS,
+	KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_PGUP, KC_TRNS,
+	KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLD, KC_VOLU, KC_MUTE, KC_END,  KC_PGDN, KC_TRNS, KC_TRNS,
+	KC_TRNS, KC_TRNS, KC_TRNS,                            KC_TRNS,                            KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
+
+// Fn2 Layer
+[2] = LAYOUT_60_all(
+	KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+	KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+	KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+	KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+	KC_TRNS, KC_TRNS, KC_TRNS,                            KC_TRNS,                            KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
+
+// Fn3 Layer (zeal60 Configuration)
+[3] = LAYOUT_60_all(
+	KC_TRNS, EF_DEC,  EF_INC,  H1_DEC,  H1_INC,  H2_DEC,  H2_INC,  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, BR_DEC,  BR_INC,  KC_TRNS, KC_TRNS,
+	KC_TRNS, KC_TRNS, KC_TRNS, S1_DEC,  S1_INC,  S2_DEC,  S2_INC,  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, ES_DEC,  ES_INC,  KC_TRNS,
+	KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+	KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+	KC_TRNS, KC_TRNS, KC_TRNS,                            KC_TRNS,                            KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
+
+};
diff --git a/keyboards/wilba_tech/zeal60/keymaps/via/rules.mk b/keyboards/wilba_tech/zeal60/keymaps/via/rules.mk
new file mode 100644
index 0000000000..1e5b99807c
--- /dev/null
+++ b/keyboards/wilba_tech/zeal60/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
diff --git a/keyboards/wilba_tech/zeal60/rules.mk b/keyboards/wilba_tech/zeal60/rules.mk
index 11f3867de3..3067be73d3 100644
--- a/keyboards/wilba_tech/zeal60/rules.mk
+++ b/keyboards/wilba_tech/zeal60/rules.mk
@@ -20,7 +20,7 @@ OPT_DEFS += -DNO_SUSPEND_POWER_DOWN
 #   change to "no" to disable the options, or define them in the Makefile in
 #   the appropriate keymap folder that will get included automatically
 #
-BOOTMAGIC_ENABLE = no       # Virtual DIP switch configuration(+1000)
+BOOTMAGIC_ENABLE = lite       # Virtual DIP switch configuration(+1000)
 MOUSEKEY_ENABLE = no       # Mouse keys(+4700)
 EXTRAKEY_ENABLE = yes       # Audio control and System control(+450)
 CONSOLE_ENABLE = no         # Console for debug(+400)
@@ -36,8 +36,6 @@ RGBLIGHT_ENABLE = no        # Enable WS2812 RGB underlight.
 # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
 SLEEP_LED_ENABLE ?= no    # Breathing sleep LED during USB suspend
 
-RAW_ENABLE = yes
-DYNAMIC_KEYMAP_ENABLE = yes
 CIE1931_CURVE = yes
 
 LAYOUTS = 60_ansi 60_iso 60_hhkb 60_ansi_split_bs_rshift
diff --git a/keyboards/wilba_tech/zeal60/zeal60.h b/keyboards/wilba_tech/zeal60/zeal60.h
index 0d4f1b908b..016531d227 100644
--- a/keyboards/wilba_tech/zeal60/zeal60.h
+++ b/keyboards/wilba_tech/zeal60/zeal60.h
@@ -17,7 +17,7 @@
 
 #include "quantum.h"
 #include "keyboards/wilba_tech/wt_rgb_backlight_keycodes.h"
-#include "keyboards/wilba_tech/via_keycodes.h"
+#include "via.h"
 
 #define XXX KC_NO
 
diff --git a/keyboards/wilba_tech/zeal65/config.h b/keyboards/wilba_tech/zeal65/config.h
index f452fbd475..01649d76fe 100644
--- a/keyboards/wilba_tech/zeal65/config.h
+++ b/keyboards/wilba_tech/zeal65/config.h
@@ -115,24 +115,6 @@
 #define RGB_BACKLIGHT_LAYER_2_INDICATOR { .color = { .h = 0, .s = 0 }, .index = 255 }
 #define RGB_BACKLIGHT_LAYER_3_INDICATOR { .color = { .h = 0, .s = 0 }, .index = 255 }
 
-#define DYNAMIC_KEYMAP_LAYER_COUNT 4
-
-// EEPROM usage
-
-// TODO: refactor with new user EEPROM code (coming soon)
-#define EEPROM_MAGIC 0x451F
-#define EEPROM_MAGIC_ADDR 34
-// Bump this every time we change what we store
-// This will automatically reset the EEPROM with defaults
-// and avoid loading invalid data from the EEPROM
-#define EEPROM_VERSION 0x08
-#define EEPROM_VERSION_ADDR 36
-
-// Backlight config starts after EEPROM version
-#define RGB_BACKLIGHT_CONFIG_EEPROM_ADDR 37
-// Dynamic keymap starts after backlight config (37+31)
-#define DYNAMIC_KEYMAP_EEPROM_ADDR 68
-// Dynamic macro starts after dynamic keymaps (68+(4*5*15*2)) = (68+600)
-#define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR 668
-#define DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE 356
-#define DYNAMIC_KEYMAP_MACRO_COUNT 16
+// Backlight config starts after VIA's EEPROM usage,
+// dynamic keymaps start after this.
+#define VIA_EEPROM_CUSTOM_CONFIG_SIZE 31
diff --git a/keyboards/wilba_tech/zeal65/info.json b/keyboards/wilba_tech/zeal65/info.json
index d83895ed95..709f7cefe1 100644
--- a/keyboards/wilba_tech/zeal65/info.json
+++ b/keyboards/wilba_tech/zeal65/info.json
@@ -6,7 +6,7 @@
     "width": 16, 
     "height": 5, 
     "layouts": {
-        "LAYOUT_65_split_bs": {
+        "LAYOUT_65_all": {
             "layout": [{"label":"Esc", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"|", "x":13, "y":0}, {"label":"Del", "x":14, "y":0}, {"label":"Home", "x":15, "y":0}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"Backspace", "x":13.5, "y":1, "w":1.5}, {"label":"PgUp", "x":15, "y":1}, {"label":"Control", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"label":"PgDn", "x":15, "y":2}, {"label":"Shift", "x":0, "y":3, "w":2.25}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":1.75}, {"label":"\u2191", "x":14, "y":3}, {"label":"End", "x":15, "y":3}, {"label":"Win", "x":0, "y":4, "w":1.5}, {"label":"Alt", "x":1.5, "y":4, "w":1.5}, {"x":3, "y":4, "w":7}, {"label":"Fn2", "x":10, "y":4, "w":1.5}, {"label":"Fn1", "x":11.5, "y":4, "w":1.5}, {"label":"\u2190", "x":13, "y":4}, {"label":"\u2193", "x":14, "y":4}, {"label":"\u2192", "x":15, "y":4}]
         },
         "LAYOUT_65_normie": {
diff --git a/keyboards/wilba_tech/zeal65/keymaps/split_bs/keymap.c b/keyboards/wilba_tech/zeal65/keymaps/split_bs/keymap.c
index 96b04c358d..2c6d24e8fa 100644
--- a/keyboards/wilba_tech/zeal65/keymaps/split_bs/keymap.c
+++ b/keyboards/wilba_tech/zeal65/keymaps/split_bs/keymap.c
@@ -4,7 +4,7 @@
 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 
 // Default layer
-[0] = LAYOUT_65_split_bs(
+[0] = LAYOUT_65_all(
 	KC_ESC,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_MINS, KC_EQL,  KC_BSLS, KC_DEL,  KC_HOME,
 	KC_TAB,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_LBRC, KC_RBRC, KC_BSPC, KC_PGUP,
 	KC_LCTL, KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT, KC_ENT,           KC_PGDN,
@@ -12,7 +12,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 	KC_LGUI, KC_LALT,                                              KC_SPC,                    FN_MO23, FN_MO13, KC_LEFT, KC_DOWN, KC_RGHT),
 
 // Fn1 Layer
-[1] = LAYOUT_65_split_bs(
+[1] = LAYOUT_65_all(
 	KC_GRV,  KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,  KC_INS,  KC_DEL,  KC_TRNS,
 	KC_CAPS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PSCR, KC_SLCK, KC_PAUS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
 	KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,          KC_TRNS,
@@ -20,7 +20,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 	KC_TRNS, KC_TRNS,                                              KC_TRNS,                   KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
 
 // Fn2 Layer
-[2] = LAYOUT_65_split_bs(
+[2] = LAYOUT_65_all(
 	KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
 	KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
 	KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,          KC_TRNS,
@@ -28,7 +28,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 	KC_TRNS, KC_TRNS,                                              KC_TRNS,                   KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
 
 // Fn3 Layer (zeal60 Configuration)
-[3] = LAYOUT_65_split_bs(
+[3] = LAYOUT_65_all(
 	KC_TRNS, EF_DEC,  EF_INC,  H1_DEC,  H1_INC,  H2_DEC,  H2_INC,  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, BR_DEC,  BR_INC,  KC_TRNS, KC_TRNS, KC_TRNS,
 	KC_TRNS, KC_TRNS, KC_TRNS, S1_DEC,  S1_INC,  S2_DEC,  S2_INC,  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
 	KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,          KC_TRNS,
diff --git a/keyboards/wilba_tech/zeal65/keymaps/via/keymap.c b/keyboards/wilba_tech/zeal65/keymaps/via/keymap.c
new file mode 100644
index 0000000000..2c6d24e8fa
--- /dev/null
+++ b/keyboards/wilba_tech/zeal65/keymaps/via/keymap.c
@@ -0,0 +1,38 @@
+// Split-backspace layout for Zeal65
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+// Default layer
+[0] = LAYOUT_65_all(
+	KC_ESC,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_MINS, KC_EQL,  KC_BSLS, KC_DEL,  KC_HOME,
+	KC_TAB,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_LBRC, KC_RBRC, KC_BSPC, KC_PGUP,
+	KC_LCTL, KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT, KC_ENT,           KC_PGDN,
+	KC_LSFT,          KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_RSFT, KC_UP,   KC_END,
+	KC_LGUI, KC_LALT,                                              KC_SPC,                    FN_MO23, FN_MO13, KC_LEFT, KC_DOWN, KC_RGHT),
+
+// Fn1 Layer
+[1] = LAYOUT_65_all(
+	KC_GRV,  KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,  KC_INS,  KC_DEL,  KC_TRNS,
+	KC_CAPS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PSCR, KC_SLCK, KC_PAUS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+	KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,          KC_TRNS,
+	KC_TRNS,          KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+	KC_TRNS, KC_TRNS,                                              KC_TRNS,                   KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
+
+// Fn2 Layer
+[2] = LAYOUT_65_all(
+	KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+	KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+	KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,          KC_TRNS,
+	KC_TRNS,          KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+	KC_TRNS, KC_TRNS,                                              KC_TRNS,                   KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
+
+// Fn3 Layer (zeal60 Configuration)
+[3] = LAYOUT_65_all(
+	KC_TRNS, EF_DEC,  EF_INC,  H1_DEC,  H1_INC,  H2_DEC,  H2_INC,  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, BR_DEC,  BR_INC,  KC_TRNS, KC_TRNS, KC_TRNS,
+	KC_TRNS, KC_TRNS, KC_TRNS, S1_DEC,  S1_INC,  S2_DEC,  S2_INC,  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+	KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,          KC_TRNS,
+	KC_TRNS,          KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+	KC_TRNS, KC_TRNS,                                              KC_TRNS,                   KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
+
+};
diff --git a/keyboards/wilba_tech/zeal65/keymaps/via/rules.mk b/keyboards/wilba_tech/zeal65/keymaps/via/rules.mk
new file mode 100644
index 0000000000..1e5b99807c
--- /dev/null
+++ b/keyboards/wilba_tech/zeal65/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
diff --git a/keyboards/wilba_tech/zeal65/rules.mk b/keyboards/wilba_tech/zeal65/rules.mk
index 6c8783eb29..94d487cbb7 100644
--- a/keyboards/wilba_tech/zeal65/rules.mk
+++ b/keyboards/wilba_tech/zeal65/rules.mk
@@ -20,7 +20,7 @@ OPT_DEFS += -DNO_SUSPEND_POWER_DOWN
 #   change to "no" to disable the options, or define them in the Makefile in 
 #   the appropriate keymap folder that will get included automatically
 #
-BOOTMAGIC_ENABLE = no       # Virtual DIP switch configuration(+1000)
+BOOTMAGIC_ENABLE = lite     # Virtual DIP switch configuration(+1000)
 MOUSEKEY_ENABLE = no       # Mouse keys(+4700)
 EXTRAKEY_ENABLE = yes       # Audio control and System control(+450)
 CONSOLE_ENABLE = no         # Console for debug(+400)
@@ -36,8 +36,6 @@ RGBLIGHT_ENABLE = no        # Enable WS2812 RGB underlight.
 # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
 SLEEP_LED_ENABLE = no    # Breathing sleep LED during USB suspend
 
-RAW_ENABLE = yes
-DYNAMIC_KEYMAP_ENABLE = yes
 CIE1931_CURVE = yes
 
 # project specific files
diff --git a/keyboards/wilba_tech/zeal65/zeal65.h b/keyboards/wilba_tech/zeal65/zeal65.h
index d8528e6c51..34c1294165 100644
--- a/keyboards/wilba_tech/zeal65/zeal65.h
+++ b/keyboards/wilba_tech/zeal65/zeal65.h
@@ -17,11 +17,11 @@
 
 #include "quantum.h"
 #include "keyboards/wilba_tech/wt_rgb_backlight_keycodes.h"
-#include "keyboards/wilba_tech/via_keycodes.h"
+#include "via.h"
 
 #define XXX KC_NO
 
-#define LAYOUT_65_split_bs( \
+#define LAYOUT_65_all( \
     K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K2D, K0E, \
     K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E, \
     K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C,      K2E, \
diff --git a/quantum/dynamic_keymap.c b/quantum/dynamic_keymap.c
index ca056f630e..11d28592d6 100644
--- a/quantum/dynamic_keymap.c
+++ b/quantum/dynamic_keymap.c
@@ -20,28 +20,37 @@
 #include "progmem.h"  // to read default from flash
 #include "quantum.h"  // for send_string()
 #include "dynamic_keymap.h"
+#include "via.h" // for default VIA_EEPROM_ADDR_END
 
-#ifdef DYNAMIC_KEYMAP_ENABLE
+#ifndef DYNAMIC_KEYMAP_LAYER_COUNT
+#   define DYNAMIC_KEYMAP_LAYER_COUNT 4
+#endif
 
-#    ifndef DYNAMIC_KEYMAP_EEPROM_ADDR
-#        error DYNAMIC_KEYMAP_EEPROM_ADDR not defined
-#    endif
+#ifndef DYNAMIC_KEYMAP_MACRO_COUNT
+#   define DYNAMIC_KEYMAP_MACRO_COUNT 16
+#endif
 
-#    ifndef DYNAMIC_KEYMAP_LAYER_COUNT
-#        error DYNAMIC_KEYMAP_LAYER_COUNT not defined
-#    endif
+// If DYNAMIC_KEYMAP_EEPROM_ADDR not explicitly defined in config.h,
+// default it start after VIA_EEPROM_CUSTOM_ADDR+VIA_EEPROM_CUSTOM_SIZE
+#ifndef DYNAMIC_KEYMAP_EEPROM_ADDR
+#   ifdef VIA_EEPROM_CUSTOM_CONFIG_ADDR
+#       define DYNAMIC_KEYMAP_EEPROM_ADDR (VIA_EEPROM_CUSTOM_CONFIG_ADDR+VIA_EEPROM_CUSTOM_CONFIG_SIZE)
+#   else
+#       error DYNAMIC_KEYMAP_EEPROM_ADDR not defined
+#   endif 
+#endif
 
-#    ifndef DYNAMIC_KEYMAP_MACRO_COUNT
-#        error DYNAMIC_KEYMAP_MACRO_COUNT not defined
-#    endif
+// Dynamic macro starts after dynamic keymaps
+#ifndef DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR
+#   define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR (DYNAMIC_KEYMAP_EEPROM_ADDR+(DYNAMIC_KEYMAP_LAYER_COUNT*MATRIX_ROWS*MATRIX_COLS*2))
+#endif
 
-#    ifndef DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR
-#        error DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR not defined
-#    endif
-
-#    ifndef DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE
-#        error DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE not defined
-#    endif
+// Dynamic macro uses up all remaining memory
+// Assumes 1K EEPROM on ATMega32U4
+// Override for anything different
+#ifndef DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE
+#   define DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE (1024-DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR)
+#endif
 
 uint8_t dynamic_keymap_get_layer_count(void) { return DYNAMIC_KEYMAP_LAYER_COUNT; }
 
@@ -208,5 +217,3 @@ void dynamic_keymap_macro_send(uint8_t id) {
         send_string(data);
     }
 }
-
-#endif  // DYNAMIC_KEYMAP_ENABLE
diff --git a/quantum/quantum.c b/quantum/quantum.c
index 695da5fdcb..bf159644ab 100644
--- a/quantum/quantum.c
+++ b/quantum/quantum.c
@@ -212,6 +212,9 @@ bool process_record_quantum(keyrecord_t *record) {
 #endif  // HAPTIC_ENABLE
 #if defined(RGB_MATRIX_ENABLE)
             process_rgb_matrix(keycode, record) &&
+#endif
+#if defined(VIA_ENABLE)
+            process_record_via(keycode, record) &&
 #endif
             process_record_kb(keycode, record) &&
 #if defined(MIDI_ENABLE) && defined(MIDI_ADVANCED)
@@ -560,9 +563,7 @@ __attribute__((weak)) void bootmagic_lite(void) {
 
     // We need multiple scans because debouncing can't be turned off.
     matrix_scan();
-#if defined(DEBOUNCING_DELAY) && DEBOUNCING_DELAY > 0
-    wait_ms(DEBOUNCING_DELAY * 2);
-#elif defined(DEBOUNCE) && DEBOUNCE > 0
+#if defined(DEBOUNCE) && DEBOUNCE > 0
     wait_ms(DEBOUNCE * 2);
 #else
     wait_ms(30);
diff --git a/quantum/quantum.h b/quantum/quantum.h
index 053b33b917..9758374f64 100644
--- a/quantum/quantum.h
+++ b/quantum/quantum.h
@@ -162,6 +162,14 @@ extern layer_state_t layer_state;
 #    include "process_dynamic_macro.h"
 #endif
 
+#ifdef DYNAMIC_KEYMAP_ENABLE
+#   include "dynamic_keymap.h"
+#endif
+
+#ifdef VIA_ENABLE
+#   include "via.h"
+#endif
+
 // Function substitutions to ease GPIO manipulation
 #if defined(__AVR__)
 typedef uint8_t pin_t;
diff --git a/quantum/via.c b/quantum/via.c
new file mode 100644
index 0000000000..64b05324a1
--- /dev/null
+++ b/quantum/via.c
@@ -0,0 +1,400 @@
+/* Copyright 2019 Jason Williams (Wilba)
+ *
+ * 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/>.
+ */
+
+#ifndef RAW_ENABLE
+#    error "RAW_ENABLE is not enabled"
+#endif
+
+#ifndef DYNAMIC_KEYMAP_ENABLE
+#    error "DYNAMIC_KEYMAP_ENABLE is not enabled"
+#endif
+
+#include "quantum.h"
+
+#include "via.h"
+#include "raw_hid.h"
+#include "dynamic_keymap.h"
+#include "tmk_core/common/eeprom.h"
+#include "version.h" // for QMK_BUILDDATE used in EEPROM magic
+
+// Can be called in an overriding via_init_kb() to test if keyboard level code usage of
+// EEPROM is invalid and use/save defaults.
+bool via_eeprom_is_valid(void)
+{
+    char *p = QMK_BUILDDATE; // e.g. "2019-11-05-11:29:54"
+    uint8_t magic0 = ( ( p[2] & 0x0F ) << 4 ) | ( p[3]  & 0x0F );
+    uint8_t magic1 = ( ( p[5] & 0x0F ) << 4 ) | ( p[6]  & 0x0F );
+    uint8_t magic2 = ( ( p[8] & 0x0F ) << 4 ) | ( p[9]  & 0x0F );
+
+    return (eeprom_read_byte( (void*)VIA_EEPROM_MAGIC_ADDR+0 ) == magic0 &&
+            eeprom_read_byte( (void*)VIA_EEPROM_MAGIC_ADDR+1 ) == magic1 &&
+            eeprom_read_byte( (void*)VIA_EEPROM_MAGIC_ADDR+2 ) == magic2 );
+}
+
+// Sets VIA/keyboard level usage of EEPROM to valid/invalid
+// Keyboard level code (eg. via_init_kb()) should not call this
+void via_eeprom_set_valid(bool valid)
+{
+    char *p = QMK_BUILDDATE; // e.g. "2019-11-05-11:29:54"
+    uint8_t magic0 = ( ( p[2] & 0x0F ) << 4 ) | ( p[3]  & 0x0F );
+    uint8_t magic1 = ( ( p[5] & 0x0F ) << 4 ) | ( p[6]  & 0x0F );
+    uint8_t magic2 = ( ( p[8] & 0x0F ) << 4 ) | ( p[9]  & 0x0F );
+
+    eeprom_update_byte( (void*)VIA_EEPROM_MAGIC_ADDR+0, valid ? magic0 : 0xFF);
+    eeprom_update_byte( (void*)VIA_EEPROM_MAGIC_ADDR+1, valid ? magic1 : 0xFF);
+    eeprom_update_byte( (void*)VIA_EEPROM_MAGIC_ADDR+2, valid ? magic2 : 0xFF);
+}
+
+// Flag QMK and VIA/keyboard level EEPROM as invalid.
+// Used in bootmagic_lite() and VIA command handler.
+// Keyboard level code should not need to call this.
+void via_eeprom_reset(void)
+{
+    // Set the VIA specific EEPROM state as invalid.
+    via_eeprom_set_valid(false);
+    // Set the TMK/QMK EEPROM state as invalid.
+    eeconfig_disable();
+}
+
+// Override bootmagic_lite() so it can flag EEPROM as invalid
+// as well as jump to bootloader, thus performing a "factory reset"
+// of dynamic keymaps and optionally backlight/other settings.
+void bootmagic_lite(void)
+{
+    // The lite version of TMK's bootmagic based on Wilba.
+    // 100% less potential for accidentally making the
+    // keyboard do stupid things.
+
+    // We need multiple scans because debouncing can't be turned off.
+    matrix_scan();
+#if defined(DEBOUNCE) && DEBOUNCE > 0
+    wait_ms(DEBOUNCE * 2);
+#else
+    wait_ms(30);
+#endif
+    matrix_scan();
+
+    // If the Esc and space bar are held down on power up,
+    // reset the EEPROM valid state and jump to bootloader.
+    // Assumes Esc is at [0,0].
+    // This isn't very generalized, but we need something that doesn't
+    // rely on user's keymaps in firmware or EEPROM.
+    if (matrix_get_row(BOOTMAGIC_LITE_ROW) & (1 << BOOTMAGIC_LITE_COLUMN)) {
+        // This is the only difference from the default implementation.
+        via_eeprom_reset();
+        // Jump to bootloader.
+        bootloader_jump();
+    }
+}
+
+// Override this at the keyboard code level to check
+// VIA's EEPROM valid state and reset to defaults as needed.
+// Used by keyboards that store their own state in EEPROM,
+// for backlight, rotary encoders, etc.
+// The override should not set via_eeprom_set_valid(true) as
+// the caller also needs to check the valid state.
+__attribute__((weak)) void via_init_kb(void) {
+}
+
+// Called by QMK core to initialize dynamic keymaps etc.
+void via_init(void)
+{
+    // Let keyboard level test EEPROM valid state,
+    // but not set it valid, it is done here.
+    via_init_kb();
+
+    // If the EEPROM has the magic, the data is good.
+    // OK to load from EEPROM.
+    if (via_eeprom_is_valid()) {
+    } else	{
+        // This resets the layout options
+        via_set_layout_options(0);
+        // This resets the keymaps in EEPROM to what is in flash.
+        dynamic_keymap_reset();
+        // This resets the macros in EEPROM to nothing.
+        dynamic_keymap_macro_reset();
+        // Save the magic number last, in case saving was interrupted
+        via_eeprom_set_valid(true);
+    }
+}
+
+// This is generalized so the layout options EEPROM usage can be
+// variable, between 1 and 4 bytes.
+uint32_t via_get_layout_options(void)
+{
+    uint32_t value = 0;
+    // Start at the most significant byte
+    void * source = (void *)(VIA_EEPROM_LAYOUT_OPTIONS_ADDR);
+    for ( uint8_t i = 0; i < VIA_EEPROM_LAYOUT_OPTIONS_SIZE; i++ ) {
+        value = value << 8;
+        value |= eeprom_read_byte(source);
+        source++;
+    }
+    return value;
+}
+
+void via_set_layout_options(uint32_t value)
+{
+    // Start at the least significant byte
+    void * target = (void *)(VIA_EEPROM_LAYOUT_OPTIONS_ADDR+VIA_EEPROM_LAYOUT_OPTIONS_SIZE-1);
+    for ( uint8_t i = 0; i < VIA_EEPROM_LAYOUT_OPTIONS_SIZE; i++ ) {
+        eeprom_update_byte(target, value & 0xFF );
+        value = value >> 8;
+        target--;
+    }
+}
+
+// Called by QMK core to process VIA-specific keycodes.
+bool process_record_via(uint16_t keycode, keyrecord_t *record)
+{
+    // Handle macros
+    if (record->event.pressed) {
+        if ( keycode >= MACRO00 && keycode <= MACRO15 )
+        {
+            uint8_t id = keycode - MACRO00;
+            dynamic_keymap_macro_send(id);
+            return false;
+        }
+    }
+
+    // TODO: ideally this would be generalized and refactored into
+    // QMK core as advanced keycodes, until then, the simple case
+    // can be available here to keyboards using VIA
+    switch(keycode) {
+        case FN_MO13:
+            if (record->event.pressed) {
+                layer_on(1);
+                update_tri_layer(1, 2, 3);
+            } else {
+                layer_off(1);
+                update_tri_layer(1, 2, 3);
+            }
+            return false;
+            break;
+        case FN_MO23:
+            if (record->event.pressed) {
+                layer_on(2);
+                update_tri_layer(1, 2, 3);
+            } else {
+                layer_off(2);
+                update_tri_layer(1, 2, 3);
+            }
+            return false;
+            break;
+    }
+    return true;
+}
+
+// Keyboard level code can override this to handle custom messages from VIA.
+// See raw_hid_receive() implementation.
+// DO NOT call raw_hid_send() in the overide function.
+__attribute__((weak)) void raw_hid_receive_kb(uint8_t *data, uint8_t length) {
+    uint8_t *command_id = &(data[0]);
+    *command_id = id_unhandled;
+}
+
+// VIA handles received HID messages first, and will route to
+// raw_hid_receive_kb() for command IDs that are not handled here.
+// This gives the keyboard code level the ability to handle the command
+// specifically.
+//
+// raw_hid_send() is called at the end, with the same buffer, which was 
+// possibly modified with returned values.
+void raw_hid_receive( uint8_t *data, uint8_t length )
+{
+    uint8_t *command_id = &(data[0]);
+    uint8_t *command_data = &(data[1]);
+    switch ( *command_id )
+    {
+        case id_get_protocol_version:
+        {
+            command_data[0] = VIA_PROTOCOL_VERSION >> 8;
+            command_data[1] = VIA_PROTOCOL_VERSION & 0xFF;
+            break;
+        }
+        case id_get_keyboard_value:
+        {
+            switch ( command_data[0] )
+            {
+                case id_uptime:
+                {
+                    uint32_t value = timer_read32();
+                    command_data[1] = (value >> 24 ) & 0xFF;
+                    command_data[2] = (value >> 16 ) & 0xFF;
+                    command_data[3] = (value >> 8 ) & 0xFF;
+                    command_data[4] = value & 0xFF;
+                    break;
+                }
+                case id_layout_options:
+                {
+                    uint32_t value = via_get_layout_options();
+                    command_data[1] = (value >> 24 ) & 0xFF;
+                    command_data[2] = (value >> 16 ) & 0xFF;
+                    command_data[3] = (value >> 8 ) & 0xFF;
+                    command_data[4] = value & 0xFF;
+                    break;
+                }
+                case id_switch_matrix_state:
+                {
+#if ( (MATRIX_COLS/8+1)*MATRIX_ROWS <= 28 )
+                    uint8_t i = 1;
+                    for ( uint8_t row=0; row<MATRIX_ROWS; row++ ) {
+                        matrix_row_t value = matrix_get_row(row);
+#if (MATRIX_COLS > 24)
+                        command_data[i++] = (value >> 24 ) & 0xFF;
+#endif
+#if (MATRIX_COLS > 16)
+                        command_data[i++] = (value >> 16 ) & 0xFF;
+#endif
+#if (MATRIX_COLS > 8)
+                        command_data[i++] = (value >> 8 ) & 0xFF;
+#endif
+                        command_data[i++] = value & 0xFF;
+                    }
+#endif
+                    break;
+                }
+                default:
+                {
+                    raw_hid_receive_kb(data,length);
+                    break;
+                }
+            }
+            break;
+        }
+        case id_set_keyboard_value:
+        {
+            switch ( command_data[0] )
+            {
+                case id_layout_options:
+                {
+                    uint32_t value = ( (uint32_t)command_data[1] << 24 ) |
+                                     ( (uint32_t)command_data[2] << 16 ) |
+                                     ( (uint32_t)command_data[3] << 8 ) |
+                                       (uint32_t)command_data[4];
+                    via_set_layout_options(value);
+                    break;
+                }
+                default:
+                {
+                    raw_hid_receive_kb(data,length);
+                    break;
+                }
+            }
+            break;
+        }
+        case id_dynamic_keymap_get_keycode:
+        {
+            uint16_t keycode = dynamic_keymap_get_keycode( command_data[0], command_data[1], command_data[2] );
+            command_data[3] = keycode >> 8;
+            command_data[4] = keycode & 0xFF;
+            break;
+        }
+        case id_dynamic_keymap_set_keycode:
+        {
+            dynamic_keymap_set_keycode( command_data[0], command_data[1], command_data[2], ( command_data[3] << 8 ) | command_data[4] );
+            break;
+        }
+        case id_dynamic_keymap_reset:
+        {
+            dynamic_keymap_reset();
+            break;
+        }
+        case id_backlight_config_set_value:
+        case id_backlight_config_get_value:
+        case id_backlight_config_save:
+        {
+            raw_hid_receive_kb(data, length);
+            break;
+        }
+        case id_dynamic_keymap_macro_get_count:
+        {
+            command_data[0] = dynamic_keymap_macro_get_count();
+            break;
+        }
+        case id_dynamic_keymap_macro_get_buffer_size:
+        {
+            uint16_t size = dynamic_keymap_macro_get_buffer_size();
+            command_data[0] = size >> 8;
+            command_data[1] = size & 0xFF;
+            break;
+        }
+        case id_dynamic_keymap_macro_get_buffer:
+        {
+            uint16_t offset = ( command_data[0] << 8 ) | command_data[1];
+            uint16_t size = command_data[2]; // size <= 28
+            dynamic_keymap_macro_get_buffer( offset, size, &command_data[3] );
+            break;
+        }
+        case id_dynamic_keymap_macro_set_buffer:
+        {
+            uint16_t offset = ( command_data[0] << 8 ) | command_data[1];
+            uint16_t size = command_data[2]; // size <= 28
+            dynamic_keymap_macro_set_buffer( offset, size, &command_data[3] );
+            break;
+        }
+        case id_dynamic_keymap_macro_reset:
+        {
+            dynamic_keymap_macro_reset();
+            break;
+        }
+        case id_dynamic_keymap_get_layer_count:
+        {
+            command_data[0] = dynamic_keymap_get_layer_count();
+            break;
+        }
+        case id_dynamic_keymap_get_buffer:
+        {
+            uint16_t offset = ( command_data[0] << 8 ) | command_data[1];
+            uint16_t size = command_data[2]; // size <= 28
+            dynamic_keymap_get_buffer( offset, size, &command_data[3] );
+            break;
+        }
+        case id_dynamic_keymap_set_buffer:
+        {
+            uint16_t offset = ( command_data[0] << 8 ) | command_data[1];
+            uint16_t size = command_data[2]; // size <= 28
+            dynamic_keymap_set_buffer( offset, size, &command_data[3] );
+            break;
+        }
+        case id_eeprom_reset:
+        {
+            via_eeprom_reset();
+            break;
+        }
+        case id_bootloader_jump:
+        {
+            // Need to send data back before the jump
+            // Informs host that the command is handled
+            raw_hid_send( data, length );
+            // Give host time to read it
+            wait_ms(100);
+            bootloader_jump();
+            break;
+        }
+        default:
+        {
+            // The command ID is not known
+            // Return the unhandled state
+            *command_id = id_unhandled;
+            break;
+        }
+    }
+
+    // Return the same buffer, optionally with values changed
+    // (i.e. returning state to the host, or the unhandled state).
+    raw_hid_send( data, length );
+}
diff --git a/quantum/via.h b/quantum/via.h
new file mode 100644
index 0000000000..f9a8017b24
--- /dev/null
+++ b/quantum/via.h
@@ -0,0 +1,151 @@
+/* Copyright 2019 Jason Williams (Wilba)
+ *
+ * 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/>.
+ */
+
+#pragma once
+
+#include <tmk_core/common/eeconfig.h> // for EECONFIG_SIZE
+
+// Keyboard level code can change where VIA stores the magic.
+// The magic is the build date YYMMDD encoded as BCD in 3 bytes,
+// thus installing firmware built on a different date to the one
+// already installed can be detected and the EEPROM data is reset.
+// The only reason this is important is in case EEPROM usage changes
+// and the EEPROM was not explicitly reset by bootmagic lite.
+#ifndef VIA_EEPROM_MAGIC_ADDR
+#   define VIA_EEPROM_MAGIC_ADDR (EECONFIG_SIZE)
+#endif
+
+#define VIA_EEPROM_LAYOUT_OPTIONS_ADDR (VIA_EEPROM_MAGIC_ADDR+3)
+
+// Changing the layout options size after release will invalidate EEPROM,
+// but this is something that should be set correctly on initial implementation.
+// 1 byte is enough for most uses (i.e. 8 binary states, or 6 binary + 1 ternary/quaternary )
+#ifndef VIA_EEPROM_LAYOUT_OPTIONS_SIZE
+#   define VIA_EEPROM_LAYOUT_OPTIONS_SIZE 1
+#endif
+
+// The end of the EEPROM memory used by VIA
+// By default, dynamic keymaps will start at this if there is no
+// custom config
+#define VIA_EEPROM_CUSTOM_CONFIG_ADDR (VIA_EEPROM_LAYOUT_OPTIONS_ADDR+VIA_EEPROM_LAYOUT_OPTIONS_SIZE)
+
+#ifndef VIA_EEPROM_CUSTOM_CONFIG_SIZE
+#   define VIA_EEPROM_CUSTOM_CONFIG_SIZE 0
+#endif
+
+// This is changed only when the command IDs change,
+// so VIA Configurator can detect compatible firmware. 
+#define VIA_PROTOCOL_VERSION 0x0009
+
+enum via_command_id
+{
+    id_get_protocol_version = 0x01, // always 0x01
+    id_get_keyboard_value,
+    id_set_keyboard_value,
+    id_dynamic_keymap_get_keycode,
+    id_dynamic_keymap_set_keycode,
+    id_dynamic_keymap_reset,
+    id_backlight_config_set_value,
+    id_backlight_config_get_value,
+    id_backlight_config_save,
+    id_eeprom_reset,
+    id_bootloader_jump,
+    id_dynamic_keymap_macro_get_count,
+    id_dynamic_keymap_macro_get_buffer_size,
+    id_dynamic_keymap_macro_get_buffer,
+    id_dynamic_keymap_macro_set_buffer,
+    id_dynamic_keymap_macro_reset,
+    id_dynamic_keymap_get_layer_count,
+    id_dynamic_keymap_get_buffer,
+    id_dynamic_keymap_set_buffer,
+    id_unhandled = 0xFF,
+};
+
+enum via_keyboard_value_id
+{
+  id_uptime = 0x01,
+  id_layout_options,
+  id_switch_matrix_state
+};
+
+// Can't use SAFE_RANGE here, it might change if someone adds
+// new values to enum quantum_keycodes.
+// Need to keep checking 0x5F10 is still in the safe range.
+// TODO: merge this into quantum_keycodes
+// Backlight keycodes are in range 0x5F00-0x5F0F
+enum via_keycodes {
+    FN_MO13 = 0x5F10,
+    FN_MO23,
+    MACRO00,
+    MACRO01,
+    MACRO02,
+    MACRO03,
+    MACRO04,
+    MACRO05,
+    MACRO06,
+    MACRO07,
+    MACRO08,
+    MACRO09,
+    MACRO10,
+    MACRO11,
+    MACRO12,
+    MACRO13,
+    MACRO14,
+    MACRO15,
+};
+
+enum user_keycodes {
+  USER00 = 0x5F80,
+  USER01,
+  USER02,
+  USER03,
+  USER04,
+  USER05,
+  USER06,
+  USER07,
+  USER08,
+  USER09,
+  USER10,
+  USER11,
+  USER12,
+  USER13,
+  USER14,
+  USER15,
+};
+
+// Can be called in an overriding via_init_kb() to test if keyboard level code usage of
+// EEPROM is invalid and use/save defaults.
+bool via_eeprom_is_valid(void);
+
+// Sets VIA/keyboard level usage of EEPROM to valid/invalid
+// Keyboard level code (eg. via_init_kb()) should not call this
+void via_eeprom_set_valid(bool valid);
+
+// Flag QMK and VIA/keyboard level EEPROM as invalid.
+// Used in bootmagic_lite() and VIA command handler.
+// Keyboard level code should not need to call this.
+void via_eeprom_reset(void);
+
+// Called by QMK core to initialize dynamic keymaps etc.
+void via_init(void);
+
+// Used by VIA to store and retrieve the layout options.
+uint32_t via_get_layout_options(void);
+void via_set_layout_options(uint32_t value);
+
+// Called by QMK core to process VIA-specific keycodes.
+bool process_record_via(uint16_t keycode, keyrecord_t *record);
+
diff --git a/show_options.mk b/show_options.mk
index 63ab3b0d7b..003169d4cb 100644
--- a/show_options.mk
+++ b/show_options.mk
@@ -10,7 +10,8 @@ BUILD_OPTION_NAMES = \
   DEBOUNCE_TYPE \
   SPLIT_KEYBOARD \
   DYNAMIC_KEYMAP_ENABLE \
-  USB_HID_ENABLE
+  USB_HID_ENABLE \
+  VIA_ENABLE
 
 HARDWARE_OPTION_NAMES = \
   SLEEP_LED_ENABLE \
diff --git a/tmk_core/common/eeconfig.h b/tmk_core/common/eeconfig.h
index 308f865e19..6fbe789031 100644
--- a/tmk_core/common/eeconfig.h
+++ b/tmk_core/common/eeconfig.h
@@ -48,6 +48,8 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #define EECONFIG_RGB_MATRIX_SPEED (uint8_t *)32
 // TODO: Combine these into a single word and single block of EEPROM
 #define EECONFIG_KEYMAP_UPPER_BYTE (uint8_t *)33
+// Size of EEPROM being used, other code can refer to this for available EEPROM
+#define EECONFIG_SIZE 34
 /* debug bit */
 #define EECONFIG_DEBUG_ENABLE (1 << 0)
 #define EECONFIG_DEBUG_MATRIX (1 << 1)
diff --git a/tmk_core/common/keyboard.c b/tmk_core/common/keyboard.c
index af2b2fd48b..794a9152fb 100644
--- a/tmk_core/common/keyboard.c
+++ b/tmk_core/common/keyboard.c
@@ -83,6 +83,9 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #ifdef VELOCIKEY_ENABLE
 #    include "velocikey.h"
 #endif
+#ifdef VIA_ENABLE
+#    include "via.h"
+#endif
 
 // Only enable this if console is enabled to print to
 #if defined(DEBUG_MATRIX_SCAN_RATE) && defined(CONSOLE_ENABLE)
@@ -217,6 +220,9 @@ __attribute__((weak)) bool is_keyboard_master(void) { return true; }
 void keyboard_init(void) {
     timer_init();
     matrix_init();
+#ifdef VIA_ENABLE
+    via_init();
+#endif
 #ifdef QWIIC_ENABLE
     qwiic_init();
 #endif