Index: tests/pybin/tools.py
===================================================================
--- tests/pybin/tools.py	(revision fc01219a39410956c4b371a0fcee6f251cd9b915)
+++ tests/pybin/tools.py	(revision ef56087f86e8dc57d5c12283a20f55074ce00c81)
@@ -322,5 +322,4 @@
 	# tell make about the pipes
 	os.environ["MAKEFLAGS"] = os.environ["MFLAGS"] = " ".join(make_flags)
-	print(os.environ["MFLAGS"])
 
 	# make sure pass the pipes to our children
@@ -328,4 +327,26 @@
 
 	return make_flags
+
+def prep_unlimited_recursive_make():
+	# prep the flags for make
+	make_flags = ["-j"]
+
+	# tell make about the pipes
+	os.environ["MAKEFLAGS"] = os.environ["MFLAGS"] = "-j"
+
+	return make_flags
+
+
+def eval_hardware():
+	# we can create as many things as we want
+	# how much hardware do we have?
+	if settings.distribute:
+		# remote hardware is allowed
+		# how much do we have?
+		ret, jstr = sh("distcc", "-j", output_file=subprocess.PIPE, ignore_dry_run=True)
+		return int(jstr.strip()) if ret == 0 else multiprocessing.cpu_count()
+	else:
+		# remote isn't allowed, use local cpus
+		return multiprocessing.cpu_count()
 
 # count number of jobs to create
@@ -375,16 +396,6 @@
 				sys.exit(1)
 
-			# we can create as many things as we want
-			# how much hardware do we have?
-			if settings.distribute:
-				# remote hardware is allowed
-				# how much do we have?
-				ret, jstr = sh("distcc", "-j", output_file=subprocess.PIPE, ignore_dry_run=True)
-				options.jobs = int(jstr.strip()) if ret == 0 else multiprocessing.cpu_count()
-			else:
-				# remote isn't allowed, use local cpus
-				options.jobs = multiprocessing.cpu_count()
-
-			make_flags = prep_recursive_make(options.jobs)
+			options.jobs = eval_hardware()
+			flags = prep_unlimited_recursive_make()
 
 
@@ -397,11 +408,17 @@
 
 	# Arguments are calling the shots, fake the top level make
-	elif options.jobs:
+	elif options.jobs :
+
 		# make sure we have a valid number of jobs that corresponds to user input
-		if options.jobs <= 0 :
+		if options.jobs < 0 :
 			print('ERROR: Invalid number of jobs', file=sys.stderr)
 			sys.exit(1)
 
 		flags = prep_recursive_make(options.jobs)
+
+	# Arguments are calling the shots, fake the top level make, but 0 is a special case
+	elif options.jobs == 0:
+		options.jobs = eval_hardware()
+		flags = prep_unlimited_recursive_make()
 
 	# No one says to run in parallel, then don't
@@ -412,4 +429,6 @@
 	# Make sure we call make as expected
 	settings.update_make_cmd( flags )
+	print(flags)
+	print(os.environ.get('MAKEFLAGS'))
 
 	# return the job count
Index: tests/test.py
===================================================================
--- tests/test.py	(revision fc01219a39410956c4b371a0fcee6f251cd9b915)
+++ tests/test.py	(revision ef56087f86e8dc57d5c12283a20f55074ce00c81)
@@ -140,5 +140,5 @@
 	parser.add_argument('--regenerate-expected', help='Regenerate the .expect by running the specified tets, can be used with --all option', action='store_true')
 	parser.add_argument('--archive-errors', help='If called with a valid path, on test crashes the test script will copy the core dump and the executable to the specified path.', type=str, default='')
-	parser.add_argument('-j', '--jobs', help='Number of tests to run simultaneously', type=int)
+	parser.add_argument('-j', '--jobs', help='Number of tests to run simultaneously, 0 (default) for unlimited', nargs='?', const=0, type=int)
 	parser.add_argument('--list-comp', help='List all valide arguments', action='store_true')
 	parser.add_argument('--list-dist', help='List all tests for distribution', action='store_true')
