diff --git a/common/test/keyboards/invalid/README.md b/common/test/keyboards/invalid/README.md
index 80c09d3240..e9ef0bd4b5 100644
--- a/common/test/keyboards/invalid/README.md
+++ b/common/test/keyboards/invalid/README.md
@@ -1,29 +1,43 @@
-#-----------------------------------------
-# Tests for kmcompxtest()
-#-----------------------------------------
+# **Tests for kmcompxtest()**
+
This folder contains several kmn-files that are used for testing resulting Errorcodes.
-These tests are all copied from balochi_phonetic and contain alterations of the data to produce (at least) 1 Error.
-#-----------------------------------------
-# Naming Convention:
-# CERR_404D_balochi_phonetic.kmn
-#-----------------------------------------
+Most of these tests are copied from balochi_phonetic and contain alterations of the data to produce (at least) 1 Error.
+
+
+
+---
+
+## Naming Convention of kmn-files for using with kmcompxtest()
+
+ CERR_404D_balochi_phonetic.kmn
+
The naming convention of the files is as follows:
-All Files MUST start with CERR_ followed by 4 characters and an underscore.
-After the second underscore all combination of char can be used.
-The 4 characters following CERR_ correspond to the last 4 digits of the Error-Code which is expected to be produced by this file.
-( e.g. CERR_404D_balochi_phonetic.kmn should produce Error 0x0000404D).
+* All Files **MUST** start with CERR_ followed by 4 characters and an underscore.
-#-----------------------------------------
-While running kmcompxtest extracts the 4 chars of the Filename and compares them to the actual Error found.
-If they correspond the test will be marked as OK. (Code 0)
-If the file is supposed to produce an Error and does not the test will be marked as FAILED (Code 1)
-If the filename is not correct the test will be marked as FAILED (Code 99)
-If more than 1 Error is produced only the Error coded in the Filename will be detected
-#-----------------------------------------
+* After the second underscore all combination of char can be used.
+
+* The 4 characters following CERR_ correspond to the last 4 digits of the Error-Code which is expected to be produced by this file.
+
+ ( e.g. CERR_404D_balochi_phonetic.kmn should produce Error 0x0000404D).
+
+
+
+---
+
+
+While running kmcompxtest extracts the 4 chars from the Filename and compares them to the actual Error found.
+
+* If they correspond the test will be marked as OK. (Code 0)
+
+* If the file is supposed to produce an Error and does not the test will be marked as FAILED (Code 1)
+
+* If the filename is not correct the test will be marked as FAILED (Code 1)
+
+* If more than 1 Error is produced only the Error coded in the Filename will be detected
diff --git a/common/test/keyboards/invalid/source/CERR_1234_sil_yoruba8_WrongCopyrightChar_and_WrongErrNrInName.kmn b/common/test/keyboards/invalid/source/CERR_1234_sil_yoruba8_WrongCopyrightChar_and_WrongErrNrInName.kmn
new file mode 100644
index 0000000000..eea1792795
--- /dev/null
+++ b/common/test/keyboards/invalid/source/CERR_1234_sil_yoruba8_WrongCopyrightChar_and_WrongErrNrInName.kmn
@@ -0,0 +1,271 @@
+c ***** This test will produce 2 Errors: ***************************
+c ***** 1) it will be marked as FAIL when run in kmcompxtest *******
+c ***** as a non-existing ErrorNr (0x00001234) is specified *****
+c ***** 2) CERR_InvalidCharacter 0x00004034 will be produced *******
+c ******************************************************************
+
+store(&VERSION) '10.0'
+c ***** CERR_InvalidCharacter 0x00004034 ***************************
+store(&NAME) 'Yorb 8'
+store(&MESSAGE) 'A simple Unicode keyboard for Yorb, with the option to use either the modern dot or the traditional bar under the letters e, o, and s.'
+store(©RIGHT) ' 2012-2020 SIL International'
+c ******************************************************************
+store(&mnemoniclayout) '1'
+0024
+c store(&WINDOWSLANGUAGES) 'x046A'
+c store(&LANGUAGE) 'x046A'
+c store(ÐNOLOGUECODE) 'yor'
+
+store(&BITMAP) 'sil_yoruba8.ico'
+store(&VISUALKEYBOARD) 'sil_yoruba8.kvks'
+store(&TARGETS) 'desktop'
+store(&KEYBOARDVERSION) '1.1'
+
+begin Unicode > use(main)
+
+group(main) using keys
+c ===========
+c ==Options==
+c ===========
+store(style) 'dot'
+if(style='dot') + [CTRL '.'] > set(style='bar')
+if(style='bar') + [CTRL '.'] > set(style='dot')
+
+c ==========
+c ==Stores==
+c ==========
+c Letters
+store(base) 'a' 'e' 'i' 'o' 'u' 'A' 'E' 'I' 'O' 'U'
+store(grv) U+00E0 U+00E8 U+00EC U+00F2 U+00F9 U+00C0 U+00C8 U+00CC U+00D2 U+00D9
+store(act) U+00E1 U+00E9 U+00ED U+00F3 U+00FA U+00C1 U+00C9 U+00CD U+00D3 U+00DA
+store(crc) U+00E2 U+00EA U+00EE U+00F4 U+00FB U+00C2 U+00CA U+00CE U+00D4 U+00DB
+store(crn) U+01CE U+011B U+01D0 U+01D2 U+01D4 U+01CD U+011A U+01CF U+01D1 U+01D3
+store(mac) U+0101 U+0113 U+012B U+014D U+016B U+0100 U+0112 U+012A U+014C U+016A
+
+store(grv.all) outs(base) outs(grv) outs(grv) outs(grv) outs(grv) outs(grv)
+store(act.all) outs(base) outs(act) outs(act) outs(act) outs(act) outs(act)
+store(crc.all) outs(base) outs(crc) outs(crc) outs(crc) outs(crc) outs(crc)
+store(crn.all) outs(base) outs(crn) outs(crn) outs(crn) outs(crn) outs(crn)
+store(mac.all) outs(base) outs(mac) outs(mac) outs(mac) outs(mac) outs(mac)
+
+store(not.grv) outs(grv) outs(base) outs(act) outs(crc) outs(crn) outs(mac)
+store(not.act) outs(act) outs(base) outs(grv) outs(crc) outs(crn) outs(mac)
+store(not.crc) outs(crc) outs(base) outs(grv) outs(act) outs(crn) outs(mac)
+store(not.crn) outs(crn) outs(base) outs(grv) outs(act) outs(crc) outs(mac)
+store(not.mac) outs(mac) outs(base) outs(grv) outs(act) outs(crc) outs(crn)
+
+store(bar) 'e' 'o' 's' 'E' 'O' 'S'
+store(v.bar) 'e' 'o' 'E' 'O'
+
+store(dot) U+1EB9 U+1ECD U+1EB8 U+1ECC
+store(nsl) 'm' 'n' 'M' 'N'
+store(dot+nsl) outs(dot) outs(nsl)
+
+c Accents
+store(ac.grv) U+0300
+store(ac.act) U+0301
+store(ac.crc) U+0302
+store(ac.crn) U+030C
+store(ac.mac) U+0304
+
+store(ac.all) outs(ac.grv) outs(ac.act) outs(ac.crc) outs(ac.crn) outs(ac.mac)
+
+store(ac.grv.all) nul outs(ac.grv) outs(ac.grv) outs(ac.grv) outs(ac.grv)
+store(ac.act.all) nul outs(ac.act) outs(ac.act) outs(ac.act) outs(ac.act)
+store(ac.crc.all) nul outs(ac.crc) outs(ac.crc) outs(ac.crc) outs(ac.crc)
+store(ac.crn.all) nul outs(ac.crn) outs(ac.crn) outs(ac.crn) outs(ac.crn)
+store(ac.mac.all) nul outs(ac.mac) outs(ac.mac) outs(ac.mac) outs(ac.mac)
+
+store(not.ac.grv) outs(ac.grv) outs(ac.act) outs(ac.crc) outs(ac.crn) outs(ac.mac)
+store(not.ac.act) outs(ac.act) outs(ac.grv) outs(ac.crc) outs(ac.crn) outs(ac.mac)
+store(not.ac.crc) outs(ac.crc) outs(ac.grv) outs(ac.act) outs(ac.crn) outs(ac.mac)
+store(not.ac.crn) outs(ac.crn) outs(ac.grv) outs(ac.act) outs(ac.crc) outs(ac.mac)
+store(not.ac.mac) outs(ac.mac) outs(ac.grv) outs(ac.act) outs(ac.crc) outs(ac.crn)
+
+c Keys
+store(key.grv) '['
+store(key.act) ']'
+store(key.crc) '{'
+store(key.crn) '}'
+store(key.mac) '|'
+
+store(key.all) outs(key.grv) outs(key.act) outs(key.crc) outs(key.crn) outs(key.mac)
+
+c ================
+c ==Basic Output==
+c ================
+c Unshifted QWERTY US
++ '=' > '='
++ '-' > '-'
++ '0' > '0'
++ '9' > '9'
++ '8' > '8'
++ '7' > '7'
++ '6' > '6'
++ '5' > '5'
++ '4' > '4'
++ '3' > '3'
++ '2' > '2'
++ '1' > '1'
++ '`' > dk(un) c types underlying character
+dk(un) + '`' > '`'
+
++ '\' > '\'
++ ']' > '' c acute accent
+dk(un) + ']' > ']'
++ '[' > '`' c grave accent
+dk(un) + '[' > '['
++ 'p' > 'p'
++ 'o' > 'o'
++ 'i' > 'i'
++ 'u' > 'u'
++ 'y' > 'y'
++ 't' > 't'
++ 'r' > 'r'
++ 'e' > 'e'
++ 'w' > 'w'
++ 'q' > 'gb'
+dk(un) + 'q' > 'q'
+'gb' + [K_BKSP] > nul
+
++ "'" > "'"
++ ';' > ';'
++ 'l' > 'l'
++ 'k' > 'k'
++ 'j' > 'j'
++ 'h' > 'h'
++ 'g' > 'g'
++ 'f' > 'f'
++ 'd' > 'd'
++ 's' > 's'
++ 'a' > 'a'
+
++ '/' > '/'
++ '.' > '.'
++ ',' > ','
++ 'm' > 'm'
++ 'n' > 'n'
++ 'b' > 'b'
+if(style='dot') + 'v' > U+1EB9
+if(style='bar') + 'v' > U+0065 U+0329
+if(style='dot') dk(un) + 'v' > 'v'
+if(style='bar') dk(un) + 'v' > 'v'
++ 'c' > 'c'
+if(style='dot') + 'x' > U+1ECD
+if(style='bar') + 'x' > U+006F U+0329
+if(style='dot') dk(un) + 'x' > 'x'
+if(style='bar') dk(un) + 'x' > 'x'
+if(style='dot') + 'z' > U+1E63
+if(style='bar') + 'z' > U+0073 U+0329
+if(style='dot') dk(un) + 'z' > 'z'
+if(style='bar') dk(un) + 'z' > 'z'
+
+c Shifted QWERTY US
++ '+' > '+'
++ '_' > '_'
++ ')' > ')'
++ '(' > '('
++ '*' > '*'
++ '&' > '&'
++ '^' > U+20A6
+dk(un) + '^' > '^'
++ '%' > '%'
++ '$' > '$'
++ '#' > '#'
++ '@' > '@'
++ '!' > '!'
++ '~' > '~'
+
++ '|' > U+02C9 c macron accent
+dk(un) + '|' > '|'
++ '}' > U+02C7 c caron accent
+dk(un) + '}' > '}'
++ '{' > U+02C6 c circumflex accent
+dk(un) + '{' > '{'
++ 'P' > 'P'
++ 'O' > 'O'
++ 'I' > 'I'
++ 'U' > 'U'
++ 'Y' > 'Y'
++ 'T' > 'T'
++ 'R' > 'R'
++ 'E' > 'E'
++ 'W' > 'W'
++ 'Q' > 'GB'
+dk(un) + 'Q' > 'Q'
+'GB' + [K_BKSP] > nul
+
++ '"' > '"'
++ ':' > ':'
++ 'L' > 'L'
++ 'K' > 'K'
++ 'J' > 'J'
++ 'H' > 'H'
++ 'G' > 'G'
++ 'F' > 'F'
++ 'D' > 'D'
++ 'S' > 'S'
++ 'A' > 'A'
+
++ '?' > '?'
++ '>' > '>'
++ '<' > '<'
++ 'M' > 'M'
++ 'N' > 'N'
++ 'B' > 'B'
+if(style='dot') + 'V' > U+1EB8
+if(style='bar') + 'V' > U+0045 U+0329
+if(style='dot') dk(un) + 'V' > 'V'
+if(style='bar') dk(un) + 'V' > 'V
++ 'C' > 'C'
+if(style='dot') + 'X' > U+1ECC
+if(style='bar') + 'X' > U+004F U+0329
+if(style='dot') dk(un) + 'X' > 'X'
+if(style='bar') dk(un) + 'X' > 'X
+if(style='dot') + 'Z' > U+1E62
+if(style='bar') + 'Z' > U+0053 U+0329
+if(style='dot') dk(un) + 'Z' > 'Z'
+if(style='bar') dk(un) + 'Z' > 'Z'
+
+c Additional: QWERTY UK
++ '' > ''
++ '' > ''
+
+c ===========
+c ==Accents==
+c ===========
+c Backspace
+any(bar) U+0329 + [K_BKSP] > nul
+any(v.bar) U+0329 any(ac.all) + [K_BKSP] > nul
+any(dot+nsl) any(ac.all) + [K_BKSP] > nul
+
+c General
+any(v.bar) U+0329 + any(key.all) > index(v.bar, 1) U+0329 index(ac.all, 3)
+any(dot+nsl) + any(key.all) > index(dot+nsl, 1) index(ac.all, 2)
+
+c Grave
+any(not.grv) + any(key.grv) > index(grv.all, 1)
+any(v.bar) U+0329 any(not.ac.grv) + any(key.grv) > index(v.bar, 1) U+0329 index(ac.grv.all, 3)
+any(dot+nsl) any(not.ac.grv) + any(key.grv) > index(dot+nsl, 1) index(ac.grv.all, 2)
+
+c Acute
+any(not.act) + any(key.act) > index(act.all, 1)
+any(v.bar) U+0329 any(not.ac.act) + any(key.act) > index(v.bar, 1) U+0329 index(ac.act.all, 3)
+any(dot+nsl) any(not.ac.act) + any(key.act) > index(dot+nsl, 1) index(ac.act.all, 2)
+
+c Circumflex
+any(not.crc) + any(key.crc) > index(crc.all, 1)
+any(v.bar) U+0329 any(not.ac.crc) + any(key.crc) > index(v.bar, 1) U+0329 index(ac.crc.all, 3)
+any(dot+nsl) any(not.ac.crc) + any(key.crc) > index(dot+nsl, 1) index(ac.crc.all, 2)
+
+c Caron
+any(not.crn) + any(key.crn) > index(crn.all, 1)
+any(v.bar) U+0329 any(not.ac.crn) + any(key.crn) > index(v.bar, 1) U+0329 index(ac.crn.all, 3)
+any(dot+nsl) any(not.ac.crn) + any(key.crn) > index(dot+nsl, 1) index(ac.crn.all, 2)
+
+c Macron
+any(not.mac) + any(key.mac) > index(mac.all, 1)
+any(v.bar) U+0329 any(not.ac.mac) + any(key.mac) > index(v.bar, 1) U+0329 index(ac.mac.all, 3)
+any(dot+nsl) any(not.ac.mac) + any(key.mac) > index(dot+nsl, 1) index(ac.mac.all, 2)
+
+c EOF
diff --git a/common/test/keyboards/invalid/source/CERR_40133_balochi_phonetic_WrongErrNrInName.kmn b/common/test/keyboards/invalid/source/CERR_40133_balochi_phonetic_WrongErrNrInName.kmn
new file mode 100644
index 0000000000..ccd8443790
--- /dev/null
+++ b/common/test/keyboards/invalid/source/CERR_40133_balochi_phonetic_WrongErrNrInName.kmn
@@ -0,0 +1,136 @@
+c ***** This test will produce 2 Errors: ***************************
+c ***** 1) it will be marked as FAIL when run in kmcompxtest *******
+c ***** as a non-existing ErrorNr (0x00040133) is specified *****
+c ***** 2) CERR_InvalidStoreLine 0x00004013 will be produced *******
+c ******************************************************************
+
+c ***** CERR_InvalidStoreLine 0x00004013 ***************************
+store(&VERSION '10.0'
+c ******************************************************************
+store(&NAME) 'Balochi Phonetic'
+store(&TARGETS) 'any'
+store(&KMW_RTL) '1'
+store(&LAYOUTFILE) 'balochi_phonetic.keyman-touch-layout'
+store(&KEYBOARDVERSION) '1.4.2'
+store(©RIGHT) '© 2017-2021 SIL International'
+store(&MESSAGE) 'The Balochi Phonetic keyboard is distributed under The MIT License (MIT).'
+store(&KMW_HELPTEXT) 'This is a phonetically organized Balochi keyboard.'
+store(&VISUALKEYBOARD) 'balochi_phonetic.kvks'
+store(&BITMAP) 'CERR__balochi_phonetic.ico'
+
+begin Unicode > use(main)
+
+group(main) using keys
++ [CTRL B08] > ''
++ [CTRL B09] > ''
++ [CTRL B10] > '–'
++ [SHIFT CTRL E11] > '“'
++ [SHIFT CTRL E12] > '”'
++ [CTRL E11] > '‘'
++ [CTRL E12] > '’'
++ [CTRL K_K] > 'ء'
++ [CTRL K_D] > 'ذ'
++ [K_EQUAL] > '='
++ [SHIFT K_8] > '*'
++ [SHIFT K_7] > '&'
++ [SHIFT K_5] > '%'
++ [SHIFT K_4] > '$'
++ [SHIFT K_3] > '#'
++ [SHIFT K_2] > '@'
++ [SHIFT K_1] > '!'
++ [SHIFT K_N] > 'ں'
++ [K_BKSLASH] > '۔'
++ [K_LBRKT] > ']'
++ [K_RBRKT] > '['
++ [K_F] > 'َ'
++ [K_V] > 'ِ'
++ [K_X] > 'ش'
++ [SHIFT K_H] > 'ح'
++ [SHIFT K_G] > 'ص'
++ [SHIFT K_Y] > 'ي'
++ [CTRL K_0] > '۰'
++ [CTRL K_9] > '۹'
++ [CTRL K_8] > '۸'
++ [CTRL K_7] > '۷'
++ [CTRL K_6] > '۶'
++ [CTRL K_5] > '۵'
++ [CTRL K_4] > '۴'
++ [CTRL K_3] > '۳'
++ [CTRL K_2] > '۲'
++ [CTRL K_1] > '۱'
++ [K_SLASH] > '/'
++ [K_HYPHEN] > '-'
++ [SHIFT K_COLON] > ':'
++ [SHIFT K_QUOTE] > '"'
++ [K_QUOTE] > U+0027
++ [K_O] > 'ُ'
++ [SHIFT K_O] > 'ْ'
++ [K_BKQUOTE] > 'ء'
++ [SHIFT K_W] > 'أ'
++ [SHIFT K_P] > 'ّ'
++ [SHIFT K_BKQUOTE] > 'ٔ'
++ [SHIFT K_J] > 'ض'
++ [SHIFT K_9] > ')'
++ [SHIFT K_RBRKT] > '{'
++ [SHIFT K_LBRKT] > '}'
++ [SHIFT K_0] > '('
++ [SHIFT K_SLASH] > '؟'
++ [SHIFT K_K] > 'ع'
++ [SHIFT K_EQUAL] > '«'
++ [SHIFT K_HYPHEN] > '»'
++ [SHIFT K_I] > 'ً'
+
++ [SHIFT K_PERIOD] > '‹'
++ [SHIFT K_COMMA] > '›'
++ [SHIFT K_L] > 'ـ'
++ [SHIFT K_U] > 'ۀ'
++ [SHIFT K_B] > 'ة'
++ [SHIFT K_M] > 'غ'
++ [SHIFT K_F] > 'ف'
++ [SHIFT K_E] > 'ۓ'
++ [SHIFT K_Q] > 'ق'
++ [K_0] > '0'
++ [K_9] > '9'
++ [K_8] > '8'
++ [K_7] > '7'
++ [K_6] > '6'
++ [K_5] > '5'
++ [K_4] > '4'
++ [K_3] > '3'
++ [K_2] > '2'
++ [K_1] > '1'
++ [K_I] > 'ێ'
++ [SHIFT K_D] > 'ڈ'
++ [K_G] > 'گ'
++ [K_U] > 'ۆ'
++ [SHIFT K_R] > 'ڑ'
++ [SHIFT K_6] > ''
++ [SHIFT K_T] > 'ٹ'
++ [SHIFT K_V] > 'ظ'
++ [SHIFT K_C] > 'ط'
++ [SHIFT K_X] > 'خ'
++ [SHIFT K_Z] > 'ژ'
++ [SHIFT K_S] > 'ث'
++ [SHIFT K_A] > 'آ'
++ [K_PERIOD] > '.'
++ [K_COMMA] > '،'
++ [K_M] > 'م'
++ [K_N] > 'ن'
++ [K_B] > 'ب'
++ [K_C] > 'چ'
++ [K_Z] > 'ز'
++ [K_P] > 'پ'
++ [K_Y] > 'ی'
++ [K_T] > 'ت'
++ [K_R] > 'ر'
++ [K_E] > 'ے'
++ [K_W] > 'و'
++ [K_Q] > 'ئ'
++ [K_COLON] > '؛'
++ [K_L] > 'ل'
++ [K_K] > 'ک'
++ [K_J] > 'ج'
++ [K_H] > 'ه'
++ [K_D] > 'د'
++ [K_S] > 'س'
++ [K_A] > 'ا'
\ No newline at end of file
diff --git a/common/test/keyboards/invalid/source/CERR_4017_balochi_phonetic.kmn b/common/test/keyboards/invalid/source/CERR_4017_balochi_phonetic.kmn
index 888df78045..ddc33aeb05 100644
--- a/common/test/keyboards/invalid/source/CERR_4017_balochi_phonetic.kmn
+++ b/common/test/keyboards/invalid/source/CERR_4017_balochi_phonetic.kmn
@@ -8,7 +8,7 @@ store(©RIGHT) '© 2017-2021 SIL International'
store(&MESSAGE) 'The Balochi Phonetic keyboard is distributed under The MIT License (MIT).'
store(&KMW_HELPTEXT) 'This is a phonetically organized Balochi keyboard.'
store(&VISUALKEYBOARD) 'balochi_phonetic.kvks'
-store(&BITMAP) 'CERR__balochi_phonetic.ico'
+store(&BITMAP) 'CERR__balochi_phonetic.bmp'
begin Unicode > use(main)
diff --git a/common/test/keyboards/invalid/source/CERR_402D_sil_yoruba8_WrongCopyrightChar_and_NoErrorThrownButErrorSpecified.kmn b/common/test/keyboards/invalid/source/CERR_402D_sil_yoruba8_WrongCopyrightChar_and_NoErrorThrownButErrorSpecified.kmn
new file mode 100644
index 0000000000..be87b95678
--- /dev/null
+++ b/common/test/keyboards/invalid/source/CERR_402D_sil_yoruba8_WrongCopyrightChar_and_NoErrorThrownButErrorSpecified.kmn
@@ -0,0 +1,271 @@
+c ***** This test will produce 2 Errors: ***************************
+c ***** 1) it will be marked as FAIL when run in kmcompxtest *******
+c ***** as the specified ErrorNr (0x0000402D) is not thrown *****
+c ***** 2) CERR_InvalidCharacter 0x00004034 will be produced *******
+c ******************************************************************
+
+store(&VERSION) '10.0'
+c ***** CERR_InvalidCharacter 0x00004034 ***************************
+store(&NAME) 'Yorb 8'
+store(&MESSAGE) 'A simple Unicode keyboard for Yorb, with the option to use either the modern dot or the traditional bar under the letters e, o, and s.'
+store(©RIGHT) ' 2012-2020 SIL International'
+c ******************************************************************
+store(&mnemoniclayout) '1'
+0024
+c store(&WINDOWSLANGUAGES) 'x046A'
+c store(&LANGUAGE) 'x046A'
+c store(ÐNOLOGUECODE) 'yor'
+
+store(&BITMAP) 'sil_yoruba8.ico'
+store(&VISUALKEYBOARD) 'sil_yoruba8.kvks'
+store(&TARGETS) 'desktop'
+store(&KEYBOARDVERSION) '1.1'
+
+begin Unicode > use(main)
+
+group(main) using keys
+c ===========
+c ==Options==
+c ===========
+store(style) 'dot'
+if(style='dot') + [CTRL '.'] > set(style='bar')
+if(style='bar') + [CTRL '.'] > set(style='dot')
+
+c ==========
+c ==Stores==
+c ==========
+c Letters
+store(base) 'a' 'e' 'i' 'o' 'u' 'A' 'E' 'I' 'O' 'U'
+store(grv) U+00E0 U+00E8 U+00EC U+00F2 U+00F9 U+00C0 U+00C8 U+00CC U+00D2 U+00D9
+store(act) U+00E1 U+00E9 U+00ED U+00F3 U+00FA U+00C1 U+00C9 U+00CD U+00D3 U+00DA
+store(crc) U+00E2 U+00EA U+00EE U+00F4 U+00FB U+00C2 U+00CA U+00CE U+00D4 U+00DB
+store(crn) U+01CE U+011B U+01D0 U+01D2 U+01D4 U+01CD U+011A U+01CF U+01D1 U+01D3
+store(mac) U+0101 U+0113 U+012B U+014D U+016B U+0100 U+0112 U+012A U+014C U+016A
+
+store(grv.all) outs(base) outs(grv) outs(grv) outs(grv) outs(grv) outs(grv)
+store(act.all) outs(base) outs(act) outs(act) outs(act) outs(act) outs(act)
+store(crc.all) outs(base) outs(crc) outs(crc) outs(crc) outs(crc) outs(crc)
+store(crn.all) outs(base) outs(crn) outs(crn) outs(crn) outs(crn) outs(crn)
+store(mac.all) outs(base) outs(mac) outs(mac) outs(mac) outs(mac) outs(mac)
+
+store(not.grv) outs(grv) outs(base) outs(act) outs(crc) outs(crn) outs(mac)
+store(not.act) outs(act) outs(base) outs(grv) outs(crc) outs(crn) outs(mac)
+store(not.crc) outs(crc) outs(base) outs(grv) outs(act) outs(crn) outs(mac)
+store(not.crn) outs(crn) outs(base) outs(grv) outs(act) outs(crc) outs(mac)
+store(not.mac) outs(mac) outs(base) outs(grv) outs(act) outs(crc) outs(crn)
+
+store(bar) 'e' 'o' 's' 'E' 'O' 'S'
+store(v.bar) 'e' 'o' 'E' 'O'
+
+store(dot) U+1EB9 U+1ECD U+1EB8 U+1ECC
+store(nsl) 'm' 'n' 'M' 'N'
+store(dot+nsl) outs(dot) outs(nsl)
+
+c Accents
+store(ac.grv) U+0300
+store(ac.act) U+0301
+store(ac.crc) U+0302
+store(ac.crn) U+030C
+store(ac.mac) U+0304
+
+store(ac.all) outs(ac.grv) outs(ac.act) outs(ac.crc) outs(ac.crn) outs(ac.mac)
+
+store(ac.grv.all) nul outs(ac.grv) outs(ac.grv) outs(ac.grv) outs(ac.grv)
+store(ac.act.all) nul outs(ac.act) outs(ac.act) outs(ac.act) outs(ac.act)
+store(ac.crc.all) nul outs(ac.crc) outs(ac.crc) outs(ac.crc) outs(ac.crc)
+store(ac.crn.all) nul outs(ac.crn) outs(ac.crn) outs(ac.crn) outs(ac.crn)
+store(ac.mac.all) nul outs(ac.mac) outs(ac.mac) outs(ac.mac) outs(ac.mac)
+
+store(not.ac.grv) outs(ac.grv) outs(ac.act) outs(ac.crc) outs(ac.crn) outs(ac.mac)
+store(not.ac.act) outs(ac.act) outs(ac.grv) outs(ac.crc) outs(ac.crn) outs(ac.mac)
+store(not.ac.crc) outs(ac.crc) outs(ac.grv) outs(ac.act) outs(ac.crn) outs(ac.mac)
+store(not.ac.crn) outs(ac.crn) outs(ac.grv) outs(ac.act) outs(ac.crc) outs(ac.mac)
+store(not.ac.mac) outs(ac.mac) outs(ac.grv) outs(ac.act) outs(ac.crc) outs(ac.crn)
+
+c Keys
+store(key.grv) '['
+store(key.act) ']'
+store(key.crc) '{'
+store(key.crn) '}'
+store(key.mac) '|'
+
+store(key.all) outs(key.grv) outs(key.act) outs(key.crc) outs(key.crn) outs(key.mac)
+
+c ================
+c ==Basic Output==
+c ================
+c Unshifted QWERTY US
++ '=' > '='
++ '-' > '-'
++ '0' > '0'
++ '9' > '9'
++ '8' > '8'
++ '7' > '7'
++ '6' > '6'
++ '5' > '5'
++ '4' > '4'
++ '3' > '3'
++ '2' > '2'
++ '1' > '1'
++ '`' > dk(un) c types underlying character
+dk(un) + '`' > '`'
+
++ '\' > '\'
++ ']' > '' c acute accent
+dk(un) + ']' > ']'
++ '[' > '`' c grave accent
+dk(un) + '[' > '['
++ 'p' > 'p'
++ 'o' > 'o'
++ 'i' > 'i'
++ 'u' > 'u'
++ 'y' > 'y'
++ 't' > 't'
++ 'r' > 'r'
++ 'e' > 'e'
++ 'w' > 'w'
++ 'q' > 'gb'
+dk(un) + 'q' > 'q'
+'gb' + [K_BKSP] > nul
+
++ "'" > "'"
++ ';' > ';'
++ 'l' > 'l'
++ 'k' > 'k'
++ 'j' > 'j'
++ 'h' > 'h'
++ 'g' > 'g'
++ 'f' > 'f'
++ 'd' > 'd'
++ 's' > 's'
++ 'a' > 'a'
+
++ '/' > '/'
++ '.' > '.'
++ ',' > ','
++ 'm' > 'm'
++ 'n' > 'n'
++ 'b' > 'b'
+if(style='dot') + 'v' > U+1EB9
+if(style='bar') + 'v' > U+0065 U+0329
+if(style='dot') dk(un) + 'v' > 'v'
+if(style='bar') dk(un) + 'v' > 'v'
++ 'c' > 'c'
+if(style='dot') + 'x' > U+1ECD
+if(style='bar') + 'x' > U+006F U+0329
+if(style='dot') dk(un) + 'x' > 'x'
+if(style='bar') dk(un) + 'x' > 'x'
+if(style='dot') + 'z' > U+1E63
+if(style='bar') + 'z' > U+0073 U+0329
+if(style='dot') dk(un) + 'z' > 'z'
+if(style='bar') dk(un) + 'z' > 'z'
+
+c Shifted QWERTY US
++ '+' > '+'
++ '_' > '_'
++ ')' > ')'
++ '(' > '('
++ '*' > '*'
++ '&' > '&'
++ '^' > U+20A6
+dk(un) + '^' > '^'
++ '%' > '%'
++ '$' > '$'
++ '#' > '#'
++ '@' > '@'
++ '!' > '!'
++ '~' > '~'
+
++ '|' > U+02C9 c macron accent
+dk(un) + '|' > '|'
++ '}' > U+02C7 c caron accent
+dk(un) + '}' > '}'
++ '{' > U+02C6 c circumflex accent
+dk(un) + '{' > '{'
++ 'P' > 'P'
++ 'O' > 'O'
++ 'I' > 'I'
++ 'U' > 'U'
++ 'Y' > 'Y'
++ 'T' > 'T'
++ 'R' > 'R'
++ 'E' > 'E'
++ 'W' > 'W'
++ 'Q' > 'GB'
+dk(un) + 'Q' > 'Q'
+'GB' + [K_BKSP] > nul
+
++ '"' > '"'
++ ':' > ':'
++ 'L' > 'L'
++ 'K' > 'K'
++ 'J' > 'J'
++ 'H' > 'H'
++ 'G' > 'G'
++ 'F' > 'F'
++ 'D' > 'D'
++ 'S' > 'S'
++ 'A' > 'A'
+
++ '?' > '?'
++ '>' > '>'
++ '<' > '<'
++ 'M' > 'M'
++ 'N' > 'N'
++ 'B' > 'B'
+if(style='dot') + 'V' > U+1EB8
+if(style='bar') + 'V' > U+0045 U+0329
+if(style='dot') dk(un) + 'V' > 'V'
+if(style='bar') dk(un) + 'V' > 'V
++ 'C' > 'C'
+if(style='dot') + 'X' > U+1ECC
+if(style='bar') + 'X' > U+004F U+0329
+if(style='dot') dk(un) + 'X' > 'X'
+if(style='bar') dk(un) + 'X' > 'X
+if(style='dot') + 'Z' > U+1E62
+if(style='bar') + 'Z' > U+0053 U+0329
+if(style='dot') dk(un) + 'Z' > 'Z'
+if(style='bar') dk(un) + 'Z' > 'Z'
+
+c Additional: QWERTY UK
++ '' > ''
++ '' > ''
+
+c ===========
+c ==Accents==
+c ===========
+c Backspace
+any(bar) U+0329 + [K_BKSP] > nul
+any(v.bar) U+0329 any(ac.all) + [K_BKSP] > nul
+any(dot+nsl) any(ac.all) + [K_BKSP] > nul
+
+c General
+any(v.bar) U+0329 + any(key.all) > index(v.bar, 1) U+0329 index(ac.all, 3)
+any(dot+nsl) + any(key.all) > index(dot+nsl, 1) index(ac.all, 2)
+
+c Grave
+any(not.grv) + any(key.grv) > index(grv.all, 1)
+any(v.bar) U+0329 any(not.ac.grv) + any(key.grv) > index(v.bar, 1) U+0329 index(ac.grv.all, 3)
+any(dot+nsl) any(not.ac.grv) + any(key.grv) > index(dot+nsl, 1) index(ac.grv.all, 2)
+
+c Acute
+any(not.act) + any(key.act) > index(act.all, 1)
+any(v.bar) U+0329 any(not.ac.act) + any(key.act) > index(v.bar, 1) U+0329 index(ac.act.all, 3)
+any(dot+nsl) any(not.ac.act) + any(key.act) > index(dot+nsl, 1) index(ac.act.all, 2)
+
+c Circumflex
+any(not.crc) + any(key.crc) > index(crc.all, 1)
+any(v.bar) U+0329 any(not.ac.crc) + any(key.crc) > index(v.bar, 1) U+0329 index(ac.crc.all, 3)
+any(dot+nsl) any(not.ac.crc) + any(key.crc) > index(dot+nsl, 1) index(ac.crc.all, 2)
+
+c Caron
+any(not.crn) + any(key.crn) > index(crn.all, 1)
+any(v.bar) U+0329 any(not.ac.crn) + any(key.crn) > index(v.bar, 1) U+0329 index(ac.crn.all, 3)
+any(dot+nsl) any(not.ac.crn) + any(key.crn) > index(dot+nsl, 1) index(ac.crn.all, 2)
+
+c Macron
+any(not.mac) + any(key.mac) > index(mac.all, 1)
+any(v.bar) U+0329 any(not.ac.mac) + any(key.mac) > index(v.bar, 1) U+0329 index(ac.mac.all, 3)
+any(dot+nsl) any(not.ac.mac) + any(key.mac) > index(dot+nsl, 1) index(ac.mac.all, 2)
+
+c EOF
diff --git a/common/test/keyboards/invalid/source/CERR_4034_balochi_phonetic.kmn b/common/test/keyboards/invalid/source/CERR_4034_balochi_phonetic.kmn
new file mode 100644
index 0000000000..c5c8306d37
--- /dev/null
+++ b/common/test/keyboards/invalid/source/CERR_4034_balochi_phonetic.kmn
@@ -0,0 +1,130 @@
+store(&VERSION) '10.0'
+store(&NAME) 'Balochi Phonetic'
+store(&TARGETS) 'any'
+store(&KMW_RTL) '1'
+store(&LAYOUTFILE) 'balochi_phonetic.keyman-touch-layout'
+store(&KEYBOARDVERSION) '1.4.2'
+c ***** CERR_InvalidCharacter 0x00004034 ***************************
+store(©RIGHT) ' 2012 U+1234 -2020 SIL International'
+c ******************************************************************
+store(&MESSAGE) 'The Balochi Phonetic keyboard is distributed under The MIT License (MIT).'
+store(&KMW_HELPTEXT) 'This is a phonetically organized Balochi keyboard.'
+store(&VISUALKEYBOARD) 'balochi_phonetic.kvks'
+store(&BITMAP) 'CERR__balochi_phonetic.ico'
+
+begin Unicode > use(main)
+
+group(main) using keys
++ [CTRL B08] > ''
++ [CTRL B09] > ''
++ [CTRL B10] > '–'
++ [SHIFT CTRL E11] > '“'
++ [SHIFT CTRL E12] > '”'
++ [CTRL E11] > '‘'
++ [CTRL E12] > '’'
++ [CTRL K_K] > 'ء'
++ [CTRL K_D] > 'ذ'
++ [K_EQUAL] > '='
++ [SHIFT K_8] > '*'
++ [SHIFT K_7] > '&'
++ [SHIFT K_5] > '%'
++ [SHIFT K_4] > '$'
++ [SHIFT K_3] > '#'
++ [SHIFT K_2] > '@'
++ [SHIFT K_1] > '!'
++ [SHIFT K_N] > 'ں'
++ [K_BKSLASH] > '۔'
++ [K_LBRKT] > ']'
++ [K_RBRKT] > '['
++ [K_F] > 'َ'
++ [K_V] > 'ِ'
++ [K_X] > 'ش'
++ [SHIFT K_H] > 'ح'
++ [SHIFT K_G] > 'ص'
++ [SHIFT K_Y] > 'ي'
++ [CTRL K_0] > '۰'
++ [CTRL K_9] > '۹'
++ [CTRL K_8] > '۸'
++ [CTRL K_7] > '۷'
++ [CTRL K_6] > '۶'
++ [CTRL K_5] > '۵'
++ [CTRL K_4] > '۴'
++ [CTRL K_3] > '۳'
++ [CTRL K_2] > '۲'
++ [CTRL K_1] > '۱'
++ [K_SLASH] > '/'
++ [K_HYPHEN] > '-'
++ [SHIFT K_COLON] > ':'
++ [SHIFT K_QUOTE] > '"'
++ [K_QUOTE] > U+0027
++ [K_O] > 'ُ'
++ [SHIFT K_O] > 'ْ'
++ [K_BKQUOTE] > 'ء'
++ [SHIFT K_W] > 'أ'
++ [SHIFT K_P] > 'ّ'
++ [SHIFT K_BKQUOTE] > 'ٔ'
++ [SHIFT K_J] > 'ض'
++ [SHIFT K_9] > ')'
++ [SHIFT K_RBRKT] > '{'
++ [SHIFT K_LBRKT] > '}'
++ [SHIFT K_0] > '('
++ [SHIFT K_SLASH] > '؟'
++ [SHIFT K_K] > 'ع'
++ [SHIFT K_EQUAL] > '«'
++ [SHIFT K_HYPHEN] > '»'
++ [SHIFT K_I] > 'ً'
+
++ [SHIFT K_PERIOD] > '‹'
++ [SHIFT K_COMMA] > '›'
++ [SHIFT K_L] > 'ـ'
++ [SHIFT K_U] > 'ۀ'
++ [SHIFT K_B] > 'ة'
++ [SHIFT K_M] > 'غ'
++ [SHIFT K_F] > 'ف'
++ [SHIFT K_E] > 'ۓ'
++ [SHIFT K_Q] > 'ق'
++ [K_0] > '0'
++ [K_9] > '9'
++ [K_8] > '8'
++ [K_7] > '7'
++ [K_6] > '6'
++ [K_5] > '5'
++ [K_4] > '4'
++ [K_3] > '3'
++ [K_2] > '2'
++ [K_1] > '1'
++ [K_I] > 'ێ'
++ [SHIFT K_D] > 'ڈ'
++ [K_G] > 'گ'
++ [K_U] > 'ۆ'
++ [SHIFT K_R] > 'ڑ'
++ [SHIFT K_6] > ''
++ [SHIFT K_T] > 'ٹ'
++ [SHIFT K_V] > 'ظ'
++ [SHIFT K_C] > 'ط'
++ [SHIFT K_X] > 'خ'
++ [SHIFT K_Z] > 'ژ'
++ [SHIFT K_S] > 'ث'
++ [SHIFT K_A] > 'آ'
++ [K_PERIOD] > '.'
++ [K_COMMA] > '،'
++ [K_M] > 'م'
++ [K_N] > 'ن'
++ [K_B] > 'ب'
++ [K_C] > 'چ'
++ [K_Z] > 'ز'
++ [K_P] > 'پ'
++ [K_Y] > 'ی'
++ [K_T] > 'ت'
++ [K_R] > 'ر'
++ [K_E] > 'ے'
++ [K_W] > 'و'
++ [K_Q] > 'ئ'
++ [K_COLON] > '؛'
++ [K_L] > 'ل'
++ [K_K] > 'ک'
++ [K_J] > 'ج'
++ [K_H] > 'ه'
++ [K_D] > 'د'
++ [K_S] > 'س'
++ [K_A] > 'ا'
\ No newline at end of file
diff --git a/common/test/keyboards/invalid/source/CERR_4040_balochi_phonetic_WithNoErrorThrownButErrorSpecified.kmn b/common/test/keyboards/invalid/source/CERR_4040_balochi_phonetic_WithNoErrorThrownButErrorSpecified.kmn
new file mode 100644
index 0000000000..ffc982a3a2
--- /dev/null
+++ b/common/test/keyboards/invalid/source/CERR_4040_balochi_phonetic_WithNoErrorThrownButErrorSpecified.kmn
@@ -0,0 +1,133 @@
+c ***** This test will produce 1 Error: ****************************
+c ***** It will be marked as FAIL when run in kmcompxtest **********
+c ***** as a non-existing ErrorNr (0x00001234) is specified *****
+c ***** 2) CERR_InvalidCharacter 0x00004034 will be produced *******
+c ******************************************************************
+store(&VERSION) '10.0'
+store(&NAME) 'Balochi Phonetic'
+store(&TARGETS) 'any'
+store(&KMW_RTL) '1'
+store(&LAYOUTFILE) 'balochi_phonetic.keyman-touch-layout'
+store(&KEYBOARDVERSION) '1.5'
+store(©RIGHT) '© SIL International'
+store(&MESSAGE) 'The Balochi Phonetic keyboard is distributed under The MIT License (MIT).'
+store(&KMW_HELPTEXT) 'This is a phonetically organized Balochi keyboard.'
+store(&VISUALKEYBOARD) 'balochi_phonetic.kvks'
+store(&BITMAP) 'balochi__phonetic.ico'
+
+begin Unicode > use(main)
+
+group(main) using keys
++ [CTRL B08] > ''
++ [CTRL B09] > ''
++ [CTRL B10] > '–'
++ [SHIFT CTRL E11] > '“'
++ [SHIFT CTRL E12] > '”'
++ [CTRL E11] > '‘'
++ [CTRL E12] > '’'
++ [CTRL K_K] > 'ء'
++ [CTRL K_D] > 'ذ'
++ [K_EQUAL] > '='
++ [SHIFT K_8] > '*'
++ [SHIFT K_7] > '&'
++ [SHIFT K_5] > '%'
++ [SHIFT K_4] > '$'
++ [SHIFT K_3] > '#'
++ [SHIFT K_2] > '@'
++ [SHIFT K_1] > '!'
++ [SHIFT K_N] > 'ں'
++ [K_BKSLASH] > '۔'
++ [K_LBRKT] > ']'
++ [K_RBRKT] > '['
++ [K_F] > 'َ'
++ [K_V] > 'ِ'
++ [K_X] > 'ش'
++ [SHIFT K_H] > 'ح'
++ [SHIFT K_G] > 'ص'
++ [SHIFT K_Y] > 'ي'
++ [CTRL K_0] > '۰'
++ [CTRL K_9] > '۹'
++ [CTRL K_8] > '۸'
++ [CTRL K_7] > '۷'
++ [CTRL K_6] > '۶'
++ [CTRL K_5] > '۵'
++ [CTRL K_4] > '۴'
++ [CTRL K_3] > '۳'
++ [CTRL K_2] > '۲'
++ [CTRL K_1] > '۱'
++ [K_SLASH] > '/'
++ [K_HYPHEN] > '-'
++ [SHIFT K_COLON] > ':'
++ [SHIFT K_QUOTE] > '"'
++ [K_QUOTE] > U+0027
++ [K_O] > 'ُ'
++ [SHIFT K_O] > 'ْ'
++ [K_BKQUOTE] > 'ء'
++ [SHIFT K_W] > 'أ'
++ [SHIFT K_P] > 'ّ'
++ [SHIFT K_BKQUOTE] > 'ٔ'
++ [SHIFT K_J] > 'ض'
++ [SHIFT K_9] > ')'
++ [SHIFT K_RBRKT] > '{'
++ [SHIFT K_LBRKT] > '}'
++ [SHIFT K_0] > '('
++ [SHIFT K_SLASH] > '؟'
++ [SHIFT K_K] > 'ع'
++ [SHIFT K_EQUAL] > '«'
++ [SHIFT K_HYPHEN] > '»'
++ [SHIFT K_I] > 'ً'
+
++ [SHIFT K_PERIOD] > '‹'
++ [SHIFT K_COMMA] > '›'
++ [SHIFT K_L] > 'ـ'
++ [SHIFT K_U] > 'ۀ'
++ [SHIFT K_B] > 'ة'
++ [SHIFT K_M] > 'غ'
++ [SHIFT K_F] > 'ف'
++ [SHIFT K_E] > 'ۓ'
++ [SHIFT K_Q] > 'ق'
++ [K_0] > '0'
++ [K_9] > '9'
++ [K_8] > '8'
++ [K_7] > '7'
++ [K_6] > '6'
++ [K_5] > '5'
++ [K_4] > '4'
++ [K_3] > '3'
++ [K_2] > '2'
++ [K_1] > '1'
++ [K_I] > 'ێ'
++ [SHIFT K_D] > 'ڈ'
++ [K_G] > 'گ'
++ [K_U] > 'ۆ'
++ [SHIFT K_R] > 'ڑ'
++ [SHIFT K_6] > ''
++ [SHIFT K_T] > 'ٹ'
++ [SHIFT K_V] > 'ظ'
++ [SHIFT K_C] > 'ط'
++ [SHIFT K_X] > 'خ'
++ [SHIFT K_Z] > 'ژ'
++ [SHIFT K_S] > 'ث'
++ [SHIFT K_A] > 'آ'
++ [K_PERIOD] > '.'
++ [K_COMMA] > '،'
++ [K_M] > 'م'
++ [K_N] > 'ن'
++ [K_B] > 'ب'
++ [K_C] > 'چ'
++ [K_Z] > 'ز'
++ [K_P] > 'پ'
++ [K_Y] > 'ی'
++ [K_T] > 'ت'
++ [K_R] > 'ر'
++ [K_E] > 'ے'
++ [K_W] > 'و'
++ [K_Q] > 'ئ'
++ [K_COLON] > '؛'
++ [K_L] > 'ل'
++ [K_K] > 'ک'
++ [K_J] > 'ج'
++ [K_H] > 'ه'
++ [K_D] > 'د'
++ [K_S] > 'س'
++ [K_A] > 'ا'
diff --git a/common/test/keyboards/invalid/source/sil_yoruba8_WrongCopyrightChar_AndMissingErNrInName.kmn b/common/test/keyboards/invalid/source/sil_yoruba8_WrongCopyrightChar_AndMissingErNrInName.kmn
new file mode 100644
index 0000000000..7ef467b31d
--- /dev/null
+++ b/common/test/keyboards/invalid/source/sil_yoruba8_WrongCopyrightChar_AndMissingErNrInName.kmn
@@ -0,0 +1,272 @@
+c ***** This test will produce 2 Errors: ***************************
+c ***** 1) it will be marked as FAIL when run in kmcompxtest *******
+c ***** as it does not specify an Error + Nr ( no CERR_xxxx) ****
+c ***** 2) CERR_InvalidCharacter 0x00004034 will be produced *******
+c ******************************************************************
+
+store(&VERSION) '10.0'
+c ***** CERR_InvalidCharacter 0x00004034 ***************************
+store(&NAME) 'Yorb 8'
+store(&MESSAGE) 'A simple Unicode keyboard for Yorb, with the option to use either the modern dot or the traditional bar under the letters e, o, and s.'
+store(©RIGHT) ' 2012-2020 SIL International'
+c ******************************************************************
+
+store(&mnemoniclayout) '1'
+
+c store(&WINDOWSLANGUAGES) 'x046A'
+c store(&LANGUAGE) 'x046A'
+c store(ÐNOLOGUECODE) 'yor'
+
+store(&BITMAP) 'sil_yoruba8.ico'
+store(&VISUALKEYBOARD) 'sil_yoruba8.kvks'
+store(&TARGETS) 'desktop'
+store(&KEYBOARDVERSION) '1.1'
+
+begin Unicode > use(main)
+
+group(main) using keys
+c ===========
+c ==Options==
+c ===========
+store(style) 'dot'
+if(style='dot') + [CTRL '.'] > set(style='bar')
+if(style='bar') + [CTRL '.'] > set(style='dot')
+
+c ==========
+c ==Stores==
+c ==========
+c Letters
+store(base) 'a' 'e' 'i' 'o' 'u' 'A' 'E' 'I' 'O' 'U'
+store(grv) U+00E0 U+00E8 U+00EC U+00F2 U+00F9 U+00C0 U+00C8 U+00CC U+00D2 U+00D9
+store(act) U+00E1 U+00E9 U+00ED U+00F3 U+00FA U+00C1 U+00C9 U+00CD U+00D3 U+00DA
+store(crc) U+00E2 U+00EA U+00EE U+00F4 U+00FB U+00C2 U+00CA U+00CE U+00D4 U+00DB
+store(crn) U+01CE U+011B U+01D0 U+01D2 U+01D4 U+01CD U+011A U+01CF U+01D1 U+01D3
+store(mac) U+0101 U+0113 U+012B U+014D U+016B U+0100 U+0112 U+012A U+014C U+016A
+
+store(grv.all) outs(base) outs(grv) outs(grv) outs(grv) outs(grv) outs(grv)
+store(act.all) outs(base) outs(act) outs(act) outs(act) outs(act) outs(act)
+store(crc.all) outs(base) outs(crc) outs(crc) outs(crc) outs(crc) outs(crc)
+store(crn.all) outs(base) outs(crn) outs(crn) outs(crn) outs(crn) outs(crn)
+store(mac.all) outs(base) outs(mac) outs(mac) outs(mac) outs(mac) outs(mac)
+
+store(not.grv) outs(grv) outs(base) outs(act) outs(crc) outs(crn) outs(mac)
+store(not.act) outs(act) outs(base) outs(grv) outs(crc) outs(crn) outs(mac)
+store(not.crc) outs(crc) outs(base) outs(grv) outs(act) outs(crn) outs(mac)
+store(not.crn) outs(crn) outs(base) outs(grv) outs(act) outs(crc) outs(mac)
+store(not.mac) outs(mac) outs(base) outs(grv) outs(act) outs(crc) outs(crn)
+
+store(bar) 'e' 'o' 's' 'E' 'O' 'S'
+store(v.bar) 'e' 'o' 'E' 'O'
+
+store(dot) U+1EB9 U+1ECD U+1EB8 U+1ECC
+store(nsl) 'm' 'n' 'M' 'N'
+store(dot+nsl) outs(dot) outs(nsl)
+
+c Accents
+store(ac.grv) U+0300
+store(ac.act) U+0301
+store(ac.crc) U+0302
+store(ac.crn) U+030C
+store(ac.mac) U+0304
+
+store(ac.all) outs(ac.grv) outs(ac.act) outs(ac.crc) outs(ac.crn) outs(ac.mac)
+
+store(ac.grv.all) nul outs(ac.grv) outs(ac.grv) outs(ac.grv) outs(ac.grv)
+store(ac.act.all) nul outs(ac.act) outs(ac.act) outs(ac.act) outs(ac.act)
+store(ac.crc.all) nul outs(ac.crc) outs(ac.crc) outs(ac.crc) outs(ac.crc)
+store(ac.crn.all) nul outs(ac.crn) outs(ac.crn) outs(ac.crn) outs(ac.crn)
+store(ac.mac.all) nul outs(ac.mac) outs(ac.mac) outs(ac.mac) outs(ac.mac)
+
+store(not.ac.grv) outs(ac.grv) outs(ac.act) outs(ac.crc) outs(ac.crn) outs(ac.mac)
+store(not.ac.act) outs(ac.act) outs(ac.grv) outs(ac.crc) outs(ac.crn) outs(ac.mac)
+store(not.ac.crc) outs(ac.crc) outs(ac.grv) outs(ac.act) outs(ac.crn) outs(ac.mac)
+store(not.ac.crn) outs(ac.crn) outs(ac.grv) outs(ac.act) outs(ac.crc) outs(ac.mac)
+store(not.ac.mac) outs(ac.mac) outs(ac.grv) outs(ac.act) outs(ac.crc) outs(ac.crn)
+
+c Keys
+store(key.grv) '['
+store(key.act) ']'
+store(key.crc) '{'
+store(key.crn) '}'
+store(key.mac) '|'
+
+store(key.all) outs(key.grv) outs(key.act) outs(key.crc) outs(key.crn) outs(key.mac)
+
+c ================
+c ==Basic Output==
+c ================
+c Unshifted QWERTY US
++ '=' > '='
++ '-' > '-'
++ '0' > '0'
++ '9' > '9'
++ '8' > '8'
++ '7' > '7'
++ '6' > '6'
++ '5' > '5'
++ '4' > '4'
++ '3' > '3'
++ '2' > '2'
++ '1' > '1'
++ '`' > dk(un) c types underlying character
+dk(un) + '`' > '`'
+
++ '\' > '\'
++ ']' > '' c acute accent
+dk(un) + ']' > ']'
++ '[' > '`' c grave accent
+dk(un) + '[' > '['
++ 'p' > 'p'
++ 'o' > 'o'
++ 'i' > 'i'
++ 'u' > 'u'
++ 'y' > 'y'
++ 't' > 't'
++ 'r' > 'r'
++ 'e' > 'e'
++ 'w' > 'w'
++ 'q' > 'gb'
+dk(un) + 'q' > 'q'
+'gb' + [K_BKSP] > nul
+
++ "'" > "'"
++ ';' > ';'
++ 'l' > 'l'
++ 'k' > 'k'
++ 'j' > 'j'
++ 'h' > 'h'
++ 'g' > 'g'
++ 'f' > 'f'
++ 'd' > 'd'
++ 's' > 's'
++ 'a' > 'a'
+
++ '/' > '/'
++ '.' > '.'
++ ',' > ','
++ 'm' > 'm'
++ 'n' > 'n'
++ 'b' > 'b'
+if(style='dot') + 'v' > U+1EB9
+if(style='bar') + 'v' > U+0065 U+0329
+if(style='dot') dk(un) + 'v' > 'v'
+if(style='bar') dk(un) + 'v' > 'v'
++ 'c' > 'c'
+if(style='dot') + 'x' > U+1ECD
+if(style='bar') + 'x' > U+006F U+0329
+if(style='dot') dk(un) + 'x' > 'x'
+if(style='bar') dk(un) + 'x' > 'x'
+if(style='dot') + 'z' > U+1E63
+if(style='bar') + 'z' > U+0073 U+0329
+if(style='dot') dk(un) + 'z' > 'z'
+if(style='bar') dk(un) + 'z' > 'z'
+
+c Shifted QWERTY US
++ '+' > '+'
++ '_' > '_'
++ ')' > ')'
++ '(' > '('
++ '*' > '*'
++ '&' > '&'
++ '^' > U+20A6
+dk(un) + '^' > '^'
++ '%' > '%'
++ '$' > '$'
++ '#' > '#'
++ '@' > '@'
++ '!' > '!'
++ '~' > '~'
+
++ '|' > U+02C9 c macron accent
+dk(un) + '|' > '|'
++ '}' > U+02C7 c caron accent
+dk(un) + '}' > '}'
++ '{' > U+02C6 c circumflex accent
+dk(un) + '{' > '{'
++ 'P' > 'P'
++ 'O' > 'O'
++ 'I' > 'I'
++ 'U' > 'U'
++ 'Y' > 'Y'
++ 'T' > 'T'
++ 'R' > 'R'
++ 'E' > 'E'
++ 'W' > 'W'
++ 'Q' > 'GB'
+dk(un) + 'Q' > 'Q'
+'GB' + [K_BKSP] > nul
+
++ '"' > '"'
++ ':' > ':'
++ 'L' > 'L'
++ 'K' > 'K'
++ 'J' > 'J'
++ 'H' > 'H'
++ 'G' > 'G'
++ 'F' > 'F'
++ 'D' > 'D'
++ 'S' > 'S'
++ 'A' > 'A'
+
++ '?' > '?'
++ '>' > '>'
++ '<' > '<'
++ 'M' > 'M'
++ 'N' > 'N'
++ 'B' > 'B'
+if(style='dot') + 'V' > U+1EB8
+if(style='bar') + 'V' > U+0045 U+0329
+if(style='dot') dk(un) + 'V' > 'V'
+if(style='bar') dk(un) + 'V' > 'V
++ 'C' > 'C'
+if(style='dot') + 'X' > U+1ECC
+if(style='bar') + 'X' > U+004F U+0329
+if(style='dot') dk(un) + 'X' > 'X'
+if(style='bar') dk(un) + 'X' > 'X
+if(style='dot') + 'Z' > U+1E62
+if(style='bar') + 'Z' > U+0053 U+0329
+if(style='dot') dk(un) + 'Z' > 'Z'
+if(style='bar') dk(un) + 'Z' > 'Z'
+
+c Additional: QWERTY UK
++ '' > ''
++ '' > ''
+
+c ===========
+c ==Accents==
+c ===========
+c Backspace
+any(bar) U+0329 + [K_BKSP] > nul
+any(v.bar) U+0329 any(ac.all) + [K_BKSP] > nul
+any(dot+nsl) any(ac.all) + [K_BKSP] > nul
+
+c General
+any(v.bar) U+0329 + any(key.all) > index(v.bar, 1) U+0329 index(ac.all, 3)
+any(dot+nsl) + any(key.all) > index(dot+nsl, 1) index(ac.all, 2)
+
+c Grave
+any(not.grv) + any(key.grv) > index(grv.all, 1)
+any(v.bar) U+0329 any(not.ac.grv) + any(key.grv) > index(v.bar, 1) U+0329 index(ac.grv.all, 3)
+any(dot+nsl) any(not.ac.grv) + any(key.grv) > index(dot+nsl, 1) index(ac.grv.all, 2)
+
+c Acute
+any(not.act) + any(key.act) > index(act.all, 1)
+any(v.bar) U+0329 any(not.ac.act) + any(key.act) > index(v.bar, 1) U+0329 index(ac.act.all, 3)
+any(dot+nsl) any(not.ac.act) + any(key.act) > index(dot+nsl, 1) index(ac.act.all, 2)
+
+c Circumflex
+any(not.crc) + any(key.crc) > index(crc.all, 1)
+any(v.bar) U+0329 any(not.ac.crc) + any(key.crc) > index(v.bar, 1) U+0329 index(ac.crc.all, 3)
+any(dot+nsl) any(not.ac.crc) + any(key.crc) > index(dot+nsl, 1) index(ac.crc.all, 2)
+
+c Caron
+any(not.crn) + any(key.crn) > index(crn.all, 1)
+any(v.bar) U+0329 any(not.ac.crn) + any(key.crn) > index(v.bar, 1) U+0329 index(ac.crn.all, 3)
+any(dot+nsl) any(not.ac.crn) + any(key.crn) > index(dot+nsl, 1) index(ac.crn.all, 2)
+
+c Macron
+any(not.mac) + any(key.mac) > index(mac.all, 1)
+any(v.bar) U+0329 any(not.ac.mac) + any(key.mac) > index(v.bar, 1) U+0329 index(ac.mac.all, 3)
+any(dot+nsl) any(not.ac.mac) + any(key.mac) > index(dot+nsl, 1) index(ac.mac.all, 2)
+
+c EOF
diff --git a/common/test/keyboards/invalid/source/xCERR_4034_balochi_phonetic_WrongNamingConvention.kmn b/common/test/keyboards/invalid/source/xCERR_4034_balochi_phonetic_WrongNamingConvention.kmn
new file mode 100644
index 0000000000..4be9fb5fb5
--- /dev/null
+++ b/common/test/keyboards/invalid/source/xCERR_4034_balochi_phonetic_WrongNamingConvention.kmn
@@ -0,0 +1,136 @@
+c ***** This test will produce 2 Errors: ***************************
+c ***** 1) it will be marked as FAIL when run in kmcompxtest *******
+c ***** as the Name starts with xCERR instead of CERR ***********
+c ***** 2) CERR_InvalidCharacter 0x00004034 will be produced *******
+c ******************************************************************
+
+store(&VERSION) '10.0'
+store(&NAME) 'Balochi Phonetic'
+store(&TARGETS) 'any'
+store(&KMW_RTL) '1'
+store(&LAYOUTFILE) 'balochi_phonetic.keyman-touch-layout'
+store(&KEYBOARDVERSION) '1.4.2'
+c ***** CERR_InvalidCharacter 0x00004034 ***************************
+store(©RIGHT) U+11FFFF
+c ******************************************************************
+store(&MESSAGE) 'The Balochi Phonetic keyboard is distributed under The MIT License (MIT).'
+store(&KMW_HELPTEXT) 'This is a phonetically organized Balochi keyboard.'
+store(&VISUALKEYBOARD) 'balochi_phonetic.kvks'
+store(&BITMAP) 'CERR__balochi_phonetic.ico'
+
+begin Unicode > use(main)
+
+group(main) using keys
++ [CTRL B08] > ''
++ [CTRL B09] > ''
++ [CTRL B10] > '–'
++ [SHIFT CTRL E11] > '“'
++ [SHIFT CTRL E12] > '”'
++ [CTRL E11] > '‘'
++ [CTRL E12] > '’'
++ [CTRL K_K] > 'ء'
++ [CTRL K_D] > 'ذ'
++ [K_EQUAL] > '='
++ [SHIFT K_8] > '*'
++ [SHIFT K_7] > '&'
++ [SHIFT K_5] > '%'
++ [SHIFT K_4] > '$'
++ [SHIFT K_3] > '#'
++ [SHIFT K_2] > '@'
++ [SHIFT K_1] > '!'
++ [SHIFT K_N] > 'ں'
++ [K_BKSLASH] > '۔'
++ [K_LBRKT] > ']'
++ [K_RBRKT] > '['
++ [K_F] > 'َ'
++ [K_V] > 'ِ'
++ [K_X] > 'ش'
++ [SHIFT K_H] > 'ح'
++ [SHIFT K_G] > 'ص'
++ [SHIFT K_Y] > 'ي'
++ [CTRL K_0] > '۰'
++ [CTRL K_9] > '۹'
++ [CTRL K_8] > '۸'
++ [CTRL K_7] > '۷'
++ [CTRL K_6] > '۶'
++ [CTRL K_5] > '۵'
++ [CTRL K_4] > '۴'
++ [CTRL K_3] > '۳'
++ [CTRL K_2] > '۲'
++ [CTRL K_1] > '۱'
++ [K_SLASH] > '/'
++ [K_HYPHEN] > '-'
++ [SHIFT K_COLON] > ':'
++ [SHIFT K_QUOTE] > '"'
++ [K_QUOTE] > U+0027
++ [K_O] > 'ُ'
++ [SHIFT K_O] > 'ْ'
++ [K_BKQUOTE] > 'ء'
++ [SHIFT K_W] > 'أ'
++ [SHIFT K_P] > 'ّ'
++ [SHIFT K_BKQUOTE] > 'ٔ'
++ [SHIFT K_J] > 'ض'
++ [SHIFT K_9] > ')'
++ [SHIFT K_RBRKT] > '{'
++ [SHIFT K_LBRKT] > '}'
++ [SHIFT K_0] > '('
++ [SHIFT K_SLASH] > '؟'
++ [SHIFT K_K] > 'ع'
++ [SHIFT K_EQUAL] > '«'
++ [SHIFT K_HYPHEN] > '»'
++ [SHIFT K_I] > 'ً'
+
++ [SHIFT K_PERIOD] > '‹'
++ [SHIFT K_COMMA] > '›'
++ [SHIFT K_L] > 'ـ'
++ [SHIFT K_U] > 'ۀ'
++ [SHIFT K_B] > 'ة'
++ [SHIFT K_M] > 'غ'
++ [SHIFT K_F] > 'ف'
++ [SHIFT K_E] > 'ۓ'
++ [SHIFT K_Q] > 'ق'
++ [K_0] > '0'
++ [K_9] > '9'
++ [K_8] > '8'
++ [K_7] > '7'
++ [K_6] > '6'
++ [K_5] > '5'
++ [K_4] > '4'
++ [K_3] > '3'
++ [K_2] > '2'
++ [K_1] > '1'
++ [K_I] > 'ێ'
++ [SHIFT K_D] > 'ڈ'
++ [K_G] > 'گ'
++ [K_U] > 'ۆ'
++ [SHIFT K_R] > 'ڑ'
++ [SHIFT K_6] > ''
++ [SHIFT K_T] > 'ٹ'
++ [SHIFT K_V] > 'ظ'
++ [SHIFT K_C] > 'ط'
++ [SHIFT K_X] > 'خ'
++ [SHIFT K_Z] > 'ژ'
++ [SHIFT K_S] > 'ث'
++ [SHIFT K_A] > 'آ'
++ [K_PERIOD] > '.'
++ [K_COMMA] > '،'
++ [K_M] > 'م'
++ [K_N] > 'ن'
++ [K_B] > 'ب'
++ [K_C] > 'چ'
++ [K_Z] > 'ز'
++ [K_P] > 'پ'
++ [K_Y] > 'ی'
++ [K_T] > 'ت'
++ [K_R] > 'ر'
++ [K_E] > 'ے'
++ [K_W] > 'و'
++ [K_Q] > 'ئ'
++ [K_COLON] > '؛'
++ [K_L] > 'ل'
++ [K_K] > 'ک'
++ [K_J] > 'ج'
++ [K_H] > 'ه'
++ [K_D] > 'د'
++ [K_S] > 'س'
++ [K_A] > 'ا'
\ No newline at end of file
diff --git a/developer/kmcompx/tests/get_test_source_exclude_some_kmn.bat b/developer/kmcompx/tests/get_test_source_exclude_some_kmn.bat
index 3a94dc5806..a9fde63530 100644
--- a/developer/kmcompx/tests/get_test_source_exclude_some_kmn.bat
+++ b/developer/kmcompx/tests/get_test_source_exclude_some_kmn.bat
@@ -6,8 +6,8 @@ rem no *bmp file included in Folder
rem - eKwTamil99UniUpdt
rem use of other folders than /source
-rem - vn_telex/raw/header
-rem - vn_vni/raw/header
+rem - vietnamese_telex_legacy\extras\vn_kmn_compiler\vn_telex\raw
+rem - vietnamese_vni\extras\vn_kmn_compiler\keyboard\vn_vni\raw
rem need more time to prevent TIMEOUT ( run while debugging in VS)
rem - vietnamese_telex
diff --git a/developer/kmcompx/tests/kmcompxtest.cpp b/developer/kmcompx/tests/kmcompxtest.cpp
index 4cd7a158b9..0b6785bc6a 100644
--- a/developer/kmcompx/tests/kmcompxtest.cpp
+++ b/developer/kmcompx/tests/kmcompxtest.cpp
@@ -6,7 +6,7 @@
#include
#include
-#include
+#include "kmcompx.h"
#include
#include
#include