diff --git a/.editorconfig b/.editorconfig
index 83fdd748d..c08e09e6f 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -2,7 +2,7 @@ root = true
 
 [*]
 trim_trailing_whitespace = true
-insert_final_newline = false
+insert_final_newline = true
 
 [*.json, *.js]
 indent_style = space
diff --git a/.gitignore b/.gitignore
index 6b20da91f..6ed774ff3 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,5 @@
 /config/secrets.json
+/coverage/
 /node_modules/
 
 .idea
diff --git a/package.json b/package.json
index 4405ca7be..72350f248 100644
--- a/package.json
+++ b/package.json
@@ -61,9 +61,10 @@
     "build": "run-s build:features build:index",
     "build:features": "node scripts/build_features.js",
     "build:index": "node scripts/build_index.js",
+    "jest": "jest --coverage",
     "lint": "eslint scripts/*.js lib/*.js",
     "logos": "node scripts/build_wikidata",
-    "test": "run-s build:features validate lint build",
+    "test": "run-s lint build jest",
     "validate": "node scripts/validate.js",
     "wikicheck": "node scripts/check_wikiTags.js",
     "wikidata": "node scripts/build_wikidata.js"
@@ -91,8 +92,9 @@
     "geojson-precision": "^1.0.0",
     "geojson-rewind": "^0.3.1",
     "glob": "^7.1.4",
-    "json5": "^2.1.3",
+    "jest": "^26.6.3",
     "json-stringify-pretty-compact": "^2.0.0",
+    "json5": "^2.1.3",
     "jsonschema": "^1.2.5",
     "node-fetch": "^2.2.0",
     "npm-run-all": "^4.0.0",
@@ -119,4 +121,4 @@
       "@babel/preset-react"
     ]
   }
-}
+}
\ No newline at end of file
diff --git a/scripts/validate.js b/scripts/validate.js
deleted file mode 100644
index 275422624..000000000
--- a/scripts/validate.js
+++ /dev/null
@@ -1,26 +0,0 @@
-const featureCollection = require('../dist/featureCollection.json');
-const LocationConflation = require('@ideditor/location-conflation');
-const loco = new LocationConflation(featureCollection);
-
-// validate the config files
-const validate = require('../lib/validate');
-validate(
-  'config/genericWords.json',
-  require('../config/genericWords.json'),
-  require('../schema/genericWords.json')
-);
-validate(
-  'config/replacements.json',
-  require('../config/replacements.json'),
-  require('../schema/replacements.json')
-);
-validate(
-  'config/trees.json',
-  require('../config/trees.json'),
-  require('../schema/trees.json')
-);
-
-// reading a fileTree will also validate its contents
-const fileTree = require('../lib/file_tree');
-let _cache = {};
-fileTree.read(_cache, loco);
\ No newline at end of file
diff --git a/tests/simplify.test.js b/tests/simplify.test.js
new file mode 100644
index 000000000..afe24cc09
--- /dev/null
+++ b/tests/simplify.test.js
@@ -0,0 +1,33 @@
+const simplify = require('../lib/simplify.js');
+
+describe('simplify', () => {
+
+  test('lowercases', () => {
+    expect(simplify('Aldo')).toBe('aldo');
+  });
+
+  test('replaces diacritics', () => {
+    expect(simplify('André')).toBe('andre');
+  });
+
+  test('removes spaces', () => {
+    expect(simplify('Jimmy Choo')).toBe('jimmychoo');
+  });
+
+  test('removes unprintable unicode (like RTL/LTR marks, zero width space, zero width nonjoiner)', () => {
+    expect(simplify('\u200FJim\u200Bmy\u200CChoo\u200E')).toBe('jimmychoo');
+  });
+
+  test('removes punctuation', () => {
+    expect(simplify('K+K Schuh-Center')).toBe('kkschuhcenter');
+  });
+
+  test('replaces & with and', () => {
+    expect(simplify('Johnston & Murphy')).toBe('johnstonandmurphy');
+  });
+
+  test('replaces ß (eszett) with ss', () => {
+    expect(simplify('Beßon')).toBe('besson');
+  });
+
+});
\ No newline at end of file