diff --git a/resources/build/help-keyman-com.sh b/resources/build/help-keyman-com.sh
index f096a4508a..ce68df0a85 100755
--- a/resources/build/help-keyman-com.sh
+++ b/resources/build/help-keyman-com.sh
@@ -93,6 +93,7 @@ function upload_keyman_help {
windows)
# Note: `/windows/src/desktop/help/build.sh web` must be run first
upload windows/bin/help/md/desktop products/windows/$VERSION_RELEASE
+ upload windows/help/engine developer/engine/windows/$VERSION_RELEASE
;;
developer)
# Note: `/developer/build.sh api` must be run first - covers both uploads
diff --git a/windows/docs/engine/api/IKeyman/Apply.md b/windows/docs/engine/api/IKeyman/Apply.md
new file mode 100644
index 0000000000..2a82753af6
--- /dev/null
+++ b/windows/docs/engine/api/IKeyman/Apply.md
@@ -0,0 +1,18 @@
+---
+title: IKeyman::Apply Method
+---
+
+## Introduction
+
+The `IKeyman::Apply` method applies the changes which have been made
+through the current API instantiation to the Keyman Engine. If
+[`IKeyman::AutoApply`](AutoApply) is set to `False`, `Apply` must be
+called after making changes through the Keyman API. The documentation
+for each method that makes changes documents whether or not `Apply`
+needs to be called.
+
+## Specification
+
+``` clike
+void Apply(void)
+```
diff --git a/windows/docs/engine/api/IKeyman/AutoApply.md b/windows/docs/engine/api/IKeyman/AutoApply.md
new file mode 100644
index 0000000000..644a961eb4
--- /dev/null
+++ b/windows/docs/engine/api/IKeyman/AutoApply.md
@@ -0,0 +1,21 @@
+---
+title: IKeyman::AutoApply Property
+---
+
+## Introduction
+
+The `IKeyman::AutoApply` property determines if the API will apply
+changes automatically to the Keyman Engine after each change is made.
+Some changes are applied immediately, such as installing a keyboard
+layout. However other changes will not be applied unless the
+[`Apply`](Apply) method is called, or unless `AutoApply` is set to
+`True`. The documentation for each method that makes changes documents
+whether or not `Apply` needs to be called.
+
+`AutoApply` defaults to `True`.
+
+## Specification
+
+``` clike
+bool AutoApply
+```
diff --git a/windows/docs/engine/api/IKeyman/Control.md b/windows/docs/engine/api/IKeyman/Control.md
new file mode 100644
index 0000000000..85f1c59a84
--- /dev/null
+++ b/windows/docs/engine/api/IKeyman/Control.md
@@ -0,0 +1,16 @@
+---
+title: IKeyman::Control Property
+---
+
+## Introduction
+
+The `IKeyman::Control` property returns the Keyman
+[`IKeymanControl`](../IKeymanControl) interface which provides methods
+to control various aspects of the Keyman process and user interface
+interactions.
+
+## Specification
+
+``` clike
+readonly IKeymanControl* Control
+```
diff --git a/windows/docs/engine/api/IKeyman/Errors.md b/windows/docs/engine/api/IKeyman/Errors.md
new file mode 100644
index 0000000000..d580983d59
--- /dev/null
+++ b/windows/docs/engine/api/IKeyman/Errors.md
@@ -0,0 +1,18 @@
+---
+title: IKeyman::Errors Property
+---
+
+## Introduction
+
+The `IKeyman::Errors` property returns the Keyman
+[`IKeymanErrors`](../IKeymanErrors) interface which provides a list of
+errors encountered by the Keyman API, for example when installing a
+keyboard or package. When the Keyman API raises an exception, e.g. when
+trying to install a corrupt package file, there may be additional
+details available in the `Errors` collection.
+
+## Specification
+
+``` clike
+readonly IKeymanErrors* Errors
+```
diff --git a/windows/docs/engine/api/IKeyman/Hotkeys.md b/windows/docs/engine/api/IKeyman/Hotkeys.md
new file mode 100644
index 0000000000..410f23e543
--- /dev/null
+++ b/windows/docs/engine/api/IKeyman/Hotkeys.md
@@ -0,0 +1,17 @@
+---
+title: IKeyman::Hotkeys Property
+---
+
+## Introduction
+
+The `IKeyman::Hotkeys` property returns the Keyman
+[`IKeymanHotkeys`](../IKeymanHotkeys) interface which provides a list of
+configured user interface hotkeys. Hotkeys for activating a specific
+keyboard layout are not listed here; these are visible under the
+[`IKeymanLanguage::Hotkey`](../IKeymanLanguage/Hotkey) property.
+
+## Specification
+
+``` clike
+readonly IKeymanHotkeys* Hotkeys
+```
diff --git a/windows/docs/engine/api/IKeyman/Keyboards.md b/windows/docs/engine/api/IKeyman/Keyboards.md
new file mode 100644
index 0000000000..8b4c86caf7
--- /dev/null
+++ b/windows/docs/engine/api/IKeyman/Keyboards.md
@@ -0,0 +1,15 @@
+---
+title: IKeyman::Keyboards Property
+---
+
+## Introduction
+
+The `IKeyman::Keyboards` property returns the Keyman
+[`IKeymanKeyboardsInstalled`](../IKeymanKeyboardsInstalled) interface
+which provides a list of installed Keyman keyboards.
+
+## Specification
+
+``` clike
+readonly IKeymanKeyboardsInstalled* Keyboards
+```
diff --git a/windows/docs/engine/api/IKeyman/Languages.md b/windows/docs/engine/api/IKeyman/Languages.md
new file mode 100644
index 0000000000..6548f1607e
--- /dev/null
+++ b/windows/docs/engine/api/IKeyman/Languages.md
@@ -0,0 +1,15 @@
+---
+title: IKeyman::Languages Property
+---
+
+## Introduction
+
+The `IKeyman::Languages` property returns the Keyman
+[`IKeymanLanguages`](../IKeymanLanguages) interface which provides a
+list of all currently available Windows languages and input methods.
+
+## Specification
+
+``` clike
+readonly IKeymanLanguages* Languages
+```
diff --git a/windows/docs/engine/api/IKeyman/Options.md b/windows/docs/engine/api/IKeyman/Options.md
new file mode 100644
index 0000000000..e6e61fdd79
--- /dev/null
+++ b/windows/docs/engine/api/IKeyman/Options.md
@@ -0,0 +1,15 @@
+---
+title: IKeyman::Options Property
+---
+
+## Introduction
+
+The `IKeyman::Options` property returns the Keyman
+[`IKeymanOptions`](../IKeymanOptions) interface which provides a list of
+configuration settings and values in Keyman Engine for Windows.
+
+## Specification
+
+``` clike
+readonly IKeymanOptions* Options
+```
diff --git a/windows/docs/engine/api/IKeyman/Packages.md b/windows/docs/engine/api/IKeyman/Packages.md
new file mode 100644
index 0000000000..2f43648051
--- /dev/null
+++ b/windows/docs/engine/api/IKeyman/Packages.md
@@ -0,0 +1,15 @@
+---
+title: IKeyman::Packages Property
+---
+
+## Introduction
+
+The `IKeyman::Packages` property returns the Keyman
+[`IKeymanPackagesInstalled`](../IKeymanPackagesInstalled) interface
+which provides a list of installed Keyman keyboard packages.
+
+## Specification
+
+``` clike
+readonly IKeymanPackagesInstalled* Packages
+```
diff --git a/windows/docs/engine/api/IKeyman/Refresh.md b/windows/docs/engine/api/IKeyman/Refresh.md
new file mode 100644
index 0000000000..37f2021b8c
--- /dev/null
+++ b/windows/docs/engine/api/IKeyman/Refresh.md
@@ -0,0 +1,19 @@
+---
+title: IKeyman::Refresh Method
+---
+
+## Introduction
+
+When the `CoKeyman` object is instantiated, the Keyman API takes a
+snapshot of the installed keyboards and various settings in Keyman
+Engine. The `IKeyman::Refresh` method refreshes this snapshot with the
+current Keyman and system configuration. After `Refresh` is called, any
+references to interfaces held by the API consumer must be discarded, as
+the API implementation releases them and creates new instances, even if
+the object in question has had no changes.
+
+## Specification
+
+``` clike
+void Refresh(void)
+```
diff --git a/windows/docs/engine/api/IKeyman/SystemInfo.md b/windows/docs/engine/api/IKeyman/SystemInfo.md
new file mode 100644
index 0000000000..135960650d
--- /dev/null
+++ b/windows/docs/engine/api/IKeyman/SystemInfo.md
@@ -0,0 +1,15 @@
+---
+title: IKeyman::SystemInfo Property
+---
+
+## Introduction
+
+The `IKeyman::SystemInfo` property returns the Keyman
+[`IKeymanSystemInfo`](../IKeymanSystemInfo) interface which describes
+the current system configuration.
+
+## Specification
+
+``` clike
+readonly IKeymanSystemInfo* SystemInfo
+```
diff --git a/windows/docs/engine/api/IKeyman/index.md b/windows/docs/engine/api/IKeyman/index.md
new file mode 100644
index 0000000000..15b1bb2a07
--- /dev/null
+++ b/windows/docs/engine/api/IKeyman/index.md
@@ -0,0 +1,92 @@
+---
+title: IKeyman Interface
+---
+
+## Introduction
+
+The `IKeyman` interface is the top-level interface for the Keyman Engine
+for Windows API. The `IKeyman` interface can be instantiated with the
+`CoKeyman` coclass; it will also be returned from a call to
+`CreateObject("kmcomapi.Keyman")`.
+
+## Interface Hierarchy
+
+`IDispatch`
+
+> [`IKeymanObject`](../IKeymanObject)
+>
+> > **`IKeyman`**
+
+## Properties
+
+[`AutoApply`](AutoApply)
+: Determines whether settings changes are applied to Keyman Engine
+ automatically as they are made.
+
+[`Control`](Control) read only
+: Returns an [`IKeymanControl`](../IKeymanControl) interface that
+ provides methods for controlling the Keyman process and user
+ interface.
+
+[`Errors`](Errors) read only
+: Returns an [`IKeymanErrors`](../IKeymanErrors) interface that lists
+ errors that the API incurred when undertaking various processes.
+
+[`Hotkeys`](Hotkeys) read only
+: Returns an [`IKeymanHotkeys`](../IKeymanHotkeys) interface that
+ lists all of the configured interface hotkeys.
+
+[`Keyboards`](Keyboards) read only
+: Returns an
+ [`IKeymanKeyboardsInstalled`](../IKeymanKeyboardsInstalled)
+ interface that lists all of the currently installed Keyman
+ keyboards.
+
+[`Languages`](Languages) read only
+: Returns an [`IKeymanLanguages`](../IKeymanLanguages) interface that
+ lists all of the currently avilable Windows languages and input
+ methods.
+
+[`Options`](Options) read only
+: Returns an [`IKeymanOptions`](../IKeymanOptions) interface that
+ lists all of the configuration settings and values for Keyman
+ Engine.
+
+[`Packages`](Packages) read only
+: Returns an [`IKeymanPackagesInstalled`](../IKeymanPackagesInstalled)
+ interface that lists all of the currently installed Keyman packages.
+
+[`SystemInfo`](SystemInfo) read only
+: Returns an [`IKeymanSystemInfo`](../IKeymanSystemInfo) interface
+ that describes the current system configuration.
+
+## Methods
+
+[`Apply()`](Apply)
+: Apply all settings changes to Keyman Engine.
+
+[`Refresh()`](Refresh)
+: Refresh the snapshot of keyboards and settings which is captured
+ when the object is instantiated.
+
+## Examples
+
+### VBScript
+
+This example can be saved with a .vbs extension to run through Windows
+Scripting. This is similar to the uninstall script that Keyman Desktop
+generates for packages which have a Start Menu Uninstall entry.
+
+``` basic
+dim kmcom, package
+Set kmcom = CreateObject("keymanapi.Keyman")
+n = kmcom.Packages.IndexOf("SamplePackage")
+if n >= 0 then
+ Set package = kmcom.Packages(n)
+ if msgbox("Uninstall package "+package.Description+"?", vbOKCancel, "Keyman Desktop") = vbOK then
+ package.Uninstall(True)
+ end if
+else
+ msgbox "The package SamplePackage could not be found."
+end if
+```
diff --git a/windows/docs/engine/api/IKeymanBCP47Canonicalization/GetCanonicalTag.md b/windows/docs/engine/api/IKeymanBCP47Canonicalization/GetCanonicalTag.md
new file mode 100644
index 0000000000..1c7f6ab001
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanBCP47Canonicalization/GetCanonicalTag.md
@@ -0,0 +1,28 @@
+---
+title: IKeymanBCP47Canonicalization::GetCanonicalTag Method
+---
+
+## Introduction
+
+The `IKeymanBCP47Canonicalization::GetCanonicalTag` method returns a
+canonical tag according to data from [SIL
+langtags.json](https://github.com/silnrsi/langtags). The method will
+convert ISO639-3 language tags, ISO639-1 language tags, remove
+suppressed script tags, and append a default region if one is not
+present.
+
+**Note:** This tag may not always be identical to a Windows canonical
+tag. A region subtag may be present in the canonical tag which may later
+be removed by Windows, if Windows believes the language is used in only
+one region.
+
+## Specification
+
+``` clike
+string GetCanonicalTag(string Tag)
+```
+
+## Parameters
+
+`Tag`
+: The BCP 47 tag to canonicalize.
diff --git a/windows/docs/engine/api/IKeymanBCP47Canonicalization/index.md b/windows/docs/engine/api/IKeymanBCP47Canonicalization/index.md
new file mode 100644
index 0000000000..1dae3965d0
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanBCP47Canonicalization/index.md
@@ -0,0 +1,26 @@
+---
+title: IKeymanBCP47Canonicalization Interface
+---
+
+## Introduction
+
+The `IKeymanBCP47Canonicalization` interface adds functions for
+canonicalizing BCP 47 tags.
+
+## Interface Hierarchy
+
+`IDispatch`
+
+> [`IKeymanObject`](../IKeymanObject)
+>
+> > **`IKeymanBCP47Canonicalization`**
+
+
+## Methods
+
+[`GetCanonicalTag()`](GetCanonicalTag)
+: Finds a canonical tag according to data from SIL langtags.json.
+
+## History
+
+Added in Keyman Engine for Windows 14.0.
diff --git a/windows/docs/engine/api/IKeymanCollection/Count.md b/windows/docs/engine/api/IKeymanCollection/Count.md
new file mode 100644
index 0000000000..02721f38d6
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanCollection/Count.md
@@ -0,0 +1,14 @@
+---
+title: IKeymanCollection::Count Property
+---
+
+## Introduction
+
+The `IKeymanCollection::Count` property returns the number of elements
+in the collection.
+
+## Specification
+
+``` clike
+readonly long Count
+```
diff --git a/windows/docs/engine/api/IKeymanCollection/Refresh.md b/windows/docs/engine/api/IKeymanCollection/Refresh.md
new file mode 100644
index 0000000000..2a34d5e2a6
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanCollection/Refresh.md
@@ -0,0 +1,21 @@
+---
+title: IKeymanCollection::Refresh() Method
+---
+
+## Introduction
+
+The `IKeymanCollection::Refresh()` method refreshes the collection. All
+existing elements in the collection are invalidated, even if nothing has
+changed.
+
+Generally, it is better to call the top-level
+[`IKeyman::Refresh`](../IKeyman/Refresh) as that will ensure that the
+Keyman API snapshot is internally consistent. See
+[`IKeyman::Refresh`](../IKeyman/Refresh) for more information on Keyman
+API snapshots.
+
+## Specification
+
+``` clike
+void Refresh(void)
+```
diff --git a/windows/docs/engine/api/IKeymanCollection/_NewEnum.md b/windows/docs/engine/api/IKeymanCollection/_NewEnum.md
new file mode 100644
index 0000000000..615a8d130c
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanCollection/_NewEnum.md
@@ -0,0 +1,17 @@
+---
+title: IKeymanCollection::_NewEnum() Method
+---
+
+## Introduction
+
+The `IKeymanCollection::_NewEnum()` method instantiates an enumerator
+for the collection. This is required for COM enumeration of the
+collection. Generally, languages provide a method of iterating over a
+collection that uses `_NewEnum()` internally, and you will not be
+required to call this directly.
+
+## Specification
+
+``` clike
+IUnknown* _NewEnum(void)
+```
diff --git a/windows/docs/engine/api/IKeymanCollection/index.md b/windows/docs/engine/api/IKeymanCollection/index.md
new file mode 100644
index 0000000000..897aac294f
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanCollection/index.md
@@ -0,0 +1,61 @@
+---
+title: IKeymanCollection Interface
+---
+
+## Introduction
+
+The `IKeymanCollection` interface is the base interface for all
+collections in Keyman Engine for Windows API. The `Items[]` property is
+implemented in sub-interfaces.
+
+## Interface Hierarchy
+
+`IDispatch`
+
+> [`IKeymanObject`](../IKeymanObject)
+>
+> > **`IKeymanCollection`**
+> >
+> > > [`IKeymanErrors`](../IKeymanErrors)
+> > > [`IKeymanHotkeys`](../IKeymanHotkeys)
+> > > [`IKeymanKeyboardLanguages`](../IKeymanKeyboardLanguages)
+> > >
+> > > > [`IKeymanKeyboardLanguagesFile`](../IKeymanKeyboardLanguagesFile)
+> > > > [`IKeymanKeyboardLanguagesInstalled`](../IKeymanKeyboardLanguagesInstalled)
+> > > >
+> > > > > [`IKeymanKeyboardLanguagesInstalled2`](../IKeymanKeyboardLanguagesInstalled2)
+> > >
+> > > [`IKeymanKeyboardOptions`](../IKeymanKeyboardOptions)
+> > > [`IKeymanKeyboards`](../IKeymanKeyboards)
+> > >
+> > > > [`IKeymanKeyboardsInstalled`](../IKeymanKeyboardsInstalled)
+> > > >
+> > > > > [`IKeymanKeyboardsInstalled2`](../IKeymanKeyboardsInstalled2)
+> > > >
+> > > > [`IKeymanPackageContentKeyboards`](../IKeymanPackageContentKeyboards)
+> > >
+> > > [`IKeymanLanguages`](../IKeymanLanguages)
+> > > [`IKeymanOptions`](../IKeymanOptions)
+> > > [`IKeymanPackageContentFiles`](../IKeymanPackageContentFiles)
+> > > [`IKeymanPackageContentFonts`](../IKeymanPackageContentFonts)
+> > > [`IKeymanPackagesInstalled`](../IKeymanPackagesInstalled)
+> > >
+> > > > [`IKeymanPackagesInstalled2`](../IKeymanPackagesInstalled2)
+
+
+## Properties
+
+[`Count`](Count) read only
+: Returns the number of items in the collection.
+
+## Methods
+
+[`_NewEnum()`](_NewEnum)
+: Instantiates an enumerator for the collection. This is required for
+ COM enumeration of the collection.
+
+
+
+[`Refresh()`](Refresh)
+: Refreshes the collection from the current Keyman Engine
+ configuration.
diff --git a/windows/docs/engine/api/IKeymanControl/ActiveLanguage.md b/windows/docs/engine/api/IKeymanControl/ActiveLanguage.md
new file mode 100644
index 0000000000..9c642a0b53
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanControl/ActiveLanguage.md
@@ -0,0 +1,17 @@
+---
+title: IKeymanControl::ActiveLanguage Property
+---
+
+## Introduction
+
+The `IKeymanControl::ActiveLanguage` property sets or returns the last
+active [`IKeymanLanguage`](../IKeymanLanguage) for the current thread.
+
+This is a convenience wrapper for the Windows
+`ITfInputProcessorProfileMgr::ActivateProfile` method.
+
+## Specification
+
+``` clike
+IKeymanLanguage* ActiveLanguage
+```
diff --git a/windows/docs/engine/api/IKeymanControl/IsConfigurationOpen.md b/windows/docs/engine/api/IKeymanControl/IsConfigurationOpen.md
new file mode 100644
index 0000000000..6db0da2834
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanControl/IsConfigurationOpen.md
@@ -0,0 +1,14 @@
+---
+title: IKeymanControl::IsConfigurationOpen() Method
+---
+
+## Introduction
+
+The `IKeymanControl::IsConfigurationOpen()` method returns `True` if
+Keyman Configuration is currently running.
+
+## Specification
+
+``` clike
+bool IsConfigurationOpen(void)
+```
diff --git a/windows/docs/engine/api/IKeymanControl/IsKeymanRunning.md b/windows/docs/engine/api/IKeymanControl/IsKeymanRunning.md
new file mode 100644
index 0000000000..37fd918f5c
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanControl/IsKeymanRunning.md
@@ -0,0 +1,14 @@
+---
+title: IKeymanControl::IsKeymanRunning() Method
+---
+
+## Introduction
+
+The `IKeymanControl::IsKeymanRunning()` method returns `True` if Keyman
+Engine is currently running.
+
+## Specification
+
+``` clike
+bool IsKeymanRunning(void)
+```
diff --git a/windows/docs/engine/api/IKeymanControl/IsOnlineUpdateCheckOpen.md b/windows/docs/engine/api/IKeymanControl/IsOnlineUpdateCheckOpen.md
new file mode 100644
index 0000000000..3201b3ce92
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanControl/IsOnlineUpdateCheckOpen.md
@@ -0,0 +1,14 @@
+---
+title: IKeymanControl::IsOnlineUpdateCheckOpen() Method
+---
+
+## Introduction
+
+The `IKeymanControl::IsOnlineUpdateCheckOpen()` method returns `True` if
+the Keyman Desktop online update check tool is currently running.
+
+## Specification
+
+``` clike
+bool IsOnlineUpdateCheckOpen(void)
+```
diff --git a/windows/docs/engine/api/IKeymanControl/IsTextEditorOpen.md b/windows/docs/engine/api/IKeymanControl/IsTextEditorOpen.md
new file mode 100644
index 0000000000..e339289e40
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanControl/IsTextEditorOpen.md
@@ -0,0 +1,14 @@
+---
+title: IKeymanControl::IsTextEditorOpen() Method
+---
+
+## Introduction
+
+The `IKeymanControl::IsTextEditorOpen()` method returns `True` if the
+Keyman Desktop text editor is currently running.
+
+## Specification
+
+``` clike
+bool IsTextEditorOpen(void)
+```
diff --git a/windows/docs/engine/api/IKeymanControl/IsVisualKeyboardOpen.md b/windows/docs/engine/api/IKeymanControl/IsVisualKeyboardOpen.md
new file mode 100644
index 0000000000..f39a98d7c9
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanControl/IsVisualKeyboardOpen.md
@@ -0,0 +1,14 @@
+---
+title: IKeymanControl::IsVisualKeyboardOpen() Method
+---
+
+## Introduction
+
+The `IKeymanControl::IsVisualKeyboardOpen()` method returns `True` if
+the on screen keyboard is running.
+
+## Specification
+
+``` clike
+bool IsVisualKeyboardOpen(void)
+```
diff --git a/windows/docs/engine/api/IKeymanControl/LastActiveWindow.md b/windows/docs/engine/api/IKeymanControl/LastActiveWindow.md
new file mode 100644
index 0000000000..52faabdb8d
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanControl/LastActiveWindow.md
@@ -0,0 +1,14 @@
+---
+title: IKeymanControl::LastActiveWindow Property
+---
+
+## Introduction
+
+The `IKeymanControl::LastActiveWindow` property returns the last active
+window handle, excluding Keyman windows such as the On Screen Keyboard.
+
+## Specification
+
+``` clike
+readonly long LastActiveWindow
+```
diff --git a/windows/docs/engine/api/IKeymanControl/LastFocusWindow.md b/windows/docs/engine/api/IKeymanControl/LastFocusWindow.md
new file mode 100644
index 0000000000..10436b8165
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanControl/LastFocusWindow.md
@@ -0,0 +1,15 @@
+---
+title: IKeymanControl::LastFocusWindow Property
+---
+
+## Introduction
+
+The `IKeymanControl::LastFocusWindow` property returns the last focused
+window handle, irrespective of process, excluding Keyman windows such as
+the On Screen Keyboard.
+
+## Specification
+
+``` clike
+readonly long LastFocusWindow
+```
diff --git a/windows/docs/engine/api/IKeymanControl/OpenConfiguration.md b/windows/docs/engine/api/IKeymanControl/OpenConfiguration.md
new file mode 100644
index 0000000000..abdef469fd
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanControl/OpenConfiguration.md
@@ -0,0 +1,16 @@
+---
+title: IKeymanControl::OpenConfiguration() Method
+---
+
+## Introduction
+
+The `IKeymanControl::OpenConfiguration()` method starts Keyman
+Configuration (kmshell.exe). It is better to call this method than to
+launch kmshell.exe directly as this method handles paths and parameter
+changes across versions of Keyman Engine.
+
+## Specification
+
+``` clike
+void OpenConfiguration(void)
+```
diff --git a/windows/docs/engine/api/IKeymanControl/OpenDiagnostics.md b/windows/docs/engine/api/IKeymanControl/OpenDiagnostics.md
new file mode 100644
index 0000000000..70b11ba5aa
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanControl/OpenDiagnostics.md
@@ -0,0 +1,14 @@
+---
+title: IKeymanControl::OpenDiagnostics() Method
+---
+
+## Introduction
+
+The `IKeymanControl::OpenDiagnostics()` method opens the Keyman
+diagnostics tool (tsysinfo.exe).
+
+## Specification
+
+``` clike
+void OpenDiagnostics(void)
+```
diff --git a/windows/docs/engine/api/IKeymanControl/OpenHelp.md b/windows/docs/engine/api/IKeymanControl/OpenHelp.md
new file mode 100644
index 0000000000..3af4500e34
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanControl/OpenHelp.md
@@ -0,0 +1,19 @@
+---
+title: IKeymanControl::OpenHelp() Method
+---
+
+## Introduction
+
+The `IKeymanControl::OpenHelp()` method opens Keyman Desktop help at the
+specified topic.
+
+## Specification
+
+``` clike
+void OpenHelp(string Topic)
+```
+
+## Parameters
+
+`Topic`
+: The string identifier for the topic.
diff --git a/windows/docs/engine/api/IKeymanControl/OpenTextEditor.md b/windows/docs/engine/api/IKeymanControl/OpenTextEditor.md
new file mode 100644
index 0000000000..ec76f11e28
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanControl/OpenTextEditor.md
@@ -0,0 +1,14 @@
+---
+title: IKeymanControl::OpenTextEditor() Method
+---
+
+## Introduction
+
+The `IKeymanControl::OpenTextEditor()` method opens Keyman Desktop Text
+Editor.
+
+## Specification
+
+``` clike
+void OpenTextEditor(void)
+```
diff --git a/windows/docs/engine/api/IKeymanControl/OpenUpdateCheck.md b/windows/docs/engine/api/IKeymanControl/OpenUpdateCheck.md
new file mode 100644
index 0000000000..3463364e91
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanControl/OpenUpdateCheck.md
@@ -0,0 +1,14 @@
+---
+title: IKeymanControl::OpenUpdateCheck() Method
+---
+
+## Introduction
+
+The `IKeymanControl::OpenUpdateCheck()` method opens Keyman Desktop
+online update check tool.
+
+## Specification
+
+``` clike
+void OpenUpdateCheck(void)
+```
diff --git a/windows/docs/engine/api/IKeymanControl/ShowKeyboardWelcome.md b/windows/docs/engine/api/IKeymanControl/ShowKeyboardWelcome.md
new file mode 100644
index 0000000000..31edc44b8a
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanControl/ShowKeyboardWelcome.md
@@ -0,0 +1,20 @@
+---
+title: IKeymanControl::ShowKeyboardWelcome() Method
+---
+
+## Introduction
+
+The `IKeymanControl::ShowKeyboardWelcome()` method opens the keyboard
+welcome.htm for the keyboard in a HTML window hosted by kmshell.exe.
+
+## Specification
+
+``` clike
+void ShowKeyboardWelcome(IKeymanKeyboardInstalled* Keyboard)
+```
+
+## Parameters
+
+`Keyboard`
+: The installed keyboard for which the documentation should be
+ displayed.
diff --git a/windows/docs/engine/api/IKeymanControl/StartKeyman.md b/windows/docs/engine/api/IKeymanControl/StartKeyman.md
new file mode 100644
index 0000000000..e3f0989206
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanControl/StartKeyman.md
@@ -0,0 +1,16 @@
+---
+title: IKeymanControl::StartKeyman() Method
+---
+
+## Introduction
+
+The `IKeymanControl::StartKeyman()` method starts Keyman Engine
+(keyman.exe). It is better to call this method than to launch keyman.exe
+directly, as this method handles paths and parameter changes across
+versions of Keyman Engine.
+
+## Specification
+
+``` clike
+void StartKeyman(void)
+```
diff --git a/windows/docs/engine/api/IKeymanControl/StartVisualKeyboard.md b/windows/docs/engine/api/IKeymanControl/StartVisualKeyboard.md
new file mode 100644
index 0000000000..452ee91c4b
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanControl/StartVisualKeyboard.md
@@ -0,0 +1,14 @@
+---
+title: IKeymanControl::StartVisualKeyboard() Method
+---
+
+## Introduction
+
+The `IKeymanControl::StartVisualKeyboard()` method starts the on screen
+keyboard.
+
+## Specification
+
+``` clike
+void StartVisualKeyboard(void)
+```
diff --git a/windows/docs/engine/api/IKeymanControl/StopKeyman.md b/windows/docs/engine/api/IKeymanControl/StopKeyman.md
new file mode 100644
index 0000000000..6dc81271e2
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanControl/StopKeyman.md
@@ -0,0 +1,14 @@
+---
+title: IKeymanControl::StopKeyman() Method
+---
+
+## Introduction
+
+The `IKeymanControl::StopKeyman()` method stops Keyman Engine
+(keyman.exe).
+
+## Specification
+
+``` clike
+void StopKeyman(void)
+```
diff --git a/windows/docs/engine/api/IKeymanControl/StopVisualKeyboard.md b/windows/docs/engine/api/IKeymanControl/StopVisualKeyboard.md
new file mode 100644
index 0000000000..6714919540
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanControl/StopVisualKeyboard.md
@@ -0,0 +1,14 @@
+---
+title: IKeymanControl::StopVisualKeyboard() Method
+---
+
+## Introduction
+
+The `IKeymanControl::StopVisualKeyboard()` method stops the on screen
+keyboard.
+
+## Specification
+
+``` clike
+void StopVisualKeyboard(void)
+```
diff --git a/windows/docs/engine/api/IKeymanControl/index.md b/windows/docs/engine/api/IKeymanControl/index.md
new file mode 100644
index 0000000000..4ca94ff2f9
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanControl/index.md
@@ -0,0 +1,110 @@
+---
+title: IKeymanControl Interface
+---
+
+## Introduction
+
+The `IKeymanControl` interface controls the operation of Keyman Engine
+and provides methods to trigger Keyman Engine's user interface.
+
+## Interface Hierarchy
+
+`IDispatch`
+
+> [`IKeymanObject`](../IKeymanObject)
+>
+> > **`IKeymanControl`**
+
+
+## Properties
+
+[`ActiveLanguage`](ActiveLanguage)
+: Returns or sets the currently active keyboard + language.
+
+
+
+[`LastActiveWindow`](LastActiveWindow) read only
+: Returns the last active window handle, excluding Keyman windows such
+ as the On Screen Keyboard.
+
+
+
+[`LastFocusWindow`](LastFocusWindow) read only
+: Returns the last focus window handle, irrespective of process.
+
+## Methods
+
+[`IsConfigurationOpen()`](IsConfigurationOpen)
+: Returns `True` if Keyman Configuration is currently running.
+
+
+
+[`IsKeymanRunning()`](IsKeymanRunning)
+: Returns `True` if Keyman Engine is currently running.
+
+
+
+[`IsOnlineUpdateCheckOpen()`](IsOnlineUpdateCheckOpen)
+: Returns `True` if the Keyman Desktop online update check tool is
+ currently running.
+
+
+
+[`IsTextEditorOpen()`](IsTextEditorOpen)
+: Returns `True` if the Keyman Desktop text editor is currently
+ running.
+
+
+
+[`IsVisualKeyboardOpen()`](IsVisualKeyboardOpen)
+: Returns `True` if the on screen keyboard is running.
+
+
+
+[`OpenConfiguration()`](OpenConfiguration)
+: Starts Keyman Configuration.
+
+
+
+[`OpenDiagnostics()`](OpenDiagnostics)
+: Opens the Keyman diagnostics tool.
+
+
+
+[`OpenHelp()`](OpenHelp)
+: Opens Keyman Desktop help at the specific topic.
+
+
+
+[`OpenTextEditor()`](OpenTextEditor)
+: Opens Keyman Desktop text editor.
+
+
+
+[`OpenUpdateCheck()`](OpenUpdateCheck)
+: Opens Keyman Desktop online update check tool.
+
+
+
+[`ShowKeyboardWelcome()`](ShowKeyboardWelcome)
+: Loads the welcome.htm file in a window for the selected keyboard.
+
+
+
+[`StartKeyman()`](StartKeyman)
+: Starts Keyman Engine, if it isn't already running.
+
+
+
+[`StartVisualKeyboard()`](StartVisualKeyboard)
+: Starts the on screen keyboard, if it isn't already visible.
+
+
+
+[`StopKeyman()`](StopKeyman)
+: Stops Keyman Engine.
+
+
+
+[`StopVisualKeyboard()`](StopVisualKeyboard)
+: Stops the on screen keyboard.
diff --git a/windows/docs/engine/api/IKeymanError/Description.md b/windows/docs/engine/api/IKeymanError/Description.md
new file mode 100644
index 0000000000..fbfb0fea2c
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanError/Description.md
@@ -0,0 +1,15 @@
+---
+title: IKeymanError::Description Property
+---
+
+## Introduction
+
+The `IKeymanError::Description` property returns a human-readable
+description of the error intended for display; see
+[`ErrorCode`](ErrorCode) for the text of each error.
+
+## Specification
+
+``` clike
+readonly string Description
+```
diff --git a/windows/docs/engine/api/IKeymanError/ErrorCode.md b/windows/docs/engine/api/IKeymanError/ErrorCode.md
new file mode 100644
index 0000000000..9dd809017e
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanError/ErrorCode.md
@@ -0,0 +1,63 @@
+---
+title: IKeymanError::ErrorCode Property
+---
+
+## Introduction
+
+The `IKeymanError::ErrorCode` property returns an integer error code for
+the error.
+
+## Specification
+
+``` clike
+readonly long ErrorCode
+```
+
+## Defined Error Codes
+
+| Code | Identifier | Message | Source |
+|----|----|----|----|
+| 0xA0000200 | KMN_E_Install_InvalidFile | The file %0:s could not be installed because of the following error: %1:s | InstallKeyboard |
+| 0xA0000201 | KMN_E_Install_AlreadyInstalled | A keyboard with the name %0:s is already installed. | InstallKeyboard |
+| 0xA0000202 | KMN_E_Install_FailureToCreateDirectories | Failure to create directories for keyboard %0:s. | InstallKeyboard |
+| 0xA0000203 | KMN_E_Uninstall_InvalidKeyboard | The keyboard %0:s could not be uninstalled because it was invalid. | UninstallKeyboard |
+| 0xA0000204 | KMN_E_Uninstall_KeyboardPartOfPackage | The keyboard %0:s could not be uninstalled because it was part of package %1:s. | UninstallKeyboard |
+| 0xA0000205 | KMN_E_Uninstall_AdminKeyboardInstalled | You do not have sufficient privileges to uninstall keyboard %0:s. | UninstallKeyboard |
+| 0x20000206 | KMN_W_UninstallFileNotFound | The file %0:s was not found during the uninstall. | UninstallKeyboard |
+| 0x20000207 | KMN_W_UninstallFileInUse | The file %0:s is currently in use and will be removed after the next reboot. | UninstallKeyboard |
+| 0x20000208 | KMN_W_UninstallError_UnableToDeleteKeyboardRegistrySetting | Unable to delete keyboard %0:s registry key %1:s | UninstallKeyboard |
+| 0x20000209 | KMN_W_UninstallError_UnableToRemoveDirectory | Unable to remove directory for keyboard %0:s (error %1:s) | UninstallKeyboard |
+| 0xA000020A | KMN_E_PackageInstall_UnableToGetTempPath | Unable to find a temp path to install package. | InstallPackage |
+| 0xA000020B | KMN_E_PackageInstall_UnableToGetTempFileName | Unable to get a temp file name to install package. | InstallPackage |
+| 0xA000020C | KMN_E_PackageInstall_UnableToCreateTemporaryDirectory | Unable to create temporary folder to install package. | InstallPackage |
+| 0xA000020D | KMN_E_PackageInstall_UnableToFindInfFile | Unable to locate inf file from package - it may be damaged. Please download the package again and try again. | InstallPackage |
+| 0xA000020E | KMN_E_PackageInstall_PackageAlreadyInstalled | The package is already installed. | InstallPackage |
+| 0xA000020F | KMN_E_PackageInstall_UnableToCopyFile | Unable to copy file %0:s for the package to %1:s - you may have insufficient privileges, or you may have run out of disk space. | InstallPackage |
+| 0x20000210 | KMN_W_InstallPackage_UnableToFindProgramsFolder | Unable to find Start Menu folder | InstallPackage |
+| 0x20000211 | KMN_W_InstallPackage_UnableToCreateStartMenuEntry | Unable to create Start Menu entry %0:s | InstallPackage |
+| 0x20000212 | KMN_W_InstallPackage_CannotRunExternalProgram | Cannot run external program %0:s (error %1:s) | InstallPackage |
+| 0x20000213 | KMN_W_InstallFont_CannotInstallFont | Cannot install font %0:s (error %2:d: %1:s) | InstallFont |
+| 0x20000214 | KMN_W_InstallFont_CannotInstallFontAdmin | Cannot install font registry settings: %0:s | InstallFont |
+| 0xA0000215 | KMN_E_Collection_InvalidIndex | Index %0:s out of bounds | Collection |
+| 0xA0000216 | KMN_E_PackageUninstall_NotFound | Cannot find the package to uninstall | UninstallPackage |
+| 0xA0000217 | KMN_E_PackageUninstall_AdminRequired | This package requires administrator access to uninstall | UninstallPackage |
+| 0x20000218 | KMN_W_PackageUninstall_FileInUse | The file %0:s is in use and will be removed on next reboot | UninstallPackage |
+| 0x20000219 | KMN_W_UninstallFont_FontInUse | The font %0:s is in use and will be removed on next reboot. Please reboot before attempting to install any additional fonts | UninstallFont |
+| 0xA000021A | KMN_E_VisualKeyboard_Install_AlreadyInstalled | A visual keyboard is already installed for keyboard %0:s | InstallVisualKeyboard |
+| 0xA000021B | KMN_E_VisualKeyboard_Install_CouldNotInstall | The visual keyboard %0:s could not be installed | InstallVisualKeyboard |
+| 0xA000021C | KMN_E_VisualKeyboard_Install_KeyboardNotInstalled | The visual keyboard %0:s could not be installed because the keyboard %1:s was not found | InstallVisualKeyboard |
+| 0xA000021D | KMN_E_KeymanControl_CannotLoadKeyman32 | Could not load keyman32.dll. Windows returned the error code %0:8x (%1:s) | Control |
+| 0xA000021E | KMN_E_KeymanControl_CannotStartProduct | Could not find %0:s to start Keyman Product %1:s | Control |
+| 0xA000021F | KMN_E_KeymanControl_CannotRegisterControllerWindow | Could not register controller window | Control |
+| 0xA0000220 | KMN_E_KeymanControl_CannotUnregisterControllerWindow | Could not unregister controller window | Control |
+| 0xA0000221 | KMN_E_KeyboardInstall_UnableToCopyFile | Unable to copy file %0:s to %1:s - you may have insufficient privileges, or you may have run out of disk space. | InstallKeyboard |
+| 0xA0000222 | KMN_E_Install_KeyboardMustBeInstalledByAdmin | Error installing keyboard %0:s: Keyman requires keyboards to be installed by administrator | InstallKeyboard |
+| 0x20000223 | KMN_W_KeyboardUninstall_ProfileNotFound | A language profile for %0:s could not be uninstalled for %1:s (it may be missing) | UninstallKeyboardLanguageProfile |
+| 0xA0000224 | KMN_E_ProfileInstall_MustBeAllUsers | You do not have sufficient privileges to install the language profile for %0:s | InstallKeyboardLanguageProfile |
+| 0xA0000225 | KMN_E_ProfileUninstall_MustBeAllUsers | You do not have sufficient privileges to uninstall the language profile for %0:s | UninstallKeyboardLanguageProfile |
+| 0xA0000226 | KMN_E_ProfileInstall_KeyboardNotFound | The keyboard %0:s is not installed | InstallKeyboardLanguageProfile |
+| 0xA0000227 | KMN_E_RecompileMnemonicLayout_mcompileFailed | The keyboard %2:s was not generated because mcompile failed to start with error %0:d (%1:s) | RecompileMnemonicKeyboard |
+| 0xA0000228 | KMN_E_RecompileMnemonicLayout_mcompileError | The keyboard %2:s was not generated because mcompile failed with error %0:d: %1:s | RecompileMnemonicKeyboard |
+| 0xA0000229 | KMN_E_RecompileMnemonicLayout_mcompileUnexpected | The keyboard %0:s was not generated due to an unknown error. | RecompileMnemonicLayout |
+| 0x2000022A | KMN_W_KeyboardInstall_InvalidIcon | The icon for keyboard %0:s was not converted due to an error: %1:s | InstallKeyboard |
+| 0x2000022B | KMN_W_TSF_COMError | Error %0:s updating TSF | TSF |
diff --git a/windows/docs/engine/api/IKeymanError/Severity.md b/windows/docs/engine/api/IKeymanError/Severity.md
new file mode 100644
index 0000000000..0dfa0d7f34
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanError/Severity.md
@@ -0,0 +1,23 @@
+---
+title: IKeymanError::Severity Property
+---
+
+## Introduction
+
+The `IKeymanError::Severity` property returns the severity level of the
+error.
+
+## Specification
+
+``` clike
+readonly KeymanErrorSeverity Severity
+```
+
+## Severity Levels
+
+| Value | Name |
+|-------|------------|
+| 0 | kesFatal |
+| 1 | kesError |
+| 2 | kesWarning |
+| 3 | kesHint |
diff --git a/windows/docs/engine/api/IKeymanError/index.md b/windows/docs/engine/api/IKeymanError/index.md
new file mode 100644
index 0000000000..691768e6b2
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanError/index.md
@@ -0,0 +1,32 @@
+---
+title: IKeymanError Interface
+---
+
+## Introduction
+
+The `IKeymanError` interface provides information about an error that
+Keyman Engine encountered.
+
+## Interface Hierarchy
+
+`IDispatch`
+
+> [`IKeymanObject`](../IKeymanObject)
+>
+> > **`IKeymanError`**
+
+
+## Properties
+
+[`ErrorCode`](ErrorCode) read only
+: Returns an integer code for the error.
+
+
+
+[`Description`](Description) read only
+: Returns a human-readable description of the error.
+
+
+
+[`Severity`](Severity) read only
+: Returns a `KeymanErrorSeverity` value for the error.
diff --git a/windows/docs/engine/api/IKeymanErrors/Clear.md b/windows/docs/engine/api/IKeymanErrors/Clear.md
new file mode 100644
index 0000000000..f23ac277a6
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanErrors/Clear.md
@@ -0,0 +1,14 @@
+---
+title: IKeymanErrors::Clear Method
+---
+
+## Introduction
+
+The `IKeymanErrors::Clear` method removes all
+[`IKeymanError`](../IKeymanError) entries from the collection.
+
+## Specification
+
+``` clike
+void Clear(void)
+```
diff --git a/windows/docs/engine/api/IKeymanErrors/Items.md b/windows/docs/engine/api/IKeymanErrors/Items.md
new file mode 100644
index 0000000000..e5cd965665
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanErrors/Items.md
@@ -0,0 +1,21 @@
+---
+title: IKeymanErrors::Items[Index] Property
+---
+
+## Introduction
+
+The `IKeymanErrors::Items[Index]` property returns a
+[`IKeymanError`](../IKeymanError) reference identified by `Index`. If
+the index is out of range, exception
+[`KMN_E_Collection_InvalidIndex`](../IKeymanError/ErrorCode) is raised.
+
+## Specification
+
+``` clike
+readonly IKeymanError* Items[long Index]
+```
+
+## Parameters
+
+Index
+: A zero-based integer index .
diff --git a/windows/docs/engine/api/IKeymanErrors/index.md b/windows/docs/engine/api/IKeymanErrors/index.md
new file mode 100644
index 0000000000..3ed1954845
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanErrors/index.md
@@ -0,0 +1,28 @@
+---
+title: IKeymanErrors Interface
+---
+
+## Introduction
+
+The `IKeymanErrors` interface lists errors encountered by Keyman Engine
+in a previous command such as installing a package.
+
+## Interface Hierarchy
+
+`IDispatch`
+
+> [`IKeymanObject`](../IKeymanObject)
+>
+> > [`IKeymanCollection`](../IKeymanCollection)
+> >
+> > > **`IKeymanErrors`**
+
+## Properties
+
+[`Items[Index]`](Items) read only
+: Returns an [`IKeymanError`](../IKeymanError) reference at `Index`.
+
+## Methods
+
+[`Clear()`](Clear)
+: Clears the collection.
diff --git a/windows/docs/engine/api/IKeymanHotkey/Clear.md b/windows/docs/engine/api/IKeymanHotkey/Clear.md
new file mode 100644
index 0000000000..7b1fb856a1
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanHotkey/Clear.md
@@ -0,0 +1,19 @@
+---
+title: IKeymanHotkey::Clear() Method
+---
+
+## Introduction
+
+The `IKeymanHotkey::Clear()` method clears the hotkey value.
+
+Changes to the hotkey will be applied after
+[`IKeymanKeyboardsInstalled::Apply`](../IKeymanKeyboardsInstalled/Apply)
+is called for a keyboard hotkey, or after
+[`IKeymanHotkeys::Apply`](../IKeymanHotkeys/Apply) is called for other
+hotkeys.
+
+## Specification
+
+``` clike
+void Clear(void)
+```
diff --git a/windows/docs/engine/api/IKeymanHotkey/IsEmpty.md b/windows/docs/engine/api/IKeymanHotkey/IsEmpty.md
new file mode 100644
index 0000000000..d6550be6d4
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanHotkey/IsEmpty.md
@@ -0,0 +1,14 @@
+---
+title: IKeymanHotkey::IsEmpty() Method
+---
+
+## Introduction
+
+The `IKeymanHotkey::IsEmpty()` method returns `True` if the hotkey value
+is zero, or empty.
+
+## Specification
+
+``` clike
+boolean IsEmpty(void)
+```
diff --git a/windows/docs/engine/api/IKeymanHotkey/Modifiers.md b/windows/docs/engine/api/IKeymanHotkey/Modifiers.md
new file mode 100644
index 0000000000..b515273da8
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanHotkey/Modifiers.md
@@ -0,0 +1,28 @@
+---
+title: IKeymanHotkey::Modifiers Property
+---
+
+## Introduction
+
+The `IKeymanHotkey::Modifiers` property controls the set of modifiers
+associated with the hotkey.
+
+Changes to the hotkey will be applied after
+[`IKeymanKeyboardsInstalled::Apply`](../IKeymanKeyboardsInstalled/Apply)
+is called for a keyboard hotkey, or after
+[`IKeymanHotkeys::Apply`](../IKeymanHotkeys/Apply) is called for other
+hotkeys.
+
+## Specification
+
+``` clike
+KeymanHotkeyModifiers Modifiers
+```
+
+## Modifier Values
+
+| Value | Modifier |
+|---------|----------|
+| 0x10000 | HK_ALT |
+| 0x20000 | HK_CTRL |
+| 0x40000 | HK_SHIFT |
diff --git a/windows/docs/engine/api/IKeymanHotkey/RawValue.md b/windows/docs/engine/api/IKeymanHotkey/RawValue.md
new file mode 100644
index 0000000000..1fd2eb6ebd
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanHotkey/RawValue.md
@@ -0,0 +1,21 @@
+---
+title: IKeymanHotkey::RawValue Property
+---
+
+## Introduction
+
+The `IKeymanHotkey::RawValue` property sets or returns the raw hotkey
+value, which is the [`Modifiers`](Modifiers) property bitwise or-ed with
+the [`VirtualKey`](VirtualKey) property.
+
+Changes to the hotkey will be applied after
+[`IKeymanKeyboardsInstalled::Apply`](../IKeymanKeyboardsInstalled/Apply)
+is called for a keyboard hotkey, or after
+[`IKeymanHotkeys::Apply`](../IKeymanHotkeys/Apply) is called for other
+hotkeys.
+
+## Specification
+
+``` clike
+long RawValue
+```
diff --git a/windows/docs/engine/api/IKeymanHotkey/Target.md b/windows/docs/engine/api/IKeymanHotkey/Target.md
new file mode 100644
index 0000000000..ae492b28e3
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanHotkey/Target.md
@@ -0,0 +1,30 @@
+---
+title: IKeymanHotkey::Target Property
+---
+
+## Introduction
+
+The `IKeymanHotkey::Target` property returns the target of the hotkey.
+For a hotkey associated with a keyboard, this will always be
+`khKeyboard`.
+
+## Specification
+
+``` clike
+readonly KeymanHotkeyTarget Target
+```
+
+## Target Values
+
+| Value | Target | Notes |
+|----|----|----|
+| 0 | khKeymanOff | Switches to first Windows keyboard which is not a Keyman keyboard |
+| 1 | khKeyboardMenu | Opens the Keyman keyboard menu from the notification area |
+| 2 | khVisualKeyboard | Opens the On Screen Keyboard page in the on screen keyboard. If the On Screen Keyboard page is already visible, closes the on screen keyboard |
+| 3 | khKeymanConfiguration | Opens Keyman Configuration |
+| 4 | khKeyboardUsage | Deprecated. Has no effect in Keyman 14 and later versions. |
+| 5 | khFontHelper | Opens the Font Helper page in the on screen keyboard. If the Font Helper page is already visible, closes the on screen keyboard |
+| 6 | khCharacterMap | Opens the Character Map page in the on screen keyboard. If the Character Map page is already visible, closes the on screen keyboard |
+| 7 | khTextEditor | Opens the Keyman Text Editor |
+| 8 | khLanguageSwitch | Opens the Language Switcher |
+| 9 | khKeyboard | Selects or Toggles the keyboard associated with the hotkey. |
diff --git a/windows/docs/engine/api/IKeymanHotkey/VirtualKey.md b/windows/docs/engine/api/IKeymanHotkey/VirtualKey.md
new file mode 100644
index 0000000000..f2ede709a5
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanHotkey/VirtualKey.md
@@ -0,0 +1,20 @@
+---
+title: IKeymanHotkey::VirtualKey Property
+---
+
+## Introduction
+
+The `IKeymanHotkey::VirtualKey` property sets or returns the virtual key
+associated with the hotkey.
+
+Changes to the hotkey will be applied after
+[`IKeymanKeyboardsInstalled::Apply`](../IKeymanKeyboardsInstalled/Apply)
+is called for a keyboard hotkey, or after
+[`IKeymanHotkeys::Apply`](../IKeymanHotkeys/Apply) is called for other
+hotkeys.
+
+## Specification
+
+``` clike
+long VirtualKey
+```
diff --git a/windows/docs/engine/api/IKeymanHotkey/index.md b/windows/docs/engine/api/IKeymanHotkey/index.md
new file mode 100644
index 0000000000..1dbe026e73
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanHotkey/index.md
@@ -0,0 +1,50 @@
+---
+title: IKeymanHotkey Interface
+---
+
+## Introduction
+
+The `IKeymanHotkey` interface describes a hotkey associated with an
+action or a keyboard.
+
+## Interface Hierarchy
+
+`IDispatch`
+
+> [`IKeymanObject`](../IKeymanObject)
+>
+> > **`IKeymanHotkey`**
+
+
+## Properties
+
+[`Modifiers`](Modifiers)
+: Returns a set of modifier keys used by the hotkey.
+
+
+
+[`RawValue`](RawValue)
+: Returns the raw hotkey value, a combination of `Modifiers` and
+ `VirtualKey`.
+
+
+
+[`Target`](Target) read only
+: Returns the action that will be taken when the hotkey is pressed by
+ the user.
+
+
+
+[`VirtualKey`](VirtualKey)
+: Returns the Windows virtual key code of the hotkey.
+
+## Methods
+
+[`Clear()`](Clear)
+: Clears the hotkey value. It does not remove the hotkey from the
+ collection.
+
+
+
+[`IsEmpty()`](IsEmpty)
+: Returns `True` if the hotkey is empty.
diff --git a/windows/docs/engine/api/IKeymanHotkeys/Apply.md b/windows/docs/engine/api/IKeymanHotkeys/Apply.md
new file mode 100644
index 0000000000..a707d4f479
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanHotkeys/Apply.md
@@ -0,0 +1,14 @@
+---
+title: IKeymanHotkeys::Apply() Method
+---
+
+## Introduction
+
+The `IKeymanHotkeys::Apply()` method applies changes to the keyboard
+hotkeys to Keyman Engine.
+
+## Specification
+
+``` clike
+void Apply(void)
+```
diff --git a/windows/docs/engine/api/IKeymanHotkeys/Items.md b/windows/docs/engine/api/IKeymanHotkeys/Items.md
new file mode 100644
index 0000000000..4b04b449ff
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanHotkeys/Items.md
@@ -0,0 +1,22 @@
+---
+title: IKeymanHotkeys::Items[Index] Property
+---
+
+## Introduction
+
+The `IKeymanHotkeys::Items[Index]` property returns an
+[`IKeymanHotkey`](../IKeymanHotkey) reference to the hotkey by `Index`.
+If the hotkey is not found, exception
+[`KMN_E_Collection_InvalidIndex`](../IKeymanError/ErrorCode) is raised.
+The `Index` is the enumerated type `KeymanHotkeyTarget`.
+
+## Specification
+
+``` clike
+readonly IKeymanHotkey* Items[KeymanHotkeyTarget Index]
+```
+
+## Parameters
+
+Index
+: The [target](../IKeymanHotkey/Target) of the hotkey.
diff --git a/windows/docs/engine/api/IKeymanHotkeys/Reset.md b/windows/docs/engine/api/IKeymanHotkeys/Reset.md
new file mode 100644
index 0000000000..c8f51e6b1e
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanHotkeys/Reset.md
@@ -0,0 +1,15 @@
+---
+title: IKeymanHotkeys::Reset() Method
+---
+
+## Introduction
+
+The `IKeymanHotkeys::Reset()` method resets the value of all hotkeys in
+the collection to empty. [`Apply`](Apply) must be called for the changes
+to take effect.
+
+## Specification
+
+``` clike
+void Reset(void)
+```
diff --git a/windows/docs/engine/api/IKeymanHotkeys/index.md b/windows/docs/engine/api/IKeymanHotkeys/index.md
new file mode 100644
index 0000000000..451d9a07ff
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanHotkeys/index.md
@@ -0,0 +1,33 @@
+---
+title: IKeymanHotkeys Interface
+---
+
+## Introduction
+
+The `IKeymanHotkeys` interface lists hotkeys configured for Keyman
+Engine.
+
+## Interface Hierarchy
+
+`IDispatch`
+
+> [`IKeymanObject`](../IKeymanObject)
+>
+> > [`IKeymanCollection`](../IKeymanCollection)
+> >
+> > > **`IKeymanHotkeys`**
+
+## Properties
+
+[`Items[Index]`](Items) read only
+: Returns an [`IKeymanHotkey`](../IKeymanHotkey) reference for the
+ hotkey identified by `Index`.
+
+## Methods
+
+[`Apply()`](Apply)
+: Applies changes to the hotkeys in the collection to Keyman Engine.
+
+
+[`Reset()`](Reset)
+: Resets all hotkeys in the collection to empty.
diff --git a/windows/docs/engine/api/IKeymanKeyboard/Bitmap.md b/windows/docs/engine/api/IKeymanKeyboard/Bitmap.md
new file mode 100644
index 0000000000..7dd57e9791
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanKeyboard/Bitmap.md
@@ -0,0 +1,16 @@
+---
+title: IKeymanKeyboard::Bitmap Property
+---
+
+## Introduction
+
+The `IKeymanKeyboard::Bitmap` property returns an `IPicture` reference
+to the icon included in the keyboard file as specified by
+[`&bitmap`](/developer/language/reference/bitmap). If no icon is
+included, a default icon is returned.
+
+## Specification
+
+``` clike
+readonly IPicture* Bitmap
+```
diff --git a/windows/docs/engine/api/IKeymanKeyboard/Copyright.md b/windows/docs/engine/api/IKeymanKeyboard/Copyright.md
new file mode 100644
index 0000000000..07bfb1237f
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanKeyboard/Copyright.md
@@ -0,0 +1,15 @@
+---
+title: IKeymanKeyboard::Copyright Property
+---
+
+## Introduction
+
+The `IKeymanKeyboard::Copyright` property returns the
+[`©right`](/developer/language/reference/copyright) string from the
+keyboard file.
+
+## Specification
+
+``` clike
+readonly string Copyright
+```
diff --git a/windows/docs/engine/api/IKeymanKeyboard/DefaultBCP47Languages.md b/windows/docs/engine/api/IKeymanKeyboard/DefaultBCP47Languages.md
new file mode 100644
index 0000000000..31ad705159
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanKeyboard/DefaultBCP47Languages.md
@@ -0,0 +1,19 @@
+---
+title: IKeymanKeyboard::DefaultBCP47Languages Property
+---
+
+## Introduction
+
+The `IKeymanKeyboard::DefaultBCP47Languages` property returns the
+[`ðnologuecode`](/developer/language/reference/ethnologuecode) string
+from the keyboard file. The first language code in the string is the
+primary language.
+
+This is informational data and may not be the same as the currently
+linked languages for the keyboard.
+
+## Specification
+
+``` clike
+readonly string DefaultBCP47Languages
+```
diff --git a/windows/docs/engine/api/IKeymanKeyboard/DefaultHotkey.md b/windows/docs/engine/api/IKeymanKeyboard/DefaultHotkey.md
new file mode 100644
index 0000000000..9884556200
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanKeyboard/DefaultHotkey.md
@@ -0,0 +1,18 @@
+---
+title: IKeymanKeyboard::DefaultHotkey Property
+---
+
+## Introduction
+
+The `IKeymanKeyboard::DefaultHotkey` property returns the
+[`&hotkey`](/developer/language/reference/hotkey) value from the
+keyboard file.
+
+This is informational data and may not be the same as the currently
+configured hotkey for the keyboard.
+
+## Specification
+
+``` clike
+readonly IKeymanHotkey* DefaultHotkey
+```
diff --git a/windows/docs/engine/api/IKeymanKeyboard/DefaultPrimaryLanguage.md b/windows/docs/engine/api/IKeymanKeyboard/DefaultPrimaryLanguage.md
new file mode 100644
index 0000000000..ae7abd7664
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanKeyboard/DefaultPrimaryLanguage.md
@@ -0,0 +1,21 @@
+---
+title: IKeymanKeyboard::DefaultPrimaryLanguage Property
+---
+
+## Introduction
+
+The `IKeymanKeyboard::DefaultPrimaryLanguage` property returns the
+[`&language`](/developer/language/reference/language) value from the
+keyboard file.
+
+This is informational data and may not be the same as the currently
+linked languages for the keyboard.
+
+In the future, this will be deprecated in favour of
+[`DefaultBCP47Languages`](DefaultBCP47Languages).
+
+## Specification
+
+``` clike
+readonly long DefaultPrimaryLanguage
+```
diff --git a/windows/docs/engine/api/IKeymanKeyboard/DefaultWindowsLanguages.md b/windows/docs/engine/api/IKeymanKeyboard/DefaultWindowsLanguages.md
new file mode 100644
index 0000000000..67fd74a4f9
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanKeyboard/DefaultWindowsLanguages.md
@@ -0,0 +1,22 @@
+---
+title: IKeymanKeyboard::DefaultWindowsLanguages Property
+---
+
+## Introduction
+
+The `IKeymanKeyboard::DefaultWindowsLanguages` property returns the
+[`&windowslanguages`](/developer/language/reference/windowslanguages)
+value from the keyboard file.
+
+This is informational data and may not be the same as the currently
+linked languages for the keyboard. This is a space separated list of
+hexadecimal coded Windows LANGID values.
+
+In the future, this will be deprecated in favour of
+[`DefaultBCP47Languages`](DefaultBCP47Languages).
+
+## Specification
+
+``` clike
+readonly long DefaultWindowsLanguages
+```
diff --git a/windows/docs/engine/api/IKeymanKeyboard/Encodings.md b/windows/docs/engine/api/IKeymanKeyboard/Encodings.md
new file mode 100644
index 0000000000..54c97f969f
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanKeyboard/Encodings.md
@@ -0,0 +1,24 @@
+---
+title: IKeymanKeyboard::Encodings Property
+---
+
+## Introduction
+
+The `IKeymanKeyboard::Encodings` property returns the supported
+encodings for the keyboard. Most keyboards should be `keUnicode`, but
+some legacy keyboards may return `keANSI`. It is possible for a keyboard
+to support both `keUnicode` and `keANSI` but these keyboards are rare
+and not recommended for general use.
+
+## Specification
+
+``` clike
+readonly KeymanKeyboardEncodings Encodings
+```
+
+## Encodings
+
+| Value | Name |
+|-------|-----------|
+| 1 | keANSI |
+| 2 | keUnicode |
diff --git a/windows/docs/engine/api/IKeymanKeyboard/Filename.md b/windows/docs/engine/api/IKeymanKeyboard/Filename.md
new file mode 100644
index 0000000000..b61ca04576
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanKeyboard/Filename.md
@@ -0,0 +1,20 @@
+---
+title: IKeymanKeyboard::Filename Property
+---
+
+## Introduction
+
+The `IKeymanKeyboard::Filename` property returns the fully qualified
+filename of the keyboard .kmx file. If the parent interface is
+[`IKeymanKeyboardFile`](../IKeymanKeyboardFile), then the filename is
+the same as the file used to instantiate the interface; otherwise, the
+file will be in the Keyman keyboard store, and should not be moved out
+of the store except by calling the
+[`IKeymanKeyboardInstalled::Uninstall`](../IKeymanKeyboardInstalled/Uninstall)
+method.
+
+## Specification
+
+``` clike
+readonly string Filename
+```
diff --git a/windows/docs/engine/api/IKeymanKeyboard/GetCharsUsed.md b/windows/docs/engine/api/IKeymanKeyboard/GetCharsUsed.md
new file mode 100644
index 0000000000..b2c60116c7
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanKeyboard/GetCharsUsed.md
@@ -0,0 +1,18 @@
+---
+title: IKeymanKeyboard::Version GetCharsUsed Method
+---
+
+## Introduction
+
+The `IKeymanKeyboard::GetCharsUsed` method returns the character
+repertoire of the keyboard layout, that is, the Unicode characters that
+the keyboard generates and references. This can be helpful for
+determining support for a given keyboard, e.g. related fonts, and is
+built up by scanning all the keyboard output and context strings in the
+keyboard layout.
+
+## Specification
+
+``` clike
+string GetCharsUsed(void)
+```
diff --git a/windows/docs/engine/api/IKeymanKeyboard/ID.md b/windows/docs/engine/api/IKeymanKeyboard/ID.md
new file mode 100644
index 0000000000..e3288f3ac6
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanKeyboard/ID.md
@@ -0,0 +1,21 @@
+---
+title: IKeymanKeyboard::ID Property
+---
+
+## Introduction
+
+The `IKeymanKeyboard::ID` property returns the base name of the keyboard
+.kmx file, sans extension. The full filename, including path, of the
+keyboard is available in the [`Filename`](Filename) property.
+
+No two keyboards can share the same identifier in a Keyman Engine
+installation. The identifier is case insensitive and should consist of
+letters, digits and underscores, although some legacy identifiers may
+contain other characters as well. The initial character of an identifier
+should be a letter.
+
+## Specification
+
+``` clike
+readonly string ID
+```
diff --git a/windows/docs/engine/api/IKeymanKeyboard/LayoutType.md b/windows/docs/engine/api/IKeymanKeyboard/LayoutType.md
new file mode 100644
index 0000000000..051c7d5675
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanKeyboard/LayoutType.md
@@ -0,0 +1,25 @@
+---
+title: IKeymanKeyboard::LayoutType Property
+---
+
+## Introduction
+
+The `IKeymanKeyboard::LayoutType` property returns the value of the
+[`&mnemoniclayout`](/developer/language/reference/mnemoniclayout) store.
+A keyboard layout that is mnemonic (`kltMnemonic`) is remapped by Keyman
+Engine according to the current Latin script-based base layout, whereas
+a keyboard layout that is positional (`kltPositional`) is not affected
+by the current base layout.
+
+## Specification
+
+``` clike
+readonly KeymanKeyboardLayoutType LayoutType
+```
+
+## Layout Types
+
+| Code | Value | Description |
+|----|----|----|
+| kltPositional | 0 | The keyboard layout is not affected by the current base layout. |
+| kltMnemonic | 1 | The keyboard layout has been remapped to match the current Latin script-based base layout. |
diff --git a/windows/docs/engine/api/IKeymanKeyboard/Message.md b/windows/docs/engine/api/IKeymanKeyboard/Message.md
new file mode 100644
index 0000000000..2749d19135
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanKeyboard/Message.md
@@ -0,0 +1,16 @@
+---
+title: IKeymanKeyboard::Message Property
+---
+
+## Introduction
+
+The `IKeymanKeyboard::Message` property returns the
+[`&message`](/developer/language/reference/message) string from the
+keyboard file. This value is typically displayed when a keyboard is
+installed and in the configuration user interface.
+
+## Specification
+
+``` clike
+readonly string Message
+```
diff --git a/windows/docs/engine/api/IKeymanKeyboard/Name.md b/windows/docs/engine/api/IKeymanKeyboard/Name.md
new file mode 100644
index 0000000000..f422889541
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanKeyboard/Name.md
@@ -0,0 +1,22 @@
+---
+title: IKeymanKeyboard::Name Property
+---
+
+## Introduction
+
+The `IKeymanKeyboard::Name` property returns the
+[`&name`](/developer/language/reference/name) string from the keyboard
+file. This name is shown to the user in the Keyman Engine user interface
+and in the Windows keyboard picker.
+
+The `Name` property is not related to the [`ID`](ID) property or the
+
+Filename
+
+property.
+
+## Specification
+
+``` clike
+readonly string Name
+```
diff --git a/windows/docs/engine/api/IKeymanKeyboard/Version.md b/windows/docs/engine/api/IKeymanKeyboard/Version.md
new file mode 100644
index 0000000000..95295c22db
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanKeyboard/Version.md
@@ -0,0 +1,21 @@
+---
+title: IKeymanKeyboard::Version Property
+---
+
+## Introduction
+
+The `IKeymanKeyboard::Version` property returns the
+[`&keyboardversion`](/developer/language/reference/keyboardversion)
+string from the keyboard file. This represents the current version of
+the keyboard file, and is in the form of a dotted numeric string.
+
+The `Version` property is not related to the
+[`&version`](/developer/language/reference/version) store, which
+determines the minimum Keyman Engine version which a keyboard can be run
+under.
+
+## Specification
+
+``` clike
+readonly string Version
+```
diff --git a/windows/docs/engine/api/IKeymanKeyboard/index.md b/windows/docs/engine/api/IKeymanKeyboard/index.md
new file mode 100644
index 0000000000..a7d4488bac
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanKeyboard/index.md
@@ -0,0 +1,82 @@
+---
+title: IKeymanKeyboard Interface
+---
+
+## Introduction
+
+The `IKeymanKeyboard` interface describes a keyboard in Keyman Engine
+for Windows API. It is a base class and describes both installed
+keyboards and keyboard files.
+
+## Interface Hierarchy
+
+`IDispatch`
+
+> [`IKeymanObject`](../IKeymanObject)
+>
+> > **`IKeymanKeyboard`**
+> >
+> > > [`IKeymanKeyboardFile`](../IKeymanKeyboardFile)
+> > >
+> > > > [`IKeymanKeyboardFile2`](../IKeymanKeyboardFile2)
+> > >
+> > > [`IKeymanKeyboardInstalled`](../IKeymanKeyboardInstalled)
+
+## Properties
+
+[`Bitmap`](Bitmap) read only
+: Returns the [`&bitmap`](/developer/language/reference/bitmap) icon
+ from the keyboard file as an `IPicture`.
+
+[`Copyright`](Copyright) read only
+: Returns the [`©right`](/developer/language/reference/copyright)
+ string from the keyboard file.
+
+[`DefaultBCP47Languages`](DefaultBCP47Languages) read only
+: Returns the set of default language ids for the keyboard as a
+ space-separated list of BCP 47 codes. The first code in the list is
+ the primary language.
+
+[`DefaultHotkey`](DefaultHotkey) read only
+: Returns the default hotkey for the keyboard.
+
+[`DefaultPrimaryLanguage`](DefaultPrimaryLanguage) read only
+: Returns the default primary language id for the keyboard.
+
+[`DefaultWindowsLanguages`](DefaultWindowsLanguages) read only
+: Returns the set of default language ids for the keyboard as a
+ space-separated list of hexadecimal strings.
+
+[`Encodings`](Encodings) read only
+: Returns the set of encodings supported by the keyboard layout.
+
+[`Filename`](Filename) read only
+: Returns the fully-qualified filename of the keyboard file.
+
+[`ID`](ID) read only
+: Returns the identifier for the keyboard, which is the base name of
+ the keyboard file without extension.
+
+[`LayoutType`](LayoutType) read only
+: Returns the layout type of the keyboard as specified by the
+ [`&mnemoniclayout`](/developer/language/reference/mnemoniclayout)
+ store.
+
+[`Message`](Message) read only
+: Returns the [`&message`](/developer/language/reference/message)
+ string from the keyboard file.
+
+[`Name`](Name) read only
+: Returns the [`&name`](/developer/language/reference/name) from the
+ keyboard file.
+
+[`Version`](Version) read only
+: Returns the
+ [`&keyboardversion`](/developer/language/reference/keyboardversion)
+ string from the keyboard file.
+
+## Methods
+
+[`GetCharsUsed()`](GetCharsUsed)
+: Returns a string with every Unicode character used or generated by
+ the keyboard.
diff --git a/windows/docs/engine/api/IKeymanKeyboardFile/Install.md b/windows/docs/engine/api/IKeymanKeyboardFile/Install.md
new file mode 100644
index 0000000000..bd66a121e7
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanKeyboardFile/Install.md
@@ -0,0 +1,47 @@
+---
+title: IKeymanKeyboardFile::Install Method
+---
+
+## Introduction
+
+The `IKeymanKeyboardFile::Install` method installs the keyboard file
+(.kmx) into Keyman Engine for Windows. This includes copying the file
+into the Keyman Engine keyboard store, adding registry settings, and
+installing the Windows input method. As installing Windows input methods
+is an asynchronous process, this method may not be complete when it
+returns.
+
+This method adds the keyboard to the default language as specified in
+the
+[`IKeymanKeyboard::DefaultBCP47Languages`](../IKeymanKeyboard/DefaultBCP47Languages)
+property. This method is the same as calling
+[`IKeymanKeyboardsInstalled::Install`](../IKeymanKeyboardsInstalled/Install)
+and passing the
+[`IKeymanKeyboard::Filename`](../IKeymanKeyboard/Filename) property from
+this instance.
+
+This method requires elevated privileges.
+
+## Specification
+
+``` clike
+void Install(bool Force)
+```
+
+## Parameters
+
+`Force`
+: If `True`, overwrites an existing keyboard entry.
+
+## See also
+
+[`IKeymanKeyboardsInstalled::Install`](../IKeymanKeyboardsInstalled/Install)
+: Installs a keyboard file and input method for default language
+
+[`IKeymanKeyboardsInstalled::Install2`](../IKeymanKeyboardsInstalled2/Install2)
+: Installs a keyboard file, optionally with input method for default
+ language
+
+[`IKeymanKeyboardFile2::Install2`](../IKeymanKeyboardFile2/Install2)
+: Installs a keyboard file, optionally with input method for default
+ language
diff --git a/windows/docs/engine/api/IKeymanKeyboardFile/Languages.md b/windows/docs/engine/api/IKeymanKeyboardFile/Languages.md
new file mode 100644
index 0000000000..aae9d15cc7
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanKeyboardFile/Languages.md
@@ -0,0 +1,16 @@
+---
+title: IKeymanKeyboardFile::Languages Property
+---
+
+## Introduction
+
+The `IKeymanKeyboardFile::Languages` property returns an
+[`IKeymanKeyboardLanguagesFile`](../IKeymanKeyboardLanguagesFile)
+reference which lists the BCP 47 languages that are suggested for use
+with the keyboard, as extracted from the package metadata.
+
+## Specification
+
+``` clike
+readonly IKeymanKeyboardLanguagesFile* Languages
+```
diff --git a/windows/docs/engine/api/IKeymanKeyboardFile/index.md b/windows/docs/engine/api/IKeymanKeyboardFile/index.md
new file mode 100644
index 0000000000..dd62427b4c
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanKeyboardFile/index.md
@@ -0,0 +1,31 @@
+---
+title: IKeymanKeyboardFile Interface
+---
+
+## Introduction
+
+The `IKeymanKeyboardFile` interface describes a keyboard file. The file
+will not have been installed but can be any keyboard file on disk.
+
+## Interface Hierarchy
+
+`IDispatch`
+
+> [`IKeymanObject`](../IKeymanObject)
+>
+> > [`IKeymanKeyboard`](../IKeymanKeyboard)
+> >
+> > > **`IKeymanKeyboardFile`**
+> > >
+> > > > [`IKeymanKeyboardFile2`](../IKeymanKeyboardFile2)
+
+## Properties
+
+[`Languages`](Languages)
+: Lists the languages associated with the keyboard, as retrieved from
+ package metadata.
+
+## Methods
+
+[`Install()`](Install)
+: Installs the keyboard file into Keyman Engine for Windows.
diff --git a/windows/docs/engine/api/IKeymanKeyboardFile2/Install2.md b/windows/docs/engine/api/IKeymanKeyboardFile2/Install2.md
new file mode 100644
index 0000000000..5af6979a79
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanKeyboardFile2/Install2.md
@@ -0,0 +1,50 @@
+---
+title: IKeymanKeyboardFile2::Install2 Method
+---
+
+## Introduction
+
+The `IKeymanKeyboardFile2::Install2` method installs the keyboard file
+(.kmx) into Keyman Engine for Windows. This includes copying the file
+into the Keyman Engine keyboard store, adding registry settings, and
+optionally installing the Windows input method. As installing Windows
+input methods is an asynchronous process, this method may not be
+complete when it returns.
+
+This method adds the keyboard to the default language as specified in
+the
+[`IKeymanKeyboard::DefaultBCP47Languages`](../IKeymanKeyboard/DefaultBCP47Languages)
+property. This method is the same as calling
+[`IKeymanKeyboardsInstalled::Install`](../IKeymanKeyboardsInstalled/Install)
+and passing the
+[`IKeymanKeyboard::Filename`](../IKeymanKeyboard/Filename) property from
+this instance.
+
+This method requires elevated privileges.
+
+## Specification
+
+``` clike
+void Install(bool Force, bool InstallDefaultLanguage)
+```
+
+## Parameters
+
+`Force`
+: If `True`, overwrites an existing keyboard entry.
+
+`InstallDefaultLanguage`
+: If `True`, installs the Windows input method for the default
+ language.
+
+## See also
+
+[`IKeymanKeyboardsInstalled::Install`](../IKeymanKeyboardsInstalled/Install)
+: Installs a keyboard file and input method for default language
+
+[`IKeymanKeyboardsInstalled::Install2`](../IKeymanKeyboardsInstalled2/Install2)
+: Installs a keyboard file, optionally with input method for default
+ language
+
+[`IKeymanKeyboardFile::Install`](../IKeymanKeyboardFile/Install)
+: Installs a keyboard file and input method for default language
diff --git a/windows/docs/engine/api/IKeymanKeyboardFile2/index.md b/windows/docs/engine/api/IKeymanKeyboardFile2/index.md
new file mode 100644
index 0000000000..fbbc57b3ea
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanKeyboardFile2/index.md
@@ -0,0 +1,30 @@
+---
+title: IKeymanKeyboardFile2 Interface
+---
+
+## Introduction
+
+The `IKeymanKeyboardFile2` interface describes a keyboard file. The file
+will not have been installed but can be any keyboard file on disk.
+
+## Interface Hierarchy
+
+`IDispatch`
+
+> [`IKeymanObject`](../IKeymanObject)
+>
+> > [`IKeymanKeyboard`](../IKeymanKeyboard)
+> >
+> > > [`IKeymanKeyboardFile`](../IKeymanKeyboardFile)
+> > >
+> > > > **`IKeymanKeyboardFile2`**
+
+## Methods
+
+[`Install2()`](Install2)
+: Installs the keyboard file into Keyman Engine for Windows, with
+ option to install default language at same time.
+
+## History
+
+Added in Keyman Engine for Windows 14.0.
diff --git a/windows/docs/engine/api/IKeymanKeyboardInstalled/IconFilename.md b/windows/docs/engine/api/IKeymanKeyboardInstalled/IconFilename.md
new file mode 100644
index 0000000000..11e498c122
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanKeyboardInstalled/IconFilename.md
@@ -0,0 +1,17 @@
+---
+title: IKeymanKeyboardInstalled::IconFilename Property
+---
+
+## Introduction
+
+The `IKeymanKeyboardInstalled::IconFilename` property returns the fully
+qualified filename of a Windows .ico file that is generated from the
+icon resource contained within the keyboard when the keyboard is
+installed. This icon file is used when Keyman creates a Windows input
+method associated with the Keyman keyboard layout.
+
+## Specification
+
+``` clike
+readonly string IconFilename
+```
diff --git a/windows/docs/engine/api/IKeymanKeyboardInstalled/InstallVisualKeyboard.md b/windows/docs/engine/api/IKeymanKeyboardInstalled/InstallVisualKeyboard.md
new file mode 100644
index 0000000000..88f66d2d8b
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanKeyboardInstalled/InstallVisualKeyboard.md
@@ -0,0 +1,30 @@
+---
+title: IKeymanKeyboardInstalled::InstallVisualKeyboard Method
+---
+
+## Introduction
+
+The `IKeymanKeyboardInstalled::InstallVisualKeyboard` method installs a
+visual keyboard file (.kvk) and associates it with the keyboard. The
+visual keyboard file is copied into the Keyman keyboard store. If a
+visual keyboard is already installed for the keyboard, then the new
+visual keyboard replaces the old one.
+
+Typically, a keyboard and visual keyboard will be installed together as
+part of a package, but this method can be helpful for testing and
+development of keyboards.
+
+Changes associated with calling this method are applied immediately;
+[`IKeymanKeyboardsInstalled::Apply`](../IKeymanKeyboardsInstalled/Apply)
+does not need to be called.
+
+A visual keyboard can be uninstalled with
+[`IKeymanVisualKeyboard::Uninstall`](../IKeymanVisualKeyboard/Uninstall).
+
+This method requires elevated privileges.
+
+## Specification
+
+``` clike
+void InstallVisualKeyboard(string Filename)
+```
diff --git a/windows/docs/engine/api/IKeymanKeyboardInstalled/KeymanID.md b/windows/docs/engine/api/IKeymanKeyboardInstalled/KeymanID.md
new file mode 100644
index 0000000000..b77e5025e4
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanKeyboardInstalled/KeymanID.md
@@ -0,0 +1,16 @@
+---
+title: IKeymanKeyboardInstalled::KeymanID Property
+---
+
+## Introduction
+
+The `IKeymanKeyboardInstalled::KeymanID` property returns the integer
+identifier for the keyboard used internally by Keyman Engine. This
+number is generated when Keyman Engine starts and may be changed at any
+time.
+
+## Specification
+
+``` clike
+readonly long KeymanID
+```
diff --git a/windows/docs/engine/api/IKeymanKeyboardInstalled/Languages.md b/windows/docs/engine/api/IKeymanKeyboardInstalled/Languages.md
new file mode 100644
index 0000000000..663fe31c4a
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanKeyboardInstalled/Languages.md
@@ -0,0 +1,17 @@
+---
+title: IKeymanKeyboardInstalled::Languages Property
+---
+
+## Introduction
+
+The `IKeymanKeyboardInstalled::Languages` property returns an
+[`IKeymanKeyboardLanguagesInstalled`](../IKeymanKeyboardLanguagesInstalled)
+reference which lists the Windows languages with which the keyboard is
+currently associated, as well as any suggested languages for the
+keyboard that are not currently installed.
+
+## Specification
+
+``` clike
+readonly IKeymanKeyboardLanguagesInstalled* Languages
+```
diff --git a/windows/docs/engine/api/IKeymanKeyboardInstalled/Loaded.md b/windows/docs/engine/api/IKeymanKeyboardInstalled/Loaded.md
new file mode 100644
index 0000000000..37f69faf67
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanKeyboardInstalled/Loaded.md
@@ -0,0 +1,17 @@
+---
+title: IKeymanKeyboardInstalled::Loaded Property
+---
+
+## Introduction
+
+The `IKeymanKeyboardInstalled::Loaded` property controls whether or not
+the keyboard is currently available for use and visible to the user in
+the keyboard picker. When this property is changed,
+[`IKeymanKeyboardsInstalled::Apply`](../IKeymanKeyboardsInstalled/Apply)
+must be called to apply the setting to Keyman Engine.
+
+## Specification
+
+``` clike
+bool Loaded
+```
diff --git a/windows/docs/engine/api/IKeymanKeyboardInstalled/Options.md b/windows/docs/engine/api/IKeymanKeyboardInstalled/Options.md
new file mode 100644
index 0000000000..f52e837607
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanKeyboardInstalled/Options.md
@@ -0,0 +1,18 @@
+---
+title: IKeymanKeyboardInstalled::Options Property
+---
+
+## Introduction
+
+The `IKeymanKeyboardInstalled::Options` property returns an
+[`IKeymanKeyboardOptions`](../IKeymanKeyboardOptions) reference which
+lists the user-configurable options for the keyboard layout. Changes to
+this collection will be applied after
+[`IKeymanKeyboardsInstalled::Apply`](../IKeymanKeyboardsInstalled/Apply)
+is called.
+
+## Specification
+
+``` clike
+readonly IKeymanKeyboardOptions* Options
+```
diff --git a/windows/docs/engine/api/IKeymanKeyboardInstalled/OwnerPackage.md b/windows/docs/engine/api/IKeymanKeyboardInstalled/OwnerPackage.md
new file mode 100644
index 0000000000..615e367efb
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanKeyboardInstalled/OwnerPackage.md
@@ -0,0 +1,16 @@
+---
+title: IKeymanKeyboardInstalled::OwnerPackage Property
+---
+
+## Introduction
+
+The `IKeymanKeyboardInstalled::OwnerPackage` property returns an
+[`IKeymanPackageInstalled`](../IKeymanPackageInstalled) reference for
+the package which contained this keyboard when it was installed. If the
+keyboard was installed standalone, then `OwnerPackage` returns `null`.
+
+## Specification
+
+``` clike
+readonly IKeymanPackageInstalled* OwnerPackage
+```
diff --git a/windows/docs/engine/api/IKeymanKeyboardInstalled/Uninstall.md b/windows/docs/engine/api/IKeymanKeyboardInstalled/Uninstall.md
new file mode 100644
index 0000000000..0b7815ebb4
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanKeyboardInstalled/Uninstall.md
@@ -0,0 +1,26 @@
+---
+title: IKeymanKeyboardInstalled::Uninstall Method
+---
+
+## Introduction
+
+The `IKeymanKeyboardInstalled::Uninstall` method uninstalls the keyboard
+file (.kmx) and related artefacts from Keyman Engine for Windows. This
+includes deleting the files from the Keyman Engine keyboard store,
+removing registry settings, and removing Windows input methods.
+
+This method removes the keyboard layout from all languages it is
+associated with.
+
+Changes associated with calling this method are applied immediately;
+[`IKeymanKeyboardsInstalled::Apply`](../IKeymanKeyboardsInstalled/Apply)
+does not need to be called. However, changes to the Windows input
+methods are applied asynchronously.
+
+This method requires elevated privileges.
+
+## Specification
+
+``` clike
+void Uninstall(bool void)
+```
diff --git a/windows/docs/engine/api/IKeymanKeyboardInstalled/VisualKeyboard.md b/windows/docs/engine/api/IKeymanKeyboardInstalled/VisualKeyboard.md
new file mode 100644
index 0000000000..6fa8aeb434
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanKeyboardInstalled/VisualKeyboard.md
@@ -0,0 +1,19 @@
+---
+title: IKeymanKeyboardInstalled::VisualKeyboard Property
+---
+
+## Introduction
+
+The `IKeymanKeyboardInstalled::VisualKeyboard` property returns an
+[`IKeymanVisualKeyboard`](../IKeymanVisualKeyboard) reference for the
+visual keyboard associated with this keyboard. If no visual keyboard is
+installed for this keyboard, then `VisualKeyboard` returns `null`.
+
+A visual keyboard can be installed with
+[`InstallVisualKeyboard()`](InstallVisualKeyboard).
+
+## Specification
+
+``` clike
+readonly IKeymanVisualKeyboard* VisualKeyboard
+```
diff --git a/windows/docs/engine/api/IKeymanKeyboardInstalled/index.md b/windows/docs/engine/api/IKeymanKeyboardInstalled/index.md
new file mode 100644
index 0000000000..04fe7d283b
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanKeyboardInstalled/index.md
@@ -0,0 +1,79 @@
+---
+title: IKeymanKeyboardInstalled Interface
+---
+
+## Introduction
+
+The `IKeymanKeyboardInstalled` interface describes a keyboard file that
+has been installed and allows modification of [keyboard option
+values](Options) for the keyboard file.
+
+## Interface Hierarchy
+
+`IDispatch`
+
+> [`IKeymanObject`](../IKeymanObject)
+>
+> > [`IKeymanKeyboard`](../IKeymanKeyboard)
+> >
+> > > **`IKeymanKeyboardInstalled`**
+
+## Properties
+
+[`IconFilename`](IconFilename) read only
+: Returns the string filename of the icon file associated with the
+ keyboard. When the keyboard is installed the icon file is generated
+ from the icon resource contained within the keyboard.
+
+
+
+[`KeymanID`](KeymanID) read only
+: Returns the integer identifier for the keyboard used internally by
+ Keyman Engine.
+
+
+
+[`Languages`](Languages) read only
+: Returns an
+ [`IKeymanKeyboardLanguagesInstalled`](../IKeymanKeyboardLanguagesInstalled)
+ reference which lists the Windows languages with which the keyboard
+ is currently associated.
+
+
+
+[`Loaded`](Loaded)
+: Determines whether the keyboard layout is selectable by the user.
+ When unloaded, the keyboard is removed from the user's keyboard
+ picker.
+
+
+
+[`Options`](Options) read only
+: Returns an [`IKeymanKeyboardOptions`](../IKeymanKeyboardOptions)
+ reference which lists the user-configurable options for the keyboard
+ layout.
+
+
+
+[`OwnerPackage`](OwnerPackage) read only
+: If the keyboard was installed as part of a package, returns the
+ [`IKeymanPackageInstalled`](../IKeymanPackageInstalled) reference
+ for the package; otherwise returns `null`.
+
+
+
+[`VisualKeyboard`](VisualKeyboard) read only
+: If an associated visual keyboard is installed, returns the
+ [`IKeymanVisualKeyboard`](../IKeymanVisualKeyboard) reference for
+ the visual keyboard; otherwise returns `null`.
+
+## Methods
+
+[`InstallVisualKeyboard()`](InstallVisualKeyboard)
+: Installs a visual keyboard file into Keyman Engine for Windows and
+ associates it with the keyboard.
+
+
+
+[`Uninstall()`](Uninstall)
+: Uninstalls the keyboard from Keyman Engine for Windows.
diff --git a/windows/docs/engine/api/IKeymanKeyboardLanguage/BCP47Code.md b/windows/docs/engine/api/IKeymanKeyboardLanguage/BCP47Code.md
new file mode 100644
index 0000000000..c55902c0f5
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanKeyboardLanguage/BCP47Code.md
@@ -0,0 +1,14 @@
+---
+title: IKeymanKeyboardLanguage::BCP47Code Property
+---
+
+## Introduction
+
+The `IKeymanKeyboardLanguage::BCP47Code` property returns the BCP 47
+code for the language.
+
+## Specification
+
+``` clike
+readonly string BCP47Code
+```
diff --git a/windows/docs/engine/api/IKeymanKeyboardLanguage/LangID.md b/windows/docs/engine/api/IKeymanKeyboardLanguage/LangID.md
new file mode 100644
index 0000000000..f0060f6397
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanKeyboardLanguage/LangID.md
@@ -0,0 +1,15 @@
+---
+title: IKeymanKeyboardLanguage::LangID Property
+---
+
+## Introduction
+
+The `IKeymanKeyboardLanguage::LangID` property returns a Windows LANGID
+for the Windows language. If the language does not have a LangID
+defined, then this returns `0`.
+
+## Specification
+
+``` clike
+readonly long LangID
+```
diff --git a/windows/docs/engine/api/IKeymanKeyboardLanguage/Name.md b/windows/docs/engine/api/IKeymanKeyboardLanguage/Name.md
new file mode 100644
index 0000000000..96330a92c3
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanKeyboardLanguage/Name.md
@@ -0,0 +1,15 @@
+---
+title: IKeymanKeyboardLanguage::Name Property
+---
+
+## Introduction
+
+The `IKeymanKeyboardLanguage::Name` property returns the name of the
+language, usually supplied in the metadata in the package the keyboard
+is a part of.
+
+## Specification
+
+``` clike
+readonly BSTR Name
+```
diff --git a/windows/docs/engine/api/IKeymanKeyboardLanguage/OwnerKeyboard.md b/windows/docs/engine/api/IKeymanKeyboardLanguage/OwnerKeyboard.md
new file mode 100644
index 0000000000..d04f317314
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanKeyboardLanguage/OwnerKeyboard.md
@@ -0,0 +1,15 @@
+---
+title: IKeymanKeyboardLanguage::OwnerKeyboard Property
+---
+
+## Introduction
+
+The `IKeymanKeyboardLanguage::OwnerKeyboard` property returns
+[`IKeymanKeyboard`](../IKeymanKeyboard) reference for the keyboard that
+this interface belongs to.
+
+## Specification
+
+``` clike
+readonly IKeymanKeyboard* OwnerKeyboard
+```
diff --git a/windows/docs/engine/api/IKeymanKeyboardLanguage/index.md b/windows/docs/engine/api/IKeymanKeyboardLanguage/index.md
new file mode 100644
index 0000000000..fd838635c0
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanKeyboardLanguage/index.md
@@ -0,0 +1,40 @@
+---
+title: IKeymanKeyboardLanguage Interface
+---
+
+## Introduction
+
+The `IKeymanKeyboardLanguage` interface lists a language associated with
+a keyboard in Keyman Engine for Windows API.
+
+## Interface Hierarchy
+
+`IDispatch`
+
+> [`IKeymanObject`](../IKeymanObject)
+>
+> > **`IKeymanKeyboardLanguage`**
+> >
+> > > [`IKeymanKeyboardLanguageInstalled`](../IKeymanKeyboardLanguageInstalled)
+> > >
+> > > > [`IKeymanKeyboardLanguageInstalled2`](../IKeymanKeyboardLanguageInstalled2)
+
+## Properties
+
+[`BCP47Code`](BCP47Code) read only
+: Returns a BCP 47 code for the Windows language.
+
+
+
+[`LangID`](LangID) read only
+: Returns a Windows LANGID for the Windows language.
+
+
+
+[`OwnerKeyboard`](OwnerKeyboard) read only
+: Returns the keyboard associated with the language.
+
+
+
+[`Name`](Name) read only
+: Returns the language name for the language.
diff --git a/windows/docs/engine/api/IKeymanKeyboardLanguageInstalled/Install.md b/windows/docs/engine/api/IKeymanKeyboardLanguageInstalled/Install.md
new file mode 100644
index 0000000000..df5e2d7bba
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanKeyboardLanguageInstalled/Install.md
@@ -0,0 +1,24 @@
+---
+title: IKeymanKeyboardLanguageInstalled::Install Method
+---
+
+## Introduction
+
+**Deprecated:** this function is deprecated as of Keyman 14.0. Instead,
+use the functions in
+[`IKeymanKeyboardLanguageInstalled2`](../IKeymanKeyboardLanguageInstalled2).
+
+The `IKeymanKeyboardLanguageInstalled::Install` method adds this
+keyboard layout to the Windows language, and if it is the first input
+method for the language, adds the language as well. This is the best way
+to install a language that is a suggested language for the keyboard.
+
+This method is asynchronous.
+
+This method requires elevated privileges.
+
+## Specification
+
+``` clike
+void Install(void)
+```
diff --git a/windows/docs/engine/api/IKeymanKeyboardLanguageInstalled/IsInstalled.md b/windows/docs/engine/api/IKeymanKeyboardLanguageInstalled/IsInstalled.md
new file mode 100644
index 0000000000..75581a002e
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanKeyboardLanguageInstalled/IsInstalled.md
@@ -0,0 +1,16 @@
+---
+title: IKeymanKeyboardLanguageInstalled::IsInstalled Property
+---
+
+## Introduction
+
+The `IKeymanKeyboardLanguageInstalled::IsInstalled` property returns
+`TRUE` if the keyboard is currently associated with this language in
+Windows. If the language is not currently installed, then it is a
+suggested language for the keyboard, per the package metadata.
+
+## Specification
+
+``` clike
+readonly BOOL IsInstalled
+```
diff --git a/windows/docs/engine/api/IKeymanKeyboardLanguageInstalled/OwnerKeyboard.md b/windows/docs/engine/api/IKeymanKeyboardLanguageInstalled/OwnerKeyboard.md
new file mode 100644
index 0000000000..a0e7f745da
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanKeyboardLanguageInstalled/OwnerKeyboard.md
@@ -0,0 +1,15 @@
+---
+title: IKeymanKeyboardLanguageInstalled::OwnerKeyboard Property
+---
+
+## Introduction
+
+The `IKeymanKeyboardLanguageInstalled::OwnerKeyboard` property returns
+[`IKeymanKeyboardInstalled`](../IKeymanKeyboardInstalled) reference for
+the keyboard that this language profile belongs to.
+
+## Specification
+
+``` clike
+readonly IKeymanKeyboardInstalled* OwnerKeyboard
+```
diff --git a/windows/docs/engine/api/IKeymanKeyboardLanguageInstalled/ProfileGUID.md b/windows/docs/engine/api/IKeymanKeyboardLanguageInstalled/ProfileGUID.md
new file mode 100644
index 0000000000..fb245f6e4c
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanKeyboardLanguageInstalled/ProfileGUID.md
@@ -0,0 +1,16 @@
+---
+title: IKeymanKeyboardLanguageInstalled::ProfileGUID Property
+---
+
+## Introduction
+
+The `IKeymanKeyboardLanguageInstalled::ProfileGUID` property returns the
+profile GUID associated with the Text Services Framework (TSF) Text
+Input Processor (TIP) installed for this keyboard, for this language. If
+the language is not currently installed, then returns `GUID_NULL`.
+
+## Specification
+
+``` clike
+readonly GUID ProfileGUID
+```
diff --git a/windows/docs/engine/api/IKeymanKeyboardLanguageInstalled/Uninstall.md b/windows/docs/engine/api/IKeymanKeyboardLanguageInstalled/Uninstall.md
new file mode 100644
index 0000000000..a49cca00f3
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanKeyboardLanguageInstalled/Uninstall.md
@@ -0,0 +1,19 @@
+---
+title: IKeymanKeyboardLanguageInstalled::Uninstall Method
+---
+
+## Introduction
+
+The `IKeymanKeyboardLanguageInstalled::Uninstall` method removes this
+keyboard layout from the Windows language, and if it is the last input
+method for the language, removes the language as well.
+
+This method is asynchronous.
+
+This method requires elevated privileges.
+
+## Specification
+
+``` clike
+void Uninstall(void)
+```
diff --git a/windows/docs/engine/api/IKeymanKeyboardLanguageInstalled/index.md b/windows/docs/engine/api/IKeymanKeyboardLanguageInstalled/index.md
new file mode 100644
index 0000000000..74dd3598ca
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanKeyboardLanguageInstalled/index.md
@@ -0,0 +1,48 @@
+---
+title: IKeymanKeyboardLanguageInstalled Interface
+---
+
+## Introduction
+
+The `IKeymanKeyboardLanguageInstalled` interface lists a Windows
+language associated with a keyboard in Keyman Engine for Windows API, or
+a suggested language available for installation for the keyboard.
+
+## Interface Hierarchy
+
+`IDispatch`
+
+> [`IKeymanObject`](../IKeymanObject)
+>
+> > [`IKeymanKeyboardLanguage`](../IKeymanKeyboardLanguage)
+> >
+> > > **`IKeymanKeyboardLanguageInstalled`**
+> > >
+> > > > [`IKeymanKeyboardLanguageInstalled2`](../IKeymanKeyboardLanguageInstalled2)
+
+## Properties
+
+[`OwnerKeyboard`](OwnerKeyboard) read only
+: Returns the keyboard associated with the language.
+
+[`ProfileGUID`](ProfileGUID) read only
+: Returns the profile GUID associated with the Text Services Framework
+ (TSF) Text Input Processor (TIP) installed for this keyboard, for
+ this language, or `GUID_NULL` if the language is not currently
+ installed.
+
+[`IsInstalled`](IsInstalled) read only
+: Returns `TRUE` if the language is currently installed for this
+ keyboard.
+
+## Methods
+
+[`Install()`](Install)
+: Deprecated in 14.0. If not already installed, adds this keyboard
+ layout to the Windows language, and if necessary installs the
+ Windows language as well.
+
+[`Uninstall()`](Uninstall)
+: Removes this keyboard layout from the Windows language, and if it is
+ the last input method for the language, removes the language as
+ well.
diff --git a/windows/docs/engine/api/IKeymanKeyboardLanguageInstalled2/FindInstallationLangID.md b/windows/docs/engine/api/IKeymanKeyboardLanguageInstalled2/FindInstallationLangID.md
new file mode 100644
index 0000000000..17db4f3712
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanKeyboardLanguageInstalled2/FindInstallationLangID.md
@@ -0,0 +1,59 @@
+---
+title: IKeymanKeyboardLanguageInstalled2::FindInstallationLangID Method
+---
+
+## Introduction
+
+The `IKeymanKeyboardLanguageInstalled2::FindInstallationLangID` method
+finds a LANGID for the language, which can then be passed into
+[`IKeymanKeyboardLanguageInstalled2::RegisterTip`](RegisterTip) and
+[`IKeymanKeyboardLanguageInstalled2::InstallTip`](InstallTip) to
+complete registration.
+
+If the BCP 47 tag does not have a corresponding system LANGID, then
+Windows will allocate one of four transient LANGIDs to the tag. These
+LANGIDs can differ between systems. In this situation, Windows installs
+a temporary placeholder system keyboard which Keyman then replaces as it
+completes the installation process.
+
+## Specification
+
+``` clike
+bool FindInstallationLangID(long* LangID, string* TemporaryKeyboardID, bool *RegistrationRequired, tagKeymanInstallFlags Flags);
+```
+
+## Parameters
+
+`LangID`
+: On success, this is filled with the corresponding `LANGID`.
+
+`TemporaryKeyboardID`
+: On success, and if the `kifInstallTransientLanguage` flag is
+ specified, this may contain a string which should be passed to
+ `InstallTip` to be replaced with the Keyman keyboard. Internally,
+ this string conforms to the Windows API `InstallLayoutorTip` format.
+
+`RegistrationRequired`
+: If `True`, a call to `RegisterTip` will be required to complete
+ installation of this language, as Keyman is not currently registered
+ for this language with the Text Services Framework.
+
+`Flags`
+: Can be `0` or `kifInstallTransientLanguage`. If
+ `kifInstallTransientLanguage` is specified, then Keyman will install
+ a transient language (Windows 8 or later) for BCP 47 tags that do
+ not have a corresponding system LANGID.
+
+## Returns
+
+Returns `True` if a corresponding `LANGID` was found.
+
+## See also
+
+[`InstallTip()`](InstallTip)
+: Installs a registered language profile (persists over reboot) for
+ the current user.
+
+[`RegisterTip()`](RegisterTip)
+: Registers a language profile in Text Services Framework for this
+ language (requires elevation).
diff --git a/windows/docs/engine/api/IKeymanKeyboardLanguageInstalled2/InstallTip.md b/windows/docs/engine/api/IKeymanKeyboardLanguageInstalled2/InstallTip.md
new file mode 100644
index 0000000000..37b2fe9747
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanKeyboardLanguageInstalled2/InstallTip.md
@@ -0,0 +1,38 @@
+---
+title: IKeymanKeyboardLanguageInstalled2::InstallTip Method
+---
+
+## Introduction
+
+The `IKeymanKeyboardLanguageInstalled2::InstallTip` installs a
+registered Keyman Text Services Framework Text Input Processor (TIP)
+input method for the specified language for the current user. The input
+method is installed persistently over reboots.
+
+## Specification
+
+``` clike
+void InstallTip(long LangID, string TemporaryKeyboardID);
+```
+
+## Parameters
+
+`LangID`
+: The `LANGID` to install, which can be found with
+ [`FindInstallationLangID`](FindInstallationLangID).
+
+`TemporaryKeyboardID`
+: This value should be passed unmodified from the value returned from
+ `FindInstallationLangID`. It allows Keyman to replace a temporary
+ Windows keyboard with the desired Keyman keyboard, for transient
+ LANGIDs.
+
+## See also
+
+[`FindInstallationLangID()`](FindInstallationLangID)
+: Finds a Windows LANGID for this language's BCP 47 code, including
+ optionally installing a transient language if required.
+
+[`RegisterTip()`](RegisterTip)
+: Registers a language profile in Text Services Framework for this
+ language (requires elevation).
diff --git a/windows/docs/engine/api/IKeymanKeyboardLanguageInstalled2/IsRegistered.md b/windows/docs/engine/api/IKeymanKeyboardLanguageInstalled2/IsRegistered.md
new file mode 100644
index 0000000000..255c2d5633
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanKeyboardLanguageInstalled2/IsRegistered.md
@@ -0,0 +1,26 @@
+---
+title: IKeymanKeyboardLanguageInstalled2::IsRegistered Method
+---
+
+## Introduction
+
+The `IKeymanKeyboardLanguageInstalled2::IsRegistered` returns `True` if
+a Keyman Text Services Framework Text Input Processor (TIP) input method
+is registered for the specified language.
+
+## Specification
+
+``` clike
+bool IsRegisterTip();
+```
+
+## Returns
+
+Returns `True` if the Keyman TIP is registered for this keyboard
+language.
+
+## See also
+
+[`RegisterTip()`](RegisterTip)
+: Registers a language profile in Text Services Framework for this
+ language (requires elevation).
diff --git a/windows/docs/engine/api/IKeymanKeyboardLanguageInstalled2/RegisterTip.md b/windows/docs/engine/api/IKeymanKeyboardLanguageInstalled2/RegisterTip.md
new file mode 100644
index 0000000000..2c0270147b
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanKeyboardLanguageInstalled2/RegisterTip.md
@@ -0,0 +1,31 @@
+---
+title: IKeymanKeyboardLanguageInstalled2::RegisterTip Method
+---
+
+## Introduction
+
+The `IKeymanKeyboardLanguageInstalled2::RegisterTip` registers a Keyman
+Text Services Framework Text Input Processor (TIP) input method for the
+specified language. This method requires elevation.
+
+## Specification
+
+``` clike
+void RegisterTip(long LangID);
+```
+
+## Parameters
+
+`LangID`
+: The `LANGID` to register, which can be found with
+ [`FindInstallationLangID`](FindInstallationLangID).
+
+## See also
+
+[`FindInstallationLangID()`](FindInstallationLangID)
+: Finds a Windows LANGID for this language's BCP 47 code, including
+ optionally installing a transient language if required.
+
+[`InstallTip()`](InstallTip)
+: Installs a registered language profile (persists over reboot) for
+ the current user.
diff --git a/windows/docs/engine/api/IKeymanKeyboardLanguageInstalled2/index.md b/windows/docs/engine/api/IKeymanKeyboardLanguageInstalled2/index.md
new file mode 100644
index 0000000000..d7cedb371f
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanKeyboardLanguageInstalled2/index.md
@@ -0,0 +1,46 @@
+---
+title: IKeymanKeyboardLanguageInstalled2 Interface
+---
+
+## Introduction
+
+The `IKeymanKeyboardLanguageInstalled2` interface adds extension
+functions for installing languages. These functions should be used in
+preference to the now-deprecated
+[`IKeymanKeyboardLanguagesInstalled::Install`](../IKeymanKeyboardLanguagesInstalled/Install)
+and
+[`IKeymanKeyboardLanguagesInstalled::InstallByLangID`](../IKeymanKeyboardLanguagesInstalled/InstallByLangID)
+methods.
+
+## Interface Hierarchy
+
+`IDispatch`
+
+> [`IKeymanObject`](../IKeymanObject)
+>
+> > [`IKeymanKeyboardLanguage`](../IKeymanKeyboardLanguage)
+> >
+> > > [`IKeymanKeyboardLanguageInstalled`](../IKeymanKeyboardLanguageInstalled)
+> > >
+> > > > **`IKeymanKeyboardLanguageInstalled2`**
+
+## Methods
+
+[`FindInstallationLangID()`](FindInstallationLangID)
+: Finds a Windows LANGID for this language's BCP 47 code, including
+ optionally installing a transient language if required.
+
+[`InstallTip()`](InstallTip)
+: Installs a registered language profile (persists over reboot) for
+ the current user.
+
+[`IsRegistered()`](IsRegistered)
+: Returns true if there is an associated registered language profile.
+
+[`RegisterTip()`](RegisterTip)
+: Registers a language profile in Text Services Framework for this
+ language (requires elevation).
+
+## History
+
+Added in Keyman Engine for Windows 14.0.
diff --git a/windows/docs/engine/api/IKeymanKeyboardLanguages/index.md b/windows/docs/engine/api/IKeymanKeyboardLanguages/index.md
new file mode 100644
index 0000000000..8713b52e06
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanKeyboardLanguages/index.md
@@ -0,0 +1,25 @@
+---
+title: IKeymanKeyboardLanguages Interface
+---
+
+## Introduction
+
+The `IKeymanKeyboardLanguages` interface lists the Windows languages
+associated with a keyboard in Keyman Engine for Windows API. This
+interface has no members; see the child interfaces for details.
+
+## Interface Hierarchy
+
+`IDispatch`
+
+> [`IKeymanObject`](../IKeymanObject)
+>
+> > [`IKeymanCollection`](../IKeymanCollection)
+> >
+> > > **`IKeymanKeyboardLanguages`**
+> > >
+> > > > [`IKeymanKeyboardLanguagesFile`](../IKeymanKeyboardLanguagesFile)
+> > > > [`IKeymanKeyboardLanguagesInstalled`](../IKeymanKeyboardLanguagesInstalled)
+> > > >
+> > > > > [`IKeymanKeyboardLanguagesInstalled2`](../IKeymanKeyboardLanguagesInstalled2)
+
diff --git a/windows/docs/engine/api/IKeymanKeyboardLanguagesFile/Items.md b/windows/docs/engine/api/IKeymanKeyboardLanguagesFile/Items.md
new file mode 100644
index 0000000000..c48eccc74b
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanKeyboardLanguagesFile/Items.md
@@ -0,0 +1,21 @@
+---
+title: IKeymanKeyboardLanguagesFile::Items[Index] Property
+---
+
+## Introduction
+
+The `IKeymanKeyboardLanguagesFile::Items[Index]` property returns a
+reference to the installed language identified by `Index`. If the index
+is out of range, exception
+[`KMN_E_Collection_InvalidIndex`](../IKeymanError/ErrorCode) is raised.
+
+## Specification
+
+``` clike
+readonly IKeymanKeyboardLanguage* Items[long Index]
+```
+
+## Parameters
+
+Index
+: A zero-based index.
diff --git a/windows/docs/engine/api/IKeymanKeyboardLanguagesFile/index.md b/windows/docs/engine/api/IKeymanKeyboardLanguagesFile/index.md
new file mode 100644
index 0000000000..83c1edef90
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanKeyboardLanguagesFile/index.md
@@ -0,0 +1,26 @@
+---
+title: IKeymanKeyboardLanguagesFile Interface
+---
+
+## Introduction
+
+The `IKeymanKeyboardLanguagesFile` interface lists the languages
+associated with a keyboard file in Keyman Engine for Windows API.
+
+## Interface Hierarchy
+
+`IDispatch`
+
+> [`IKeymanObject`](../IKeymanObject)
+>
+> > [`IKeymanCollection`](../IKeymanCollection)
+> >
+> > > [`IKeymanKeyboardLanguages`](../IKeymanKeyboardLanguages)
+> > >
+> > > > **`IKeymanKeyboardLanguagesFile`**
+
+## Properties
+
+[`Items[Index]`](Items) read only
+: Returns an [`IKeymanKeyboardLanguage`](../IKeymanKeyboardLanguage)
+ reference for the language identified by `Index`.
diff --git a/windows/docs/engine/api/IKeymanKeyboardLanguagesInstalled/Install.md b/windows/docs/engine/api/IKeymanKeyboardLanguagesInstalled/Install.md
new file mode 100644
index 0000000000..df831d047c
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanKeyboardLanguagesInstalled/Install.md
@@ -0,0 +1,30 @@
+---
+title: IKeymanKeyboardLanguagesInstalled::Install Method
+---
+
+## Introduction
+
+**Deprecated:** this function is deprecated as of Keyman 14.0. Instead,
+use the functions in
+[`IKeymanKeyboardLanguageInstalled2`](../IKeymanKeyboardLanguageInstalled2).
+
+The `IKeymanKeyboardLanguagesInstalled::Install` adds the keyboard
+layout to the referenced BCP 47 language code in Windows. If the
+language code is not yet installed, this method installs it as well.
+
+This method is asynchronous.
+
+This method requires elevated privileges.
+
+## Specification
+
+``` clike
+void Install(string Bcp47Code)
+```
+
+## Parameters
+
+`Bcp47Code`
+: The BCP 47 code to associate the keyboard with. Windows will
+ normalize these codes so after installation you may find the layout
+ available under a normalized code and not the one you expected.
diff --git a/windows/docs/engine/api/IKeymanKeyboardLanguagesInstalled/InstallByLangID.md b/windows/docs/engine/api/IKeymanKeyboardLanguagesInstalled/InstallByLangID.md
new file mode 100644
index 0000000000..dcaa7a8aaf
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanKeyboardLanguagesInstalled/InstallByLangID.md
@@ -0,0 +1,28 @@
+---
+title: IKeymanKeyboardLanguagesInstalled::InstallByLangID Method
+---
+
+## Introduction
+
+**Deprecated:** this function is deprecated as of Keyman 14.0. Instead,
+use the functions in
+[`IKeymanKeyboardLanguageInstalled2`](../IKeymanKeyboardLanguageInstalled2).
+
+The `IKeymanKeyboardLanguagesInstalled::InstallByLangID` adds the
+keyboard layout to the referenced LangID language code in Windows. If
+the language code is not yet installed, this method installs it as well.
+
+This method is asynchronous.
+
+This method requires elevated privileges.
+
+## Specification
+
+``` clike
+void InstallByLangID(long LangID)
+```
+
+## Parameters
+
+`LangID`
+: The language ID code to associate the keyboard with.
diff --git a/windows/docs/engine/api/IKeymanKeyboardLanguagesInstalled/Items.md b/windows/docs/engine/api/IKeymanKeyboardLanguagesInstalled/Items.md
new file mode 100644
index 0000000000..946e523e8f
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanKeyboardLanguagesInstalled/Items.md
@@ -0,0 +1,21 @@
+---
+title: IKeymanKeyboardLanguagesInstalled::Items[Index] Property
+---
+
+## Introduction
+
+The `IKeymanKeyboardLanguagesInstalled::Items[Index]` property returns a
+reference to the installed language identified by `Index`. If the index
+is out of range, exception
+[`KMN_E_Collection_InvalidIndex`](../IKeymanError/ErrorCode) is raised.
+
+## Specification
+
+``` clike
+readonly IKeymanKeyboardLanguageInstalled* Items[long Index]
+```
+
+## Parameters
+
+Index
+: A zero-based index.
diff --git a/windows/docs/engine/api/IKeymanKeyboardLanguagesInstalled/index.md b/windows/docs/engine/api/IKeymanKeyboardLanguagesInstalled/index.md
new file mode 100644
index 0000000000..64c1d7e520
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanKeyboardLanguagesInstalled/index.md
@@ -0,0 +1,45 @@
+---
+title: IKeymanKeyboardLanguagesInstalled Interface
+---
+
+## Introduction
+
+The `IKeymanKeyboardLanguagesInstalled` interface lists the languages
+associated with a keyboard in Keyman Engine for Windows API. This list
+is the set of languages currently installed for use, or suggested for
+the keyboard by the keyboard developer.
+
+## Interface Hierarchy
+
+`IDispatch`
+
+> [`IKeymanObject`](../IKeymanObject)
+>
+> > [`IKeymanCollection`](../IKeymanCollection)
+> >
+> > > [`IKeymanKeyboardLanguages`](../IKeymanKeyboardLanguages)
+> > >
+> > > > **`IKeymanKeyboardLanguagesInstalled`**
+> > > >
+> > > > > [`IKeymanKeyboardLanguagesInstalled2`](../IKeymanKeyboardLanguagesInstalled2)
+
+## Properties
+
+[`Items[Index]`](Items) read only
+: Returns an
+ [`IKeymanKeyboardLanguageInstalled`](../IKeymanKeyboardLanguageInstalled)
+ reference for the language identified by `Index`.
+
+## Methods
+
+[`Install()`](Install)
+: **Deprecated in 14.0.** Associates the keyboard layout with the
+ referenced BCP 47 language code in Windows, and if necessary
+ installs the language as well.
+
+
+
+[`InstallByLangID()`](InstallByLangID)
+: **Deprecated in 14.0.** Associates the keyboard layout with the
+ referenced legacy LANGID language code in Windows, and if necessary
+ installs the language as well.
diff --git a/windows/docs/engine/api/IKeymanKeyboardLanguagesInstalled2/Add.md b/windows/docs/engine/api/IKeymanKeyboardLanguagesInstalled2/Add.md
new file mode 100644
index 0000000000..0f0aa5fecd
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanKeyboardLanguagesInstalled2/Add.md
@@ -0,0 +1,24 @@
+---
+title: IKeymanKeyboardLanguagesInstalled2::Add Method
+---
+
+## Introduction
+
+The `IKeymanKeyboardLanguagesInstalled2::Add` adds an entry to the
+in-memory list in preparation for registration and installation with the
+functions in the
+[`IKeymanKeyboardLanguageInstalled2`](../IKeymanKeyboardLanguageInstalled2)
+interface.
+
+## Specification
+
+``` clike
+IKeymanKeyboardLanguagesInstalled Add(string Bcp47Tag)
+```
+
+## Parameters
+
+`Bcp47Tag`
+: The BCP 47 tag to associate the keyboard with. Windows will
+ normalize these codes so after installation you may find the layout
+ available under a normalized code and not the one you expected.
diff --git a/windows/docs/engine/api/IKeymanKeyboardLanguagesInstalled2/index.md b/windows/docs/engine/api/IKeymanKeyboardLanguagesInstalled2/index.md
new file mode 100644
index 0000000000..e7392686b4
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanKeyboardLanguagesInstalled2/index.md
@@ -0,0 +1,33 @@
+---
+title: IKeymanKeyboardLanguagesInstalled2 Interface
+---
+
+## Introduction
+
+The `IKeymanKeyboardLanguagesInstalled2` adds an extension method to
+allow for adding a new language in preparation to register and install
+it.
+
+## Interface Hierarchy
+
+`IDispatch`
+
+> [`IKeymanObject`](../IKeymanObject)
+>
+> > [`IKeymanCollection`](../IKeymanCollection)
+> >
+> > > [`IKeymanKeyboardLanguages`](../IKeymanKeyboardLanguages)
+> > >
+> > > > [`IKeymanKeyboardLanguagesInstalled`](../IKeymanKeyboardLanguagesInstalled)
+> > > >
+> > > > > **`IKeymanKeyboardLanguagesInstalled2`**
+
+## Methods
+
+[`Add()`](Add)
+: Adds a new language to the in-memory list in preparation for
+ registration and installation.
+
+## History
+
+Added in Keyman Engine for Windows 14.0.
diff --git a/windows/docs/engine/api/IKeymanKeyboardOption/Name.md b/windows/docs/engine/api/IKeymanKeyboardOption/Name.md
new file mode 100644
index 0000000000..5fed0c0cbc
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanKeyboardOption/Name.md
@@ -0,0 +1,14 @@
+---
+title: IKeymanKeyboardOption::Name Property
+---
+
+## Introduction
+
+The `IKeymanKeyboardOption::Name` property returns the name of the
+option as defined by the keyboard developer.
+
+## Specification
+
+``` clike
+readonly string Name
+```
diff --git a/windows/docs/engine/api/IKeymanKeyboardOption/Value.md b/windows/docs/engine/api/IKeymanKeyboardOption/Value.md
new file mode 100644
index 0000000000..310b03cf18
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanKeyboardOption/Value.md
@@ -0,0 +1,18 @@
+---
+title: IKeymanKeyboardOption::Value Property
+---
+
+## Introduction
+
+The `IKeymanKeyboardOption::Value` property controls the current value
+of the option. Valid values depend on the keyboard layout.
+
+Changes to this value will be applied after
+[`IKeymanKeyboardsInstalled::Apply`](../IKeymanKeyboardsInstalled/Apply)
+is called.
+
+## Specification
+
+``` clike
+string Value
+```
diff --git a/windows/docs/engine/api/IKeymanKeyboardOption/index.md b/windows/docs/engine/api/IKeymanKeyboardOption/index.md
new file mode 100644
index 0000000000..776e5304ed
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanKeyboardOption/index.md
@@ -0,0 +1,29 @@
+---
+title: IKeymanKeyboardOption Interface
+---
+
+## Introduction
+
+The `IKeymanKeyboardOption` interface lists an option associated with a
+specific keyboard. The options are defined by the keyboard developer
+through the [variable stores](/developer/language/guide/variable-stores)
+feature.
+
+## Interface Hierarchy
+
+`IDispatch`
+
+> [`IKeymanObject`](../IKeymanObject)
+>
+> > **`IKeymanKeyboardOption`**
+
+## Properties
+
+[`Name`](Name) read only
+: Returns the name of the option as defined by the keyboard developer.
+
+
+
+[`Value`](Value)
+: Controls the current value of the option. Valid values depend on the
+ keyboard layout.
diff --git a/windows/docs/engine/api/IKeymanKeyboardOptions/IndexOf.md b/windows/docs/engine/api/IKeymanKeyboardOptions/IndexOf.md
new file mode 100644
index 0000000000..0c82464263
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanKeyboardOptions/IndexOf.md
@@ -0,0 +1,17 @@
+---
+title: IKeymanKeyboardOptions::IndexOf Method
+---
+
+## Introduction
+
+The `IKeymanKeyboardOptions::IndexOf` method returns the zero-based
+index of the option in the array that has a name matching the `Name`
+parameter.
+
+If no option matches, then the method returns `-1`.
+
+## Specification
+
+``` clike
+long IndexOf(string Name)
+```
diff --git a/windows/docs/engine/api/IKeymanKeyboardOptions/Items.md b/windows/docs/engine/api/IKeymanKeyboardOptions/Items.md
new file mode 100644
index 0000000000..0f69401b98
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanKeyboardOptions/Items.md
@@ -0,0 +1,21 @@
+---
+title: IKeymanKeyboardOptions::Items[Index] Property
+---
+
+## Introduction
+
+The `IKeymanKeyboardOptions::Items[Index]` property returns a reference
+to the keyboard option by `Index`. If the option is not found, exception
+[`KMN_E_Collection_InvalidIndex`](../IKeymanError/ErrorCode) is raised.
+
+## Specification
+
+``` clike
+readonly IKeymanKeyboardOption* Items[variant Index]
+```
+
+## Parameters
+
+Index
+: A zero-based index, or a string referencing the option by
+ [`IKeymanKeyboardOption::Name`](../IKeymanKeyboardOption/Name).
diff --git a/windows/docs/engine/api/IKeymanKeyboardOptions/index.md b/windows/docs/engine/api/IKeymanKeyboardOptions/index.md
new file mode 100644
index 0000000000..9a727539db
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanKeyboardOptions/index.md
@@ -0,0 +1,35 @@
+---
+title: IKeymanKeyboardOptions Interface
+---
+
+## Introduction
+
+The `IKeymanKeyboardOptions` interface lists options associated with a
+specific keyboard. The options are defined by the keyboard developer
+through the [variable stores](/developer/language/guide/variable-stores)
+feature.
+
+These options are distinct from the
+[`IKeymanOptions`](../IKeymanOptions) which control the operation of
+Keyman Engine.
+
+## Interface Hierarchy
+
+`IDispatch`
+
+> [`IKeymanObject`](../IKeymanObject)
+>
+> > [`IKeymanCollection`](../IKeymanCollection)
+> >
+> > > **`IKeymanKeyboardOptions`**
+
+## Properties
+
+[`Items[Index]`](Items) read only
+: Returns an [`IKeymanKeyboardOption`](../IKeymanKeyboardOption)
+ reference for the option identified by `Index`.
+
+
+
+[`IndexOf()`](IndexOf)
+: Gets the index of an option by ID in the collection.
diff --git a/windows/docs/engine/api/IKeymanKeyboards/IndexOf.md b/windows/docs/engine/api/IKeymanKeyboards/IndexOf.md
new file mode 100644
index 0000000000..cdd19f4295
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanKeyboards/IndexOf.md
@@ -0,0 +1,18 @@
+---
+title: IKeymanKeyboards::IndexOf Method
+---
+
+## Introduction
+
+The `IKeymanKeyboards::IndexOf` method returns the zero-based index of
+the keyboard in the array that has an ID matching the `ID` parameter.
+The ID is formed from the base name of the keyboard, i.e. excluding path
+and extension, and is case insensitive.
+
+If no keyboard matches, then the method returns `-1`.
+
+## Specification
+
+``` clike
+long IndexOf(string ID)
+```
diff --git a/windows/docs/engine/api/IKeymanKeyboards/index.md b/windows/docs/engine/api/IKeymanKeyboards/index.md
new file mode 100644
index 0000000000..128403618e
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanKeyboards/index.md
@@ -0,0 +1,29 @@
+---
+title: IKeymanKeyboards Interface
+---
+
+## Introduction
+
+The `IKeymanKeyboards` interface is the base interface for the a list of
+keyboards in Keyman Engine for Windows API.
+
+## Interface Hierarchy
+
+`IDispatch`
+
+> [`IKeymanObject`](../IKeymanObject)
+>
+> > [`IKeymanCollection`](../IKeymanCollection)
+> >
+> > > **`IKeymanKeyboards`**
+> > >
+> > > > [`IKeymanKeyboardsInstalled`](../IKeymanKeyboardsInstalled)
+> > > >
+> > > > > [`IKeymanKeyboardsInstalled2`](../IKeymanKeyboardsInstalled2)
+> > > >
+> > > > [`IKeymanPackageContentKeyboards`](../IKeymanPackageContentKeyboards)
+
+## Methods
+
+[`IndexOf()`](IndexOf)
+: Find the index of a keyboard by ID
diff --git a/windows/docs/engine/api/IKeymanKeyboardsInstalled/Apply.md b/windows/docs/engine/api/IKeymanKeyboardsInstalled/Apply.md
new file mode 100644
index 0000000000..f388feb2ff
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanKeyboardsInstalled/Apply.md
@@ -0,0 +1,24 @@
+---
+title: IKeymanKeyboardsInstalled::Apply Method
+---
+
+## Introduction
+
+The `IKeymanKeyboardsInstalled::Apply` method applies any changes which
+have been made to the collection to the Keyman Engine. `Apply` must be
+called if [`IKeyman::AutoApply`](../IKeyman/AutoApply) is set to
+`False`, after making any changes through the Keyman API. The
+documentation for each method that makes changes documents whether or
+not `Apply` needs to be called.
+
+Generally, it is better to call the top-level
+[`IKeyman::Apply`](../IKeyman/Apply) as that will ensure that changes to
+be applied will be consistently applied from all parts of the API at
+once. It is also faster than calling each collection's `Apply` method
+separately in order.
+
+## Specification
+
+``` clike
+void Apply(void)
+```
diff --git a/windows/docs/engine/api/IKeymanKeyboardsInstalled/GetKeyboardFromFile.md b/windows/docs/engine/api/IKeymanKeyboardsInstalled/GetKeyboardFromFile.md
new file mode 100644
index 0000000000..79a2b58faa
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanKeyboardsInstalled/GetKeyboardFromFile.md
@@ -0,0 +1,20 @@
+---
+title: IKeymanKeyboardsInstalled::GetKeyboardFromFile Method
+---
+
+## Introduction
+
+The `IKeymanKeyboardsInstalled::GetKeyboardFromFile` method loads the
+keyboard file referred to by Filename and returns details about the
+file. It does not install the keyboard for use.
+
+## Specification
+
+``` clike
+IKeymanKeyboardFile* GetKeyboardFromFile(string Filename)
+```
+
+## Parameters
+
+Filename
+: The fully-qualified path to the .kmx file to be loaded.
diff --git a/windows/docs/engine/api/IKeymanKeyboardsInstalled/Install.md b/windows/docs/engine/api/IKeymanKeyboardsInstalled/Install.md
new file mode 100644
index 0000000000..0f37733bf9
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanKeyboardsInstalled/Install.md
@@ -0,0 +1,44 @@
+---
+title: IKeymanKeyboardsInstalled::Install Method
+---
+
+## Introduction
+
+The `IKeymanKeyboardsInstalled::Install` installs a keyboard file (.kmx)
+into Keyman Engine for Windows. This includes copying the file into the
+Keyman Engine keyboard store, adding registry settings, and installing
+the Windows input method. As installing Windows input methods is an
+asynchronous process, this method may not be complete when it returns.
+
+This method adds the keyboard to the default language as specified in
+the
+[`IKeymanKeyboard::DefaultBCP47Languages`](../IKeymanKeyboard/DefaultBCP47Languages)
+property.
+
+## Specification
+
+``` clike
+void Install(string Filename, bool Force)
+```
+
+## Parameters
+
+`Filename`
+: The fully-qualified path to the .kmx file to be installed. This file
+ will be copied to the Keyman keyboard store.
+
+`Force`
+: If `True`, overwrites an existing keyboard entry.
+
+## See also
+
+[`IKeymanKeyboardsInstalled::Install2`](../IKeymanKeyboardsInstalled2/Install2)
+: Installs a keyboard file, optionally with input method for default
+ language
+
+[`IKeymanKeyboardFile::Install`](../IKeymanKeyboardFile/Install)
+: Installs a keyboard file and input method for default language
+
+[`IKeymanKeyboardFile2::Install2`](../IKeymanKeyboardFile2/Install2)
+: Installs a keyboard file, optionally with input method for default
+ language
diff --git a/windows/docs/engine/api/IKeymanKeyboardsInstalled/Items.md b/windows/docs/engine/api/IKeymanKeyboardsInstalled/Items.md
new file mode 100644
index 0000000000..6a2fac15e8
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanKeyboardsInstalled/Items.md
@@ -0,0 +1,22 @@
+---
+title: IKeymanKeyboardsInstalled::Items[Index] Property
+---
+
+## Introduction
+
+The `IKeymanKeyboardsInstalled::Items[Index]` property returns a
+reference to the installed keyboard identified by `Index`. If the
+keyboard is not found, exception
+[`KMN_E_Collection_InvalidIndex`](../IKeymanError/ErrorCode) is raised.
+
+## Specification
+
+``` clike
+readonly IKeymanKeyboardInstalled* Items[variant Index]
+```
+
+## Parameters
+
+Index
+: A zero-based integer index or the string
+ [`IKeymanKeyboard::ID`](../IKeymanKeyboard/ID) of the keyboard.
diff --git a/windows/docs/engine/api/IKeymanKeyboardsInstalled/index.md b/windows/docs/engine/api/IKeymanKeyboardsInstalled/index.md
new file mode 100644
index 0000000000..057cecc6a8
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanKeyboardsInstalled/index.md
@@ -0,0 +1,42 @@
+---
+title: IKeymanKeyboardsInstalled Interface
+---
+
+## Introduction
+
+The `IKeymanKeyboardsInstalled` interface lists the installed keyboards
+in Keyman Engine for Windows API.
+
+## Interface Hierarchy
+
+`IDispatch`
+
+> [`IKeymanObject`](../IKeymanObject)
+>
+> > [`IKeymanCollection`](../IKeymanCollection)
+> >
+> > > [`IKeymanKeyboards`](../IKeymanKeyboards)
+> > >
+> > > > **`IKeymanKeyboardsInstalled`**
+> > > >
+> > > > > [`IKeymanKeyboardsInstalled2`](../IKeymanKeyboardsInstalled2)
+
+## Properties
+
+[`Items[Index]`](Items) read only
+: Returns an [`IKeymanKeyboardInstalled`](../IKeymanKeyboardInstalled)
+ reference for the keyboard identified by `Index`.
+
+## Methods
+
+[`GetKeyboardFromFile()`](GetKeyboardFromFile)
+: Returns an [`IKeymanKeyboardFile`](../IKeymanKeyboardFile) reference
+ for a keyboard file on disk.
+
+[`Install()`](Install)
+: Installs the referenced keyboard file into Keyman Engine for
+ Windows.
+
+[`Apply()`](Apply)
+: Applies changes made to the keyboards in the collection to Keyman
+ Engine for Windows.
diff --git a/windows/docs/engine/api/IKeymanKeyboardsInstalled2/Install2.md b/windows/docs/engine/api/IKeymanKeyboardsInstalled2/Install2.md
new file mode 100644
index 0000000000..7402560be2
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanKeyboardsInstalled2/Install2.md
@@ -0,0 +1,48 @@
+---
+title: IKeymanKeyboardsInstalled2::Install2 Method
+---
+
+## Introduction
+
+The `IKeymanKeyboardsInstalled2::Install2` installs a keyboard file
+(.kmx) into Keyman Engine for Windows. This includes copying the file
+into the Keyman Engine keyboard store, adding registry settings, and
+optionally installing the Windows input method. As installing Windows
+input methods is an asynchronous process, this method may not be
+complete when it returns.
+
+If the input method is installed, this method adds the keyboard to the
+default language as specified in the
+[`IKeymanKeyboard::DefaultBCP47Languages`](../IKeymanKeyboard/DefaultBCP47Languages)
+property.
+
+## Specification
+
+``` clike
+void Install2(string Filename, bool Force, bool InstallDefaultLanguage)
+```
+
+## Parameters
+
+`Filename`
+: The fully-qualified path to the .kmx file to be installed. This file
+ will be copied to the Keyman keyboard store.
+
+`Force`
+: If `True`, overwrites an existing keyboard entry.
+
+`InstallDefaultLanguage`
+: If `True`, installs the Windows input method for the default
+ language.
+
+## See also
+
+[`IKeymanKeyboardsInstalled::Install`](../IKeymanKeyboardsInstalled/Install)
+: Installs a keyboard file and input method for default language
+
+[`IKeymanKeyboardFile::Install`](../IKeymanKeyboardFile/Install)
+: Installs a keyboard file and input method for default language
+
+[`IKeymanKeyboardFile2::Install2`](../IKeymanKeyboardFile2/Install2)
+: Installs a keyboard file, optionally with input method for default
+ language
diff --git a/windows/docs/engine/api/IKeymanKeyboardsInstalled2/index.md b/windows/docs/engine/api/IKeymanKeyboardsInstalled2/index.md
new file mode 100644
index 0000000000..164dd12456
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanKeyboardsInstalled2/index.md
@@ -0,0 +1,32 @@
+---
+title: IKeymanKeyboardsInstalled2 Interface
+---
+
+## Introduction
+
+The `IKeymanKeyboardsInstalled2` interface adds an extension function
+for installing additional keyboards.
+
+## Interface Hierarchy
+
+`IDispatch`
+
+> [`IKeymanObject`](../IKeymanObject)
+>
+> > [`IKeymanCollection`](../IKeymanCollection)
+> >
+> > > [`IKeymanKeyboards`](../IKeymanKeyboards)
+> > >
+> > > > [`IKeymanKeyboardsInstalled`](../IKeymanKeyboardsInstalled)
+> > > >
+> > > > > **`IKeymanKeyboardsInstalled2`**
+
+## Methods
+
+[`Install2()`](Install2)
+: Installs the referenced keyboard file into Keyman Engine for
+ Windows, with option to install default language at same time.
+
+## History
+
+Added in Keyman Engine for Windows 14.0.
diff --git a/windows/docs/engine/api/IKeymanLanguage/BCP47Code.md b/windows/docs/engine/api/IKeymanLanguage/BCP47Code.md
new file mode 100644
index 0000000000..4affb2ed7f
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanLanguage/BCP47Code.md
@@ -0,0 +1,14 @@
+---
+title: IKeymanLanguage::BCP47Code Property
+---
+
+## Introduction
+
+The `IKeymanLanguage::BCP47Code` property returns a BCP 47 code for the
+Windows language, on operating systems that support it.
+
+## Specification
+
+``` clike
+readonly string BCP47Code
+```
diff --git a/windows/docs/engine/api/IKeymanLanguage/HKL.md b/windows/docs/engine/api/IKeymanLanguage/HKL.md
new file mode 100644
index 0000000000..5621803b05
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanLanguage/HKL.md
@@ -0,0 +1,14 @@
+---
+title: IKeymanLanguage::HKL Property
+---
+
+## Introduction
+
+The `IKeymanLanguage::HKL` property returns a Windows HKL for the input
+method.
+
+## Specification
+
+``` clike
+readonly long HKL
+```
diff --git a/windows/docs/engine/api/IKeymanLanguage/Hotkey.md b/windows/docs/engine/api/IKeymanLanguage/Hotkey.md
new file mode 100644
index 0000000000..84d67d1d0f
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanLanguage/Hotkey.md
@@ -0,0 +1,14 @@
+---
+title: IKeymanLanguage::Hotkey Property
+---
+
+## Introduction
+
+The `IKeymanLanguage::Hotkey` property controls the configured hotkey
+that will activate the input method when pressed.
+
+## Specification
+
+``` clike
+IKeymanHotkey* Hotkey
+```
diff --git a/windows/docs/engine/api/IKeymanLanguage/KeymanKeyboardLanguage.md b/windows/docs/engine/api/IKeymanLanguage/KeymanKeyboardLanguage.md
new file mode 100644
index 0000000000..2f0545a1f4
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanLanguage/KeymanKeyboardLanguage.md
@@ -0,0 +1,16 @@
+---
+title: IKeymanLanguage::KeymanKeyboardLanguage Property
+---
+
+## Introduction
+
+The `IKeymanLanguage::KeymanKeyboardLanguage` property returns the
+Keyman Keyboard language association that is associated with this input
+method, if the input method is a Keyman input method instance, otherwise
+`KeymanKeyboardLanguage` returns `null`.
+
+## Specification
+
+``` clike
+readonly KeymanKeyboardLanguageInstalled* KeymanKeyboardLanguage
+```
diff --git a/windows/docs/engine/api/IKeymanLanguage/LangID.md b/windows/docs/engine/api/IKeymanLanguage/LangID.md
new file mode 100644
index 0000000000..e5a9520b65
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanLanguage/LangID.md
@@ -0,0 +1,14 @@
+---
+title: IKeymanLanguage::LangID Property
+---
+
+## Introduction
+
+The `IKeymanLanguage::LangID` property returns a Windows LANGID for the
+Windows language.
+
+## Specification
+
+``` clike
+readonly long LangID
+```
diff --git a/windows/docs/engine/api/IKeymanLanguage/LayoutName.md b/windows/docs/engine/api/IKeymanLanguage/LayoutName.md
new file mode 100644
index 0000000000..ad482d681d
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanLanguage/LayoutName.md
@@ -0,0 +1,14 @@
+---
+title: IKeymanLanguage::LayoutName Property
+---
+
+## Introduction
+
+The `IKeymanLanguage::LayoutName` property returns the name of the input
+method.
+
+## Specification
+
+``` clike
+readonly string LayoutName
+```
diff --git a/windows/docs/engine/api/IKeymanLanguage/LocaleName.md b/windows/docs/engine/api/IKeymanLanguage/LocaleName.md
new file mode 100644
index 0000000000..dd8c56b35b
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanLanguage/LocaleName.md
@@ -0,0 +1,14 @@
+---
+title: IKeymanLanguage::LocaleName Property
+---
+
+## Introduction
+
+The `IKeymanLanguage::LocaleName` property returns the name of the
+language.
+
+## Specification
+
+``` clike
+readonly string LocaleName
+```
diff --git a/windows/docs/engine/api/IKeymanLanguage/ProfileGUID.md b/windows/docs/engine/api/IKeymanLanguage/ProfileGUID.md
new file mode 100644
index 0000000000..dbf7a395ce
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanLanguage/ProfileGUID.md
@@ -0,0 +1,15 @@
+---
+title: IKeymanLanguage::ProfileGUID Property
+---
+
+## Introduction
+
+The `IKeymanLanguage::ProfileGUID` property returns the profile GUID
+associated with the Text Services Framework (TSF) Text Input Processor
+(TIP) installed for this keyboard, for this language.
+
+## Specification
+
+``` clike
+readonly GUID ProfileGUID
+```
diff --git a/windows/docs/engine/api/IKeymanLanguage/index.md b/windows/docs/engine/api/IKeymanLanguage/index.md
new file mode 100644
index 0000000000..5fcfa278f2
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanLanguage/index.md
@@ -0,0 +1,48 @@
+---
+title: IKeymanLanguage Interface
+---
+
+## Introduction
+
+The `IKeymanLanguage` interface lists a Windows input method entry.
+
+## Interface Hierarchy
+
+`IDispatch`
+
+> [`IKeymanObject`](../IKeymanObject)
+>
+> > **`IKeymanLanguage`**
+
+## Properties
+
+[`BCP47Code`](BCP47Code) read only
+: Returns a BCP 47 code for the Windows language, on operating systems
+ that support it.
+
+[`HKL`](HKL) read only
+: Returns a Windows HKL for the input method.
+
+[`Hotkey`](Hotkey)
+: Controls the current hotkey that will activate the keyboard layout
+ with the selected language.
+
+[`KeymanKeyboardLanguage`](KeymanKeyboardLanguage) read only
+: Returns a
+ [`IKeymanKeyboardLanguageInstalled`](../IKeymanKeyboardLanguageInstalled)
+ reference for the Keyman keyboard language entry that this entry is
+ associated with.
+
+[`LangID`](LangID) read only
+: Returns a Windows LANGID for the Windows language.
+
+[`LayoutName`](LayoutName) read only
+: Returns the display name of the input method.
+
+[`LocaleName`](LocaleName) read only
+: Returns the display name of the language.
+
+[`ProfileGUID`](ProfileGUID) read only
+: Returns the profile GUID associated with the Text Services Framework
+ (TSF) Text Input Processor (TIP) installed for this keyboard, for
+ this language.
diff --git a/windows/docs/engine/api/IKeymanLanguages/Items.md b/windows/docs/engine/api/IKeymanLanguages/Items.md
new file mode 100644
index 0000000000..1f6a372f6e
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanLanguages/Items.md
@@ -0,0 +1,21 @@
+---
+title: IKeymanLanguages::Items[Index] Property
+---
+
+## Introduction
+
+The `IKeymanLanguages::Items[Index]` property returns a
+[`IKeymanLanguage`](../IKeymanLanguage) reference to the installed
+language identified by `Index`. If the index is out of range, exception
+[`KMN_E_Collection_InvalidIndex`](../IKeymanError/ErrorCode) is raised.
+
+## Specification
+
+``` clike
+readonly IKeymanLanguage* Items[long Index]
+```
+
+## Parameters
+
+Index
+: A zero-based index.
diff --git a/windows/docs/engine/api/IKeymanLanguages/index.md b/windows/docs/engine/api/IKeymanLanguages/index.md
new file mode 100644
index 0000000000..2205a2de5a
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanLanguages/index.md
@@ -0,0 +1,27 @@
+---
+title: IKeymanLanguages Interface
+---
+
+## Introduction
+
+The `IKeymanLanguages` interface lists all the Windows input methods
+currently loaded on the system. As Keyman keyboards are installed as
+Windows input methods, this interface will list Keyman input methods as
+well as Windows system-supplied input methods and other third party
+input methods that present as Windows input methods.
+
+## Interface Hierarchy
+
+`IDispatch`
+
+> [`IKeymanObject`](../IKeymanObject)
+>
+> > [`IKeymanCollection`](../IKeymanCollection)
+> >
+> > > **`IKeymanLanguages`**
+
+## Properties
+
+[`Items[Index]`](Items) read only
+: Returns an [`IKeymanLanguage`](../IKeymanLanguage) reference for the
+ windows language identified by `Index`.
diff --git a/windows/docs/engine/api/IKeymanObject/SerializeXML.md b/windows/docs/engine/api/IKeymanObject/SerializeXML.md
new file mode 100644
index 0000000000..620b5c55ce
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanObject/SerializeXML.md
@@ -0,0 +1,35 @@
+---
+title: IKeymanObject::SerializeXML Method
+---
+
+## Introduction
+
+The `IKeymanObject::SerializeXML` method serializes the properties and
+owned objects of the object as XML. The content of the XML varies by
+interface. Some objects will serialize image data as well, for example
+keyboard files will serialize an icon for the keyboard, which will be
+saved to disk as a temporary file.
+
+## Specification
+
+``` clike
+string SerializeXML(KeymanSerializeFlags Flags, string ImagePath, out string[] References)
+```
+
+## Parameters
+
+`Flags`
+: Can be `0` or `ksfExportImages`.
+
+`ImagePath`
+: If `ksfExportImages` is set, then this must contain a valid fully
+ qualified path where temporary image files will be saved.
+
+`References`
+: If `ksfExportImages` is set, then on return includes a list of all
+ image files generated for the XML.
+
+## Return Value
+
+`IKeymanObject::SerializeXML` returns a well-formed snippet of XML in a
+string.
diff --git a/windows/docs/engine/api/IKeymanObject/index.md b/windows/docs/engine/api/IKeymanObject/index.md
new file mode 100644
index 0000000000..e1bccf8cff
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanObject/index.md
@@ -0,0 +1,82 @@
+---
+title: IKeymanObject Interface
+---
+
+## Introduction
+
+The `IKeymanObject` interface is the base interface for all interfaces
+in Keyman Engine for Windows API.
+
+## Interface Hierarchy
+
+`IDispatch`
+
+> **`IKeymanObject`**
+>
+> > [`IKeyman`](../IKeyman)
+> > [`IKeymanCollection`](../IKeymanCollection)
+> >
+> > > [`IKeymanErrors`](../IKeymanErrors)
+> > > [`IKeymanHotkeys`](../IKeymanHotkeys)
+> > > [`IKeymanKeyboardLanguages`](../IKeymanKeyboardLanguages)
+> > >
+> > > > [`IKeymanKeyboardLanguagesFile`](../IKeymanKeyboardLanguagesFile)
+> > > > [`IKeymanKeyboardLanguagesInstalled`](../IKeymanKeyboardLanguagesInstalled)
+> > > >
+> > > > > [`IKeymanKeyboardLanguagesInstalled2`](../IKeymanKeyboardLanguagesInstalled2)
+> > >
+> > > [`IKeymanKeyboardOptions`](../IKeymanKeyboardOptions)
+> > > [`IKeymanKeyboards`](../IKeymanKeyboards)
+> > >
+> > > > [`IKeymanKeyboardsInstalled`](../IKeymanKeyboardsInstalled)
+> > > >
+> > > > > [`IKeymanKeyboardsInstalled2`](../IKeymanKeyboardsInstalled2)
+> > > >
+> > > > [`IKeymanPackageContentKeyboards`](../IKeymanPackageContentKeyboards)
+> > >
+> > > [`IKeymanLanguages`](../IKeymanLanguages)
+> > > [`IKeymanOptions`](../IKeymanOptions)
+> > > [`IKeymanPackageContentFiles`](../IKeymanPackageContentFiles)
+> > > [`IKeymanPackageContentFonts`](../IKeymanPackageContentFonts)
+> > > [`IKeymanPackagesInstalled`](../IKeymanPackagesInstalled)
+> > >
+> > > > [`IKeymanPackagesInstalled2`](../IKeymanPackagesInstalled2)
+> >
+> > [`IKeymanControl`](../IKeymanControl)
+> > [`IKeymanError`](../IKeymanError)
+> > [`IKeymanHotkey`](../IKeymanHotkey)
+> > [`IKeymanKeyboard`](../IKeymanKeyboard)
+> >
+> > > [`IKeymanKeyboardFile`](../IKeymanKeyboardFile)
+> > >
+> > > > [`IKeymanKeyboardFile2`](../IKeymanKeyboardFile2)
+> > >
+> > > [`IKeymanKeyboardInstalled`](../IKeymanKeyboardInstalled)
+> >
+> > [`IKeymanKeyboardLanguage`](../IKeymanKeyboardLanguage)
+> >
+> > > [`IKeymanKeyboardLanguageInstalled`](../IKeymanKeyboardLanguageInstalled)
+> > >
+> > > > [`IKeymanKeyboardLanguageInstalled2`](../IKeymanKeyboardLanguageInstalled2)
+> >
+> > [`IKeymanKeyboardOption`](../IKeymanKeyboardOption)
+> > [`IKeymanLanguage`](../IKeymanLanguage)
+> > [`IKeymanOption`](../IKeymanOption)
+> > [`IKeymanPackage`](../IKeymanPackage)
+> >
+> > > [`IKeymanPackageFile`](../IKeymanPackageFile)
+> > >
+> > > > [`IKeymanPackageFile2`](../IKeymanPackageFile2)
+> > >
+> > > [`IKeymanPackageInstalled`](../IKeymanPackageInstalled)
+> >
+> > [`IKeymanPackageContentFile`](../IKeymanPackageContentFile)
+> > [`IKeymanPackageContentFont`](../IKeymanPackageContentFont)
+> > [`IKeymanSystemInfo`](../IKeymanSystemInfo)
+> > [`IKeymanVisualKeyboard`](../IKeymanVisualKeyboard)
+> > [`IKeymanBCP47Canonicalization`](../IKeymanBCP47Canonicalization)
+
+## Methods
+
+[`SerializeXML()`](SerializeXML)
+: Serializes the properties of the object, and owned objects as XML
diff --git a/windows/docs/engine/api/IKeymanOption/DefaultValue.md b/windows/docs/engine/api/IKeymanOption/DefaultValue.md
new file mode 100644
index 0000000000..438ca592b8
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanOption/DefaultValue.md
@@ -0,0 +1,14 @@
+---
+title: IKeymanOption::DefaultValue Property
+---
+
+## Introduction
+
+The `IKeymanOption::DefaultValue` property returns the default value for
+the option.
+
+## Specification
+
+``` clike
+readonly variant DefaultValue
+```
diff --git a/windows/docs/engine/api/IKeymanOption/Enabled.md b/windows/docs/engine/api/IKeymanOption/Enabled.md
new file mode 100644
index 0000000000..7699018e64
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanOption/Enabled.md
@@ -0,0 +1,16 @@
+---
+title: IKeymanOption::Enabled Property
+---
+
+## Introduction
+
+The `IKeymanOption::Enabled` property returns `True` if the option value
+can be changed. Some options are unavailable to be changed at certain
+times, for example if the user does not have sufficient permissions, or
+on certain operating system configurations.
+
+## Specification
+
+``` clike
+readonly bool Enabled
+```
diff --git a/windows/docs/engine/api/IKeymanOption/Group.md b/windows/docs/engine/api/IKeymanOption/Group.md
new file mode 100644
index 0000000000..fda2b10d2f
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanOption/Group.md
@@ -0,0 +1,15 @@
+---
+title: IKeymanOption::Group Property
+---
+
+## Introduction
+
+The `IKeymanOption::Group` property returns the identifier of the group
+to which the option belongs. The friendly name for the identifier will
+be found in the locale translation file.
+
+## Specification
+
+``` clike
+readonly string Group
+```
diff --git a/windows/docs/engine/api/IKeymanOption/ID.md b/windows/docs/engine/api/IKeymanOption/ID.md
new file mode 100644
index 0000000000..eae1bb5cb6
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanOption/ID.md
@@ -0,0 +1,15 @@
+---
+title: IKeymanOption::ID Property
+---
+
+## Introduction
+
+The `IKeymanOption::ID` property returns the identifier of the option.
+The friendly name for the identifier will be found in the locale
+translation file.
+
+## Specification
+
+``` clike
+readonly string ID
+```
diff --git a/windows/docs/engine/api/IKeymanOption/OptionType.md b/windows/docs/engine/api/IKeymanOption/OptionType.md
new file mode 100644
index 0000000000..3d7d0f1715
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanOption/OptionType.md
@@ -0,0 +1,24 @@
+---
+title: IKeymanOption::OptionType Property
+---
+
+## Introduction
+
+The `IKeymanOption::OptionType` property returns the data type for the
+[`Value`](Value) and [`DefaultValue`](DefaultValue) properties.
+
+## Specification
+
+``` clike
+readonly KeymanOptionType OptionType
+```
+
+## Option Data Types
+
+| Value | Name |
+|-------|-----------|
+| 0 | kotUnknown|
+| 1 | kotBool |
+| 2 | kotLong |
+| 3 | kotString |
+
diff --git a/windows/docs/engine/api/IKeymanOption/Value.md b/windows/docs/engine/api/IKeymanOption/Value.md
new file mode 100644
index 0000000000..ff4044629e
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanOption/Value.md
@@ -0,0 +1,16 @@
+---
+title: IKeymanOption::Value Property
+---
+
+## Introduction
+
+The `IKeymanOption::Value` property sets or returns the current value
+for the option. After changing the value, you will need to call
+[`IKeymanOptions::Apply`](../IKeymanOptions/Apply) to push the changes
+through to Keyman Engine.
+
+## Specification
+
+``` clike
+variant Value
+```
diff --git a/windows/docs/engine/api/IKeymanOption/index.md b/windows/docs/engine/api/IKeymanOption/index.md
new file mode 100644
index 0000000000..4cb968afb6
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanOption/index.md
@@ -0,0 +1,38 @@
+---
+title: IKeymanOption Interface
+---
+
+## Introduction
+
+The `IKeymanOption` interface describes a user-configurable option in
+Keyman Engine.
+
+## Interface Hierarchy
+
+`IDispatch`
+
+> [`IKeymanObject`](../IKeymanObject)
+>
+> > **`IKeymanOption`**
+
+## Properties
+
+[`DefaultValue`](DefaultValue) read only
+: Returns the default value for the option.
+
+[`Enabled`](Enabled) read only
+: Returns `True` if the option is currently enabled for the user.
+
+[`Group`](Group) read only
+: Returns a grouping identifier for the option.
+
+[`ID`](ID) read only
+: Returns an identifier for the option. Identifiers are mapped to
+ user-readable strings in the user interface translation files.
+
+[`OptionType`](OptionType) read only
+: Returns the value data type supported by the option, one of
+ `kotBool`, `kotString` or `kotLong`.
+
+[`Value`](Value)
+: Reads or sets the current value for the option.
diff --git a/windows/docs/engine/api/IKeymanOptions/Apply.md b/windows/docs/engine/api/IKeymanOptions/Apply.md
new file mode 100644
index 0000000000..fb104c856c
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanOptions/Apply.md
@@ -0,0 +1,14 @@
+---
+title: IKeymanOptions::Apply Method
+---
+
+## Introduction
+
+The `IKeymanOptions::Apply` method applies all settings changes made
+through the API to Keyman Engine.
+
+## Specification
+
+``` clike
+void Apply(void)
+```
diff --git a/windows/docs/engine/api/IKeymanOptions/IndexOf.md b/windows/docs/engine/api/IKeymanOptions/IndexOf.md
new file mode 100644
index 0000000000..93e8e93f08
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanOptions/IndexOf.md
@@ -0,0 +1,16 @@
+---
+title: IKeymanOptions::IndexOf Method
+---
+
+## Introduction
+
+The `IKeymanOptions::IndexOf` method returns the zero-based index of the
+option in the array that has a ID matching the `ID` parameter.
+
+If no option matches, then the method returns `-1`.
+
+## Specification
+
+``` clike
+long IndexOf(string ID)
+```
diff --git a/windows/docs/engine/api/IKeymanOptions/Items.md b/windows/docs/engine/api/IKeymanOptions/Items.md
new file mode 100644
index 0000000000..ef041f6ab4
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanOptions/Items.md
@@ -0,0 +1,21 @@
+---
+title: IKeymanOptions::Items[Index] Property
+---
+
+## Introduction
+
+The `IKeymanOptions::Items[Index]` property returns a
+[`IKeymanOption`](../IKeymanOption) reference identified by `Index`. If
+the index is out of range, exception
+[`KMN_E_Collection_InvalidIndex`](../IKeymanError/ErrorCode) is raised.
+
+## Specification
+
+``` clike
+readonly IKeymanOption* Items[variant Index]
+```
+
+## Parameters
+
+Index
+: A zero-based integer index, or the string name of the option.
diff --git a/windows/docs/engine/api/IKeymanOptions/index.md b/windows/docs/engine/api/IKeymanOptions/index.md
new file mode 100644
index 0000000000..eb5a92c90b
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanOptions/index.md
@@ -0,0 +1,33 @@
+---
+title: IKeymanOptions Interface
+---
+
+## Introduction
+
+The `IKeymanOptions` interface lists options available in Keyman Engine.
+These options are distinct from the
+[`IKeymanKeyboardOptions`](../IKeymanKeyboardOptions) which control how
+specific keyboard layouts operate.
+
+## Interface Hierarchy
+
+`IDispatch`
+
+> [`IKeymanObject`](../IKeymanObject)
+>
+> > [`IKeymanCollection`](../IKeymanCollection)
+> >
+> > > **`IKeymanOptions`**
+
+## Properties
+
+[`Items[Index]`](Items) read only
+: Returns an [`IKeymanOption`](../IKeymanOption) reference by `Index`.
+
+## Methods
+
+[`Apply()`](Apply)
+: Applies changes to options to Keyman Engine.
+
+[`IndexOf()`](IndexOf)
+: Gets the index of an option by ID in the collection.
diff --git a/windows/docs/engine/api/IKeymanPackage/Author.md b/windows/docs/engine/api/IKeymanPackage/Author.md
new file mode 100644
index 0000000000..befdb5ed30
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanPackage/Author.md
@@ -0,0 +1,14 @@
+---
+title: IKeymanPackage::Author Property
+---
+
+## Introduction
+
+The `IKeymanPackage::Author` property returns the author as listed in
+the package file.
+
+## Specification
+
+``` clike
+readonly string Author
+```
diff --git a/windows/docs/engine/api/IKeymanPackage/AuthorEmail.md b/windows/docs/engine/api/IKeymanPackage/AuthorEmail.md
new file mode 100644
index 0000000000..3c57066315
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanPackage/AuthorEmail.md
@@ -0,0 +1,14 @@
+---
+title: IKeymanPackage::AuthorEmail Property
+---
+
+## Introduction
+
+The `IKeymanPackage::AuthorEmail` property returns the email address of
+the author as listed in the package file.
+
+## Specification
+
+``` clike
+readonly string AuthorEmail
+```
diff --git a/windows/docs/engine/api/IKeymanPackage/Copyright.md b/windows/docs/engine/api/IKeymanPackage/Copyright.md
new file mode 100644
index 0000000000..7e239e3a5b
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanPackage/Copyright.md
@@ -0,0 +1,14 @@
+---
+title: IKeymanPackage::Copyright Property
+---
+
+## Introduction
+
+The `IKeymanPackage::Copyright` property returns the copyright message
+from the package file.
+
+## Specification
+
+``` clike
+readonly string Copyright
+```
diff --git a/windows/docs/engine/api/IKeymanPackage/Filename.md b/windows/docs/engine/api/IKeymanPackage/Filename.md
new file mode 100644
index 0000000000..01d447229f
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanPackage/Filename.md
@@ -0,0 +1,18 @@
+---
+title: IKeymanPackage::Filename Property
+---
+
+## Introduction
+
+The `IKeymanPackage::Filename` property returns the fully qualified
+filename of the package .kmp file, if the parent interface is
+[`IKeymanPackageFile`](../IKeymanPackageFile), otherwise (interface is
+[`IKeymanPackageInstalled`](../IKeymanPackageInstalled)), it returns the
+fully qualified filename of the package kmp.inf file within the Keyman
+package store.
+
+## Specification
+
+``` clike
+readonly string Filename
+```
diff --git a/windows/docs/engine/api/IKeymanPackage/Files.md b/windows/docs/engine/api/IKeymanPackage/Files.md
new file mode 100644
index 0000000000..f9e9df69b1
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanPackage/Files.md
@@ -0,0 +1,15 @@
+---
+title: IKeymanPackage::Files Property
+---
+
+## Introduction
+
+The `IKeymanPackage::Files` property returns an
+[`IKeymanPackageContentFiles`](../IKeymanPackageContentFiles) reference
+which lists the files included within the package.
+
+## Specification
+
+``` clike
+readonly IKeymanPackageContentFiles* Files
+```
diff --git a/windows/docs/engine/api/IKeymanPackage/Fonts.md b/windows/docs/engine/api/IKeymanPackage/Fonts.md
new file mode 100644
index 0000000000..4df236b5f2
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanPackage/Fonts.md
@@ -0,0 +1,15 @@
+---
+title: IKeymanPackage::Fonts Property
+---
+
+## Introduction
+
+The `IKeymanPackage::Fonts` property returns an
+[`IKeymanPackageContentFonts`](../IKeymanPackageContentFonts) reference
+which lists the fonts included within the package.
+
+## Specification
+
+``` clike
+readonly IKeymanPackageContentFonts* Fonts
+```
diff --git a/windows/docs/engine/api/IKeymanPackage/Graphic.md b/windows/docs/engine/api/IKeymanPackage/Graphic.md
new file mode 100644
index 0000000000..f74154e74d
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanPackage/Graphic.md
@@ -0,0 +1,15 @@
+---
+title: IKeymanPackage::Graphic Property
+---
+
+## Introduction
+
+The `IKeymanPackage::Graphic` property returns an `IPicture` reference
+for the install screen graphic included within the package, or `null` if
+no install screen graphic was included.
+
+## Specification
+
+``` clike
+readonly IPicture* Graphic
+```
diff --git a/windows/docs/engine/api/IKeymanPackage/GraphicFile.md b/windows/docs/engine/api/IKeymanPackage/GraphicFile.md
new file mode 100644
index 0000000000..0143af0edb
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanPackage/GraphicFile.md
@@ -0,0 +1,16 @@
+---
+title: IKeymanPackage::GraphicFile Property
+---
+
+## Introduction
+
+The `IKeymanPackage::GraphicFile` property returns an
+[`IKeymanPackageContentFile`](../IKeymanPackageContentFile) reference
+for the install screen graphic included within the package, or `null` if
+no install screen graphic was included.
+
+## Specification
+
+``` clike
+readonly IKeymanPackageContentFile* GraphicFile
+```
diff --git a/windows/docs/engine/api/IKeymanPackage/ID.md b/windows/docs/engine/api/IKeymanPackage/ID.md
new file mode 100644
index 0000000000..23a7a02dd6
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanPackage/ID.md
@@ -0,0 +1,21 @@
+---
+title: IKeymanPackage::ID Property
+---
+
+## Introduction
+
+The `IKeymanPackage::ID` property returns the base name of the package
+.kmp file, sans extension. The full filename, including path, of the
+package is available in the [`Filename`](Filename) property.
+
+No two packages can share the same identifier in a Keyman Engine
+installation. The identifier is case insensitive and should consist of
+letters, digits and underscore, although some legacy identifiers may
+contain other characters as well. The initial letter of an identifier
+should be a letter.
+
+## Specification
+
+``` clike
+readonly string ID
+```
diff --git a/windows/docs/engine/api/IKeymanPackage/Keyboards.md b/windows/docs/engine/api/IKeymanPackage/Keyboards.md
new file mode 100644
index 0000000000..3e13281282
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanPackage/Keyboards.md
@@ -0,0 +1,15 @@
+---
+title: IKeymanPackage::Keyboards Property
+---
+
+## Introduction
+
+The `IKeymanPackage::Keyboards` property returns an
+[`IKeymanPackageContentKeyboards`](../IKeymanPackageContentKeyboards)
+reference which lists the keyboards included within the package.
+
+## Specification
+
+``` clike
+readonly IKeymanPackageContentKeyboards* Keyboards
+```
diff --git a/windows/docs/engine/api/IKeymanPackage/Name.md b/windows/docs/engine/api/IKeymanPackage/Name.md
new file mode 100644
index 0000000000..9a1a367df5
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanPackage/Name.md
@@ -0,0 +1,18 @@
+---
+title: IKeymanPackage::Name Property
+---
+
+## Introduction
+
+The `IKeymanPackage::Name` property returns the descriptive name of the
+package from the package file. This name is shown to the user in the
+Keyman Engine user interface.
+
+The `Name` property is not related to the [`ID`](ID) property or the
+[`Filename`](Filename) property.
+
+## Specification
+
+``` clike
+readonly string Name
+```
diff --git a/windows/docs/engine/api/IKeymanPackage/ReadmeFile.md b/windows/docs/engine/api/IKeymanPackage/ReadmeFile.md
new file mode 100644
index 0000000000..ead892e86d
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanPackage/ReadmeFile.md
@@ -0,0 +1,16 @@
+---
+title: IKeymanPackage::ReadmeFile Property
+---
+
+## Introduction
+
+The `IKeymanPackage::ReadmeFile` property returns an
+[`IKeymanPackageContentFile`](../IKeymanPackageContentFile) reference
+for the install Readme HTML file included within the package, or `null`
+if no Readme file was included.
+
+## Specification
+
+``` clike
+readonly IKeymanPackageContentFile* ReadmeFile
+```
diff --git a/windows/docs/engine/api/IKeymanPackage/Version.md b/windows/docs/engine/api/IKeymanPackage/Version.md
new file mode 100644
index 0000000000..c380ff5ce4
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanPackage/Version.md
@@ -0,0 +1,19 @@
+---
+title: IKeymanPackage::Version Property
+---
+
+## Introduction
+
+The `IKeymanPackage::Version` property returns the version string from
+the package file. This represents the current version of the package
+file, and is in the form of a dotted numeric string.
+
+The `Version` property is not directly related to the
+[`IKeymanKeyboard::Version`](../IKeymanKeyboard/Version) property of the
+keyboards within the package.
+
+## Specification
+
+``` clike
+readonly string Version
+```
diff --git a/windows/docs/engine/api/IKeymanPackage/Website.md b/windows/docs/engine/api/IKeymanPackage/Website.md
new file mode 100644
index 0000000000..474196d6a9
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanPackage/Website.md
@@ -0,0 +1,14 @@
+---
+title: IKeymanPackage::Website Property
+---
+
+## Introduction
+
+The `IKeymanPackage::Website` property returns the website string from
+the package file.
+
+## Specification
+
+``` clike
+readonly string Website
+```
diff --git a/windows/docs/engine/api/IKeymanPackage/WelcomeFile.md b/windows/docs/engine/api/IKeymanPackage/WelcomeFile.md
new file mode 100644
index 0000000000..6783689698
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanPackage/WelcomeFile.md
@@ -0,0 +1,16 @@
+---
+title: IKeymanPackage::WelcomeFile Property
+---
+
+## Introduction
+
+The `IKeymanPackage::WelcomeFile` property returns an
+[`IKeymanPackageContentFile`](../IKeymanPackageContentFile) reference
+for the welcome.htm documentation HTML file included within the package,
+or `null` if no documentation was included.
+
+## Specification
+
+``` clike
+readonly IKeymanPackageContentFile* WelcomeFile
+```
diff --git a/windows/docs/engine/api/IKeymanPackage/index.md b/windows/docs/engine/api/IKeymanPackage/index.md
new file mode 100644
index 0000000000..cd30a8ec74
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanPackage/index.md
@@ -0,0 +1,92 @@
+---
+title: IKeymanPackage Interface
+---
+
+## Introduction
+
+The `IKeymanPackage` interface describes a keyboard package in Keyman
+Engine for Windows API. It is a base class and describes both installed
+packages and package files. A keyboard package file is a bundle that
+contains keyboard layout(s), visual keyboards, documentation, fonts and
+any other related files to simplify distribution of keyboard layouts.
+
+## Interface Hierarchy
+
+`IDispatch`
+
+> [`IKeymanObject`](../IKeymanObject)
+>
+> > **`IKeymanPackage`**
+> >
+> > > [`IKeymanPackageFile`](../IKeymanPackageFile)
+> > >
+> > > > [`IKeymanPackageFile2`](../IKeymanPackageFile2)
+> > >
+> > > [`IKeymanPackageInstalled`](../IKeymanPackageInstalled)
+
+## Properties
+
+[`Author`](Author) read only
+: Returns the author as listed in the package file.
+
+[`AuthorEmail`](AuthorEmail) read only
+: Returns the email address of the author as listed in the package
+ file.
+
+[`Copyright`](Copyright) read only
+: Returns the copyright message from the package file.
+
+[`Filename`](Filename) read only
+: Returns the fully-qualified filename of the package file.
+
+[`Files`](Files) read only
+: Returns an
+ [`IKeymanPackageContentFiles`](../IKeymanPackageContentFiles)
+ reference which lists the files included within the package.
+
+[`Fonts`](Fonts) read only
+: Returns an
+ [`IKeymanPackageContentFonts`](../IKeymanPackageContentFonts)
+ reference which lists the fonts included within the package.
+
+[`Graphic`](Graphic) read only
+: Returns an `IPicture` reference for the install screen graphic
+ included within the package, or `null` if no install screen graphic
+ was included.
+
+[`GraphicFile`](GraphicFile) read only
+: Returns an
+ [`IKeymanPackageContentFile`](../IKeymanPackageContentFile)
+ reference for the install screen graphic included within the
+ package, or `null` if no install screen graphic was included.
+
+[`ID`](ID) read only
+: Returns the identifier for the package, which is the base name of
+ the package file without extension.
+
+[`Keyboards`](Keyboards) read only
+: Returns an
+ [`IKeymanPackageContentKeyboards`](../IKeymanPackageContentKeyboards)
+ reference which lists the keyboard layouts included within the
+ package.
+
+[`Name`](Name) read only
+: Returns the descriptive name of the package file.
+
+[`ReadmeFile`](ReadmeFile) read only
+: Returns an
+ [`IKeymanPackageContentFile`](../IKeymanPackageContentFile)
+ reference for the install Readme HTML file included within the
+ package, or `null` if no Readme file was included.
+
+[`Version`](Version) read only
+: Returns the version string from the package file.
+
+[`Website`](Website) read only
+: Returns the website of the package as listed in the package file.
+
+[`WelcomeFile`](WelcomeFile) read only
+: Returns an
+ [`IKeymanPackageContentFile`](../IKeymanPackageContentFile)
+ reference for the welcome.htm documentation HTML file included
+ within the package, or `null` if no documentation was included.
diff --git a/windows/docs/engine/api/IKeymanPackageContentFile/Description.md b/windows/docs/engine/api/IKeymanPackageContentFile/Description.md
new file mode 100644
index 0000000000..d5614b1c77
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanPackageContentFile/Description.md
@@ -0,0 +1,14 @@
+---
+title: IKeymanPackageContentFile::Description Property
+---
+
+## Introduction
+
+The `IKeymanPackageContentFile::Description` property returns the
+description of the file from the package metadata.
+
+## Specification
+
+``` clike
+readonly string Description
+```
diff --git a/windows/docs/engine/api/IKeymanPackageContentFile/Filename.md b/windows/docs/engine/api/IKeymanPackageContentFile/Filename.md
new file mode 100644
index 0000000000..3e7c44232c
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanPackageContentFile/Filename.md
@@ -0,0 +1,14 @@
+---
+title: IKeymanPackageContentFile::Filename Property
+---
+
+## Introduction
+
+The `IKeymanPackageContentFile::Filename` property returns the filename
+of the file without path.
+
+## Specification
+
+``` clike
+readonly string Filename
+```
diff --git a/windows/docs/engine/api/IKeymanPackageContentFile/FullFilename.md b/windows/docs/engine/api/IKeymanPackageContentFile/FullFilename.md
new file mode 100644
index 0000000000..89d56cc607
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanPackageContentFile/FullFilename.md
@@ -0,0 +1,16 @@
+---
+title: IKeymanPackageContentFile::FullFilename Property
+---
+
+## Introduction
+
+The `IKeymanPackageContentFile::FullFilename` property returns the
+filename of the file including the path. This may be in a temporary
+folder or in the Keyman package store. The file should not be modified
+or deleted; when reading the file, use sharing semantics.
+
+## Specification
+
+``` clike
+readonly string FullFilename
+```
diff --git a/windows/docs/engine/api/IKeymanPackageContentFile/Stream.md b/windows/docs/engine/api/IKeymanPackageContentFile/Stream.md
new file mode 100644
index 0000000000..fb8532cae7
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanPackageContentFile/Stream.md
@@ -0,0 +1,14 @@
+---
+title: IKeymanPackageContentFile::Stream Property
+---
+
+## Introduction
+
+The `IKeymanPackageContentFile::Stream` property returns a readonly
+`IStream` reference to the content of the file.
+
+## Specification
+
+``` clike
+readonly IStream* Stream
+```
diff --git a/windows/docs/engine/api/IKeymanPackageContentFile/index.md b/windows/docs/engine/api/IKeymanPackageContentFile/index.md
new file mode 100644
index 0000000000..5355bfedc8
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanPackageContentFile/index.md
@@ -0,0 +1,31 @@
+---
+title: IKeymanPackageContentFile Interface
+---
+
+## Introduction
+
+The `IKeymanPackageContentFile` interface describes a file within a
+package.
+
+## Interface Hierarchy
+
+`IDispatch`
+
+> [`IKeymanObject`](../IKeymanObject)
+>
+> > **`IKeymanPackageContentFile`**
+
+## Properties
+
+[`Description`](Description) read only
+: An optional description of the file from the package metadata.
+
+[`Filename`](Filename) read only
+: The filename of the file, without path.
+
+[`FullFilename`](FullFilename) read only
+: The filename of the file, including path. This may point to a
+ temporary path.
+
+[`Stream`](Stream) read only
+: Returns an `IStream` reference to the file content.
diff --git a/windows/docs/engine/api/IKeymanPackageContentFiles/IndexOf.md b/windows/docs/engine/api/IKeymanPackageContentFiles/IndexOf.md
new file mode 100644
index 0000000000..aa4df169e0
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanPackageContentFiles/IndexOf.md
@@ -0,0 +1,17 @@
+---
+title: IKeymanPackageContentFiles::IndexOf Method
+---
+
+## Introduction
+
+The `IKeymanPackageContentFiles::IndexOf` method returns the zero-based
+index of the file in the collection that has a filename matching the
+`Filename` parameter.
+
+If no file matches, then the method returns `-1`.
+
+## Specification
+
+``` clike
+long IndexOf(string Filename)
+```
diff --git a/windows/docs/engine/api/IKeymanPackageContentFiles/Items.md b/windows/docs/engine/api/IKeymanPackageContentFiles/Items.md
new file mode 100644
index 0000000000..d0e2d24642
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanPackageContentFiles/Items.md
@@ -0,0 +1,24 @@
+---
+title: IKeymanPackageContentFiles::Items[Index] Property
+---
+
+## Introduction
+
+The `IKeymanPackageContentFiles::Items[Index]` property returns a
+[`IKeymanPackageContentFile`](../IKeymanPackageContentFile) reference to
+the file identified by `Index` in the package. If the file is not in the
+package, or the index is out of range, exception
+[`KMN_E_Collection_InvalidIndex`](../IKeymanError/ErrorCode) is raised.
+
+## Specification
+
+``` clike
+readonly IKeymanPackageContentFile* Items[variant Index]
+```
+
+## Parameters
+
+Index
+: A zero-based integer index or the string filename of the file. The
+ filename must include the extension, but paths are stripped off and
+ ignored.
diff --git a/windows/docs/engine/api/IKeymanPackageContentFiles/index.md b/windows/docs/engine/api/IKeymanPackageContentFiles/index.md
new file mode 100644
index 0000000000..853cf5cc4a
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanPackageContentFiles/index.md
@@ -0,0 +1,30 @@
+---
+title: IKeymanPackageContentFiles Interface
+---
+
+## Introduction
+
+The `IKeymanPackageContentFiles` interface lists the files included in
+the package.
+
+## Interface Hierarchy
+
+`IDispatch`
+
+> [`IKeymanObject`](../IKeymanObject)
+>
+> > [`IKeymanCollection`](../IKeymanCollection)
+> >
+> > > **`IKeymanPackageContentFiles`**
+
+## Properties
+
+[`Items[Index]`](Items) read only
+: Returns an
+ [`IKeymanPackageContentFile`](../IKeymanPackageContentFile)
+ reference for the file identified by `Index`.
+
+
+
+[`IndexOf()`](IndexOf)
+: Gets the index of a file by filename in the collection.
diff --git a/windows/docs/engine/api/IKeymanPackageContentFont/Filename.md b/windows/docs/engine/api/IKeymanPackageContentFont/Filename.md
new file mode 100644
index 0000000000..f877933062
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanPackageContentFont/Filename.md
@@ -0,0 +1,14 @@
+---
+title: IKeymanPackageContentFont::Filename Property
+---
+
+## Introduction
+
+The `IKeymanPackageContentFont::Filename` property returns the filename
+of the font, without path.
+
+## Specification
+
+``` clike
+readonly string Filename
+```
diff --git a/windows/docs/engine/api/IKeymanPackageContentFont/Name.md b/windows/docs/engine/api/IKeymanPackageContentFont/Name.md
new file mode 100644
index 0000000000..ba0c04819c
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanPackageContentFont/Name.md
@@ -0,0 +1,14 @@
+---
+title: IKeymanPackageContentFont::Name Property
+---
+
+## Introduction
+
+The `IKeymanPackageContentFont::Name` property returns the TrueType full
+name of the font, read from the font NAME table.
+
+## Specification
+
+``` clike
+readonly string Name
+```
diff --git a/windows/docs/engine/api/IKeymanPackageContentFont/index.md b/windows/docs/engine/api/IKeymanPackageContentFont/index.md
new file mode 100644
index 0000000000..60d3a717ab
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanPackageContentFont/index.md
@@ -0,0 +1,24 @@
+---
+title: IKeymanPackageContentFont Interface
+---
+
+## Introduction
+
+The `IKeymanPackageContentFont` interface describes a font within a
+package.
+
+## Interface Hierarchy
+
+`IDispatch`
+
+> [`IKeymanObject`](../IKeymanObject)
+>
+> > **`IKeymanPackageContentFont`**
+
+## Properties
+
+[`Filename`](Filename)
+: The filename of the font, without path.
+
+[`Name`](Name)
+: The TrueType full name of the font, read from the font NAME table.
diff --git a/windows/docs/engine/api/IKeymanPackageContentFonts/IndexOf.md b/windows/docs/engine/api/IKeymanPackageContentFonts/IndexOf.md
new file mode 100644
index 0000000000..84c8e1c32c
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanPackageContentFonts/IndexOf.md
@@ -0,0 +1,17 @@
+---
+title: IKeymanPackageContentFonts::IndexOf Method
+---
+
+## Introduction
+
+The `IKeymanPackageContentFonts::IndexOf` method returns the zero-based
+index of the file in the collection that has a filename matching the
+`Filename` parameter.
+
+If no file matches, then the method returns `-1`.
+
+## Specification
+
+``` clike
+long IndexOf(string Filename)
+```
diff --git a/windows/docs/engine/api/IKeymanPackageContentFonts/Items.md b/windows/docs/engine/api/IKeymanPackageContentFonts/Items.md
new file mode 100644
index 0000000000..c31670015f
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanPackageContentFonts/Items.md
@@ -0,0 +1,22 @@
+---
+title: IKeymanPackageContentFonts::Items[Index] Property
+---
+
+## Introduction
+
+The `IKeymanPackageContentFonts::Items[Index]` property returns a
+[`IKeymanPackageContentFont`](../IKeymanPackageContentFont) reference to
+the font identified by `Index` in the package. If the font is not in the
+package, or the index is out of range, exception
+[`KMN_E_Collection_InvalidIndex`](../IKeymanError/ErrorCode) is raised.
+
+## Specification
+
+``` clike
+readonly IKeymanPackageContentFont* Items[variant Index]
+```
+
+## Parameters
+
+Index
+: A zero-based integer index or the string filename of the font.
diff --git a/windows/docs/engine/api/IKeymanPackageContentFonts/index.md b/windows/docs/engine/api/IKeymanPackageContentFonts/index.md
new file mode 100644
index 0000000000..93dfa7e7b0
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanPackageContentFonts/index.md
@@ -0,0 +1,28 @@
+---
+title: IKeymanPackageContentFonts Interface
+---
+
+## Introduction
+
+The `IKeymanPackageContentFonts` interface lists the fonts included in
+the package.
+
+## Interface Hierarchy
+
+`IDispatch`
+
+> [`IKeymanObject`](../IKeymanObject)
+>
+> > [`IKeymanCollection`](../IKeymanCollection)
+> >
+> > > **`IKeymanPackageContentFonts`**
+
+## Properties
+
+[`Items[Index]`](Items) read only
+: Returns an
+ [`IKeymanPackageContentFont`](../IKeymanPackageContentFont)
+ reference for the font identified by `Index`.
+
+[`IndexOf()`](IndexOf)
+: Gets the index of a font by filename in the collection.
diff --git a/windows/docs/engine/api/IKeymanPackageContentKeyboards/Items.md b/windows/docs/engine/api/IKeymanPackageContentKeyboards/Items.md
new file mode 100644
index 0000000000..5bb8429496
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanPackageContentKeyboards/Items.md
@@ -0,0 +1,22 @@
+---
+title: IKeymanPackageContentKeyboards::Items[Index] Property
+---
+
+## Introduction
+
+The `IKeymanPackageContentKeyboards::Items[Index]` property returns a
+reference to the keyboard identified by `Index` in the package. If the
+keyboard does not exist, exception
+[`KMN_E_Collection_InvalidIndex`](../IKeymanError/ErrorCode) is raised.
+
+## Specification
+
+``` clike
+readonly IKeymanKeyboard* Items[variant Index]
+```
+
+## Parameters
+
+Index
+: A zero-based integer index or the string
+ [`IKeymanKeyboard::ID`](../IKeymanKeyboard/ID) of the keyboard.
diff --git a/windows/docs/engine/api/IKeymanPackageContentKeyboards/index.md b/windows/docs/engine/api/IKeymanPackageContentKeyboards/index.md
new file mode 100644
index 0000000000..444bf03895
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanPackageContentKeyboards/index.md
@@ -0,0 +1,26 @@
+---
+title: IKeymanPackageContentKeyboards Interface
+---
+
+## Introduction
+
+The `IKeymanPackageContentKeyboards` interface lists the keyboards
+included in the package.
+
+## Interface Hierarchy
+
+`IDispatch`
+
+> [`IKeymanObject`](../IKeymanObject)
+>
+> > [`IKeymanCollection`](../IKeymanCollection)
+> >
+> > > [`IKeymanKeyboards`](../IKeymanKeyboards)
+> > >
+> > > > **`IKeymanPackageContentKeyboards`**
+
+## Properties
+
+[`Items[Index]`](Items) read only
+: Returns an [`IKeymanKeyboard`](../IKeymanKeyboard) reference for the
+ keyboard identified by `Index`.
diff --git a/windows/docs/engine/api/IKeymanPackageFile/Install.md b/windows/docs/engine/api/IKeymanPackageFile/Install.md
new file mode 100644
index 0000000000..5be76680c4
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanPackageFile/Install.md
@@ -0,0 +1,40 @@
+---
+title: IKeymanPackageFile::Install Method
+---
+
+## Introduction
+
+The `IKeymanPackageFile::Install` method installs the package file
+(.kmp) into Keyman Engine for Windows. This includes decompressing the
+archive, copying the files contained into the Keyman Engine package
+store, adding registry settings, installing fonts, and keyboard layouts
+with default languages.
+
+Fonts are copied and installed into the Windows Fonts folder, if an
+existing font with the same name is not already present.
+
+This method requires elevated privileges.
+
+## Specification
+
+``` clike
+void Install(bool Force)
+```
+
+## Parameters
+
+`Force`
+: If `True`, overwrites an existing package entry.
+
+## See also
+
+[`IKeymanPackagesInstalled::Install`](../IKeymanPackagesInstalled/Install)
+: Installs a package file and input method for default language
+
+[`IKeymanPackagesInstalled::Install2`](../IKeymanPackagesInstalled2/Install2)
+: Installs a package file, optionally with input method for default
+ language
+
+[`IKeymanPackageFile2::Install2`](../IKeymanPackageFile2/Install2)
+: Installs a package file, optionally with input method for default
+ language
diff --git a/windows/docs/engine/api/IKeymanPackageFile/index.md b/windows/docs/engine/api/IKeymanPackageFile/index.md
new file mode 100644
index 0000000000..015d5803ec
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanPackageFile/index.md
@@ -0,0 +1,27 @@
+---
+title: IKeymanPackageFile Interface
+---
+
+## Introduction
+
+The `IKeymanPackageFile` interface describes a keyboard package file. A
+keyboard package file is a bundle that contains keyboard layout(s),
+visual keyboards, documentation, fonts and any other related files to
+simplify distribution of keyboard layouts.
+
+## Interface Hierarchy
+
+`IDispatch`
+
+> [`IKeymanObject`](../IKeymanObject)
+>
+> > [`IKeymanPackage`](../IKeymanPackage)
+> >
+> > > **`IKeymanPackageFile`**
+> > >
+> > > > [`IKeymanPackageFile2`](../IKeymanPackageFile2)
+
+## Methods
+
+[`Install()`](Install)
+: Installs the package into Keyman Engine.
diff --git a/windows/docs/engine/api/IKeymanPackageFile2/Install2.md b/windows/docs/engine/api/IKeymanPackageFile2/Install2.md
new file mode 100644
index 0000000000..33437373e8
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanPackageFile2/Install2.md
@@ -0,0 +1,43 @@
+---
+title: IKeymanPackageFile2::Install2 Method
+---
+
+## Introduction
+
+The `IKeymanPackageFile2::Install2` method installs the package file
+(.kmp) into Keyman Engine for Windows. This includes decompressing the
+archive, copying the files contained into the Keyman Engine package
+store, adding registry settings, installing fonts, and keyboard layouts,
+optionally with input methods for default languages.
+
+Fonts are copied and installed into the Windows Fonts folder, if an
+existing font with the same name is not already present.
+
+This method requires elevated privileges.
+
+## Specification
+
+``` clike
+void Install(bool Force, bool InstallDefaultLanguage)
+```
+
+## Parameters
+
+`Force`
+: If `True`, overwrites an existing package entry.
+
+`InstallDefaultLanguage`
+: If `True`, installs the Windows input method for the default
+ language.
+
+## See also
+
+[`IKeymanPackagesInstalled::Install`](../IKeymanPackagesInstalled/Install)
+: Installs a package file and input method for default language
+
+[`IKeymanPackagesInstalled::Install2`](../IKeymanPackagesInstalled2/Install2)
+: Installs a package file, optionally with input method for default
+ language
+
+[`IKeymanPackageFile::Install`](../IKeymanPackageFile/Install)
+: Installs a package file and input method for default language
diff --git a/windows/docs/engine/api/IKeymanPackageFile2/index.md b/windows/docs/engine/api/IKeymanPackageFile2/index.md
new file mode 100644
index 0000000000..996232bd5a
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanPackageFile2/index.md
@@ -0,0 +1,32 @@
+---
+title: IKeymanPackageFile2 Interface
+---
+
+## Introduction
+
+The `IKeymanPackageFile2` interface describes a keyboard package file. A
+keyboard package file is a bundle that contains keyboard layout(s),
+visual keyboards, documentation, fonts and any other related files to
+simplify distribution of keyboard layouts.
+
+## Interface Hierarchy
+
+`IDispatch`
+
+> [`IKeymanObject`](../IKeymanObject)
+>
+> > [`IKeymanPackage`](../IKeymanPackage)
+> >
+> > > [`IKeymanPackageFile`](../IKeymanPackageFile)
+> > >
+> > > > **`IKeymanPackageFile2`**
+
+## Methods
+
+[`Install2()`](Install2)
+: Installs the package into Keyman Engine, optionally adding default
+ input method.
+
+## History
+
+Added in Keyman Engine for Windows 14.0.
diff --git a/windows/docs/engine/api/IKeymanPackageInstalled/Uninstall.md b/windows/docs/engine/api/IKeymanPackageInstalled/Uninstall.md
new file mode 100644
index 0000000000..67c84bbdfb
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanPackageInstalled/Uninstall.md
@@ -0,0 +1,29 @@
+---
+title: IKeymanPackageInstalled::Uninstall Method
+---
+
+## Introduction
+
+The `IKeymanPackageInstalled::Uninstall` method uninstalls the package
+and its contained keyboards and related artefacts from Keyman Engine for
+Windows. This includes deleting the files from the Keyman Engine package
+store, removing registry settings, and removing Windows input methods.
+
+Changes associated with calling this method are applied immediately;
+[`IKeyman::Apply`](../IKeyman/Apply) does not need to be called.
+However, changes to the Windows input methods are applied
+asynchronously.
+
+This method requires elevated privileges.
+
+## Specification
+
+``` clike
+void Uninstall(bool RemoveFonts)
+```
+
+## Parameters
+
+`RemoveFonts`
+: If set to `True`, fonts that were installed with the package are
+ removed from the system; otherwise, the fonts remain on the system.
diff --git a/windows/docs/engine/api/IKeymanPackageInstalled/index.md b/windows/docs/engine/api/IKeymanPackageInstalled/index.md
new file mode 100644
index 0000000000..1dd6138d1b
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanPackageInstalled/index.md
@@ -0,0 +1,26 @@
+---
+title: IKeymanPackageInstalled Interface
+---
+
+## Introduction
+
+The `IKeymanPackageInstalled` interface describes an installed keyboard
+package in Keyman Engine for Windows API. The installed keyboard package
+is essentially a folder in the Keyman package store, and contains
+keyboard layouts, visual keyboards, documentation, fonts and any other
+related files to simplify distribution of keyboard layouts.
+
+## Interface Hierarchy
+
+`IDispatch`
+
+> [`IKeymanObject`](../IKeymanObject)
+>
+> > [`IKeymanPackage`](../IKeymanPackage)
+> >
+> > > **`IKeymanPackageInstalled`**
+
+## Methods
+
+[`Uninstall()`](Uninstall)
+: Uninstalls the package from Keyman Engine.
diff --git a/windows/docs/engine/api/IKeymanPackagesInstalled/GetPackageFromFile.md b/windows/docs/engine/api/IKeymanPackagesInstalled/GetPackageFromFile.md
new file mode 100644
index 0000000000..eb7d8c49fd
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanPackagesInstalled/GetPackageFromFile.md
@@ -0,0 +1,20 @@
+---
+title: IKeymanPackagesInstalled::GetPackageFromFile Method
+---
+
+## Introduction
+
+The `IKeymanPackagesInstalled::GetPackageFromFile` method loads the
+package file referred to by Filename and returns details about the file.
+It does not install the package for use.
+
+## Specification
+
+``` clike
+IKeymanPackageFile* GetPackageFromFile(string Filename)
+```
+
+## Parameters
+
+Filename
+: The fully-qualified path to the .kmp file to be loaded.
diff --git a/windows/docs/engine/api/IKeymanPackagesInstalled/IndexOf.md b/windows/docs/engine/api/IKeymanPackagesInstalled/IndexOf.md
new file mode 100644
index 0000000000..59ce45a4b2
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanPackagesInstalled/IndexOf.md
@@ -0,0 +1,17 @@
+---
+title: IKeymanPackagsInstalled::IndexOf Method
+---
+
+## Introduction
+
+The `IKeymanPackagsInstalled::IndexOf` method returns the zero-based
+index of the package in the collection that has an ID matching the `ID`
+parameter.
+
+If no package matches, then the method returns `-1`.
+
+## Specification
+
+``` clike
+long IndexOf(string ID)
+```
diff --git a/windows/docs/engine/api/IKeymanPackagesInstalled/Install.md b/windows/docs/engine/api/IKeymanPackagesInstalled/Install.md
new file mode 100644
index 0000000000..83552824cc
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanPackagesInstalled/Install.md
@@ -0,0 +1,44 @@
+---
+title: IKeymanPackagesInstalled::Install Method
+---
+
+## Introduction
+
+The `IKeymanPackagesInstalled::Install` installs the package file (.kmp)
+into Keyman Engine for Windows. This includes decompressing the archive,
+copying the files contained into the Keyman Engine package store, adding
+registry settings, installing fonts, and keyboard layouts with default
+languages.
+
+Fonts are copied and installed into the Windows Fonts folder, if an
+existing font with the same name is not already present.
+
+This method requires elevated privileges.
+
+## Specification
+
+``` clike
+void Install(string Filename, bool Force)
+```
+
+## Parameters
+
+`Filename`
+: The fully-qualified path to the .kmp file to be installed. This file
+ will be copied to the Keyman package store.
+
+`Force`
+: If `True`, overwrites an existing package entry.
+
+## See also
+
+[`IKeymanPackagesInstalled::Install2`](../IKeymanPackagesInstalled2/Install2)
+: Installs a package file, optionally with input method for default
+ language
+
+[`IKeymanPackageFile::Install`](../IKeymanPackageFile/Install)
+: Installs a package file and input method for default language
+
+[`IKeymanPackageFile2::Install2`](../IKeymanPackageFile2/Install2)
+: Installs a package file, optionally with input method for default
+ language
diff --git a/windows/docs/engine/api/IKeymanPackagesInstalled/Items.md b/windows/docs/engine/api/IKeymanPackagesInstalled/Items.md
new file mode 100644
index 0000000000..48366307da
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanPackagesInstalled/Items.md
@@ -0,0 +1,22 @@
+---
+title: IKeymanPackagesInstalled::Items[Index] Property
+---
+
+## Introduction
+
+The `IKeymanPackagesInstalled::Items[Index]` property returns a
+reference to the installed package identified by `Index`. If the package
+is not found, exception
+[`KMN_E_Collection_InvalidIndex`](../IKeymanError/ErrorCode) is raised.
+
+## Specification
+
+``` clike
+readonly IKeymanPackageInstalled* Items[variant Index]
+```
+
+## Parameters
+
+Index
+: A zero-based integer index or the string
+ [`IKeymanPackage::ID`](../IKeymanPackage/ID) of the package.
diff --git a/windows/docs/engine/api/IKeymanPackagesInstalled/index.md b/windows/docs/engine/api/IKeymanPackagesInstalled/index.md
new file mode 100644
index 0000000000..571302a34b
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanPackagesInstalled/index.md
@@ -0,0 +1,38 @@
+---
+title: IKeymanPackagesInstalled Interface
+---
+
+## Introduction
+
+The `IKeymanPackagesInstalled` interface lists the packages installed in
+Keyman Engine.
+
+## Interface Hierarchy
+
+`IDispatch`
+
+> [`IKeymanObject`](../IKeymanObject)
+>
+> > [`IKeymanCollection`](../IKeymanCollection)
+> >
+> > > **`IKeymanPackagesInstalled`**
+> > >
+> > > > [`IKeymanPackagesInstalled2`](../IKeymanPackagesInstalled2)
+
+## Properties
+
+[`Items[Index]`](Items) read only
+: Returns an [`IKeymanPackageInstalled`](../IKeymanPackageInstalled)
+ reference for the package identified by `Index`.
+
+## Methods
+
+[`GetPackageFromFile()`](GetPackageFromFile)
+: Returns an [`IKeymanPackageFile`](../IKeymanPackageFile) reference
+ for a package file.
+
+[`IndexOf()`](IndexOf)
+: Gets the index of a package by ID in the collection.
+
+[`Install()`](Install)
+: Installs a package file into Keyman Engine.
diff --git a/windows/docs/engine/api/IKeymanPackagesInstalled2/Install2.md b/windows/docs/engine/api/IKeymanPackagesInstalled2/Install2.md
new file mode 100644
index 0000000000..13271d854f
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanPackagesInstalled2/Install2.md
@@ -0,0 +1,47 @@
+---
+title: IKeymanPackagesInstalled2::Install2 Method
+---
+
+## Introduction
+
+The `IKeymanPackagesInstalled2::Install2` installs the package file
+(.kmp) into Keyman Engine for Windows. This includes decompressing the
+archive, copying the files contained into the Keyman Engine package
+store, adding registry settings, installing fonts, and keyboard layouts
+optionally with input methods for default languages.
+
+Fonts are copied and installed into the Windows Fonts folder, if an
+existing font with the same name is not already present.
+
+This method requires elevated privileges.
+
+## Specification
+
+``` clike
+void Install(string Filename, bool Force, bool InstallDefaultLanguage)
+```
+
+## Parameters
+
+`Filename`
+: The fully-qualified path to the .kmp file to be installed. This file
+ will be copied to the Keyman package store.
+
+`Force`
+: If `True`, overwrites an existing package entry.
+
+`InstallDefaultLanguage`
+: If `True`, installs the Windows input method for the default
+ language.
+
+## See also
+
+[`IKeymanPackagesInstalled::Install`](../IKeymanPackagesInstalled/Install)
+: Installs a package file and input method for default language
+
+[`IKeymanPackageFile::Install`](../IKeymanPackageFile/Install)
+: Installs a package file and input method for default language
+
+[`IKeymanPackageFile2::Install2`](../IKeymanPackageFile2/Install2)
+: Installs a package file, optionally with input method for default
+ language
diff --git a/windows/docs/engine/api/IKeymanPackagesInstalled2/index.md b/windows/docs/engine/api/IKeymanPackagesInstalled2/index.md
new file mode 100644
index 0000000000..c1ffa5b2f2
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanPackagesInstalled2/index.md
@@ -0,0 +1,30 @@
+---
+title: IKeymanPackagesInstalled2 Interface
+---
+
+## Introduction
+
+The `IKeymanPackagesInstalled2` interface lists the packages installed
+in Keyman Engine.
+
+## Interface Hierarchy
+
+`IDispatch`
+
+> [`IKeymanObject`](../IKeymanObject)
+>
+> > [`IKeymanCollection`](../IKeymanCollection)
+> >
+> > > [`IKeymanPackagesInstalled`](../IKeymanPackagesInstalled)
+> > >
+> > > > **`IKeymanPackagesInstalled2`**
+
+## Methods
+
+[`Install2()`](Install2)
+: Installs a package file into Keyman Engine, optionally adding
+ default input method.
+
+## History
+
+Added in Keyman Engine for Windows 14.0.
diff --git a/windows/docs/engine/api/IKeymanSystemInfo/EngineInstallPath.md b/windows/docs/engine/api/IKeymanSystemInfo/EngineInstallPath.md
new file mode 100644
index 0000000000..2a96731c72
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanSystemInfo/EngineInstallPath.md
@@ -0,0 +1,14 @@
+---
+title: IKeymanSystemInfo::EngineInstallPath Property
+---
+
+## Introduction
+
+The `IKeymanSystemInfo::EngineInstallPath` property returns the fully
+qualified path where Keyman Engine is installed.
+
+## Specification
+
+``` clike
+readonly string EngineInstallPath
+```
diff --git a/windows/docs/engine/api/IKeymanSystemInfo/EngineVersion.md b/windows/docs/engine/api/IKeymanSystemInfo/EngineVersion.md
new file mode 100644
index 0000000000..5b9159cfa1
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanSystemInfo/EngineVersion.md
@@ -0,0 +1,14 @@
+---
+title: IKeymanSystemInfo::EngineVersion Property
+---
+
+## Introduction
+
+The `IKeymanSystemInfo::EngineVersion` property returns the version of
+Keyman Engine currently installed.
+
+## Specification
+
+``` clike
+readonly string EngineVersion
+```
diff --git a/windows/docs/engine/api/IKeymanSystemInfo/IsAdministrator.md b/windows/docs/engine/api/IKeymanSystemInfo/IsAdministrator.md
new file mode 100644
index 0000000000..12f407a323
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanSystemInfo/IsAdministrator.md
@@ -0,0 +1,15 @@
+---
+title: IKeymanSystemInfo::IsAdministrator Property
+---
+
+## Introduction
+
+The `IKeymanSystemInfo::IsAdministrator` property returns `True` if
+Keyman Engine has sufficient privileges to install keyboards and perform
+tasks with elevated privileges.
+
+## Specification
+
+``` clike
+readonly bool IsAdministrator
+```
diff --git a/windows/docs/engine/api/IKeymanSystemInfo/RebootRequired.md b/windows/docs/engine/api/IKeymanSystemInfo/RebootRequired.md
new file mode 100644
index 0000000000..2ee4ced2fe
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanSystemInfo/RebootRequired.md
@@ -0,0 +1,17 @@
+---
+title: IKeymanSystemInfo::RebootRequired Property
+---
+
+## Introduction
+
+The `IKeymanSystemInfo::RebootRequired` property returns `True` if a
+previous action performed through the Keyman Engine API cannot be
+completed until the system is restarted. Typically this can arise if a
+file is locked by another process at install time, and is most likely to
+occur with font installation and removal.
+
+## Specification
+
+``` clike
+readonly bool RebootRequired
+```
diff --git a/windows/docs/engine/api/IKeymanSystemInfo/SetReboot.md b/windows/docs/engine/api/IKeymanSystemInfo/SetReboot.md
new file mode 100644
index 0000000000..7f377a285e
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanSystemInfo/SetReboot.md
@@ -0,0 +1,16 @@
+---
+title: IKeymanSystemInfo::SetReboot Method
+---
+
+## Introduction
+
+The `IKeymanSystemInfo::SetReboot` method sets the reboot flag
+[`RebootRequired`](RebootRequired). This is typically used by Keyman
+Engine API internally but can also be set by a client process for their
+own reference.
+
+## Specification
+
+``` clike
+void SetReboot(void)
+```
diff --git a/windows/docs/engine/api/IKeymanSystemInfo/index.md b/windows/docs/engine/api/IKeymanSystemInfo/index.md
new file mode 100644
index 0000000000..afb8d8d30b
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanSystemInfo/index.md
@@ -0,0 +1,39 @@
+---
+title: IKeymanSystemInfo Interface
+---
+
+## Introduction
+
+The `IKeymanSystemInfo` interface provides information about Keyman
+Engine and the environment.
+
+## Interface Hierarchy
+
+`IDispatch`
+
+> [`IKeymanObject`](../IKeymanObject)
+>
+> > **`IKeymanSystemInfo`**
+
+## Properties
+
+[`EngineInstallPath`](EngineInstallPath) read only
+: Returns the fully qualified path where Keyman Engine is installed.
+
+[`EngineVersion`](EngineVersion) read only
+: Returns the version of Keyman Engine currently installed.
+
+[`IsAdministrator`](IsAdministrator) read only
+: Returns `True` if Keyman Engine has sufficient privileges to install
+ keyboards and perform tasks with elevated privileges.
+
+[`RebootRequired`](RebootRequired) read only
+: Returns `True` if a previous action performed through the Keyman
+ Engine API cannot be completed until the system is restarted.
+
+## Methods
+
+[`SetReboot()`](SetReboot)
+: Sets the reboot flag. This is typically used by Keyman Engine API
+ internally but can also be set by a client process for their own
+ reference.
diff --git a/windows/docs/engine/api/IKeymanVisualKeyboard/Filename.md b/windows/docs/engine/api/IKeymanVisualKeyboard/Filename.md
new file mode 100644
index 0000000000..a0b63efdce
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanVisualKeyboard/Filename.md
@@ -0,0 +1,15 @@
+---
+title: IKeymanVisualKeyboard::Filename Property
+---
+
+## Introduction
+
+The `IKeymanVisualKeyboard::Filename` property returns the fully
+qualified filename of the visual keyboard .kvk file as found in the
+Keyman keyboard store.
+
+## Specification
+
+``` clike
+readonly string Filename
+```
diff --git a/windows/docs/engine/api/IKeymanVisualKeyboard/Uninstall.md b/windows/docs/engine/api/IKeymanVisualKeyboard/Uninstall.md
new file mode 100644
index 0000000000..368005e271
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanVisualKeyboard/Uninstall.md
@@ -0,0 +1,16 @@
+---
+title: IKeymanVisualKeyboard::Uninstall Method
+---
+
+## Introduction
+
+The `IKeymanVisualKeyboard::Uninstall` method removes this visual
+keyboard from the keyboard and the Keyman keyboard store.
+
+This method requires elevated privileges.
+
+## Specification
+
+``` clike
+void Uninstall(void)
+```
diff --git a/windows/docs/engine/api/IKeymanVisualKeyboard/index.md b/windows/docs/engine/api/IKeymanVisualKeyboard/index.md
new file mode 100644
index 0000000000..ea200c4650
--- /dev/null
+++ b/windows/docs/engine/api/IKeymanVisualKeyboard/index.md
@@ -0,0 +1,30 @@
+---
+title: IKeymanVisualKeyboard Interface
+---
+
+## Introduction
+
+The `IKeymanVisualKeyboard` interface references the visual keyboard
+associated with an installed
+[`IKeymanKeyboardInstalled`](../IKeymanKeyboardInstalled) keyboard
+layout.
+
+## Interface Hierarchy
+
+`IDispatch`
+
+> [`IKeymanObject`](../IKeymanObject)
+>
+> > **`IKeymanVisualKeyboard`**
+
+## Properties
+
+[`Filename`](Filename) read only
+: Returns the fully qualified filename of the visual keyboard .kvk
+ file.
+
+## Methods
+
+[`Uninstall()`](Uninstall)
+: Removes this visual keyboard from the keyboard and the Keyman
+ keyboard store.
diff --git a/windows/docs/engine/api/index.md b/windows/docs/engine/api/index.md
new file mode 100644
index 0000000000..9ff2784f57
--- /dev/null
+++ b/windows/docs/engine/api/index.md
@@ -0,0 +1,82 @@
+---
+title: Keyman Engine for Windows 14.0 API
+---
+
+## Introduction
+
+The Keyman Engine for Windows 18.0 API is implemented in COM. It can be
+instantiated with `CreateObject("keymanapi.Keyman")`.
+
+**Note:** This documentation applies to Keyman Engine for Windows
+versions 14.0 and up.
+
+## Interface Hierarchy
+
+`IDispatch`
+
+> [`IKeymanObject`](IKeymanObject)
+>
+> > [`IKeyman`](IKeyman)
+> > [`IKeymanCollection`](IKeymanCollection)
+> >
+> > > [`IKeymanErrors`](IKeymanErrors)
+> > > [`IKeymanHotkeys`](IKeymanHotkeys)
+> > > [`IKeymanKeyboardLanguages`](IKeymanKeyboardLanguages)
+> > >
+> > > > [`IKeymanKeyboardLanguagesFile`](IKeymanKeyboardLanguagesFile)
+> > > > [`IKeymanKeyboardLanguagesInstalled`](IKeymanKeyboardLanguagesInstalled)
+> > > >
+> > > > > [`IKeymanKeyboardLanguagesInstalled2`](IKeymanKeyboardLanguagesInstalled2)
+> > >
+> > > [`IKeymanKeyboardOptions`](IKeymanKeyboardOptions)
+> > > [`IKeymanKeyboards`](IKeymanKeyboards)
+> > >
+> > > > [`IKeymanKeyboardsInstalled`](IKeymanKeyboardsInstalled)
+> > > >
+> > > > > [`IKeymanKeyboardsInstalled2`](IKeymanKeyboardsInstalled2)
+> > > >
+> > > > [`IKeymanPackageContentKeyboards`](IKeymanPackageContentKeyboards)
+> > >
+> > > [`IKeymanLanguages`](IKeymanLanguages)
+> > > [`IKeymanOptions`](IKeymanOptions)
+> > > [`IKeymanPackageContentFiles`](IKeymanPackageContentFiles)
+> > > [`IKeymanPackageContentFonts`](IKeymanPackageContentFonts)
+> > > [`IKeymanPackagesInstalled`](IKeymanPackagesInstalled)
+> > >
+> > > > [`IKeymanPackagesInstalled2`](IKeymanPackagesInstalled2)
+> >
+> > [`IKeymanControl`](IKeymanControl)
+> > [`IKeymanError`](IKeymanError)
+> > [`IKeymanHotkey`](IKeymanHotkey)
+> > [`IKeymanKeyboard`](IKeymanKeyboard)
+> >
+> > > [`IKeymanKeyboardFile`](IKeymanKeyboardFile)
+> > >
+> > > > [`IKeymanKeyboardFile2`](IKeymanKeyboardFile2)
+> > >
+> > > [`IKeymanKeyboardInstalled`](IKeymanKeyboardInstalled)
+> >
+> > [`IKeymanKeyboardLanguage`](IKeymanKeyboardLanguage)
+> >
+> > > [`IKeymanKeyboardLanguageInstalled`](IKeymanKeyboardLanguageInstalled)
+> > >
+> > > > [`IKeymanKeyboardLanguageInstalled2`](IKeymanKeyboardLanguageInstalled2)
+> >
+> > [`IKeymanKeyboardOption`](IKeymanKeyboardOption)
+> > [`IKeymanLanguage`](IKeymanLanguage)
+> > [`IKeymanOption`](IKeymanOption)
+> > [`IKeymanPackage`](IKeymanPackage)
+> >
+> > > [`IKeymanPackageFile`](IKeymanPackageFile)
+> > >
+> > > > [`IKeymanPackageFile2`](IKeymanPackageFile2)
+> > >
+> > > [`IKeymanPackageInstalled`](IKeymanPackageInstalled)
+> >
+> > [`IKeymanPackageContentFile`](IKeymanPackageContentFile)
+> > [`IKeymanPackageContentFont`](IKeymanPackageContentFont)
+> > [`IKeymanSystemInfo`](IKeymanSystemInfo)
+> > [`IKeymanVisualKeyboard`](IKeymanVisualKeyboard)
+> > [`IKeymanBCP47Canonicalization`](IKeymanBCP47Canonicalization)
+
+
diff --git a/windows/docs/engine/index.md b/windows/docs/engine/index.md
new file mode 100644
index 0000000000..acdd77d877
--- /dev/null
+++ b/windows/docs/engine/index.md
@@ -0,0 +1,18 @@
+---
+title: Keyman Engine for Windows 18.0
+---
+
+Keyman Engine for Windows 18.0 gives you the tools to build a customised
+desktop keyboarding product for Windows.
+
+**Note:** This documentation applies to Keyman Engine for Windows
+versions 14.0 and up.
+
+[COM API reference](api/)
+
+[Registry reference](registry)
+
+## See also
+
+- [Keyman Engine for Desktop 10.0-13.0](/developer/engine/desktop/10.0/)
+- [Keyman Engine for Desktop 9.0](/developer/engine/desktop/9.0/)
diff --git a/windows/docs/engine/registry.md b/windows/docs/engine/registry.md
new file mode 100644
index 0000000000..426447e7ed
--- /dev/null
+++ b/windows/docs/engine/registry.md
@@ -0,0 +1,36 @@
+---
+title: Registry Settings
+---
+
+*This document refers to Keyman 6.0: please
+contact Keyman Support if you need further information about Keyman
+registry settings.*
+
+Keyman makes changes to the registry in the following locations (the
+values modified are not listed here, only the general locations):
+
+
+| Location |Information |
+| -------------------------------------------------- | ----------------------------------------------- |
+| HKEY_CLASSES_ROOT\.kmx
HKEY_CLASSES_ROOT\.kmp
HKEY_CLASSES_ROOT\Keyman.File.Keyboard
HKEY_CLASSES_ROOT\Keyman.File.Package | File associations in Explorer |
+| HKEY_CURRENT_USER\Software\Tavultesoft\Keyman\6.0 | Keyman user settings |
+| HKEY_CURRENT_USER\Software\Tavultesoft\Keyman\6.0\Active Keyboards | Per-user keyboard settings |
+| HKEY_CURRENT_USER\Software\Tavultesoft\Keyman\6.0\Active Languages | Language associations |
+| HKEY_CURRENT_USER\Software\Tavultesoft\Keyman\6.0\Installed Keyboards | Keyman user keyboards |
+| HKEY_CURRENT_USER\Software\Tavultesoft\Keyman\6.0\Installed Packages | Keyman user packages |
+| HKEY_CURRENT_USER\Software\Tavultesoft\Keyman\6.0\Add-ins | Keyman user add-ins |
+| HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run | Keyman startup with Windows |
+| HKEY_LOCAL_MACHINE\Software\Tavultesoft\Keyman\6.0 | Keyman global settings |
+| HKEY_LOCAL_MACHINE\Software\Tavultesoft\Keyman\6.0\Installed Keyboards | Keyman global keyboards |
+| HKEY_LOCAL_MACHINE\Software\Tavultesoft\Keyman\6.0\Installed Packages | Keyman global packages |
+| HKEY_LOCAL_MACHINE\Software\Tavultesoft\Keyman\6.0\Add-ins | Keyman global packages |
+| HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall\Keyman Keyboard * | Keyman keyboard uninstall keys |
+| HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall\Tavultesoft Keyman 6.0 | Keyman runtime uninstall key |
+| HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Keyboard Layouts\0000xxFE | Keyman associated Windows keyboards |
+
+
+
+
+
+
+
diff --git a/windows/src/build.sh b/windows/src/build.sh
index c6768a6d92..c6cbbaa82b 100755
--- a/windows/src/build.sh
+++ b/windows/src/build.sh
@@ -30,5 +30,11 @@ builder_describe \
builder_parse "$@"
builder_run_child_actions clean configure build test
-builder_run_action test:help check-markdown "$KEYMAN_ROOT/windows/docs/help"
+
+function do_test_help() {
+ check-markdown "$KEYMAN_ROOT/windows/docs/help"
+ check-markdown "$KEYMAN_ROOT/windows/docs/engine"
+}
+
+builder_run_action test:help do_test_help
builder_run_child_actions publish install