diff --git a/fsl/utils/filetree/parse.py b/fsl/utils/filetree/parse.py
index 11a8f1f221713b775caf35dfbfae7ba2f65102bb..b2d6c883ab7dcc57c2c5ab8d8411c64e87470f26 100644
--- a/fsl/utils/filetree/parse.py
+++ b/fsl/utils/filetree/parse.py
@@ -38,6 +38,21 @@ def list_all_trees() -> List[str]:
     return trees
 
 
+def check_forbidden_characters(text, characters, text_type):
+    """
+    Checks the text for forbidden characters
+
+    raises ValueError if one is found
+
+    :param text: string with the text
+    :param characters: sequence of forbidden characters
+    :param text_type: type of the text to raise in error message
+    """
+    bad = [character for character in characters if character in text]
+    if len(bad) > 0:
+        raise ValueError('Invalid character(s) "{}" in {}: {}'.format("".join(bad), text_type, text))
+
+
 def read_line(line: str) -> Tuple[int, PurePath, str]:
     """
     Parses line from the tree file
@@ -54,11 +69,14 @@ def read_line(line: str) -> Tuple[int, PurePath, str]:
     match = re.match(r'^(\s*)(\S*)\s*\((\S*)\)\s*$', line)
     if match is not None:
         gr = match.groups()
+        check_forbidden_characters(gr[1], r'<>"/\|?*', 'file or directory name')
+        check_forbidden_characters(gr[2], r'(){}/', 'short name')
         return len(gr[0]), PurePath(gr[1]), gr[2]
     match = re.match(r'^(\s*)(\S*)\s*$', line)
     if match is not None:
         gr = match.groups()
         short_name = gr[1].split('.')[0]
+        check_forbidden_characters(gr[1], r'<>"/\|?*', 'file or directory name')
         return len(gr[0]), PurePath(gr[1]), short_name
     raise ValueError('Unrecognized line %s' % line)
 
@@ -79,6 +97,8 @@ def read_subtree_line(line: str, directory: str) -> Tuple[int, "filetree.FileTre
     if match is None:
         raise ValueError("Sub-tree line could not be parsed: {}".format(line.strip()))
     spaces, type_name, variables_str, short_name = match.groups()
+    check_forbidden_characters(type_name, r'<>:"/\|?*', 'sub-tree name')
+    check_forbidden_characters(short_name, r'(){}/', 'sub-tree name')
 
     variables = {}
     if len(variables_str.strip()) != 0:
diff --git a/fsl/utils/filetree/trees/HCP_Surface.tree b/fsl/utils/filetree/trees/HCP_Surface.tree
index 0d6e025390a7eb71b697e3011d7edea4ecb5693b..9db03d9cc52814ed43b6975128291a0529833946 100644
--- a/fsl/utils/filetree/trees/HCP_Surface.tree
+++ b/fsl/utils/filetree/trees/HCP_Surface.tree
@@ -27,6 +27,6 @@
 {subject}.sulc_MSMAll.{space}.dscalar.nii (sulc_msm_cifti)
 {subject}.thickness_MSMAll.{space}.dscalar.nii (thick_msm_cifti)
 {subject}.curvature_MSMAll.{space}.dscalar.nii (curv_msm_cifti)
-{subject}.BA.32k_fs_LR.dlabel.nii (BA_cifti))
+{subject}.BA.32k_fs_LR.dlabel.nii (BA_cifti)
 {subject}.aparc.32k_fs_LR.dlabel.nii (aparc_cifti)
 {subject}.aparc.a2009s.32k_fs_LR.dlabel.nii (aparc2009_cifti)
diff --git a/fsl/utils/filetree/trees/freesurfer.tree b/fsl/utils/filetree/trees/freesurfer.tree
index 8a20ac2110861bd31205235bfee3ce0715e40240..cd6df40ba0d885b6ecaf2db6d43cdfb7fdf33148 100644
--- a/fsl/utils/filetree/trees/freesurfer.tree
+++ b/fsl/utils/filetree/trees/freesurfer.tree
@@ -67,10 +67,10 @@
         aparc.a2009s+aseg.mgz (aparc_a2009s_aseg)
         aseg.mgz
 
-        label/
+        label
             {hemi}h.aparc.annot (aparc.annot)
 
-        stats/
+        stats
             aseg.stats (aseg_stats)
             wmparc.stats (wmparc_stats)