diff --git a/fsl/utils/filetree/filetree.py b/fsl/utils/filetree/filetree.py
index e86f93c040c71afa367dcfe63ef2e8f9dd102dba..82fd137e9719ae659c9418aa15c0e1b0650dd00f 100644
--- a/fsl/utils/filetree/filetree.py
+++ b/fsl/utils/filetree/filetree.py
@@ -190,11 +190,14 @@ class FileTree(object):
         Creates a new FileTree with updated variables
 
         :param variables: new values for the variables
-            Setting variables to None will force that variable to be empty (useful for non-optional variables)
+            Setting a variable to None will cause the variable to be unset
         :return: New FileTree with same templates for directory names and filenames, but updated variables
         """
         new_tree = deepcopy(self)
         new_tree.variables.update(variables)
+        for key, value in variables.items():
+            if value is None:
+                del new_tree.variables[key]
         return new_tree
 
     def extract_variables(self, short_name: str, filename: str) -> Dict[str, str]:
diff --git a/tests/test_filetree/test_read.py b/tests/test_filetree/test_read.py
index b27984477218cd69f757199948865c2a06e6f8d1..40ffde22478a500a7df9613690e96552adb27701 100644
--- a/tests/test_filetree/test_read.py
+++ b/tests/test_filetree/test_read.py
@@ -77,8 +77,8 @@ def test_custom_tree():
     assert len(tree.get_all('sub_file', glob_vars='all')) == 2
     assert len(tree.get_all('sub_file')) == 1
     assert len(tree.update(opt=None).get_all('sub_file')) == 1
-    assert len(tree.update(opt=None).get_all('sub_file', glob_vars=['opt'])) == 1
-    assert len(tree.update(opt=None).get_all('sub_file', glob_vars='all')) == 1
+    assert len(tree.update(opt=None).get_all('sub_file', glob_vars=['opt'])) == 2
+    assert len(tree.update(opt=None).get_all('sub_file', glob_vars='all')) == 2
 
     for fn, settings in zip(tree.get_all('sub_file', glob_vars='all'),
                             tree.get_all_vars('sub_file', glob_vars='all')):