diff --git a/ErgoDox-EZ-Shine.svg b/ErgoDox-EZ-Shine.svg
new file mode 100644
index 0000000..72d9dd7
--- /dev/null
+++ b/ErgoDox-EZ-Shine.svg
@@ -0,0 +1 @@
+v4ai
\ No newline at end of file
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..9dfd235
--- /dev/null
+++ b/README.md
@@ -0,0 +1,85 @@
+# ergodox-ez-shine-dvorak
+
+Dvorak keyboard layout for ErgoDox EZ Shine, heavily
+inspired by the key placement of the TypeMatrix 2030 USB.
+
+
+
+
+ ErgoDox EZ Shine. Illustration from ErgoDox EZ website.
+ Copyright © 2019 ZSA Technology Labs, Inc.
+
+
+
+## The what now?
+
+I've been using the [Dvorak keyboard layout](https://en.wikipedia.org/wiki/Dvorak_keyboard_layout) since 2009/2010.
+Back then I had a TypeMatrix 2030 USB. I stuck with
+TypeMatrix most of the time between then and...
+December 2017!
+
+In December 2017, I bought an [ErgoDox EZ Shine](https://ergodox-ez.com)
+(see [details below](#ergodox-ez-keyboard-model)).
+
+Using the [Oryx configurator](https://ergodox-ez.com/pages/oryx),
+I immediatelly created a custom layout for my ErgoDox EZ Shine.
+A layout that was *heavily* inspired by the key placement on
+my previous keyboard, the TypeMatrix 2030 USB.
+
+Over time I've made small adjustments to my custom layout
+in Oryx but the layout remains true to the TypeMatrix still.
+Only, it's like, *a million times better*.
+
+So anyway, time to put this configuration somewhere
+rather than just relying on the ErgoDox EZ website
+to stay up forever, eh? Hence this repo.
+
+## Have a look at the layout
+
+Look at [the PDF](configuration.pdf) included in this repo,
+or [look at the layout in Oryx](https://configure.ergodox-ez.com/ergodox-ez/layouts/PBKjJ/ZqWv6/0).
+
+## ErgoDox EZ keyboard model
+
+
+
+ Color
+ Tilt kit
+ Wing rest
+ Shine
+ Keycaps
+ Switches
+
+
+ Black
+ Yes
+ No
+ Yes
+ Blank, sculpted keycaps
+ Kailh Thick Gold
+
+
+
+## Building from source
+
+See [ergodox_ez_instructions.md](ergodox_ez_instructions.md).
+
+## Using pre-built firmware image
+
+Download firmware image using link at
+https://configure.ergodox-ez.com/ergodox-ez/layouts/PBKjJ/ZqWv6/0
+or download a copy of the same firmware image from
+https://github.com/ctsrc/ergodox-ez-shine-dvorak/releases/download/2019-11-10-ZqWv6/ergodox_ez_dvorak_PBKjJ_ZqWv6.hex
+
+SHA256 (ergodox_ez_dvorak_PBKjJ_ZqWv6.hex) = b20e3e0d19c9018d214e04258da14ffe7d324058377616aecb119d1c4b257c5d
+
+## Flashing the firmware image
+
+Use for example the flashing tool provided by ZSA Technology Labs:
+
+ * https://ergodox-ez.com/pages/wally
+ * https://github.com/zsa/wally
+
+## Copyright
+
+Portions copyright © 2019 ZSA Technology Labs, Inc.
diff --git a/configuration.pdf b/configuration.pdf
new file mode 100644
index 0000000..df591e7
Binary files /dev/null and b/configuration.pdf differ
diff --git a/ergodox_ez_instructions.md b/ergodox_ez_instructions.md
new file mode 100644
index 0000000..6f95a5d
--- /dev/null
+++ b/ergodox_ez_instructions.md
@@ -0,0 +1,14 @@
+# Building your layout from source
+
+Congratulations on taking the next step, and making use of your keyboard's open-source nature! There's so much power to unlock — this is going to be fun. :)
+
+Here are some initial pointers to get you started:
+
+- Use the documentation at [https://docs.qmk.fm/](https://docs.qmk.fm/) to set up your environment for building your firmware.
+- Build your layout against [https://github.com/zsa/qmk_firmware/](https://github.com/zsa/qmk_firmware/) which is our QMK fork (instead of qmk/qmk_firmware). This is what Oryx (the graphical configurator) uses, so it's guaranteed to work.
+- Create a folder with a simple name (no spaces!) for your layout inside the qmk_firmware/keyboards/ergodox_ez/keymaps/ folder.
+- Copy the contents of the \*\_source folder (in the .zip you downloaded from Oryx) into this folder.
+- Make sure you've set up your environment per the [QMK docs](https://docs.qmk.fm/#/newbs_getting_started?id=set-up-your-environment) so compilation would actually work.
+- From your shell, make sure your working directory is qmk*firmware, then enter the command `make ergodox_ez:_layout_`, substituting the name of the folder you created for "_layout_".
+
+Good luck on your journey! And remember, if you get stuck, you can always get back to your [original layout](https://configure.ergodox-ez.com/ergodox-ez/layouts/PBKjJ/ZqWv6/0) from Oryx.
diff --git a/src/config.h b/src/config.h
new file mode 100644
index 0000000..c468f26
--- /dev/null
+++ b/src/config.h
@@ -0,0 +1,5 @@
+/*
+ Set any config.h overrides for your specific keymap here.
+ See config.h options at https://docs.qmk.fm/#/config_options?id=the-configh-file
+*/
+#define ORYX_CONFIGURATOR
diff --git a/src/keymap.c b/src/keymap.c
new file mode 100644
index 0000000..222a85e
--- /dev/null
+++ b/src/keymap.c
@@ -0,0 +1,159 @@
+#include QMK_KEYBOARD_H
+#include "version.h"
+#include "keymap_german.h"
+#include "keymap_nordic.h"
+#include "keymap_french.h"
+#include "keymap_spanish.h"
+#include "keymap_hungarian.h"
+#include "keymap_swedish.h"
+#include "keymap_br_abnt2.h"
+#include "keymap_canadian_multilingual.h"
+#include "keymap_german_ch.h"
+#include "keymap_jp.h"
+
+#define KC_MAC_UNDO LGUI(KC_Z)
+#define KC_MAC_CUT LGUI(KC_X)
+#define KC_MAC_COPY LGUI(KC_C)
+#define KC_MAC_PASTE LGUI(KC_V)
+#define KC_PC_UNDO LCTL(KC_Z)
+#define KC_PC_CUT LCTL(KC_X)
+#define KC_PC_COPY LCTL(KC_C)
+#define KC_PC_PASTE LCTL(KC_V)
+#define ES_LESS_MAC KC_GRAVE
+#define ES_GRTR_MAC LSFT(KC_GRAVE)
+#define ES_BSLS_MAC ALGR(KC_6)
+#define NO_PIPE_ALT KC_GRAVE
+#define NO_BSLS_ALT KC_EQUAL
+
+enum custom_keycodes {
+ RGB_SLD = EZ_SAFE_RANGE,
+ HSV_172_255_255,
+ HSV_86_255_128,
+ HSV_27_255_255,
+ HSV_215_255_128,
+ HSV_0_255_255,
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT_ergodox_pretty(
+ KC_GRAVE, KC_1, KC_2, KC_3, KC_4, KC_5, KC_DELETE, KC_DELETE, KC_6, KC_7, KC_8, KC_9, KC_0, KC_EQUAL,
+ KC_TAB, KC_QUOTE, KC_COMMA, KC_DOT, KC_P, KC_Y, KC_BSPACE, KC_BSPACE, KC_F, KC_G, KC_C, KC_R, KC_L, KC_QUES,
+ LCTL_T(KC_ESCAPE),KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_TRANSPARENT,
+ KC_LSHIFT, KC_SCOLON, KC_Q, KC_J, KC_K, KC_X, KC_ENTER, KC_ENTER, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_BSLASH,
+ MO(1), KC_TRANSPARENT, KC_TRANSPARENT, KC_LALT, KC_TRANSPARENT, KC_TRANSPARENT, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT,
+ KC_KP_SLASH, KC_MINUS, KC_PLUS, KC_KP_ASTERISK,
+ KC_TRANSPARENT, KC_TRANSPARENT,
+ KC_SPACE, KC_LGUI, MO(1), KC_TRANSPARENT, KC_RGUI, KC_SPACE
+ ),
+ [1] = LAYOUT_ergodox_pretty(
+ KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_TRANSPARENT, KC_TRANSPARENT, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,
+ KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_LBRACKET, KC_RBRACKET, KC_TRANSPARENT, KC_TRANSPARENT,
+ KC_TRANSPARENT, HSV_172_255_255,HSV_86_255_128, HSV_27_255_255, HSV_215_255_128,HSV_0_255_255, KC_TRANSPARENT, KC_LPRN, KC_LCBR, KC_RCBR, KC_RPRN, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT,
+ RGB_HUD, RGB_HUI, RGB_VAI, RGB_VAD,
+ KC_TRANSPARENT, KC_TRANSPARENT,
+ KC_TRANSPARENT, RGB_SLD, KC_TRANSPARENT, KC_TRANSPARENT, RGB_MOD, KC_TRANSPARENT
+ ),
+};
+
+
+bool suspended = false;
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ switch (keycode) {
+ case RGB_SLD:
+ if (record->event.pressed) {
+ rgblight_mode(1);
+ }
+ return false;
+ case HSV_172_255_255:
+ if (record->event.pressed) {
+ #ifdef RGBLIGHT_ENABLE
+ rgblight_enable();
+ rgblight_mode(1);
+ rgblight_sethsv(172,255,255);
+ #endif
+ }
+ return false;
+ case HSV_86_255_128:
+ if (record->event.pressed) {
+ #ifdef RGBLIGHT_ENABLE
+ rgblight_enable();
+ rgblight_mode(1);
+ rgblight_sethsv(86,255,128);
+ #endif
+ }
+ return false;
+ case HSV_27_255_255:
+ if (record->event.pressed) {
+ #ifdef RGBLIGHT_ENABLE
+ rgblight_enable();
+ rgblight_mode(1);
+ rgblight_sethsv(27,255,255);
+ #endif
+ }
+ return false;
+ case HSV_215_255_128:
+ if (record->event.pressed) {
+ #ifdef RGBLIGHT_ENABLE
+ rgblight_enable();
+ rgblight_mode(1);
+ rgblight_sethsv(215,255,128);
+ #endif
+ }
+ return false;
+ case HSV_0_255_255:
+ if (record->event.pressed) {
+ #ifdef RGBLIGHT_ENABLE
+ rgblight_enable();
+ rgblight_mode(1);
+ rgblight_sethsv(0,255,255);
+ #endif
+ }
+ return false;
+ }
+ return true;
+}
+
+uint32_t layer_state_set_user(uint32_t state) {
+
+ uint8_t layer = biton32(state);
+
+ ergodox_board_led_off();
+ ergodox_right_led_1_off();
+ ergodox_right_led_2_off();
+ ergodox_right_led_3_off();
+ switch (layer) {
+ case 1:
+ ergodox_right_led_1_on();
+ break;
+ case 2:
+ ergodox_right_led_2_on();
+ break;
+ case 3:
+ ergodox_right_led_3_on();
+ break;
+ case 4:
+ ergodox_right_led_1_on();
+ ergodox_right_led_2_on();
+ break;
+ case 5:
+ ergodox_right_led_1_on();
+ ergodox_right_led_3_on();
+ break;
+ case 6:
+ ergodox_right_led_2_on();
+ ergodox_right_led_3_on();
+ break;
+ case 7:
+ ergodox_right_led_1_on();
+ ergodox_right_led_2_on();
+ ergodox_right_led_3_on();
+ break;
+ default:
+ break;
+ }
+ return state;
+
+};
diff --git a/src/rules.mk b/src/rules.mk
new file mode 100644
index 0000000..4ceccd6
--- /dev/null
+++ b/src/rules.mk
@@ -0,0 +1,5 @@
+# Set any rules.mk overrides for your specific keymap here.
+# See rules at https://docs.qmk.fm/#/config_options?id=the-rulesmk-file
+LINK_TIME_OPTIMIZATION_ENABLE = yes
+COMMAND_ENABLE = no
+MOUSEKEY_ENABLE = no