diff --git a/bip/pipelines/struct_FS/FS_proc.py b/bip/pipelines/struct_FS/FS_proc.py
index 28f239647aa790138bdd9e64b793872f780c846d..1a7255808e5da712ad63fbfb6c200e372ec33eab 100755
--- a/bip/pipelines/struct_FS/FS_proc.py
+++ b/bip/pipelines/struct_FS/FS_proc.py
@@ -13,9 +13,8 @@
 import os
 import shutil
 import logging
-import subprocess
 from pipe_tree import In, Out, Ref
-from bip.utils.log_utils import redirect_logging
+from bip.utils.log_utils import redirect_logging, run_command
 
 log = logging.getLogger(__name__)
 
@@ -28,25 +27,24 @@ def run(ctx,
 
     with redirect_logging('FS_proc', outdir=logs_dir):
 
+        # We need to delete the folder because otherwise, FreeSurfer complains
         if os.path.exists(FreeSurfer_dir):
             shutil.rmtree(FreeSurfer_dir)
 
         subjects_dir=os.getcwd()
 
         os.environ["SUBJECTS_DIR"] = subjects_dir + "/" + ctx.subject
-        cmd = 'recon-all -all -s FreeSurfer -i ' + subjects_dir + "/" + T1_unbiased
+        T1_path = subjects_dir + "/" + T1_unbiased
+        T2_path = subjects_dir + "/" + T2_FLAIR_unbiased
+
+        cmd = 'recon-all -all -s FreeSurfer -i ' + T1_path
 
         if os.path.exists(T2_FLAIR_unbiased):
-            cmd += " -FLAIR " + subjects_dir + "/" + T2_FLAIR_unbiased + " -FLAIRpial"
-
-        try:
-            returned_val = subprocess.call(cmd, shell=True)
-            print(returned_val)
-        except Exception as e:
-            print('Command: ' + cmd)
-            print('Exception type: \t' + str(type(e)))
-            print('Exception args: \t' + str(e.args))
-            print('Exception message: \t' + str(e))
+            cmd += " -FLAIR " + T2_path + " -FLAIRpial"
+
+        output = run_command(log, cmd)
+
+        log.info(output)
 
         #ext_wrappers.recon_all(subjects_dir=os.getcwd(),
         #                       directive="all", subjid="FreeSurfer",
diff --git a/bip/pipelines/struct_T1/T1_brain_extract.py b/bip/pipelines/struct_T1/T1_brain_extract.py
index 57d545e0b56a3d0ef557dfdb66fdd8e0a2a3dd92..749e59acb6ca8fa28fc933dbaa64623d4df5df06 100755
--- a/bip/pipelines/struct_T1/T1_brain_extract.py
+++ b/bip/pipelines/struct_T1/T1_brain_extract.py
@@ -15,7 +15,7 @@ import logging
 from shutil import copyfile
 from fsl import wrappers
 from bip.utils.log_utils import redirect_logging, tempdir
-from pipe_tree import In, Out, Ref, update_closure
+from pipe_tree import In, Out, Ref
 
 log = logging.getLogger(__name__)
 
@@ -35,11 +35,12 @@ def run(ctx,
         T1:                      Ref,
         tmp_dir:                 Ref,
         tmp_T1_prefix:           Ref,
-        transform_outputs:       Ref("T1*_to_*")):
+        T1_orig_to_MNI_warp:     Out,
+        T1_orig_ud_to_std_mat:   Out,
+        T1_to_MNI_warp_coef:     Out,
+        T1_to_MNI_warp_jac:      Out):
 
-    with redirect_logging('T1_brain_extract', outdir=logs_dir),\
-         tempdir(tmp_dir),\
-         update_closure(transform_outputs):
+    with redirect_logging('T1_brain_extract', outdir=logs_dir),tempdir(tmp_dir):
 
         T1_tmp_1                  = tmp_dir + '/T1_tmp_1.nii.gz'
         T1_tmp_2                  = tmp_dir + '/T1_tmp_2.nii.gz'
diff --git a/bip/pipelines/struct_T1/T1_fast.py b/bip/pipelines/struct_T1/T1_fast.py
index 2bccfee1d5d2afa75390cfb1a3cdcb0c9cbbb3eb..3dfde59bfceb4a76b62a83f459456139ca3e17bc 100755
--- a/bip/pipelines/struct_T1/T1_fast.py
+++ b/bip/pipelines/struct_T1/T1_fast.py
@@ -13,23 +13,26 @@
 import logging
 from fsl import wrappers
 from bip.utils.log_utils import redirect_logging
-from pipe_tree import In, Out, Ref, update_closure
+from pipe_tree import In, Out, Ref
 
 log = logging.getLogger(__name__)
 
 def run(ctx,
-        T1:                In,
-        T1_brain:          In,
-        logs_dir:          Ref,
-        T1_unbiased:       Out,
-        T1_unbiased_brain: Out,
-        T1_fast_pve_0:     Out,
-        T1_fast_pve_1:     Out,
-        T1_fast_pve_2:     Out,
-        fast_outputs:      Out("T1_fast_*")):
+        T1:                 In,
+        T1_brain:           In,
+        logs_dir:           Ref,
+        T1_fast_dir:        Ref,
+        T1_unbiased:        Out,
+        T1_unbiased_brain:  Out,
+        T1_fast_pve_0:      Out,
+        T1_fast_pve_1:      Out,
+        T1_fast_pve_2:      Out,
+        T1_fast_CSF_mask:   Out,
+        T1_fast_GM_mask:    Out,
+        T1_fast_WM_mask:    Out,
+        T1_fast_brain_bias: Out):
 
-    with redirect_logging('T1_fast', outdir=logs_dir),\
-         update_closure(fast_outputs):
+    with redirect_logging('T1_fast', outdir=logs_dir):
 
         #Run fast
         wrappers.fast(T1_brain, out = T1_fast_dir + '/T1_brain', b=True)
diff --git a/bip/pipelines/struct_T2_FLAIR/T2_FLAIR_brain_extract.py b/bip/pipelines/struct_T2_FLAIR/T2_FLAIR_brain_extract.py
index a9a1aba48c16711523adb85e37c89c6e844c58db..62dda36448c77d1aea894c1560f2d5cec43933f9 100755
--- a/bip/pipelines/struct_T2_FLAIR/T2_FLAIR_brain_extract.py
+++ b/bip/pipelines/struct_T2_FLAIR/T2_FLAIR_brain_extract.py
@@ -13,33 +13,33 @@ import logging
 from shutil import copyfile
 from fsl import wrappers
 from bip.utils.log_utils import redirect_logging, tempdir
-from pipe_tree import In, Out, Ref, update_closure
+from pipe_tree import In, Out, Ref
 
 log = logging.getLogger(__name__)
 
 def run(ctx,
-        T1_brain:                         In,
-        T1_brain_mask:                    In,
-        T1_orig_ud:                       In,
-        T1_orig_ud_to_T1_mat:             In,
-        T1_to_MNI_linear_mat:             In,
-        T1_to_MNI_warp:                   In,
-        T2_FLAIR_orig:                    In,
-        T2_FLAIR_orig_ud:                 In,
-        T2_FLAIR_orig_ud_warp:            In,
-        T2_FLAIR_brain:                   Out,
-        T2_FLAIR_brain_mask:              Out,
-        T2_FLAIR_brain_to_MNI:            Out,
-        T2_FLAIR_to_MNI_linear_mat:       Out,
-        T2_FLAIR_orig_ud_to_T2_FLAIR_mat: Out,
-        T2_FLAIR:                         Ref,
-        logs_dir:                         Ref,
-        tmp_dir:                          Ref,
-        transform_outputs:                Ref("T2_FLAIR*_to_*")):
+        T1_brain:                           In,
+        T1_brain_mask:                      In,
+        T1_orig_ud:                         In,
+        T1_orig_ud_to_T1_mat:               In,
+        T1_to_MNI_linear_mat:               In,
+        T1_to_MNI_warp:                     In,
+        T2_FLAIR_orig:                      In,
+        T2_FLAIR_orig_ud:                   In,
+        T2_FLAIR_orig_ud_warp:              In,
+        T2_FLAIR_brain:                     Out,
+        T2_FLAIR_brain_mask:                Out,
+        T2_FLAIR_brain_to_MNI:              Out,
+        T2_FLAIR_to_MNI_linear_mat:         Out,
+        T2_FLAIR_orig_ud_to_T2_FLAIR_mat:   Out,
+        T2_FLAIR_orig_ud_to_MNI_linear_mat: Out,
+        T2_FLAIR_orig_to_MNI_warp:          Out,
+        T2_FLAIR:                           Ref,
+        logs_dir:                           Ref,
+        tmp_dir:                            Ref):
 
     with redirect_logging('T2_FLAIR_brain_extract', outdir=logs_dir),\
-         tempdir(tmp_dir),\
-         update_closure(transform_outputs):
+         tempdir(tmp_dir):
 
         T2_FLAIR_tmp_1_mat = tmp_dir + '/T2_FLAIR_tmp_1.mat'
         T2_FLAIR_tmp_2_mat = tmp_dir + '/T2_FLAIR_tmp_2.mat'
diff --git a/bip/utils/log_utils.py b/bip/utils/log_utils.py
index adf57f12638303736daf17bfffeceb1f2c3f8081..abcc8700913ce1b0b8fcb39e5caaa8f205e717b6 100755
--- a/bip/utils/log_utils.py
+++ b/bip/utils/log_utils.py
@@ -1,3 +1,14 @@
+#!/usr/bin/env python
+#
+# logs_utils.py - Tools for logging.
+#
+# Author: Paul McCarthy <pauldmccarthy@gmail.com>
+# Author: Fidel Alfaro Almagro <fidel.alfaroalmagro@ndcn.ox.ac.uk>
+# Author: Michiel Cottaar <michiel.cottaar@ndcn.ox.ac.uk>
+#
+# pylint: disable=C0103,E0602,C0114,C0115,C0116,R0913,R0914,R0915
+# pylint: disable=W0613
+#
 import os
 import os.path as op
 import socket
@@ -7,9 +18,25 @@ import logging
 import traceback
 import contextlib
 import functools as ft
+from subprocess import check_output
 from fsl import wrappers
 
 
+def run_command(logger, command):
+    try:
+        logger.info('COMMAND TO RUN: \t' + command.strip())
+        job_output = check_output(command, shell=True).decode('UTF-8')
+        logger.info('COMMAND OUTPUT: \t' + job_output.strip())
+    except Exception as e:
+        logger.error('Exception raised during: \t' + command.strip())
+        logger.error('Exception type: \t' + str(type(e)))
+        logger.error('Exception args: \t' + str(e.args))
+        logger.error('Exception message: \t' + str(e))
+
+        job_output = ""
+    return job_output.strip()
+
+
 def create_formatter():
     """Create a logging.Formatter. """
     return logging.Formatter('%(asctime)s '
@@ -105,12 +132,12 @@ def redirect_logging(name, outdir='.', level=logging.INFO):
 
 
 @contextlib.contextmanager
-def tempdir(dirName):
-    os.makedirs(dirName, exist_ok=True)
-    yield dirName
-    for fileName in os.listdir(dirName):
-        filePath = os.path.join(dirName, fileName)
+def tempdir(dir_name):
+    os.makedirs(dir_name, exist_ok=True)
+    yield dir_name
+    for file_name in os.listdir(dir_name):
+        file_path = os.path.join(dir_name, file_name)
         try:
-            shutil.rmtree(filePath)
+            shutil.rmtree(file_path)
         except OSError:
-            os.remove(filePath)
+            os.remove(file_path)