diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..a612ad9
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,373 @@
+Mozilla Public License Version 2.0
+==================================
+
+1. Definitions
+--------------
+
+1.1. "Contributor"
+    means each individual or legal entity that creates, contributes to
+    the creation of, or owns Covered Software.
+
+1.2. "Contributor Version"
+    means the combination of the Contributions of others (if any) used
+    by a Contributor and that particular Contributor's Contribution.
+
+1.3. "Contribution"
+    means Covered Software of a particular Contributor.
+
+1.4. "Covered Software"
+    means Source Code Form to which the initial Contributor has attached
+    the notice in Exhibit A, the Executable Form of such Source Code
+    Form, and Modifications of such Source Code Form, in each case
+    including portions thereof.
+
+1.5. "Incompatible With Secondary Licenses"
+    means
+
+    (a) that the initial Contributor has attached the notice described
+        in Exhibit B to the Covered Software; or
+
+    (b) that the Covered Software was made available under the terms of
+        version 1.1 or earlier of the License, but not also under the
+        terms of a Secondary License.
+
+1.6. "Executable Form"
+    means any form of the work other than Source Code Form.
+
+1.7. "Larger Work"
+    means a work that combines Covered Software with other material, in
+    a separate file or files, that is not Covered Software.
+
+1.8. "License"
+    means this document.
+
+1.9. "Licensable"
+    means having the right to grant, to the maximum extent possible,
+    whether at the time of the initial grant or subsequently, any and
+    all of the rights conveyed by this License.
+
+1.10. "Modifications"
+    means any of the following:
+
+    (a) any file in Source Code Form that results from an addition to,
+        deletion from, or modification of the contents of Covered
+        Software; or
+
+    (b) any new file in Source Code Form that contains any Covered
+        Software.
+
+1.11. "Patent Claims" of a Contributor
+    means any patent claim(s), including without limitation, method,
+    process, and apparatus claims, in any patent Licensable by such
+    Contributor that would be infringed, but for the grant of the
+    License, by the making, using, selling, offering for sale, having
+    made, import, or transfer of either its Contributions or its
+    Contributor Version.
+
+1.12. "Secondary License"
+    means either the GNU General Public License, Version 2.0, the GNU
+    Lesser General Public License, Version 2.1, the GNU Affero General
+    Public License, Version 3.0, or any later versions of those
+    licenses.
+
+1.13. "Source Code Form"
+    means the form of the work preferred for making modifications.
+
+1.14. "You" (or "Your")
+    means an individual or a legal entity exercising rights under this
+    License. For legal entities, "You" includes any entity that
+    controls, is controlled by, or is under common control with You. For
+    purposes of this definition, "control" means (a) the power, direct
+    or indirect, to cause the direction or management of such entity,
+    whether by contract or otherwise, or (b) ownership of more than
+    fifty percent (50%) of the outstanding shares or beneficial
+    ownership of such entity.
+
+2. License Grants and Conditions
+--------------------------------
+
+2.1. Grants
+
+Each Contributor hereby grants You a world-wide, royalty-free,
+non-exclusive license:
+
+(a) under intellectual property rights (other than patent or trademark)
+    Licensable by such Contributor to use, reproduce, make available,
+    modify, display, perform, distribute, and otherwise exploit its
+    Contributions, either on an unmodified basis, with Modifications, or
+    as part of a Larger Work; and
+
+(b) under Patent Claims of such Contributor to make, use, sell, offer
+    for sale, have made, import, and otherwise transfer either its
+    Contributions or its Contributor Version.
+
+2.2. Effective Date
+
+The licenses granted in Section 2.1 with respect to any Contribution
+become effective for each Contribution on the date the Contributor first
+distributes such Contribution.
+
+2.3. Limitations on Grant Scope
+
+The licenses granted in this Section 2 are the only rights granted under
+this License. No additional rights or licenses will be implied from the
+distribution or licensing of Covered Software under this License.
+Notwithstanding Section 2.1(b) above, no patent license is granted by a
+Contributor:
+
+(a) for any code that a Contributor has removed from Covered Software;
+    or
+
+(b) for infringements caused by: (i) Your and any other third party's
+    modifications of Covered Software, or (ii) the combination of its
+    Contributions with other software (except as part of its Contributor
+    Version); or
+
+(c) under Patent Claims infringed by Covered Software in the absence of
+    its Contributions.
+
+This License does not grant any rights in the trademarks, service marks,
+or logos of any Contributor (except as may be necessary to comply with
+the notice requirements in Section 3.4).
+
+2.4. Subsequent Licenses
+
+No Contributor makes additional grants as a result of Your choice to
+distribute the Covered Software under a subsequent version of this
+License (see Section 10.2) or under the terms of a Secondary License (if
+permitted under the terms of Section 3.3).
+
+2.5. Representation
+
+Each Contributor represents that the Contributor believes its
+Contributions are its original creation(s) or it has sufficient rights
+to grant the rights to its Contributions conveyed by this License.
+
+2.6. Fair Use
+
+This License is not intended to limit any rights You have under
+applicable copyright doctrines of fair use, fair dealing, or other
+equivalents.
+
+2.7. Conditions
+
+Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
+in Section 2.1.
+
+3. Responsibilities
+-------------------
+
+3.1. Distribution of Source Form
+
+All distribution of Covered Software in Source Code Form, including any
+Modifications that You create or to which You contribute, must be under
+the terms of this License. You must inform recipients that the Source
+Code Form of the Covered Software is governed by the terms of this
+License, and how they can obtain a copy of this License. You may not
+attempt to alter or restrict the recipients' rights in the Source Code
+Form.
+
+3.2. Distribution of Executable Form
+
+If You distribute Covered Software in Executable Form then:
+
+(a) such Covered Software must also be made available in Source Code
+    Form, as described in Section 3.1, and You must inform recipients of
+    the Executable Form how they can obtain a copy of such Source Code
+    Form by reasonable means in a timely manner, at a charge no more
+    than the cost of distribution to the recipient; and
+
+(b) You may distribute such Executable Form under the terms of this
+    License, or sublicense it under different terms, provided that the
+    license for the Executable Form does not attempt to limit or alter
+    the recipients' rights in the Source Code Form under this License.
+
+3.3. Distribution of a Larger Work
+
+You may create and distribute a Larger Work under terms of Your choice,
+provided that You also comply with the requirements of this License for
+the Covered Software. If the Larger Work is a combination of Covered
+Software with a work governed by one or more Secondary Licenses, and the
+Covered Software is not Incompatible With Secondary Licenses, this
+License permits You to additionally distribute such Covered Software
+under the terms of such Secondary License(s), so that the recipient of
+the Larger Work may, at their option, further distribute the Covered
+Software under the terms of either this License or such Secondary
+License(s).
+
+3.4. Notices
+
+You may not remove or alter the substance of any license notices
+(including copyright notices, patent notices, disclaimers of warranty,
+or limitations of liability) contained within the Source Code Form of
+the Covered Software, except that You may alter any license notices to
+the extent required to remedy known factual inaccuracies.
+
+3.5. Application of Additional Terms
+
+You may choose to offer, and to charge a fee for, warranty, support,
+indemnity or liability obligations to one or more recipients of Covered
+Software. However, You may do so only on Your own behalf, and not on
+behalf of any Contributor. You must make it absolutely clear that any
+such warranty, support, indemnity, or liability obligation is offered by
+You alone, and You hereby agree to indemnify every Contributor for any
+liability incurred by such Contributor as a result of warranty, support,
+indemnity or liability terms You offer. You may include additional
+disclaimers of warranty and limitations of liability specific to any
+jurisdiction.
+
+4. Inability to Comply Due to Statute or Regulation
+---------------------------------------------------
+
+If it is impossible for You to comply with any of the terms of this
+License with respect to some or all of the Covered Software due to
+statute, judicial order, or regulation then You must: (a) comply with
+the terms of this License to the maximum extent possible; and (b)
+describe the limitations and the code they affect. Such description must
+be placed in a text file included with all distributions of the Covered
+Software under this License. Except to the extent prohibited by statute
+or regulation, such description must be sufficiently detailed for a
+recipient of ordinary skill to be able to understand it.
+
+5. Termination
+--------------
+
+5.1. The rights granted under this License will terminate automatically
+if You fail to comply with any of its terms. However, if You become
+compliant, then the rights granted under this License from a particular
+Contributor are reinstated (a) provisionally, unless and until such
+Contributor explicitly and finally terminates Your grants, and (b) on an
+ongoing basis, if such Contributor fails to notify You of the
+non-compliance by some reasonable means prior to 60 days after You have
+come back into compliance. Moreover, Your grants from a particular
+Contributor are reinstated on an ongoing basis if such Contributor
+notifies You of the non-compliance by some reasonable means, this is the
+first time You have received notice of non-compliance with this License
+from such Contributor, and You become compliant prior to 30 days after
+Your receipt of the notice.
+
+5.2. If You initiate litigation against any entity by asserting a patent
+infringement claim (excluding declaratory judgment actions,
+counter-claims, and cross-claims) alleging that a Contributor Version
+directly or indirectly infringes any patent, then the rights granted to
+You by any and all Contributors for the Covered Software under Section
+2.1 of this License shall terminate.
+
+5.3. In the event of termination under Sections 5.1 or 5.2 above, all
+end user license agreements (excluding distributors and resellers) which
+have been validly granted by You or Your distributors under this License
+prior to termination shall survive termination.
+
+************************************************************************
+*                                                                      *
+*  6. Disclaimer of Warranty                                           *
+*  -------------------------                                           *
+*                                                                      *
+*  Covered Software is provided under this License on an "as is"       *
+*  basis, without warranty of any kind, either expressed, implied, or  *
+*  statutory, including, without limitation, warranties that the       *
+*  Covered Software is free of defects, merchantable, fit for a        *
+*  particular purpose or non-infringing. The entire risk as to the     *
+*  quality and performance of the Covered Software is with You.        *
+*  Should any Covered Software prove defective in any respect, You     *
+*  (not any Contributor) assume the cost of any necessary servicing,   *
+*  repair, or correction. This disclaimer of warranty constitutes an   *
+*  essential part of this License. No use of any Covered Software is   *
+*  authorized under this License except under this disclaimer.         *
+*                                                                      *
+************************************************************************
+
+************************************************************************
+*                                                                      *
+*  7. Limitation of Liability                                          *
+*  --------------------------                                          *
+*                                                                      *
+*  Under no circumstances and under no legal theory, whether tort      *
+*  (including negligence), contract, or otherwise, shall any           *
+*  Contributor, or anyone who distributes Covered Software as          *
+*  permitted above, be liable to You for any direct, indirect,         *
+*  special, incidental, or consequential damages of any character      *
+*  including, without limitation, damages for lost profits, loss of    *
+*  goodwill, work stoppage, computer failure or malfunction, or any    *
+*  and all other commercial damages or losses, even if such party      *
+*  shall have been informed of the possibility of such damages. This   *
+*  limitation of liability shall not apply to liability for death or   *
+*  personal injury resulting from such party's negligence to the       *
+*  extent applicable law prohibits such limitation. Some               *
+*  jurisdictions do not allow the exclusion or limitation of           *
+*  incidental or consequential damages, so this exclusion and          *
+*  limitation may not apply to You.                                    *
+*                                                                      *
+************************************************************************
+
+8. Litigation
+-------------
+
+Any litigation relating to this License may be brought only in the
+courts of a jurisdiction where the defendant maintains its principal
+place of business and such litigation shall be governed by laws of that
+jurisdiction, without reference to its conflict-of-law provisions.
+Nothing in this Section shall prevent a party's ability to bring
+cross-claims or counter-claims.
+
+9. Miscellaneous
+----------------
+
+This License represents the complete agreement concerning the subject
+matter hereof. If any provision of this License is held to be
+unenforceable, such provision shall be reformed only to the extent
+necessary to make it enforceable. Any law or regulation which provides
+that the language of a contract shall be construed against the drafter
+shall not be used to construe this License against a Contributor.
+
+10. Versions of the License
+---------------------------
+
+10.1. New Versions
+
+Mozilla Foundation is the license steward. Except as provided in Section
+10.3, no one other than the license steward has the right to modify or
+publish new versions of this License. Each version will be given a
+distinguishing version number.
+
+10.2. Effect of New Versions
+
+You may distribute the Covered Software under the terms of the version
+of the License under which You originally received the Covered Software,
+or under the terms of any subsequent version published by the license
+steward.
+
+10.3. Modified Versions
+
+If you create software not governed by this License, and you want to
+create a new license for such software, you may create and use a
+modified version of this License if you rename the license and remove
+any references to the name of the license steward (except to note that
+such modified license differs from this License).
+
+10.4. Distributing Source Code Form that is Incompatible With Secondary
+Licenses
+
+If You choose to distribute Source Code Form that is Incompatible With
+Secondary Licenses under the terms of this version of the License, the
+notice described in Exhibit B of this License must be attached.
+
+Exhibit A - Source Code Form License Notice
+-------------------------------------------
+
+  This Source Code Form is subject to the terms of the Mozilla Public
+  License, v. 2.0. If a copy of the MPL was not distributed with this
+  file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+If it is not possible or desirable to put the notice in a particular
+file, then You may include the notice in a location (such as a LICENSE
+file in a relevant directory) where a recipient would be likely to look
+for such a notice.
+
+You may add additional accurate notices of copyright ownership.
+
+Exhibit B - "Incompatible With Secondary Licenses" Notice
+---------------------------------------------------------
+
+  This Source Code Form is "Incompatible With Secondary Licenses", as
+  defined by the Mozilla Public License, v. 2.0.
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..be679c5
--- /dev/null
+++ b/README.md
@@ -0,0 +1,23 @@
+# MathCAT4J
+MathCAT is a library for converting mathematics into Braille and speech. The MathCAT4J library is a set of Java bindings for the MathCAT library.
+## Getting MathCAT4J
+MathCAT4J can be found on maven central. The builds on Maven central include binaries for the following platforms:
+* Windows X86
+* Windows X86_64
+* Linux X86_64
+* Linux Arm
+* Linux AArch64
+* MacOSX X86_64
+* MacOSX AArch64
+
+If you need a platform not mentioned above, then you should be able to build it on the appropriate system.
+## Building MathCAT4J
+MathCAT4J uses the Gradle build system and is supplied with the gradlew wrapper scripts. You will need to have a Java Development Kit (JDK) installed. You also will need the rust build tools installed, including the cargo package manager.
+
+Once you have all the build dependencies installed, you can build with a command like:
+
+gradlew clean build
+
+You may publish MathCAT4J into your local maven repository with a command like:
+
+gradlew publishToMavenLocal
diff --git a/mathcat4j-core/src/main/kotlin/onl/mdw/mathcat4j/api/MathCat.kt b/mathcat4j-core/src/main/kotlin/onl/mdw/mathcat4j/api/MathCat.kt
new file mode 100644
index 0000000..e2aaeca
--- /dev/null
+++ b/mathcat4j-core/src/main/kotlin/onl/mdw/mathcat4j/api/MathCat.kt
@@ -0,0 +1,126 @@
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/.
+ *
+ * Copyright 2022 Michael Whapples
+ */
+package onl.mdw.mathcat4j.api
+
+/**
+ * Node based navigation position.
+ *
+ * @param node The node XML.
+ * @param offset The character offset into the node.
+ */
+data class NavigationNode(val node: String, val offset: Int)
+
+/**
+ * Node ID based navigation position.
+ *
+ * @param id the ID of the navigation node.
+ * @param offset the character offset from the node.
+ */
+data class NavigationId(val id: String, val offset: Int)
+
+/**
+ * The MathCAT API.
+ */
+interface MathCat {
+    /**
+     * Get the version of the MathCAT library.
+     *
+     * @return The MathCAT library version
+     */
+    fun getVersion(): String
+    /**
+     * Add an in-memory file for MathCAT rules loading.
+     *
+     * @param path The relative or absolute path of the file.
+     * @param content The string content of the file.
+     */
+    fun addFileString(path: String, content: String)
+    /**
+     * Set the rules directory.
+     *
+     * Like with the MathCAT library, this should be the first function call you make when using the MathCAT library.
+     * @param dir The directory containing the rules files.
+     */
+    fun setRulesDir(dir: String)
+    /**
+     * Get a preference.
+     *
+     * @param name The name of the preference.
+     * @return The value of the preference.
+     */
+    fun getPreference(name: String): String
+    /**
+     * Set a preference.
+     *
+     * @param name The name of the preference.
+     * @param value The value to be set.
+     */
+    fun setPreference(name: String, value: String)
+    /**
+     * Set the MathML content.
+     *
+     * @param mathmlStr The MathML string.
+     * @return The canonical MathML representation with IDs set on elements.
+     */
+    fun setMathml(mathmlStr: String): String
+    /**
+     * Get the Braille representing an element.
+     *
+     * @param navigationId The ID of the element. Setting this to the empty string will get the Braille for the whole MathML.
+     * @return The Braille of the requested element.
+     */
+    fun getBraille(navigationId: String = ""): String
+
+    /**
+     * Get the spoken text for the MathML which was set.
+     *
+     * @return The spoken text for the MathML.
+     */
+    fun getSpokenText(): String
+
+    /**
+     * Get the spoken overview text for the MathML which was set.
+     *
+     * @return The spoken overview text of the MathML.
+     */
+    fun getOverviewText(): String
+
+    /**
+     * Perform navigation by keypress.
+     *
+     * @param key The keycode.
+     * @param shiftKey Whether shift is pressed.
+     * @param controlKey Whether control key is pressed.
+     * @param altKey Whether the alt key is pressed.
+     * @param metaKey Whether the meta key is pressed.
+     * @return The spoken text resulting from the navigation.
+     */
+    fun doNavigateKeypress(key: Int, shiftKey: Boolean, controlKey: Boolean, altKey: Boolean, metaKey: Boolean): String
+
+    /**
+     * Perform navigation based on a command.
+     *
+     * @param command The navigation command.
+     * @return The spoken text resulting from the navigation.
+     */
+    fun doNavigateCommand(command: String): String
+
+    /**
+     * Get the MathML of the current navigation.
+     *
+     * @return The navigation position containing the XML of the node.
+     */
+    fun getNavigationMathml(): NavigationNode
+
+    /**
+     * Get the ID of the current navigation.
+     *
+     * @return The navigation position containing the node ID.
+     */
+    fun getNavigationMathmlId(): NavigationId
+}
\ No newline at end of file
diff --git a/mathcat4j-core/src/main/kotlin/onl/mdw/mathcat4j/api/MathCatJni.kt b/mathcat4j-core/src/main/kotlin/onl/mdw/mathcat4j/api/MathCatJni.kt
new file mode 100644
index 0000000..1e1c27a
--- /dev/null
+++ b/mathcat4j-core/src/main/kotlin/onl/mdw/mathcat4j/api/MathCatJni.kt
@@ -0,0 +1,43 @@
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/.
+ *
+ * Copyright 2022 Michael Whapples
+ */
+package onl.mdw.mathcat4j.api
+
+/**
+ * Java side API for the JNI bindings to MathCAT.
+ *
+ * This exposes the MathCAT functions to JVM based applications. This does not deal with any thread safety or other concerns which will be dealt with by subclasses of this class.
+ */
+abstract class MathCatJni : MathCat {
+    external override fun addFileString(path: String, content: String)
+    external override fun getVersion(): String
+    external override fun setRulesDir(dir: String)
+    external override fun getPreference(name: String): String
+    external override fun setPreference(name: String, value: String)
+    external override fun setMathml(mathmlStr: String): String
+    external override fun getBraille(navigationId: String): String
+    external override fun getSpokenText(): String
+    external override fun getOverviewText(): String
+    external override fun doNavigateKeypress(
+        key: Int,
+        shiftKey: Boolean,
+        controlKey: Boolean,
+        altKey: Boolean,
+        metaKey: Boolean
+    ): String
+
+    external override fun doNavigateCommand(command: String): String
+    external override fun getNavigationMathml(): NavigationNode
+    external override fun getNavigationMathmlId(): NavigationId
+}
+
+/**
+ * Exception to indicate when there is a panic in the rust code.
+ *
+ * If the JNI bindings detect a panic in the MathCAT rust code then an exception of this type will be thrown. In many cases it is said that you should not use panic for control flow, so the main reason for this exception type is to allow JVM code catch the panic and close down the JVM in a controlled way.
+ */
+class PanicException(message: String) : RuntimeException(message)
diff --git a/mathcat4j-core/src/main/kotlin/onl/mdw/mathcat4j/core/MathCatTransactional.kt b/mathcat4j-core/src/main/kotlin/onl/mdw/mathcat4j/core/MathCatTransactional.kt
new file mode 100644
index 0000000..9c9c15e
--- /dev/null
+++ b/mathcat4j-core/src/main/kotlin/onl/mdw/mathcat4j/core/MathCatTransactional.kt
@@ -0,0 +1,26 @@
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/.
+ *
+ * Copyright 2022 Michael Whapples
+ */
+@file:JvmName("MathCatTransactional")
+
+package onl.mdw.mathcat4j.core
+
+import onl.mdw.mathcat4j.api.MathCat
+import onl.mdw.mathcat4j.api.MathCatJni
+
+private object MathCatImpl : MathCatJni() {
+  init {
+    runCatching { System.loadLibrary("mathcat4j") }
+    System.getProperty("onl.mdw.mathcat4j.rulesDir")?.let { setRulesDir(it) }
+  }
+}
+
+fun <T> mathCAT(block: MathCat.() -> T): T = synchronized(MathCatImpl) { MathCatImpl.block() }
+
+fun addFileString(path: String, content: String) = mathCAT { addFileString(path, content) }
+
+fun setRulesDir(dir: String) = mathCAT { setRulesDir(dir) }
diff --git a/mathcat4j-core/src/test/kotlin/onl/mdw/mathcat4j/core/MathCatTest.kt b/mathcat4j-core/src/test/kotlin/onl/mdw/mathcat4j/core/MathCatTest.kt
new file mode 100644
index 0000000..372579f
--- /dev/null
+++ b/mathcat4j-core/src/test/kotlin/onl/mdw/mathcat4j/core/MathCatTest.kt
@@ -0,0 +1,152 @@
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/.
+ *
+ * Copyright 2022 Michael Whapples
+ */
+package onl.mdw.mathcat4j.core
+
+import onl.mdw.mathcat4j.api.NavigationId
+import onl.mdw.mathcat4j.api.NavigationNode
+import java.io.File
+import kotlin.test.BeforeTest
+import kotlin.test.Test
+import kotlin.test.assertContains
+import kotlin.test.assertEquals
+import kotlin.test.assertFailsWith
+
+// Keep the setRulesDir tests separate, we don't need to have setRulesDir called before, and we probably want them separate in the reports as well.
+class MathCatRulesDirTests {
+    @Test
+    fun testExceptionForInvalidRulesDirectory() {
+        val invalidRulesDir = File(System.getProperty("onl.mdw.mathcat4j.testRulesDir"), "invalidDir").absolutePath
+        val exceptionMessage = assertFailsWith(RuntimeException::class) { mathCAT { setRulesDir(invalidRulesDir) } }
+        val expected = "set_rules_dir: could not canonicalize path $invalidRulesDir:"
+        assertContains(exceptionMessage.message ?: "", expected)
+    }
+    @Test
+    fun testSetRulesDirectoryCorrectlyDoesNotExcept() {
+        mathCAT { setRulesDir(System.getProperty("onl.mdw.mathcat4j.testRulesDir")) }
+    }
+}
+
+const val BASIC_MATHML = "<math id=\"n1\"><mrow id=\"n2\"><mi id=\"n3\">y</mi><mo id=\"n4\">=</mo><mrow id=\"r0\"><mi id=\"n5\">x</mi><mo id=\"n6\">+</mo><mn id=\"n7\">2</mn></mrow></mrow></math>"
+
+class MathCatTest {
+    @BeforeTest
+    fun configureRules() {
+        mathCAT { setRulesDir(System.getProperty("onl.mdw.mathcat4j.testRulesDir")) }
+    }
+    @Test
+    fun testGetVersion() {
+        assertEquals(System.getProperty("onl.mdw.mathcat4j.testVersion").takeWhile { it != '-' }, mathCAT { getVersion() })
+    }
+    @Test
+    fun testSetInvalidMathml() {
+        val mathml = "Some random string"
+        assertFailsWith(RuntimeException::class) { mathCAT { setMathml(mathml) } }
+    }
+    @Test
+    fun testReturnsWhenSetValidMathml() {
+        val someMathml = "<math id='mkt-0'><mrow id='mkt-1'><mn id='mkt-2'>1</mn><mo id='mkt-3'>+</mo><mi id='mkt-4'>x</mi></mrow></math>"
+        val expectedMathml = " <math id='mkt-0'>\n" +
+                "  <mrow id='mkt-1'>\n" +
+                "    <mn id='mkt-2'>1</mn>\n" +
+                "    <mo id='mkt-3'>+</mo>\n" +
+                "    <mi id='mkt-4'>x</mi>\n" +
+                "  </mrow>\n" +
+                " </math>\n"
+        assertEquals(expectedMathml, mathCAT { setMathml(someMathml) })
+    }
+    @Test
+    fun testSetAndGetPreference() = mathCAT {
+        assertEquals("100.0", getPreference("Volume"))
+        setPreference("Volume", "50")
+        assertEquals("50", getPreference("Volume"))
+    }
+    @Test
+    fun testGetpreferenceInvalid() {
+        assertFailsWith(RuntimeException::class) { mathCAT { getPreference("SomeRandomInvalidPreference") } }
+    }
+    @Test
+    fun testGetBrailleAll() {
+        val expected = "⠽⠀⠨⠅⠀⠭⠬⠆"
+        mathCAT {
+            setMathml(BASIC_MATHML)
+            assertEquals(expected, getBraille())
+        }
+    }
+    @Test
+    fun testGetBrailleForId() {
+        val expected = "⠽⠀⣨⣅⠀⠭⠬⠆"
+        mathCAT {
+            setMathml(BASIC_MATHML)
+            assertEquals(expected, getBraille("n4"))
+        }
+    }
+    @Test
+    fun testGetSpokenText() {
+        val expected = "y is equal to x plus 2"
+        val actual = mathCAT {
+            setMathml(BASIC_MATHML)
+            getSpokenText()
+        }
+        assertEquals(expected, actual)
+    }
+    @Test
+    fun testGetOverviewText() {
+        val expected = "y is equal to x plus 2"
+        val actual = mathCAT {
+            setMathml(BASIC_MATHML)
+            getOverviewText()
+        }
+        assertEquals(expected, actual)
+    }
+    @Test
+    fun testDoNavigateKeypress() {
+        val expected = "end of math"
+        val actual = mathCAT {
+            setMathml(BASIC_MATHML)
+            doNavigateKeypress(39, altKey = false, controlKey = false, shiftKey = false, metaKey = false)
+        }
+        assertEquals(expected, actual)
+    }
+    @Test
+    fun testDoNavigateCommand() {
+        val expected = "end of math"
+        val actual = mathCAT {
+            setMathml(BASIC_MATHML)
+            doNavigateCommand("MoveNext")
+        }
+        assertEquals(expected, actual)
+    }
+    @Test
+    fun testGetNavigationMathml() {
+        val expected = NavigationNode(" <math id='n1'>\n" +
+                "  <mrow id='n2'>\n" +
+                "    <mi id='n3'>y</mi>\n" +
+                "    <mo id='n4'>=</mo>\n" +
+                "    <mrow id='r0'>\n" +
+                "      <mi id='n5'>x</mi>\n" +
+                "      <mo id='n6'>+</mo>\n" +
+                "      <mn id='n7'>2</mn>\n" +
+                "    </mrow>\n" +
+                "  </mrow>\n" +
+                " </math>\n", 0)
+        val actual = mathCAT {
+            setMathml(BASIC_MATHML)
+            getNavigationMathml()
+        }
+        assertEquals(expected, actual)
+    }
+    @Test
+    fun testGetNavigationMathmlId() {
+        val expected = NavigationId("n1", 0)
+        val actual = mathCAT {
+            setMathml(BASIC_MATHML)
+            getNavigationMathmlId()
+        }
+        assertEquals(expected, actual)
+    }
+}
diff --git a/rust-library/Cargo.toml b/rust-library/Cargo.toml
new file mode 100644
index 0000000..f9107be
--- /dev/null
+++ b/rust-library/Cargo.toml
@@ -0,0 +1,15 @@
+[package]
+name = "mathcat4j"
+version = "0.1.0"
+edition = "2021"
+authors = ["Michael Whapples"]
+
+[lib]
+crate-type = ["cdylib"]
+
+[dependencies]
+jni = "0.19.0"
+mathcat = { path = "../MathCAT" }
+
+[build-dependencies]
+zip = { version = "2.1", default-features = false, features = ["bzip2"] }
diff --git a/rust-library/src/lib.rs b/rust-library/src/lib.rs
new file mode 100644
index 0000000..a99fb51
--- /dev/null
+++ b/rust-library/src/lib.rs
@@ -0,0 +1,324 @@
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/.
+ *
+ * Copyright 2022 Michael Whapples
+ */
+
+use jni::objects::{JObject, JString, JValue};
+use jni::sys::{jboolean, jint, jobject, jstring, JNI_TRUE};
+use jni::JNIEnv;
+use libmathcat::errors::Error;
+use libmathcat::*;
+use std::panic::{self, AssertUnwindSafe};
+
+#[unsafe(no_mangle)]
+pub extern "system" fn Java_onl_mdw_mathcat4j_api_MathCatJni_getVersion(
+    mut env: JNIEnv,
+    _obj: JObject,
+) -> jstring {
+    let result = panic::catch_unwind(AssertUnwindSafe(|| {
+        env.new_string(get_version()).expect("Could not create6 java string").into_raw()
+    }));
+    match result {
+        Ok(s) => s,
+        Err(_) => {
+            let _ = env.throw_new("onl/mdw/mathcat4j/api/PanicException", "Panic in MathCAT");
+            JObject::null().into_raw()
+        }
+    }
+}
+
+#[unsafe(no_mangle)]
+pub extern "system" fn Java_onl_mdw_mathcat4j_api_MathCatJni_setRulesDir(
+    mut env: JNIEnv,
+    _obj: JObject,
+    dir: JString,
+) {
+    let result = panic::catch_unwind(AssertUnwindSafe(|| {
+        let dir = env.get_string(&dir).expect("Could not get string value of dir").into();
+        let _ = set_rules_dir(dir)
+            .or_else(|e| env.throw_new("java/lang/RuntimeException", errors_to_string(&e)));
+        JObject::null().into_raw()
+    }));
+    match result {
+        Ok(s) => s,
+        Err(_) => {
+            let _ = env.throw_new("onl/mdw/mathcat4j/api/PanicException", "Panic in MathCAT");
+            JObject::null().into_raw()
+        }
+    };
+}
+
+#[unsafe(no_mangle)]
+pub extern "system" fn Java_onl_mdw_mathcat4j_api_MathCatJni_addFileString(
+    mut env: JNIEnv,
+    _obj: JObject,
+    path: JString,
+    content: JString,
+) {
+    let result = panic::catch_unwind(AssertUnwindSafe(|| {
+        let path: String = env.get_string(&path).expect("Could not get string for path").into();
+        let content: String = env.get_string(&content).expect("Could not get string for content").into();
+        libmathcat::shim_filesystem::add_in_memory_file(&path, &content);
+        JObject::null().into_raw()
+    }));
+    match result {
+        Ok(s) => s,
+        Err(_) => {
+            let _ = env.throw_new("onl/mdw/mathcat4j/api/PanicException", "Panic in MathCAT");
+            JObject::null().into_raw()
+        }
+    };
+}
+
+#[unsafe(no_mangle)]
+pub extern "system" fn Java_onl_mdw_mathcat4j_api_MathCatJni_setPreference(
+    mut env: JNIEnv,
+    _obj: JObject,
+    name: JString,
+    value: JString,
+) {
+    let result = panic::catch_unwind(AssertUnwindSafe(|| {
+        let name = env.get_string(&name).expect("Could not get string for name").into();
+        let value = env.get_string(&value).expect("Could not get string for value").into();
+        let _ = set_preference(name, value)
+            .or_else(|e| env.throw_new("java/lang/RuntimeException", errors_to_string(&e)));
+        JObject::null().into_raw()
+    }));
+    match result {
+        Ok(s) => s,
+        Err(_) => {
+            let _ = env.throw_new("onl/mdw/mathcat4j/api/PanicException", "Panic in MathCAT");
+            JObject::null().into_raw()
+        }
+    };
+}
+
+#[unsafe(no_mangle)]
+pub extern "system" fn Java_onl_mdw_mathcat4j_api_MathCatJni_getPreference(
+    mut env: JNIEnv,
+    _obj: JObject,
+    name: JString,
+) -> jstring {
+    let result = panic::catch_unwind(AssertUnwindSafe(|| {
+        let name = env.get_string(&name).expect("Could not get string for name").into();
+        let result = get_preference(name);
+        get_string_or_throw(&mut env, result)
+    }));
+    match result {
+        Ok(s) => s,
+        Err(_) => {
+            let _ = env.throw_new("onl/mdw/mathcat4j/api/PanicException", "Panic in MathCAT");
+            JObject::null().into_raw()
+        }
+    }
+}
+
+#[unsafe(no_mangle)]
+pub extern "system" fn Java_onl_mdw_mathcat4j_api_MathCatJni_setMathml(
+    mut env: JNIEnv,
+    _obj: JObject,
+    mathml_str: JString,
+) -> jstring {
+    let result = panic::catch_unwind(AssertUnwindSafe(|| {
+        let mathml_str =
+            env.get_string(&mathml_str).expect("Could not get string value of mathml_str").into();
+        let canonical_mathml_result = set_mathml(mathml_str);
+        get_string_or_throw(&mut env, canonical_mathml_result)
+    }));
+    match result {
+        Ok(s) => s,
+        Err(_) => {
+            let _ = env.throw_new("onl/mdw/mathcat4j/api/PanicException", "Panic in MathCAT");
+            JObject::null().into_raw()
+        }
+    }
+}
+
+#[unsafe(no_mangle)]
+pub extern "system" fn Java_onl_mdw_mathcat4j_api_MathCatJni_getBraille(
+    mut env: JNIEnv,
+    _obj: JObject,
+    navigation_id: JString,
+) -> jstring {
+    let result = panic::catch_unwind(AssertUnwindSafe(|| {
+        let navigation_id = env
+            .get_string(&navigation_id)
+            .expect("Could not get Java String for navigation_id")
+            .into();
+        let braille_result = get_braille(navigation_id);
+        get_string_or_throw(&mut env, braille_result)
+    }));
+    match result {
+        Ok(s) => s,
+        Err(_) => {
+            let _ = env.throw_new("onl/mdw/mathcat4j/api/PanicException", "Panic in MathCAT");
+            JObject::null().into_raw()
+        }
+    }
+}
+
+#[unsafe(no_mangle)]
+pub extern "system" fn Java_onl_mdw_mathcat4j_api_MathCatJni_getSpokenText(
+    mut env: JNIEnv,
+    _obj: JObject,
+) -> jstring {
+    let result = panic::catch_unwind(AssertUnwindSafe(|| {
+        let spoken_result = get_spoken_text();
+        get_string_or_throw(&mut env, spoken_result)
+    }));
+    match result {
+        Ok(s) => s,
+        Err(_) => {
+            let _ = env.throw_new("onl/mdw/mathcat4j/api/PanicException", "Panic in MathCAT");
+            JObject::null().into_raw()
+        }
+    }
+}
+
+#[unsafe(no_mangle)]
+pub extern "system" fn Java_onl_mdw_mathcat4j_api_MathCatJni_getOverviewText(
+    mut env: JNIEnv,
+    _obj: JObject,
+) -> jstring {
+    let result = panic::catch_unwind(AssertUnwindSafe(|| {
+        let overview_result = get_overview_text();
+        get_string_or_throw(&mut env, overview_result)
+    }));
+    match result {
+        Ok(s) => s,
+        Err(_) => {
+            let _ = env.throw_new("onl/mdw/mathcat4j/api/PanicException", "Panic in MathCAT");
+            JObject::null().into_raw()
+        }
+    }
+}
+
+#[unsafe(no_mangle)]
+pub extern "system" fn Java_onl_mdw_mathcat4j_api_MathCatJni_doNavigateKeypress(
+    mut env: JNIEnv,
+    _obj: JObject,
+    key: jint,
+    shift_key: jboolean,
+    control_key: jboolean,
+    alt_key: jboolean,
+    meta_key: jboolean,
+) -> jstring {
+    let result = panic::catch_unwind(AssertUnwindSafe(|| {
+        let result = do_navigate_keypress(
+            key as usize,
+            shift_key == JNI_TRUE,
+            control_key == JNI_TRUE,
+            alt_key == JNI_TRUE,
+            meta_key == JNI_TRUE,
+        );
+        get_string_or_throw(&mut env, result)
+    }));
+    match result {
+        Ok(s) => s,
+        Err(_) => {
+            let _ = env.throw_new("onl/mdw/mathcat4j/api/PanicException", "Panic in MathCAT");
+            JObject::null().into_raw()
+        }
+    }
+}
+
+#[unsafe(no_mangle)]
+pub extern "system" fn Java_onl_mdw_mathcat4j_api_MathCatJni_doNavigateCommand(
+    mut env: JNIEnv,
+    _obj: JObject,
+    command: JString,
+) -> jstring {
+    let result = panic::catch_unwind(AssertUnwindSafe(|| {
+        let command =
+            env.get_string(&command).expect("Could not get Java String for command").into();
+        let result = do_navigate_command(command);
+        get_string_or_throw(&mut env, result)
+    }));
+    match result {
+        Ok(s) => s,
+        Err(_) => {
+            let _ = env.throw_new("onl/mdw/mathcat4j/api/PanicException", "Panic in MathCAT");
+            JObject::null().into_raw()
+        }
+    }
+}
+
+#[unsafe(no_mangle)]
+pub extern "system" fn Java_onl_mdw_mathcat4j_api_MathCatJni_getNavigationMathml(
+    mut env: JNIEnv,
+    _obj: JObject,
+) -> jobject {
+    let result = panic::catch_unwind(AssertUnwindSafe(|| {
+        let result = get_navigation_mathml();
+        get_navigation_position_or_throw(&mut env, "onl/mdw/mathcat4j/api/NavigationNode", result)
+    }));
+    match result {
+        Ok(s) => s,
+        Err(_) => {
+            let _ = env.throw_new("onl/mdw/mathcat4j/api/PanicException", "Panic in MathCAT");
+            JObject::null().into_raw()
+        }
+    }
+}
+
+#[unsafe(no_mangle)]
+pub extern "system" fn Java_onl_mdw_mathcat4j_api_MathCatJni_getNavigationMathmlId(
+    mut env: JNIEnv,
+    _obj: JObject,
+) -> jobject {
+    let result = panic::catch_unwind(AssertUnwindSafe(|| {
+        let result = get_navigation_mathml_id();
+        get_navigation_position_or_throw(&mut env, "onl/mdw/mathcat4j/api/NavigationId", result)
+    }));
+    match result {
+        Ok(s) => s,
+        Err(_) => {
+            let _ = env.throw_new("onl/mdw/mathcat4j/api/PanicException", "Panic in MathCAT");
+            JObject::null().into_raw()
+        }
+    }
+}
+
+fn get_navigation_position_or_throw(
+    env: &mut JNIEnv,
+    cls: &str,
+    result: Result<(String, usize), Error>,
+) -> jobject {
+    let signature = "(Ljava/lang/String;I)V";
+    match result {
+        Ok((id, offset)) => {
+            let id_jobject =
+                JObject::from(env.new_string(id).expect("Unable to create Java string"));
+            let arguments =
+                &[JValue::from(&id_jobject), JValue::from(jint::try_from(offset).unwrap())];
+            env.new_object(cls, signature, arguments)
+                .unwrap_or_else(|_| {
+                    if !env.exception_check().unwrap() {
+                        let _ = env.throw_new(
+                            "java/lang/RuntimeException",
+                            "Unknown error whilst creating object",
+                        );
+                    }
+                    JObject::null()
+                })
+                .into_raw()
+        }
+        Err(e) => {
+            let _ = env.throw_new("java/lang/RuntimeException", errors_to_string(&e));
+            JObject::null().into_raw()
+        }
+    }
+}
+
+fn get_string_or_throw(env: &mut JNIEnv, result: Result<String, Error>) -> jstring {
+    match result {
+        Ok(s) => env.new_string(s).expect("Could not create Java String").into_raw(),
+        Err(e) => {
+            let _ = env.throw_new("java/lang/RuntimeException", errors_to_string(&e));
+            JObject::null().into_raw()
+        }
+    }
+}
