Index: test/func/ArgsTest.java
===================================================================
--- test/func/ArgsTest.java	(revision 4642)
+++ test/func/ArgsTest.java	(working copy)
@@ -38,7 +38,7 @@
 public class ArgsTest extends Base {
 	@Test
 	public void testHelp() {
-		Outputs outputs = TestUtils.run("--help");
+		Outputs outputs = TestUtils.runAsProcess("--help");
 		outputs.checkOutput("--help=options", "--help=links");
 		outputs.checkNoError();
 		checkNoStdFile();
@@ -46,7 +46,7 @@
 
 	@Test
 	public void testHelpOptions() {
-		Outputs outputs = TestUtils.run("--help=options");
+		Outputs outputs = TestUtils.runAsProcess("--help=options");
 		outputs.checkNoError();
 		outputs.checkOutput("--mapname=name", "--latin1", "--list-styles");
 		checkNoStdFile();
@@ -54,7 +54,7 @@
 
 	@Test
 	public void testHelpUnknown() {
-		Outputs outputs = TestUtils.run("--help=unknown-help-option");
+		Outputs outputs = TestUtils.runAsProcess("--help=unknown-help-option");
 		outputs.checkNoError();
 		outputs.checkOutput("Could not find", "unknown-help-option");
 		checkNoStdFile();
@@ -62,7 +62,7 @@
 
 	@Test
 	public void testListStyles() {
-		Outputs op = TestUtils.run("--style-file=test/resources/teststyles", "--list-styles");
+		Outputs op = TestUtils.runAsProcess("--style-file=test/resources/teststyles", "--list-styles");
 		op.checkNoError();
 		op.checkOutput("empty", "main", "simple", "derived", "2.2: A simple test style");
 		checkNoStdFile();
@@ -70,7 +70,7 @@
 
 	@Test
 	public void testListStylesVerbose() {
-		Outputs op = TestUtils.run("--style-file=test/resources/teststyles",
+		Outputs op = TestUtils.runAsProcess("--style-file=test/resources/teststyles",
 				"--verbose", "--list-styles");
 		op.checkNoError();
 		op.checkOutput("empty", "main", "simple", "derived",
@@ -83,9 +83,9 @@
 		TestUtils.registerFile("osmmap.img");
 		 
 		int pri = 42;
-		Outputs op = TestUtils.run("--draw-priority=" + pri,
+		Outputs op = TestUtils.runAsProcess("--draw-priority=" + pri,
 				Args.TEST_RESOURCE_OSM + "uk-test-1.osm.gz");
-		op.checkNoError();
+		op.checkError("Number of ExitExceptions: 0");
 
 		FileSystem fs = openFs(Args.DEF_MAP_FILENAME);
 		ImgChannel chan = fs.open(Args.DEF_MAP_ID + ".TRE", "r");
@@ -96,7 +96,7 @@
 
 	@Test
 	public void testNoDescription() {
-		Outputs op = TestUtils.run("--description", Args.TEST_RESOURCE_OSM + "uk-test-1.osm.gz");
-		op.checkNoError();
+		Outputs op = TestUtils.runAsProcess("--description", Args.TEST_RESOURCE_OSM + "uk-test-1.osm.gz");
+		op.checkError("Number of ExitExceptions: 0");
 	}
 }
Index: test/func/files/GmapsuppTest.java
===================================================================
--- test/func/files/GmapsuppTest.java	(revision 4642)
+++ test/func/files/GmapsuppTest.java	(working copy)
@@ -401,7 +401,7 @@
 				"--latin1",
 				Args.TEST_RESOURCE_OSM + "uk-test-2.osm.gz");
 
-		Outputs outputs = TestUtils.run(Args.TEST_STYLE_ARG,
+		Outputs outputs = TestUtils.runAsProcess(Args.TEST_STYLE_ARG,
 				"--gmapsupp",
 				"--index",
 
Index: test/func/files/IndexTest.java
===================================================================
--- test/func/files/IndexTest.java	(revision 4642)
+++ test/func/files/IndexTest.java	(working copy)
@@ -36,7 +36,7 @@
 		f.delete();
 		assertFalse("does not pre-exist", f.exists());
 
-		Outputs outputs = TestUtils.run(
+		Outputs outputs = TestUtils.runAsProcess(
 				Args.TEST_STYLE_ARG,
 				"--index",
 				"--latin1",
@@ -45,7 +45,7 @@
 				Args.TEST_RESOURCE_IMG + "63240001.img",
 				Args.TEST_RESOURCE_IMG + "63240002.img"
 		);
-		outputs.checkNoError();
+		outputs.checkError("Number of ExitExceptions: 0");
 
 		TestUtils.registerFile(MDR_IMG);
 		TestUtils.registerFile(OVERVIEW_NAME+".tdb");
Index: test/func/lib/TestUtils.java
===================================================================
--- test/func/lib/TestUtils.java	(revision 4642)
+++ test/func/lib/TestUtils.java	(working copy)
@@ -16,12 +16,16 @@
  */
 package func.lib;
 
+import java.io.BufferedReader;
 import java.io.ByteArrayOutputStream;
 import java.io.Closeable;
 import java.io.File;
 import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStreamReader;
 import java.io.OutputStream;
 import java.io.PrintStream;
+import java.lang.ProcessBuilder.Redirect;
 import java.util.ArrayDeque;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -28,6 +32,7 @@
 import java.util.Collections;
 import java.util.Deque;
 import java.util.List;
+import java.util.concurrent.TimeUnit;
 
 import uk.me.parabola.imgfmt.Utils;
 import uk.me.parabola.mkgmap.general.LevelInfo;
@@ -136,6 +141,52 @@
 	}
 
 	/**
+	 * Run with the given args as a new process.  Some standard arguments are added first.
+	 *
+	 * @param in The arguments to use.
+	 */
+	public static Outputs runAsProcess(String ... in) {
+		List<String> args = new ArrayList<>(Arrays.asList(in));
+		args.add(0, Args.TEST_STYLE_ARG);
+		args.add(0, "dist\\mkgmap.jar");
+		args.add(0, "-jar");
+		args.add(0, "java.exe");
+
+		ProcessBuilder pb = new ProcessBuilder(args);
+		StringBuilder outBuilder = new StringBuilder();
+		StringBuilder errBuilder = new StringBuilder();
+		try {
+			Process process = pb.start();
+			try (BufferedReader errorStream = new BufferedReader(new InputStreamReader(process.getErrorStream()));
+				 BufferedReader outputStream = new BufferedReader(new InputStreamReader(process.getInputStream()))) {
+				while (true) {
+					getStreamOutput(outputStream, outBuilder);
+					getStreamOutput(errorStream, errBuilder);
+					if (process.waitFor(1, TimeUnit.SECONDS)) {
+						getStreamOutput(outputStream, outBuilder);
+						getStreamOutput(errorStream, errBuilder);
+						break;
+					}
+				}
+			}
+		} catch (IOException e) {
+			// do nothing
+		} catch (InterruptedException e) {
+			Thread.currentThread().interrupt();
+		}
+		return new Outputs(outBuilder.toString(), errBuilder.toString());
+	}
+
+	private static void getStreamOutput(BufferedReader stream, StringBuilder stringBuilder) throws IOException {
+		char[] buff = new char[100000];
+		while (stream.ready()) {
+			int count = stream.read(buff);
+			if (count > 0)
+				stringBuilder.append(buff, 0, count);
+		}
+	}
+
+	/**
 	 * Create a rule set out of a string.  The string is processed
 	 * as if it were in a file and the levels spec had been set.
 	 */
