diff --git a/developer/18.0/context/keyboard-editor.md b/developer/18.0/context/keyboard-editor.md
index d395c3ac5..fb0be6d34 100644
--- a/developer/18.0/context/keyboard-editor.md
+++ b/developer/18.0/context/keyboard-editor.md
@@ -397,8 +397,7 @@ ID
similar to the overloaded behaviour for `K_` ids. Thus `####`
must be valid Unicode characters.
The square bracket characters `[` and `]` indicate an optional portion of the sequence
- and are not to be included in the shortcut.
- E.g. `U_0259` would generate a
+ and are not to be included in the shortcut. E.g. `U_0259` would generate a
schwa if no rule matches. It is still valid to have a rule such
as `+ [U_0259] > ...`
diff --git a/developer/18.0/guides/distribute/tutorial/step-2.md b/developer/18.0/guides/distribute/tutorial/step-2.md
index 17dc613ba..7ed9aea57 100644
--- a/developer/18.0/guides/distribute/tutorial/step-2.md
+++ b/developer/18.0/guides/distribute/tutorial/step-2.md
@@ -58,7 +58,7 @@ welcome.htm
> ### Tip
If you want links to your website to open in the user's preferred
browser, preface the href link with `link:`, e.g.
- `website`
+ `website`
The `link:` sceheme will open the referred file in the default
application - that is, a web browser for URLs and links, Notepad for
.txt files, Adobe Reader for PDFs. You can use `link:` to open any
diff --git a/developer/18.0/guides/distribute/tutorial/step-4.md b/developer/18.0/guides/distribute/tutorial/step-4.md
index 67c55fe66..b1860df2a 100644
--- a/developer/18.0/guides/distribute/tutorial/step-4.md
+++ b/developer/18.0/guides/distribute/tutorial/step-4.md
@@ -54,7 +54,7 @@ Website
: Enter the name of the website where you will have information about
this keyboard. If you want to host it on keyman.com, you could enter
- `http://www.keyman.com/`
+ `https://keyman.com/`
Image file
: Select the splash image file that you created in Step 2 from the
diff --git a/developer/18.0/guides/lexical-models/distribute/tutorial/step-5.md b/developer/18.0/guides/lexical-models/distribute/tutorial/step-5.md
index ed873c69c..145315646 100644
--- a/developer/18.0/guides/lexical-models/distribute/tutorial/step-5.md
+++ b/developer/18.0/guides/lexical-models/distribute/tutorial/step-5.md
@@ -38,7 +38,7 @@ recommendations:
ZIP archive file!) and you won't save much space by recompressing
it.
3. Include a link to the Keyman download page:
- `http://keyman.com/downloads/`
+ `https://keyman.com/downloads/`
## Distributing a package by email
diff --git a/developer/18.0/reference/messages/km04003.md b/developer/18.0/reference/messages/km04003.md
index a75445270..c0e9e3dc6 100644
--- a/developer/18.0/reference/messages/km04003.md
+++ b/developer/18.0/reference/messages/km04003.md
@@ -4,7 +4,7 @@ title: KM04003: ERROR_FileDoesNotExist
| | |
|------------|---------- |
-| Message | File <param> does not exist\. |
+| Message | File '<param>' does not exist\. |
| Module | [kmc-package.PackageCompilerMessages](kmc-package.packagecompilermessages) |
| Identifier | `ERROR_FileDoesNotExist` |
diff --git a/developer/18.0/reference/messages/km04004.md b/developer/18.0/reference/messages/km04004.md
index 4a9451407..5a9b09fbb 100644
--- a/developer/18.0/reference/messages/km04004.md
+++ b/developer/18.0/reference/messages/km04004.md
@@ -4,7 +4,7 @@ title: KM04004: ERROR_FileCouldNotBeRead
| | |
|------------|---------- |
-| Message | File <param> could not be read: unknown error\. |
+| Message | File '<param>' could not be read: unknown error\. |
| Module | [kmc-package.PackageCompilerMessages](kmc-package.packagecompilermessages) |
| Identifier | `ERROR_FileCouldNotBeRead` |
diff --git a/developer/18.0/reference/messages/km04005.md b/developer/18.0/reference/messages/km04005.md
index 26bfc281a..1384e672e 100644
--- a/developer/18.0/reference/messages/km04005.md
+++ b/developer/18.0/reference/messages/km04005.md
@@ -4,7 +4,7 @@ title: KM04005: WARN_FileIsNotABinaryKvkFile
| | |
|------------|---------- |
-| Message | File <param> does not appear to be a valid binary \.kvk file; this may be an old package that includes an xml\-format \.kvk file\. You must update the package to include the compiled \.kvk file in the package\. |
+| Message | File '<param>' does not appear to be a valid binary \.kvk file; this may be an old package that includes an xml\-format \.kvk file\. You must update the package to include the compiled \.kvk file in the package\. |
| Module | [kmc-package.PackageCompilerMessages](kmc-package.packagecompilermessages) |
| Identifier | `WARN_FileIsNotABinaryKvkFile` |
diff --git a/developer/18.0/reference/messages/km04008.md b/developer/18.0/reference/messages/km04008.md
index e670fe882..a23a56d56 100644
--- a/developer/18.0/reference/messages/km04008.md
+++ b/developer/18.0/reference/messages/km04008.md
@@ -4,7 +4,7 @@ title: KM04008: ERROR_KeyboardContentFileNotFound
| | |
|------------|---------- |
-| Message | Keyboard <param> was listed in <Keyboards> but a corresponding \.kmx file was not found in <Files> |
+| Message | Keyboard '<param>' was listed in <Keyboards> but a corresponding \.kmx file was not found in <Files> |
| Module | [kmc-package.PackageCompilerMessages](kmc-package.packagecompilermessages) |
| Identifier | `ERROR_KeyboardContentFileNotFound` |
diff --git a/developer/18.0/reference/messages/km04009.md b/developer/18.0/reference/messages/km04009.md
index 835f3817a..4052cf8f6 100644
--- a/developer/18.0/reference/messages/km04009.md
+++ b/developer/18.0/reference/messages/km04009.md
@@ -4,7 +4,7 @@ title: KM04009: ERROR_KeyboardFileNotValid
| | |
|------------|---------- |
-| Message | Keyboard file <param> is not a valid \.kmx file: unknown error |
+| Message | Keyboard file '<param>' is not a valid \.kmx file: unknown error |
| Module | [kmc-package.PackageCompilerMessages](kmc-package.packagecompilermessages) |
| Identifier | `ERROR_KeyboardFileNotValid` |
diff --git a/developer/18.0/reference/messages/km0400a.md b/developer/18.0/reference/messages/km0400a.md
index d4399beba..4727eefe6 100644
--- a/developer/18.0/reference/messages/km0400a.md
+++ b/developer/18.0/reference/messages/km0400a.md
@@ -4,7 +4,7 @@ title: KM0400A: INFO_KeyboardFileHasNoKeyboardVersion
| | |
|------------|---------- |
-| Message | Keyboard file <param> has no &KeyboardVersion store, using default '0\.0' |
+| Message | Keyboard file '<param>' has no &KeyboardVersion store, using default '0\.0' |
| Module | [kmc-package.PackageCompilerMessages](kmc-package.packagecompilermessages) |
| Identifier | `INFO_KeyboardFileHasNoKeyboardVersion` |
diff --git a/developer/18.0/reference/messages/km0400d.md b/developer/18.0/reference/messages/km0400d.md
index 08f6aa31c..a66897f50 100644
--- a/developer/18.0/reference/messages/km0400d.md
+++ b/developer/18.0/reference/messages/km0400d.md
@@ -4,7 +4,7 @@ title: KM0400D: WARN_PackageNameDoesNotFollowLexicalModelConventions
| | |
|------------|---------- |
-| Message | The package file <param> does not follow the recommended model filename conventions\. The name should be all lower case, include only alphanumeric characters and underscore \(\_\), not start with a digit, and should have the structure <author>\.<bcp47>\.<uniq>\.model\.kps\. |
+| Message | The package file '<param>' does not follow the recommended model filename conventions\. The name should be all lower case, include only alphanumeric characters and underscore \(\_\), not start with a digit, and should have the structure <author>\.<bcp47>\.<uniq>\.model\.kps\. |
| Module | [kmc-package.PackageCompilerMessages](kmc-package.packagecompilermessages) |
| Identifier | `WARN_PackageNameDoesNotFollowLexicalModelConventions` |
diff --git a/developer/18.0/reference/messages/km0400e.md b/developer/18.0/reference/messages/km0400e.md
index 63f9265d6..bfe06c294 100644
--- a/developer/18.0/reference/messages/km0400e.md
+++ b/developer/18.0/reference/messages/km0400e.md
@@ -4,7 +4,7 @@ title: KM0400E: WARN_PackageNameDoesNotFollowKeyboardConventions
| | |
|------------|---------- |
-| Message | The package file <param> does not follow the recommended keyboard filename conventions\. The name should be all lower case, include only alphanumeric characters and underscore \(\_\), and not start with a digit\. |
+| Message | The package file '<param>' does not follow the recommended keyboard filename conventions\. The name should be all lower case, include only alphanumeric characters and underscore \(\_\), and not start with a digit\. |
| Module | [kmc-package.PackageCompilerMessages](kmc-package.packagecompilermessages) |
| Identifier | `WARN_PackageNameDoesNotFollowKeyboardConventions` |
diff --git a/developer/18.0/reference/messages/km0400f.md b/developer/18.0/reference/messages/km0400f.md
index 88604dc86..5b994b91c 100644
--- a/developer/18.0/reference/messages/km0400f.md
+++ b/developer/18.0/reference/messages/km0400f.md
@@ -4,7 +4,7 @@ title: KM0400F: WARN_FileInPackageDoesNotFollowFilenameConventions
| | |
|------------|---------- |
-| Message | The file <param> does not follow the recommended filename conventions\. The extension should be all lower case, and the filename should include only alphanumeric characters, \-, \_, \+ and \. |
+| Message | The file '<param>' does not follow the recommended filename conventions\. The extension should be all lower case, and the filename should include only alphanumeric characters, \-, \_, \+ and \. |
| Module | [kmc-package.PackageCompilerMessages](kmc-package.packagecompilermessages) |
| Identifier | `WARN_FileInPackageDoesNotFollowFilenameConventions` |
diff --git a/developer/18.0/reference/messages/km04011.md b/developer/18.0/reference/messages/km04011.md
index 895772155..ee9ad7115 100644
--- a/developer/18.0/reference/messages/km04011.md
+++ b/developer/18.0/reference/messages/km04011.md
@@ -4,7 +4,7 @@ title: KM04011: ERROR_KeyboardFileNotFound
| | |
|------------|---------- |
-| Message | Keyboard file <param> was not found\. Has it been compiled? |
+| Message | Keyboard file '<param>' was not found\. Has it been compiled? |
| Module | [kmc-package.PackageCompilerMessages](kmc-package.packagecompilermessages) |
| Identifier | `ERROR_KeyboardFileNotFound` |
diff --git a/developer/18.0/reference/messages/km0401d.md b/developer/18.0/reference/messages/km0401d.md
index 1f5daf5e2..ad8a62ac3 100644
--- a/developer/18.0/reference/messages/km0401d.md
+++ b/developer/18.0/reference/messages/km0401d.md
@@ -4,7 +4,7 @@ title: KM0401D: HINT_PackageContainsSourceFile
| | |
|------------|---------- |
-| Message | The source file <param> should not be included in the package; instead include the compiled result\. |
+| Message | The source file '<param>' should not be included in the package; instead include the compiled result\. |
| Module | [kmc-package.PackageCompilerMessages](kmc-package.packagecompilermessages) |
| Identifier | `HINT_PackageContainsSourceFile` |
diff --git a/developer/18.0/reference/messages/km04022.md b/developer/18.0/reference/messages/km04022.md
new file mode 100644
index 000000000..bf43597b2
--- /dev/null
+++ b/developer/18.0/reference/messages/km04022.md
@@ -0,0 +1,11 @@
+---
+title: KM04022: ERROR_RequiredParameterMissing
+---
+
+| | |
+|------------|---------- |
+| Message | Source parameter '<param>' is required\. |
+| Module | [kmc-package.PackageCompilerMessages](kmc-package.packagecompilermessages) |
+| Identifier | `ERROR_RequiredParameterMissing` |
+
+
diff --git a/developer/18.0/reference/messages/kmc-package.packagecompilermessages.md b/developer/18.0/reference/messages/kmc-package.packagecompilermessages.md
index 9b8c08057..53be173f1 100644
--- a/developer/18.0/reference/messages/kmc-package.packagecompilermessages.md
+++ b/developer/18.0/reference/messages/kmc-package.packagecompilermessages.md
@@ -6,21 +6,21 @@ title: Compiler Messages Reference for @keymanapp/kmc-package
------|------------|---------
[KM04001](km04001) | `FATAL_UnexpectedException` | This is an internal error; the message will vary
[KM04002](km04002) | `WARN_AbsolutePath` | File <param> has an absolute path, which is not portable\.
-[KM04003](km04003) | `ERROR_FileDoesNotExist` | File <param> does not exist\.
-[KM04004](km04004) | `ERROR_FileCouldNotBeRead` | File <param> could not be read: unknown error\.
-[KM04005](km04005) | `WARN_FileIsNotABinaryKvkFile` | File <param> does not appear to be a valid binary \.kvk file; this may be an old package that includes an xml\-format \.kvk file\. You must update the package to include the compiled \.kvk file in the package\.
+[KM04003](km04003) | `ERROR_FileDoesNotExist` | File '<param>' does not exist\.
+[KM04004](km04004) | `ERROR_FileCouldNotBeRead` | File '<param>' could not be read: unknown error\.
+[KM04005](km04005) | `WARN_FileIsNotABinaryKvkFile` | File '<param>' does not appear to be a valid binary \.kvk file; this may be an old package that includes an xml\-format \.kvk file\. You must update the package to include the compiled \.kvk file in the package\.
[KM04006](km04006) | `ERROR_FollowKeyboardVersionNotAllowedForModelPackages` | FollowKeyboardVersion is not allowed in model packages
[KM04007](km04007) | `ERROR_FollowKeyboardVersionButNoKeyboards` | FollowKeyboardVersion is set, but the package contains no keyboards
-[KM04008](km04008) | `ERROR_KeyboardContentFileNotFound` | Keyboard <param> was listed in <Keyboards> but a corresponding \.kmx file was not found in <Files>
-[KM04009](km04009) | `ERROR_KeyboardFileNotValid` | Keyboard file <param> is not a valid \.kmx file: unknown error
-[KM0400A](km0400a) | `INFO_KeyboardFileHasNoKeyboardVersion` | Keyboard file <param> has no &KeyboardVersion store, using default '0\.0'
+[KM04008](km04008) | `ERROR_KeyboardContentFileNotFound` | Keyboard '<param>' was listed in <Keyboards> but a corresponding \.kmx file was not found in <Files>
+[KM04009](km04009) | `ERROR_KeyboardFileNotValid` | Keyboard file '<param>' is not a valid \.kmx file: unknown error
+[KM0400A](km0400a) | `INFO_KeyboardFileHasNoKeyboardVersion` | Keyboard file '<param>' has no &KeyboardVersion store, using default '0\.0'
[KM0400B](km0400b) | `ERROR_PackageCannotContainBothModelsAndKeyboards` | The package contains both lexical models and keyboards, which is not permitted\.
[KM0400C](km0400c) | `HINT_PackageShouldNotRepeatLanguages` | Two language tags in <param> <param>, '<param>' and '<param>', reduce to the same minimal tag '<param>'\.
-[KM0400D](km0400d) | `WARN_PackageNameDoesNotFollowLexicalModelConventions` | The package file <param> does not follow the recommended model filename conventions\. The name should be all lower case, include only alphanumeric characters and underscore \(\_\), not start with a digit, and should have the structure <author>\.<bcp47>\.<uniq>\.model\.kps\.
-[KM0400E](km0400e) | `WARN_PackageNameDoesNotFollowKeyboardConventions` | The package file <param> does not follow the recommended keyboard filename conventions\. The name should be all lower case, include only alphanumeric characters and underscore \(\_\), and not start with a digit\.
-[KM0400F](km0400f) | `WARN_FileInPackageDoesNotFollowFilenameConventions` | The file <param> does not follow the recommended filename conventions\. The extension should be all lower case, and the filename should include only alphanumeric characters, \-, \_, \+ and \.
+[KM0400D](km0400d) | `WARN_PackageNameDoesNotFollowLexicalModelConventions` | The package file '<param>' does not follow the recommended model filename conventions\. The name should be all lower case, include only alphanumeric characters and underscore \(\_\), not start with a digit, and should have the structure <author>\.<bcp47>\.<uniq>\.model\.kps\.
+[KM0400E](km0400e) | `WARN_PackageNameDoesNotFollowKeyboardConventions` | The package file '<param>' does not follow the recommended keyboard filename conventions\. The name should be all lower case, include only alphanumeric characters and underscore \(\_\), and not start with a digit\.
+[KM0400F](km0400f) | `WARN_FileInPackageDoesNotFollowFilenameConventions` | The file '<param>' does not follow the recommended filename conventions\. The extension should be all lower case, and the filename should include only alphanumeric characters, \-, \_, \+ and \.
[KM04010](km04010) | `ERROR_PackageNameCannotBeBlank` | Package name cannot be an empty string\.
-[KM04011](km04011) | `ERROR_KeyboardFileNotFound` | Keyboard file <param> was not found\. Has it been compiled?
+[KM04011](km04011) | `ERROR_KeyboardFileNotFound` | Keyboard file '<param>' was not found\. Has it been compiled?
[KM04012](km04012) | `WARN_KeyboardVersionsDoNotMatch` | Keyboard <param> version <param> does not match keyboard <param> version <param>\.
[KM04014](km04014) | `ERROR_LanguageTagIsNotValid` | Language tag '<param>' in <param> <param> is invalid\.
[KM04015](km04015) | `HINT_LanguageTagIsNotMinimal` | Language tag '<param>' in <param> <param> is not minimal, and should be '<param>'\.
@@ -31,7 +31,8 @@ title: Compiler Messages Reference for @keymanapp/kmc-package
[KM0401A](km0401a) | `WARN_JsKeyboardFileIsMissing` | Keyboard <param> targets touch devices but corresponding <param>\.js file is not in the package\.
[KM0401B](km0401b) | `WARN_KeyboardShouldHaveAtLeastOneLanguage` | The keyboard <param> should have at least one language specified\.
[KM0401C](km0401c) | `HINT_JsKeyboardFileHasNoTouchTargets` | The keyboard <param> has been included for touch platforms, but does not include a touch layout\.
-[KM0401D](km0401d) | `HINT_PackageContainsSourceFile` | The source file <param> should not be included in the package; instead include the compiled result\.
+[KM0401D](km0401d) | `HINT_PackageContainsSourceFile` | The source file '<param>' should not be included in the package; instead include the compiled result\.
[KM0401F](km0401f) | `ERROR_FileRecordIsMissingName` | File record in the package with description 'undefined' is missing a filename\.
[KM04020](km04020) | `ERROR_InvalidAuthorEmail` | Invalid author email: <param>
[KM04021](km04021) | `ERROR_PackageFileHasEmptyVersion` | Package version is not following keyboard version, but the package version field is blank\.
+[KM04022](km04022) | `ERROR_RequiredParameterMissing` | Source parameter '<param>' is required\.
diff --git a/developer/core/18.0/options.md b/developer/core/18.0/options.md
index 41d5fe28c..f51528eaf 100644
--- a/developer/core/18.0/options.md
+++ b/developer/core/18.0/options.md
@@ -17,7 +17,7 @@ value.
-------------------------------------------------------------------------------
-# km_core_option_scope enum {#km_core_option_scope}
+# km_core_option_scope enum
## Description
@@ -48,7 +48,7 @@ enum km_core_option_scope {
-------------------------------------------------------------------------------
-# km_core_option_item struct {#km_core_option_item}
+# km_core_option_item struct
## Description
@@ -78,7 +78,7 @@ struct km_core_option_item {
-------------------------------------------------------------------------------
-# km_core_options_list_size() {#km_core_options_list_size}
+# km_core_options_list_size()
## Description
Return the length of a terminated [km_core_option_item] array (options
@@ -150,7 +150,7 @@ km_core_state_option_lookup(km_core_state const *state,
-------------------------------------------------------------------------------
-# km_core_state_options_update() {#km_core_state_options_update}
+# km_core_state_options_update()
## Description
@@ -188,7 +188,7 @@ km_core_state_options_update(km_core_state *state,
-------------------------------------------------------------------------------
-# km_core_state_options_to_json() {#km_core_state_options_to_json}
+# km_core_state_options_to_json()
## Description