diff --git a/src/main/kotlin/org/acejump/input/KeyLayout.kt b/src/main/kotlin/org/acejump/input/KeyLayout.kt
index 7527650..49c6b46 100644
--- a/src/main/kotlin/org/acejump/input/KeyLayout.kt
+++ b/src/main/kotlin/org/acejump/input/KeyLayout.kt
@@ -5,32 +5,46 @@ package org.acejump.input
  * ergonomically difficult they are to press.
  */
 @Suppress("unused", "SpellCheckingInspection")
-enum class KeyLayout(internal val rows: Array<String>, priority: String, internal val characterRemapping: Map<Char, Char> = emptyMap()) {
+enum class KeyLayout(
+  internal val rows: Array<String>,
+  priority: String,
+  private val characterSides: Pair<Set<Char>, Set<Char>> = Pair(emptySet(), emptySet()),
+  internal val characterRemapping: Map<Char, Char> = emptyMap(),
+) {
   COLEMK(arrayOf("1234567890", "qwfpgjluy", "arstdhneio", "zxcvbkm"), priority = "tndhseriaovkcmbxzgjplfuwyq5849673210"),
   WORKMN(arrayOf("1234567890", "qdrwbjfup", "ashtgyneoi", "zxmcvkl"), priority = "tnhegysoaiclvkmxzwfrubjdpq5849673210"),
   DVORAK(arrayOf("1234567890", "pyfgcrl", "aoeuidhtns", "qjkxbmwvz"), priority = "uhetidonasxkbjmqwvzgfycprl5849673210"),
   QWERTY(arrayOf("1234567890", "qwertyuiop", "asdfghjkl", "zxcvbnm"), priority = "fjghdkslavncmbxzrutyeiwoqp5849673210"),
   QWERTZ(arrayOf("1234567890", "qwertzuiop", "asdfghjkl", "yxcvbnm"), priority = "fjghdkslavncmbxyrutzeiwoqp5849673210"),
-  QWERTZ_CZ(arrayOf("1234567890", "qwertzuiop", "asdfghjkl", "yxcvbnm"), priority = "fjghdkslavncmbxyrutzeiwoqp5849673210", characterRemapping =  mapOf(
-    '+' to '1',
-    'ě' to '2',
-    'š' to '3',
-    'č' to '4',
-    'ř' to '5',
-    'ž' to '6',
-    'ý' to '7',
-    'á' to '8',
-    'í' to '9',
-    'é' to '0'
-  )),
+  QWERTZ_CZ(
+    arrayOf("1234567890", "qwertzuiop", "asdfghjkl", "yxcvbnm"),
+    priority = "fjghdkslavncmbxyrutzeiwoqp5849673210",
+    characterSides = sides("", ""),
+    characterRemapping = mapOf(
+      '+' to '1',
+      'ě' to '2',
+      'š' to '3',
+      'č' to '4',
+      'ř' to '5',
+      'ž' to '6',
+      'ý' to '7',
+      'á' to '8',
+      'í' to '9',
+      'é' to '0'
+    )
+  ),
   QGMLWY(arrayOf("1234567890", "qgmlwyfub", "dstnriaeoh", "zxcvjkp"), priority = "naterisodhvkcpjxzlfmuwygbq5849673210"),
   QGMLWB(arrayOf("1234567890", "qgmlwbyuv", "dstnriaeoh", "zxcfjkp"), priority = "naterisodhfkcpjxzlymuwbgvq5849673210"),
   NORMAN(arrayOf("1234567890", "qwdfkjurl", "asetgynioh", "zxcvbpm"), priority = "tneigysoahbvpcmxzjkufrdlwq5849673210");
   
   internal val allChars = rows.joinToString("").toCharArray().apply(CharArray::sort).joinToString("")
-  internal val allPriorities = priority.mapIndexed { index, char -> char to index }.toMap()
+  private val allPriorities = priority.mapIndexed { index, char -> char to index }.toMap()
   
   internal fun priority(): (Char) -> Int {
     return { allPriorities.getOrDefault(it, Int.MAX_VALUE) }
   }
 }
+
+private fun sides(left: String, right: String): Pair<Set<Char>, Set<Char>> {
+  return Pair(left.toCharArray().toSet(), right.toCharArray().toSet())
+}