diff --git a/wpimath/generate_numbers.py b/wpimath/generate_numbers.py
index 701f3e6..c52ddb4 100644
--- a/wpimath/generate_numbers.py
+++ b/wpimath/generate_numbers.py
@@ -1,5 +1,26 @@
+# Copyright (c) FIRST and other WPILib contributors.
+# Open Source Software; you can modify and/or share it under the terms of
+# the WPILib BSD license file in the root directory of this project.
+
 import os
 import sys
+from jinja2 import Environment, FileSystemLoader
+
+
+def output(outPath, outfn, contents):
+    if not os.path.exists(outPath):
+        os.makedirs(outPath)
+
+    outpathname = f"{outPath}/{outfn}"
+
+    if os.path.exists(outpathname):
+        with open(outpathname, "r") as f:
+            if f.read() == contents:
+                return
+
+    # File either doesn't exist or has different contents
+    with open(outpathname, "w") as f:
+        f.write(contents)
 
 
 def main():
@@ -8,51 +29,21 @@
     dirname, _ = os.path.split(os.path.abspath(__file__))
     cmake_binary_dir = sys.argv[1]
 
-    with open(f"{dirname}/src/generate/GenericNumber.java.in",
-              "r") as templateFile:
-        template = templateFile.read()
-        rootPath = f"{cmake_binary_dir}/generated/main/java/edu/wpi/first/wpiutil/math/numbers"
+    env = Environment(loader=FileSystemLoader(f"{dirname}/src/generate"),
+                      autoescape=False,
+                      keep_trailing_newline=True)
 
-        if not os.path.exists(rootPath):
-            os.makedirs(rootPath)
+    template = env.get_template("GenericNumber.java.jinja")
+    rootPath = f"{cmake_binary_dir}/generated/main/java/edu/wpi/first/math/numbers"
 
-        for i in range(MAX_NUM + 1):
-            new_contents = template.replace("${num}", str(i))
+    for i in range(MAX_NUM + 1):
+        contents = template.render(num=i)
+        output(rootPath, f"N{i}.java", contents)
 
-            if os.path.exists(f"{rootPath}/N{i}.java"):
-                with open(f"{rootPath}/N{i}.java", "r") as f:
-                    if f.read() == new_contents:
-                        continue
-
-            # File either doesn't exist or has different contents
-            with open(f"{rootPath}/N{i}.java", "w") as f:
-                f.write(new_contents)
-
-    with open(f"{dirname}/src/generate/Nat.java.in", "r") as templateFile:
-        template = templateFile.read()
-        outputPath = f"{cmake_binary_dir}/generated/main/java/edu/wpi/first/wpiutil/math/Nat.java"
-        with open(f"{dirname}/src/generate/NatGetter.java.in",
-                  "r") as getterFile:
-            getter = getterFile.read()
-
-        importsString = ""
-
-        for i in range(MAX_NUM + 1):
-            importsString += f"import edu.wpi.first.wpiutil.math.numbers.N{i};\n"
-            template += getter.replace("${num}", str(i))
-
-        template += "}\n"
-
-        template = template.replace('{{REPLACEWITHIMPORTS}}', importsString)
-
-        if os.path.exists(outputPath):
-            with open(outputPath, "r") as f:
-                if f.read() == template:
-                    return 0
-
-        # File either doesn't exist or has different contents
-        with open(outputPath, "w") as f:
-            f.write(template)
+    template = env.get_template("Nat.java.jinja")
+    rootPath = f"{cmake_binary_dir}/generated/main/java/edu/wpi/first/math"
+    contents = template.render(nums=range(MAX_NUM + 1))
+    output(rootPath, "Nat.java", contents)
 
 
 if __name__ == "__main__":
