From ed648ba4f55ae3cf6adc7fa427f584cd9ff6facf Mon Sep 17 00:00:00 2001
From: Jerome Berclaz <jerome.berclaz@a3.epfl.ch>
Date: Fri, 28 Apr 2023 21:46:48 -0700
Subject: [PATCH 01/16] added modelh keyboard

---
 keyboards/modelh/bootloader_defs.h         |   10 +
 keyboards/modelh/chconf.h                  |  817 +++++++++++++++
 keyboards/modelh/config.h                  |  150 +++
 keyboards/modelh/halconf.h                 |  553 ++++++++++
 keyboards/modelh/info.json                 | 1066 ++++++++++++++++++++
 keyboards/modelh/keymaps/default/keymap.c  |   31 +
 keyboards/modelh/keymaps/default/readme.md |    1 +
 keyboards/modelh/mcuconf.h                 |  209 ++++
 keyboards/modelh/modelh.c                  |   48 +
 keyboards/modelh/modelh.h                  |   70 ++
 keyboards/modelh/readme.md                 |   19 +
 keyboards/modelh/rules.mk                  |   22 +
 12 files changed, 2996 insertions(+)
 create mode 100644 keyboards/modelh/bootloader_defs.h
 create mode 100644 keyboards/modelh/chconf.h
 create mode 100644 keyboards/modelh/config.h
 create mode 100644 keyboards/modelh/halconf.h
 create mode 100644 keyboards/modelh/info.json
 create mode 100644 keyboards/modelh/keymaps/default/keymap.c
 create mode 100644 keyboards/modelh/keymaps/default/readme.md
 create mode 100644 keyboards/modelh/mcuconf.h
 create mode 100644 keyboards/modelh/modelh.c
 create mode 100644 keyboards/modelh/modelh.h
 create mode 100644 keyboards/modelh/readme.md
 create mode 100644 keyboards/modelh/rules.mk

diff --git a/keyboards/modelh/bootloader_defs.h b/keyboards/modelh/bootloader_defs.h
new file mode 100644
index 000000000000..6b8fa9f727c9
--- /dev/null
+++ b/keyboards/modelh/bootloader_defs.h
@@ -0,0 +1,10 @@
+/* Address for jumping to bootloader on STM32 chips. */
+/* It is chip dependent, the correct number can be looked up here (page 175):
+ * http://www.st.com/web/en/resource/technical/document/application_note/CD00167594.pdf
+ * This also requires a patch to chibios:
+ *  <tmk_dir>/tmk_core/tool/chibios/ch-bootloader-jump.patch
+ */
+
+// STM32F103* does NOT have an USB bootloader in ROM (only serial),
+//  so setting anything here does not make much sense
+#define STM32_BOOTLOADER_ADDRESS 0x80000000
diff --git a/keyboards/modelh/chconf.h b/keyboards/modelh/chconf.h
new file mode 100644
index 000000000000..047468758083
--- /dev/null
+++ b/keyboards/modelh/chconf.h
@@ -0,0 +1,817 @@
+/*
+    ChibiOS - Copyright (C) 2006..2020 Giovanni Di Sirio
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+        http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+*/
+
+/**
+ * @file    rt/templates/chconf.h
+ * @brief   Configuration file template.
+ * @details A copy of this file must be placed in each project directory, it
+ *          contains the application specific kernel settings.
+ *
+ * @addtogroup config
+ * @details Kernel related settings and hooks.
+ * @{
+ */
+
+#ifndef CHCONF_H
+#define CHCONF_H
+
+#define _CHIBIOS_RT_CONF_
+#define _CHIBIOS_RT_CONF_VER_7_0_
+
+/*===========================================================================*/
+/**
+ * @name System settings
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @brief   Handling of instances.
+ * @note    If enabled then threads assigned to various instances can
+ *          interact each other using the same synchronization objects.
+ *          If disabled then each OS instance is a separate world, no
+ *          direct interactions are handled by the OS.
+ */
+#if !defined(CH_CFG_SMP_MODE)
+#define CH_CFG_SMP_MODE                     FALSE
+#endif
+
+/** @} */
+
+/*===========================================================================*/
+/**
+ * @name System timers settings
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @brief   System time counter resolution.
+ * @note    Allowed values are 16, 32 or 64 bits.
+ */
+#if !defined(CH_CFG_ST_RESOLUTION)
+#define CH_CFG_ST_RESOLUTION                32
+#endif
+
+/**
+ * @brief   System tick frequency.
+ * @details Frequency of the system timer that drives the system ticks. This
+ *          setting also defines the system tick time unit.
+ */
+#if !defined(CH_CFG_ST_FREQUENCY)
+#define CH_CFG_ST_FREQUENCY                 100000
+#endif
+
+/**
+ * @brief   Time intervals data size.
+ * @note    Allowed values are 16, 32 or 64 bits.
+ */
+#if !defined(CH_CFG_INTERVALS_SIZE)
+#define CH_CFG_INTERVALS_SIZE               32
+#endif
+
+/**
+ * @brief   Time types data size.
+ * @note    Allowed values are 16 or 32 bits.
+ */
+#if !defined(CH_CFG_TIME_TYPES_SIZE)
+#define CH_CFG_TIME_TYPES_SIZE              32
+#endif
+
+/**
+ * @brief   Time delta constant for the tick-less mode.
+ * @note    If this value is zero then the system uses the classic
+ *          periodic tick. This value represents the minimum number
+ *          of ticks that is safe to specify in a timeout directive.
+ *          The value one is not valid, timeouts are rounded up to
+ *          this value.
+ */
+#if !defined(CH_CFG_ST_TIMEDELTA)
+#define CH_CFG_ST_TIMEDELTA                 0
+#endif
+
+/** @} */
+
+/*===========================================================================*/
+/**
+ * @name Kernel parameters and options
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @brief   Round robin interval.
+ * @details This constant is the number of system ticks allowed for the
+ *          threads before preemption occurs. Setting this value to zero
+ *          disables the preemption for threads with equal priority and the
+ *          round robin becomes cooperative. Note that higher priority
+ *          threads can still preempt, the kernel is always preemptive.
+ * @note    Disabling the round robin preemption makes the kernel more compact
+ *          and generally faster.
+ * @note    The round robin preemption is not supported in tickless mode and
+ *          must be set to zero in that case.
+ */
+#if !defined(CH_CFG_TIME_QUANTUM)
+#define CH_CFG_TIME_QUANTUM                 0
+#endif
+
+/**
+ * @brief   Idle thread automatic spawn suppression.
+ * @details When this option is activated the function @p chSysInit()
+ *          does not spawn the idle thread. The application @p main()
+ *          function becomes the idle thread and must implement an
+ *          infinite loop.
+ */
+#if !defined(CH_CFG_NO_IDLE_THREAD)
+#define CH_CFG_NO_IDLE_THREAD               FALSE
+#endif
+
+/** @} */
+
+/*===========================================================================*/
+/**
+ * @name Performance options
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @brief   OS optimization.
+ * @details If enabled then time efficient rather than space efficient code
+ *          is used when two possible implementations exist.
+ *
+ * @note    This is not related to the compiler optimization options.
+ * @note    The default is @p TRUE.
+ */
+#if !defined(CH_CFG_OPTIMIZE_SPEED)
+#define CH_CFG_OPTIMIZE_SPEED               TRUE
+#endif
+
+/** @} */
+
+/*===========================================================================*/
+/**
+ * @name Subsystem options
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @brief   Time Measurement APIs.
+ * @details If enabled then the time measurement APIs are included in
+ *          the kernel.
+ *
+ * @note    The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_TM)
+#define CH_CFG_USE_TM                       TRUE
+#endif
+
+/**
+ * @brief   Time Stamps APIs.
+ * @details If enabled then the time stamps APIs are included in the kernel.
+ *
+ * @note    The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_TIMESTAMP)
+#define CH_CFG_USE_TIMESTAMP                TRUE
+#endif
+
+/**
+ * @brief   Threads registry APIs.
+ * @details If enabled then the registry APIs are included in the kernel.
+ *
+ * @note    The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_REGISTRY)
+#define CH_CFG_USE_REGISTRY                 TRUE
+#endif
+
+/**
+ * @brief   Threads synchronization APIs.
+ * @details If enabled then the @p chThdWait() function is included in
+ *          the kernel.
+ *
+ * @note    The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_WAITEXIT)
+#define CH_CFG_USE_WAITEXIT                 TRUE
+#endif
+
+/**
+ * @brief   Semaphores APIs.
+ * @details If enabled then the Semaphores APIs are included in the kernel.
+ *
+ * @note    The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_SEMAPHORES)
+#define CH_CFG_USE_SEMAPHORES               TRUE
+#endif
+
+/**
+ * @brief   Semaphores queuing mode.
+ * @details If enabled then the threads are enqueued on semaphores by
+ *          priority rather than in FIFO order.
+ *
+ * @note    The default is @p FALSE. Enable this if you have special
+ *          requirements.
+ * @note    Requires @p CH_CFG_USE_SEMAPHORES.
+ */
+#if !defined(CH_CFG_USE_SEMAPHORES_PRIORITY)
+#define CH_CFG_USE_SEMAPHORES_PRIORITY      FALSE
+#endif
+
+/**
+ * @brief   Mutexes APIs.
+ * @details If enabled then the mutexes APIs are included in the kernel.
+ *
+ * @note    The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_MUTEXES)
+#define CH_CFG_USE_MUTEXES                  TRUE
+#endif
+
+/**
+ * @brief   Enables recursive behavior on mutexes.
+ * @note    Recursive mutexes are heavier and have an increased
+ *          memory footprint.
+ *
+ * @note    The default is @p FALSE.
+ * @note    Requires @p CH_CFG_USE_MUTEXES.
+ */
+#if !defined(CH_CFG_USE_MUTEXES_RECURSIVE)
+#define CH_CFG_USE_MUTEXES_RECURSIVE        FALSE
+#endif
+
+/**
+ * @brief   Conditional Variables APIs.
+ * @details If enabled then the conditional variables APIs are included
+ *          in the kernel.
+ *
+ * @note    The default is @p TRUE.
+ * @note    Requires @p CH_CFG_USE_MUTEXES.
+ */
+#if !defined(CH_CFG_USE_CONDVARS)
+#define CH_CFG_USE_CONDVARS                 TRUE
+#endif
+
+/**
+ * @brief   Conditional Variables APIs with timeout.
+ * @details If enabled then the conditional variables APIs with timeout
+ *          specification are included in the kernel.
+ *
+ * @note    The default is @p TRUE.
+ * @note    Requires @p CH_CFG_USE_CONDVARS.
+ */
+#if !defined(CH_CFG_USE_CONDVARS_TIMEOUT)
+#define CH_CFG_USE_CONDVARS_TIMEOUT         FALSE
+#endif
+
+/**
+ * @brief   Events Flags APIs.
+ * @details If enabled then the event flags APIs are included in the kernel.
+ *
+ * @note    The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_EVENTS)
+#define CH_CFG_USE_EVENTS                   TRUE
+#endif
+
+/**
+ * @brief   Events Flags APIs with timeout.
+ * @details If enabled then the events APIs with timeout specification
+ *          are included in the kernel.
+ *
+ * @note    The default is @p TRUE.
+ * @note    Requires @p CH_CFG_USE_EVENTS.
+ */
+#if !defined(CH_CFG_USE_EVENTS_TIMEOUT)
+#define CH_CFG_USE_EVENTS_TIMEOUT           TRUE
+#endif
+
+/**
+ * @brief   Synchronous Messages APIs.
+ * @details If enabled then the synchronous messages APIs are included
+ *          in the kernel.
+ *
+ * @note    The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_MESSAGES)
+#define CH_CFG_USE_MESSAGES                 TRUE
+#endif
+
+/**
+ * @brief   Synchronous Messages queuing mode.
+ * @details If enabled then messages are served by priority rather than in
+ *          FIFO order.
+ *
+ * @note    The default is @p FALSE. Enable this if you have special
+ *          requirements.
+ * @note    Requires @p CH_CFG_USE_MESSAGES.
+ */
+#if !defined(CH_CFG_USE_MESSAGES_PRIORITY)
+#define CH_CFG_USE_MESSAGES_PRIORITY        FALSE
+#endif
+
+/**
+ * @brief   Dynamic Threads APIs.
+ * @details If enabled then the dynamic threads creation APIs are included
+ *          in the kernel.
+ *
+ * @note    The default is @p TRUE.
+ * @note    Requires @p CH_CFG_USE_WAITEXIT.
+ * @note    Requires @p CH_CFG_USE_HEAP and/or @p CH_CFG_USE_MEMPOOLS.
+ */
+#if !defined(CH_CFG_USE_DYNAMIC)
+#define CH_CFG_USE_DYNAMIC                  FALSE
+#endif
+
+/** @} */
+
+/*===========================================================================*/
+/**
+ * @name OSLIB options
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @brief   Mailboxes APIs.
+ * @details If enabled then the asynchronous messages (mailboxes) APIs are
+ *          included in the kernel.
+ *
+ * @note    The default is @p TRUE.
+ * @note    Requires @p CH_CFG_USE_SEMAPHORES.
+ */
+#if !defined(CH_CFG_USE_MAILBOXES)
+#define CH_CFG_USE_MAILBOXES                TRUE
+#endif
+
+/**
+ * @brief   Core Memory Manager APIs.
+ * @details If enabled then the core memory manager APIs are included
+ *          in the kernel.
+ *
+ * @note    The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_MEMCORE)
+#define CH_CFG_USE_MEMCORE                  TRUE
+#endif
+
+/**
+ * @brief   Managed RAM size.
+ * @details Size of the RAM area to be managed by the OS. If set to zero
+ *          then the whole available RAM is used. The core memory is made
+ *          available to the heap allocator and/or can be used directly through
+ *          the simplified core memory allocator.
+ *
+ * @note    In order to let the OS manage the whole RAM the linker script must
+ *          provide the @p __heap_base__ and @p __heap_end__ symbols.
+ * @note    Requires @p CH_CFG_USE_MEMCORE.
+ */
+#if !defined(CH_CFG_MEMCORE_SIZE)
+#define CH_CFG_MEMCORE_SIZE                 0
+#endif
+
+/**
+ * @brief   Heap Allocator APIs.
+ * @details If enabled then the memory heap allocator APIs are included
+ *          in the kernel.
+ *
+ * @note    The default is @p TRUE.
+ * @note    Requires @p CH_CFG_USE_MEMCORE and either @p CH_CFG_USE_MUTEXES or
+ *          @p CH_CFG_USE_SEMAPHORES.
+ * @note    Mutexes are recommended.
+ */
+#if !defined(CH_CFG_USE_HEAP)
+#define CH_CFG_USE_HEAP                     TRUE
+#endif
+
+/**
+ * @brief   Memory Pools Allocator APIs.
+ * @details If enabled then the memory pools allocator APIs are included
+ *          in the kernel.
+ *
+ * @note    The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_MEMPOOLS)
+#define CH_CFG_USE_MEMPOOLS                 FALSE
+#endif
+
+/**
+ * @brief   Objects FIFOs APIs.
+ * @details If enabled then the objects FIFOs APIs are included
+ *          in the kernel.
+ *
+ * @note    The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_OBJ_FIFOS)
+#define CH_CFG_USE_OBJ_FIFOS                FALSE
+#endif
+
+/**
+ * @brief   Pipes APIs.
+ * @details If enabled then the pipes APIs are included
+ *          in the kernel.
+ *
+ * @note    The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_PIPES)
+#define CH_CFG_USE_PIPES                    FALSE
+#endif
+
+/**
+ * @brief   Objects Caches APIs.
+ * @details If enabled then the objects caches APIs are included
+ *          in the kernel.
+ *
+ * @note    The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_OBJ_CACHES)
+#define CH_CFG_USE_OBJ_CACHES               TRUE
+#endif
+
+/**
+ * @brief   Delegate threads APIs.
+ * @details If enabled then the delegate threads APIs are included
+ *          in the kernel.
+ *
+ * @note    The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_DELEGATES)
+#define CH_CFG_USE_DELEGATES                TRUE
+#endif
+
+/**
+ * @brief   Jobs Queues APIs.
+ * @details If enabled then the jobs queues APIs are included
+ *          in the kernel.
+ *
+ * @note    The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_JOBS)
+#define CH_CFG_USE_JOBS                     FALSE
+#endif
+
+/** @} */
+
+/*===========================================================================*/
+/**
+ * @name Objects factory options
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @brief   Objects Factory APIs.
+ * @details If enabled then the objects factory APIs are included in the
+ *          kernel.
+ *
+ * @note    The default is @p FALSE.
+ */
+#if !defined(CH_CFG_USE_FACTORY)
+#define CH_CFG_USE_FACTORY                  FALSE
+#endif
+
+/**
+ * @brief   Maximum length for object names.
+ * @details If the specified length is zero then the name is stored by
+ *          pointer but this could have unintended side effects.
+ */
+#if !defined(CH_CFG_FACTORY_MAX_NAMES_LENGTH)
+#define CH_CFG_FACTORY_MAX_NAMES_LENGTH     8
+#endif
+
+/**
+ * @brief   Enables the registry of generic objects.
+ */
+#if !defined(CH_CFG_FACTORY_OBJECTS_REGISTRY)
+#define CH_CFG_FACTORY_OBJECTS_REGISTRY     FALSE
+#endif
+
+/**
+ * @brief   Enables factory for generic buffers.
+ */
+#if !defined(CH_CFG_FACTORY_GENERIC_BUFFERS)
+#define CH_CFG_FACTORY_GENERIC_BUFFERS      FALSE
+#endif
+
+/**
+ * @brief   Enables factory for semaphores.
+ */
+#if !defined(CH_CFG_FACTORY_SEMAPHORES)
+#define CH_CFG_FACTORY_SEMAPHORES           FALSE
+#endif
+
+/**
+ * @brief   Enables factory for mailboxes.
+ */
+#if !defined(CH_CFG_FACTORY_MAILBOXES)
+#define CH_CFG_FACTORY_MAILBOXES            FALSE
+#endif
+
+/**
+ * @brief   Enables factory for objects FIFOs.
+ */
+#if !defined(CH_CFG_FACTORY_OBJ_FIFOS)
+#define CH_CFG_FACTORY_OBJ_FIFOS            FALSE
+#endif
+
+/**
+ * @brief   Enables factory for Pipes.
+ */
+#if !defined(CH_CFG_FACTORY_PIPES) || defined(__DOXYGEN__)
+#define CH_CFG_FACTORY_PIPES                FALSE
+#endif
+
+/** @} */
+
+/*===========================================================================*/
+/**
+ * @name Debug options
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @brief   Debug option, kernel statistics.
+ *
+ * @note    The default is @p FALSE.
+ */
+#if !defined(CH_DBG_STATISTICS)
+#define CH_DBG_STATISTICS                   FALSE
+#endif
+
+/**
+ * @brief   Debug option, system state check.
+ * @details If enabled the correct call protocol for system APIs is checked
+ *          at runtime.
+ *
+ * @note    The default is @p FALSE.
+ */
+#if !defined(CH_DBG_SYSTEM_STATE_CHECK)
+#define CH_DBG_SYSTEM_STATE_CHECK           FALSE
+#endif
+
+/**
+ * @brief   Debug option, parameters checks.
+ * @details If enabled then the checks on the API functions input
+ *          parameters are activated.
+ *
+ * @note    The default is @p FALSE.
+ */
+#if !defined(CH_DBG_ENABLE_CHECKS)
+#define CH_DBG_ENABLE_CHECKS                FALSE
+#endif
+
+/**
+ * @brief   Debug option, consistency checks.
+ * @details If enabled then all the assertions in the kernel code are
+ *          activated. This includes consistency checks inside the kernel,
+ *          runtime anomalies and port-defined checks.
+ *
+ * @note    The default is @p FALSE.
+ */
+#if !defined(CH_DBG_ENABLE_ASSERTS)
+#define CH_DBG_ENABLE_ASSERTS               FALSE
+#endif
+
+/**
+ * @brief   Debug option, trace buffer.
+ * @details If enabled then the trace buffer is activated.
+ *
+ * @note    The default is @p CH_DBG_TRACE_MASK_DISABLED.
+ */
+#if !defined(CH_DBG_TRACE_MASK)
+#define CH_DBG_TRACE_MASK                   CH_DBG_TRACE_MASK_DISABLED
+#endif
+
+/**
+ * @brief   Trace buffer entries.
+ * @note    The trace buffer is only allocated if @p CH_DBG_TRACE_MASK is
+ *          different from @p CH_DBG_TRACE_MASK_DISABLED.
+ */
+#if !defined(CH_DBG_TRACE_BUFFER_SIZE)
+#define CH_DBG_TRACE_BUFFER_SIZE            128
+#endif
+
+/**
+ * @brief   Debug option, stack checks.
+ * @details If enabled then a runtime stack check is performed.
+ *
+ * @note    The default is @p FALSE.
+ * @note    The stack check is performed in a architecture/port dependent way.
+ *          It may not be implemented or some ports.
+ * @note    The default failure mode is to halt the system with the global
+ *          @p panic_msg variable set to @p NULL.
+ */
+#if !defined(CH_DBG_ENABLE_STACK_CHECK)
+#define CH_DBG_ENABLE_STACK_CHECK           FALSE
+#endif
+
+/**
+ * @brief   Debug option, stacks initialization.
+ * @details If enabled then the threads working area is filled with a byte
+ *          value when a thread is created. This can be useful for the
+ *          runtime measurement of the used stack.
+ *
+ * @note    The default is @p FALSE.
+ */
+#if !defined(CH_DBG_FILL_THREADS)
+#define CH_DBG_FILL_THREADS                 FALSE
+#endif
+
+/**
+ * @brief   Debug option, threads profiling.
+ * @details If enabled then a field is added to the @p thread_t structure that
+ *          counts the system ticks occurred while executing the thread.
+ *
+ * @note    The default is @p FALSE.
+ * @note    This debug option is not currently compatible with the
+ *          tickless mode.
+ */
+#if !defined(CH_DBG_THREADS_PROFILING)
+#define CH_DBG_THREADS_PROFILING            FALSE
+#endif
+
+/** @} */
+
+/*===========================================================================*/
+/**
+ * @name Kernel hooks
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @brief   System structure extension.
+ * @details User fields added to the end of the @p ch_system_t structure.
+ */
+#define CH_CFG_SYSTEM_EXTRA_FIELDS                                          \
+  /* Add system custom fields here.*/
+
+/**
+ * @brief   System initialization hook.
+ * @details User initialization code added to the @p chSysInit() function
+ *          just before interrupts are enabled globally.
+ */
+#define CH_CFG_SYSTEM_INIT_HOOK() {                                         \
+  /* Add system initialization code here.*/                                 \
+}
+
+/**
+ * @brief   OS instance structure extension.
+ * @details User fields added to the end of the @p os_instance_t structure.
+ */
+#define CH_CFG_OS_INSTANCE_EXTRA_FIELDS                                     \
+  /* Add OS instance custom fields here.*/
+
+/**
+ * @brief   OS instance initialization hook.
+ *
+ * @param[in] oip       pointer to the @p os_instance_t structure
+ */
+#define CH_CFG_OS_INSTANCE_INIT_HOOK(oip) {                                 \
+  /* Add OS instance initialization code here.*/                            \
+}
+
+/**
+ * @brief   Threads descriptor structure extension.
+ * @details User fields added to the end of the @p thread_t structure.
+ */
+#define CH_CFG_THREAD_EXTRA_FIELDS                                          \
+  /* Add threads custom fields here.*/
+
+/**
+ * @brief   Threads initialization hook.
+ * @details User initialization code added to the @p _thread_init() function.
+ *
+ * @note    It is invoked from within @p _thread_init() and implicitly from all
+ *          the threads creation APIs.
+ *
+ * @param[in] tp        pointer to the @p thread_t structure
+ */
+#define CH_CFG_THREAD_INIT_HOOK(tp) {                                       \
+  /* Add threads initialization code here.*/                                \
+}
+
+/**
+ * @brief   Threads finalization hook.
+ * @details User finalization code added to the @p chThdExit() API.
+ *
+ * @param[in] tp        pointer to the @p thread_t structure
+ */
+#define CH_CFG_THREAD_EXIT_HOOK(tp) {                                       \
+  /* Add threads finalization code here.*/                                  \
+}
+
+/**
+ * @brief   Context switch hook.
+ * @details This hook is invoked just before switching between threads.
+ *
+ * @param[in] ntp       thread being switched in
+ * @param[in] otp       thread being switched out
+ */
+#define CH_CFG_CONTEXT_SWITCH_HOOK(ntp, otp) {                              \
+  /* Context switch code here.*/                                            \
+}
+
+/**
+ * @brief   ISR enter hook.
+ */
+#define CH_CFG_IRQ_PROLOGUE_HOOK() {                                        \
+  /* IRQ prologue code here.*/                                              \
+}
+
+/**
+ * @brief   ISR exit hook.
+ */
+#define CH_CFG_IRQ_EPILOGUE_HOOK() {                                        \
+  /* IRQ epilogue code here.*/                                              \
+}
+
+/**
+ * @brief   Idle thread enter hook.
+ * @note    This hook is invoked within a critical zone, no OS functions
+ *          should be invoked from here.
+ * @note    This macro can be used to activate a power saving mode.
+ */
+#define CH_CFG_IDLE_ENTER_HOOK() {                                          \
+  /* Idle-enter code here.*/                                                \
+}
+
+/**
+ * @brief   Idle thread leave hook.
+ * @note    This hook is invoked within a critical zone, no OS functions
+ *          should be invoked from here.
+ * @note    This macro can be used to deactivate a power saving mode.
+ */
+#define CH_CFG_IDLE_LEAVE_HOOK() {                                          \
+  /* Idle-leave code here.*/                                                \
+}
+
+/**
+ * @brief   Idle Loop hook.
+ * @details This hook is continuously invoked by the idle thread loop.
+ */
+#define CH_CFG_IDLE_LOOP_HOOK() {                                           \
+  /* Idle loop code here.*/                                                 \
+}
+
+/**
+ * @brief   System tick event hook.
+ * @details This hook is invoked in the system tick handler immediately
+ *          after processing the virtual timers queue.
+ */
+#define CH_CFG_SYSTEM_TICK_HOOK() {                                         \
+  /* System tick event code here.*/                                         \
+}
+
+/**
+ * @brief   System halt hook.
+ * @details This hook is invoked in case to a system halting error before
+ *          the system is halted.
+ */
+#define CH_CFG_SYSTEM_HALT_HOOK(reason) {                                   \
+  /* System halt code here.*/                                               \
+}
+
+/**
+ * @brief   Trace hook.
+ * @details This hook is invoked each time a new record is written in the
+ *          trace buffer.
+ */
+#define CH_CFG_TRACE_HOOK(tep) {                                            \
+  /* Trace code here.*/                                                     \
+}
+
+/**
+ * @brief   Runtime Faults Collection Unit hook.
+ * @details This hook is invoked each time new faults are collected and stored.
+ */
+#define CH_CFG_RUNTIME_FAULTS_HOOK(mask) {                                  \
+  /* Faults handling code here.*/                                           \
+}
+
+/** @} */
+
+/*===========================================================================*/
+/* Port-specific settings (override port settings defaulted in chcore.h).    */
+/*===========================================================================*/
+
+#endif  /* CHCONF_H */
+
+/** @} */
diff --git a/keyboards/modelh/config.h b/keyboards/modelh/config.h
new file mode 100644
index 000000000000..7e8b76c20303
--- /dev/null
+++ b/keyboards/modelh/config.h
@@ -0,0 +1,150 @@
+/*
+Copyright 2020 John Hawthorn
+
+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 "config_common.h"
+
+/* Model H customizations */
+#define MODELH_LED_PINS { B9, B8, B7 }
+
+#define MODELH_STATUS_LED C13
+
+
+/* key matrix size */
+#define MATRIX_ROWS 8
+#define MATRIX_COLS 16
+
+/*
+ * Keyboard Matrix Assignments
+ *
+ * Change this to how you wired your keyboard
+ * COLS: AVR pins used for columns, left to right
+ * ROWS: AVR pins used for rows, top to bottom
+ * DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode)
+ *                  ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode)
+ *
+ */
+#define MATRIX_ROW_PINS { B6, B5, B4, A15, B3, A0, A2, A1 }
+#define MATRIX_COL_PINS { A10, A9, A8, B15, B14, B13, B12, B11, B10, B1, B0, A7, A6, A5, A4, A3 }
+//#define UNUSED_PINS
+
+/* COL2ROW, ROW2COL */
+#define DIODE_DIRECTION COL2ROW
+
+/*
+ * Split Keyboard specific options, make sure you have 'SPLIT_KEYBOARD = yes' in your rules.mk, and define SOFT_SERIAL_PIN.
+ */
+//#define SOFT_SERIAL_PIN D0  // or D1, D2, D3, E6
+
+//#define BACKLIGHT_PIN B7
+//#define BACKLIGHT_LEVELS 3
+//#define BACKLIGHT_BREATHING
+
+// Model H should use absolute maximum 80mA when all LEDs are on and it is in
+// use. Only requesting 100mA should allow it to work with devices only
+// supporting USB 1.0 power levels like some iPads.
+#define USB_MAX_POWER_CONSUMPTION 100
+
+//#define RGB_DI_PIN E2
+//#ifdef RGB_DI_PIN
+//#    define RGBLED_NUM 16
+//#    define RGBLIGHT_HUE_STEP 8
+//#    define RGBLIGHT_SAT_STEP 8
+//#    define RGBLIGHT_VAL_STEP 8
+//#    define RGBLIGHT_LIMIT_VAL 255 /* The maximum brightness level */
+//#    define RGBLIGHT_SLEEP  /* If defined, the RGB lighting will be switched off when the host goes to sleep */
+/*== all animations enable ==*/
+//#    define RGBLIGHT_ANIMATIONS
+/*== or choose animations ==*/
+//#    define RGBLIGHT_EFFECT_BREATHING
+//#    define RGBLIGHT_EFFECT_RAINBOW_MOOD
+//#    define RGBLIGHT_EFFECT_RAINBOW_SWIRL
+//#    define RGBLIGHT_EFFECT_SNAKE
+//#    define RGBLIGHT_EFFECT_KNIGHT
+//#    define RGBLIGHT_EFFECT_CHRISTMAS
+//#    define RGBLIGHT_EFFECT_STATIC_GRADIENT
+//#    define RGBLIGHT_EFFECT_RGB_TEST
+//#    define RGBLIGHT_EFFECT_ALTERNATING
+/*== customize breathing effect ==*/
+/*==== (DEFAULT) use fixed table instead of exp() and sin() ====*/
+//#    define RGBLIGHT_BREATHE_TABLE_SIZE 256      // 256(default) or 128 or 64
+/*==== use exp() and sin() ====*/
+//#    define RGBLIGHT_EFFECT_BREATHE_CENTER 1.85  // 1 to 2.7
+//#    define RGBLIGHT_EFFECT_BREATHE_MAX    255   // 0 to 255
+//#endif
+
+/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
+#define DEBOUNCE 5
+
+/* define if matrix has ghost (lacks anti-ghosting diodes) */
+#define MATRIX_HAS_GHOST
+
+/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
+#define LOCKING_SUPPORT_ENABLE
+/* Locking resynchronize hack */
+#define LOCKING_RESYNC_ENABLE
+
+/* If defined, GRAVE_ESC will always act as ESC when CTRL is held.
+ * This is useful for the Windows task manager shortcut (ctrl+shift+esc).
+ */
+//#define GRAVE_ESC_CTRL_OVERRIDE
+
+/*
+ * Force NKRO
+ *
+ * Force NKRO (nKey Rollover) to be enabled by default, regardless of the saved
+ * state in the bootmagic EEPROM settings. (Note that NKRO must be enabled in the
+ * makefile for this to work.)
+ *
+ * If forced on, NKRO can be disabled via magic key (default = LShift+RShift+N)
+ * until the next keyboard reset.
+ *
+ * NKRO may prevent your keystrokes from being detected in the BIOS, but it is
+ * fully operational during normal computer usage.
+ *
+ * For a less heavy-handed approach, enable NKRO via magic key (LShift+RShift+N)
+ * or via bootmagic (hold SPACE+N while plugging in the keyboard). Once set by
+ * bootmagic, NKRO mode will always be enabled until it is toggled again during a
+ * power-up.
+ *
+ */
+//#define FORCE_NKRO
+
+/*
+ * Feature disable options
+ *  These options are also useful to firmware size reduction.
+ */
+
+/* disable debug print */
+//#define NO_DEBUG
+
+/* disable print */
+//#define NO_PRINT
+
+/* disable action features */
+//#define NO_ACTION_LAYER
+//#define NO_ACTION_TAPPING
+//#define NO_ACTION_ONESHOT
+
+/* disable these deprecated features by default */
+//#define NO_ACTION_MACRO
+//#define NO_ACTION_FUNCTION
+
+/* Bootmagic Lite key configuration */
+//#define BOOTMAGIC_LITE_ROW 0
+//#define BOOTMAGIC_LITE_COLUMN 0
diff --git a/keyboards/modelh/halconf.h b/keyboards/modelh/halconf.h
new file mode 100644
index 000000000000..80abf9688d05
--- /dev/null
+++ b/keyboards/modelh/halconf.h
@@ -0,0 +1,553 @@
+/*
+    ChibiOS - Copyright (C) 2006..2020 Giovanni Di Sirio
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+        http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+*/
+
+/**
+ * @file    templates/halconf.h
+ * @brief   HAL configuration header.
+ * @details HAL configuration file, this file allows to enable or disable the
+ *          various device drivers from your application. You may also use
+ *          this file in order to override the device drivers default settings.
+ *
+ * @addtogroup HAL_CONF
+ * @{
+ */
+
+#ifndef HALCONF_H
+#define HALCONF_H
+
+#define _CHIBIOS_HAL_CONF_
+#define _CHIBIOS_HAL_CONF_VER_8_4_
+
+#include "mcuconf.h"
+
+/**
+ * @brief   Enables the PAL subsystem.
+ */
+#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__)
+#define HAL_USE_PAL                         TRUE
+#endif
+
+/**
+ * @brief   Enables the ADC subsystem.
+ */
+#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__)
+#define HAL_USE_ADC                         FALSE
+#endif
+
+/**
+ * @brief   Enables the CAN subsystem.
+ */
+#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__)
+#define HAL_USE_CAN                         FALSE
+#endif
+
+/**
+ * @brief   Enables the cryptographic subsystem.
+ */
+#if !defined(HAL_USE_CRY) || defined(__DOXYGEN__)
+#define HAL_USE_CRY                         FALSE
+#endif
+
+/**
+ * @brief   Enables the DAC subsystem.
+ */
+#if !defined(HAL_USE_DAC) || defined(__DOXYGEN__)
+#define HAL_USE_DAC                         FALSE
+#endif
+
+/**
+ * @brief   Enables the EFlash subsystem.
+ */
+#if !defined(HAL_USE_EFL) || defined(__DOXYGEN__)
+#define HAL_USE_EFL                         FALSE
+#endif
+
+/**
+ * @brief   Enables the GPT subsystem.
+ */
+#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__)
+#define HAL_USE_GPT                         FALSE
+#endif
+
+/**
+ * @brief   Enables the I2C subsystem.
+ */
+#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__)
+#define HAL_USE_I2C                         FALSE
+#endif
+
+/**
+ * @brief   Enables the I2S subsystem.
+ */
+#if !defined(HAL_USE_I2S) || defined(__DOXYGEN__)
+#define HAL_USE_I2S                         FALSE
+#endif
+
+/**
+ * @brief   Enables the ICU subsystem.
+ */
+#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__)
+#define HAL_USE_ICU                         FALSE
+#endif
+
+/**
+ * @brief   Enables the MAC subsystem.
+ */
+#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__)
+#define HAL_USE_MAC                         FALSE
+#endif
+
+/**
+ * @brief   Enables the MMC_SPI subsystem.
+ */
+#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__)
+#define HAL_USE_MMC_SPI                     FALSE
+#endif
+
+/**
+ * @brief   Enables the PWM subsystem.
+ */
+#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__)
+#define HAL_USE_PWM                         TRUE
+#endif
+
+/**
+ * @brief   Enables the RTC subsystem.
+ */
+#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__)
+#define HAL_USE_RTC                         FALSE
+#endif
+
+/**
+ * @brief   Enables the SDC subsystem.
+ */
+#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__)
+#define HAL_USE_SDC                         FALSE
+#endif
+
+/**
+ * @brief   Enables the SERIAL subsystem.
+ */
+#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__)
+#define HAL_USE_SERIAL                      FALSE
+#endif
+
+/**
+ * @brief   Enables the SERIAL over USB subsystem.
+ */
+#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__)
+#define HAL_USE_SERIAL_USB                  FALSE
+#endif
+
+/**
+ * @brief   Enables the SIO subsystem.
+ */
+#if !defined(HAL_USE_SIO) || defined(__DOXYGEN__)
+#define HAL_USE_SIO                         FALSE
+#endif
+
+/**
+ * @brief   Enables the SPI subsystem.
+ */
+#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__)
+#define HAL_USE_SPI                         FALSE
+#endif
+
+/**
+ * @brief   Enables the TRNG subsystem.
+ */
+#if !defined(HAL_USE_TRNG) || defined(__DOXYGEN__)
+#define HAL_USE_TRNG                        FALSE
+#endif
+
+/**
+ * @brief   Enables the UART subsystem.
+ */
+#if !defined(HAL_USE_UART) || defined(__DOXYGEN__)
+#define HAL_USE_UART                        FALSE
+#endif
+
+/**
+ * @brief   Enables the USB subsystem.
+ */
+#if !defined(HAL_USE_USB) || defined(__DOXYGEN__)
+#define HAL_USE_USB                         TRUE
+#endif
+
+/**
+ * @brief   Enables the WDG subsystem.
+ */
+#if !defined(HAL_USE_WDG) || defined(__DOXYGEN__)
+#define HAL_USE_WDG                         FALSE
+#endif
+
+/**
+ * @brief   Enables the WSPI subsystem.
+ */
+#if !defined(HAL_USE_WSPI) || defined(__DOXYGEN__)
+#define HAL_USE_WSPI                        FALSE
+#endif
+
+/*===========================================================================*/
+/* PAL driver related settings.                                              */
+/*===========================================================================*/
+
+/**
+ * @brief   Enables synchronous APIs.
+ * @note    Disabling this option saves both code and data space.
+ */
+#if !defined(PAL_USE_CALLBACKS) || defined(__DOXYGEN__)
+#define PAL_USE_CALLBACKS                   FALSE
+#endif
+
+/**
+ * @brief   Enables synchronous APIs.
+ * @note    Disabling this option saves both code and data space.
+ */
+#if !defined(PAL_USE_WAIT) || defined(__DOXYGEN__)
+#define PAL_USE_WAIT                        FALSE
+#endif
+
+/*===========================================================================*/
+/* ADC driver related settings.                                              */
+/*===========================================================================*/
+
+/**
+ * @brief   Enables synchronous APIs.
+ * @note    Disabling this option saves both code and data space.
+ */
+#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__)
+#define ADC_USE_WAIT                        TRUE
+#endif
+
+/**
+ * @brief   Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs.
+ * @note    Disabling this option saves both code and data space.
+ */
+#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__)
+#define ADC_USE_MUTUAL_EXCLUSION            TRUE
+#endif
+
+/*===========================================================================*/
+/* CAN driver related settings.                                              */
+/*===========================================================================*/
+
+/**
+ * @brief   Sleep mode related APIs inclusion switch.
+ */
+#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__)
+#define CAN_USE_SLEEP_MODE                  TRUE
+#endif
+
+/**
+ * @brief   Enforces the driver to use direct callbacks rather than OSAL events.
+ */
+#if !defined(CAN_ENFORCE_USE_CALLBACKS) || defined(__DOXYGEN__)
+#define CAN_ENFORCE_USE_CALLBACKS           FALSE
+#endif
+
+/*===========================================================================*/
+/* CRY driver related settings.                                              */
+/*===========================================================================*/
+
+/**
+ * @brief   Enables the SW fall-back of the cryptographic driver.
+ * @details When enabled, this option, activates a fall-back software
+ *          implementation for algorithms not supported by the underlying
+ *          hardware.
+ * @note    Fall-back implementations may not be present for all algorithms.
+ */
+#if !defined(HAL_CRY_USE_FALLBACK) || defined(__DOXYGEN__)
+#define HAL_CRY_USE_FALLBACK                FALSE
+#endif
+
+/**
+ * @brief   Makes the driver forcibly use the fall-back implementations.
+ */
+#if !defined(HAL_CRY_ENFORCE_FALLBACK) || defined(__DOXYGEN__)
+#define HAL_CRY_ENFORCE_FALLBACK            FALSE
+#endif
+
+/*===========================================================================*/
+/* DAC driver related settings.                                              */
+/*===========================================================================*/
+
+/**
+ * @brief   Enables synchronous APIs.
+ * @note    Disabling this option saves both code and data space.
+ */
+#if !defined(DAC_USE_WAIT) || defined(__DOXYGEN__)
+#define DAC_USE_WAIT                        TRUE
+#endif
+
+/**
+ * @brief   Enables the @p dacAcquireBus() and @p dacReleaseBus() APIs.
+ * @note    Disabling this option saves both code and data space.
+ */
+#if !defined(DAC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__)
+#define DAC_USE_MUTUAL_EXCLUSION            TRUE
+#endif
+
+/*===========================================================================*/
+/* I2C driver related settings.                                              */
+/*===========================================================================*/
+
+/**
+ * @brief   Enables the mutual exclusion APIs on the I2C bus.
+ */
+#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__)
+#define I2C_USE_MUTUAL_EXCLUSION            TRUE
+#endif
+
+/*===========================================================================*/
+/* MAC driver related settings.                                              */
+/*===========================================================================*/
+
+/**
+ * @brief   Enables the zero-copy API.
+ */
+#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__)
+#define MAC_USE_ZERO_COPY                   FALSE
+#endif
+
+/**
+ * @brief   Enables an event sources for incoming packets.
+ */
+#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__)
+#define MAC_USE_EVENTS                      TRUE
+#endif
+
+/*===========================================================================*/
+/* MMC_SPI driver related settings.                                          */
+/*===========================================================================*/
+
+/**
+ * @brief   Timeout before assuming a failure while waiting for card idle.
+ * @note    Time is in milliseconds.
+ */
+#if !defined(MMC_IDLE_TIMEOUT_MS) || defined(__DOXYGEN__)
+#define MMC_IDLE_TIMEOUT_MS                 1000
+#endif
+
+/**
+ * @brief   Mutual exclusion on the SPI bus.
+ */
+#if !defined(MMC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__)
+#define MMC_USE_MUTUAL_EXCLUSION            TRUE
+#endif
+
+/*===========================================================================*/
+/* SDC driver related settings.                                              */
+/*===========================================================================*/
+
+/**
+ * @brief   Number of initialization attempts before rejecting the card.
+ * @note    Attempts are performed at 10mS intervals.
+ */
+#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__)
+#define SDC_INIT_RETRY                      100
+#endif
+
+/**
+ * @brief   Include support for MMC cards.
+ * @note    MMC support is not yet implemented so this option must be kept
+ *          at @p FALSE.
+ */
+#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__)
+#define SDC_MMC_SUPPORT                     FALSE
+#endif
+
+/**
+ * @brief   Delays insertions.
+ * @details If enabled this options inserts delays into the MMC waiting
+ *          routines releasing some extra CPU time for the threads with
+ *          lower priority, this may slow down the driver a bit however.
+ */
+#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__)
+#define SDC_NICE_WAITING                    TRUE
+#endif
+
+/**
+ * @brief   OCR initialization constant for V20 cards.
+ */
+#if !defined(SDC_INIT_OCR_V20) || defined(__DOXYGEN__)
+#define SDC_INIT_OCR_V20                    0x50FF8000U
+#endif
+
+/**
+ * @brief   OCR initialization constant for non-V20 cards.
+ */
+#if !defined(SDC_INIT_OCR) || defined(__DOXYGEN__)
+#define SDC_INIT_OCR                        0x80100000U
+#endif
+
+/*===========================================================================*/
+/* SERIAL driver related settings.                                           */
+/*===========================================================================*/
+
+/**
+ * @brief   Default bit rate.
+ * @details Configuration parameter, this is the baud rate selected for the
+ *          default configuration.
+ */
+#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__)
+#define SERIAL_DEFAULT_BITRATE              38400
+#endif
+
+/**
+ * @brief   Serial buffers size.
+ * @details Configuration parameter, you can change the depth of the queue
+ *          buffers depending on the requirements of your application.
+ * @note    The default is 16 bytes for both the transmission and receive
+ *          buffers.
+ */
+#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__)
+#define SERIAL_BUFFERS_SIZE                 16
+#endif
+
+/*===========================================================================*/
+/* SIO driver related settings.                                              */
+/*===========================================================================*/
+
+/**
+ * @brief   Default bit rate.
+ * @details Configuration parameter, this is the baud rate selected for the
+ *          default configuration.
+ */
+#if !defined(SIO_DEFAULT_BITRATE) || defined(__DOXYGEN__)
+#define SIO_DEFAULT_BITRATE                 38400
+#endif
+
+/**
+ * @brief   Support for thread synchronization API.
+ */
+#if !defined(SIO_USE_SYNCHRONIZATION) || defined(__DOXYGEN__)
+#define SIO_USE_SYNCHRONIZATION             TRUE
+#endif
+
+/*===========================================================================*/
+/* SERIAL_USB driver related setting.                                        */
+/*===========================================================================*/
+
+/**
+ * @brief   Serial over USB buffers size.
+ * @details Configuration parameter, the buffer size must be a multiple of
+ *          the USB data endpoint maximum packet size.
+ * @note    The default is 256 bytes for both the transmission and receive
+ *          buffers.
+ */
+#if !defined(SERIAL_USB_BUFFERS_SIZE) || defined(__DOXYGEN__)
+#define SERIAL_USB_BUFFERS_SIZE             1
+#endif
+
+/**
+ * @brief   Serial over USB number of buffers.
+ * @note    The default is 2 buffers.
+ */
+#if !defined(SERIAL_USB_BUFFERS_NUMBER) || defined(__DOXYGEN__)
+#define SERIAL_USB_BUFFERS_NUMBER           2
+#endif
+
+/*===========================================================================*/
+/* SPI driver related settings.                                              */
+/*===========================================================================*/
+
+/**
+ * @brief   Enables synchronous APIs.
+ * @note    Disabling this option saves both code and data space.
+ */
+#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__)
+#define SPI_USE_WAIT                        TRUE
+#endif
+
+/**
+ * @brief   Inserts an assertion on function errors before returning.
+ */
+#if !defined(SPI_USE_ASSERT_ON_ERROR) || defined(__DOXYGEN__)
+#define SPI_USE_ASSERT_ON_ERROR             TRUE
+#endif
+
+/**
+ * @brief   Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs.
+ * @note    Disabling this option saves both code and data space.
+ */
+#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__)
+#define SPI_USE_MUTUAL_EXCLUSION            TRUE
+#endif
+
+/**
+ * @brief   Handling method for SPI CS line.
+ * @note    Disabling this option saves both code and data space.
+ */
+#if !defined(SPI_SELECT_MODE) || defined(__DOXYGEN__)
+#define SPI_SELECT_MODE                     SPI_SELECT_MODE_PAD
+#endif
+
+/*===========================================================================*/
+/* UART driver related settings.                                             */
+/*===========================================================================*/
+
+/**
+ * @brief   Enables synchronous APIs.
+ * @note    Disabling this option saves both code and data space.
+ */
+#if !defined(UART_USE_WAIT) || defined(__DOXYGEN__)
+#define UART_USE_WAIT                       FALSE
+#endif
+
+/**
+ * @brief   Enables the @p uartAcquireBus() and @p uartReleaseBus() APIs.
+ * @note    Disabling this option saves both code and data space.
+ */
+#if !defined(UART_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__)
+#define UART_USE_MUTUAL_EXCLUSION           FALSE
+#endif
+
+/*===========================================================================*/
+/* USB driver related settings.                                              */
+/*===========================================================================*/
+
+/**
+ * @brief   Enables synchronous APIs.
+ * @note    Disabling this option saves both code and data space.
+ */
+#if !defined(USB_USE_WAIT) || defined(__DOXYGEN__)
+#define USB_USE_WAIT                        TRUE
+#endif
+
+/*===========================================================================*/
+/* WSPI driver related settings.                                             */
+/*===========================================================================*/
+
+/**
+ * @brief   Enables synchronous APIs.
+ * @note    Disabling this option saves both code and data space.
+ */
+#if !defined(WSPI_USE_WAIT) || defined(__DOXYGEN__)
+#define WSPI_USE_WAIT                       TRUE
+#endif
+
+/**
+ * @brief   Enables the @p wspiAcquireBus() and @p wspiReleaseBus() APIs.
+ * @note    Disabling this option saves both code and data space.
+ */
+#if !defined(WSPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__)
+#define WSPI_USE_MUTUAL_EXCLUSION           TRUE
+#endif
+
+#endif /* HALCONF_H */
+
+/** @} */
diff --git a/keyboards/modelh/info.json b/keyboards/modelh/info.json
new file mode 100644
index 000000000000..a0349ecf2885
--- /dev/null
+++ b/keyboards/modelh/info.json
@@ -0,0 +1,1066 @@
+{
+  "keyboard_name": "IBM Model M",
+  "url": "modelh.club",
+  "maintainer": "John Hawthorn",
+  "usb": {
+    "vid": "0xFEED",
+    "pid": "0xB155",
+    "device_version": "1.0.0"
+  },
+  "manufacturer": "IBM",
+  "processor": "STM32F103",
+  "bootloader": "stm32-dfu",
+  "layouts": {
+    "LAYOUT_fullsize_iso_wkl": {
+      "layout": [
+        {
+          "label": "Esc",
+          "x": 0,
+          "y": 0
+        },
+        {
+          "label": "F1",
+          "x": 2,
+          "y": 0
+        },
+        {
+          "label": "F2",
+          "x": 3,
+          "y": 0
+        },
+        {
+          "label": "F3",
+          "x": 4,
+          "y": 0
+        },
+        {
+          "label": "F4",
+          "x": 5,
+          "y": 0
+        },
+        {
+          "label": "F5",
+          "x": 6.5,
+          "y": 0
+        },
+        {
+          "label": "F6",
+          "x": 7.5,
+          "y": 0
+        },
+        {
+          "label": "F7",
+          "x": 8.5,
+          "y": 0
+        },
+        {
+          "label": "F8",
+          "x": 9.5,
+          "y": 0
+        },
+        {
+          "label": "F9",
+          "x": 11,
+          "y": 0
+        },
+        {
+          "label": "F10",
+          "x": 12,
+          "y": 0
+        },
+        {
+          "label": "F11",
+          "x": 13,
+          "y": 0
+        },
+        {
+          "label": "F12",
+          "x": 14,
+          "y": 0
+        },
+        {
+          "label": "PrtSc",
+          "x": 15.25,
+          "y": 0
+        },
+        {
+          "label": "Scroll Lock",
+          "x": 16.25,
+          "y": 0
+        },
+        {
+          "label": "Pause",
+          "x": 17.25,
+          "y": 0
+        },
+        {
+          "label": "~",
+          "x": 0,
+          "y": 1.5
+        },
+        {
+          "label": "!",
+          "x": 1,
+          "y": 1.5
+        },
+        {
+          "label": "@",
+          "x": 2,
+          "y": 1.5
+        },
+        {
+          "label": "#",
+          "x": 3,
+          "y": 1.5
+        },
+        {
+          "label": "$",
+          "x": 4,
+          "y": 1.5
+        },
+        {
+          "label": "%",
+          "x": 5,
+          "y": 1.5
+        },
+        {
+          "label": "^",
+          "x": 6,
+          "y": 1.5
+        },
+        {
+          "label": "&",
+          "x": 7,
+          "y": 1.5
+        },
+        {
+          "label": "*",
+          "x": 8,
+          "y": 1.5
+        },
+        {
+          "label": "(",
+          "x": 9,
+          "y": 1.5
+        },
+        {
+          "label": ")",
+          "x": 10,
+          "y": 1.5
+        },
+        {
+          "label": "_",
+          "x": 11,
+          "y": 1.5
+        },
+        {
+          "label": "+",
+          "x": 12,
+          "y": 1.5
+        },
+        {
+          "label": "Backspace",
+          "x": 13,
+          "y": 1.5,
+          "w": 2
+        },
+        {
+          "label": "Insert",
+          "x": 15.25,
+          "y": 1.5
+        },
+        {
+          "label": "Home",
+          "x": 16.25,
+          "y": 1.5
+        },
+        {
+          "label": "PgUp",
+          "x": 17.25,
+          "y": 1.5
+        },
+        {
+          "label": "Num Lock",
+          "x": 18.5,
+          "y": 1.5
+        },
+        {
+          "label": "/",
+          "x": 19.5,
+          "y": 1.5
+        },
+        {
+          "label": "*",
+          "x": 20.5,
+          "y": 1.5
+        },
+        {
+          "label": "-",
+          "x": 21.5,
+          "y": 1.5
+        },
+        {
+          "label": "Tab",
+          "x": 0,
+          "y": 2.5,
+          "w": 1.5
+        },
+        {
+          "label": "Q",
+          "x": 1.5,
+          "y": 2.5
+        },
+        {
+          "label": "W",
+          "x": 2.5,
+          "y": 2.5
+        },
+        {
+          "label": "E",
+          "x": 3.5,
+          "y": 2.5
+        },
+        {
+          "label": "R",
+          "x": 4.5,
+          "y": 2.5
+        },
+        {
+          "label": "T",
+          "x": 5.5,
+          "y": 2.5
+        },
+        {
+          "label": "Y",
+          "x": 6.5,
+          "y": 2.5
+        },
+        {
+          "label": "U",
+          "x": 7.5,
+          "y": 2.5
+        },
+        {
+          "label": "I",
+          "x": 8.5,
+          "y": 2.5
+        },
+        {
+          "label": "O",
+          "x": 9.5,
+          "y": 2.5
+        },
+        {
+          "label": "P",
+          "x": 10.5,
+          "y": 2.5
+        },
+        {
+          "label": "{",
+          "x": 11.5,
+          "y": 2.5
+        },
+        {
+          "label": "}",
+          "x": 12.5,
+          "y": 2.5
+        },
+        {
+          "label": "Delete",
+          "x": 15.25,
+          "y": 2.5
+        },
+        {
+          "label": "End",
+          "x": 16.25,
+          "y": 2.5
+        },
+        {
+          "label": "PgDn",
+          "x": 17.25,
+          "y": 2.5
+        },
+        {
+          "label": "7",
+          "x": 18.5,
+          "y": 2.5
+        },
+        {
+          "label": "8",
+          "x": 19.5,
+          "y": 2.5
+        },
+        {
+          "label": "9",
+          "x": 20.5,
+          "y": 2.5
+        },
+        {
+          "label": "+",
+          "x": 21.5,
+          "y": 2.5,
+          "h": 2
+        },
+        {
+          "label": "Caps Lock",
+          "x": 0,
+          "y": 3.5,
+          "w": 1.5
+        },
+        {
+          "label": "A",
+          "x": 1.75,
+          "y": 3.5
+        },
+        {
+          "label": "S",
+          "x": 2.75,
+          "y": 3.5
+        },
+        {
+          "label": "D",
+          "x": 3.75,
+          "y": 3.5
+        },
+        {
+          "label": "F",
+          "x": 4.75,
+          "y": 3.5
+        },
+        {
+          "label": "G",
+          "x": 5.75,
+          "y": 3.5
+        },
+        {
+          "label": "H",
+          "x": 6.75,
+          "y": 3.5
+        },
+        {
+          "label": "J",
+          "x": 7.75,
+          "y": 3.5
+        },
+        {
+          "label": "K",
+          "x": 8.75,
+          "y": 3.5
+        },
+        {
+          "label": "L",
+          "x": 9.75,
+          "y": 3.5
+        },
+        {
+          "label": ":",
+          "x": 10.75,
+          "y": 3.5
+        },
+        {
+          "label": "\"",
+          "x": 11.75,
+          "y": 3.5
+        },
+        {
+          "label": "~",
+          "x": 12.75,
+          "y": 3.5
+        },
+        {
+          "label": "Enter",
+          "x": 13.75,
+          "y": 2.5,
+          "w": 1.25,
+          "h": 2
+        },
+        {
+          "label": "4",
+          "x": 18.5,
+          "y": 3.5
+        },
+        {
+          "label": "5",
+          "x": 19.5,
+          "y": 3.5
+        },
+        {
+          "label": "6",
+          "x": 20.5,
+          "y": 3.5
+        },
+        {
+          "label": "Shift",
+          "x": 0,
+          "y": 4.5,
+          "w": 1.25
+        },
+        {
+          "label": "|",
+          "x": 1.25,
+          "y": 4.5
+        },
+        {
+          "label": "Z",
+          "x": 2.25,
+          "y": 4.5
+        },
+        {
+          "label": "X",
+          "x": 3.25,
+          "y": 4.5
+        },
+        {
+          "label": "C",
+          "x": 4.25,
+          "y": 4.5
+        },
+        {
+          "label": "V",
+          "x": 5.25,
+          "y": 4.5
+        },
+        {
+          "label": "B",
+          "x": 6.25,
+          "y": 4.5
+        },
+        {
+          "label": "N",
+          "x": 7.25,
+          "y": 4.5
+        },
+        {
+          "label": "M",
+          "x": 8.25,
+          "y": 4.5
+        },
+        {
+          "label": "<",
+          "x": 9.25,
+          "y": 4.5
+        },
+        {
+          "label": ">",
+          "x": 10.25,
+          "y": 4.5
+        },
+        {
+          "label": "?",
+          "x": 11.25,
+          "y": 4.5
+        },
+        {
+          "label": "Shift",
+          "x": 12.25,
+          "y": 4.5,
+          "w": 2.75
+        },
+        {
+          "label": "↑",
+          "x": 16.25,
+          "y": 4.5
+        },
+        {
+          "label": "1",
+          "x": 18.5,
+          "y": 4.5
+        },
+        {
+          "label": "2",
+          "x": 19.5,
+          "y": 4.5
+        },
+        {
+          "label": "3",
+          "x": 20.5,
+          "y": 4.5
+        },
+        {
+          "label": "Enter",
+          "x": 21.5,
+          "y": 4.5,
+          "h": 2
+        },
+        {
+          "label": "Ctrl",
+          "x": 0,
+          "y": 5.5,
+          "w": 1.5
+        },
+        {
+          "label": "Alt",
+          "x": 2.5,
+          "y": 5.5,
+          "w": 1.5
+        },
+        {
+          "x": 4,
+          "y": 5.5,
+          "w": 7
+        },
+        {
+          "label": "Alt",
+          "x": 11,
+          "y": 5.5,
+          "w": 1.5
+        },
+        {
+          "label": "Ctrl",
+          "x": 13.5,
+          "y": 5.5,
+          "w": 1.5
+        },
+        {
+          "label": "←",
+          "x": 15.25,
+          "y": 5.5
+        },
+        {
+          "label": "↓",
+          "x": 16.25,
+          "y": 5.5
+        },
+        {
+          "label": "→",
+          "x": 17.25,
+          "y": 5.5
+        },
+        {
+          "label": "0",
+          "x": 18.5,
+          "y": 5.5,
+          "w": 2
+        },
+        {
+          "label": ".",
+          "x": 20.5,
+          "y": 5.5
+        }
+      ]
+    },
+    "LAYOUT_fullsize_ansi_wkl": {
+      "layout": [
+        {
+          "label": "Esc",
+          "x": 0,
+          "y": 0
+        },
+        {
+          "label": "F1",
+          "x": 2,
+          "y": 0
+        },
+        {
+          "label": "F2",
+          "x": 3,
+          "y": 0
+        },
+        {
+          "label": "F3",
+          "x": 4,
+          "y": 0
+        },
+        {
+          "label": "F4",
+          "x": 5,
+          "y": 0
+        },
+        {
+          "label": "F5",
+          "x": 6.5,
+          "y": 0
+        },
+        {
+          "label": "F6",
+          "x": 7.5,
+          "y": 0
+        },
+        {
+          "label": "F7",
+          "x": 8.5,
+          "y": 0
+        },
+        {
+          "label": "F8",
+          "x": 9.5,
+          "y": 0
+        },
+        {
+          "label": "F9",
+          "x": 11,
+          "y": 0
+        },
+        {
+          "label": "F10",
+          "x": 12,
+          "y": 0
+        },
+        {
+          "label": "F11",
+          "x": 13,
+          "y": 0
+        },
+        {
+          "label": "F12",
+          "x": 14,
+          "y": 0
+        },
+        {
+          "label": "PrtSc",
+          "x": 15.25,
+          "y": 0
+        },
+        {
+          "label": "Scroll Lock",
+          "x": 16.25,
+          "y": 0
+        },
+        {
+          "label": "Pause",
+          "x": 17.25,
+          "y": 0
+        },
+        {
+          "label": "~",
+          "x": 0,
+          "y": 1.5
+        },
+        {
+          "label": "!",
+          "x": 1,
+          "y": 1.5
+        },
+        {
+          "label": "@",
+          "x": 2,
+          "y": 1.5
+        },
+        {
+          "label": "#",
+          "x": 3,
+          "y": 1.5
+        },
+        {
+          "label": "$",
+          "x": 4,
+          "y": 1.5
+        },
+        {
+          "label": "%",
+          "x": 5,
+          "y": 1.5
+        },
+        {
+          "label": "^",
+          "x": 6,
+          "y": 1.5
+        },
+        {
+          "label": "&",
+          "x": 7,
+          "y": 1.5
+        },
+        {
+          "label": "*",
+          "x": 8,
+          "y": 1.5
+        },
+        {
+          "label": "(",
+          "x": 9,
+          "y": 1.5
+        },
+        {
+          "label": ")",
+          "x": 10,
+          "y": 1.5
+        },
+        {
+          "label": "_",
+          "x": 11,
+          "y": 1.5
+        },
+        {
+          "label": "+",
+          "x": 12,
+          "y": 1.5
+        },
+        {
+          "label": "Backspace",
+          "x": 13,
+          "y": 1.5,
+          "w": 2
+        },
+        {
+          "label": "Insert",
+          "x": 15.25,
+          "y": 1.5
+        },
+        {
+          "label": "Home",
+          "x": 16.25,
+          "y": 1.5
+        },
+        {
+          "label": "PgUp",
+          "x": 17.25,
+          "y": 1.5
+        },
+        {
+          "label": "Num Lock",
+          "x": 18.5,
+          "y": 1.5
+        },
+        {
+          "label": "/",
+          "x": 19.5,
+          "y": 1.5
+        },
+        {
+          "label": "*",
+          "x": 20.5,
+          "y": 1.5
+        },
+        {
+          "label": "-",
+          "x": 21.5,
+          "y": 1.5
+        },
+        {
+          "label": "Tab",
+          "x": 0,
+          "y": 2.5,
+          "w": 1.5
+        },
+        {
+          "label": "Q",
+          "x": 1.5,
+          "y": 2.5
+        },
+        {
+          "label": "W",
+          "x": 2.5,
+          "y": 2.5
+        },
+        {
+          "label": "E",
+          "x": 3.5,
+          "y": 2.5
+        },
+        {
+          "label": "R",
+          "x": 4.5,
+          "y": 2.5
+        },
+        {
+          "label": "T",
+          "x": 5.5,
+          "y": 2.5
+        },
+        {
+          "label": "Y",
+          "x": 6.5,
+          "y": 2.5
+        },
+        {
+          "label": "U",
+          "x": 7.5,
+          "y": 2.5
+        },
+        {
+          "label": "I",
+          "x": 8.5,
+          "y": 2.5
+        },
+        {
+          "label": "O",
+          "x": 9.5,
+          "y": 2.5
+        },
+        {
+          "label": "P",
+          "x": 10.5,
+          "y": 2.5
+        },
+        {
+          "label": "{",
+          "x": 11.5,
+          "y": 2.5
+        },
+        {
+          "label": "}",
+          "x": 12.5,
+          "y": 2.5
+        },
+        {
+          "label": "|",
+          "x": 13.5,
+          "y": 2.5,
+          "w": 1.5
+        },
+        {
+          "label": "Delete",
+          "x": 15.25,
+          "y": 2.5
+        },
+        {
+          "label": "End",
+          "x": 16.25,
+          "y": 2.5
+        },
+        {
+          "label": "PgDn",
+          "x": 17.25,
+          "y": 2.5
+        },
+        {
+          "label": "7",
+          "x": 18.5,
+          "y": 2.5
+        },
+        {
+          "label": "8",
+          "x": 19.5,
+          "y": 2.5
+        },
+        {
+          "label": "9",
+          "x": 20.5,
+          "y": 2.5
+        },
+        {
+          "label": "+",
+          "x": 21.5,
+          "y": 2.5,
+          "h": 2
+        },
+        {
+          "label": "Caps Lock",
+          "x": 0,
+          "y": 3.5,
+          "w": 1.5
+        },
+        {
+          "label": "A",
+          "x": 1.75,
+          "y": 3.5
+        },
+        {
+          "label": "S",
+          "x": 2.75,
+          "y": 3.5
+        },
+        {
+          "label": "D",
+          "x": 3.75,
+          "y": 3.5
+        },
+        {
+          "label": "F",
+          "x": 4.75,
+          "y": 3.5
+        },
+        {
+          "label": "G",
+          "x": 5.75,
+          "y": 3.5
+        },
+        {
+          "label": "H",
+          "x": 6.75,
+          "y": 3.5
+        },
+        {
+          "label": "J",
+          "x": 7.75,
+          "y": 3.5
+        },
+        {
+          "label": "K",
+          "x": 8.75,
+          "y": 3.5
+        },
+        {
+          "label": "L",
+          "x": 9.75,
+          "y": 3.5
+        },
+        {
+          "label": ":",
+          "x": 10.75,
+          "y": 3.5
+        },
+        {
+          "label": "\"",
+          "x": 11.75,
+          "y": 3.5
+        },
+        {
+          "label": "Enter",
+          "x": 12.75,
+          "y": 3.5,
+          "w": 2.25
+        },
+        {
+          "label": "4",
+          "x": 18.5,
+          "y": 3.5
+        },
+        {
+          "label": "5",
+          "x": 19.5,
+          "y": 3.5
+        },
+        {
+          "label": "6",
+          "x": 20.5,
+          "y": 3.5
+        },
+        {
+          "label": "Shift",
+          "x": 0,
+          "y": 4.5,
+          "w": 2.25
+        },
+        {
+          "label": "Z",
+          "x": 2.25,
+          "y": 4.5
+        },
+        {
+          "label": "X",
+          "x": 3.25,
+          "y": 4.5
+        },
+        {
+          "label": "C",
+          "x": 4.25,
+          "y": 4.5
+        },
+        {
+          "label": "V",
+          "x": 5.25,
+          "y": 4.5
+        },
+        {
+          "label": "B",
+          "x": 6.25,
+          "y": 4.5
+        },
+        {
+          "label": "N",
+          "x": 7.25,
+          "y": 4.5
+        },
+        {
+          "label": "M",
+          "x": 8.25,
+          "y": 4.5
+        },
+        {
+          "label": "<",
+          "x": 9.25,
+          "y": 4.5
+        },
+        {
+          "label": ">",
+          "x": 10.25,
+          "y": 4.5
+        },
+        {
+          "label": "?",
+          "x": 11.25,
+          "y": 4.5
+        },
+        {
+          "label": "Shift",
+          "x": 12.25,
+          "y": 4.5,
+          "w": 2.75
+        },
+        {
+          "label": "↑",
+          "x": 16.25,
+          "y": 4.5
+        },
+        {
+          "label": "1",
+          "x": 18.5,
+          "y": 4.5
+        },
+        {
+          "label": "2",
+          "x": 19.5,
+          "y": 4.5
+        },
+        {
+          "label": "3",
+          "x": 20.5,
+          "y": 4.5
+        },
+        {
+          "label": "Enter",
+          "x": 21.5,
+          "y": 4.5,
+          "h": 2
+        },
+        {
+          "label": "Ctrl",
+          "x": 0,
+          "y": 5.5,
+          "w": 1.5
+        },
+        {
+          "label": "Alt",
+          "x": 2.5,
+          "y": 5.5,
+          "w": 1.5
+        },
+        {
+          "x": 4,
+          "y": 5.5,
+          "w": 7
+        },
+        {
+          "label": "Alt",
+          "x": 11,
+          "y": 5.5,
+          "w": 1.5
+        },
+        {
+          "label": "Ctrl",
+          "x": 13.5,
+          "y": 5.5,
+          "w": 1.5
+        },
+        {
+          "label": "←",
+          "x": 15.25,
+          "y": 5.5
+        },
+        {
+          "label": "↓",
+          "x": 16.25,
+          "y": 5.5
+        },
+        {
+          "label": "→",
+          "x": 17.25,
+          "y": 5.5
+        },
+        {
+          "label": "0",
+          "x": 18.5,
+          "y": 5.5,
+          "w": 2
+        },
+        {
+          "label": ".",
+          "x": 20.5,
+          "y": 5.5
+        }
+      ]
+    }
+  }
+}
diff --git a/keyboards/modelh/keymaps/default/keymap.c b/keyboards/modelh/keymaps/default/keymap.c
new file mode 100644
index 000000000000..89f899faad40
--- /dev/null
+++ b/keyboards/modelh/keymaps/default/keymap.c
@@ -0,0 +1,31 @@
+/* Copyright 2020 John Hawthorn
+ *
+ * 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_fullsize_ansi_wkl( /* Base layer */
+    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_SCRL, 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_NUM,  KC_PSLS, KC_PAST, KC_PMNS,
+    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_P7,   KC_P8,   KC_P9,   KC_PPLS,
+    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_P4,   KC_P5,   KC_P6,
+    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_P1,   KC_P2,   KC_P3,   KC_PENT,
+    KC_LCTL,          KC_LALT,                           KC_SPC,                                      KC_RALT,          KC_RCTL,   KC_LEFT, KC_DOWN, KC_RGHT,   KC_P0,            KC_PDOT
+  ),
+};
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+    return true;
+}
diff --git a/keyboards/modelh/keymaps/default/readme.md b/keyboards/modelh/keymaps/default/readme.md
new file mode 100644
index 000000000000..5540d213c784
--- /dev/null
+++ b/keyboards/modelh/keymaps/default/readme.md
@@ -0,0 +1 @@
+# The default keymap for modelh
diff --git a/keyboards/modelh/mcuconf.h b/keyboards/modelh/mcuconf.h
new file mode 100644
index 000000000000..a645d3c5d5cf
--- /dev/null
+++ b/keyboards/modelh/mcuconf.h
@@ -0,0 +1,209 @@
+/*
+    ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+        http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+*/
+
+#ifndef _MCUCONF_H_
+#define _MCUCONF_H_
+
+#define STM32F103_MCUCONF
+
+/*
+ * STM32F103 drivers configuration.
+ * The following settings override the default settings present in
+ * the various device driver implementation headers.
+ * Note that the settings for each driver only have effect if the whole
+ * driver is enabled in halconf.h.
+ *
+ * IRQ priorities:
+ * 15...0       Lowest...Highest.
+ *
+ * DMA priorities:
+ * 0...3        Lowest...Highest.
+ */
+
+/*
+ * HAL driver system settings.
+ */
+#define STM32_NO_INIT                       FALSE
+#define STM32_HSI_ENABLED                   TRUE
+#define STM32_LSI_ENABLED                   FALSE
+#define STM32_HSE_ENABLED                   TRUE
+#define STM32_LSE_ENABLED                   FALSE
+#define STM32_SW                            STM32_SW_PLL
+#define STM32_PLLSRC                        STM32_PLLSRC_HSE
+#define STM32_PLLXTPRE                      STM32_PLLXTPRE_DIV1
+#define STM32_PLLMUL_VALUE                  9
+#define STM32_HPRE                          STM32_HPRE_DIV1
+#define STM32_PPRE1                         STM32_PPRE1_DIV2
+#define STM32_PPRE2                         STM32_PPRE2_DIV2
+#define STM32_ADCPRE                        STM32_ADCPRE_DIV4
+#define STM32_USB_CLOCK_REQUIRED            TRUE
+#define STM32_USBPRE                        STM32_USBPRE_DIV1P5
+#define STM32_MCOSEL                        STM32_MCOSEL_NOCLOCK
+#define STM32_RTCSEL                        STM32_RTCSEL_HSEDIV
+#define STM32_PVD_ENABLE                    FALSE
+#define STM32_PLS                           STM32_PLS_LEV0
+
+/*
+ * ADC driver system settings.
+ */
+#define STM32_ADC_USE_ADC1                  FALSE
+#define STM32_ADC_ADC1_DMA_PRIORITY         2
+#define STM32_ADC_ADC1_IRQ_PRIORITY         6
+
+/*
+ * CAN driver system settings.
+ */
+#define STM32_CAN_USE_CAN1                  FALSE
+#define STM32_CAN_CAN1_IRQ_PRIORITY         11
+
+/*
+ * EXT driver system settings.
+ */
+#define STM32_EXT_EXTI0_IRQ_PRIORITY        6
+#define STM32_EXT_EXTI1_IRQ_PRIORITY        6
+#define STM32_EXT_EXTI2_IRQ_PRIORITY        6
+#define STM32_EXT_EXTI3_IRQ_PRIORITY        6
+#define STM32_EXT_EXTI4_IRQ_PRIORITY        6
+#define STM32_EXT_EXTI5_9_IRQ_PRIORITY      6
+#define STM32_EXT_EXTI10_15_IRQ_PRIORITY    6
+#define STM32_EXT_EXTI16_IRQ_PRIORITY       6
+#define STM32_EXT_EXTI17_IRQ_PRIORITY       6
+#define STM32_EXT_EXTI18_IRQ_PRIORITY       6
+#define STM32_EXT_EXTI19_IRQ_PRIORITY       6
+
+/*
+ * GPT driver system settings.
+ */
+#define STM32_GPT_USE_TIM1                  FALSE
+#define STM32_GPT_USE_TIM2                  FALSE
+#define STM32_GPT_USE_TIM3                  FALSE
+#define STM32_GPT_USE_TIM4                  FALSE
+#define STM32_GPT_USE_TIM5                  FALSE
+#define STM32_GPT_USE_TIM8                  FALSE
+#define STM32_GPT_TIM1_IRQ_PRIORITY         7
+#define STM32_GPT_TIM2_IRQ_PRIORITY         7
+#define STM32_GPT_TIM3_IRQ_PRIORITY         7
+#define STM32_GPT_TIM4_IRQ_PRIORITY         7
+#define STM32_GPT_TIM5_IRQ_PRIORITY         7
+#define STM32_GPT_TIM8_IRQ_PRIORITY         7
+
+/*
+ * I2C driver system settings.
+ */
+#define STM32_I2C_USE_I2C1                  FALSE
+#define STM32_I2C_USE_I2C2                  FALSE
+#define STM32_I2C_BUSY_TIMEOUT              50
+#define STM32_I2C_I2C1_IRQ_PRIORITY         5
+#define STM32_I2C_I2C2_IRQ_PRIORITY         5
+#define STM32_I2C_I2C1_DMA_PRIORITY         3
+#define STM32_I2C_I2C2_DMA_PRIORITY         3
+#define STM32_I2C_DMA_ERROR_HOOK(i2cp)      osalSysHalt("DMA failure")
+
+/*
+ * ICU driver system settings.
+ */
+#define STM32_ICU_USE_TIM1                  FALSE
+#define STM32_ICU_USE_TIM2                  FALSE
+#define STM32_ICU_USE_TIM3                  FALSE
+#define STM32_ICU_USE_TIM4                  FALSE
+#define STM32_ICU_USE_TIM5                  FALSE
+#define STM32_ICU_USE_TIM8                  FALSE
+#define STM32_ICU_TIM1_IRQ_PRIORITY         7
+#define STM32_ICU_TIM2_IRQ_PRIORITY         7
+#define STM32_ICU_TIM3_IRQ_PRIORITY         7
+#define STM32_ICU_TIM4_IRQ_PRIORITY         7
+#define STM32_ICU_TIM5_IRQ_PRIORITY         7
+#define STM32_ICU_TIM8_IRQ_PRIORITY         7
+
+/*
+ * PWM driver system settings.
+ */
+#define STM32_PWM_USE_ADVANCED              FALSE
+#define STM32_PWM_USE_TIM1                  FALSE
+#define STM32_PWM_USE_TIM2                  TRUE
+#define STM32_PWM_USE_TIM3                  FALSE
+#define STM32_PWM_USE_TIM4                  FALSE
+#define STM32_PWM_USE_TIM5                  FALSE
+#define STM32_PWM_USE_TIM8                  FALSE
+#define STM32_PWM_TIM1_IRQ_PRIORITY         7
+#define STM32_PWM_TIM2_IRQ_PRIORITY         7
+#define STM32_PWM_TIM3_IRQ_PRIORITY         7
+#define STM32_PWM_TIM4_IRQ_PRIORITY         7
+#define STM32_PWM_TIM5_IRQ_PRIORITY         7
+#define STM32_PWM_TIM8_IRQ_PRIORITY         7
+
+/*
+ * RTC driver system settings.
+ */
+#define STM32_RTC_IRQ_PRIORITY              15
+
+/*
+ * SERIAL driver system settings.
+ */
+#define STM32_SERIAL_USE_USART1             FALSE
+#define STM32_SERIAL_USE_USART2             FALSE
+#define STM32_SERIAL_USE_USART3             FALSE
+#define STM32_SERIAL_USE_UART4              FALSE
+#define STM32_SERIAL_USE_UART5              FALSE
+#define STM32_SERIAL_USART1_PRIORITY        12
+#define STM32_SERIAL_USART2_PRIORITY        12
+#define STM32_SERIAL_USART3_PRIORITY        12
+#define STM32_SERIAL_UART4_PRIORITY         12
+#define STM32_SERIAL_UART5_PRIORITY         12
+
+/*
+ * SPI driver system settings.
+ */
+#define STM32_SPI_USE_SPI1                  FALSE
+#define STM32_SPI_USE_SPI2                  FALSE
+#define STM32_SPI_USE_SPI3                  FALSE
+#define STM32_SPI_SPI1_DMA_PRIORITY         1
+#define STM32_SPI_SPI2_DMA_PRIORITY         1
+#define STM32_SPI_SPI3_DMA_PRIORITY         1
+#define STM32_SPI_SPI1_IRQ_PRIORITY         10
+#define STM32_SPI_SPI2_IRQ_PRIORITY         10
+#define STM32_SPI_SPI3_IRQ_PRIORITY         10
+#define STM32_SPI_DMA_ERROR_HOOK(spip)      osalSysHalt("DMA failure")
+
+/*
+ * ST driver system settings.
+ */
+#define STM32_ST_IRQ_PRIORITY               8
+#define STM32_ST_USE_TIMER                  2
+
+/*
+ * UART driver system settings.
+ */
+#define STM32_UART_USE_USART1               FALSE
+#define STM32_UART_USE_USART2               FALSE
+#define STM32_UART_USE_USART3               FALSE
+#define STM32_UART_USART1_IRQ_PRIORITY      12
+#define STM32_UART_USART2_IRQ_PRIORITY      12
+#define STM32_UART_USART3_IRQ_PRIORITY      12
+#define STM32_UART_USART1_DMA_PRIORITY      0
+#define STM32_UART_USART2_DMA_PRIORITY      0
+#define STM32_UART_USART3_DMA_PRIORITY      0
+#define STM32_UART_DMA_ERROR_HOOK(uartp)    osalSysHalt("DMA failure")
+
+/*
+ * USB driver system settings.
+ */
+#define STM32_USB_USE_USB1                  TRUE
+#define STM32_USB_LOW_POWER_ON_SUSPEND      FALSE
+#define STM32_USB_USB1_HP_IRQ_PRIORITY      13
+#define STM32_USB_USB1_LP_IRQ_PRIORITY      14
+
+#endif /* _MCUCONF_H_ */
diff --git a/keyboards/modelh/modelh.c b/keyboards/modelh/modelh.c
new file mode 100644
index 000000000000..4c278a5e7ca4
--- /dev/null
+++ b/keyboards/modelh/modelh.c
@@ -0,0 +1,48 @@
+/* Copyright 2020 John Hawthorn
+ *
+ * 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 "modelh.h"
+
+#ifdef MODELH_LED_PINS
+static const pin_t led_pins[3] = MODELH_LED_PINS;
+
+bool led_update_kb(led_t led_state) {
+	bool res = led_update_user(led_state);
+	if(res) {
+		writePin(led_pins[0], !led_state.num_lock);
+		writePin(led_pins[1], !led_state.caps_lock);
+		writePin(led_pins[2], !led_state.scroll_lock);
+	}
+	return res;
+}
+
+void led_init_ports() {
+	setPinOutput(led_pins[0]);
+	setPinOutput(led_pins[1]);
+	setPinOutput(led_pins[2]);
+}
+
+#else
+void led_init_ports() { }
+#endif
+
+void keyboard_pre_init_kb(void) {
+	setPinOutput(MODELH_STATUS_LED);
+	writePin(MODELH_STATUS_LED, 0);
+
+	led_init_ports();
+	keyboard_pre_init_user();
+}
diff --git a/keyboards/modelh/modelh.h b/keyboards/modelh/modelh.h
new file mode 100644
index 000000000000..d8dc4edfc8e4
--- /dev/null
+++ b/keyboards/modelh/modelh.h
@@ -0,0 +1,70 @@
+/* Copyright 2020 John Hawthorn
+ *
+ * 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 "quantum.h"
+
+/* This is a shortcut to help you visually see your layout.
+ *
+ * The first section contains all of the arguments representing the physical
+ * layout of the board and position of the keys.
+ *
+ * The second converts the arguments into a two-dimensional array which
+ * represents the switch matrix.
+ */
+
+#define LAYOUT_fullsize_ansi_wkl( \
+    K5A,      K5B, K5C, K5D, K5E, K5F, K5G, K5H, K5I, K5J, K5K, K5L, K5M,   K5N, K5O, K5P, \
+    \
+    K4A, K4B, K4C, K4D, K4E, K4F, K4G, K4H, K4I, K4J, K4K, K4L, K4M, K4N,   K4O, K4P, K4Q,   K4R, K4S, K4T, K4U, \
+    K3A, K3B, K3C, K3D, K3E, K3F, K3G, K3H, K3I, K3J, K3K, K3L, K3M, K3N,   K3O, K3P, K3Q,   K3R, K3S, K3T, K3U, \
+    K2A, K2B, K2C, K2D, K2E, K2F, K2G, K2H, K2I, K2J, K2K, K2L,      K2N,                    K2O, K2P, K2Q, \
+    K1A,      K1C, K1D, K1E, K1F, K1G, K1H, K1I, K1J, K1K, K1L,      K1M,        K1N,        K1O, K1P, K1Q, K1R, \
+    K0A,      K0B,                K0C,                     K0D,      K0E,   K0F, K0G, K0H,   K0I,      K0J \
+) \
+{ \
+/* 00 */ { KC_NO, KC_NO, K5A,   KC_NO, K5E,   K2F, K5F,   K2G, K5G,   KC_NO, K2L,   KC_NO, K0I, K0J, K1N,   K0B   }, \
+/* 01 */ { KC_NO, K1A,   K3A,   K2A,   K5D,   K3F, K4N,   K3G, K3M,   K5H,   K3L,   K2O,   K2P, K2Q, KC_NO, KC_NO }, \
+/* 02 */ { K0A,   KC_NO, K4A,   K5B,   K5C,   K4F, K5J,   K4G, K4M,   K5I,   K4L,   K3O,   K4O, K4Q, K4P,   KC_NO }, \
+/* 03 */ { KC_NO, KC_NO, K4B,   K4C,   K4D,   K4E, K5K,   K4H, K4I,   K4J,   K4K,   K5L,   K5M, K3Q, K3P,   K5N   }, \
+/* 04 */ { KC_NO, KC_NO, K3B,   K3C,   K3D,   K3E, KC_NO, K3H, K3I,   K3J,   K3K,   K3R,   K3S, K3T, K3U,   K5O   }, \
+/* 05 */ { KC_NO, KC_NO, K2B,   K2C,   K2D,   K2E, K3N,   K2H, K2I,   K2J,   K2K,   K1O,   K1P, K1Q, K1R,   KC_NO }, \
+/* 06 */ { K0E,   K1M,   K1C,   K1D,   K1E,   K1F, K2N,   K1I, K1J,   K1K,   KC_NO, K4R,   K4S, K4T, K5P,   KC_NO }, \
+/* 07 */ { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, K1G, K0C,   K1H, KC_NO, KC_NO, K1L,   K0G,   K0H, K4U, K0F,   K0D   }, \
+}
+/*         0      1      2      3      4      5      6      7      8      9      A      B      C    D    E      F       */
+
+
+#define LAYOUT_fullsize_iso_wkl( \
+    K5A,      K5B, K5C, K5D, K5E, K5F, K5G, K5H, K5I, K5J, K5K, K5L, K5M,   K5N, K5O, K5P, \
+    \
+    K4A, K4B, K4C, K4D, K4E, K4F, K4G, K4H, K4I, K4J, K4K, K4L, K4M, K4N,   K4O, K4P, K4Q,   K4R, K4S, K4T, K4U, \
+    K3A, K3B, K3C, K3D, K3E, K3F, K3G, K3H, K3I, K3J, K3K, K3L, K3M,        K3O, K3P, K3Q,   K3R, K3S, K3T, K3U, \
+    K2A, K2B, K2C, K2D, K2E, K2F, K2G, K2H, K2I, K2J, K2K, K2L, K2M, K2N,                    K2O, K2P, K2Q, \
+    K1A, K1B, K1C, K1D, K1E, K1F, K1G, K1H, K1I, K1J, K1K, K1L,      K1M,        K1N,        K1O, K1P, K1Q, K1R, \
+    K0A,      K0B,                K0C,                     K0D,      K0E,   K0F, K0G, K0H,   K0I,      K0J \
+) \
+{ \
+    { KC_NO, KC_NO, K5A,   K1B,   K5E,   K2F, K5F,   K2G, K5G,   KC_NO, K2L,   KC_NO, K0I, K0J, K1N,   K0B   }, \
+    { KC_NO, K1A,   K3A,   K2A,   K5D,   K3F, K4N,   K3G, K3M,   K5H,   K3L,   K2O,   K2P, K2Q, KC_NO, KC_NO }, \
+    { K0A,   KC_NO, K4A,   K5B,   K5C,   K4F, K5J,   K4G, K4M,   K5I,   K4L,   K3O,   K4O, K4Q, K4P,   KC_NO }, \
+    { KC_NO, KC_NO, K4B,   K4C,   K4D,   K4E, K5K,   K4H, K4I,   K4J,   K4K,   K5L,   K5M, K3Q, K3P,   K5N   }, \
+    { KC_NO, KC_NO, K3B,   K3C,   K3D,   K3E, KC_NO, K3H, K3I,   K3J,   K3K,   K3R,   K3S, K3T, K3U,   K5O   }, \
+    { KC_NO, KC_NO, K2B,   K2C,   K2D,   K2E, KC_NO, K2H, K2I,   K2J,   K2K,   K1O,   K1P, K1Q, K1R,   KC_NO }, \
+    { K0E,   K1M,   K1C,   K1D,   K1E,   K1F, K2N,   K1I, K1J,   K1K,   K2M,   K4R,   K4S, K4T, K5P,   KC_NO }, \
+    { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, K1G, K0C,   K1H, KC_NO, KC_NO, K1L,   K0G,   K0H, K4U, K0F,   K0D   }  \
+}
diff --git a/keyboards/modelh/readme.md b/keyboards/modelh/readme.md
new file mode 100644
index 000000000000..7ae9df4d01b4
--- /dev/null
+++ b/keyboards/modelh/readme.md
@@ -0,0 +1,19 @@
+# Model H - A USB capable PCB for the IBM Model M keyboard
+
+![modelh](https://modelh.club/modelh_assembled.jpg)
+
+This conversion kit allows you to replace your IBM Model M's original internal controller board with a modern USB board. This aims to match the footprint of the original controller and plugs into the original keyboard matrix, but exposes a USB port through the original SDL connector.
+
+* Keyboard Maintainer: [John Hawthorn](https://github.com/jhawthorn)
+* Hardware Supported: IBM Model M
+* Hardware Availability: [www.modelh.club](www.modelh.club)
+
+Make example for this keyboard (after setting up your build environment):
+
+    make modelh:default
+
+Flashing example for this keyboard:
+
+    make modelh:default:flash
+
+See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
diff --git a/keyboards/modelh/rules.mk b/keyboards/modelh/rules.mk
new file mode 100644
index 000000000000..ddf76f52bb70
--- /dev/null
+++ b/keyboards/modelh/rules.mk
@@ -0,0 +1,22 @@
+# MCU name
+MCU = STM32F103
+
+# GENERIC STM32F103C8T6 board - stm32duino bootloader
+OPT_DEFS = -DCORTEX_VTOR_INIT=0x2000
+MCU_LDSCRIPT = STM32F103x8_stm32duino_bootloader
+BOARD = STM32_F103_STM32DUINO
+
+DFU_ARGS = -d 1eaf:0003 -a2 -R
+DFU_SUFFIX_ARGS = -v 1eaf -p 0003
+
+# Enter lower-power sleep mode when on the ChibiOS idle thread
+OPT_DEFS += -DCORTEX_ENABLE_WFI_IDLE=TRUE
+
+#BOOTMAGIC_ENABLE = yes	# Virtual DIP switch configuration
+EXTRAKEY_ENABLE = yes	# Audio control and System control
+CONSOLE_ENABLE = yes	# Console for debug
+COMMAND_ENABLE = yes    # Commands for debug and configuration
+SLEEP_LED_ENABLE = yes  # Breathing sleep LED during USB suspend
+NKRO_ENABLE = no	# USB Nkey Rollover
+CUSTOM_MATRIX = no 	# Custom matrix file
+MOUSEKEY_ENABLE = no

From 4d2456f8e0982f7c9edb6a87bb6f343b4fead7dd Mon Sep 17 00:00:00 2001
From: Jerome Berclaz <jerome.berclaz@a3.epfl.ch>
Date: Fri, 28 Apr 2023 21:54:14 -0700
Subject: [PATCH 02/16] cleanup

---
 keyboards/modelh/config.h | 1 -
 1 file changed, 1 deletion(-)

diff --git a/keyboards/modelh/config.h b/keyboards/modelh/config.h
index 7e8b76c20303..af32eaa592ec 100644
--- a/keyboards/modelh/config.h
+++ b/keyboards/modelh/config.h
@@ -17,7 +17,6 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 #pragma once
 
-//#include "config_common.h"
 
 /* Model H customizations */
 #define MODELH_LED_PINS { B9, B8, B7 }

From ed07e9ede63abe040ce51964c37ed43e0a24f6e4 Mon Sep 17 00:00:00 2001
From: Jerome Berclaz <jerome.berclaz@a3.epfl.ch>
Date: Sat, 29 Apr 2023 07:58:23 -0700
Subject: [PATCH 03/16] cleanup

---
 keyboards/modelh/config.h  | 84 --------------------------------------
 keyboards/modelh/info.json | 43 +++++++++++++++++--
 keyboards/modelh/modelh.c  | 28 ++++++-------
 keyboards/modelh/rules.mk  |  6 +--
 4 files changed, 57 insertions(+), 104 deletions(-)

diff --git a/keyboards/modelh/config.h b/keyboards/modelh/config.h
index af32eaa592ec..d5004a13d6ad 100644
--- a/keyboards/modelh/config.h
+++ b/keyboards/modelh/config.h
@@ -28,67 +28,12 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #define MATRIX_ROWS 8
 #define MATRIX_COLS 16
 
-/*
- * Keyboard Matrix Assignments
- *
- * Change this to how you wired your keyboard
- * COLS: AVR pins used for columns, left to right
- * ROWS: AVR pins used for rows, top to bottom
- * DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode)
- *                  ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode)
- *
- */
-#define MATRIX_ROW_PINS { B6, B5, B4, A15, B3, A0, A2, A1 }
-#define MATRIX_COL_PINS { A10, A9, A8, B15, B14, B13, B12, B11, B10, B1, B0, A7, A6, A5, A4, A3 }
-//#define UNUSED_PINS
-
-/* COL2ROW, ROW2COL */
-#define DIODE_DIRECTION COL2ROW
-
-/*
- * Split Keyboard specific options, make sure you have 'SPLIT_KEYBOARD = yes' in your rules.mk, and define SOFT_SERIAL_PIN.
- */
-//#define SOFT_SERIAL_PIN D0  // or D1, D2, D3, E6
-
-//#define BACKLIGHT_PIN B7
-//#define BACKLIGHT_LEVELS 3
-//#define BACKLIGHT_BREATHING
 
 // Model H should use absolute maximum 80mA when all LEDs are on and it is in
 // use. Only requesting 100mA should allow it to work with devices only
 // supporting USB 1.0 power levels like some iPads.
 #define USB_MAX_POWER_CONSUMPTION 100
 
-//#define RGB_DI_PIN E2
-//#ifdef RGB_DI_PIN
-//#    define RGBLED_NUM 16
-//#    define RGBLIGHT_HUE_STEP 8
-//#    define RGBLIGHT_SAT_STEP 8
-//#    define RGBLIGHT_VAL_STEP 8
-//#    define RGBLIGHT_LIMIT_VAL 255 /* The maximum brightness level */
-//#    define RGBLIGHT_SLEEP  /* If defined, the RGB lighting will be switched off when the host goes to sleep */
-/*== all animations enable ==*/
-//#    define RGBLIGHT_ANIMATIONS
-/*== or choose animations ==*/
-//#    define RGBLIGHT_EFFECT_BREATHING
-//#    define RGBLIGHT_EFFECT_RAINBOW_MOOD
-//#    define RGBLIGHT_EFFECT_RAINBOW_SWIRL
-//#    define RGBLIGHT_EFFECT_SNAKE
-//#    define RGBLIGHT_EFFECT_KNIGHT
-//#    define RGBLIGHT_EFFECT_CHRISTMAS
-//#    define RGBLIGHT_EFFECT_STATIC_GRADIENT
-//#    define RGBLIGHT_EFFECT_RGB_TEST
-//#    define RGBLIGHT_EFFECT_ALTERNATING
-/*== customize breathing effect ==*/
-/*==== (DEFAULT) use fixed table instead of exp() and sin() ====*/
-//#    define RGBLIGHT_BREATHE_TABLE_SIZE 256      // 256(default) or 128 or 64
-/*==== use exp() and sin() ====*/
-//#    define RGBLIGHT_EFFECT_BREATHE_CENTER 1.85  // 1 to 2.7
-//#    define RGBLIGHT_EFFECT_BREATHE_MAX    255   // 0 to 255
-//#endif
-
-/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
-#define DEBOUNCE 5
 
 /* define if matrix has ghost (lacks anti-ghosting diodes) */
 #define MATRIX_HAS_GHOST
@@ -98,31 +43,6 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 /* Locking resynchronize hack */
 #define LOCKING_RESYNC_ENABLE
 
-/* If defined, GRAVE_ESC will always act as ESC when CTRL is held.
- * This is useful for the Windows task manager shortcut (ctrl+shift+esc).
- */
-//#define GRAVE_ESC_CTRL_OVERRIDE
-
-/*
- * Force NKRO
- *
- * Force NKRO (nKey Rollover) to be enabled by default, regardless of the saved
- * state in the bootmagic EEPROM settings. (Note that NKRO must be enabled in the
- * makefile for this to work.)
- *
- * If forced on, NKRO can be disabled via magic key (default = LShift+RShift+N)
- * until the next keyboard reset.
- *
- * NKRO may prevent your keystrokes from being detected in the BIOS, but it is
- * fully operational during normal computer usage.
- *
- * For a less heavy-handed approach, enable NKRO via magic key (LShift+RShift+N)
- * or via bootmagic (hold SPACE+N while plugging in the keyboard). Once set by
- * bootmagic, NKRO mode will always be enabled until it is toggled again during a
- * power-up.
- *
- */
-//#define FORCE_NKRO
 
 /*
  * Feature disable options
@@ -143,7 +63,3 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 /* disable these deprecated features by default */
 //#define NO_ACTION_MACRO
 //#define NO_ACTION_FUNCTION
-
-/* Bootmagic Lite key configuration */
-//#define BOOTMAGIC_LITE_ROW 0
-//#define BOOTMAGIC_LITE_COLUMN 0
diff --git a/keyboards/modelh/info.json b/keyboards/modelh/info.json
index a0349ecf2885..d53b352524da 100644
--- a/keyboards/modelh/info.json
+++ b/keyboards/modelh/info.json
@@ -1,13 +1,50 @@
 {
-  "keyboard_name": "IBM Model M",
+  "keyboard_name": "Model M",
+  "manufacturer": "IBM",
   "url": "modelh.club",
-  "maintainer": "John Hawthorn",
+  "maintainer": "jhawthorn",
   "usb": {
     "vid": "0xFEED",
     "pid": "0xB155",
     "device_version": "1.0.0"
   },
-  "manufacturer": "IBM",
+  "debounce": 5,
+  "diode_direction": "COL2ROW",
+  "matrix_pins": {
+    "cols": [
+      "A10",
+      "A9",
+      "A8",
+      "B15",
+      "B14",
+      "B13",
+      "B12",
+      "B11",
+      "B10",
+      "B1",
+      "B0",
+      "A7",
+      "A6",
+      "A5",
+      "A4",
+      "A3"
+    ],
+    "rows": [
+      "B6",
+      "B5",
+      "B4",
+      "A15",
+      "B3",
+      "A0",
+      "A2",
+      "A1"
+    ]
+  },
+  "indicators": {
+    "num_lock": "B9",
+    "caps_lock": "B8",
+    "scroll_lock": "B7"
+  },
   "processor": "STM32F103",
   "bootloader": "stm32-dfu",
   "layouts": {
diff --git a/keyboards/modelh/modelh.c b/keyboards/modelh/modelh.c
index 4c278a5e7ca4..3254b975b2cd 100644
--- a/keyboards/modelh/modelh.c
+++ b/keyboards/modelh/modelh.c
@@ -20,19 +20,19 @@
 static const pin_t led_pins[3] = MODELH_LED_PINS;
 
 bool led_update_kb(led_t led_state) {
-	bool res = led_update_user(led_state);
-	if(res) {
-		writePin(led_pins[0], !led_state.num_lock);
-		writePin(led_pins[1], !led_state.caps_lock);
-		writePin(led_pins[2], !led_state.scroll_lock);
-	}
-	return res;
+  bool res = led_update_user(led_state);
+  if(res) {
+    writePin(led_pins[0], !led_state.num_lock);
+    writePin(led_pins[1], !led_state.caps_lock);
+    writePin(led_pins[2], !led_state.scroll_lock);
+  }
+  return res;
 }
 
 void led_init_ports() {
-	setPinOutput(led_pins[0]);
-	setPinOutput(led_pins[1]);
-	setPinOutput(led_pins[2]);
+  setPinOutput(led_pins[0]);
+  setPinOutput(led_pins[1]);
+  setPinOutput(led_pins[2]);
 }
 
 #else
@@ -40,9 +40,9 @@ void led_init_ports() { }
 #endif
 
 void keyboard_pre_init_kb(void) {
-	setPinOutput(MODELH_STATUS_LED);
-	writePin(MODELH_STATUS_LED, 0);
+  setPinOutput(MODELH_STATUS_LED);
+  writePin(MODELH_STATUS_LED, 0);
 
-	led_init_ports();
-	keyboard_pre_init_user();
+  led_init_ports();
+  keyboard_pre_init_user();
 }
diff --git a/keyboards/modelh/rules.mk b/keyboards/modelh/rules.mk
index ddf76f52bb70..4a34c3a3adff 100644
--- a/keyboards/modelh/rules.mk
+++ b/keyboards/modelh/rules.mk
@@ -12,10 +12,10 @@ DFU_SUFFIX_ARGS = -v 1eaf -p 0003
 # Enter lower-power sleep mode when on the ChibiOS idle thread
 OPT_DEFS += -DCORTEX_ENABLE_WFI_IDLE=TRUE
 
-#BOOTMAGIC_ENABLE = yes	# Virtual DIP switch configuration
+BOOTMAGIC_ENABLE = no	# Virtual DIP switch configuration
 EXTRAKEY_ENABLE = yes	# Audio control and System control
-CONSOLE_ENABLE = yes	# Console for debug
-COMMAND_ENABLE = yes    # Commands for debug and configuration
+CONSOLE_ENABLE = no	# Console for debug
+COMMAND_ENABLE = no     # Commands for debug and configuration
 SLEEP_LED_ENABLE = yes  # Breathing sleep LED during USB suspend
 NKRO_ENABLE = no	# USB Nkey Rollover
 CUSTOM_MATRIX = no 	# Custom matrix file

From 99d37e56e48ce37bfca3bcc2bf7db6e66875a121 Mon Sep 17 00:00:00 2001
From: Jerome Berclaz <jerome.berclaz@a3.epfl.ch>
Date: Sat, 29 Apr 2023 08:15:53 -0700
Subject: [PATCH 04/16] cleanup

---
 keyboards/modelh/bootloader_defs.h | 17 +++++++++++++++++
 keyboards/modelh/modelh.c          | 28 ++++++++++++++--------------
 2 files changed, 31 insertions(+), 14 deletions(-)

diff --git a/keyboards/modelh/bootloader_defs.h b/keyboards/modelh/bootloader_defs.h
index 6b8fa9f727c9..5d11fe4784bd 100644
--- a/keyboards/modelh/bootloader_defs.h
+++ b/keyboards/modelh/bootloader_defs.h
@@ -1,3 +1,20 @@
+/*
+Copyright 2020 John Hawthorn
+
+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/>.
+*/
+
 /* Address for jumping to bootloader on STM32 chips. */
 /* It is chip dependent, the correct number can be looked up here (page 175):
  * http://www.st.com/web/en/resource/technical/document/application_note/CD00167594.pdf
diff --git a/keyboards/modelh/modelh.c b/keyboards/modelh/modelh.c
index 3254b975b2cd..3e8e7b0e03de 100644
--- a/keyboards/modelh/modelh.c
+++ b/keyboards/modelh/modelh.c
@@ -20,19 +20,19 @@
 static const pin_t led_pins[3] = MODELH_LED_PINS;
 
 bool led_update_kb(led_t led_state) {
-  bool res = led_update_user(led_state);
-  if(res) {
-    writePin(led_pins[0], !led_state.num_lock);
-    writePin(led_pins[1], !led_state.caps_lock);
-    writePin(led_pins[2], !led_state.scroll_lock);
-  }
-  return res;
+    bool res = led_update_user(led_state);
+    if(res) {
+        writePin(led_pins[0], !led_state.num_lock);
+        writePin(led_pins[1], !led_state.caps_lock);
+        writePin(led_pins[2], !led_state.scroll_lock);
+    }
+    return res;
 }
 
 void led_init_ports() {
-  setPinOutput(led_pins[0]);
-  setPinOutput(led_pins[1]);
-  setPinOutput(led_pins[2]);
+    setPinOutput(led_pins[0]);
+    setPinOutput(led_pins[1]);
+    setPinOutput(led_pins[2]);
 }
 
 #else
@@ -40,9 +40,9 @@ void led_init_ports() { }
 #endif
 
 void keyboard_pre_init_kb(void) {
-  setPinOutput(MODELH_STATUS_LED);
-  writePin(MODELH_STATUS_LED, 0);
+    setPinOutput(MODELH_STATUS_LED);
+    writePin(MODELH_STATUS_LED, 0);
 
-  led_init_ports();
-  keyboard_pre_init_user();
+    led_init_ports();
+    keyboard_pre_init_user();
 }

From 890da33efded05968c077ac693fbaf70b1e4a341 Mon Sep 17 00:00:00 2001
From: Jerome Berclaz <jerome@percipient.ai>
Date: Tue, 2 May 2023 18:30:29 -0700
Subject: [PATCH 05/16] Update keyboards/modelh/rules.mk

Co-authored-by: Drashna Jaelre <drashna@live.com>
---
 keyboards/modelh/rules.mk | 8 +-------
 1 file changed, 1 insertion(+), 7 deletions(-)

diff --git a/keyboards/modelh/rules.mk b/keyboards/modelh/rules.mk
index 4a34c3a3adff..9a4c49510b32 100644
--- a/keyboards/modelh/rules.mk
+++ b/keyboards/modelh/rules.mk
@@ -1,13 +1,7 @@
 # MCU name
 MCU = STM32F103
 
-# GENERIC STM32F103C8T6 board - stm32duino bootloader
-OPT_DEFS = -DCORTEX_VTOR_INIT=0x2000
-MCU_LDSCRIPT = STM32F103x8_stm32duino_bootloader
-BOARD = STM32_F103_STM32DUINO
-
-DFU_ARGS = -d 1eaf:0003 -a2 -R
-DFU_SUFFIX_ARGS = -v 1eaf -p 0003
+BOOTLOADER = stm32duino
 
 # Enter lower-power sleep mode when on the ChibiOS idle thread
 OPT_DEFS += -DCORTEX_ENABLE_WFI_IDLE=TRUE

From 509b44819cdd2117727481c0cdca92b49c9933bf Mon Sep 17 00:00:00 2001
From: Jerome Berclaz <jerome.berclaz@a3.epfl.ch>
Date: Tue, 2 May 2023 19:56:52 -0700
Subject: [PATCH 06/16] Addressed reviewer's comments

---
 keyboards/modelh/bootloader_defs.h        |   27 -
 keyboards/modelh/chconf.h                 |  816 +-----------
 keyboards/modelh/config.h                 |   12 -
 keyboards/modelh/halconf.h                |  560 +--------
 keyboards/modelh/info.json                | 1366 ++++-----------------
 keyboards/modelh/keymaps/default/keymap.c |    4 -
 keyboards/modelh/mcuconf.h                |  216 +---
 keyboards/modelh/modelh.c                 |   23 -
 keyboards/modelh/modelh.h                 |   51 -
 keyboards/modelh/rules.mk                 |    7 -
 10 files changed, 314 insertions(+), 2768 deletions(-)
 delete mode 100644 keyboards/modelh/bootloader_defs.h

diff --git a/keyboards/modelh/bootloader_defs.h b/keyboards/modelh/bootloader_defs.h
deleted file mode 100644
index 5d11fe4784bd..000000000000
--- a/keyboards/modelh/bootloader_defs.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
-Copyright 2020 John Hawthorn
-
-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/>.
-*/
-
-/* Address for jumping to bootloader on STM32 chips. */
-/* It is chip dependent, the correct number can be looked up here (page 175):
- * http://www.st.com/web/en/resource/technical/document/application_note/CD00167594.pdf
- * This also requires a patch to chibios:
- *  <tmk_dir>/tmk_core/tool/chibios/ch-bootloader-jump.patch
- */
-
-// STM32F103* does NOT have an USB bootloader in ROM (only serial),
-//  so setting anything here does not make much sense
-#define STM32_BOOTLOADER_ADDRESS 0x80000000
diff --git a/keyboards/modelh/chconf.h b/keyboards/modelh/chconf.h
index 047468758083..413fb8d69cfd 100644
--- a/keyboards/modelh/chconf.h
+++ b/keyboards/modelh/chconf.h
@@ -1,817 +1,31 @@
-/*
-    ChibiOS - Copyright (C) 2006..2020 Giovanni Di Sirio
-
-    Licensed under the Apache License, Version 2.0 (the "License");
-    you may not use this file except in compliance with the License.
-    You may obtain a copy of the License at
-
-        http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
-*/
-
-/**
- * @file    rt/templates/chconf.h
- * @brief   Configuration file template.
- * @details A copy of this file must be placed in each project directory, it
- *          contains the application specific kernel settings.
+/* Copyright 2020 QMK
  *
- * @addtogroup config
- * @details Kernel related settings and hooks.
- * @{
- */
-
-#ifndef CHCONF_H
-#define CHCONF_H
-
-#define _CHIBIOS_RT_CONF_
-#define _CHIBIOS_RT_CONF_VER_7_0_
-
-/*===========================================================================*/
-/**
- * @name System settings
- * @{
- */
-/*===========================================================================*/
-
-/**
- * @brief   Handling of instances.
- * @note    If enabled then threads assigned to various instances can
- *          interact each other using the same synchronization objects.
- *          If disabled then each OS instance is a separate world, no
- *          direct interactions are handled by the OS.
- */
-#if !defined(CH_CFG_SMP_MODE)
-#define CH_CFG_SMP_MODE                     FALSE
-#endif
-
-/** @} */
-
-/*===========================================================================*/
-/**
- * @name System timers settings
- * @{
- */
-/*===========================================================================*/
-
-/**
- * @brief   System time counter resolution.
- * @note    Allowed values are 16, 32 or 64 bits.
- */
-#if !defined(CH_CFG_ST_RESOLUTION)
-#define CH_CFG_ST_RESOLUTION                32
-#endif
-
-/**
- * @brief   System tick frequency.
- * @details Frequency of the system timer that drives the system ticks. This
- *          setting also defines the system tick time unit.
- */
-#if !defined(CH_CFG_ST_FREQUENCY)
-#define CH_CFG_ST_FREQUENCY                 100000
-#endif
-
-/**
- * @brief   Time intervals data size.
- * @note    Allowed values are 16, 32 or 64 bits.
- */
-#if !defined(CH_CFG_INTERVALS_SIZE)
-#define CH_CFG_INTERVALS_SIZE               32
-#endif
-
-/**
- * @brief   Time types data size.
- * @note    Allowed values are 16 or 32 bits.
- */
-#if !defined(CH_CFG_TIME_TYPES_SIZE)
-#define CH_CFG_TIME_TYPES_SIZE              32
-#endif
-
-/**
- * @brief   Time delta constant for the tick-less mode.
- * @note    If this value is zero then the system uses the classic
- *          periodic tick. This value represents the minimum number
- *          of ticks that is safe to specify in a timeout directive.
- *          The value one is not valid, timeouts are rounded up to
- *          this value.
- */
-#if !defined(CH_CFG_ST_TIMEDELTA)
-#define CH_CFG_ST_TIMEDELTA                 0
-#endif
-
-/** @} */
-
-/*===========================================================================*/
-/**
- * @name Kernel parameters and options
- * @{
- */
-/*===========================================================================*/
-
-/**
- * @brief   Round robin interval.
- * @details This constant is the number of system ticks allowed for the
- *          threads before preemption occurs. Setting this value to zero
- *          disables the preemption for threads with equal priority and the
- *          round robin becomes cooperative. Note that higher priority
- *          threads can still preempt, the kernel is always preemptive.
- * @note    Disabling the round robin preemption makes the kernel more compact
- *          and generally faster.
- * @note    The round robin preemption is not supported in tickless mode and
- *          must be set to zero in that case.
- */
-#if !defined(CH_CFG_TIME_QUANTUM)
-#define CH_CFG_TIME_QUANTUM                 0
-#endif
-
-/**
- * @brief   Idle thread automatic spawn suppression.
- * @details When this option is activated the function @p chSysInit()
- *          does not spawn the idle thread. The application @p main()
- *          function becomes the idle thread and must implement an
- *          infinite loop.
- */
-#if !defined(CH_CFG_NO_IDLE_THREAD)
-#define CH_CFG_NO_IDLE_THREAD               FALSE
-#endif
-
-/** @} */
-
-/*===========================================================================*/
-/**
- * @name Performance options
- * @{
- */
-/*===========================================================================*/
-
-/**
- * @brief   OS optimization.
- * @details If enabled then time efficient rather than space efficient code
- *          is used when two possible implementations exist.
+ * 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.
  *
- * @note    This is not related to the compiler optimization options.
- * @note    The default is @p TRUE.
- */
-#if !defined(CH_CFG_OPTIMIZE_SPEED)
-#define CH_CFG_OPTIMIZE_SPEED               TRUE
-#endif
-
-/** @} */
-
-/*===========================================================================*/
-/**
- * @name Subsystem options
- * @{
- */
-/*===========================================================================*/
-
-/**
- * @brief   Time Measurement APIs.
- * @details If enabled then the time measurement APIs are included in
- *          the kernel.
+ * 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.
  *
- * @note    The default is @p TRUE.
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
-#if !defined(CH_CFG_USE_TM)
-#define CH_CFG_USE_TM                       TRUE
-#endif
 
-/**
- * @brief   Time Stamps APIs.
- * @details If enabled then the time stamps APIs are included in the kernel.
- *
- * @note    The default is @p TRUE.
- */
-#if !defined(CH_CFG_USE_TIMESTAMP)
-#define CH_CFG_USE_TIMESTAMP                TRUE
-#endif
+#pragma once
 
-/**
- * @brief   Threads registry APIs.
- * @details If enabled then the registry APIs are included in the kernel.
- *
- * @note    The default is @p TRUE.
- */
-#if !defined(CH_CFG_USE_REGISTRY)
+#define CH_CFG_ST_TIMEDELTA                 0
+#define CH_CFG_USE_TM                       TRUE
 #define CH_CFG_USE_REGISTRY                 TRUE
-#endif
-
-/**
- * @brief   Threads synchronization APIs.
- * @details If enabled then the @p chThdWait() function is included in
- *          the kernel.
- *
- * @note    The default is @p TRUE.
- */
-#if !defined(CH_CFG_USE_WAITEXIT)
 #define CH_CFG_USE_WAITEXIT                 TRUE
-#endif
-
-/**
- * @brief   Semaphores APIs.
- * @details If enabled then the Semaphores APIs are included in the kernel.
- *
- * @note    The default is @p TRUE.
- */
-#if !defined(CH_CFG_USE_SEMAPHORES)
-#define CH_CFG_USE_SEMAPHORES               TRUE
-#endif
-
-/**
- * @brief   Semaphores queuing mode.
- * @details If enabled then the threads are enqueued on semaphores by
- *          priority rather than in FIFO order.
- *
- * @note    The default is @p FALSE. Enable this if you have special
- *          requirements.
- * @note    Requires @p CH_CFG_USE_SEMAPHORES.
- */
-#if !defined(CH_CFG_USE_SEMAPHORES_PRIORITY)
-#define CH_CFG_USE_SEMAPHORES_PRIORITY      FALSE
-#endif
-
-/**
- * @brief   Mutexes APIs.
- * @details If enabled then the mutexes APIs are included in the kernel.
- *
- * @note    The default is @p TRUE.
- */
-#if !defined(CH_CFG_USE_MUTEXES)
-#define CH_CFG_USE_MUTEXES                  TRUE
-#endif
-
-/**
- * @brief   Enables recursive behavior on mutexes.
- * @note    Recursive mutexes are heavier and have an increased
- *          memory footprint.
- *
- * @note    The default is @p FALSE.
- * @note    Requires @p CH_CFG_USE_MUTEXES.
- */
-#if !defined(CH_CFG_USE_MUTEXES_RECURSIVE)
-#define CH_CFG_USE_MUTEXES_RECURSIVE        FALSE
-#endif
-
-/**
- * @brief   Conditional Variables APIs.
- * @details If enabled then the conditional variables APIs are included
- *          in the kernel.
- *
- * @note    The default is @p TRUE.
- * @note    Requires @p CH_CFG_USE_MUTEXES.
- */
-#if !defined(CH_CFG_USE_CONDVARS)
 #define CH_CFG_USE_CONDVARS                 TRUE
-#endif
-
-/**
- * @brief   Conditional Variables APIs with timeout.
- * @details If enabled then the conditional variables APIs with timeout
- *          specification are included in the kernel.
- *
- * @note    The default is @p TRUE.
- * @note    Requires @p CH_CFG_USE_CONDVARS.
- */
-#if !defined(CH_CFG_USE_CONDVARS_TIMEOUT)
 #define CH_CFG_USE_CONDVARS_TIMEOUT         FALSE
-#endif
-
-/**
- * @brief   Events Flags APIs.
- * @details If enabled then the event flags APIs are included in the kernel.
- *
- * @note    The default is @p TRUE.
- */
-#if !defined(CH_CFG_USE_EVENTS)
-#define CH_CFG_USE_EVENTS                   TRUE
-#endif
-
-/**
- * @brief   Events Flags APIs with timeout.
- * @details If enabled then the events APIs with timeout specification
- *          are included in the kernel.
- *
- * @note    The default is @p TRUE.
- * @note    Requires @p CH_CFG_USE_EVENTS.
- */
-#if !defined(CH_CFG_USE_EVENTS_TIMEOUT)
-#define CH_CFG_USE_EVENTS_TIMEOUT           TRUE
-#endif
-
-/**
- * @brief   Synchronous Messages APIs.
- * @details If enabled then the synchronous messages APIs are included
- *          in the kernel.
- *
- * @note    The default is @p TRUE.
- */
-#if !defined(CH_CFG_USE_MESSAGES)
 #define CH_CFG_USE_MESSAGES                 TRUE
-#endif
-
-/**
- * @brief   Synchronous Messages queuing mode.
- * @details If enabled then messages are served by priority rather than in
- *          FIFO order.
- *
- * @note    The default is @p FALSE. Enable this if you have special
- *          requirements.
- * @note    Requires @p CH_CFG_USE_MESSAGES.
- */
-#if !defined(CH_CFG_USE_MESSAGES_PRIORITY)
-#define CH_CFG_USE_MESSAGES_PRIORITY        FALSE
-#endif
-
-/**
- * @brief   Dynamic Threads APIs.
- * @details If enabled then the dynamic threads creation APIs are included
- *          in the kernel.
- *
- * @note    The default is @p TRUE.
- * @note    Requires @p CH_CFG_USE_WAITEXIT.
- * @note    Requires @p CH_CFG_USE_HEAP and/or @p CH_CFG_USE_MEMPOOLS.
- */
-#if !defined(CH_CFG_USE_DYNAMIC)
-#define CH_CFG_USE_DYNAMIC                  FALSE
-#endif
-
-/** @} */
-
-/*===========================================================================*/
-/**
- * @name OSLIB options
- * @{
- */
-/*===========================================================================*/
-
-/**
- * @brief   Mailboxes APIs.
- * @details If enabled then the asynchronous messages (mailboxes) APIs are
- *          included in the kernel.
- *
- * @note    The default is @p TRUE.
- * @note    Requires @p CH_CFG_USE_SEMAPHORES.
- */
-#if !defined(CH_CFG_USE_MAILBOXES)
 #define CH_CFG_USE_MAILBOXES                TRUE
-#endif
-
-/**
- * @brief   Core Memory Manager APIs.
- * @details If enabled then the core memory manager APIs are included
- *          in the kernel.
- *
- * @note    The default is @p TRUE.
- */
-#if !defined(CH_CFG_USE_MEMCORE)
-#define CH_CFG_USE_MEMCORE                  TRUE
-#endif
-
-/**
- * @brief   Managed RAM size.
- * @details Size of the RAM area to be managed by the OS. If set to zero
- *          then the whole available RAM is used. The core memory is made
- *          available to the heap allocator and/or can be used directly through
- *          the simplified core memory allocator.
- *
- * @note    In order to let the OS manage the whole RAM the linker script must
- *          provide the @p __heap_base__ and @p __heap_end__ symbols.
- * @note    Requires @p CH_CFG_USE_MEMCORE.
- */
-#if !defined(CH_CFG_MEMCORE_SIZE)
-#define CH_CFG_MEMCORE_SIZE                 0
-#endif
-
-/**
- * @brief   Heap Allocator APIs.
- * @details If enabled then the memory heap allocator APIs are included
- *          in the kernel.
- *
- * @note    The default is @p TRUE.
- * @note    Requires @p CH_CFG_USE_MEMCORE and either @p CH_CFG_USE_MUTEXES or
- *          @p CH_CFG_USE_SEMAPHORES.
- * @note    Mutexes are recommended.
- */
-#if !defined(CH_CFG_USE_HEAP)
 #define CH_CFG_USE_HEAP                     TRUE
-#endif
-
-/**
- * @brief   Memory Pools Allocator APIs.
- * @details If enabled then the memory pools allocator APIs are included
- *          in the kernel.
- *
- * @note    The default is @p TRUE.
- */
-#if !defined(CH_CFG_USE_MEMPOOLS)
-#define CH_CFG_USE_MEMPOOLS                 FALSE
-#endif
-
-/**
- * @brief   Objects FIFOs APIs.
- * @details If enabled then the objects FIFOs APIs are included
- *          in the kernel.
- *
- * @note    The default is @p TRUE.
- */
-#if !defined(CH_CFG_USE_OBJ_FIFOS)
-#define CH_CFG_USE_OBJ_FIFOS                FALSE
-#endif
-
-/**
- * @brief   Pipes APIs.
- * @details If enabled then the pipes APIs are included
- *          in the kernel.
- *
- * @note    The default is @p TRUE.
- */
-#if !defined(CH_CFG_USE_PIPES)
-#define CH_CFG_USE_PIPES                    FALSE
-#endif
-
-/**
- * @brief   Objects Caches APIs.
- * @details If enabled then the objects caches APIs are included
- *          in the kernel.
- *
- * @note    The default is @p TRUE.
- */
-#if !defined(CH_CFG_USE_OBJ_CACHES)
 #define CH_CFG_USE_OBJ_CACHES               TRUE
-#endif
-
-/**
- * @brief   Delegate threads APIs.
- * @details If enabled then the delegate threads APIs are included
- *          in the kernel.
- *
- * @note    The default is @p TRUE.
- */
-#if !defined(CH_CFG_USE_DELEGATES)
 #define CH_CFG_USE_DELEGATES                TRUE
-#endif
-
-/**
- * @brief   Jobs Queues APIs.
- * @details If enabled then the jobs queues APIs are included
- *          in the kernel.
- *
- * @note    The default is @p TRUE.
- */
-#if !defined(CH_CFG_USE_JOBS)
-#define CH_CFG_USE_JOBS                     FALSE
-#endif
-
-/** @} */
-
-/*===========================================================================*/
-/**
- * @name Objects factory options
- * @{
- */
-/*===========================================================================*/
-
-/**
- * @brief   Objects Factory APIs.
- * @details If enabled then the objects factory APIs are included in the
- *          kernel.
- *
- * @note    The default is @p FALSE.
- */
-#if !defined(CH_CFG_USE_FACTORY)
-#define CH_CFG_USE_FACTORY                  FALSE
-#endif
-
-/**
- * @brief   Maximum length for object names.
- * @details If the specified length is zero then the name is stored by
- *          pointer but this could have unintended side effects.
- */
-#if !defined(CH_CFG_FACTORY_MAX_NAMES_LENGTH)
-#define CH_CFG_FACTORY_MAX_NAMES_LENGTH     8
-#endif
-
-/**
- * @brief   Enables the registry of generic objects.
- */
-#if !defined(CH_CFG_FACTORY_OBJECTS_REGISTRY)
-#define CH_CFG_FACTORY_OBJECTS_REGISTRY     FALSE
-#endif
-
-/**
- * @brief   Enables factory for generic buffers.
- */
-#if !defined(CH_CFG_FACTORY_GENERIC_BUFFERS)
-#define CH_CFG_FACTORY_GENERIC_BUFFERS      FALSE
-#endif
-
-/**
- * @brief   Enables factory for semaphores.
- */
-#if !defined(CH_CFG_FACTORY_SEMAPHORES)
-#define CH_CFG_FACTORY_SEMAPHORES           FALSE
-#endif
-
-/**
- * @brief   Enables factory for mailboxes.
- */
-#if !defined(CH_CFG_FACTORY_MAILBOXES)
-#define CH_CFG_FACTORY_MAILBOXES            FALSE
-#endif
-
-/**
- * @brief   Enables factory for objects FIFOs.
- */
-#if !defined(CH_CFG_FACTORY_OBJ_FIFOS)
-#define CH_CFG_FACTORY_OBJ_FIFOS            FALSE
-#endif
-
-/**
- * @brief   Enables factory for Pipes.
- */
-#if !defined(CH_CFG_FACTORY_PIPES) || defined(__DOXYGEN__)
-#define CH_CFG_FACTORY_PIPES                FALSE
-#endif
-
-/** @} */
-
-/*===========================================================================*/
-/**
- * @name Debug options
- * @{
- */
-/*===========================================================================*/
-
-/**
- * @brief   Debug option, kernel statistics.
- *
- * @note    The default is @p FALSE.
- */
-#if !defined(CH_DBG_STATISTICS)
-#define CH_DBG_STATISTICS                   FALSE
-#endif
-
-/**
- * @brief   Debug option, system state check.
- * @details If enabled the correct call protocol for system APIs is checked
- *          at runtime.
- *
- * @note    The default is @p FALSE.
- */
-#if !defined(CH_DBG_SYSTEM_STATE_CHECK)
-#define CH_DBG_SYSTEM_STATE_CHECK           FALSE
-#endif
-
-/**
- * @brief   Debug option, parameters checks.
- * @details If enabled then the checks on the API functions input
- *          parameters are activated.
- *
- * @note    The default is @p FALSE.
- */
-#if !defined(CH_DBG_ENABLE_CHECKS)
-#define CH_DBG_ENABLE_CHECKS                FALSE
-#endif
-
-/**
- * @brief   Debug option, consistency checks.
- * @details If enabled then all the assertions in the kernel code are
- *          activated. This includes consistency checks inside the kernel,
- *          runtime anomalies and port-defined checks.
- *
- * @note    The default is @p FALSE.
- */
-#if !defined(CH_DBG_ENABLE_ASSERTS)
-#define CH_DBG_ENABLE_ASSERTS               FALSE
-#endif
-
-/**
- * @brief   Debug option, trace buffer.
- * @details If enabled then the trace buffer is activated.
- *
- * @note    The default is @p CH_DBG_TRACE_MASK_DISABLED.
- */
-#if !defined(CH_DBG_TRACE_MASK)
-#define CH_DBG_TRACE_MASK                   CH_DBG_TRACE_MASK_DISABLED
-#endif
-
-/**
- * @brief   Trace buffer entries.
- * @note    The trace buffer is only allocated if @p CH_DBG_TRACE_MASK is
- *          different from @p CH_DBG_TRACE_MASK_DISABLED.
- */
-#if !defined(CH_DBG_TRACE_BUFFER_SIZE)
-#define CH_DBG_TRACE_BUFFER_SIZE            128
-#endif
-
-/**
- * @brief   Debug option, stack checks.
- * @details If enabled then a runtime stack check is performed.
- *
- * @note    The default is @p FALSE.
- * @note    The stack check is performed in a architecture/port dependent way.
- *          It may not be implemented or some ports.
- * @note    The default failure mode is to halt the system with the global
- *          @p panic_msg variable set to @p NULL.
- */
-#if !defined(CH_DBG_ENABLE_STACK_CHECK)
-#define CH_DBG_ENABLE_STACK_CHECK           FALSE
-#endif
-
-/**
- * @brief   Debug option, stacks initialization.
- * @details If enabled then the threads working area is filled with a byte
- *          value when a thread is created. This can be useful for the
- *          runtime measurement of the used stack.
- *
- * @note    The default is @p FALSE.
- */
-#if !defined(CH_DBG_FILL_THREADS)
-#define CH_DBG_FILL_THREADS                 FALSE
-#endif
-
-/**
- * @brief   Debug option, threads profiling.
- * @details If enabled then a field is added to the @p thread_t structure that
- *          counts the system ticks occurred while executing the thread.
- *
- * @note    The default is @p FALSE.
- * @note    This debug option is not currently compatible with the
- *          tickless mode.
- */
-#if !defined(CH_DBG_THREADS_PROFILING)
-#define CH_DBG_THREADS_PROFILING            FALSE
-#endif
-
-/** @} */
-
-/*===========================================================================*/
-/**
- * @name Kernel hooks
- * @{
- */
-/*===========================================================================*/
-
-/**
- * @brief   System structure extension.
- * @details User fields added to the end of the @p ch_system_t structure.
- */
-#define CH_CFG_SYSTEM_EXTRA_FIELDS                                          \
-  /* Add system custom fields here.*/
-
-/**
- * @brief   System initialization hook.
- * @details User initialization code added to the @p chSysInit() function
- *          just before interrupts are enabled globally.
- */
-#define CH_CFG_SYSTEM_INIT_HOOK() {                                         \
-  /* Add system initialization code here.*/                                 \
-}
-
-/**
- * @brief   OS instance structure extension.
- * @details User fields added to the end of the @p os_instance_t structure.
- */
-#define CH_CFG_OS_INSTANCE_EXTRA_FIELDS                                     \
-  /* Add OS instance custom fields here.*/
-
-/**
- * @brief   OS instance initialization hook.
- *
- * @param[in] oip       pointer to the @p os_instance_t structure
- */
-#define CH_CFG_OS_INSTANCE_INIT_HOOK(oip) {                                 \
-  /* Add OS instance initialization code here.*/                            \
-}
-
-/**
- * @brief   Threads descriptor structure extension.
- * @details User fields added to the end of the @p thread_t structure.
- */
-#define CH_CFG_THREAD_EXTRA_FIELDS                                          \
-  /* Add threads custom fields here.*/
-
-/**
- * @brief   Threads initialization hook.
- * @details User initialization code added to the @p _thread_init() function.
- *
- * @note    It is invoked from within @p _thread_init() and implicitly from all
- *          the threads creation APIs.
- *
- * @param[in] tp        pointer to the @p thread_t structure
- */
-#define CH_CFG_THREAD_INIT_HOOK(tp) {                                       \
-  /* Add threads initialization code here.*/                                \
-}
-
-/**
- * @brief   Threads finalization hook.
- * @details User finalization code added to the @p chThdExit() API.
- *
- * @param[in] tp        pointer to the @p thread_t structure
- */
-#define CH_CFG_THREAD_EXIT_HOOK(tp) {                                       \
-  /* Add threads finalization code here.*/                                  \
-}
-
-/**
- * @brief   Context switch hook.
- * @details This hook is invoked just before switching between threads.
- *
- * @param[in] ntp       thread being switched in
- * @param[in] otp       thread being switched out
- */
-#define CH_CFG_CONTEXT_SWITCH_HOOK(ntp, otp) {                              \
-  /* Context switch code here.*/                                            \
-}
-
-/**
- * @brief   ISR enter hook.
- */
-#define CH_CFG_IRQ_PROLOGUE_HOOK() {                                        \
-  /* IRQ prologue code here.*/                                              \
-}
-
-/**
- * @brief   ISR exit hook.
- */
-#define CH_CFG_IRQ_EPILOGUE_HOOK() {                                        \
-  /* IRQ epilogue code here.*/                                              \
-}
-
-/**
- * @brief   Idle thread enter hook.
- * @note    This hook is invoked within a critical zone, no OS functions
- *          should be invoked from here.
- * @note    This macro can be used to activate a power saving mode.
- */
-#define CH_CFG_IDLE_ENTER_HOOK() {                                          \
-  /* Idle-enter code here.*/                                                \
-}
-
-/**
- * @brief   Idle thread leave hook.
- * @note    This hook is invoked within a critical zone, no OS functions
- *          should be invoked from here.
- * @note    This macro can be used to deactivate a power saving mode.
- */
-#define CH_CFG_IDLE_LEAVE_HOOK() {                                          \
-  /* Idle-leave code here.*/                                                \
-}
-
-/**
- * @brief   Idle Loop hook.
- * @details This hook is continuously invoked by the idle thread loop.
- */
-#define CH_CFG_IDLE_LOOP_HOOK() {                                           \
-  /* Idle loop code here.*/                                                 \
-}
-
-/**
- * @brief   System tick event hook.
- * @details This hook is invoked in the system tick handler immediately
- *          after processing the virtual timers queue.
- */
-#define CH_CFG_SYSTEM_TICK_HOOK() {                                         \
-  /* System tick event code here.*/                                         \
-}
-
-/**
- * @brief   System halt hook.
- * @details This hook is invoked in case to a system halting error before
- *          the system is halted.
- */
-#define CH_CFG_SYSTEM_HALT_HOOK(reason) {                                   \
-  /* System halt code here.*/                                               \
-}
-
-/**
- * @brief   Trace hook.
- * @details This hook is invoked each time a new record is written in the
- *          trace buffer.
- */
-#define CH_CFG_TRACE_HOOK(tep) {                                            \
-  /* Trace code here.*/                                                     \
-}
-
-/**
- * @brief   Runtime Faults Collection Unit hook.
- * @details This hook is invoked each time new faults are collected and stored.
- */
-#define CH_CFG_RUNTIME_FAULTS_HOOK(mask) {                                  \
-  /* Faults handling code here.*/                                           \
-}
-
-/** @} */
-
-/*===========================================================================*/
-/* Port-specific settings (override port settings defaulted in chcore.h).    */
-/*===========================================================================*/
-
-#endif  /* CHCONF_H */
 
-/** @} */
+#include_next <chconf.h>
diff --git a/keyboards/modelh/config.h b/keyboards/modelh/config.h
index d5004a13d6ad..20d8461c4ee8 100644
--- a/keyboards/modelh/config.h
+++ b/keyboards/modelh/config.h
@@ -19,22 +19,10 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 
 /* Model H customizations */
-#define MODELH_LED_PINS { B9, B8, B7 }
 
 #define MODELH_STATUS_LED C13
 
 
-/* key matrix size */
-#define MATRIX_ROWS 8
-#define MATRIX_COLS 16
-
-
-// Model H should use absolute maximum 80mA when all LEDs are on and it is in
-// use. Only requesting 100mA should allow it to work with devices only
-// supporting USB 1.0 power levels like some iPads.
-#define USB_MAX_POWER_CONSUMPTION 100
-
-
 /* define if matrix has ghost (lacks anti-ghosting diodes) */
 #define MATRIX_HAS_GHOST
 
diff --git a/keyboards/modelh/halconf.h b/keyboards/modelh/halconf.h
index 80abf9688d05..8e3ad48ffc6f 100644
--- a/keyboards/modelh/halconf.h
+++ b/keyboards/modelh/halconf.h
@@ -1,553 +1,23 @@
-/*
-    ChibiOS - Copyright (C) 2006..2020 Giovanni Di Sirio
-
-    Licensed under the Apache License, Version 2.0 (the "License");
-    you may not use this file except in compliance with the License.
-    You may obtain a copy of the License at
-
-        http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
-*/
-
-/**
- * @file    templates/halconf.h
- * @brief   HAL configuration header.
- * @details HAL configuration file, this file allows to enable or disable the
- *          various device drivers from your application. You may also use
- *          this file in order to override the device drivers default settings.
+/* Copyright 2020 QMK
  *
- * @addtogroup HAL_CONF
- * @{
- */
-
-#ifndef HALCONF_H
-#define HALCONF_H
-
-#define _CHIBIOS_HAL_CONF_
-#define _CHIBIOS_HAL_CONF_VER_8_4_
-
-#include "mcuconf.h"
-
-/**
- * @brief   Enables the PAL subsystem.
- */
-#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__)
-#define HAL_USE_PAL                         TRUE
-#endif
-
-/**
- * @brief   Enables the ADC subsystem.
- */
-#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__)
-#define HAL_USE_ADC                         FALSE
-#endif
-
-/**
- * @brief   Enables the CAN subsystem.
- */
-#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__)
-#define HAL_USE_CAN                         FALSE
-#endif
-
-/**
- * @brief   Enables the cryptographic subsystem.
- */
-#if !defined(HAL_USE_CRY) || defined(__DOXYGEN__)
-#define HAL_USE_CRY                         FALSE
-#endif
-
-/**
- * @brief   Enables the DAC subsystem.
- */
-#if !defined(HAL_USE_DAC) || defined(__DOXYGEN__)
-#define HAL_USE_DAC                         FALSE
-#endif
-
-/**
- * @brief   Enables the EFlash subsystem.
- */
-#if !defined(HAL_USE_EFL) || defined(__DOXYGEN__)
-#define HAL_USE_EFL                         FALSE
-#endif
-
-/**
- * @brief   Enables the GPT subsystem.
- */
-#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__)
-#define HAL_USE_GPT                         FALSE
-#endif
-
-/**
- * @brief   Enables the I2C subsystem.
- */
-#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__)
-#define HAL_USE_I2C                         FALSE
-#endif
-
-/**
- * @brief   Enables the I2S subsystem.
- */
-#if !defined(HAL_USE_I2S) || defined(__DOXYGEN__)
-#define HAL_USE_I2S                         FALSE
-#endif
-
-/**
- * @brief   Enables the ICU subsystem.
+ * 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/>.
  */
-#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__)
-#define HAL_USE_ICU                         FALSE
-#endif
 
-/**
- * @brief   Enables the MAC subsystem.
- */
-#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__)
-#define HAL_USE_MAC                         FALSE
-#endif
+#pragma once
 
-/**
- * @brief   Enables the MMC_SPI subsystem.
- */
-#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__)
-#define HAL_USE_MMC_SPI                     FALSE
-#endif
 
-/**
- * @brief   Enables the PWM subsystem.
- */
-#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__)
 #define HAL_USE_PWM                         TRUE
-#endif
-
-/**
- * @brief   Enables the RTC subsystem.
- */
-#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__)
-#define HAL_USE_RTC                         FALSE
-#endif
-
-/**
- * @brief   Enables the SDC subsystem.
- */
-#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__)
-#define HAL_USE_SDC                         FALSE
-#endif
-
-/**
- * @brief   Enables the SERIAL subsystem.
- */
-#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__)
-#define HAL_USE_SERIAL                      FALSE
-#endif
-
-/**
- * @brief   Enables the SERIAL over USB subsystem.
- */
-#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__)
-#define HAL_USE_SERIAL_USB                  FALSE
-#endif
-
-/**
- * @brief   Enables the SIO subsystem.
- */
-#if !defined(HAL_USE_SIO) || defined(__DOXYGEN__)
-#define HAL_USE_SIO                         FALSE
-#endif
-
-/**
- * @brief   Enables the SPI subsystem.
- */
-#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__)
-#define HAL_USE_SPI                         FALSE
-#endif
-
-/**
- * @brief   Enables the TRNG subsystem.
- */
-#if !defined(HAL_USE_TRNG) || defined(__DOXYGEN__)
-#define HAL_USE_TRNG                        FALSE
-#endif
-
-/**
- * @brief   Enables the UART subsystem.
- */
-#if !defined(HAL_USE_UART) || defined(__DOXYGEN__)
-#define HAL_USE_UART                        FALSE
-#endif
-
-/**
- * @brief   Enables the USB subsystem.
- */
-#if !defined(HAL_USE_USB) || defined(__DOXYGEN__)
-#define HAL_USE_USB                         TRUE
-#endif
-
-/**
- * @brief   Enables the WDG subsystem.
- */
-#if !defined(HAL_USE_WDG) || defined(__DOXYGEN__)
-#define HAL_USE_WDG                         FALSE
-#endif
-
-/**
- * @brief   Enables the WSPI subsystem.
- */
-#if !defined(HAL_USE_WSPI) || defined(__DOXYGEN__)
-#define HAL_USE_WSPI                        FALSE
-#endif
-
-/*===========================================================================*/
-/* PAL driver related settings.                                              */
-/*===========================================================================*/
-
-/**
- * @brief   Enables synchronous APIs.
- * @note    Disabling this option saves both code and data space.
- */
-#if !defined(PAL_USE_CALLBACKS) || defined(__DOXYGEN__)
-#define PAL_USE_CALLBACKS                   FALSE
-#endif
-
-/**
- * @brief   Enables synchronous APIs.
- * @note    Disabling this option saves both code and data space.
- */
-#if !defined(PAL_USE_WAIT) || defined(__DOXYGEN__)
-#define PAL_USE_WAIT                        FALSE
-#endif
-
-/*===========================================================================*/
-/* ADC driver related settings.                                              */
-/*===========================================================================*/
-
-/**
- * @brief   Enables synchronous APIs.
- * @note    Disabling this option saves both code and data space.
- */
-#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__)
-#define ADC_USE_WAIT                        TRUE
-#endif
-
-/**
- * @brief   Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs.
- * @note    Disabling this option saves both code and data space.
- */
-#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__)
-#define ADC_USE_MUTUAL_EXCLUSION            TRUE
-#endif
-
-/*===========================================================================*/
-/* CAN driver related settings.                                              */
-/*===========================================================================*/
-
-/**
- * @brief   Sleep mode related APIs inclusion switch.
- */
-#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__)
-#define CAN_USE_SLEEP_MODE                  TRUE
-#endif
-
-/**
- * @brief   Enforces the driver to use direct callbacks rather than OSAL events.
- */
-#if !defined(CAN_ENFORCE_USE_CALLBACKS) || defined(__DOXYGEN__)
-#define CAN_ENFORCE_USE_CALLBACKS           FALSE
-#endif
-
-/*===========================================================================*/
-/* CRY driver related settings.                                              */
-/*===========================================================================*/
-
-/**
- * @brief   Enables the SW fall-back of the cryptographic driver.
- * @details When enabled, this option, activates a fall-back software
- *          implementation for algorithms not supported by the underlying
- *          hardware.
- * @note    Fall-back implementations may not be present for all algorithms.
- */
-#if !defined(HAL_CRY_USE_FALLBACK) || defined(__DOXYGEN__)
-#define HAL_CRY_USE_FALLBACK                FALSE
-#endif
-
-/**
- * @brief   Makes the driver forcibly use the fall-back implementations.
- */
-#if !defined(HAL_CRY_ENFORCE_FALLBACK) || defined(__DOXYGEN__)
-#define HAL_CRY_ENFORCE_FALLBACK            FALSE
-#endif
-
-/*===========================================================================*/
-/* DAC driver related settings.                                              */
-/*===========================================================================*/
-
-/**
- * @brief   Enables synchronous APIs.
- * @note    Disabling this option saves both code and data space.
- */
-#if !defined(DAC_USE_WAIT) || defined(__DOXYGEN__)
-#define DAC_USE_WAIT                        TRUE
-#endif
-
-/**
- * @brief   Enables the @p dacAcquireBus() and @p dacReleaseBus() APIs.
- * @note    Disabling this option saves both code and data space.
- */
-#if !defined(DAC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__)
-#define DAC_USE_MUTUAL_EXCLUSION            TRUE
-#endif
-
-/*===========================================================================*/
-/* I2C driver related settings.                                              */
-/*===========================================================================*/
-
-/**
- * @brief   Enables the mutual exclusion APIs on the I2C bus.
- */
-#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__)
-#define I2C_USE_MUTUAL_EXCLUSION            TRUE
-#endif
-
-/*===========================================================================*/
-/* MAC driver related settings.                                              */
-/*===========================================================================*/
-
-/**
- * @brief   Enables the zero-copy API.
- */
-#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__)
-#define MAC_USE_ZERO_COPY                   FALSE
-#endif
-
-/**
- * @brief   Enables an event sources for incoming packets.
- */
-#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__)
-#define MAC_USE_EVENTS                      TRUE
-#endif
-
-/*===========================================================================*/
-/* MMC_SPI driver related settings.                                          */
-/*===========================================================================*/
-
-/**
- * @brief   Timeout before assuming a failure while waiting for card idle.
- * @note    Time is in milliseconds.
- */
-#if !defined(MMC_IDLE_TIMEOUT_MS) || defined(__DOXYGEN__)
-#define MMC_IDLE_TIMEOUT_MS                 1000
-#endif
-
-/**
- * @brief   Mutual exclusion on the SPI bus.
- */
-#if !defined(MMC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__)
-#define MMC_USE_MUTUAL_EXCLUSION            TRUE
-#endif
-
-/*===========================================================================*/
-/* SDC driver related settings.                                              */
-/*===========================================================================*/
-
-/**
- * @brief   Number of initialization attempts before rejecting the card.
- * @note    Attempts are performed at 10mS intervals.
- */
-#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__)
-#define SDC_INIT_RETRY                      100
-#endif
-
-/**
- * @brief   Include support for MMC cards.
- * @note    MMC support is not yet implemented so this option must be kept
- *          at @p FALSE.
- */
-#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__)
-#define SDC_MMC_SUPPORT                     FALSE
-#endif
-
-/**
- * @brief   Delays insertions.
- * @details If enabled this options inserts delays into the MMC waiting
- *          routines releasing some extra CPU time for the threads with
- *          lower priority, this may slow down the driver a bit however.
- */
-#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__)
-#define SDC_NICE_WAITING                    TRUE
-#endif
-
-/**
- * @brief   OCR initialization constant for V20 cards.
- */
-#if !defined(SDC_INIT_OCR_V20) || defined(__DOXYGEN__)
-#define SDC_INIT_OCR_V20                    0x50FF8000U
-#endif
-
-/**
- * @brief   OCR initialization constant for non-V20 cards.
- */
-#if !defined(SDC_INIT_OCR) || defined(__DOXYGEN__)
-#define SDC_INIT_OCR                        0x80100000U
-#endif
-
-/*===========================================================================*/
-/* SERIAL driver related settings.                                           */
-/*===========================================================================*/
-
-/**
- * @brief   Default bit rate.
- * @details Configuration parameter, this is the baud rate selected for the
- *          default configuration.
- */
-#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__)
-#define SERIAL_DEFAULT_BITRATE              38400
-#endif
-
-/**
- * @brief   Serial buffers size.
- * @details Configuration parameter, you can change the depth of the queue
- *          buffers depending on the requirements of your application.
- * @note    The default is 16 bytes for both the transmission and receive
- *          buffers.
- */
-#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__)
 #define SERIAL_BUFFERS_SIZE                 16
-#endif
-
-/*===========================================================================*/
-/* SIO driver related settings.                                              */
-/*===========================================================================*/
-
-/**
- * @brief   Default bit rate.
- * @details Configuration parameter, this is the baud rate selected for the
- *          default configuration.
- */
-#if !defined(SIO_DEFAULT_BITRATE) || defined(__DOXYGEN__)
-#define SIO_DEFAULT_BITRATE                 38400
-#endif
-
-/**
- * @brief   Support for thread synchronization API.
- */
-#if !defined(SIO_USE_SYNCHRONIZATION) || defined(__DOXYGEN__)
-#define SIO_USE_SYNCHRONIZATION             TRUE
-#endif
-
-/*===========================================================================*/
-/* SERIAL_USB driver related setting.                                        */
-/*===========================================================================*/
-
-/**
- * @brief   Serial over USB buffers size.
- * @details Configuration parameter, the buffer size must be a multiple of
- *          the USB data endpoint maximum packet size.
- * @note    The default is 256 bytes for both the transmission and receive
- *          buffers.
- */
-#if !defined(SERIAL_USB_BUFFERS_SIZE) || defined(__DOXYGEN__)
-#define SERIAL_USB_BUFFERS_SIZE             1
-#endif
-
-/**
- * @brief   Serial over USB number of buffers.
- * @note    The default is 2 buffers.
- */
-#if !defined(SERIAL_USB_BUFFERS_NUMBER) || defined(__DOXYGEN__)
-#define SERIAL_USB_BUFFERS_NUMBER           2
-#endif
-
-/*===========================================================================*/
-/* SPI driver related settings.                                              */
-/*===========================================================================*/
-
-/**
- * @brief   Enables synchronous APIs.
- * @note    Disabling this option saves both code and data space.
- */
-#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__)
-#define SPI_USE_WAIT                        TRUE
-#endif
-
-/**
- * @brief   Inserts an assertion on function errors before returning.
- */
-#if !defined(SPI_USE_ASSERT_ON_ERROR) || defined(__DOXYGEN__)
-#define SPI_USE_ASSERT_ON_ERROR             TRUE
-#endif
-
-/**
- * @brief   Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs.
- * @note    Disabling this option saves both code and data space.
- */
-#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__)
-#define SPI_USE_MUTUAL_EXCLUSION            TRUE
-#endif
-
-/**
- * @brief   Handling method for SPI CS line.
- * @note    Disabling this option saves both code and data space.
- */
-#if !defined(SPI_SELECT_MODE) || defined(__DOXYGEN__)
-#define SPI_SELECT_MODE                     SPI_SELECT_MODE_PAD
-#endif
-
-/*===========================================================================*/
-/* UART driver related settings.                                             */
-/*===========================================================================*/
-
-/**
- * @brief   Enables synchronous APIs.
- * @note    Disabling this option saves both code and data space.
- */
-#if !defined(UART_USE_WAIT) || defined(__DOXYGEN__)
-#define UART_USE_WAIT                       FALSE
-#endif
-
-/**
- * @brief   Enables the @p uartAcquireBus() and @p uartReleaseBus() APIs.
- * @note    Disabling this option saves both code and data space.
- */
-#if !defined(UART_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__)
-#define UART_USE_MUTUAL_EXCLUSION           FALSE
-#endif
-
-/*===========================================================================*/
-/* USB driver related settings.                                              */
-/*===========================================================================*/
-
-/**
- * @brief   Enables synchronous APIs.
- * @note    Disabling this option saves both code and data space.
- */
-#if !defined(USB_USE_WAIT) || defined(__DOXYGEN__)
-#define USB_USE_WAIT                        TRUE
-#endif
-
-/*===========================================================================*/
-/* WSPI driver related settings.                                             */
-/*===========================================================================*/
-
-/**
- * @brief   Enables synchronous APIs.
- * @note    Disabling this option saves both code and data space.
- */
-#if !defined(WSPI_USE_WAIT) || defined(__DOXYGEN__)
-#define WSPI_USE_WAIT                       TRUE
-#endif
-
-/**
- * @brief   Enables the @p wspiAcquireBus() and @p wspiReleaseBus() APIs.
- * @note    Disabling this option saves both code and data space.
- */
-#if !defined(WSPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__)
-#define WSPI_USE_MUTUAL_EXCLUSION           TRUE
-#endif
-
-#endif /* HALCONF_H */
 
-/** @} */
+#include_next <halconf.h>
diff --git a/keyboards/modelh/info.json b/keyboards/modelh/info.json
index d53b352524da..86e8bea4188c 100644
--- a/keyboards/modelh/info.json
+++ b/keyboards/modelh/info.json
@@ -1,1103 +1,273 @@
 {
-  "keyboard_name": "Model M",
-  "manufacturer": "IBM",
-  "url": "modelh.club",
-  "maintainer": "jhawthorn",
-  "usb": {
-    "vid": "0xFEED",
-    "pid": "0xB155",
-    "device_version": "1.0.0"
-  },
-  "debounce": 5,
-  "diode_direction": "COL2ROW",
-  "matrix_pins": {
-    "cols": [
-      "A10",
-      "A9",
-      "A8",
-      "B15",
-      "B14",
-      "B13",
-      "B12",
-      "B11",
-      "B10",
-      "B1",
-      "B0",
-      "A7",
-      "A6",
-      "A5",
-      "A4",
-      "A3"
-    ],
-    "rows": [
-      "B6",
-      "B5",
-      "B4",
-      "A15",
-      "B3",
-      "A0",
-      "A2",
-      "A1"
-    ]
-  },
-  "indicators": {
-    "num_lock": "B9",
-    "caps_lock": "B8",
-    "scroll_lock": "B7"
-  },
-  "processor": "STM32F103",
-  "bootloader": "stm32-dfu",
-  "layouts": {
-    "LAYOUT_fullsize_iso_wkl": {
-      "layout": [
-        {
-          "label": "Esc",
-          "x": 0,
-          "y": 0
-        },
-        {
-          "label": "F1",
-          "x": 2,
-          "y": 0
-        },
-        {
-          "label": "F2",
-          "x": 3,
-          "y": 0
-        },
-        {
-          "label": "F3",
-          "x": 4,
-          "y": 0
-        },
-        {
-          "label": "F4",
-          "x": 5,
-          "y": 0
-        },
-        {
-          "label": "F5",
-          "x": 6.5,
-          "y": 0
-        },
-        {
-          "label": "F6",
-          "x": 7.5,
-          "y": 0
-        },
-        {
-          "label": "F7",
-          "x": 8.5,
-          "y": 0
-        },
-        {
-          "label": "F8",
-          "x": 9.5,
-          "y": 0
-        },
-        {
-          "label": "F9",
-          "x": 11,
-          "y": 0
-        },
-        {
-          "label": "F10",
-          "x": 12,
-          "y": 0
-        },
-        {
-          "label": "F11",
-          "x": 13,
-          "y": 0
-        },
-        {
-          "label": "F12",
-          "x": 14,
-          "y": 0
-        },
-        {
-          "label": "PrtSc",
-          "x": 15.25,
-          "y": 0
-        },
-        {
-          "label": "Scroll Lock",
-          "x": 16.25,
-          "y": 0
-        },
-        {
-          "label": "Pause",
-          "x": 17.25,
-          "y": 0
-        },
-        {
-          "label": "~",
-          "x": 0,
-          "y": 1.5
-        },
-        {
-          "label": "!",
-          "x": 1,
-          "y": 1.5
-        },
-        {
-          "label": "@",
-          "x": 2,
-          "y": 1.5
-        },
-        {
-          "label": "#",
-          "x": 3,
-          "y": 1.5
-        },
-        {
-          "label": "$",
-          "x": 4,
-          "y": 1.5
-        },
-        {
-          "label": "%",
-          "x": 5,
-          "y": 1.5
-        },
-        {
-          "label": "^",
-          "x": 6,
-          "y": 1.5
-        },
-        {
-          "label": "&",
-          "x": 7,
-          "y": 1.5
-        },
-        {
-          "label": "*",
-          "x": 8,
-          "y": 1.5
-        },
-        {
-          "label": "(",
-          "x": 9,
-          "y": 1.5
-        },
-        {
-          "label": ")",
-          "x": 10,
-          "y": 1.5
-        },
-        {
-          "label": "_",
-          "x": 11,
-          "y": 1.5
-        },
-        {
-          "label": "+",
-          "x": 12,
-          "y": 1.5
-        },
-        {
-          "label": "Backspace",
-          "x": 13,
-          "y": 1.5,
-          "w": 2
-        },
-        {
-          "label": "Insert",
-          "x": 15.25,
-          "y": 1.5
-        },
-        {
-          "label": "Home",
-          "x": 16.25,
-          "y": 1.5
-        },
-        {
-          "label": "PgUp",
-          "x": 17.25,
-          "y": 1.5
-        },
-        {
-          "label": "Num Lock",
-          "x": 18.5,
-          "y": 1.5
-        },
-        {
-          "label": "/",
-          "x": 19.5,
-          "y": 1.5
-        },
-        {
-          "label": "*",
-          "x": 20.5,
-          "y": 1.5
-        },
-        {
-          "label": "-",
-          "x": 21.5,
-          "y": 1.5
-        },
-        {
-          "label": "Tab",
-          "x": 0,
-          "y": 2.5,
-          "w": 1.5
-        },
-        {
-          "label": "Q",
-          "x": 1.5,
-          "y": 2.5
-        },
-        {
-          "label": "W",
-          "x": 2.5,
-          "y": 2.5
-        },
-        {
-          "label": "E",
-          "x": 3.5,
-          "y": 2.5
-        },
-        {
-          "label": "R",
-          "x": 4.5,
-          "y": 2.5
-        },
-        {
-          "label": "T",
-          "x": 5.5,
-          "y": 2.5
-        },
-        {
-          "label": "Y",
-          "x": 6.5,
-          "y": 2.5
-        },
-        {
-          "label": "U",
-          "x": 7.5,
-          "y": 2.5
-        },
-        {
-          "label": "I",
-          "x": 8.5,
-          "y": 2.5
-        },
-        {
-          "label": "O",
-          "x": 9.5,
-          "y": 2.5
-        },
-        {
-          "label": "P",
-          "x": 10.5,
-          "y": 2.5
-        },
-        {
-          "label": "{",
-          "x": 11.5,
-          "y": 2.5
-        },
-        {
-          "label": "}",
-          "x": 12.5,
-          "y": 2.5
-        },
-        {
-          "label": "Delete",
-          "x": 15.25,
-          "y": 2.5
-        },
-        {
-          "label": "End",
-          "x": 16.25,
-          "y": 2.5
-        },
-        {
-          "label": "PgDn",
-          "x": 17.25,
-          "y": 2.5
-        },
-        {
-          "label": "7",
-          "x": 18.5,
-          "y": 2.5
-        },
-        {
-          "label": "8",
-          "x": 19.5,
-          "y": 2.5
-        },
-        {
-          "label": "9",
-          "x": 20.5,
-          "y": 2.5
-        },
-        {
-          "label": "+",
-          "x": 21.5,
-          "y": 2.5,
-          "h": 2
-        },
-        {
-          "label": "Caps Lock",
-          "x": 0,
-          "y": 3.5,
-          "w": 1.5
-        },
-        {
-          "label": "A",
-          "x": 1.75,
-          "y": 3.5
-        },
-        {
-          "label": "S",
-          "x": 2.75,
-          "y": 3.5
-        },
-        {
-          "label": "D",
-          "x": 3.75,
-          "y": 3.5
-        },
-        {
-          "label": "F",
-          "x": 4.75,
-          "y": 3.5
-        },
-        {
-          "label": "G",
-          "x": 5.75,
-          "y": 3.5
-        },
-        {
-          "label": "H",
-          "x": 6.75,
-          "y": 3.5
-        },
-        {
-          "label": "J",
-          "x": 7.75,
-          "y": 3.5
-        },
-        {
-          "label": "K",
-          "x": 8.75,
-          "y": 3.5
-        },
-        {
-          "label": "L",
-          "x": 9.75,
-          "y": 3.5
-        },
-        {
-          "label": ":",
-          "x": 10.75,
-          "y": 3.5
-        },
-        {
-          "label": "\"",
-          "x": 11.75,
-          "y": 3.5
-        },
-        {
-          "label": "~",
-          "x": 12.75,
-          "y": 3.5
-        },
-        {
-          "label": "Enter",
-          "x": 13.75,
-          "y": 2.5,
-          "w": 1.25,
-          "h": 2
-        },
-        {
-          "label": "4",
-          "x": 18.5,
-          "y": 3.5
-        },
-        {
-          "label": "5",
-          "x": 19.5,
-          "y": 3.5
-        },
-        {
-          "label": "6",
-          "x": 20.5,
-          "y": 3.5
-        },
-        {
-          "label": "Shift",
-          "x": 0,
-          "y": 4.5,
-          "w": 1.25
-        },
-        {
-          "label": "|",
-          "x": 1.25,
-          "y": 4.5
-        },
-        {
-          "label": "Z",
-          "x": 2.25,
-          "y": 4.5
-        },
-        {
-          "label": "X",
-          "x": 3.25,
-          "y": 4.5
-        },
-        {
-          "label": "C",
-          "x": 4.25,
-          "y": 4.5
-        },
-        {
-          "label": "V",
-          "x": 5.25,
-          "y": 4.5
-        },
-        {
-          "label": "B",
-          "x": 6.25,
-          "y": 4.5
-        },
-        {
-          "label": "N",
-          "x": 7.25,
-          "y": 4.5
-        },
-        {
-          "label": "M",
-          "x": 8.25,
-          "y": 4.5
-        },
-        {
-          "label": "<",
-          "x": 9.25,
-          "y": 4.5
-        },
-        {
-          "label": ">",
-          "x": 10.25,
-          "y": 4.5
-        },
-        {
-          "label": "?",
-          "x": 11.25,
-          "y": 4.5
-        },
-        {
-          "label": "Shift",
-          "x": 12.25,
-          "y": 4.5,
-          "w": 2.75
-        },
-        {
-          "label": "↑",
-          "x": 16.25,
-          "y": 4.5
-        },
-        {
-          "label": "1",
-          "x": 18.5,
-          "y": 4.5
-        },
-        {
-          "label": "2",
-          "x": 19.5,
-          "y": 4.5
-        },
-        {
-          "label": "3",
-          "x": 20.5,
-          "y": 4.5
-        },
-        {
-          "label": "Enter",
-          "x": 21.5,
-          "y": 4.5,
-          "h": 2
-        },
-        {
-          "label": "Ctrl",
-          "x": 0,
-          "y": 5.5,
-          "w": 1.5
-        },
-        {
-          "label": "Alt",
-          "x": 2.5,
-          "y": 5.5,
-          "w": 1.5
-        },
-        {
-          "x": 4,
-          "y": 5.5,
-          "w": 7
-        },
-        {
-          "label": "Alt",
-          "x": 11,
-          "y": 5.5,
-          "w": 1.5
-        },
-        {
-          "label": "Ctrl",
-          "x": 13.5,
-          "y": 5.5,
-          "w": 1.5
-        },
-        {
-          "label": "←",
-          "x": 15.25,
-          "y": 5.5
-        },
-        {
-          "label": "↓",
-          "x": 16.25,
-          "y": 5.5
-        },
-        {
-          "label": "→",
-          "x": 17.25,
-          "y": 5.5
-        },
-        {
-          "label": "0",
-          "x": 18.5,
-          "y": 5.5,
-          "w": 2
-        },
-        {
-          "label": ".",
-          "x": 20.5,
-          "y": 5.5
-        }
-      ]
+    "manufacturer": "IBM",
+    "keyboard_name": "Model M",
+    "maintainer": "jhawthorn",
+    "board": "STM32_F103_STM32DUINO",
+    "bootloader": "stm32duino",
+    "bootmagic": {
+        "enabled": false
     },
-    "LAYOUT_fullsize_ansi_wkl": {
-      "layout": [
-        {
-          "label": "Esc",
-          "x": 0,
-          "y": 0
-        },
-        {
-          "label": "F1",
-          "x": 2,
-          "y": 0
-        },
-        {
-          "label": "F2",
-          "x": 3,
-          "y": 0
-        },
-        {
-          "label": "F3",
-          "x": 4,
-          "y": 0
-        },
-        {
-          "label": "F4",
-          "x": 5,
-          "y": 0
-        },
-        {
-          "label": "F5",
-          "x": 6.5,
-          "y": 0
-        },
-        {
-          "label": "F6",
-          "x": 7.5,
-          "y": 0
-        },
-        {
-          "label": "F7",
-          "x": 8.5,
-          "y": 0
-        },
-        {
-          "label": "F8",
-          "x": 9.5,
-          "y": 0
-        },
-        {
-          "label": "F9",
-          "x": 11,
-          "y": 0
-        },
-        {
-          "label": "F10",
-          "x": 12,
-          "y": 0
-        },
-        {
-          "label": "F11",
-          "x": 13,
-          "y": 0
-        },
-        {
-          "label": "F12",
-          "x": 14,
-          "y": 0
-        },
-        {
-          "label": "PrtSc",
-          "x": 15.25,
-          "y": 0
-        },
-        {
-          "label": "Scroll Lock",
-          "x": 16.25,
-          "y": 0
-        },
-        {
-          "label": "Pause",
-          "x": 17.25,
-          "y": 0
-        },
-        {
-          "label": "~",
-          "x": 0,
-          "y": 1.5
-        },
-        {
-          "label": "!",
-          "x": 1,
-          "y": 1.5
-        },
-        {
-          "label": "@",
-          "x": 2,
-          "y": 1.5
-        },
-        {
-          "label": "#",
-          "x": 3,
-          "y": 1.5
-        },
-        {
-          "label": "$",
-          "x": 4,
-          "y": 1.5
-        },
-        {
-          "label": "%",
-          "x": 5,
-          "y": 1.5
-        },
-        {
-          "label": "^",
-          "x": 6,
-          "y": 1.5
-        },
-        {
-          "label": "&",
-          "x": 7,
-          "y": 1.5
-        },
-        {
-          "label": "*",
-          "x": 8,
-          "y": 1.5
-        },
-        {
-          "label": "(",
-          "x": 9,
-          "y": 1.5
-        },
-        {
-          "label": ")",
-          "x": 10,
-          "y": 1.5
-        },
-        {
-          "label": "_",
-          "x": 11,
-          "y": 1.5
-        },
-        {
-          "label": "+",
-          "x": 12,
-          "y": 1.5
-        },
-        {
-          "label": "Backspace",
-          "x": 13,
-          "y": 1.5,
-          "w": 2
-        },
-        {
-          "label": "Insert",
-          "x": 15.25,
-          "y": 1.5
-        },
-        {
-          "label": "Home",
-          "x": 16.25,
-          "y": 1.5
-        },
-        {
-          "label": "PgUp",
-          "x": 17.25,
-          "y": 1.5
-        },
-        {
-          "label": "Num Lock",
-          "x": 18.5,
-          "y": 1.5
-        },
-        {
-          "label": "/",
-          "x": 19.5,
-          "y": 1.5
-        },
-        {
-          "label": "*",
-          "x": 20.5,
-          "y": 1.5
-        },
-        {
-          "label": "-",
-          "x": 21.5,
-          "y": 1.5
-        },
-        {
-          "label": "Tab",
-          "x": 0,
-          "y": 2.5,
-          "w": 1.5
-        },
-        {
-          "label": "Q",
-          "x": 1.5,
-          "y": 2.5
-        },
-        {
-          "label": "W",
-          "x": 2.5,
-          "y": 2.5
-        },
-        {
-          "label": "E",
-          "x": 3.5,
-          "y": 2.5
-        },
-        {
-          "label": "R",
-          "x": 4.5,
-          "y": 2.5
-        },
-        {
-          "label": "T",
-          "x": 5.5,
-          "y": 2.5
-        },
-        {
-          "label": "Y",
-          "x": 6.5,
-          "y": 2.5
-        },
-        {
-          "label": "U",
-          "x": 7.5,
-          "y": 2.5
-        },
-        {
-          "label": "I",
-          "x": 8.5,
-          "y": 2.5
-        },
-        {
-          "label": "O",
-          "x": 9.5,
-          "y": 2.5
-        },
-        {
-          "label": "P",
-          "x": 10.5,
-          "y": 2.5
-        },
-        {
-          "label": "{",
-          "x": 11.5,
-          "y": 2.5
-        },
-        {
-          "label": "}",
-          "x": 12.5,
-          "y": 2.5
-        },
-        {
-          "label": "|",
-          "x": 13.5,
-          "y": 2.5,
-          "w": 1.5
-        },
-        {
-          "label": "Delete",
-          "x": 15.25,
-          "y": 2.5
-        },
-        {
-          "label": "End",
-          "x": 16.25,
-          "y": 2.5
-        },
-        {
-          "label": "PgDn",
-          "x": 17.25,
-          "y": 2.5
-        },
-        {
-          "label": "7",
-          "x": 18.5,
-          "y": 2.5
-        },
-        {
-          "label": "8",
-          "x": 19.5,
-          "y": 2.5
-        },
-        {
-          "label": "9",
-          "x": 20.5,
-          "y": 2.5
-        },
-        {
-          "label": "+",
-          "x": 21.5,
-          "y": 2.5,
-          "h": 2
-        },
-        {
-          "label": "Caps Lock",
-          "x": 0,
-          "y": 3.5,
-          "w": 1.5
-        },
-        {
-          "label": "A",
-          "x": 1.75,
-          "y": 3.5
-        },
-        {
-          "label": "S",
-          "x": 2.75,
-          "y": 3.5
-        },
-        {
-          "label": "D",
-          "x": 3.75,
-          "y": 3.5
-        },
-        {
-          "label": "F",
-          "x": 4.75,
-          "y": 3.5
-        },
-        {
-          "label": "G",
-          "x": 5.75,
-          "y": 3.5
-        },
-        {
-          "label": "H",
-          "x": 6.75,
-          "y": 3.5
-        },
-        {
-          "label": "J",
-          "x": 7.75,
-          "y": 3.5
-        },
-        {
-          "label": "K",
-          "x": 8.75,
-          "y": 3.5
-        },
-        {
-          "label": "L",
-          "x": 9.75,
-          "y": 3.5
-        },
-        {
-          "label": ":",
-          "x": 10.75,
-          "y": 3.5
-        },
-        {
-          "label": "\"",
-          "x": 11.75,
-          "y": 3.5
-        },
-        {
-          "label": "Enter",
-          "x": 12.75,
-          "y": 3.5,
-          "w": 2.25
-        },
-        {
-          "label": "4",
-          "x": 18.5,
-          "y": 3.5
-        },
-        {
-          "label": "5",
-          "x": 19.5,
-          "y": 3.5
-        },
-        {
-          "label": "6",
-          "x": 20.5,
-          "y": 3.5
-        },
-        {
-          "label": "Shift",
-          "x": 0,
-          "y": 4.5,
-          "w": 2.25
-        },
-        {
-          "label": "Z",
-          "x": 2.25,
-          "y": 4.5
-        },
-        {
-          "label": "X",
-          "x": 3.25,
-          "y": 4.5
-        },
-        {
-          "label": "C",
-          "x": 4.25,
-          "y": 4.5
-        },
-        {
-          "label": "V",
-          "x": 5.25,
-          "y": 4.5
-        },
-        {
-          "label": "B",
-          "x": 6.25,
-          "y": 4.5
-        },
-        {
-          "label": "N",
-          "x": 7.25,
-          "y": 4.5
-        },
-        {
-          "label": "M",
-          "x": 8.25,
-          "y": 4.5
-        },
-        {
-          "label": "<",
-          "x": 9.25,
-          "y": 4.5
-        },
-        {
-          "label": ">",
-          "x": 10.25,
-          "y": 4.5
-        },
-        {
-          "label": "?",
-          "x": 11.25,
-          "y": 4.5
-        },
-        {
-          "label": "Shift",
-          "x": 12.25,
-          "y": 4.5,
-          "w": 2.75
-        },
-        {
-          "label": "↑",
-          "x": 16.25,
-          "y": 4.5
-        },
-        {
-          "label": "1",
-          "x": 18.5,
-          "y": 4.5
-        },
-        {
-          "label": "2",
-          "x": 19.5,
-          "y": 4.5
-        },
-        {
-          "label": "3",
-          "x": 20.5,
-          "y": 4.5
-        },
-        {
-          "label": "Enter",
-          "x": 21.5,
-          "y": 4.5,
-          "h": 2
-        },
-        {
-          "label": "Ctrl",
-          "x": 0,
-          "y": 5.5,
-          "w": 1.5
-        },
-        {
-          "label": "Alt",
-          "x": 2.5,
-          "y": 5.5,
-          "w": 1.5
-        },
-        {
-          "x": 4,
-          "y": 5.5,
-          "w": 7
-        },
-        {
-          "label": "Alt",
-          "x": 11,
-          "y": 5.5,
-          "w": 1.5
-        },
-        {
-          "label": "Ctrl",
-          "x": 13.5,
-          "y": 5.5,
-          "w": 1.5
-        },
-        {
-          "label": "←",
-          "x": 15.25,
-          "y": 5.5
-        },
-        {
-          "label": "↓",
-          "x": 16.25,
-          "y": 5.5
-        },
-        {
-          "label": "→",
-          "x": 17.25,
-          "y": 5.5
-        },
-        {
-          "label": "0",
-          "x": 18.5,
-          "y": 5.5,
-          "w": 2
-        },
-        {
-          "label": ".",
-          "x": 20.5,
-          "y": 5.5
+    "debounce": 5,
+    "diode_direction": "COL2ROW",
+    "features": {
+        "bootmagic": false,
+        "command": false,
+        "console": false,
+        "extrakey": true,
+        "mousekey": false,
+        "nkro": false,
+        "sleep_led": true
+    },
+    "indicators": {
+        "caps_lock": "B8",
+        "num_lock": "B9",
+        "scroll_lock": "B7"
+    },
+    "keyboard_folder": "modelh",
+    "keymaps": {},
+    "matrix_pins": {
+        "cols": ["A10", "A9", "A8", "B15", "B14", "B13", "B12", "B11", "B10", "B1", "B0", "A7", "A6", "A5", "A4", "A3"],
+        "ghost": false,
+        "rows": ["B6", "B5", "B4", "A15", "B3", "A0", "A2", "A1"]
+    },
+    "matrix_size": {
+        "cols": 16,
+        "rows": 8
+    },
+    "mouse_key": {
+        "enabled": false
+    },
+    "parse_errors": [],
+    "parse_warnings": [],
+    "platform": "STM32",
+    "platform_key": "chibios",
+    "processor": "STM32F103",
+    "processor_type": "arm",
+    "protocol": "ChibiOS",
+    "url": "modelh.club",
+    "usb": {
+        "device_version": "1.0.0",
+        "max_power": 100,
+        "pid": "0xB155",
+        "vid": "0xFEED"
+    },
+    "layouts": {
+        "LAYOUT_fullsize_ansi_wkl": {
+            "c_macro": true,
+            "filename": "keyboards/modelh/modelh.h",
+            "json_layout": true,
+            "layout": [
+                { "label": "Esc", "matrix": [0, 2], "w": 1, "x": 0, "y": 0 },
+                { "label": "F1", "matrix": [2, 3], "w": 1, "x": 2, "y": 0 },
+                { "label": "F2", "matrix": [2, 4], "w": 1, "x": 3, "y": 0 },
+                { "label": "F3", "matrix": [1, 4], "w": 1, "x": 4, "y": 0 },
+                { "label": "F4", "matrix": [0, 4], "w": 1, "x": 5, "y": 0 },
+                { "label": "F5", "matrix": [0, 6], "w": 1, "x": 6.5, "y": 0 },
+                { "label": "F6", "matrix": [0, 8], "w": 1, "x": 7.5, "y": 0 },
+                { "label": "F7", "matrix": [1, 9], "w": 1, "x": 8.5, "y": 0 },
+                { "label": "F8", "matrix": [2, 9], "w": 1, "x": 9.5, "y": 0 },
+                { "label": "F9", "matrix": [2, 6], "w": 1, "x": 11, "y": 0 },
+                { "label": "F10", "matrix": [3, 6], "w": 1, "x": 12, "y": 0 },
+                { "label": "F11", "matrix": [3, 11], "w": 1, "x": 13, "y": 0 },
+                { "label": "F12", "matrix": [3, 12], "w": 1, "x": 14, "y": 0 },
+                { "label": "PrtSc", "matrix": [3, 15], "w": 1, "x": 15.25, "y": 0 },
+                { "label": "Scroll Lock", "matrix": [4, 15], "w": 1, "x": 16.25, "y": 0 },
+                { "label": "Pause", "matrix": [6, 14], "w": 1, "x": 17.25, "y": 0 },
+                { "label": "~", "matrix": [2, 2], "w": 1, "x": 0, "y": 1.5 },
+                { "label": "!", "matrix": [3, 2], "w": 1, "x": 1, "y": 1.5 },
+                { "label": "@", "matrix": [3, 3], "w": 1, "x": 2, "y": 1.5 },
+                { "label": "#", "matrix": [3, 4], "w": 1, "x": 3, "y": 1.5 },
+                { "label": "$", "matrix": [3, 5], "w": 1, "x": 4, "y": 1.5 },
+                { "label": "%", "matrix": [2, 5], "w": 1, "x": 5, "y": 1.5 },
+                { "label": "^", "matrix": [2, 7], "w": 1, "x": 6, "y": 1.5 },
+                { "label": "&", "matrix": [3, 7], "w": 1, "x": 7, "y": 1.5 },
+                { "label": "*", "matrix": [3, 8], "w": 1, "x": 8, "y": 1.5 },
+                { "label": "(", "matrix": [3, 9], "w": 1, "x": 9, "y": 1.5 },
+                { "label": ")", "matrix": [3, 10], "w": 1, "x": 10, "y": 1.5 },
+                { "label": "_", "matrix": [2, 10], "w": 1, "x": 11, "y": 1.5 },
+                { "label": "+", "matrix": [2, 8], "w": 1, "x": 12, "y": 1.5 },
+                { "label": "Backspace", "matrix": [1, 6], "w": 2, "x": 13, "y": 1.5 },
+                { "label": "Insert", "matrix": [2, 12], "w": 1, "x": 15.25, "y": 1.5 },
+                { "label": "Home", "matrix": [2, 14], "w": 1, "x": 16.25, "y": 1.5 },
+                { "label": "PgUp", "matrix": [2, 13], "w": 1, "x": 17.25, "y": 1.5 },
+                { "label": "Num Lock", "matrix": [6, 11], "w": 1, "x": 18.5, "y": 1.5 },
+                { "label": "/", "matrix": [6, 12], "w": 1, "x": 19.5, "y": 1.5 },
+                { "label": "*", "matrix": [6, 13], "w": 1, "x": 20.5, "y": 1.5 },
+                { "label": "-", "matrix": [7, 13], "w": 1, "x": 21.5, "y": 1.5 },
+                { "label": "Tab", "matrix": [1, 2], "w": 1.5, "x": 0, "y": 2.5 },
+                { "label": "Q", "matrix": [4, 2], "w": 1, "x": 1.5, "y": 2.5 },
+                { "label": "W", "matrix": [4, 3], "w": 1, "x": 2.5, "y": 2.5 },
+                { "label": "E", "matrix": [4, 4], "w": 1, "x": 3.5, "y": 2.5 },
+                { "label": "R", "matrix": [4, 5], "w": 1, "x": 4.5, "y": 2.5 },
+                { "label": "T", "matrix": [1, 5], "w": 1, "x": 5.5, "y": 2.5 },
+                { "label": "Y", "matrix": [1, 7], "w": 1, "x": 6.5, "y": 2.5 },
+                { "label": "U", "matrix": [4, 7], "w": 1, "x": 7.5, "y": 2.5 },
+                { "label": "I", "matrix": [4, 8], "w": 1, "x": 8.5, "y": 2.5 },
+                { "label": "O", "matrix": [4, 9], "w": 1, "x": 9.5, "y": 2.5 },
+                { "label": "P", "matrix": [4, 10], "w": 1, "x": 10.5, "y": 2.5 },
+                { "label": "{", "matrix": [1, 10], "w": 1, "x": 11.5, "y": 2.5 },
+                { "label": "}", "matrix": [1, 8], "w": 1, "x": 12.5, "y": 2.5 },
+                { "label": "|", "matrix": [5, 6], "w": 1.5, "x": 13.5, "y": 2.5 },
+                { "label": "Delete", "matrix": [2, 11], "w": 1, "x": 15.25, "y": 2.5 },
+                { "label": "End", "matrix": [3, 14], "w": 1, "x": 16.25, "y": 2.5 },
+                { "label": "PgDn", "matrix": [3, 13], "w": 1, "x": 17.25, "y": 2.5 },
+                { "label": "7", "matrix": [4, 11], "w": 1, "x": 18.5, "y": 2.5 },
+                { "label": "8", "matrix": [4, 12], "w": 1, "x": 19.5, "y": 2.5 },
+                { "label": "9", "matrix": [4, 13], "w": 1, "x": 20.5, "y": 2.5 },
+                { "h": 2, "label": "+", "matrix": [4, 14], "w": 1, "x": 21.5, "y": 2.5 },
+                { "label": "Caps Lock", "matrix": [1, 3], "w": 1.5, "x": 0, "y": 3.5 },
+                { "label": "A", "matrix": [5, 2], "w": 1, "x": 1.75, "y": 3.5 },
+                { "label": "S", "matrix": [5, 3], "w": 1, "x": 2.75, "y": 3.5 },
+                { "label": "D", "matrix": [5, 4], "w": 1, "x": 3.75, "y": 3.5 },
+                { "label": "F", "matrix": [5, 5], "w": 1, "x": 4.75, "y": 3.5 },
+                { "label": "G", "matrix": [0, 5], "w": 1, "x": 5.75, "y": 3.5 },
+                { "label": "H", "matrix": [0, 7], "w": 1, "x": 6.75, "y": 3.5 },
+                { "label": "J", "matrix": [5, 7], "w": 1, "x": 7.75, "y": 3.5 },
+                { "label": "K", "matrix": [5, 8], "w": 1, "x": 8.75, "y": 3.5 },
+                { "label": "L", "matrix": [5, 9], "w": 1, "x": 9.75, "y": 3.5 },
+                { "label": ":", "matrix": [5, 10], "w": 1, "x": 10.75, "y": 3.5 },
+                { "label": "\"", "matrix": [0, 10], "w": 1, "x": 11.75, "y": 3.5 },
+                { "label": "Enter", "matrix": [6, 6], "w": 2.25, "x": 12.75, "y": 3.5 },
+                { "label": "4", "matrix": [1, 11], "w": 1, "x": 18.5, "y": 3.5 },
+                { "label": "5", "matrix": [1, 12], "w": 1, "x": 19.5, "y": 3.5 },
+                { "label": "6", "matrix": [1, 13], "w": 1, "x": 20.5, "y": 3.5 },
+                { "label": "Shift", "matrix": [1, 1], "w": 2.25, "x": 0, "y": 4.5 },
+                { "label": "Z", "matrix": [6, 2], "w": 1, "x": 2.25, "y": 4.5 },
+                { "label": "X", "matrix": [6, 3], "w": 1, "x": 3.25, "y": 4.5 },
+                { "label": "C", "matrix": [6, 4], "w": 1, "x": 4.25, "y": 4.5 },
+                { "label": "V", "matrix": [6, 5], "w": 1, "x": 5.25, "y": 4.5 },
+                { "label": "B", "matrix": [7, 5], "w": 1, "x": 6.25, "y": 4.5 },
+                { "label": "N", "matrix": [7, 7], "w": 1, "x": 7.25, "y": 4.5 },
+                { "label": "M", "matrix": [6, 7], "w": 1, "x": 8.25, "y": 4.5 },
+                { "label": "<", "matrix": [6, 8], "w": 1, "x": 9.25, "y": 4.5 },
+                { "label": ">", "matrix": [6, 9], "w": 1, "x": 10.25, "y": 4.5 },
+                { "label": "?", "matrix": [7, 10], "w": 1, "x": 11.25, "y": 4.5 },
+                { "label": "Shift", "matrix": [6, 1], "w": 2.75, "x": 12.25, "y": 4.5 },
+                { "label": "\u2191", "matrix": [0, 14], "w": 1, "x": 16.25, "y": 4.5 },
+                { "label": "1", "matrix": [5, 11], "w": 1, "x": 18.5, "y": 4.5 },
+                { "label": "2", "matrix": [5, 12], "w": 1, "x": 19.5, "y": 4.5 },
+                { "label": "3", "matrix": [5, 13], "w": 1, "x": 20.5, "y": 4.5 },
+                { "h": 2, "label": "Enter", "matrix": [5, 14], "w": 1, "x": 21.5, "y": 4.5 },
+                { "label": "Ctrl", "matrix": [2, 0], "w": 1.5, "x": 0, "y": 5.5 },
+                { "label": "Alt", "matrix": [0, 15], "w": 1.5, "x": 2.5, "y": 5.5 },
+                { "label": "K0C", "matrix": [7, 6], "w": 7, "x": 4, "y": 5.5 },
+                { "label": "Alt", "matrix": [7, 15], "w": 1.5, "x": 11, "y": 5.5 },
+                { "label": "Ctrl", "matrix": [6, 0], "w": 1.5, "x": 13.5, "y": 5.5 },
+                { "label": "\u2190", "matrix": [7, 14], "w": 1, "x": 15.25, "y": 5.5 },
+                { "label": "\u2193", "matrix": [7, 11], "w": 1, "x": 16.25, "y": 5.5 },
+                { "label": "\u2192", "matrix": [7, 12], "w": 1, "x": 17.25, "y": 5.5 },
+                { "label": "0", "matrix": [0, 12], "w": 2, "x": 18.5, "y": 5.5 },
+                { "label": ".", "matrix": [0, 13], "w": 1, "x": 20.5, "y": 5.5 }
+            ]
+        },
+        "LAYOUT_fullsize_iso_wkl": {
+            "c_macro": true,
+            "filename": "keyboards/modelh/modelh.h",
+            "json_layout": true,
+            "layout": [
+                { "label": "Esc", "matrix": [0, 2], "w": 1, "x": 0, "y": 0 },
+                { "label": "F1", "matrix": [2, 3], "w": 1, "x": 2, "y": 0 },
+                { "label": "F2", "matrix": [2, 4], "w": 1, "x": 3, "y": 0 },
+                { "label": "F3", "matrix": [1, 4], "w": 1, "x": 4, "y": 0 },
+                { "label": "F4", "matrix": [0, 4], "w": 1, "x": 5, "y": 0 },
+                { "label": "F5", "matrix": [0, 6], "w": 1, "x": 6.5, "y": 0 },
+                { "label": "F6", "matrix": [0, 8], "w": 1, "x": 7.5, "y": 0 },
+                { "label": "F7", "matrix": [1, 9], "w": 1, "x": 8.5, "y": 0 },
+                { "label": "F8", "matrix": [2, 9], "w": 1, "x": 9.5, "y": 0 },
+                { "label": "F9", "matrix": [2, 6], "w": 1, "x": 11, "y": 0 },
+                { "label": "F10", "matrix": [3, 6], "w": 1, "x": 12, "y": 0 },
+                { "label": "F11", "matrix": [3, 11], "w": 1, "x": 13, "y": 0 },
+                { "label": "F12", "matrix": [3, 12], "w": 1, "x": 14, "y": 0 },
+                { "label": "PrtSc", "matrix": [3, 15], "w": 1, "x": 15.25, "y": 0 },
+                { "label": "Scroll Lock", "matrix": [4, 15], "w": 1, "x": 16.25, "y": 0 },
+                { "label": "Pause", "matrix": [6, 14], "w": 1, "x": 17.25, "y": 0 },
+                { "label": "~", "matrix": [2, 2], "w": 1, "x": 0, "y": 1.5 },
+                { "label": "!", "matrix": [3, 2], "w": 1, "x": 1, "y": 1.5 },
+                { "label": "@", "matrix": [3, 3], "w": 1, "x": 2, "y": 1.5 },
+                { "label": "#", "matrix": [3, 4], "w": 1, "x": 3, "y": 1.5 },
+                { "label": "$", "matrix": [3, 5], "w": 1, "x": 4, "y": 1.5 },
+                { "label": "%", "matrix": [2, 5], "w": 1, "x": 5, "y": 1.5 },
+                { "label": "^", "matrix": [2, 7], "w": 1, "x": 6, "y": 1.5 },
+                { "label": "&", "matrix": [3, 7], "w": 1, "x": 7, "y": 1.5 },
+                { "label": "*", "matrix": [3, 8], "w": 1, "x": 8, "y": 1.5 },
+                { "label": "(", "matrix": [3, 9], "w": 1, "x": 9, "y": 1.5 },
+                { "label": ")", "matrix": [3, 10], "w": 1, "x": 10, "y": 1.5 },
+                { "label": "_", "matrix": [2, 10], "w": 1, "x": 11, "y": 1.5 },
+                { "label": "+", "matrix": [2, 8], "w": 1, "x": 12, "y": 1.5 },
+                { "label": "Backspace", "matrix": [1, 6], "w": 2, "x": 13, "y": 1.5 },
+                { "label": "Insert", "matrix": [2, 12], "w": 1, "x": 15.25, "y": 1.5 },
+                { "label": "Home", "matrix": [2, 14], "w": 1, "x": 16.25, "y": 1.5 },
+                { "label": "PgUp", "matrix": [2, 13], "w": 1, "x": 17.25, "y": 1.5 },
+                { "label": "Num Lock", "matrix": [6, 11], "w": 1, "x": 18.5, "y": 1.5 },
+                { "label": "/", "matrix": [6, 12], "w": 1, "x": 19.5, "y": 1.5 },
+                { "label": "*", "matrix": [6, 13], "w": 1, "x": 20.5, "y": 1.5 },
+                { "label": "-", "matrix": [7, 13], "w": 1, "x": 21.5, "y": 1.5 },
+                { "label": "Tab", "matrix": [1, 2], "w": 1.5, "x": 0, "y": 2.5 },
+                { "label": "Q", "matrix": [4, 2], "w": 1, "x": 1.5, "y": 2.5 },
+                { "label": "W", "matrix": [4, 3], "w": 1, "x": 2.5, "y": 2.5 },
+                { "label": "E", "matrix": [4, 4], "w": 1, "x": 3.5, "y": 2.5 },
+                { "label": "R", "matrix": [4, 5], "w": 1, "x": 4.5, "y": 2.5 },
+                { "label": "T", "matrix": [1, 5], "w": 1, "x": 5.5, "y": 2.5 },
+                { "label": "Y", "matrix": [1, 7], "w": 1, "x": 6.5, "y": 2.5 },
+                { "label": "U", "matrix": [4, 7], "w": 1, "x": 7.5, "y": 2.5 },
+                { "label": "I", "matrix": [4, 8], "w": 1, "x": 8.5, "y": 2.5 },
+                { "label": "O", "matrix": [4, 9], "w": 1, "x": 9.5, "y": 2.5 },
+                { "label": "P", "matrix": [4, 10], "w": 1, "x": 10.5, "y": 2.5 },
+                { "label": "{", "matrix": [1, 10], "w": 1, "x": 11.5, "y": 2.5 },
+                { "label": "}", "matrix": [1, 8], "w": 1, "x": 12.5, "y": 2.5 },
+                { "label": "Delete", "matrix": [2, 11], "w": 1, "x": 15.25, "y": 2.5 },
+                { "label": "End", "matrix": [3, 14], "w": 1, "x": 16.25, "y": 2.5 },
+                { "label": "PgDn", "matrix": [3, 13], "w": 1, "x": 17.25, "y": 2.5 },
+                { "label": "7", "matrix": [4, 11], "w": 1, "x": 18.5, "y": 2.5 },
+                { "label": "8", "matrix": [4, 12], "w": 1, "x": 19.5, "y": 2.5 },
+                { "label": "9", "matrix": [4, 13], "w": 1, "x": 20.5, "y": 2.5 },
+                { "h": 2, "label": "+", "matrix": [4, 14], "w": 1, "x": 21.5, "y": 2.5 },
+                { "label": "Caps Lock", "matrix": [1, 3], "w": 1.5, "x": 0, "y": 3.5 },
+                { "label": "A", "matrix": [5, 2], "w": 1, "x": 1.75, "y": 3.5 },
+                { "label": "S", "matrix": [5, 3], "w": 1, "x": 2.75, "y": 3.5 },
+                { "label": "D", "matrix": [5, 4], "w": 1, "x": 3.75, "y": 3.5 },
+                { "label": "F", "matrix": [5, 5], "w": 1, "x": 4.75, "y": 3.5 },
+                { "label": "G", "matrix": [0, 5], "w": 1, "x": 5.75, "y": 3.5 },
+                { "label": "H", "matrix": [0, 7], "w": 1, "x": 6.75, "y": 3.5 },
+                { "label": "J", "matrix": [5, 7], "w": 1, "x": 7.75, "y": 3.5 },
+                { "label": "K", "matrix": [5, 8], "w": 1, "x": 8.75, "y": 3.5 },
+                { "label": "L", "matrix": [5, 9], "w": 1, "x": 9.75, "y": 3.5 },
+                { "label": ":", "matrix": [5, 10], "w": 1, "x": 10.75, "y": 3.5 },
+                { "label": "\"", "matrix": [0, 10], "w": 1, "x": 11.75, "y": 3.5 },
+                { "label": "~", "matrix": [6, 10], "w": 1, "x": 12.75, "y": 3.5 },
+                { "h": 2, "label": "Enter", "matrix": [6, 6], "w": 1.25, "x": 13.75, "y": 2.5 },
+                { "label": "4", "matrix": [1, 11], "w": 1, "x": 18.5, "y": 3.5 },
+                { "label": "5", "matrix": [1, 12], "w": 1, "x": 19.5, "y": 3.5 },
+                { "label": "6", "matrix": [1, 13], "w": 1, "x": 20.5, "y": 3.5 },
+                { "label": "Shift", "matrix": [1, 1], "w": 1.25, "x": 0, "y": 4.5 },
+                { "label": "|", "matrix": [0, 3], "w": 1, "x": 1.25, "y": 4.5 },
+                { "label": "Z", "matrix": [6, 2], "w": 1, "x": 2.25, "y": 4.5 },
+                { "label": "X", "matrix": [6, 3], "w": 1, "x": 3.25, "y": 4.5 },
+                { "label": "C", "matrix": [6, 4], "w": 1, "x": 4.25, "y": 4.5 },
+                { "label": "V", "matrix": [6, 5], "w": 1, "x": 5.25, "y": 4.5 },
+                { "label": "B", "matrix": [7, 5], "w": 1, "x": 6.25, "y": 4.5 },
+                { "label": "N", "matrix": [7, 7], "w": 1, "x": 7.25, "y": 4.5 },
+                { "label": "M", "matrix": [6, 7], "w": 1, "x": 8.25, "y": 4.5 },
+                { "label": "<", "matrix": [6, 8], "w": 1, "x": 9.25, "y": 4.5 },
+                { "label": ">", "matrix": [6, 9], "w": 1, "x": 10.25, "y": 4.5 },
+                { "label": "?", "matrix": [7, 10], "w": 1, "x": 11.25, "y": 4.5 },
+                { "label": "Shift", "matrix": [6, 1], "w": 2.75, "x": 12.25, "y": 4.5 },
+                { "label": "\u2191", "matrix": [0, 14], "w": 1, "x": 16.25, "y": 4.5 },
+                { "label": "1", "matrix": [5, 11], "w": 1, "x": 18.5, "y": 4.5 },
+                { "label": "2", "matrix": [5, 12], "w": 1, "x": 19.5, "y": 4.5 },
+                { "label": "3", "matrix": [5, 13], "w": 1, "x": 20.5, "y": 4.5 },
+                { "h": 2, "label": "Enter", "matrix": [5, 14], "w": 1, "x": 21.5, "y": 4.5 },
+                { "label": "Ctrl", "matrix": [2, 0], "w": 1.5, "x": 0, "y": 5.5 },
+                { "label": "Alt", "matrix": [0, 15], "w": 1.5, "x": 2.5, "y": 5.5 },
+                { "label": "K0C", "matrix": [7, 6], "w": 7, "x": 4, "y": 5.5 },
+                { "label": "Alt", "matrix": [7, 15], "w": 1.5, "x": 11, "y": 5.5 },
+                { "label": "Ctrl", "matrix": [6, 0], "w": 1.5, "x": 13.5, "y": 5.5 },
+                { "label": "\u2190", "matrix": [7, 14], "w": 1, "x": 15.25, "y": 5.5 },
+                { "label": "\u2193", "matrix": [7, 11], "w": 1, "x": 16.25, "y": 5.5 },
+                { "label": "\u2192", "matrix": [7, 12], "w": 1, "x": 17.25, "y": 5.5 },
+                { "label": "0", "matrix": [0, 12], "w": 2, "x": 18.5, "y": 5.5 },
+                { "label": ".", "matrix": [0, 13], "w": 1, "x": 20.5, "y": 5.5 }
+            ]
         }
-      ]
     }
-  }
 }
diff --git a/keyboards/modelh/keymaps/default/keymap.c b/keyboards/modelh/keymaps/default/keymap.c
index 89f899faad40..9098b869b302 100644
--- a/keyboards/modelh/keymaps/default/keymap.c
+++ b/keyboards/modelh/keymaps/default/keymap.c
@@ -25,7 +25,3 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
     KC_LCTL,          KC_LALT,                           KC_SPC,                                      KC_RALT,          KC_RCTL,   KC_LEFT, KC_DOWN, KC_RGHT,   KC_P0,            KC_PDOT
   ),
 };
-
-bool process_record_user(uint16_t keycode, keyrecord_t *record) {
-    return true;
-}
diff --git a/keyboards/modelh/mcuconf.h b/keyboards/modelh/mcuconf.h
index a645d3c5d5cf..7d3d6e143a44 100644
--- a/keyboards/modelh/mcuconf.h
+++ b/keyboards/modelh/mcuconf.h
@@ -1,209 +1,25 @@
-/*
-    ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio
-
-    Licensed under the Apache License, Version 2.0 (the "License");
-    you may not use this file except in compliance with the License.
-    You may obtain a copy of the License at
-
-        http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
-*/
-
-#ifndef _MCUCONF_H_
-#define _MCUCONF_H_
-
-#define STM32F103_MCUCONF
-
-/*
- * STM32F103 drivers configuration.
- * The following settings override the default settings present in
- * the various device driver implementation headers.
- * Note that the settings for each driver only have effect if the whole
- * driver is enabled in halconf.h.
+/* Copyright 2020 QMK
  *
- * IRQ priorities:
- * 15...0       Lowest...Highest.
+ * 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.
  *
- * DMA priorities:
- * 0...3        Lowest...Highest.
- */
-
-/*
- * HAL driver system settings.
- */
-#define STM32_NO_INIT                       FALSE
-#define STM32_HSI_ENABLED                   TRUE
-#define STM32_LSI_ENABLED                   FALSE
-#define STM32_HSE_ENABLED                   TRUE
-#define STM32_LSE_ENABLED                   FALSE
-#define STM32_SW                            STM32_SW_PLL
-#define STM32_PLLSRC                        STM32_PLLSRC_HSE
-#define STM32_PLLXTPRE                      STM32_PLLXTPRE_DIV1
-#define STM32_PLLMUL_VALUE                  9
-#define STM32_HPRE                          STM32_HPRE_DIV1
-#define STM32_PPRE1                         STM32_PPRE1_DIV2
-#define STM32_PPRE2                         STM32_PPRE2_DIV2
-#define STM32_ADCPRE                        STM32_ADCPRE_DIV4
-#define STM32_USB_CLOCK_REQUIRED            TRUE
-#define STM32_USBPRE                        STM32_USBPRE_DIV1P5
-#define STM32_MCOSEL                        STM32_MCOSEL_NOCLOCK
-#define STM32_RTCSEL                        STM32_RTCSEL_HSEDIV
-#define STM32_PVD_ENABLE                    FALSE
-#define STM32_PLS                           STM32_PLS_LEV0
-
-/*
- * ADC driver system settings.
- */
-#define STM32_ADC_USE_ADC1                  FALSE
-#define STM32_ADC_ADC1_DMA_PRIORITY         2
-#define STM32_ADC_ADC1_IRQ_PRIORITY         6
-
-/*
- * CAN driver system settings.
- */
-#define STM32_CAN_USE_CAN1                  FALSE
-#define STM32_CAN_CAN1_IRQ_PRIORITY         11
-
-/*
- * EXT driver system settings.
+ * 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/>.
  */
-#define STM32_EXT_EXTI0_IRQ_PRIORITY        6
-#define STM32_EXT_EXTI1_IRQ_PRIORITY        6
-#define STM32_EXT_EXTI2_IRQ_PRIORITY        6
-#define STM32_EXT_EXTI3_IRQ_PRIORITY        6
-#define STM32_EXT_EXTI4_IRQ_PRIORITY        6
-#define STM32_EXT_EXTI5_9_IRQ_PRIORITY      6
-#define STM32_EXT_EXTI10_15_IRQ_PRIORITY    6
-#define STM32_EXT_EXTI16_IRQ_PRIORITY       6
-#define STM32_EXT_EXTI17_IRQ_PRIORITY       6
-#define STM32_EXT_EXTI18_IRQ_PRIORITY       6
-#define STM32_EXT_EXTI19_IRQ_PRIORITY       6
 
-/*
- * GPT driver system settings.
- */
-#define STM32_GPT_USE_TIM1                  FALSE
-#define STM32_GPT_USE_TIM2                  FALSE
-#define STM32_GPT_USE_TIM3                  FALSE
-#define STM32_GPT_USE_TIM4                  FALSE
-#define STM32_GPT_USE_TIM5                  FALSE
-#define STM32_GPT_USE_TIM8                  FALSE
-#define STM32_GPT_TIM1_IRQ_PRIORITY         7
-#define STM32_GPT_TIM2_IRQ_PRIORITY         7
-#define STM32_GPT_TIM3_IRQ_PRIORITY         7
-#define STM32_GPT_TIM4_IRQ_PRIORITY         7
-#define STM32_GPT_TIM5_IRQ_PRIORITY         7
-#define STM32_GPT_TIM8_IRQ_PRIORITY         7
+#pragma once
 
-/*
- * I2C driver system settings.
- */
-#define STM32_I2C_USE_I2C1                  FALSE
-#define STM32_I2C_USE_I2C2                  FALSE
-#define STM32_I2C_BUSY_TIMEOUT              50
-#define STM32_I2C_I2C1_IRQ_PRIORITY         5
-#define STM32_I2C_I2C2_IRQ_PRIORITY         5
-#define STM32_I2C_I2C1_DMA_PRIORITY         3
-#define STM32_I2C_I2C2_DMA_PRIORITY         3
-#define STM32_I2C_DMA_ERROR_HOOK(i2cp)      osalSysHalt("DMA failure")
+#include_next <mcuconf.h>
 
-/*
- * ICU driver system settings.
- */
-#define STM32_ICU_USE_TIM1                  FALSE
-#define STM32_ICU_USE_TIM2                  FALSE
-#define STM32_ICU_USE_TIM3                  FALSE
-#define STM32_ICU_USE_TIM4                  FALSE
-#define STM32_ICU_USE_TIM5                  FALSE
-#define STM32_ICU_USE_TIM8                  FALSE
-#define STM32_ICU_TIM1_IRQ_PRIORITY         7
-#define STM32_ICU_TIM2_IRQ_PRIORITY         7
-#define STM32_ICU_TIM3_IRQ_PRIORITY         7
-#define STM32_ICU_TIM4_IRQ_PRIORITY         7
-#define STM32_ICU_TIM5_IRQ_PRIORITY         7
-#define STM32_ICU_TIM8_IRQ_PRIORITY         7
+#undef STM32_PWM_USE_TIM2
+#undef STM32_SPI_USE_SPI2
 
-/*
- * PWM driver system settings.
- */
-#define STM32_PWM_USE_ADVANCED              FALSE
-#define STM32_PWM_USE_TIM1                  FALSE
 #define STM32_PWM_USE_TIM2                  TRUE
-#define STM32_PWM_USE_TIM3                  FALSE
-#define STM32_PWM_USE_TIM4                  FALSE
-#define STM32_PWM_USE_TIM5                  FALSE
-#define STM32_PWM_USE_TIM8                  FALSE
-#define STM32_PWM_TIM1_IRQ_PRIORITY         7
-#define STM32_PWM_TIM2_IRQ_PRIORITY         7
-#define STM32_PWM_TIM3_IRQ_PRIORITY         7
-#define STM32_PWM_TIM4_IRQ_PRIORITY         7
-#define STM32_PWM_TIM5_IRQ_PRIORITY         7
-#define STM32_PWM_TIM8_IRQ_PRIORITY         7
-
-/*
- * RTC driver system settings.
- */
-#define STM32_RTC_IRQ_PRIORITY              15
-
-/*
- * SERIAL driver system settings.
- */
-#define STM32_SERIAL_USE_USART1             FALSE
-#define STM32_SERIAL_USE_USART2             FALSE
-#define STM32_SERIAL_USE_USART3             FALSE
-#define STM32_SERIAL_USE_UART4              FALSE
-#define STM32_SERIAL_USE_UART5              FALSE
-#define STM32_SERIAL_USART1_PRIORITY        12
-#define STM32_SERIAL_USART2_PRIORITY        12
-#define STM32_SERIAL_USART3_PRIORITY        12
-#define STM32_SERIAL_UART4_PRIORITY         12
-#define STM32_SERIAL_UART5_PRIORITY         12
-
-/*
- * SPI driver system settings.
- */
-#define STM32_SPI_USE_SPI1                  FALSE
 #define STM32_SPI_USE_SPI2                  FALSE
-#define STM32_SPI_USE_SPI3                  FALSE
-#define STM32_SPI_SPI1_DMA_PRIORITY         1
-#define STM32_SPI_SPI2_DMA_PRIORITY         1
-#define STM32_SPI_SPI3_DMA_PRIORITY         1
-#define STM32_SPI_SPI1_IRQ_PRIORITY         10
-#define STM32_SPI_SPI2_IRQ_PRIORITY         10
-#define STM32_SPI_SPI3_IRQ_PRIORITY         10
-#define STM32_SPI_DMA_ERROR_HOOK(spip)      osalSysHalt("DMA failure")
-
-/*
- * ST driver system settings.
- */
-#define STM32_ST_IRQ_PRIORITY               8
-#define STM32_ST_USE_TIMER                  2
-
-/*
- * UART driver system settings.
- */
-#define STM32_UART_USE_USART1               FALSE
-#define STM32_UART_USE_USART2               FALSE
-#define STM32_UART_USE_USART3               FALSE
-#define STM32_UART_USART1_IRQ_PRIORITY      12
-#define STM32_UART_USART2_IRQ_PRIORITY      12
-#define STM32_UART_USART3_IRQ_PRIORITY      12
-#define STM32_UART_USART1_DMA_PRIORITY      0
-#define STM32_UART_USART2_DMA_PRIORITY      0
-#define STM32_UART_USART3_DMA_PRIORITY      0
-#define STM32_UART_DMA_ERROR_HOOK(uartp)    osalSysHalt("DMA failure")
-
-/*
- * USB driver system settings.
- */
-#define STM32_USB_USE_USB1                  TRUE
-#define STM32_USB_LOW_POWER_ON_SUSPEND      FALSE
-#define STM32_USB_USB1_HP_IRQ_PRIORITY      13
-#define STM32_USB_USB1_LP_IRQ_PRIORITY      14
-
-#endif /* _MCUCONF_H_ */
diff --git a/keyboards/modelh/modelh.c b/keyboards/modelh/modelh.c
index 3e8e7b0e03de..4b909c5f0c3e 100644
--- a/keyboards/modelh/modelh.c
+++ b/keyboards/modelh/modelh.c
@@ -16,33 +16,10 @@
 
 #include "modelh.h"
 
-#ifdef MODELH_LED_PINS
-static const pin_t led_pins[3] = MODELH_LED_PINS;
-
-bool led_update_kb(led_t led_state) {
-    bool res = led_update_user(led_state);
-    if(res) {
-        writePin(led_pins[0], !led_state.num_lock);
-        writePin(led_pins[1], !led_state.caps_lock);
-        writePin(led_pins[2], !led_state.scroll_lock);
-    }
-    return res;
-}
-
-void led_init_ports() {
-    setPinOutput(led_pins[0]);
-    setPinOutput(led_pins[1]);
-    setPinOutput(led_pins[2]);
-}
-
-#else
-void led_init_ports() { }
-#endif
 
 void keyboard_pre_init_kb(void) {
     setPinOutput(MODELH_STATUS_LED);
     writePin(MODELH_STATUS_LED, 0);
 
-    led_init_ports();
     keyboard_pre_init_user();
 }
diff --git a/keyboards/modelh/modelh.h b/keyboards/modelh/modelh.h
index d8dc4edfc8e4..4a72074c0ed5 100644
--- a/keyboards/modelh/modelh.h
+++ b/keyboards/modelh/modelh.h
@@ -17,54 +17,3 @@
 #pragma once
 
 #include "quantum.h"
-
-/* This is a shortcut to help you visually see your layout.
- *
- * The first section contains all of the arguments representing the physical
- * layout of the board and position of the keys.
- *
- * The second converts the arguments into a two-dimensional array which
- * represents the switch matrix.
- */
-
-#define LAYOUT_fullsize_ansi_wkl( \
-    K5A,      K5B, K5C, K5D, K5E, K5F, K5G, K5H, K5I, K5J, K5K, K5L, K5M,   K5N, K5O, K5P, \
-    \
-    K4A, K4B, K4C, K4D, K4E, K4F, K4G, K4H, K4I, K4J, K4K, K4L, K4M, K4N,   K4O, K4P, K4Q,   K4R, K4S, K4T, K4U, \
-    K3A, K3B, K3C, K3D, K3E, K3F, K3G, K3H, K3I, K3J, K3K, K3L, K3M, K3N,   K3O, K3P, K3Q,   K3R, K3S, K3T, K3U, \
-    K2A, K2B, K2C, K2D, K2E, K2F, K2G, K2H, K2I, K2J, K2K, K2L,      K2N,                    K2O, K2P, K2Q, \
-    K1A,      K1C, K1D, K1E, K1F, K1G, K1H, K1I, K1J, K1K, K1L,      K1M,        K1N,        K1O, K1P, K1Q, K1R, \
-    K0A,      K0B,                K0C,                     K0D,      K0E,   K0F, K0G, K0H,   K0I,      K0J \
-) \
-{ \
-/* 00 */ { KC_NO, KC_NO, K5A,   KC_NO, K5E,   K2F, K5F,   K2G, K5G,   KC_NO, K2L,   KC_NO, K0I, K0J, K1N,   K0B   }, \
-/* 01 */ { KC_NO, K1A,   K3A,   K2A,   K5D,   K3F, K4N,   K3G, K3M,   K5H,   K3L,   K2O,   K2P, K2Q, KC_NO, KC_NO }, \
-/* 02 */ { K0A,   KC_NO, K4A,   K5B,   K5C,   K4F, K5J,   K4G, K4M,   K5I,   K4L,   K3O,   K4O, K4Q, K4P,   KC_NO }, \
-/* 03 */ { KC_NO, KC_NO, K4B,   K4C,   K4D,   K4E, K5K,   K4H, K4I,   K4J,   K4K,   K5L,   K5M, K3Q, K3P,   K5N   }, \
-/* 04 */ { KC_NO, KC_NO, K3B,   K3C,   K3D,   K3E, KC_NO, K3H, K3I,   K3J,   K3K,   K3R,   K3S, K3T, K3U,   K5O   }, \
-/* 05 */ { KC_NO, KC_NO, K2B,   K2C,   K2D,   K2E, K3N,   K2H, K2I,   K2J,   K2K,   K1O,   K1P, K1Q, K1R,   KC_NO }, \
-/* 06 */ { K0E,   K1M,   K1C,   K1D,   K1E,   K1F, K2N,   K1I, K1J,   K1K,   KC_NO, K4R,   K4S, K4T, K5P,   KC_NO }, \
-/* 07 */ { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, K1G, K0C,   K1H, KC_NO, KC_NO, K1L,   K0G,   K0H, K4U, K0F,   K0D   }, \
-}
-/*         0      1      2      3      4      5      6      7      8      9      A      B      C    D    E      F       */
-
-
-#define LAYOUT_fullsize_iso_wkl( \
-    K5A,      K5B, K5C, K5D, K5E, K5F, K5G, K5H, K5I, K5J, K5K, K5L, K5M,   K5N, K5O, K5P, \
-    \
-    K4A, K4B, K4C, K4D, K4E, K4F, K4G, K4H, K4I, K4J, K4K, K4L, K4M, K4N,   K4O, K4P, K4Q,   K4R, K4S, K4T, K4U, \
-    K3A, K3B, K3C, K3D, K3E, K3F, K3G, K3H, K3I, K3J, K3K, K3L, K3M,        K3O, K3P, K3Q,   K3R, K3S, K3T, K3U, \
-    K2A, K2B, K2C, K2D, K2E, K2F, K2G, K2H, K2I, K2J, K2K, K2L, K2M, K2N,                    K2O, K2P, K2Q, \
-    K1A, K1B, K1C, K1D, K1E, K1F, K1G, K1H, K1I, K1J, K1K, K1L,      K1M,        K1N,        K1O, K1P, K1Q, K1R, \
-    K0A,      K0B,                K0C,                     K0D,      K0E,   K0F, K0G, K0H,   K0I,      K0J \
-) \
-{ \
-    { KC_NO, KC_NO, K5A,   K1B,   K5E,   K2F, K5F,   K2G, K5G,   KC_NO, K2L,   KC_NO, K0I, K0J, K1N,   K0B   }, \
-    { KC_NO, K1A,   K3A,   K2A,   K5D,   K3F, K4N,   K3G, K3M,   K5H,   K3L,   K2O,   K2P, K2Q, KC_NO, KC_NO }, \
-    { K0A,   KC_NO, K4A,   K5B,   K5C,   K4F, K5J,   K4G, K4M,   K5I,   K4L,   K3O,   K4O, K4Q, K4P,   KC_NO }, \
-    { KC_NO, KC_NO, K4B,   K4C,   K4D,   K4E, K5K,   K4H, K4I,   K4J,   K4K,   K5L,   K5M, K3Q, K3P,   K5N   }, \
-    { KC_NO, KC_NO, K3B,   K3C,   K3D,   K3E, KC_NO, K3H, K3I,   K3J,   K3K,   K3R,   K3S, K3T, K3U,   K5O   }, \
-    { KC_NO, KC_NO, K2B,   K2C,   K2D,   K2E, KC_NO, K2H, K2I,   K2J,   K2K,   K1O,   K1P, K1Q, K1R,   KC_NO }, \
-    { K0E,   K1M,   K1C,   K1D,   K1E,   K1F, K2N,   K1I, K1J,   K1K,   K2M,   K4R,   K4S, K4T, K5P,   KC_NO }, \
-    { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, K1G, K0C,   K1H, KC_NO, KC_NO, K1L,   K0G,   K0H, K4U, K0F,   K0D   }  \
-}
diff --git a/keyboards/modelh/rules.mk b/keyboards/modelh/rules.mk
index 9a4c49510b32..f18e83e076f7 100644
--- a/keyboards/modelh/rules.mk
+++ b/keyboards/modelh/rules.mk
@@ -6,11 +6,4 @@ BOOTLOADER = stm32duino
 # Enter lower-power sleep mode when on the ChibiOS idle thread
 OPT_DEFS += -DCORTEX_ENABLE_WFI_IDLE=TRUE
 
-BOOTMAGIC_ENABLE = no	# Virtual DIP switch configuration
-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 = yes  # Breathing sleep LED during USB suspend
-NKRO_ENABLE = no	# USB Nkey Rollover
 CUSTOM_MATRIX = no 	# Custom matrix file
-MOUSEKEY_ENABLE = no

From de8fddc2ed31c17bd0f1d8d3726e7733ab32427d Mon Sep 17 00:00:00 2001
From: Jerome Berclaz <jerome.berclaz@a3.epfl.ch>
Date: Thu, 4 May 2023 07:44:11 -0700
Subject: [PATCH 07/16] Additional reviewer's comments

---
 keyboards/modelh/config.h                  |  8 -------
 keyboards/modelh/info.json                 | 26 ----------------------
 keyboards/modelh/keymaps/default/readme.md |  1 -
 keyboards/modelh/modelh.c                  |  2 +-
 keyboards/modelh/modelh.h                  | 19 ----------------
 keyboards/modelh/rules.mk                  |  7 ------
 6 files changed, 1 insertion(+), 62 deletions(-)
 delete mode 100644 keyboards/modelh/keymaps/default/readme.md
 delete mode 100644 keyboards/modelh/modelh.h

diff --git a/keyboards/modelh/config.h b/keyboards/modelh/config.h
index 20d8461c4ee8..ac95ccfe662f 100644
--- a/keyboards/modelh/config.h
+++ b/keyboards/modelh/config.h
@@ -22,10 +22,6 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 #define MODELH_STATUS_LED C13
 
-
-/* define if matrix has ghost (lacks anti-ghosting diodes) */
-#define MATRIX_HAS_GHOST
-
 /* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
 #define LOCKING_SUPPORT_ENABLE
 /* Locking resynchronize hack */
@@ -47,7 +43,3 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 //#define NO_ACTION_LAYER
 //#define NO_ACTION_TAPPING
 //#define NO_ACTION_ONESHOT
-
-/* disable these deprecated features by default */
-//#define NO_ACTION_MACRO
-//#define NO_ACTION_FUNCTION
diff --git a/keyboards/modelh/info.json b/keyboards/modelh/info.json
index 86e8bea4188c..225d9c35c91c 100644
--- a/keyboards/modelh/info.json
+++ b/keyboards/modelh/info.json
@@ -2,12 +2,7 @@
     "manufacturer": "IBM",
     "keyboard_name": "Model M",
     "maintainer": "jhawthorn",
-    "board": "STM32_F103_STM32DUINO",
     "bootloader": "stm32duino",
-    "bootmagic": {
-        "enabled": false
-    },
-    "debounce": 5,
     "diode_direction": "COL2ROW",
     "features": {
         "bootmagic": false,
@@ -23,27 +18,12 @@
         "num_lock": "B9",
         "scroll_lock": "B7"
     },
-    "keyboard_folder": "modelh",
-    "keymaps": {},
     "matrix_pins": {
         "cols": ["A10", "A9", "A8", "B15", "B14", "B13", "B12", "B11", "B10", "B1", "B0", "A7", "A6", "A5", "A4", "A3"],
         "ghost": false,
         "rows": ["B6", "B5", "B4", "A15", "B3", "A0", "A2", "A1"]
     },
-    "matrix_size": {
-        "cols": 16,
-        "rows": 8
-    },
-    "mouse_key": {
-        "enabled": false
-    },
-    "parse_errors": [],
-    "parse_warnings": [],
-    "platform": "STM32",
-    "platform_key": "chibios",
     "processor": "STM32F103",
-    "processor_type": "arm",
-    "protocol": "ChibiOS",
     "url": "modelh.club",
     "usb": {
         "device_version": "1.0.0",
@@ -53,9 +33,6 @@
     },
     "layouts": {
         "LAYOUT_fullsize_ansi_wkl": {
-            "c_macro": true,
-            "filename": "keyboards/modelh/modelh.h",
-            "json_layout": true,
             "layout": [
                 { "label": "Esc", "matrix": [0, 2], "w": 1, "x": 0, "y": 0 },
                 { "label": "F1", "matrix": [2, 3], "w": 1, "x": 2, "y": 0 },
@@ -161,9 +138,6 @@
             ]
         },
         "LAYOUT_fullsize_iso_wkl": {
-            "c_macro": true,
-            "filename": "keyboards/modelh/modelh.h",
-            "json_layout": true,
             "layout": [
                 { "label": "Esc", "matrix": [0, 2], "w": 1, "x": 0, "y": 0 },
                 { "label": "F1", "matrix": [2, 3], "w": 1, "x": 2, "y": 0 },
diff --git a/keyboards/modelh/keymaps/default/readme.md b/keyboards/modelh/keymaps/default/readme.md
deleted file mode 100644
index 5540d213c784..000000000000
--- a/keyboards/modelh/keymaps/default/readme.md
+++ /dev/null
@@ -1 +0,0 @@
-# The default keymap for modelh
diff --git a/keyboards/modelh/modelh.c b/keyboards/modelh/modelh.c
index 4b909c5f0c3e..5384b3733854 100644
--- a/keyboards/modelh/modelh.c
+++ b/keyboards/modelh/modelh.c
@@ -14,7 +14,7 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-#include "modelh.h"
+#include "quantum.h"
 
 
 void keyboard_pre_init_kb(void) {
diff --git a/keyboards/modelh/modelh.h b/keyboards/modelh/modelh.h
deleted file mode 100644
index 4a72074c0ed5..000000000000
--- a/keyboards/modelh/modelh.h
+++ /dev/null
@@ -1,19 +0,0 @@
-/* Copyright 2020 John Hawthorn
- *
- * 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 "quantum.h"
diff --git a/keyboards/modelh/rules.mk b/keyboards/modelh/rules.mk
index f18e83e076f7..a92b0993283e 100644
--- a/keyboards/modelh/rules.mk
+++ b/keyboards/modelh/rules.mk
@@ -1,9 +1,2 @@
-# MCU name
-MCU = STM32F103
-
-BOOTLOADER = stm32duino
-
 # Enter lower-power sleep mode when on the ChibiOS idle thread
 OPT_DEFS += -DCORTEX_ENABLE_WFI_IDLE=TRUE
-
-CUSTOM_MATRIX = no 	# Custom matrix file

From 2405ca48474de0b43c5e1aaee6a2d9fe465cad8b Mon Sep 17 00:00:00 2001
From: Jerome Berclaz <jerome@percipient.ai>
Date: Thu, 4 May 2023 18:35:54 -0700
Subject: [PATCH 08/16] Update keyboards/modelh/info.json

Co-authored-by: Ryan <fauxpark@gmail.com>
---
 keyboards/modelh/info.json | 442 ++++++++++++++++++++-----------------
 1 file changed, 239 insertions(+), 203 deletions(-)

diff --git a/keyboards/modelh/info.json b/keyboards/modelh/info.json
index 225d9c35c91c..9089c7b9bd07 100644
--- a/keyboards/modelh/info.json
+++ b/keyboards/modelh/info.json
@@ -34,213 +34,249 @@
     "layouts": {
         "LAYOUT_fullsize_ansi_wkl": {
             "layout": [
-                { "label": "Esc", "matrix": [0, 2], "w": 1, "x": 0, "y": 0 },
-                { "label": "F1", "matrix": [2, 3], "w": 1, "x": 2, "y": 0 },
-                { "label": "F2", "matrix": [2, 4], "w": 1, "x": 3, "y": 0 },
-                { "label": "F3", "matrix": [1, 4], "w": 1, "x": 4, "y": 0 },
-                { "label": "F4", "matrix": [0, 4], "w": 1, "x": 5, "y": 0 },
-                { "label": "F5", "matrix": [0, 6], "w": 1, "x": 6.5, "y": 0 },
-                { "label": "F6", "matrix": [0, 8], "w": 1, "x": 7.5, "y": 0 },
-                { "label": "F7", "matrix": [1, 9], "w": 1, "x": 8.5, "y": 0 },
-                { "label": "F8", "matrix": [2, 9], "w": 1, "x": 9.5, "y": 0 },
-                { "label": "F9", "matrix": [2, 6], "w": 1, "x": 11, "y": 0 },
-                { "label": "F10", "matrix": [3, 6], "w": 1, "x": 12, "y": 0 },
-                { "label": "F11", "matrix": [3, 11], "w": 1, "x": 13, "y": 0 },
-                { "label": "F12", "matrix": [3, 12], "w": 1, "x": 14, "y": 0 },
-                { "label": "PrtSc", "matrix": [3, 15], "w": 1, "x": 15.25, "y": 0 },
-                { "label": "Scroll Lock", "matrix": [4, 15], "w": 1, "x": 16.25, "y": 0 },
-                { "label": "Pause", "matrix": [6, 14], "w": 1, "x": 17.25, "y": 0 },
-                { "label": "~", "matrix": [2, 2], "w": 1, "x": 0, "y": 1.5 },
-                { "label": "!", "matrix": [3, 2], "w": 1, "x": 1, "y": 1.5 },
-                { "label": "@", "matrix": [3, 3], "w": 1, "x": 2, "y": 1.5 },
-                { "label": "#", "matrix": [3, 4], "w": 1, "x": 3, "y": 1.5 },
-                { "label": "$", "matrix": [3, 5], "w": 1, "x": 4, "y": 1.5 },
-                { "label": "%", "matrix": [2, 5], "w": 1, "x": 5, "y": 1.5 },
-                { "label": "^", "matrix": [2, 7], "w": 1, "x": 6, "y": 1.5 },
-                { "label": "&", "matrix": [3, 7], "w": 1, "x": 7, "y": 1.5 },
-                { "label": "*", "matrix": [3, 8], "w": 1, "x": 8, "y": 1.5 },
-                { "label": "(", "matrix": [3, 9], "w": 1, "x": 9, "y": 1.5 },
-                { "label": ")", "matrix": [3, 10], "w": 1, "x": 10, "y": 1.5 },
-                { "label": "_", "matrix": [2, 10], "w": 1, "x": 11, "y": 1.5 },
-                { "label": "+", "matrix": [2, 8], "w": 1, "x": 12, "y": 1.5 },
-                { "label": "Backspace", "matrix": [1, 6], "w": 2, "x": 13, "y": 1.5 },
-                { "label": "Insert", "matrix": [2, 12], "w": 1, "x": 15.25, "y": 1.5 },
-                { "label": "Home", "matrix": [2, 14], "w": 1, "x": 16.25, "y": 1.5 },
-                { "label": "PgUp", "matrix": [2, 13], "w": 1, "x": 17.25, "y": 1.5 },
-                { "label": "Num Lock", "matrix": [6, 11], "w": 1, "x": 18.5, "y": 1.5 },
-                { "label": "/", "matrix": [6, 12], "w": 1, "x": 19.5, "y": 1.5 },
-                { "label": "*", "matrix": [6, 13], "w": 1, "x": 20.5, "y": 1.5 },
-                { "label": "-", "matrix": [7, 13], "w": 1, "x": 21.5, "y": 1.5 },
-                { "label": "Tab", "matrix": [1, 2], "w": 1.5, "x": 0, "y": 2.5 },
-                { "label": "Q", "matrix": [4, 2], "w": 1, "x": 1.5, "y": 2.5 },
-                { "label": "W", "matrix": [4, 3], "w": 1, "x": 2.5, "y": 2.5 },
-                { "label": "E", "matrix": [4, 4], "w": 1, "x": 3.5, "y": 2.5 },
-                { "label": "R", "matrix": [4, 5], "w": 1, "x": 4.5, "y": 2.5 },
-                { "label": "T", "matrix": [1, 5], "w": 1, "x": 5.5, "y": 2.5 },
-                { "label": "Y", "matrix": [1, 7], "w": 1, "x": 6.5, "y": 2.5 },
-                { "label": "U", "matrix": [4, 7], "w": 1, "x": 7.5, "y": 2.5 },
-                { "label": "I", "matrix": [4, 8], "w": 1, "x": 8.5, "y": 2.5 },
-                { "label": "O", "matrix": [4, 9], "w": 1, "x": 9.5, "y": 2.5 },
-                { "label": "P", "matrix": [4, 10], "w": 1, "x": 10.5, "y": 2.5 },
-                { "label": "{", "matrix": [1, 10], "w": 1, "x": 11.5, "y": 2.5 },
-                { "label": "}", "matrix": [1, 8], "w": 1, "x": 12.5, "y": 2.5 },
-                { "label": "|", "matrix": [5, 6], "w": 1.5, "x": 13.5, "y": 2.5 },
-                { "label": "Delete", "matrix": [2, 11], "w": 1, "x": 15.25, "y": 2.5 },
-                { "label": "End", "matrix": [3, 14], "w": 1, "x": 16.25, "y": 2.5 },
-                { "label": "PgDn", "matrix": [3, 13], "w": 1, "x": 17.25, "y": 2.5 },
-                { "label": "7", "matrix": [4, 11], "w": 1, "x": 18.5, "y": 2.5 },
-                { "label": "8", "matrix": [4, 12], "w": 1, "x": 19.5, "y": 2.5 },
-                { "label": "9", "matrix": [4, 13], "w": 1, "x": 20.5, "y": 2.5 },
-                { "h": 2, "label": "+", "matrix": [4, 14], "w": 1, "x": 21.5, "y": 2.5 },
-                { "label": "Caps Lock", "matrix": [1, 3], "w": 1.5, "x": 0, "y": 3.5 },
-                { "label": "A", "matrix": [5, 2], "w": 1, "x": 1.75, "y": 3.5 },
-                { "label": "S", "matrix": [5, 3], "w": 1, "x": 2.75, "y": 3.5 },
-                { "label": "D", "matrix": [5, 4], "w": 1, "x": 3.75, "y": 3.5 },
-                { "label": "F", "matrix": [5, 5], "w": 1, "x": 4.75, "y": 3.5 },
-                { "label": "G", "matrix": [0, 5], "w": 1, "x": 5.75, "y": 3.5 },
-                { "label": "H", "matrix": [0, 7], "w": 1, "x": 6.75, "y": 3.5 },
-                { "label": "J", "matrix": [5, 7], "w": 1, "x": 7.75, "y": 3.5 },
-                { "label": "K", "matrix": [5, 8], "w": 1, "x": 8.75, "y": 3.5 },
-                { "label": "L", "matrix": [5, 9], "w": 1, "x": 9.75, "y": 3.5 },
-                { "label": ":", "matrix": [5, 10], "w": 1, "x": 10.75, "y": 3.5 },
-                { "label": "\"", "matrix": [0, 10], "w": 1, "x": 11.75, "y": 3.5 },
-                { "label": "Enter", "matrix": [6, 6], "w": 2.25, "x": 12.75, "y": 3.5 },
-                { "label": "4", "matrix": [1, 11], "w": 1, "x": 18.5, "y": 3.5 },
-                { "label": "5", "matrix": [1, 12], "w": 1, "x": 19.5, "y": 3.5 },
-                { "label": "6", "matrix": [1, 13], "w": 1, "x": 20.5, "y": 3.5 },
-                { "label": "Shift", "matrix": [1, 1], "w": 2.25, "x": 0, "y": 4.5 },
-                { "label": "Z", "matrix": [6, 2], "w": 1, "x": 2.25, "y": 4.5 },
-                { "label": "X", "matrix": [6, 3], "w": 1, "x": 3.25, "y": 4.5 },
-                { "label": "C", "matrix": [6, 4], "w": 1, "x": 4.25, "y": 4.5 },
-                { "label": "V", "matrix": [6, 5], "w": 1, "x": 5.25, "y": 4.5 },
-                { "label": "B", "matrix": [7, 5], "w": 1, "x": 6.25, "y": 4.5 },
-                { "label": "N", "matrix": [7, 7], "w": 1, "x": 7.25, "y": 4.5 },
-                { "label": "M", "matrix": [6, 7], "w": 1, "x": 8.25, "y": 4.5 },
-                { "label": "<", "matrix": [6, 8], "w": 1, "x": 9.25, "y": 4.5 },
-                { "label": ">", "matrix": [6, 9], "w": 1, "x": 10.25, "y": 4.5 },
-                { "label": "?", "matrix": [7, 10], "w": 1, "x": 11.25, "y": 4.5 },
-                { "label": "Shift", "matrix": [6, 1], "w": 2.75, "x": 12.25, "y": 4.5 },
-                { "label": "\u2191", "matrix": [0, 14], "w": 1, "x": 16.25, "y": 4.5 },
-                { "label": "1", "matrix": [5, 11], "w": 1, "x": 18.5, "y": 4.5 },
-                { "label": "2", "matrix": [5, 12], "w": 1, "x": 19.5, "y": 4.5 },
-                { "label": "3", "matrix": [5, 13], "w": 1, "x": 20.5, "y": 4.5 },
-                { "h": 2, "label": "Enter", "matrix": [5, 14], "w": 1, "x": 21.5, "y": 4.5 },
-                { "label": "Ctrl", "matrix": [2, 0], "w": 1.5, "x": 0, "y": 5.5 },
-                { "label": "Alt", "matrix": [0, 15], "w": 1.5, "x": 2.5, "y": 5.5 },
-                { "label": "K0C", "matrix": [7, 6], "w": 7, "x": 4, "y": 5.5 },
-                { "label": "Alt", "matrix": [7, 15], "w": 1.5, "x": 11, "y": 5.5 },
-                { "label": "Ctrl", "matrix": [6, 0], "w": 1.5, "x": 13.5, "y": 5.5 },
-                { "label": "\u2190", "matrix": [7, 14], "w": 1, "x": 15.25, "y": 5.5 },
-                { "label": "\u2193", "matrix": [7, 11], "w": 1, "x": 16.25, "y": 5.5 },
-                { "label": "\u2192", "matrix": [7, 12], "w": 1, "x": 17.25, "y": 5.5 },
-                { "label": "0", "matrix": [0, 12], "w": 2, "x": 18.5, "y": 5.5 },
-                { "label": ".", "matrix": [0, 13], "w": 1, "x": 20.5, "y": 5.5 }
+                {"matrix": [0, 2], "x": 0, "y": 0},
+
+                {"matrix": [2, 3], "x": 2, "y": 0},
+                {"matrix": [2, 4], "x": 3, "y": 0},
+                {"matrix": [1, 4], "x": 4, "y": 0},
+                {"matrix": [0, 4], "x": 5, "y": 0},
+
+                {"matrix": [0, 6], "x": 6.5, "y": 0},
+                {"matrix": [0, 8], "x": 7.5, "y": 0},
+                {"matrix": [1, 9], "x": 8.5, "y": 0},
+                {"matrix": [2, 9], "x": 9.5, "y": 0},
+
+                {"matrix": [2, 6], "x": 11, "y": 0},
+                {"matrix": [3, 6], "x": 12, "y": 0},
+                {"matrix": [3, 11], "x": 13, "y": 0},
+                {"matrix": [3, 12], "x": 14, "y": 0},
+
+                {"matrix": [3, 15], "x": 15.25, "y": 0},
+                {"matrix": [4, 15], "x": 16.25, "y": 0},
+                {"matrix": [6, 14], "x": 17.25, "y": 0},
+
+                {"matrix": [2, 2], "x": 0, "y": 1.5},
+                {"matrix": [3, 2], "x": 1, "y": 1.5},
+                {"matrix": [3, 3], "x": 2, "y": 1.5},
+                {"matrix": [3, 4], "x": 3, "y": 1.5},
+                {"matrix": [3, 5], "x": 4, "y": 1.5},
+                {"matrix": [2, 5], "x": 5, "y": 1.5},
+                {"matrix": [2, 7], "x": 6, "y": 1.5},
+                {"matrix": [3, 7], "x": 7, "y": 1.5},
+                {"matrix": [3, 8], "x": 8, "y": 1.5},
+                {"matrix": [3, 9], "x": 9, "y": 1.5},
+                {"matrix": [3, 10], "x": 10, "y": 1.5},
+                {"matrix": [2, 10], "x": 11, "y": 1.5},
+                {"matrix": [2, 8], "x": 12, "y": 1.5},
+                {"matrix": [1, 6], "x": 13, "y": 1.5, "w": 2},
+
+                {"matrix": [2, 12], "x": 15.25, "y": 1.5},
+                {"matrix": [2, 14], "x": 16.25, "y": 1.5},
+                {"matrix": [2, 13], "x": 17.25, "y": 1.5},
+
+                {"matrix": [6, 11], "x": 18.5, "y": 1.5},
+                {"matrix": [6, 12], "x": 19.5, "y": 1.5},
+                {"matrix": [6, 13], "x": 20.5, "y": 1.5},
+                {"matrix": [7, 13], "x": 21.5, "y": 1.5},
+
+                {"matrix": [1, 2], "x": 0, "y": 2.5, "w": 1.5},
+                {"matrix": [4, 2], "x": 1.5, "y": 2.5},
+                {"matrix": [4, 3], "x": 2.5, "y": 2.5},
+                {"matrix": [4, 4], "x": 3.5, "y": 2.5},
+                {"matrix": [4, 5], "x": 4.5, "y": 2.5},
+                {"matrix": [1, 5], "x": 5.5, "y": 2.5},
+                {"matrix": [1, 7], "x": 6.5, "y": 2.5},
+                {"matrix": [4, 7], "x": 7.5, "y": 2.5},
+                {"matrix": [4, 8], "x": 8.5, "y": 2.5},
+                {"matrix": [4, 9], "x": 9.5, "y": 2.5},
+                {"matrix": [4, 10], "x": 10.5, "y": 2.5},
+                {"matrix": [1, 10], "x": 11.5, "y": 2.5},
+                {"matrix": [1, 8], "x": 12.5, "y": 2.5},
+                {"matrix": [5, 6], "x": 13.5, "y": 2.5, "w": 1.5},
+
+                {"matrix": [2, 11], "x": 15.25, "y": 2.5},
+                {"matrix": [3, 14], "x": 16.25, "y": 2.5},
+                {"matrix": [3, 13], "x": 17.25, "y": 2.5},
+
+                {"matrix": [4, 11], "x": 18.5, "y": 2.5},
+                {"matrix": [4, 12], "x": 19.5, "y": 2.5},
+                {"matrix": [4, 13], "x": 20.5, "y": 2.5},
+                {"matrix": [4, 14], "x": 21.5, "y": 2.5, "h": 2},
+
+                {"matrix": [1, 3], "x": 0, "y": 3.5, "w": 1.5},
+                {"matrix": [5, 2], "x": 1.75, "y": 3.5},
+                {"matrix": [5, 3], "x": 2.75, "y": 3.5},
+                {"matrix": [5, 4], "x": 3.75, "y": 3.5},
+                {"matrix": [5, 5], "x": 4.75, "y": 3.5},
+                {"matrix": [0, 5], "x": 5.75, "y": 3.5},
+                {"matrix": [0, 7], "x": 6.75, "y": 3.5},
+                {"matrix": [5, 7], "x": 7.75, "y": 3.5},
+                {"matrix": [5, 8], "x": 8.75, "y": 3.5},
+                {"matrix": [5, 9], "x": 9.75, "y": 3.5},
+                {"matrix": [5, 10], "x": 10.75, "y": 3.5},
+                {"matrix": [0, 10], "x": 11.75, "y": 3.5},
+                {"matrix": [6, 6], "x": 12.75, "y": 3.5, "w": 2.25},
+
+                {"matrix": [1, 11], "x": 18.5, "y": 3.5},
+                {"matrix": [1, 12], "x": 19.5, "y": 3.5},
+                {"matrix": [1, 13], "x": 20.5, "y": 3.5},
+
+                {"matrix": [1, 1], "x": 0, "y": 4.5, "w": 2.25},
+                {"matrix": [6, 2], "x": 2.25, "y": 4.5},
+                {"matrix": [6, 3], "x": 3.25, "y": 4.5},
+                {"matrix": [6, 4], "x": 4.25, "y": 4.5},
+                {"matrix": [6, 5], "x": 5.25, "y": 4.5},
+                {"matrix": [7, 5], "x": 6.25, "y": 4.5},
+                {"matrix": [7, 7], "x": 7.25, "y": 4.5},
+                {"matrix": [6, 7], "x": 8.25, "y": 4.5},
+                {"matrix": [6, 8], "x": 9.25, "y": 4.5},
+                {"matrix": [6, 9], "x": 10.25, "y": 4.5},
+                {"matrix": [7, 10], "x": 11.25, "y": 4.5},
+                {"matrix": [6, 1], "x": 12.25, "y": 4.5, "w": 2.75},
+
+                {"matrix": [0, 14], "x": 16.25, "y": 4.5},
+
+                {"matrix": [5, 11], "x": 18.5, "y": 4.5},
+                {"matrix": [5, 12], "x": 19.5, "y": 4.5},
+                {"matrix": [5, 13], "x": 20.5, "y": 4.5},
+                {"matrix": [5, 14], "x": 21.5, "y": 4.5, "h": 2},
+
+                {"matrix": [2, 0], "x": 0, "y": 5.5, "w": 1.5},
+                {"matrix": [0, 15], "x": 2.5, "y": 5.5, "w": 1.5},
+                {"matrix": [7, 6], "x": 4, "y": 5.5, "w": 7},
+                {"matrix": [7, 15], "x": 11, "y": 5.5, "w": 1.5},
+                {"matrix": [6, 0], "x": 13.5, "y": 5.5, "w": 1.5},
+
+                {"matrix": [7, 14], "x": 15.25, "y": 5.5},
+                {"matrix": [7, 11], "x": 16.25, "y": 5.5},
+                {"matrix": [7, 12], "x": 17.25, "y": 5.5},
+
+                {"matrix": [0, 12], "x": 18.5, "y": 5.5, "w": 2},
+                {"matrix": [0, 13], "x": 20.5, "y": 5.5}
             ]
         },
         "LAYOUT_fullsize_iso_wkl": {
             "layout": [
-                { "label": "Esc", "matrix": [0, 2], "w": 1, "x": 0, "y": 0 },
-                { "label": "F1", "matrix": [2, 3], "w": 1, "x": 2, "y": 0 },
-                { "label": "F2", "matrix": [2, 4], "w": 1, "x": 3, "y": 0 },
-                { "label": "F3", "matrix": [1, 4], "w": 1, "x": 4, "y": 0 },
-                { "label": "F4", "matrix": [0, 4], "w": 1, "x": 5, "y": 0 },
-                { "label": "F5", "matrix": [0, 6], "w": 1, "x": 6.5, "y": 0 },
-                { "label": "F6", "matrix": [0, 8], "w": 1, "x": 7.5, "y": 0 },
-                { "label": "F7", "matrix": [1, 9], "w": 1, "x": 8.5, "y": 0 },
-                { "label": "F8", "matrix": [2, 9], "w": 1, "x": 9.5, "y": 0 },
-                { "label": "F9", "matrix": [2, 6], "w": 1, "x": 11, "y": 0 },
-                { "label": "F10", "matrix": [3, 6], "w": 1, "x": 12, "y": 0 },
-                { "label": "F11", "matrix": [3, 11], "w": 1, "x": 13, "y": 0 },
-                { "label": "F12", "matrix": [3, 12], "w": 1, "x": 14, "y": 0 },
-                { "label": "PrtSc", "matrix": [3, 15], "w": 1, "x": 15.25, "y": 0 },
-                { "label": "Scroll Lock", "matrix": [4, 15], "w": 1, "x": 16.25, "y": 0 },
-                { "label": "Pause", "matrix": [6, 14], "w": 1, "x": 17.25, "y": 0 },
-                { "label": "~", "matrix": [2, 2], "w": 1, "x": 0, "y": 1.5 },
-                { "label": "!", "matrix": [3, 2], "w": 1, "x": 1, "y": 1.5 },
-                { "label": "@", "matrix": [3, 3], "w": 1, "x": 2, "y": 1.5 },
-                { "label": "#", "matrix": [3, 4], "w": 1, "x": 3, "y": 1.5 },
-                { "label": "$", "matrix": [3, 5], "w": 1, "x": 4, "y": 1.5 },
-                { "label": "%", "matrix": [2, 5], "w": 1, "x": 5, "y": 1.5 },
-                { "label": "^", "matrix": [2, 7], "w": 1, "x": 6, "y": 1.5 },
-                { "label": "&", "matrix": [3, 7], "w": 1, "x": 7, "y": 1.5 },
-                { "label": "*", "matrix": [3, 8], "w": 1, "x": 8, "y": 1.5 },
-                { "label": "(", "matrix": [3, 9], "w": 1, "x": 9, "y": 1.5 },
-                { "label": ")", "matrix": [3, 10], "w": 1, "x": 10, "y": 1.5 },
-                { "label": "_", "matrix": [2, 10], "w": 1, "x": 11, "y": 1.5 },
-                { "label": "+", "matrix": [2, 8], "w": 1, "x": 12, "y": 1.5 },
-                { "label": "Backspace", "matrix": [1, 6], "w": 2, "x": 13, "y": 1.5 },
-                { "label": "Insert", "matrix": [2, 12], "w": 1, "x": 15.25, "y": 1.5 },
-                { "label": "Home", "matrix": [2, 14], "w": 1, "x": 16.25, "y": 1.5 },
-                { "label": "PgUp", "matrix": [2, 13], "w": 1, "x": 17.25, "y": 1.5 },
-                { "label": "Num Lock", "matrix": [6, 11], "w": 1, "x": 18.5, "y": 1.5 },
-                { "label": "/", "matrix": [6, 12], "w": 1, "x": 19.5, "y": 1.5 },
-                { "label": "*", "matrix": [6, 13], "w": 1, "x": 20.5, "y": 1.5 },
-                { "label": "-", "matrix": [7, 13], "w": 1, "x": 21.5, "y": 1.5 },
-                { "label": "Tab", "matrix": [1, 2], "w": 1.5, "x": 0, "y": 2.5 },
-                { "label": "Q", "matrix": [4, 2], "w": 1, "x": 1.5, "y": 2.5 },
-                { "label": "W", "matrix": [4, 3], "w": 1, "x": 2.5, "y": 2.5 },
-                { "label": "E", "matrix": [4, 4], "w": 1, "x": 3.5, "y": 2.5 },
-                { "label": "R", "matrix": [4, 5], "w": 1, "x": 4.5, "y": 2.5 },
-                { "label": "T", "matrix": [1, 5], "w": 1, "x": 5.5, "y": 2.5 },
-                { "label": "Y", "matrix": [1, 7], "w": 1, "x": 6.5, "y": 2.5 },
-                { "label": "U", "matrix": [4, 7], "w": 1, "x": 7.5, "y": 2.5 },
-                { "label": "I", "matrix": [4, 8], "w": 1, "x": 8.5, "y": 2.5 },
-                { "label": "O", "matrix": [4, 9], "w": 1, "x": 9.5, "y": 2.5 },
-                { "label": "P", "matrix": [4, 10], "w": 1, "x": 10.5, "y": 2.5 },
-                { "label": "{", "matrix": [1, 10], "w": 1, "x": 11.5, "y": 2.5 },
-                { "label": "}", "matrix": [1, 8], "w": 1, "x": 12.5, "y": 2.5 },
-                { "label": "Delete", "matrix": [2, 11], "w": 1, "x": 15.25, "y": 2.5 },
-                { "label": "End", "matrix": [3, 14], "w": 1, "x": 16.25, "y": 2.5 },
-                { "label": "PgDn", "matrix": [3, 13], "w": 1, "x": 17.25, "y": 2.5 },
-                { "label": "7", "matrix": [4, 11], "w": 1, "x": 18.5, "y": 2.5 },
-                { "label": "8", "matrix": [4, 12], "w": 1, "x": 19.5, "y": 2.5 },
-                { "label": "9", "matrix": [4, 13], "w": 1, "x": 20.5, "y": 2.5 },
-                { "h": 2, "label": "+", "matrix": [4, 14], "w": 1, "x": 21.5, "y": 2.5 },
-                { "label": "Caps Lock", "matrix": [1, 3], "w": 1.5, "x": 0, "y": 3.5 },
-                { "label": "A", "matrix": [5, 2], "w": 1, "x": 1.75, "y": 3.5 },
-                { "label": "S", "matrix": [5, 3], "w": 1, "x": 2.75, "y": 3.5 },
-                { "label": "D", "matrix": [5, 4], "w": 1, "x": 3.75, "y": 3.5 },
-                { "label": "F", "matrix": [5, 5], "w": 1, "x": 4.75, "y": 3.5 },
-                { "label": "G", "matrix": [0, 5], "w": 1, "x": 5.75, "y": 3.5 },
-                { "label": "H", "matrix": [0, 7], "w": 1, "x": 6.75, "y": 3.5 },
-                { "label": "J", "matrix": [5, 7], "w": 1, "x": 7.75, "y": 3.5 },
-                { "label": "K", "matrix": [5, 8], "w": 1, "x": 8.75, "y": 3.5 },
-                { "label": "L", "matrix": [5, 9], "w": 1, "x": 9.75, "y": 3.5 },
-                { "label": ":", "matrix": [5, 10], "w": 1, "x": 10.75, "y": 3.5 },
-                { "label": "\"", "matrix": [0, 10], "w": 1, "x": 11.75, "y": 3.5 },
-                { "label": "~", "matrix": [6, 10], "w": 1, "x": 12.75, "y": 3.5 },
-                { "h": 2, "label": "Enter", "matrix": [6, 6], "w": 1.25, "x": 13.75, "y": 2.5 },
-                { "label": "4", "matrix": [1, 11], "w": 1, "x": 18.5, "y": 3.5 },
-                { "label": "5", "matrix": [1, 12], "w": 1, "x": 19.5, "y": 3.5 },
-                { "label": "6", "matrix": [1, 13], "w": 1, "x": 20.5, "y": 3.5 },
-                { "label": "Shift", "matrix": [1, 1], "w": 1.25, "x": 0, "y": 4.5 },
-                { "label": "|", "matrix": [0, 3], "w": 1, "x": 1.25, "y": 4.5 },
-                { "label": "Z", "matrix": [6, 2], "w": 1, "x": 2.25, "y": 4.5 },
-                { "label": "X", "matrix": [6, 3], "w": 1, "x": 3.25, "y": 4.5 },
-                { "label": "C", "matrix": [6, 4], "w": 1, "x": 4.25, "y": 4.5 },
-                { "label": "V", "matrix": [6, 5], "w": 1, "x": 5.25, "y": 4.5 },
-                { "label": "B", "matrix": [7, 5], "w": 1, "x": 6.25, "y": 4.5 },
-                { "label": "N", "matrix": [7, 7], "w": 1, "x": 7.25, "y": 4.5 },
-                { "label": "M", "matrix": [6, 7], "w": 1, "x": 8.25, "y": 4.5 },
-                { "label": "<", "matrix": [6, 8], "w": 1, "x": 9.25, "y": 4.5 },
-                { "label": ">", "matrix": [6, 9], "w": 1, "x": 10.25, "y": 4.5 },
-                { "label": "?", "matrix": [7, 10], "w": 1, "x": 11.25, "y": 4.5 },
-                { "label": "Shift", "matrix": [6, 1], "w": 2.75, "x": 12.25, "y": 4.5 },
-                { "label": "\u2191", "matrix": [0, 14], "w": 1, "x": 16.25, "y": 4.5 },
-                { "label": "1", "matrix": [5, 11], "w": 1, "x": 18.5, "y": 4.5 },
-                { "label": "2", "matrix": [5, 12], "w": 1, "x": 19.5, "y": 4.5 },
-                { "label": "3", "matrix": [5, 13], "w": 1, "x": 20.5, "y": 4.5 },
-                { "h": 2, "label": "Enter", "matrix": [5, 14], "w": 1, "x": 21.5, "y": 4.5 },
-                { "label": "Ctrl", "matrix": [2, 0], "w": 1.5, "x": 0, "y": 5.5 },
-                { "label": "Alt", "matrix": [0, 15], "w": 1.5, "x": 2.5, "y": 5.5 },
-                { "label": "K0C", "matrix": [7, 6], "w": 7, "x": 4, "y": 5.5 },
-                { "label": "Alt", "matrix": [7, 15], "w": 1.5, "x": 11, "y": 5.5 },
-                { "label": "Ctrl", "matrix": [6, 0], "w": 1.5, "x": 13.5, "y": 5.5 },
-                { "label": "\u2190", "matrix": [7, 14], "w": 1, "x": 15.25, "y": 5.5 },
-                { "label": "\u2193", "matrix": [7, 11], "w": 1, "x": 16.25, "y": 5.5 },
-                { "label": "\u2192", "matrix": [7, 12], "w": 1, "x": 17.25, "y": 5.5 },
-                { "label": "0", "matrix": [0, 12], "w": 2, "x": 18.5, "y": 5.5 },
-                { "label": ".", "matrix": [0, 13], "w": 1, "x": 20.5, "y": 5.5 }
+                {"matrix": [0, 2], "x": 0, "y": 0},
+
+                {"matrix": [2, 3], "x": 2, "y": 0},
+                {"matrix": [2, 4], "x": 3, "y": 0},
+                {"matrix": [1, 4], "x": 4, "y": 0},
+                {"matrix": [0, 4], "x": 5, "y": 0},
+
+                {"matrix": [0, 6], "x": 6.5, "y": 0},
+                {"matrix": [0, 8], "x": 7.5, "y": 0},
+                {"matrix": [1, 9], "x": 8.5, "y": 0},
+                {"matrix": [2, 9], "x": 9.5, "y": 0},
+
+                {"matrix": [2, 6], "x": 11, "y": 0},
+                {"matrix": [3, 6], "x": 12, "y": 0},
+                {"matrix": [3, 11], "x": 13, "y": 0},
+                {"matrix": [3, 12], "x": 14, "y": 0},
+
+                {"matrix": [3, 15], "x": 15.25, "y": 0},
+                {"matrix": [4, 15], "x": 16.25, "y": 0},
+                {"matrix": [6, 14], "x": 17.25, "y": 0},
+
+                {"matrix": [2, 2], "x": 0, "y": 1.5},
+                {"matrix": [3, 2], "x": 1, "y": 1.5},
+                {"matrix": [3, 3], "x": 2, "y": 1.5},
+                {"matrix": [3, 4], "x": 3, "y": 1.5},
+                {"matrix": [3, 5], "x": 4, "y": 1.5},
+                {"matrix": [2, 5], "x": 5, "y": 1.5},
+                {"matrix": [2, 7], "x": 6, "y": 1.5},
+                {"matrix": [3, 7], "x": 7, "y": 1.5},
+                {"matrix": [3, 8], "x": 8, "y": 1.5},
+                {"matrix": [3, 9], "x": 9, "y": 1.5},
+                {"matrix": [3, 10], "x": 10, "y": 1.5},
+                {"matrix": [2, 10], "x": 11, "y": 1.5},
+                {"matrix": [2, 8], "x": 12, "y": 1.5},
+                {"matrix": [1, 6], "x": 13, "y": 1.5, "w": 2},
+
+                {"matrix": [2, 12], "x": 15.25, "y": 1.5},
+                {"matrix": [2, 14], "x": 16.25, "y": 1.5},
+                {"matrix": [2, 13], "x": 17.25, "y": 1.5},
+
+                {"matrix": [6, 11], "x": 18.5, "y": 1.5},
+                {"matrix": [6, 12], "x": 19.5, "y": 1.5},
+                {"matrix": [6, 13], "x": 20.5, "y": 1.5},
+                {"matrix": [7, 13], "x": 21.5, "y": 1.5},
+
+                {"matrix": [1, 2], "x": 0, "y": 2.5, "w": 1.5},
+                {"matrix": [4, 2], "x": 1.5, "y": 2.5},
+                {"matrix": [4, 3], "x": 2.5, "y": 2.5},
+                {"matrix": [4, 4], "x": 3.5, "y": 2.5},
+                {"matrix": [4, 5], "x": 4.5, "y": 2.5},
+                {"matrix": [1, 5], "x": 5.5, "y": 2.5},
+                {"matrix": [1, 7], "x": 6.5, "y": 2.5},
+                {"matrix": [4, 7], "x": 7.5, "y": 2.5},
+                {"matrix": [4, 8], "x": 8.5, "y": 2.5},
+                {"matrix": [4, 9], "x": 9.5, "y": 2.5},
+                {"matrix": [4, 10], "x": 10.5, "y": 2.5},
+                {"matrix": [1, 10], "x": 11.5, "y": 2.5},
+                {"matrix": [1, 8], "x": 12.5, "y": 2.5},
+
+                {"matrix": [2, 11], "x": 15.25, "y": 2.5},
+                {"matrix": [3, 14], "x": 16.25, "y": 2.5},
+                {"matrix": [3, 13], "x": 17.25, "y": 2.5},
+
+                {"matrix": [4, 11], "x": 18.5, "y": 2.5},
+                {"matrix": [4, 12], "x": 19.5, "y": 2.5},
+                {"matrix": [4, 13], "x": 20.5, "y": 2.5},
+                {"matrix": [4, 14], "x": 21.5, "y": 2.5, "h": 2},
+
+                {"matrix": [1, 3], "x": 0, "y": 3.5, "w": 1.5},
+                {"matrix": [5, 2], "x": 1.75, "y": 3.5},
+                {"matrix": [5, 3], "x": 2.75, "y": 3.5},
+                {"matrix": [5, 4], "x": 3.75, "y": 3.5},
+                {"matrix": [5, 5], "x": 4.75, "y": 3.5},
+                {"matrix": [0, 5], "x": 5.75, "y": 3.5},
+                {"matrix": [0, 7], "x": 6.75, "y": 3.5},
+                {"matrix": [5, 7], "x": 7.75, "y": 3.5},
+                {"matrix": [5, 8], "x": 8.75, "y": 3.5},
+                {"matrix": [5, 9], "x": 9.75, "y": 3.5},
+                {"matrix": [5, 10], "x": 10.75, "y": 3.5},
+                {"matrix": [0, 10], "x": 11.75, "y": 3.5},
+                {"matrix": [6, 10], "x": 12.75, "y": 3.5},
+                {"matrix": [6, 6], "x": 13.75, "y": 2.5, "w": 1.25, "h": 2},
+
+                {"matrix": [1, 11], "x": 18.5, "y": 3.5},
+                {"matrix": [1, 12], "x": 19.5, "y": 3.5},
+                {"matrix": [1, 13], "x": 20.5, "y": 3.5},
+
+                {"matrix": [1, 1], "x": 0, "y": 4.5, "w": 1.25},
+                {"matrix": [0, 3], "x": 1.25, "y": 4.5},
+                {"matrix": [6, 2], "x": 2.25, "y": 4.5},
+                {"matrix": [6, 3], "x": 3.25, "y": 4.5},
+                {"matrix": [6, 4], "x": 4.25, "y": 4.5},
+                {"matrix": [6, 5], "x": 5.25, "y": 4.5},
+                {"matrix": [7, 5], "x": 6.25, "y": 4.5},
+                {"matrix": [7, 7], "x": 7.25, "y": 4.5},
+                {"matrix": [6, 7], "x": 8.25, "y": 4.5},
+                {"matrix": [6, 8], "x": 9.25, "y": 4.5},
+                {"matrix": [6, 9], "x": 10.25, "y": 4.5},
+                {"matrix": [7, 10], "x": 11.25, "y": 4.5},
+                {"matrix": [6, 1], "x": 12.25, "y": 4.5, "w": 2.75},
+
+                {"matrix": [0, 14], "x": 16.25, "y": 4.5},
+
+                {"matrix": [5, 11], "x": 18.5, "y": 4.5},
+                {"matrix": [5, 12], "x": 19.5, "y": 4.5},
+                {"matrix": [5, 13], "x": 20.5, "y": 4.5},
+                {"matrix": [5, 14], "x": 21.5, "y": 4.5, "h": 2},
+
+                {"matrix": [2, 0], "x": 0, "y": 5.5, "w": 1.5},
+                {"matrix": [0, 15], "x": 2.5, "y": 5.5, "w": 1.5},
+                {"matrix": [7, 6], "x": 4, "y": 5.5, "w": 7},
+                {"matrix": [7, 15], "x": 11, "y": 5.5, "w": 1.5},
+                {"matrix": [6, 0], "x": 13.5, "y": 5.5, "w": 1.5},
+
+                {"matrix": [7, 14], "x": 15.25, "y": 5.5},
+                {"matrix": [7, 11], "x": 16.25, "y": 5.5},
+                {"matrix": [7, 12], "x": 17.25, "y": 5.5},
+
+                {"matrix": [0, 12], "x": 18.5, "y": 5.5, "w": 2},
+                {"matrix": [0, 13], "x": 20.5, "y": 5.5}
             ]
         }
     }

From 9770828cc0983f00f6a0344bfe66e70c144424f4 Mon Sep 17 00:00:00 2001
From: Jerome Berclaz <jerome@percipient.ai>
Date: Thu, 4 May 2023 18:39:38 -0700
Subject: [PATCH 09/16] Update keyboards/modelh/info.json

Co-authored-by: Ryan <fauxpark@gmail.com>
---
 keyboards/modelh/info.json | 1 -
 1 file changed, 1 deletion(-)

diff --git a/keyboards/modelh/info.json b/keyboards/modelh/info.json
index 9089c7b9bd07..4f18a0211dfa 100644
--- a/keyboards/modelh/info.json
+++ b/keyboards/modelh/info.json
@@ -20,7 +20,6 @@
     },
     "matrix_pins": {
         "cols": ["A10", "A9", "A8", "B15", "B14", "B13", "B12", "B11", "B10", "B1", "B0", "A7", "A6", "A5", "A4", "A3"],
-        "ghost": false,
         "rows": ["B6", "B5", "B4", "A15", "B3", "A0", "A2", "A1"]
     },
     "processor": "STM32F103",

From 7785f035a2ba8d09345b49183c01e68de869b792 Mon Sep 17 00:00:00 2001
From: Jerome Berclaz <jerome.berclaz@a3.epfl.ch>
Date: Sat, 24 Jun 2023 19:32:33 -0700
Subject: [PATCH 10/16] fixed lock lights behavior

---
 keyboards/modelh/info.json | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/keyboards/modelh/info.json b/keyboards/modelh/info.json
index 4f18a0211dfa..cceb12a31ccd 100644
--- a/keyboards/modelh/info.json
+++ b/keyboards/modelh/info.json
@@ -11,12 +11,13 @@
         "extrakey": true,
         "mousekey": false,
         "nkro": false,
-        "sleep_led": true
+        "sleep_led": false
     },
     "indicators": {
         "caps_lock": "B8",
-        "num_lock": "B9",
-        "scroll_lock": "B7"
+        "num_lock": "B7",
+        "scroll_lock": "B9",
+        "on_state": 0
     },
     "matrix_pins": {
         "cols": ["A10", "A9", "A8", "B15", "B14", "B13", "B12", "B11", "B10", "B1", "B0", "A7", "A6", "A5", "A4", "A3"],

From b4ecc706586feafde1cdddad433cd836b6ee82bd Mon Sep 17 00:00:00 2001
From: hcbille <32437363+hcbille@users.noreply.github.com>
Date: Tue, 4 Jul 2023 19:15:17 +0200
Subject: [PATCH 11/16] Changed the hosting to imgur

---
 keyboards/modelh/readme.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/keyboards/modelh/readme.md b/keyboards/modelh/readme.md
index 7ae9df4d01b4..8cd68c111a8b 100644
--- a/keyboards/modelh/readme.md
+++ b/keyboards/modelh/readme.md
@@ -1,6 +1,6 @@
 # Model H - A USB capable PCB for the IBM Model M keyboard
 
-![modelh](https://modelh.club/modelh_assembled.jpg)
+![modelh](https://i.imgur.com/4ymGdkM.jpg)
 
 This conversion kit allows you to replace your IBM Model M's original internal controller board with a modern USB board. This aims to match the footprint of the original controller and plugs into the original keyboard matrix, but exposes a USB port through the original SDL connector.
 

From 095c73a80c5132129b59e7a1dbefde205aa02e46 Mon Sep 17 00:00:00 2001
From: Jerome Berclaz <jerome.berclaz@a3.epfl.ch>
Date: Wed, 5 Jul 2023 20:12:16 -0700
Subject: [PATCH 12/16] addressed reviewer's comments

---
 keyboards/modelh/info.json |  3 +--
 keyboards/modelh/mcuconf.h | 25 -------------------------
 2 files changed, 1 insertion(+), 27 deletions(-)
 delete mode 100644 keyboards/modelh/mcuconf.h

diff --git a/keyboards/modelh/info.json b/keyboards/modelh/info.json
index cceb12a31ccd..6d55d5c6bdda 100644
--- a/keyboards/modelh/info.json
+++ b/keyboards/modelh/info.json
@@ -10,8 +10,7 @@
         "console": false,
         "extrakey": true,
         "mousekey": false,
-        "nkro": false,
-        "sleep_led": false
+        "nkro": false
     },
     "indicators": {
         "caps_lock": "B8",
diff --git a/keyboards/modelh/mcuconf.h b/keyboards/modelh/mcuconf.h
deleted file mode 100644
index 7d3d6e143a44..000000000000
--- a/keyboards/modelh/mcuconf.h
+++ /dev/null
@@ -1,25 +0,0 @@
-/* Copyright 2020 QMK
- *
- * 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_next <mcuconf.h>
-
-#undef STM32_PWM_USE_TIM2
-#undef STM32_SPI_USE_SPI2
-
-#define STM32_PWM_USE_TIM2                  TRUE
-#define STM32_SPI_USE_SPI2                  FALSE

From 388637d6706ee36133482c589b1d5e1029d0f424 Mon Sep 17 00:00:00 2001
From: Jerome Berclaz <jerome.berclaz@a3.epfl.ch>
Date: Wed, 5 Jul 2023 20:17:39 -0700
Subject: [PATCH 13/16] adding back mcuconf.h

---
 keyboards/modelh/mcuconf.h | 25 +++++++++++++++++++++++++
 1 file changed, 25 insertions(+)
 create mode 100644 keyboards/modelh/mcuconf.h

diff --git a/keyboards/modelh/mcuconf.h b/keyboards/modelh/mcuconf.h
new file mode 100644
index 000000000000..7d3d6e143a44
--- /dev/null
+++ b/keyboards/modelh/mcuconf.h
@@ -0,0 +1,25 @@
+/* Copyright 2020 QMK
+ *
+ * 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_next <mcuconf.h>
+
+#undef STM32_PWM_USE_TIM2
+#undef STM32_SPI_USE_SPI2
+
+#define STM32_PWM_USE_TIM2                  TRUE
+#define STM32_SPI_USE_SPI2                  FALSE

From b7a40579b4a5725aadd9413e0106ec721dadc54d Mon Sep 17 00:00:00 2001
From: Jerome Berclaz <jerome.berclaz@a3.epfl.ch>
Date: Wed, 5 Jul 2023 20:20:33 -0700
Subject: [PATCH 14/16] removed entry from rules.mk

---
 keyboards/modelh/rules.mk | 2 --
 1 file changed, 2 deletions(-)

diff --git a/keyboards/modelh/rules.mk b/keyboards/modelh/rules.mk
index a92b0993283e..e69de29bb2d1 100644
--- a/keyboards/modelh/rules.mk
+++ b/keyboards/modelh/rules.mk
@@ -1,2 +0,0 @@
-# Enter lower-power sleep mode when on the ChibiOS idle thread
-OPT_DEFS += -DCORTEX_ENABLE_WFI_IDLE=TRUE

From 5705bb42653c1f076712db48779f2a696ec403e3 Mon Sep 17 00:00:00 2001
From: Jerome Berclaz <jerome.berclaz@a3.epfl.ch>
Date: Wed, 5 Jul 2023 20:27:28 -0700
Subject: [PATCH 15/16] removed mcuconf.h

---
 keyboards/modelh/halconf.h |  1 -
 keyboards/modelh/mcuconf.h | 25 -------------------------
 2 files changed, 26 deletions(-)
 delete mode 100644 keyboards/modelh/mcuconf.h

diff --git a/keyboards/modelh/halconf.h b/keyboards/modelh/halconf.h
index 8e3ad48ffc6f..ba5217ea6fca 100644
--- a/keyboards/modelh/halconf.h
+++ b/keyboards/modelh/halconf.h
@@ -17,7 +17,6 @@
 #pragma once
 
 
-#define HAL_USE_PWM                         TRUE
 #define SERIAL_BUFFERS_SIZE                 16
 
 #include_next <halconf.h>
diff --git a/keyboards/modelh/mcuconf.h b/keyboards/modelh/mcuconf.h
deleted file mode 100644
index 7d3d6e143a44..000000000000
--- a/keyboards/modelh/mcuconf.h
+++ /dev/null
@@ -1,25 +0,0 @@
-/* Copyright 2020 QMK
- *
- * 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_next <mcuconf.h>
-
-#undef STM32_PWM_USE_TIM2
-#undef STM32_SPI_USE_SPI2
-
-#define STM32_PWM_USE_TIM2                  TRUE
-#define STM32_SPI_USE_SPI2                  FALSE

From 0705f9aad00b2d4208485739ef7877c86cc55273 Mon Sep 17 00:00:00 2001
From: Jerome Berclaz <jerome.berclaz@a3.epfl.ch>
Date: Wed, 5 Jul 2023 20:33:06 -0700
Subject: [PATCH 16/16] removed chibios config files

---
 keyboards/modelh/chconf.h  | 31 -------------------------------
 keyboards/modelh/halconf.h | 22 ----------------------
 2 files changed, 53 deletions(-)
 delete mode 100644 keyboards/modelh/chconf.h
 delete mode 100644 keyboards/modelh/halconf.h

diff --git a/keyboards/modelh/chconf.h b/keyboards/modelh/chconf.h
deleted file mode 100644
index 413fb8d69cfd..000000000000
--- a/keyboards/modelh/chconf.h
+++ /dev/null
@@ -1,31 +0,0 @@
-/* Copyright 2020 QMK
- *
- * 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 CH_CFG_ST_TIMEDELTA                 0
-#define CH_CFG_USE_TM                       TRUE
-#define CH_CFG_USE_REGISTRY                 TRUE
-#define CH_CFG_USE_WAITEXIT                 TRUE
-#define CH_CFG_USE_CONDVARS                 TRUE
-#define CH_CFG_USE_CONDVARS_TIMEOUT         FALSE
-#define CH_CFG_USE_MESSAGES                 TRUE
-#define CH_CFG_USE_MAILBOXES                TRUE
-#define CH_CFG_USE_HEAP                     TRUE
-#define CH_CFG_USE_OBJ_CACHES               TRUE
-#define CH_CFG_USE_DELEGATES                TRUE
-
-#include_next <chconf.h>
diff --git a/keyboards/modelh/halconf.h b/keyboards/modelh/halconf.h
deleted file mode 100644
index ba5217ea6fca..000000000000
--- a/keyboards/modelh/halconf.h
+++ /dev/null
@@ -1,22 +0,0 @@
-/* Copyright 2020 QMK
- *
- * 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 SERIAL_BUFFERS_SIZE                 16
-
-#include_next <halconf.h>