Index: src/tests/.in/fmtLines.txt
===================================================================
--- src/tests/.in/fmtLines.txt	(revision b0e5593593d06c06d62641db360f3587561b97a6)
+++ 	(revision )
@@ -1,67 +1,0 @@
-// 
-// Cforall Version 1.0.0 Copyright (C) 2017 University of Waterloo
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-// 
-// fmtLines.cc -- 
-// 
-// Author           : Peter A. Buhr
-// Created On       : Sun Sep 17 21:56:15 2017
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Mon Sep 18 11:35:57 2017
-// Update Count     : 31
-// 
-
-#include <fstream>
-#include <coroutine>
-
-coroutine Format {
-	char ch;											// used for communication
-	int g, b;											// global because used in destructor
-};
-
-void ?{}( Format & fmt ) {
-    resume( fmt );										// start coroutine
-}
-
-void ^?{}( Format & fmt ) {
-    if ( fmt.g != 0 || fmt.b != 0 ) sout | endl;
-}
-
-void main( Format & fmt ) {
-	for ( ;; ) {										// for as many characters
-		for ( fmt.g = 0; fmt.g < 5; fmt.g += 1 ) {		// groups of 5 blocks
-			for ( fmt.b = 0; fmt.b < 4; fmt.b += 1 ) {	// blocks of 4 characters
-				for ( ;; ) {							// for newline characters
-					suspend();
-					if ( fmt.ch != '\n' ) break;		// ignore newline
-				} // for
-				sout | fmt.ch;							// print character
-			} // for
-			sout | "  ";								// print block separator
-		} // for
-		sout | endl;									// print group separator
-	} // for
-} // main
-
-void prt( Format & fmt, char ch ) {
-    fmt.ch = ch;
-    resume( fmt );
-} // prt
-
-int main() {
-	Format fmt;
-	char ch;
-
-	for ( ;; ) {
-		sin | ch;										// read one character
-	  if ( eof( sin ) ) break;							// eof ?
-		prt( fmt, ch );
-	} // for
-} // main
-
-// Local Variables: //
-// tab-width: 4 //
-// compile-command: "cfa fmtLines.c" //
-// End: //
Index: src/tests/Makefile.am
===================================================================
--- src/tests/Makefile.am	(revision b0e5593593d06c06d62641db360f3587561b97a6)
+++ src/tests/Makefile.am	(revision 0ad0c55af834cd60b4644acba851192ddc6839bd)
@@ -20,30 +20,7 @@
 
 if BUILD_CONCURRENCY
-concurrent = yes
-quick_test += coroutine thread monitor
-concurrent_test =		\
-	coroutine		\
-	fmtLines		\
-	pingpong		\
-	prodcons		\
-	thread			\
-	matrixSum		\
-	monitor			\
-	multi-monitor		\
-	boundedBuffer		\
-	preempt			\
-	sched-int-block		\
-	sched-int-disjoint	\
-	sched-int-wait		\
-	sched-ext-barge		\
-	sched-ext-dtor		\
-	sched-ext-else		\
-	sched-ext-parse		\
-	sched-ext-recurse	\
-	sched-ext-statment	\
-	sched-ext-when
+concurrent=
 else
-concurrent=no
-concurrent_test=
+concurrent='-Econcurrent'
 endif
 
@@ -62,5 +39,5 @@
 endif
 
-TEST_FLAGS = $(if $(test), 2> .err/${@}.log, )
+TEST_FLAGS = $(if $(test), 2> $(test), )
 AM_CFLAGS = ${TEST_FLAGS} ${BUILD_FLAGS}
 CC = @CFA_BINDIR@/@CFA_NAME@
@@ -70,17 +47,17 @@
 
 fstream_test_SOURCES = fstream_test.c
-fstream_test_CFLAGS = $(if $(test), 2>> .err/fstream_test.log, ) ${BUILD_FLAGS}
+fstream_test_CFLAGS = $(if $(test), 2>> $(test), ) ${BUILD_FLAGS}
 
 vector_test_SOURCES = vector/vector_int.c vector/array.c vector/vector_test.c
-vector_test_CFLAGS = $(if $(test), 2>> .err/vector_test.log, ) ${BUILD_FLAGS}
+vector_test_CFLAGS = $(if $(test), 2>> $(test), ) ${BUILD_FLAGS}
 
 avl_test_SOURCES = avltree/avl_test.c avltree/avl0.c avltree/avl1.c avltree/avl2.c avltree/avl3.c avltree/avl4.c avltree/avl-private.c
-avl_test_CFLAGS = $(if $(test), 2>> .err/avl_test.log, ) ${BUILD_FLAGS}
+avl_test_CFLAGS = $(if $(test), 2>> $(test), ) ${BUILD_FLAGS}
 
 all-local :
-	@+python test.py --debug=${debug} --concurrent=${concurrent} ${quick_test}
+	@+python test.py --debug=${debug} ${concurrent} ${quick_test}
 
 all-tests :
-	@+python test.py --all --debug=${debug} --concurrent=${concurrent}		# '@' => do not echo command (SILENT), '+' => allows recursive make from within python program
+	@+python test.py --all --debug=${debug} ${concurrent}		# '@' => do not echo command (SILENT), '+' => allows recursive make from within python program
 
 clean-local :
@@ -88,8 +65,8 @@
 
 list :
-	@+python test.py --list --concurrent=${concurrent}
+	@+python test.py --list ${concurrent}
 
 concurrency :
-	@+python test.py --debug=${debug} --concurrent=${concurrent} ${concurrent_test}
+	@+python test.py --debug=${debug} ${concurrent} ${concurrent_test}
 
 .dummy : .dummy.c @CFA_BINDIR@/@CFA_NAME@
Index: src/tests/Makefile.in
===================================================================
--- src/tests/Makefile.in	(revision b0e5593593d06c06d62641db360f3587561b97a6)
+++ src/tests/Makefile.in	(revision 0ad0c55af834cd60b4644acba851192ddc6839bd)
@@ -91,8 +91,7 @@
 build_triplet = @build@
 host_triplet = @host@
-@BUILD_CONCURRENCY_TRUE@am__append_1 = coroutine thread monitor
-@BUILD_DEBUG_FALSE@am__append_2 = -nodebug
-@BUILD_DEBUG_TRUE@@BUILD_RELEASE_FALSE@am__append_3 = -debug
-@BUILD_DEBUG_TRUE@@BUILD_RELEASE_TRUE@am__append_4 = ${DEBUG_FLAGS}
+@BUILD_DEBUG_FALSE@am__append_1 = -nodebug
+@BUILD_DEBUG_TRUE@@BUILD_RELEASE_FALSE@am__append_2 = -debug
+@BUILD_DEBUG_TRUE@@BUILD_RELEASE_TRUE@am__append_3 = ${DEBUG_FLAGS}
 EXTRA_PROGRAMS = fstream_test$(EXEEXT) vector_test$(EXEEXT) \
 	avl_test$(EXEEXT)
@@ -314,45 +313,20 @@
 top_srcdir = @top_srcdir@
 debug = yes
-quick_test = vector_test avl_test operators numericConstants \
-	expression enum array typeof cast dtor-early-exit init_once \
-	attributes $(am__append_1)
-@BUILD_CONCURRENCY_FALSE@concurrent = no
-@BUILD_CONCURRENCY_TRUE@concurrent = yes
-@BUILD_CONCURRENCY_FALSE@concurrent_test = 
-@BUILD_CONCURRENCY_TRUE@concurrent_test = \
-@BUILD_CONCURRENCY_TRUE@	coroutine		\
-@BUILD_CONCURRENCY_TRUE@	fmtLines		\
-@BUILD_CONCURRENCY_TRUE@	pingpong		\
-@BUILD_CONCURRENCY_TRUE@	prodcons		\
-@BUILD_CONCURRENCY_TRUE@	thread			\
-@BUILD_CONCURRENCY_TRUE@	matrixSum		\
-@BUILD_CONCURRENCY_TRUE@	monitor			\
-@BUILD_CONCURRENCY_TRUE@	multi-monitor		\
-@BUILD_CONCURRENCY_TRUE@	boundedBuffer		\
-@BUILD_CONCURRENCY_TRUE@	preempt			\
-@BUILD_CONCURRENCY_TRUE@	sched-int-block		\
-@BUILD_CONCURRENCY_TRUE@	sched-int-disjoint	\
-@BUILD_CONCURRENCY_TRUE@	sched-int-wait		\
-@BUILD_CONCURRENCY_TRUE@	sched-ext-barge		\
-@BUILD_CONCURRENCY_TRUE@	sched-ext-dtor		\
-@BUILD_CONCURRENCY_TRUE@	sched-ext-else		\
-@BUILD_CONCURRENCY_TRUE@	sched-ext-parse		\
-@BUILD_CONCURRENCY_TRUE@	sched-ext-recurse	\
-@BUILD_CONCURRENCY_TRUE@	sched-ext-statment	\
-@BUILD_CONCURRENCY_TRUE@	sched-ext-when
-
+quick_test = vector_test avl_test operators numericConstants expression enum array typeof cast dtor-early-exit init_once attributes
+@BUILD_CONCURRENCY_FALSE@concurrent = '-Econcurrent'
+@BUILD_CONCURRENCY_TRUE@concurrent = 
 
 # applies to both programs
 DEBUG_FLAGS = 
 BUILD_FLAGS = -g -Wall -Wno-unused-function -quiet @CFA_FLAGS@ \
-	$(am__append_2) $(am__append_3) $(am__append_4)
-TEST_FLAGS = $(if $(test), 2> .err/${@}.log, )
+	$(am__append_1) $(am__append_2) $(am__append_3)
+TEST_FLAGS = $(if $(test), 2> $(test), )
 AM_CFLAGS = ${TEST_FLAGS} ${BUILD_FLAGS}
 fstream_test_SOURCES = fstream_test.c
-fstream_test_CFLAGS = $(if $(test), 2>> .err/fstream_test.log, ) ${BUILD_FLAGS}
+fstream_test_CFLAGS = $(if $(test), 2>> $(test), ) ${BUILD_FLAGS}
 vector_test_SOURCES = vector/vector_int.c vector/array.c vector/vector_test.c
-vector_test_CFLAGS = $(if $(test), 2>> .err/vector_test.log, ) ${BUILD_FLAGS}
+vector_test_CFLAGS = $(if $(test), 2>> $(test), ) ${BUILD_FLAGS}
 avl_test_SOURCES = avltree/avl_test.c avltree/avl0.c avltree/avl1.c avltree/avl2.c avltree/avl3.c avltree/avl4.c avltree/avl-private.c
-avl_test_CFLAGS = $(if $(test), 2>> .err/avl_test.log, ) ${BUILD_FLAGS}
+avl_test_CFLAGS = $(if $(test), 2>> $(test), ) ${BUILD_FLAGS}
 all: all-am
 
@@ -833,8 +807,8 @@
 
 all-local :
-	@+python test.py --debug=${debug} --concurrent=${concurrent} ${quick_test}
+	@+python test.py --debug=${debug} ${concurrent} ${quick_test}
 
 all-tests :
-	@+python test.py --all --debug=${debug} --concurrent=${concurrent}		# '@' => do not echo command (SILENT), '+' => allows recursive make from within python program
+	@+python test.py --all --debug=${debug} ${concurrent}		# '@' => do not echo command (SILENT), '+' => allows recursive make from within python program
 
 clean-local :
@@ -842,8 +816,8 @@
 
 list :
-	@+python test.py --list --concurrent=${concurrent}
+	@+python test.py --list ${concurrent}
 
 concurrency :
-	@+python test.py --debug=${debug} --concurrent=${concurrent} ${concurrent_test}
+	@+python test.py --debug=${debug} ${concurrent} ${concurrent_test}
 
 .dummy : .dummy.c @CFA_BINDIR@/@CFA_NAME@
Index: src/tests/coroutine/.in/fmtLines.txt
===================================================================
--- src/tests/coroutine/.in/fmtLines.txt	(revision 0ad0c55af834cd60b4644acba851192ddc6839bd)
+++ src/tests/coroutine/.in/fmtLines.txt	(revision 0ad0c55af834cd60b4644acba851192ddc6839bd)
@@ -0,0 +1,67 @@
+// 
+// Cforall Version 1.0.0 Copyright (C) 2017 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+// 
+// fmtLines.cc -- 
+// 
+// Author           : Peter A. Buhr
+// Created On       : Sun Sep 17 21:56:15 2017
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Mon Sep 18 11:35:57 2017
+// Update Count     : 31
+// 
+
+#include <fstream>
+#include <coroutine>
+
+coroutine Format {
+	char ch;											// used for communication
+	int g, b;											// global because used in destructor
+};
+
+void ?{}( Format & fmt ) {
+    resume( fmt );										// start coroutine
+}
+
+void ^?{}( Format & fmt ) {
+    if ( fmt.g != 0 || fmt.b != 0 ) sout | endl;
+}
+
+void main( Format & fmt ) {
+	for ( ;; ) {										// for as many characters
+		for ( fmt.g = 0; fmt.g < 5; fmt.g += 1 ) {		// groups of 5 blocks
+			for ( fmt.b = 0; fmt.b < 4; fmt.b += 1 ) {	// blocks of 4 characters
+				for ( ;; ) {							// for newline characters
+					suspend();
+					if ( fmt.ch != '\n' ) break;		// ignore newline
+				} // for
+				sout | fmt.ch;							// print character
+			} // for
+			sout | "  ";								// print block separator
+		} // for
+		sout | endl;									// print group separator
+	} // for
+} // main
+
+void prt( Format & fmt, char ch ) {
+    fmt.ch = ch;
+    resume( fmt );
+} // prt
+
+int main() {
+	Format fmt;
+	char ch;
+
+	for ( ;; ) {
+		sin | ch;										// read one character
+	  if ( eof( sin ) ) break;							// eof ?
+		prt( fmt, ch );
+	} // for
+} // main
+
+// Local Variables: //
+// tab-width: 4 //
+// compile-command: "cfa fmtLines.c" //
+// End: //
Index: src/tests/pybin/test_run.py
===================================================================
--- src/tests/pybin/test_run.py	(revision 0ad0c55af834cd60b4644acba851192ddc6839bd)
+++ src/tests/pybin/test_run.py	(revision 0ad0c55af834cd60b4644acba851192ddc6839bd)
@@ -0,0 +1,34 @@
+import os
+
+from pybin.tools import *
+
+
+# Test class that defines what a test is
+class Test:
+	def __init__(self):
+		self.name = ''
+		self.path = ''
+		self.arch = ''
+
+	def toString(self):
+		return "{:25s} ({:5s} {:s})".format( self.name, self.arch if self.arch else "Any", self.target() )
+
+	def prepare(self, dry_run):
+		sh("mkdir -p %s" % os.path.join(self.path, '.err'), dry_run)
+		sh("mkdir -p %s" % os.path.join(self.path, '.out'), dry_run)
+		sh("mkdir -p %s" % os.path.join(self.path, '.in' ), dry_run)
+
+	def expect_file(self):
+		return ("%s/.expect/%s.txt" % (self.path, self.name))
+
+	def error_file(self):
+		return ("%s/.err/%s.log"    % (self.path, self.name))
+
+	def output_file(self):
+		return ("%s/.out/%s.log"    % (self.path, self.name))
+
+	def input_file(self):
+		return ("%s/.in/%s.txt"     % (self.path, self.name))
+
+	def target(self):
+		return os.path.join(self.path, self.name)
Index: src/tests/pybin/tools.py
===================================================================
--- src/tests/pybin/tools.py	(revision b0e5593593d06c06d62641db360f3587561b97a6)
+++ src/tests/pybin/tools.py	(revision 0ad0c55af834cd60b4644acba851192ddc6839bd)
@@ -46,5 +46,5 @@
         os.rename(out_fname, fname)
 
-# helper function to check if a files contains only a spacific string
+# helper function to check if a files contains only a specific string
 def fileContainsOnly(file, text) :
 	with open(file) as f:
@@ -95,2 +95,21 @@
 	# fetch return code and error from the diff command
 	return sh(diff_cmd % (lhs, rhs), dry_run, False)
+
+# parses the Makefile to find the machine type (32-bit / 64-bit)
+def getMachineType():
+	return 'x64'
+	sh('echo "void ?{}(int&a,int b){}int main(){return 0;}" > .dummy.c')
+	ret, out = sh("make .dummy -s", print2stdout=True)
+
+	if ret != 0:
+		print("Failed to identify architecture:")
+		print(out)
+		print("Stopping")
+		rm( (".dummy.c",".dummy") )
+		sys.exit(1)
+
+	_, out = sh("file .dummy", print2stdout=False)
+	rm( (".dummy.c",".dummy") )
+
+	return out
+	return re.search("ELF\s([0-9]+)-bit", out).group(1)
Index: src/tests/test.py
===================================================================
--- src/tests/test.py	(revision b0e5593593d06c06d62641db360f3587561b97a6)
+++ src/tests/test.py	(revision 0ad0c55af834cd60b4644acba851192ddc6839bd)
@@ -7,4 +7,5 @@
 from os.path import isfile, join, splitext
 from pybin.tools import *
+from pybin.test_run import *
 
 import argparse
@@ -19,56 +20,45 @@
 ################################################################################
 
-# Test class that defines what a test is
-class Test:
-    def __init__(self, name, path):
-        self.name, self.path = name, path
-
-class TestResult:
-	SUCCESS = 0
-	FAILURE = 1
-	TIMEOUT = 124
-
-# parses the Makefile to find the machine type (32-bit / 64-bit)
-def getMachineType():
-	sh('echo "void ?{}(int&a,int b){}int main(){return 0;}" > .dummy.c')
-	ret, out = sh("make .dummy -s", print2stdout=True)
-
-	if ret != 0:
-		print("Failed to identify architecture:")
-		print(out)
-		print("Stopping")
-		rm( (".dummy.c",".dummy") )
-		sys.exit(1)
-
-	_, out = sh("file .dummy", print2stdout=False)
-	rm( (".dummy.c",".dummy") )
-
-	return re.search("ELF\s([0-9]+)-bit", out).group(1)
-
-def listTestsFolder(folder) :
-	path = ('./.expect/%s/' % folder) if folder else './.expect/'
-	subpath = "%s/" % folder if folder else ""
+def list_expected():
+	expected = []
+
+	def step(_, dirname, names):
+		for name in names:
+			path = os.path.join(dirname, name)
+
+			match = re.search("(\.[\w\/\-_]*)\/.expect\/([\w\-_]+)(\.[\w\-_]+)?\.txt", path)
+			if match :
+				test = Test()
+				test.name = match.group(2)
+				test.path = match.group(1)
+				test.arch = match.group(3)[1:] if match.group(3) else None
+				expected.append(test)
+
+	# Start the walk
+	os.path.walk('.', step, '')
+
+	return expected
+
+# reads the directory ./.expect and indentifies the tests
+def listTests( includes, excludes ):
+	includes = [os.path.normpath( os.path.join('.',i) ) for i in includes] if includes else None
+	excludes = [os.path.normpath( os.path.join('.',i) ) for i in excludes] if excludes else None
 
 	# tests directly in the .expect folder will always be processed
-	return map(lambda fname: Test(fname, subpath + fname),
-		[splitext(f)[0] for f in listdir( path )
-		if not f.startswith('.') and f.endswith('.txt')
-		])
-
-# reads the directory ./.expect and indentifies the tests
-def listTests( concurrent ):
-	machineType = getMachineType()
-
-	# tests directly in the .expect folder will always be processed
-	generic_list = listTestsFolder( "" )
-
-	# tests in the machineType folder will be ran only for the corresponding compiler
-	typed_list = listTestsFolder( machineType )
-
-	# tests in the concurrent folder will be ran only if concurrency is enabled
-	concurrent_list = listTestsFolder( "concurrent" ) if concurrent else []
-
-	# append both lists to get
-	return generic_list + typed_list + concurrent_list;
+	test_list = list_expected()
+
+	# if we have a limited number of includes, filter by them
+	if includes:
+		test_list = [x for x in test_list if
+			os.path.normpath( x.path ).startswith( tuple(includes) )
+		]
+
+	# # if we have a folders to excludes, filter by them
+	if excludes:
+		test_list = [x for x in test_list if not
+			os.path.normpath( x.path ).startswith( tuple(excludes) )
+		]
+
+	return test_list
 
 # from the found tests, filter all the valid tests/desired tests
@@ -89,5 +79,5 @@
 		# otherwise we only need to validate that all tests are present in the complete list
 		for testname in options.tests:
-			test = [t for t in allTests if t.name == testname]
+			test = [t for t in allTests if os.path.normpath( t.target() ) == os.path.normpath( testname )]
 
 			if len(test) != 0 :
@@ -102,4 +92,9 @@
 
 	return tests
+
+class TestResult:
+	SUCCESS = 0
+	FAILURE = 1
+	TIMEOUT = 124
 
 # parses the option
@@ -108,5 +103,5 @@
 	parser = argparse.ArgumentParser(description='Script which runs cforall tests')
 	parser.add_argument('--debug', help='Run all tests in debug or release', type=yes_no, default='no')
-	parser.add_argument('--concurrent', help='Run concurrent tests', type=yes_no, default='yes')
+	parser.add_argument('--arch', help='Test for specific architecture', type=str, default=getMachineType())
 	parser.add_argument('--dry-run', help='Don\'t run the tests, only output the commands', action='store_true')
 	parser.add_argument('--list', help='List all test available', action='store_true')
@@ -115,4 +110,6 @@
 	parser.add_argument('-j', '--jobs', help='Number of tests to run simultaneously', type=int, default='8')
 	parser.add_argument('--list-comp', help='List all valide arguments', action='store_true')
+	parser.add_argument('-I','--include', help='Directory of test to include, can be used multiple time, All  if omitted', action='append')
+	parser.add_argument('-E','--exclude', help='Directory of test to exclude, can be used multiple time, None if omitted', action='append')
 	parser.add_argument('tests', metavar='test', type=str, nargs='*', help='a list of tests to run')
 
@@ -123,8 +120,9 @@
 	all_tests  = options.all
 	some_tests = len(options.tests) > 0
+	some_dirs  = len(options.include) > 0 if options.include else 0
 
 	# check that exactly one of the booleans is set to true
-	if not sum( (listing, all_tests, some_tests) ) == 1 :
-		print('ERROR: must have option \'--all\', \'--list\' or non-empty test list', file=sys.stderr)
+	if not sum( (listing, all_tests, some_tests, some_dirs) ) > 0 :
+		print('ERROR: must have option \'--all\', \'--list\', \'--include\', \'-I\' or non-empty test list', file=sys.stderr)
 		parser.print_help()
 		sys.exit(1)
@@ -157,14 +155,20 @@
 
 	# find the output file based on the test name and options flag
-	out_file = (".out/%s.log" % test.name) if not generate else (".expect/%s.txt" % test.path)
-	err_file = ".err/%s.log" % test.name
+	out_file = test.output_file() if not generate else test.expect_file()
+	err_file = test.error_file()
+	cmp_file = test.expect_file()
+	in_file  = test.input_file()
+
+	# prepare the proper directories
+	test.prepare( dry_run )
 
 	# remove any outputs from the previous tests to prevent side effects
-	rm( (out_file, err_file, test.name), dry_run )
+	rm( (out_file, err_file, test.target()), dry_run )
 
 	options = "-debug" if debug else "-nodebug"
 
+
 	# build, skipping to next test on error
-	make_ret, _ = sh("""%s test=yes DEBUG_FLAGS="%s" %s 2> %s 1> /dev/null""" % (make_cmd, options, test.name, out_file), dry_run)
+	make_ret, _ = sh("""%s  DEBUG_FLAGS="%s" %s test="%s" 2> %s 1> /dev/null""" % (make_cmd, options, test.target(), err_file, out_file), dry_run)
 
 	retcode = 0
@@ -172,29 +176,28 @@
 
 	# if the make command succeds continue otherwise skip to diff
-	if make_ret == 0 :
+	if make_ret == 0 or dry_run:
 		# fetch optional input
-		stdinput = "< .in/%s.txt" % test.name if isfile(".in/%s.txt" % test.name) else ""
-
-		if fileIsExecutable(test.name) :
+		stdinput = "< %s" % in_file if isfile(in_file) else ""
+
+		if dry_run or fileIsExecutable(test.target()) :
 			# run test
-			retcode, _ = sh("timeout 60 ./%s %s > %s 2>&1" % (test.name, stdinput, out_file), dry_run)
+			retcode, _ = sh("timeout 60 ./%s %s > %s 2>&1" % (test.target(), stdinput, out_file), dry_run)
 		else :
 			# simply cat the result into the output
-			sh("cat %s > %s" % (test.name, out_file), dry_run)
-
-	else :
-		# command failed save the log to less temporary file
+			sh("cat %s > %s" % (test.target(), out_file), dry_run)
+	else:
 		sh("mv %s %s" % (err_file, out_file), dry_run)
+
 
 	if retcode == 0:
 		if generate :
 			# if we are ounly generating the output we still need to check that the test actually exists
-			if not dry_run and fileContainsOnly(out_file, "make: *** No rule to make target `%s'.  Stop." % test.name) :
+			if not dry_run and fileContainsOnly(out_file, "make: *** No rule to make target `%s'.  Stop." % test.target()) :
 				retcode = 1;
-				error = "\t\tNo make target for test %s!" % test.name
+				error = "\t\tNo make target for test %s!" % test.target()
 				sh("rm %s" % out_file, False)
 		else :
 			# fetch return code and error from the diff command
-			retcode, error = diff(".expect/%s.txt" % test.path, ".out/%s.log" % test.name, dry_run)
+			retcode, error = diff(cmp_file, out_file, dry_run)
 
 	else:
@@ -204,5 +207,5 @@
 
 	# clean the executable
-	sh("rm -f %s > /dev/null 2>&1" % test.name, dry_run)
+	sh("rm -f %s > /dev/null 2>&1" % test.target(), dry_run)
 
 	return retcode, error
@@ -245,7 +248,4 @@
 	# clean the sandbox from previous commands
 	sh("%s clean > /dev/null 2>&1" % make_cmd, dry_run)
-
-	# make sure the required folder are present
-	sh('mkdir -p .out .expect .err', dry_run)
 
 	if generate :
@@ -286,8 +286,8 @@
 
 	# fetch the liest of all valid tests
-	allTests = listTests( options.concurrent )
+	allTests = listTests( options.include, options.exclude )
 
 	# if user wants all tests than no other treatement of the test list is required
-	if options.all or options.list or options.list_comp :
+	if options.all or options.list or options.list_comp or options.include :
 		tests = allTests
 
@@ -297,18 +297,19 @@
 
 	# sort the test alphabetically for convenience
-	tests.sort(key=lambda t: t.name)
+	tests.sort(key=lambda t: os.path.join(t.path, t.name))
 
 	# users may want to simply list the tests
 	if options.list_comp :
-		print("-h --help --debug --concurrent --dry-run --list --all --regenerate-expected -j --jobs ", end='')
-		print(" ".join(map(lambda t: "%s" % (t.name), tests)))
+		print("-h --help --debug --dry-run --list --all --regenerate-expected -j --jobs ", end='')
+		print(" ".join(map(lambda t: "%s" % (t.target()), tests)))
 
 	elif options.list :
-		print("\n".join(map(lambda t: "%s (%s)" % (t.name, t.path), tests)))
+		print("Listing for %s:%s"% (options.arch, "debug" if options.debug else "no debug"))
+		print("\n".join(map(lambda t: "%s" % (t.toString()), tests)))
 
 	else :
 		options.jobs, forceJobs = jobCount( options )
 
-		print('Running (%s) on %i cores' % ("debug" if options.debug else "no debug", options.jobs))
+		print('Running (%s:%s) on %i cores' % (options.arch, "debug" if options.debug else "no debug", options.jobs))
 		make_cmd = "make" if forceJobs else ("make -j%i" % options.jobs)
 
