diff --git a/!MkClean,fd7 b/!MkClean,fd7
new file mode 100644
index 0000000000000000000000000000000000000000..96b0353c9211e24fc886311bf57b4733493c1a43
--- /dev/null
+++ b/!MkClean,fd7
@@ -0,0 +1,30 @@
+|
+| Copyright (c) 2013, RISC OS Open Ltd
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+|     * Redistributions of source code must retain the above copyright
+|       notice, this list of conditions and the following disclaimer.
+|     * Redistributions in binary form must reproduce the above copyright
+|       notice, this list of conditions and the following disclaimer in the
+|       documentation and/or other materials provided with the distribution.
+|     * Neither the name of RISC OS Open Ltd nor the names of its contributors
+|       may be used to endorse or promote products derived from this software
+|       without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+| AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+| IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+| ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+| LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+| CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+| SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+| INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+| CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+| ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+| POSSIBILITY OF SUCH DAMAGE.
+|
+Dir <Obey$Dir>
+amu_machine clean
+stripdepnd
diff --git a/!MkRam,fd7 b/!MkRam,fd7
new file mode 100644
index 0000000000000000000000000000000000000000..c6b3b6b5cef81cc9499236824b1fd507522b7c06
--- /dev/null
+++ b/!MkRam,fd7
@@ -0,0 +1,29 @@
+|
+| Copyright (c) 2013, RISC OS Open Ltd
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+|     * Redistributions of source code must retain the above copyright
+|       notice, this list of conditions and the following disclaimer.
+|     * Redistributions in binary form must reproduce the above copyright
+|       notice, this list of conditions and the following disclaimer in the
+|       documentation and/or other materials provided with the distribution.
+|     * Neither the name of RISC OS Open Ltd nor the names of its contributors
+|       may be used to endorse or promote products derived from this software
+|       without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+| AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+| IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+| ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+| LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+| CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+| SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+| INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+| CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+| ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+| POSSIBILITY OF SUCH DAMAGE.
+|
+Dir <Obey$Dir>
+amu_machine standalone THROWBACK=-throwback
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..c6aca9e9c009bf922a5b9bf666f3536c5ebc6d0a
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,11 @@
+/aif/
+/aof/
+/gpa/
+/h/ARJHdr
+/i/
+/linked/
+/Makefile.d
+/o/
+/objs/
+/od/
+/rm/
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
new file mode 100644
index 0000000000000000000000000000000000000000..3db77ff9c40272b9e13f1568ead09fde8d2ae49b
--- /dev/null
+++ b/.gitlab-ci.yml
@@ -0,0 +1,3 @@
+include:
+  - project: 'Support/CI'
+    file: '/SparkARJ.yml'
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..aaab8efb0a5b0eac005f1305afd17cb67bd10b09
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,41 @@
+#
+# Copyright (c) 2023, RISC OS Open Ltd
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above copyright
+#       notice, this list of conditions and the following disclaimer in the
+#       documentation and/or other materials provided with the distribution.
+#     * Neither the name of RISC OS Open Ltd nor the names of its contributors
+#       may be used to endorse or promote products derived from this software
+#       without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+#
+# Makefile for ARJ (SparkFS module)
+#
+
+COMPONENT    = SparkARJ
+TARGET       = ARJ
+OBJS         = arcs arjcat cat convert info \
+               main pack unpack
+LIBS         = ${ASMUTILS} ${SPARKLIB}
+HDRS         =
+CUSTOMRES    = no
+
+include CModule
+
+# Dynamic dependencies:
diff --git a/c/arcs b/c/arcs
index 813b6d01d0db88671b31bb267cb37366dc33cb57..316031b461703075cfa699a3cf3b0598a055cc95 100644
--- a/c/arcs
+++ b/c/arcs
@@ -29,25 +29,23 @@
 #include <string.h>
 #include <ctype.h>
 
-
-#include "h.kernel"
-#include "h.swis"
-
-#include "^.Shared.h.zflex"
-
-#include "$.SparkFS.h.common"
-
-#include "^.Shared.h.sfs"
-#include "^.Shared.h.sarcfs"
-#include "^.Shared.h.zbuffer"
-#include "^.Shared.h.err"
-
-#include "h.convert"
-#include "h.cat"
-#include "h.arcs"
-#include "h.unpack"
-#include "h.pack"
-#include "h.arj"
+#include "kernel.h"
+#include "swis.h"
+
+#include "Interface/SparkFS.h"
+
+#include "SparkLib/zflex.h"
+#include "SparkLib/sfs.h"
+#include "SparkLib/sarcfs.h"
+#include "SparkLib/zbuffer.h"
+#include "SparkLib/err.h"
+
+#include "convert.h"
+#include "cat.h"
+#include "arcs.h"
+#include "unpack.h"
+#include "pack.h"
+#include "arj.h"
 
 
 /*****************************************************************************/
diff --git a/c/arjcat b/c/arjcat
index db6524908abdb90308ffe9f504adcd2c4a3a1936..87d3e448f3a2ab9d4744ebe37ea121b9d4527cb6 100644
--- a/c/arjcat
+++ b/c/arjcat
@@ -30,26 +30,23 @@
 #include <ctype.h>
 #include <time.h>
 
-
-
-#include "h.kernel"
-#include "h.swis"
-
-#include "^.Shared.h.zflex"
-
-#include "$.SparkFS.h.common"
-
-#include "^.Shared.h.sfs"
-#include "^.Shared.h.sarcfs"
-#include "^.Shared.h.zbuffer"
-#include "^.Shared.h.zmsdos"
-#include "^.Shared.h.zfile"
-#include "^.Shared.h.err"
-
-#include "h.arcs"
-#include "h.convert"
-#include "h.arj"
-#include "h.arjint"
+#include "kernel.h"
+#include "swis.h"
+
+#include "Interface/SparkFS.h"
+
+#include "SparkLib/zflex.h"
+#include "SparkLib/sfs.h"
+#include "SparkLib/sarcfs.h"
+#include "SparkLib/zbuffer.h"
+#include "SparkLib/zmsdos.h"
+#include "SparkLib/zfile.h"
+#include "SparkLib/err.h"
+
+#include "arcs.h"
+#include "convert.h"
+#include "arj.h"
+#include "arjint.h"
 
 
 /*****************************************************************************/
diff --git a/c/cat b/c/cat
index 0aa9a2cea0fc37d935b11722c275d5aef95a3044..30cc682f3528cd5b527db2fe0074e62781143cb6 100644
--- a/c/cat
+++ b/c/cat
@@ -30,26 +30,23 @@
 #include <ctype.h>
 #include <time.h>
 
-
-#include "h.kernel"
-#include "h.swis"
-
-#include "^.Shared.h.zflex"
-
-#include "$.SparkFS.h.common"
-
-#include "^.Shared.h.sfs"
-#include "^.Shared.h.sarcfs"
-#include "^.Shared.h.zbuffer"
-#include "^.Shared.h.zmsdos"
-#include "^.Shared.h.zfile"
-#include "^.Shared.h.err"
-
-#include "h.arcs"
-#include "h.convert"
-#include "h.arj"
-
-#include "h.cat"
+#include "kernel.h"
+#include "swis.h"
+
+#include "Interface/SparkFS.h"
+
+#include "SparkLib/zflex.h"
+#include "SparkLib/sfs.h"
+#include "SparkLib/sarcfs.h"
+#include "SparkLib/zbuffer.h"
+#include "SparkLib/zmsdos.h"
+#include "SparkLib/zfile.h"
+#include "SparkLib/err.h"
+
+#include "arcs.h"
+#include "convert.h"
+#include "arj.h"
+#include "cat.h"
 
 
 
diff --git a/c/convert b/c/convert
index 2557be41deed24b4fda23fb98a8c05dc4205da62..245388b4d948c98825b44f8da75271114cfe893c 100644
--- a/c/convert
+++ b/c/convert
@@ -29,27 +29,23 @@
 #include <string.h>
 #include <ctype.h>
 
-
-
-#include "h.kernel"
-#include "h.swis"
-
-#include "^.Shared.h.zflex"
-
-#include "$.SparkFS.h.common"
-
-#include "^.Shared.h.sfs"
-#include "^.Shared.h.zbuffer"
-#include "$.SparkFS.FS.h.RMInfo"
-#include "^.Shared.h.sinterface"
-#include "^.Shared.h.err"
-
-#include "h.arcs"
-#include "h.unpack"
-#include "h.pack"
-#include "h.cat"
-
-#include "h.convert"
+#include "kernel.h"
+#include "swis.h"
+
+#include "AsmUtils/rminfo.h"
+#include "Interface/SparkFS.h"
+
+#include "SparkLib/zflex.h"
+#include "SparkLib/sfs.h"
+#include "SparkLib/zbuffer.h"
+#include "SparkLib/sinterface.h"
+#include "SparkLib/err.h"
+
+#include "arcs.h"
+#include "unpack.h"
+#include "pack.h"
+#include "cat.h"
+#include "convert.h"
 
 
 
diff --git a/c/main b/c/main
index 2242da53982c1533c093c240a98b94bde6a4d3fd..57d11a23967e6c48e8c92caf967576064e4adf1a 100644
--- a/c/main
+++ b/c/main
@@ -32,28 +32,21 @@
 #include <time.h>
 #include <locale.h>
 
+#include "kernel.h"
+#include "swis.h"
 
+#include "Interface/SparkFS.h"
 
-#include "h.kernel"
-#include "h.swis"
+#include "SparkLib/zflex.h"
+#include "SparkLib/sfs.h"
+#include "SparkLib/zbuffer.h"
+#include "SparkLib/sinterface.h"
+#include "SparkLib/err.h"
 
-#include "^.Shared.h.zflex"
-
-#include "$.SparkFS.h.common"
-
-#include "^.Shared.h.sfs"
-#include "^.Shared.h.zbuffer"
-
-#include "^.Shared.h.sinterface"
-
-#include "^.Shared.h.err"
-
-#include "h.arcs"
-#include "h.cat"
-
-#include "h.convert"
-
-#include "h.main"
+#include "arcs.h"
+#include "cat.h"
+#include "convert.h"
+#include "main.h"
 
 
 
diff --git a/c/pack b/c/pack
index eba0e2233bec7a5f1ccd958423ce4db24496f420..403e55abb1c3aee4817033918358191d9a381c2a 100644
--- a/c/pack
+++ b/c/pack
@@ -29,25 +29,21 @@
 #include <string.h>
 #include <ctype.h>
 
+#include "kernel.h"
+#include "swis.h"
 
+#include "Interface/SparkFS.h"
 
-#include "h.kernel"
-#include "h.swis"
+#include "SparkLib/zflex.h"
+#include "SparkLib/zbuffer.h"
+#include "SparkLib/sfs.h"
+#include "SparkLib/err.h"
 
-#include "^.Shared.h.zflex"
-
-#include "$.SparkFS.h.common"
-
-#include "^.Shared.h.zbuffer"
-#include "^.Shared.h.sfs"
-
-#include "^.Shared.h.err"
-
-#include "h.convert"
-#include "h.cat"
-#include "h.arcs"
-#include "h.unpack"
-#include "h.pack"
+#include "convert.h"
+#include "cat.h"
+#include "arcs.h"
+#include "unpack.h"
+#include "pack.h"
 
 
 
diff --git a/c/unpack b/c/unpack
index 923aa5a7042ed45454bf613fbc0afc3e31f1f9a3..687db641e42f2ba56fa0945ef60d18a91e05cd94 100644
--- a/c/unpack
+++ b/c/unpack
@@ -29,27 +29,24 @@
 #include <string.h>
 #include <ctype.h>
 
-
-#include "h.kernel"
-#include "h.swis"
-
-#include "^.Shared.h.zflex"
-
-#include "$.SparkFS.h.common"
-
-#include "^.Shared.h.sfs"
-#include "^.Shared.h.zbuffer"
-#include "^.Shared.h.zmsdos"
-#include "^.Shared.h.zfile"
-#include "^.Shared.h.err"
-
-#include "h.convert"
-#include "h.cat"
-#include "h.arcs"
-#include "h.arj"
-#include "h.arjint"
-
-#include "h.unpack"
+#include "kernel.h"
+#include "swis.h"
+
+#include "Interface/SparkFS.h"
+
+#include "SparkLib/zflex.h"
+#include "SparkLib/sfs.h"
+#include "SparkLib/zbuffer.h"
+#include "SparkLib/zmsdos.h"
+#include "SparkLib/zfile.h"
+#include "SparkLib/err.h"
+
+#include "convert.h"
+#include "cat.h"
+#include "arcs.h"
+#include "arj.h"
+#include "arjint.h"
+#include "unpack.h"
 
 
 
diff --git a/cmhg/ARJHdr b/cmhg/ARJHdr
index 92a012d7012cb58aed60af5f524041f3ea542b8e..0233b7cd979db80e130ffe217bccb35cbbee772d 100644
--- a/cmhg/ARJHdr
+++ b/cmhg/ARJHdr
@@ -23,11 +23,12 @@
 ;
 ;->cmhg.ARJ
 ;
+#include "VersionNum"
 
 initialisation-code: ARJ_initialise
 
 ; service-call-handler: ARJ_service
 
-title-string: ARJ
-
-help-string: ARJ 1.50
+title-string:        ARJ
+date-string:         Module_Date_CMHG
+help-string:         ARJ Module_MajorVersion_CMHG Module_MinorVersion_CMHG