diff --git a/.editorconfig b/.editorconfig
index f7ea641f38..2e04c11efc 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -7,6 +7,10 @@ trim_trailing_whitespace = true
max_line_length = 120
indent_style = tab
+[*.kt]
+indent_style = space
+indent_size = 4
+
[*.xml]
indent_style = space
indent_size = 2
diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml
index a95768fb54..aa60d1c615 100644
--- a/.idea/codeStyles/Project.xml
+++ b/.idea/codeStyles/Project.xml
@@ -36,6 +36,9 @@
+
+
+
@@ -75,5 +78,8 @@
+
+
+
\ No newline at end of file
diff --git a/util/pom.xml b/util/pom.xml
index 9f66cc6537..236e2afdcd 100644
--- a/util/pom.xml
+++ b/util/pom.xml
@@ -23,6 +23,10 @@
org.slf4j
slf4j-api
+
+ org.jetbrains.kotlin
+ kotlin-stdlib-jdk8
+
org.junit.jupiter
junit-jupiter
diff --git a/util/src/main/java/dev/openrs2/util/StringUtils.java b/util/src/main/java/dev/openrs2/util/StringUtils.java
deleted file mode 100644
index a3913c1c1f..0000000000
--- a/util/src/main/java/dev/openrs2/util/StringUtils.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package dev.openrs2.util;
-
-import com.google.common.base.Preconditions;
-
-public final class StringUtils {
- public static String indefiniteArticle(String str) {
- Preconditions.checkArgument(!str.isEmpty());
-
- var first = Character.toLowerCase(str.charAt(0));
- if (first == 'a' || first == 'e' || first == 'i' || first == 'o' || first == 'u') {
- return "an";
- } else {
- return "a";
- }
- }
-
- public static String capitalize(String str) {
- if (str.isEmpty()) {
- return str;
- }
-
- var first = Character.toUpperCase(str.charAt(0));
- return first + str.substring(1);
- }
-
- private StringUtils() {
- /* empty */
- }
-}
diff --git a/util/src/main/java/dev/openrs2/util/StringUtils.kt b/util/src/main/java/dev/openrs2/util/StringUtils.kt
new file mode 100644
index 0000000000..e9be44a7d8
--- /dev/null
+++ b/util/src/main/java/dev/openrs2/util/StringUtils.kt
@@ -0,0 +1,20 @@
+package dev.openrs2.util
+
+object StringUtils {
+ // TODO(gpe): convert to an extension function
+ @JvmStatic
+ fun indefiniteArticle(str: String): String {
+ require(str.isNotEmpty())
+
+ val first = str.first().toLowerCase()
+ return when (first) {
+ 'a', 'e', 'i', 'o', 'u' -> "an"
+ else -> "a"
+ }
+ }
+
+ @JvmStatic
+ fun capitalize(str: String): String {
+ return str.capitalize()
+ }
+}