diff --git a/keyboards/m65/config.h b/keyboards/m65/config.h
new file mode 100644
index 000000000000..49db1720a76f
--- /dev/null
+++ b/keyboards/m65/config.h
@@ -0,0 +1,33 @@
+/*
+Copyright 2021 Alin M Elena <alinm.elena@gmail.com>
+
+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"
+
+#define VENDOR_ID       0xBABA
+#define MANUFACTURER    Alin Elena
+#define PRODUCT         m65
+
+#define MATRIX_ROWS 5
+#define MATRIX_COLS 13
+
+#define DIODE_DIRECTION COL2ROW
+#define DEBOUNCE 5
+
+#define LOCKING_SUPPORT_ENABLE
+#define LOCKING_RESYNC_ENABLE
diff --git a/keyboards/m65/info.json b/keyboards/m65/info.json
new file mode 100644
index 000000000000..fc8edd67dd0c
--- /dev/null
+++ b/keyboards/m65/info.json
@@ -0,0 +1,83 @@
+{
+    "keyboard_name": "M65",
+    "keyboard_folder": "m65",
+    "url": "https://alin.elena.space/blog/keeblego/",
+    "maintainer": "alinelena",
+    "width": 13,
+    "height": 5,
+    "layouts": {
+        "LAYOUT_ortho_5x13": {
+            "layout": [
+                {"x": 0, "y": 0},
+                {"x": 1, "y": 0},
+                {"x": 2, "y": 0},
+                {"x": 3, "y": 0},
+                {"x": 4, "y": 0},
+                {"x": 5, "y": 0},
+                {"x": 6, "y": 0},
+                {"x": 7, "y": 0},
+                {"x": 8, "y": 0},
+                {"x": 9, "y": 0},
+                {"x": 10, "y": 0},
+                {"x": 11, "y": 0},
+                {"x": 12, "y": 0},
+
+                {"x": 0, "y": 1},
+                {"x": 1, "y": 1},
+                {"x": 2, "y": 1},
+                {"x": 3, "y": 1},
+                {"x": 4, "y": 1},
+                {"x": 5, "y": 1},
+                {"x": 6, "y": 1},
+                {"x": 7, "y": 1},
+                {"x": 8, "y": 1},
+                {"x": 9, "y": 1},
+                {"x": 10, "y": 1},
+                {"x": 11, "y": 1},
+                {"x": 12, "y": 1},
+
+                {"x": 0, "y": 2},
+                {"x": 1, "y": 2},
+                {"x": 2, "y": 2},
+                {"x": 3, "y": 2},
+                {"x": 4, "y": 2},
+                {"x": 5, "y": 2},
+                {"x": 6, "y": 2},
+                {"x": 7, "y": 2},
+                {"x": 8, "y": 2},
+                {"x": 9, "y": 2},
+                {"x": 10, "y": 2},
+                {"x": 11, "y": 2},
+                {"x": 12, "y": 2},
+
+                {"x": 0, "y": 3},
+                {"x": 1, "y": 3},
+                {"x": 2, "y": 3},
+                {"x": 3, "y": 3},
+                {"x": 4, "y": 3},
+                {"x": 5, "y": 3},
+                {"x": 6, "y": 3},
+                {"x": 7, "y": 3},
+                {"x": 8, "y": 3},
+                {"x": 9, "y": 3},
+                {"x": 10, "y": 3},
+                {"x": 11, "y": 3},
+                {"x": 12, "y": 3},
+
+                {"x": 0, "y": 4},
+                {"x": 1, "y": 4},
+                {"x": 2, "y": 4},
+                {"x": 3, "y": 4},
+                {"x": 4, "y": 4},
+                {"x": 5, "y": 4},
+                {"x": 6, "y": 4},
+                {"x": 7, "y": 4},
+                {"x": 8, "y": 4},
+                {"x": 9, "y": 4},
+                {"x": 10, "y": 4},
+                {"x": 11, "y": 4}
+                {"x": 12, "y": 4}
+            ]
+        }
+    }
+}
diff --git a/keyboards/m65/keymaps/default/config.h b/keyboards/m65/keymaps/default/config.h
new file mode 100644
index 000000000000..aabd6a2be662
--- /dev/null
+++ b/keyboards/m65/keymaps/default/config.h
@@ -0,0 +1,20 @@
+/*
+Copyright 2021 Alin M Elena <alinm.elena@gmail.com>
+
+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 TAPPING_TOGGLE 2
diff --git a/keyboards/m65/keymaps/default/keymap.c b/keyboards/m65/keymaps/default/keymap.c
new file mode 100644
index 000000000000..13093408b2e5
--- /dev/null
+++ b/keyboards/m65/keymaps/default/keymap.c
@@ -0,0 +1,113 @@
+/*
+Copyright 2021 Alin M Elena <alinm.elena@gmail.com>
+
+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
+
+enum layer_names { _QW = 0, _LWR, _RSE, _ADJ };
+
+// clang-format off
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+  [_QW] = LAYOUT_ortho_5x13(
+       KC_ESC, KC_1   , KC_2    , KC_3   , KC_4    , KC_5  , KC_6  , KC_7  , KC_8   , KC_9   , KC_0   , KC_MINS, KC_BSPC ,
+       KC_TAB, KC_Q   , KC_W    , KC_E   , KC_R    , KC_T  , KC_Y  , KC_U  , KC_I   , KC_O   , KC_P   , KC_LBRC, KC_RBRC ,
+      KC_NUHS, 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_LSPO, KC_NUBS, KC_Z    , KC_X   , KC_C    , KC_V  , KC_B  , KC_N  , KC_M   , KC_COMM, KC_DOT , KC_UP  , KC_SLSH ,
+      KC_LCTL, KC_LGUI, TT(_LWR), KC_LALT, TT(_RSE), KC_SPC, KC_SPC, KC_SPC, KC_RALT, KC_RSPC, KC_LEFT, KC_DOWN, KC_RGHT),
+
+  [_LWR] = LAYOUT_ortho_5x13(
+       KC_GRV , KC_MUTE, KC_VOLU, KC_VOLD, KC_MPRV, KC_MPLY, KC_MNXT, G(KC_P), KC_SLEP, KC_WAKE, KC_PSCR, KC_DEL , KC_EQL  ,
+       KC_BTN3, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ,
+       KC_BTN2, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ,
+       KC_TRNS, KC_BTN1, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_U, KC_TRNS ,
+       KC_TRNS, KC_BTN4, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R),
+
+  [_RSE] = LAYOUT_ortho_5x13(
+      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_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ,
+      KC_CAPS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ,
+      KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_WH_U, KC_TRNS ,
+      KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_WH_L, KC_WH_D, KC_WH_R),
+
+  [_ADJ] = LAYOUT_ortho_5x13(
+      KC_TRNS, KC_TRNS, A(KC_F2), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ,
+      KC_TRNS, KC_TRNS, KC_TRNS , KC_TRNS, RESET  , KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ,
+      KC_TRNS, KC_TRNS, KC_TRNS , KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ,
+      KC_TRNS, KC_TRNS, KC_TRNS , KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ,
+      KC_TRNS, KC_TRNS, KC_TRNS , KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
+};
+// clang-format on
+
+// let us assume we start with both layers off
+bool toggle_lwr = false;
+bool toggle_rse = false;
+
+static inline void led_lwr(const bool on) {
+#ifdef LED_NUM_LOCK_PIN
+    writePin(LED_NUM_LOCK_PIN, on);
+#endif
+}
+
+static inline void led_rse(const bool on) {
+#ifdef LED_SCROLL_LOCK_PIN
+    writePin(LED_SCROLL_LOCK_PIN, on);
+#endif
+}
+
+static inline void led_caps(const bool on) {
+#ifdef LED_CAPS_LOCK_PIN
+    writePin(LED_CAPS_LOCK_PIN, on);
+#endif
+}
+
+bool led_update_user(led_t led_state) {
+    // Disable the default LED update code, so that lock LEDs could be reused to show layer status.
+    return false;
+}
+
+void matrix_scan_user(void) {
+    led_lwr(toggle_lwr);
+    led_rse(toggle_rse);
+    led_t led_state = host_keyboard_led_state();
+    led_caps(!led_state.caps_lock);
+    if (layer_state_is(_ADJ)) {
+        led_lwr(true);
+        led_rse(true);
+    }
+}
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+    switch (keycode) {
+        case (TT(_LWR)):
+            if (!record->event.pressed && record->tap.count == TAPPING_TOGGLE) {
+                // This runs before the TT() handler toggles the layer state, so the current layer state is the opposite of the final one after toggle.
+                toggle_lwr = !layer_state_is(_LWR);
+            }
+            return true;
+            break;
+        case (TT(_RSE)):
+            if (record->event.pressed && record->tap.count == TAPPING_TOGGLE) {
+                toggle_rse = !layer_state_is(_RSE);
+            }
+            return true;
+            break;
+        default:
+            return true;
+    }
+}
+
+layer_state_t layer_state_set_user(layer_state_t state) { return update_tri_layer_state(state, _LWR, _RSE, _ADJ); }
diff --git a/keyboards/m65/keymaps/default/readme.md b/keyboards/m65/keymaps/default/readme.md
new file mode 100644
index 000000000000..ae71342232dd
--- /dev/null
+++ b/keyboards/m65/keymaps/default/readme.md
@@ -0,0 +1,13 @@
+![M65 Layout Image](https://i.imgur.com/Z2O8yhGh.png)
+
+# Default M65 Layout
+
+This is the default layout for M65. For the most part it's a straightforward and easy to follow layout inspired by ISO with a UK
+turn.  The only unusual key is the key in the upper left, which sends Escape normally, but Grave when in layer 1 aka LWR.  Similarly
+number row in layer 1 give the usual audio KC_GRV, KC_AUDIO_MUTE,  KC_AUDIO_VOL_UP,  KC_AUDIO_VOL_DOWN,   KC_MEDIA_PREV_TRACK,
+KC_MEDIA_PLAY_PAUSE,  KC_MEDIA_NEXT_TRACK, M_EXTDISP,  KC_SYSTEM_SLEEP, KC_SYSTEM_WAKE, KC_PSCREEN, KC_DEL, KC_EQL in layer 2 aka
+RSE one gets F1-F12 mouse emulation can be used in layer 1 and 2.
+
+flashing is done by LWR+RSE+r
+
+full layout below see in keymap.c
diff --git a/keyboards/m65/keymaps/dk/config.h b/keyboards/m65/keymaps/dk/config.h
new file mode 100644
index 000000000000..aabd6a2be662
--- /dev/null
+++ b/keyboards/m65/keymaps/dk/config.h
@@ -0,0 +1,20 @@
+/*
+Copyright 2021 Alin M Elena <alinm.elena@gmail.com>
+
+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 TAPPING_TOGGLE 2
diff --git a/keyboards/m65/keymaps/dk/keymap.c b/keyboards/m65/keymaps/dk/keymap.c
new file mode 100644
index 000000000000..4a26f4eedaf1
--- /dev/null
+++ b/keyboards/m65/keymaps/dk/keymap.c
@@ -0,0 +1,114 @@
+/*
+Copyright 2021 Alin M Elena <alinm.elena@gmail.com>
+
+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
+#include "keymap_danish.h"
+
+enum layer_names { _QW = 0, _LWR, _RSE, _ADJ };
+
+// clang-format off
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+  [_QW] = LAYOUT_ortho_5x13(
+       KC_ESC, DK_1   , DK_2    , DK_3   , DK_4    , DK_5  , DK_6  , DK_7  , DK_8   , DK_9   , DK_0   , DK_PLUS, KC_BSPC ,
+       KC_TAB, DK_Q   , DK_W    , DK_E   , DK_R    , DK_T  , DK_Y  , DK_U  , DK_I   , DK_O   , DK_P   , DK_ARNG, DK_DIAE ,
+      DK_QUOT, DK_A   , DK_S    , DK_D   , DK_F    , DK_G  , DK_H  , DK_J  , DK_K   , DK_L   , DK_AE  , DK_OSTR, KC_ENT  ,
+      KC_LSPO, DK_LABK, DK_Z    , DK_X   , DK_C    , DK_V  , DK_B  , DK_N  , DK_M   , DK_COMM, DK_DOT , KC_UP  , DK_MINS ,
+      KC_LCTL, KC_LGUI, TT(_LWR), KC_LALT, TT(_RSE), KC_SPC, KC_SPC, KC_SPC, KC_RALT, KC_RSPC, KC_LEFT, KC_DOWN, KC_RGHT),
+
+  [_LWR] = LAYOUT_ortho_5x13(
+       DK_HALF, KC_MUTE, KC_VOLU, KC_VOLD, KC_MPRV, KC_MPLY, KC_MNXT, G(KC_P), KC_SLEP, KC_WAKE, KC_PSCR, KC_DEL , DK_ACUT  ,
+       KC_BTN3, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ,
+       KC_BTN2, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ,
+       KC_TRNS, KC_BTN1, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_U, KC_TRNS ,
+       KC_TRNS, KC_BTN4, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R),
+
+  [_RSE] = LAYOUT_ortho_5x13(
+      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_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ,
+      KC_CAPS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ,
+      KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_WH_U, KC_TRNS ,
+      KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_WH_L, KC_WH_D, KC_WH_R),
+
+  [_ADJ] = LAYOUT_ortho_5x13(
+      KC_TRNS, KC_TRNS, A(KC_F2), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ,
+      KC_TRNS, KC_TRNS, KC_TRNS , KC_TRNS, RESET  , KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ,
+      KC_TRNS, KC_TRNS, KC_TRNS , KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ,
+      KC_TRNS, KC_TRNS, KC_TRNS , KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ,
+      KC_TRNS, KC_TRNS, KC_TRNS , KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
+};
+// clang-format on
+
+// let us assume we start with both layers off
+bool toggle_lwr = false;
+bool toggle_rse = false;
+
+static inline void led_lwr(const bool on) {
+#ifdef LED_NUM_LOCK_PIN
+    writePin(LED_NUM_LOCK_PIN, on);
+#endif
+}
+
+static inline void led_rse(const bool on) {
+#ifdef LED_SCROLL_LOCK_PIN
+    writePin(LED_SCROLL_LOCK_PIN, on);
+#endif
+}
+
+static inline void led_caps(const bool on) {
+#ifdef LED_CAPS_LOCK_PIN
+    writePin(LED_CAPS_LOCK_PIN, on);
+#endif
+}
+
+bool led_update_user(led_t led_state) {
+    // Disable the default LED update code, so that lock LEDs could be reused to show layer status.
+    return false;
+}
+
+void matrix_scan_user(void) {
+    led_lwr(toggle_lwr);
+    led_rse(toggle_rse);
+    led_t led_state = host_keyboard_led_state();
+    led_caps(!led_state.caps_lock);
+    if (layer_state_is(_ADJ)) {
+        led_lwr(true);
+        led_rse(true);
+    }
+}
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+    switch (keycode) {
+        case (TT(_LWR)):
+            if (!record->event.pressed && record->tap.count == TAPPING_TOGGLE) {
+                // This runs before the TT() handler toggles the layer state, so the current layer state is the opposite of the final one after toggle.
+                toggle_lwr = !layer_state_is(_LWR);
+            }
+            return true;
+            break;
+        case (TT(_RSE)):
+            if (record->event.pressed && record->tap.count == TAPPING_TOGGLE) {
+                toggle_rse = !layer_state_is(_RSE);
+            }
+            return true;
+            break;
+        default:
+            return true;
+    }
+}
+
+layer_state_t layer_state_set_user(layer_state_t state) { return update_tri_layer_state(state, _LWR, _RSE, _ADJ); }
diff --git a/keyboards/m65/keymaps/dk/readme.md b/keyboards/m65/keymaps/dk/readme.md
new file mode 100644
index 000000000000..06fed3bda651
--- /dev/null
+++ b/keyboards/m65/keymaps/dk/readme.md
@@ -0,0 +1,13 @@
+![M65 Layout Image](https://i.imgur.com/RQqsM4gh.png)
+
+# Default M65 Layout
+
+This is the Danish keymap for M65. For the most part it's a straightforward and easy to follow layout inspired by ISO with a DK
+turn.  The only unusual key is the key in the upper left, which sends Escape normally, but Grave when in layer 1 aka LWR.  Similarly
+number row in layer 1 give the usual audio KC_GRV, KC_AUDIO_MUTE,  KC_AUDIO_VOL_UP,  KC_AUDIO_VOL_DOWN,   KC_MEDIA_PREV_TRACK,
+KC_MEDIA_PLAY_PAUSE,  KC_MEDIA_NEXT_TRACK, M_EXTDISP,  KC_SYSTEM_SLEEP, KC_SYSTEM_WAKE, KC_PSCREEN, KC_DEL, DK_ACUT in layer 2 aka
+RSE one gets F1-F12 mouse emulation can be used in layer 1 and 2.
+
+flashing is done by LWR+RSE+r
+
+full layout below see in keymap.c
diff --git a/keyboards/m65/keymaps/uk/config.h b/keyboards/m65/keymaps/uk/config.h
new file mode 100644
index 000000000000..aabd6a2be662
--- /dev/null
+++ b/keyboards/m65/keymaps/uk/config.h
@@ -0,0 +1,20 @@
+/*
+Copyright 2021 Alin M Elena <alinm.elena@gmail.com>
+
+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 TAPPING_TOGGLE 2
diff --git a/keyboards/m65/keymaps/uk/keymap.c b/keyboards/m65/keymaps/uk/keymap.c
new file mode 100644
index 000000000000..0f426f61498c
--- /dev/null
+++ b/keyboards/m65/keymaps/uk/keymap.c
@@ -0,0 +1,114 @@
+/*
+Copyright 2021 Alin M Elena <alinm.elena@gmail.com>
+
+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
+#include "keymap_uk.h"
+
+enum layer_names { _QW = 0, _LWR, _RSE, _ADJ };
+
+// clang-format off
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+  [_QW] = LAYOUT_ortho_5x13(
+       KC_ESC, UK_1   , UK_2    , UK_3   , UK_4    , UK_5  , UK_6  , UK_7  , UK_8   , UK_9   , UK_0   , UK_MINS, KC_BSPC ,
+       KC_TAB, UK_Q   , UK_W    , UK_E   , UK_R    , UK_T  , UK_Y  , UK_U  , UK_I   , UK_O   , UK_P   , UK_LBRC, UK_RBRC ,
+      UK_HASH, UK_A   , UK_S    , UK_D   , UK_F    , UK_G  , UK_H  , UK_J  , UK_K   , UK_L   , UK_SCLN, UK_QUOT, KC_ENT  ,
+      KC_LSPO, UK_BSLS, UK_Z    , UK_X   , UK_C    , UK_V  , UK_B  , UK_N  , UK_M   , UK_COMM, UK_DOT , KC_UP  , UK_SLSH ,
+      KC_LCTL, KC_LGUI, TT(_LWR), KC_LALT, TT(_RSE), KC_SPC, KC_SPC, KC_SPC, KC_RALT, KC_RSPC, KC_LEFT, KC_DOWN, KC_RGHT),
+
+  [_LWR] = LAYOUT_ortho_5x13(
+       KC_GRV , KC_MUTE, KC_VOLU, KC_VOLD, KC_MPRV, KC_MPLY, KC_MNXT, G(KC_P), KC_SLEP, KC_WAKE, KC_PSCR, KC_DEL , UK_EQL  ,
+       KC_BTN3, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ,
+       KC_BTN2, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ,
+       KC_TRNS, KC_BTN1, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_U, KC_TRNS ,
+       KC_TRNS, KC_BTN4, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R),
+
+  [_RSE] = LAYOUT_ortho_5x13(
+      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_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ,
+      KC_CAPS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ,
+      KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_WH_U, KC_TRNS ,
+      KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_WH_L, KC_WH_D, KC_WH_R),
+
+  [_ADJ] = LAYOUT_ortho_5x13(
+      KC_TRNS, KC_TRNS, A(KC_F2), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ,
+      KC_TRNS, KC_TRNS, KC_TRNS , KC_TRNS, RESET  , KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ,
+      KC_TRNS, KC_TRNS, KC_TRNS , KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ,
+      KC_TRNS, KC_TRNS, KC_TRNS , KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ,
+      KC_TRNS, KC_TRNS, KC_TRNS , KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
+};
+// clang-format on
+
+// let us assume we start with both layers off
+bool toggle_lwr = false;
+bool toggle_rse = false;
+
+static inline void led_lwr(const bool on) {
+#ifdef LED_NUM_LOCK_PIN
+    writePin(LED_NUM_LOCK_PIN, on);
+#endif
+}
+
+static inline void led_rse(const bool on) {
+#ifdef LED_SCROLL_LOCK_PIN
+    writePin(LED_SCROLL_LOCK_PIN, on);
+#endif
+}
+
+static inline void led_caps(const bool on) {
+#ifdef LED_CAPS_LOCK_PIN
+    writePin(LED_CAPS_LOCK_PIN, on);
+#endif
+}
+
+bool led_update_user(led_t led_state) {
+    // Disable the default LED update code, so that lock LEDs could be reused to show layer status.
+    return false;
+}
+
+void matrix_scan_user(void) {
+    led_lwr(toggle_lwr);
+    led_rse(toggle_rse);
+    led_t led_state = host_keyboard_led_state();
+    led_caps(!led_state.caps_lock);
+    if (layer_state_is(_ADJ)) {
+        led_lwr(true);
+        led_rse(true);
+    }
+}
+
+bool process_record_user(uint16_t keycode, keyrecord_t* record) {
+    switch (keycode) {
+        case (TT(_LWR)):
+            if (!record->event.pressed && record->tap.count == TAPPING_TOGGLE) {
+                // This runs before the TT() handler toggles the layer state, so the current layer state is the opposite of the final one after toggle.
+                toggle_lwr = !layer_state_is(_LWR);
+            }
+            return true;
+            break;
+        case (TT(_RSE)):
+            if (record->event.pressed && record->tap.count == TAPPING_TOGGLE) {
+                toggle_rse = !layer_state_is(_RSE);
+            }
+            return true;
+            break;
+        default:
+            return true;
+    }
+}
+
+layer_state_t layer_state_set_user(layer_state_t state) { return update_tri_layer_state(state, _LWR, _RSE, _ADJ); }
diff --git a/keyboards/m65/keymaps/uk/readme.md b/keyboards/m65/keymaps/uk/readme.md
new file mode 100644
index 000000000000..bc29d23905ae
--- /dev/null
+++ b/keyboards/m65/keymaps/uk/readme.md
@@ -0,0 +1,13 @@
+# Default M65 Layout
+
+![M65 Layout Image](https://i.imgur.com/KZFnAU5h.png)
+
+This is the default layout for M65. For the most part it's a straightforward and easy to follow layout inspired by ISO with a UK
+turn.  The only unusual key is the key in the upper left, which sends Escape normally, but Grave when in layer 1 aka LWR.  Similarly
+number row in layer 1 give the usual audio KC_GRV, KC_AUDIO_MUTE,  KC_AUDIO_VOL_UP,  KC_AUDIO_VOL_DOWN,   KC_MEDIA_PREV_TRACK,
+KC_MEDIA_PLAY_PAUSE,  KC_MEDIA_NEXT_TRACK, M_EXTDISP,  KC_SYSTEM_SLEEP, KC_SYSTEM_WAKE, KC_PSCREEN, KC_DEL, KC_EQL in layer 2 aka
+RSE one gets F1-F12 mouse emulation can be used in layer 1 and 2.
+
+flashing is done by LWR+RSE+r
+
+full layout below see in keymap.c
diff --git a/keyboards/m65/m65.c b/keyboards/m65/m65.c
new file mode 100644
index 000000000000..35e2b412267c
--- /dev/null
+++ b/keyboards/m65/m65.c
@@ -0,0 +1,19 @@
+/*
+Copyright 2021 Alin M Elena <alinm.elena@gmail.com>
+
+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 "m65.h"
diff --git a/keyboards/m65/m65.h b/keyboards/m65/m65.h
new file mode 100644
index 000000000000..50065c9f8976
--- /dev/null
+++ b/keyboards/m65/m65.h
@@ -0,0 +1,34 @@
+/*
+Copyright 2021 Alin M Elena <alinm.elena@gmail.com>
+
+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"
+
+#define LAYOUT_ortho_5x13( \
+  K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, \
+  K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, \
+  K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, \
+  K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, \
+  K400, K401, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412  \
+) { \
+  { K000,  K001,  K002,  K003,  K004,  K005,  K006,  K007,  K008,  K009,  K010,  K011,  K012 }, \
+  { K100,  K101,  K102,  K103,  K104,  K105,  K106,  K107,  K108,  K109,  K110,  K111,  K112 }, \
+  { K200,  K201,  K202,  K203,  K204,  K205,  K206,  K207,  K208,  K209,  K210,  K211,  K212 }, \
+  { K300,  K301,  K302,  K303,  K304,  K305,  K306,  K307,  K308,  K309,  K310,  K311,  K312 }, \
+  { K400,  K401,  K402,  K403,  K404,  K405,  K406,  K407,  K408,  K409,  K410,  K411,  K412 }  \
+}
diff --git a/keyboards/m65/readme.md b/keyboards/m65/readme.md
new file mode 100644
index 000000000000..9493a3fffc37
--- /dev/null
+++ b/keyboards/m65/readme.md
@@ -0,0 +1,22 @@
+# M65
+
+![M65](https://i.imgur.com/gXuecush.jpg)
+
+A  (13x5) ortholinear keyboard that can be hand wired or using a pcb.
+
+* Keyboard Maintainer: [Alin Elena](https://github.com/alinelena) ([@drFaustroll on GitLab](https://gitlab.com/drFaustroll))
+* Hardware Supported: custom pcb [see](https://gitlab.com/drFaustroll/m65) STM/APM32F103C8T6, aka Black Pill
+* Hardware Availability: [custom how to](https://alin.elena.space/blog/keeblego/)
+
+
+Make example for this keyboard (after setting up your build environment):
+
+    make m65/rev1:default
+
+Flashing example for this keyboard:
+
+    make m65/rev1:default:flash
+
+To enter flashing mode, press Lower+Raise+R.
+
+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/m65/rev1/chconf.h b/keyboards/m65/rev1/chconf.h
new file mode 100644
index 000000000000..8c43fb26979b
--- /dev/null
+++ b/keyboards/m65/rev1/chconf.h
@@ -0,0 +1,29 @@
+/* Copyright 2021 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/>.
+ */
+
+/*
+ * This file was auto-generated by:
+ *    `qmk chibios-confmigrate -i keyboards/m65/rev1/chconf.h -r platforms/chibios/common/configs/chconf.h`
+ */
+
+#pragma once
+
+#define CH_CFG_ST_TIMEDELTA 0
+
+#define CH_CFG_USE_CONDVARS_TIMEOUT FALSE
+
+#include_next <chconf.h>
+
diff --git a/keyboards/m65/rev1/config.h b/keyboards/m65/rev1/config.h
new file mode 100644
index 000000000000..090210f254e7
--- /dev/null
+++ b/keyboards/m65/rev1/config.h
@@ -0,0 +1,32 @@
+/*
+Copyright 2021 Alin M Elena <alinm.elena@gmail.com>
+
+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 DEVICE_VER      0x0001
+#define PRODUCT_ID      0x6060
+
+#define LED_NUM_LOCK_PIN B12
+#define LED_SCROLL_LOCK_PIN B13
+#define LED_CAPS_LOCK_PIN C13
+
+//                          0   1   2    3   4
+#define MATRIX_ROW_PINS { B11, B0, B1,  A2, A3 }
+//                         0    1   2   3   4   5   6   7   8    9  10  11   12
+#define MATRIX_COL_PINS {A10, A15, B3, B4, B5, B9, B8, B7, B6, C15, A0, A7, B10 }
+
+#define UNUSED_PINS
diff --git a/keyboards/m65/rev1/mcuconf.h b/keyboards/m65/rev1/mcuconf.h
new file mode 100644
index 000000000000..20df276a5ac2
--- /dev/null
+++ b/keyboards/m65/rev1/mcuconf.h
@@ -0,0 +1,27 @@
+/* Copyright 2021 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/>.
+ */
+
+/*
+ * This file was auto-generated by:
+ *    `qmk chibios-confmigrate -i keyboards/m65/rev1/mcuconf.h -r platforms/chibios/STM32_F103_STM32DUINO/configs/mcuconf.h`
+ */
+
+#pragma once
+
+#include_next <mcuconf.h>
+
+#undef STM32_SPI_USE_SPI2
+#define STM32_SPI_USE_SPI2 FALSE
diff --git a/keyboards/m65/rev1/readme.md b/keyboards/m65/rev1/readme.md
new file mode 100644
index 000000000000..e69de29bb2d1
diff --git a/keyboards/m65/rev1/rules.mk b/keyboards/m65/rev1/rules.mk
new file mode 100644
index 000000000000..00f4b5d358a5
--- /dev/null
+++ b/keyboards/m65/rev1/rules.mk
@@ -0,0 +1,22 @@
+# MCU name
+MCU = STM32F103
+
+# Bootloader selection
+BOOTLOADER = stm32duino
+
+# Build Options
+#   change yes to no to disable
+#
+BOOTMAGIC_ENABLE = full     # Virtual DIP switch configuration
+MOUSEKEY_ENABLE = yes       # Mouse keys
+EXTRAKEY_ENABLE = yes       # Audio control and System control
+CONSOLE_ENABLE = yes        # Console for debug
+COMMAND_ENABLE = yes        # Commands for debug and configuration
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+SLEEP_LED_ENABLE = no       # Breathing sleep LED during USB suspend
+# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+NKRO_ENABLE = yes           # USB Nkey Rollover
+BACKLIGHT_ENABLE = no       # Enable keyboard backlight functionality
+RGBLIGHT_ENABLE = no        # Enable keyboard RGB underglow
+BLUETOOTH_ENABLE = no       # Enable Bluetooth
+AUDIO_ENABLE = no           # Audio output