diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 477fcc6251185f0ea048f3015c608c4f935c2c3b..6458ae9769f0a701550abcec6f9e4f0b960939f7 100755
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -113,7 +113,7 @@ func-test-ubuntu:
     - py.test test/test_functional/test_corepers* -vx
     - py.test test/test_functional/test_align-parser.py -vx
     - py.test test/test_functional/test_align.py -vx
-    # - py.test test/test_functional/test_tree* -vx
+    - py.test test/test_functional/test_tree* -vx
     - py.test test/test_functional/test_annote-parser.py -vx
     - py.test test/test_functional/test_annote.py -xv
     - py.test test/test_functional/test_prepare* -vx
diff --git a/PanACoTA/subcommands/tree.py b/PanACoTA/subcommands/tree.py
index 716c233562798df1dc832e7ddbcf28dadd1f7571..b0d24abe17c96296a613a9bdf33340cb34e35cc5 100755
--- a/PanACoTA/subcommands/tree.py
+++ b/PanACoTA/subcommands/tree.py
@@ -167,26 +167,7 @@ def build_parser(parser):
         parser to configure in order to extract command-line arguments
     """
     import argparse
-    import multiprocessing
-
-    def thread_num(param):
-        try:
-            param = int(param)
-        except Exception:
-            msg = "argument --threads threads: invalid int value: {}".format(param)
-            raise argparse.ArgumentTypeError(msg)
-        nb_cpu = multiprocessing.cpu_count()
-        if param > nb_cpu:
-            msg = ("You have {} threads on your computer, you cannot ask for more: "
-                   "invalid value: {}").format(nb_cpu, param)
-            raise argparse.ArgumentTypeError(msg)
-        elif param < 0:
-            msg = ("Please provide a positive number of threads (or 0 for all threads): "
-                   "Invalid value: {}").format(param)
-            raise argparse.ArgumentTypeError(msg)
-        elif param == 0:
-            return nb_cpu
-        return param
+    from PanACoTA import utils_argparse
 
 
     # Create command-line parser for all options and arguments to give
@@ -210,7 +191,7 @@ def build_parser(parser):
                                 "default, no bootstrap is calculated. For IQtree, it "
                                 "will use ultrafast bootstrap (>=1000)."))
 
-    optional.add_argument("--threads", dest="threads", default=1, type=thread_num,
+    optional.add_argument("--threads", dest="threads", default=1, type=utils_argparse.thread_num,
                           help=("add this option if you want to parallelize on several threads. "
                                 "Indicate on how many threads you want to parallelize. "
                                 "By default, it uses 1 thread. Put 0 if you want to use "
diff --git a/test/test_functional/test_tree-parser.py b/test/test_functional/test_tree-parser.py
index f70f2d8b18a39c7459c2a7a8a93c03c930b9dd2c..f598701fabb01ac31dcae3d818923d05e17afe15 100755
--- a/test/test_functional/test_tree-parser.py
+++ b/test/test_functional/test_tree-parser.py
@@ -93,7 +93,7 @@ def test_parser_quicktree_parallel(capsys):
     parser = argparse.ArgumentParser(description="Tree", add_help=False)
     tree.build_parser(parser)
     with pytest.raises(SystemExit):
-        tree.parse(parser, "-a align -s quicktree --threads 5 -o outdir".split())
+        tree.parse(parser, "-a align -s quicktree --threads 2 -o outdir".split())
     _, err = capsys.readouterr()
     assert ("You cannot run quicktree with multiple threads. Choose another software, or remove "
             "the --threads option.") in err
@@ -317,14 +317,16 @@ def test_parser_threads_ok():
     """
     parser = argparse.ArgumentParser(description="Tree", add_help=False)
     tree.build_parser(parser)
-    args = tree.parse(parser, "-a align -o outdir --threads 5".split())
+    import multiprocessing
+    nb = multiprocessing.cpu_count()
+    args = tree.parse(parser, f"-a align -o outdir --threads {nb}".split())
     assert args.alignment == "align"
     assert args.boot is None
     assert args.outdir == "outdir"
     assert args.soft == "iqtree"
     assert args.model == "GTR"
     assert args.write_boot is False
-    assert args.threads == 5
+    assert args.threads == nb
     assert args.verbose == 0
     assert args.quiet == False
 
diff --git a/test/test_functional/test_tree.py b/test/test_functional/test_tree.py
index 6215f493d7c6881ddfe3b90d994b0b3b56bd4004..72758e21825d2d06d3062bd3e2194fea2b0ae976 100755
--- a/test/test_functional/test_tree.py
+++ b/test/test_functional/test_tree.py
@@ -33,7 +33,8 @@ def setup_teardown_module():
     - remove all log files
     - remove directory with generated results
     """
-    os.mkdir(GENEPATH)
+    if not os.path.isdir(GENEPATH):
+        os.mkdir(GENEPATH)
     print("setup")
 
     yield
@@ -50,9 +51,10 @@ def test_main_default(capsys):
     soft = "iqtree"
     model = "GTR"
     threads = 1
+    verbose = 3
 
     cmd = "cmd test_main_default"
-    tree.main(cmd, ALIGNMENT, outdir, soft, model, threads)
+    tree.main(cmd, ALIGNMENT, outdir, soft, model, threads, verbose=verbose)
     # Check output files
     iq_log_file = os.path.join(outdir, "exp_pers4genomes.grp.aln.iqtree_tree.log")
     assert os.path.isfile(iq_log_file)
@@ -73,6 +75,7 @@ def test_main_default(capsys):
     assert os.path.isfile(logs_base + ".err")
     # Check logs
     out, err = capsys.readouterr()
+    print(out)
     assert "Running IQtree..." in out
     assert ("IQtree command: iqtree -s test/data/align/exp_files/exp_pers4genomes.grp.aln "
             "-nt 1 -m GTR    -st DNA -pre test/data/tree/generated_by_func_tests/"
@@ -182,7 +185,7 @@ def test_main_fasttree(capsys):
     threads = 1
     boot = 100
     cmd = "cmd: test_main_fasttree"
-    tree.main(cmd, ALIGNMENT, outdir, soft, model, threads, boot=boot)
+    tree.main(cmd, ALIGNMENT, outdir, soft, model, threads, boot=boot, verbose=2)
     # Check output files
     # fastme logfile
     log_file = os.path.join(outdir, "exp_pers4genomes.grp.aln.fasttree.log")
@@ -201,11 +204,12 @@ def test_main_fasttree(capsys):
     # log files
     logs_base = os.path.join(outdir, "PanACoTA-tree-fasttree.log")
     assert os.path.isfile(logs_base)
-    assert not os.path.isfile(logs_base + ".details")
+    assert os.path.isfile(logs_base + ".details")
     assert not os.path.isfile(logs_base + ".debug")
     assert os.path.isfile(logs_base + ".err")
     # Check logs
     out, err = capsys.readouterr()
+    print(out)
     assert "Running FasttreeMP..." in out
     assert ("Fasttree command: FastTreeMP -nt -gtr -noml -nocat -boot 100 "
             "-log test/data/tree/generated_by_func_tests/exp_pers4genomes.grp.aln.fasttree.log "
@@ -224,7 +228,8 @@ def test_main_iqtree2_newdir(capsys):
     threads = 1
 
     cmd = "cmd test_main_default"
-    tree.main(cmd, ALIGNMENT, outdir, soft, model, threads, boot=1000, write_boot=True)
+    tree.main(cmd, ALIGNMENT, outdir, soft, model, threads, boot=1000, write_boot=True,
+              verbose=2)
     # Check output files
     # Check iqtree logfile
     iq_log_file = os.path.join(outdir, "exp_pers4genomes.grp.aln.iqtree_tree.log")
@@ -254,6 +259,7 @@ def test_main_iqtree2_newdir(capsys):
     logs_base = os.path.join(outdir, "PanACoTA-tree-iqtree2.log")
     assert os.path.isfile(logs_base)
     assert os.path.isfile(logs_base + ".err")
+    assert os.path.isfile(logs_base + ".details")
     # Check logs
     out, err = capsys.readouterr()
     assert "Running IQtree..." in out
@@ -278,7 +284,7 @@ def test_main_from_parse(capsys):
     args.model = "HKY"
     args.write_boot = False
     args.threads = 1
-    args.verbose = 1
+    args.verbose = 2
     args.quiet = False
     args.memory = False
     args.fast = False