diff --git a/bin/fsl_sub b/bin/fsl_sub
new file mode 100755
index 0000000000000000000000000000000000000000..e99349488d4ed8c1324a80ebaeb382207ffcab25
--- /dev/null
+++ b/bin/fsl_sub
@@ -0,0 +1,483 @@
+#!/bin/bash
+
+# Copyright (C) 2007-2017 University of Oxford
+# Authors: Dave Flitney, Stephen Smith, Matthew Webster and Duncan Mortimer
+
+# SHCOPYRIGHT
+export LC_ALL=C
+
+###########################################################################
+# Edit this file in order to setup FSL to use your local compute
+# cluster.
+###########################################################################
+set +o errexit
+
+###########################################################################
+# The following section determines what to do when fsl_sub is called
+# by an FSL program. If SGE_ROOT is set it will attempt to pass the
+# commands onto the cluster, otherwise it will run the commands
+# itself. There are two values for the METHOD variable, "SGE" and
+# "NONE". Note that a user can unset SGE_ROOT if they don't want the
+# cluster to be used.
+###########################################################################
+METHOD=SGE
+unset module
+if [[ "x$SGE_ROOT" = "x" ]] ; then
+  METHOD=NONE
+else
+  QCONF=$(which qconf)
+  if [[ "x$QCONF" = "x" ]]; then
+    METHOD=NONE
+    echo "Warning: SGE_ROOT environment variable is set but Grid Engine software not found, will run locally" >&2
+  fi
+fi
+
+# stop submitted scripts from submitting jobs themselves
+if [[ "X$FSLSUBALREADYRUN" = "Xtrue" ]] ; then
+  METHOD=NONE
+  echo "Warning: job on queue attempted to submit parallel jobs - running jobs serially instead" >&2
+fi
+
+if [[ "X$METHOD" = "XNONE" ]]; then
+  QCONF=echo
+fi
+FSLSUBALREADYRUN=true
+export FSLSUBALREADYRUN
+
+###########################################################################
+# The following auto-decides what cluster queue to use. The calling
+# FSL program will probably use the -T option when calling fsl_sub,
+# which tells fsl_sub how long (in minutes) the process is expected to
+# take (in the case of the -t option, how long each line in the
+# supplied file is expected to take). You need to setup the following
+# list to map ranges of timings into your cluster queues - it doesn't
+# matter how many you setup, that's up to you.
+###########################################################################
+
+map_qname ()
+{
+  if [[ "$1" -le 20 ]] ; then
+    queue=veryshort.q
+  elif [[ "$1" -le 120 ]] ; then
+    queue=short.q
+  elif [[ "$1" -le 1440 ]] ; then
+    queue=long.q
+  else
+    queue=verylong.q
+  fi
+  queueCmd=" -q $queue "
+
+  #echo "Estimated time was $1 mins: queue name is $queue"
+}
+
+###########################################################################
+# Don't change the following (but keep scrolling down!)
+###########################################################################
+
+if [[ ! -z "${POSIXLY_CORRECT}" ]]; then
+  OLD_POSIXLY_CORRECT=${POSIXLY_CORRECT}
+fi
+
+POSIXLY_CORRECT=1
+export POSIXLY_CORRECT
+command=$(basename "$0")
+
+usage ()
+{
+  cat <<EOF
+
+$command V1.1 - wrapper for job control system such as SGE
+
+Usage: $command [options] <command>
+
+$command gzip *.img *.hdr
+$command -q short.q gzip *.img *.hdr
+$command -a darwin regscript rawdata outputdir ...
+
+  -T <minutes>          Estimated job length in minutes, used to auto-set queue name
+  -q <queuename>        Possible values for <queuename> are "verylong.q", "long.q"
+                        and "short.q". See below for details
+                        Default is "long.q".
+  -a <arch-name>        Architecture [e.g., darwin or lx24-amd64]
+  -p <job-priority>     Lower priority [0:-1024] default = 0
+  -M <email-address>    Who to email, default = $(whoami)@$(hostname -f | cut -d . -f 2-)
+  -j <jid>              Place a hold on this task until job jid has completed
+  -t <filename>         Specify a task file of commands to execute in parallel
+  -N <jobname>          Specify jobname as it will appear on queue
+  -R <RAM>              Max total RAM to use for job (integer in MB)
+  -l <logdirname>       Where to output logfiles
+  -m <mailoptions>      Change the SGE mail options, see qsub for details
+  -z <output>           If <output> image or file already exists, do nothing and exit
+  -F                    Use flags embedded in scripts to set SGE queuing options
+  -s <pename>,<threads> Submit a multi-threaded task - requires a PE (<pename>) to be
+                        configured for the requested queues.
+                        <threads> specifies the number of threads to run
+  -v                    Verbose mode.
+
+Queues:
+
+There are several batch queues configured on the cluster, each with defined CPU
+time limits. All queues, except bigmem.q, have a 8GB memory limit.
+
+veryshort.q:This queue is for jobs which last under 30mins.
+short.q:    This queue is for jobs which last up to 4h.
+long.q:     This queue is for jobs which last less than 24h. Jobs run with a
+            nice value of 10.
+verylong.q: This queue is for jobs which will take longer than 24h CPU time.
+            There is one slot per node, and jobs on this queue have a nice value
+            of 15.
+bigmem.q:   This queue is like the verylong.q but has no memory limits.
+
+EOF
+
+  exit 1
+}
+
+nargs=$#
+if [[ "$nargs" -eq 0 ]] ; then
+  usage
+fi
+
+#if the newer whitespace-safe getopt format is available, use it
+if [[ $(getopt -T >/dev/null 2>&1; echo $?) == 4 ]]; then
+  eval set -- $(getopt -s bash T:q:a:p:M:j:t:z:N:R:Fvm:l:s: "$@")
+  result=$?
+else
+  set -- $(getopt T:q:a:p:M:j:t:z:N:R:Fvm:l:s: "$@")
+  result=$?
+fi
+if [[ "$result" != 0 ]] ; then
+  echo "What? Your arguments make no sense!"
+fi
+
+if [[ "$nargs" -eq 0 ]] || [[ $result != 0 ]] ; then
+  usage
+fi
+
+if [[ -z "${OLD_POSIXLY_CORRECT}" ]]; then
+  unset POSIXLY_CORRECT
+else
+  POSIXLY_CORRECT=${OLD_POSIXLY_CORRECT}
+  export POSIXLY_CORRECT
+fi
+
+###########################################################################
+# If you have a Parallel Environment configured for OpenMP tasks then
+# the variable omp_pe should be set to the name you have defined for that
+# PE. The script will work out which queues have that PE setup on them.
+# Note, we support openmp tasks even when Grid Engine is not in use.
+###########################################################################
+
+omp_pe='openmp'
+
+
+###########################################################################
+# If you wish to disable processor affinities under Grid Engine then
+# comment the following line.
+# This instructs Grid Engine to bind the task to the number of job slots
+# allocated to the job (or PE)
+###########################################################################
+proc_affinities="-binding linear:slots"
+
+
+###########################################################################
+# The following sets up the default queue name, which you may want to
+# change. It also sets up the basic emailing control.
+###########################################################################
+
+queue=long.q
+queueCmd=" -q long.q "
+mailto=$(whoami)@$(hostname -f | cut -d . -f 2-)
+MailOpts="a"
+
+
+###########################################################################
+# In the following, you might want to change the behaviour of some
+# flags so that they prepare the right arguments for the actual
+# cluster queue submission program, in our case "qsub".
+#
+# -a sets is the cluster submission flag for controlling the required
+# hardware architecture (normally not set by the calling program)
+#
+# -p set the priority of the job - ignore this if your cluster
+# environment doesn't have priority control in this way.
+#
+# -j tells the cluster not to start this job until cluster job ID $jid
+# has completed. You will need this feature.
+#
+# -t will pass on to the cluster software the name of a text file
+# containing a set of commands to run in parallel; one command per
+# line.
+#
+# -N option determines what the command will be called when you list
+# running processes.
+#
+# -l tells the cluster what to call the standard output and standard
+# -error logfiles for the submitted program.
+###########################################################################
+
+if [[ -z "$FSLSUBVERBOSE" ]] ; then
+  verbose=0
+else
+  verbose=$FSLSUBVERBOSE;
+  echo "METHOD=$METHOD : args=$*" >&2
+fi
+
+scriptmode=0
+
+while [[ "$1" != -- ]] ; do
+  case "$1" in
+    -z)
+      if [[ -e "$2" || $("${FSLDIR}/bin/imtest" "$2") = 1 ]] ; then
+        exit 0
+      fi
+      shift;;
+    -T)
+      map_qname "$2"
+      shift;;
+    -q)
+      queue="$2"
+      queueCmd=" -q $queue "
+      "$QCONF" -sq "$queue" >/dev/null 2>&1
+      if [[ $? -eq 1 ]]; then
+        echo "Invalid queue specified!"
+        exit 127
+      fi
+      shift;;
+    -a)
+      acceptable_arch=no
+      available_archs=$(qhost | tail -n +4 | awk '{print $2}' | sort | uniq)
+      for a in $available_archs; do
+        if [[ "$2" = "$a" ]] ; then
+          acceptable_arch="yes"
+        fi
+      done
+      if [[ "$acceptable_arch" = "yes" ]]; then
+        sge_arch="-l arch=$2"
+      else
+        echo "Sorry arch of $2 is not supported on this SGE configuration!"
+        echo "Should be one of: $available_archs"
+        exit 127
+      fi
+      shift;;
+    -p)
+      # Not implmented
+      shift;;
+    -M)
+      mailto=$2
+      shift;;
+    -j)
+      jid=$2
+      sge_hold="-hold_jid $jid"
+      shift;;
+    -t)
+      taskfile=$2
+      if [[ -f "$taskfile" ]] ; then
+        tasks=$(wc -l "$taskfile" | awk '{print $1}')
+        if [[ "$tasks" -ne 0 ]]; then
+        	sge_tasks="-t 1-$tasks"
+        else
+          echo "Task file ${taskfile} is empty"
+          echo "Should be a text file listing all the commands to run!"
+          exit -1
+        fi
+      else
+        echo "Task file (${taskfile}) does not exist"
+        exit -1
+      fi
+      shift;;
+    -N)
+      JobName=$2;
+      shift;;
+    -R)
+      RAM="-l mem_free=${2}M"
+      shift;;
+    -m)
+      MailOpts=$2;
+      shift;;
+    -l)
+      LogOpts="-o $2 -e $2";
+      LogDir="${2}/";
+      if [[ ! -e "${2}" ]]; then
+        mkdir -p "$2"
+      else
+        echo "${2}" | grep '/dev/null' >/dev/null 2>&1
+        if [[ $? -eq 1 ]] && [[ -f "${2}" ]]; then
+            echo "Log destination is a file (should be a folder)"
+            exit -1
+        fi
+      fi
+      shift;;
+    -F)
+      scriptmode=1;
+      ;;
+    -v)
+      verbose=1
+      ;;
+    -s)
+      pe_string=$2;
+      peName=$(echo "$pe_string" | cut -d',' -f 1)
+      peThreads=$(echo "$pe_string" | cut -d',' -f 2)
+      shift;;
+  esac
+  shift  # next flag
+done
+shift
+
+###########################################################################
+# Don't change the following (but keep scrolling down!)
+###########################################################################
+commandline=("$@")
+command="${commandline[0]}"
+
+if [[ -z "$taskfile" ]] && [[ -z "$command" ]]; then
+  echo "Either supply a command to run or a parallel task file"
+  exit -1
+fi
+
+if [[ -z "$taskfile" ]] && [[ ! -x "$command" ]]; then
+  which "$command" >/dev/null 2>&1
+  if [[ $? -ne 0 ]]; then
+    echo "The command you have requested cannot be found or is not executable"
+    exit -1
+  fi
+fi
+
+if [[ "x$JobName" = x ]] ; then
+  if [[ "x$taskfile" != x ]] ; then
+    JobName=$(basename "$taskfile")
+  else
+    JobName=$(basename "$command")
+  fi
+fi
+
+if [[ -n "$tasks" ]] && [[ -n "${commandline[*]}" ]] ; then
+  echo "Spurious input after parsing command line: \"${commandline[*]}\"!"
+  echo "You appear to have specified both a task file and a command to run"
+  exit -1
+fi
+
+if [[ -n "$peName" ]]; then
+  # If the PE name is 'openmp' then limit the number of threads to those specified
+  if [[ "X$peName" = "X$omp_pe" ]]; then
+    OMP_NUM_THREADS=$peThreads
+    export OMP_NUM_THREADS
+  fi
+fi
+
+case "$METHOD" in
+
+###########################################################################
+# The following is the main call to the cluster, using the "qsub" SGE
+# program. If $tasks has not been set then qsub is running a single
+# command, otherwise qsub is processing a text file of parallel
+# commands.
+###########################################################################
+
+  SGE)
+       ###########################################################################
+       # Test Parallel environment options
+       ###########################################################################
+    if [[ -n "$peName" ]]; then
+      # Is this a configured PE?
+
+      "$QCONF" -sp "$peName" >/dev/null 2>&1
+
+      if [[ $? -eq 1 ]]; then
+        echo "${commandline[*]}"
+        echo "$peName is not a valid PE"
+        exit -1
+      fi
+
+      # Get a list of queues configured for this PE and confirm that the queue
+      # we have submitted to has that PE set up.
+      qstat -g c -pe "$peName" >/dev/null 2>&1
+      if [[ $? -eq 1 ]]; then
+        echo "No parallel environments configured!"
+        exit -1
+      fi
+
+      qstat -g c -pe "$peName" | sed '1,2d' | awk '{ print $1 }' | grep "^$queue" >/dev/null 2>&1
+
+      if [[ $? -eq 1 ]]; then
+        echo "${commandline[*]}"
+        echo "PE $peName is not configured on $queue"
+        exit -1
+      fi
+
+      # The -w e option will result in the job failing if there are insufficient slots
+      # on any of the cluster nodes
+      pe_options="-pe $peName $peThreads -w e"
+    fi
+
+    if [[ -z "$tasks" ]] ; then
+        if [[ "$scriptmode" -ne 1 ]] ; then
+          sge_command=(qsub -V -cwd -shell n -b y -r y $queueCmd $proc_affinities $pe_options -M $mailto -N "$JobName" -m $MailOpts $LogOpts $sge_arch $RAM $sge_hold)
+        else
+          sge_command=(qsub $proc_affinities $LogOpts $sge_arch $sge_hold)
+        fi
+        if [[ "$verbose" -eq 1 ]] ; then
+          echo "sge_command: ${sge_command[*]}" >&2
+          echo "executing: ${commandline[*]}" >&2
+        fi
+        exec "${sge_command[@]}" "${commandline[@]}" | awk '{print $3}'
+    else
+        sge_command=(qsub -V -cwd $queueCmd $proc_affinities $pe_options -M $mailto -N "$JobName" -m $MailOpts $LogOpts $sge_arch $RAM $sge_hold $sge_tasks)
+        if [[ "$verbose" -eq 1 ]] ; then
+          echo "sge_command: ${sge_command[*]}" >&2
+          echo "control file: $taskfile" >&2
+        fi
+        exec "${sge_command[@]}" <<EOF | awk '{print $3}' | awk -F. '{print $1}'
+#!/bin/sh
+
+#$ -S /bin/sh
+
+command=\`sed -n -e "\${SGE_TASK_ID}p" $taskfile\`
+
+exec /bin/sh -c "\$command"
+EOF
+    fi
+    ;;
+
+###########################################################################
+# Don't change the following - this runs the commands directly if a
+# cluster is not being used.
+###########################################################################
+
+  NONE)
+    if [[ "x$tasks" = "x" ]] ; then
+      if [[ "$verbose" -eq 1 ]] ; then
+        echo executing: "${commandline[*]}" >&2
+      fi
+
+      "${commandline[@]}" > "${LogDir}${JobName}.o$$" 2> "${LogDir}${JobName}.e$$"
+      ERR=$?
+      if [[ "$ERR" -ne 0 ]] ; then
+        cat "${LogDir}${JobName}.e$$" >&2
+        exit $ERR
+      fi
+    else
+      if [[ "$verbose" -eq 1 ]] ; then
+        echo "Running commands in: $taskfile" >&2
+      fi
+
+      n=1
+      while [[ "$n" -le "$tasks" ]] ; do
+        line=$(sed -n -e ''${n}'p' "$taskfile")
+        if [[ "$verbose" -eq 1 ]] ; then
+            echo "executing: $line" >&2
+        fi
+        /bin/sh <<EOF2 > "${LogDir}${JobName}.o$$.$n" 2> "${LogDir}${JobName}.e$$.$n"
+$line
+EOF2
+        n=$((n+1))
+      done
+    fi
+    echo $$
+    ;;
+
+esac
+
+###########################################################################
+# Done.
+###########################################################################
diff --git a/config/common/insertcopyright b/config/common/insertcopyright
old mode 100644
new mode 100755
diff --git a/config/common/supportedGencodes.sh b/config/common/supportedGencodes.sh
old mode 100644
new mode 100755
diff --git a/config/generic/configure.sh b/config/generic/configure.sh
deleted file mode 100644
index 5508366a9010430e6d40a01dca8bbbaa7629f1b0..0000000000000000000000000000000000000000
--- a/config/generic/configure.sh
+++ /dev/null
@@ -1,12 +0,0 @@
-# Auto-configure options for Mac OS X Universal build
-
-# Written by Duncan Mortimer
-case "$FSLMACHTYPE" in *darwin*) 
-	echo "BASE CONFIGURE"
-	macosx_opts="-arch x86_64 -mmacosx-version-min=10.9"
-	cflags="${cflags} ${macosx_opts}"
-	cxxflags="${cxxflags} ${macosx_opts}"
-	ldflags="${ldflags} -Wl,-search_paths_first ${macosx_opts}"
-	configure_opts="${configure_opts} --disable-dependency-tracking"
-;; 
-esac
\ No newline at end of file
diff --git a/config/generic/tclconfigure.sh b/config/generic/tclconfigure.sh
deleted file mode 100644
index fe05fdb374dbf1cd322e5aca9d284cefd9367804..0000000000000000000000000000000000000000
--- a/config/generic/tclconfigure.sh
+++ /dev/null
@@ -1,13 +0,0 @@
-# Auto-configure options for Mac OS X Universal build
-
-# Written by Duncan Mortimer
-case "$FSLMACHTYPE" in *darwin*)
-	echo "TCL CONFIGURE"
-	macosx_opts="-arch x86_64"
-	macosx_version="-mmacosx-version-min=10.9"
-	cflags="${cflags} ${macosx_opts} ${macosx_version}" 
-	cxxflags="${cxxflags} ${macosx_opts} ${macosx_version}"
-	ldflags="${ldflags} -Wl,-search_paths_first ${macosx_opts}"
-	configure_opts="${configure_opts} --disable-dependency-tracking"
-;;
-esac
diff --git a/config/generic/tkconfigure.sh b/config/generic/tkconfigure.sh
deleted file mode 100644
index 6a54c38ec8637ef32bcbffe1bc856aaa6ae7ef2d..0000000000000000000000000000000000000000
--- a/config/generic/tkconfigure.sh
+++ /dev/null
@@ -1,13 +0,0 @@
-# Auto-configure options for Mac OS X Universal build
-
-# Written by Duncan Mortimer
-case "$FSLMACHTYPE" in *darwin*)
-	echo "TK CONFIGURE"
-	macosx_opts="-arch x86_64"
-	macosx_min="-mmacosx-version-min=10.9"
-	cflags="${cflags} ${macosx_opts} ${macosx_min}"
-	cxxflags="${cxxflags} ${macosx_opts} ${macosx_min}"
-	ldflags="${ldflags} -Wl,-search_paths_first ${macosx_opts}"
-	configure_opts="${configure_opts} --disable-dependency-tracking --x-includes=/usr/X11/include --x-libraries=/usr/X11/lib"
-;;
-esac