diff --git a/fsl/transform/fnirt.py b/fsl/transform/fnirt.py
index 962599a27f5efd5bc00ac23374c8715ee6d9b1ab..79c0edbb9a7acb58b376f09eff91bde289dab1b1 100644
--- a/fsl/transform/fnirt.py
+++ b/fsl/transform/fnirt.py
@@ -24,21 +24,24 @@ import fsl.data.constants as constants
 log = logging.getLogger(__name__)
 
 
-def _readFnirtDisplacementField(fname, img, src, ref):
+def _readFnirtDisplacementField(fname, img, src, ref, dispType=None):
     """Loads ``fname``, assumed to be a FNIRT displacement field.
 
-    :arg fname: File name of FNIRT displacement field
-    :arg img:   ``fname`` loaded as an :class:`.Image`
-    :arg src:   Source image
-    :arg ref:   Reference image
-    :return:    A :class:`.DisplacementField`
+    :arg fname:    File name of FNIRT displacement field
+    :arg img:      ``fname`` loaded as an :class:`.Image`
+    :arg src:      Source image
+    :arg ref:      Reference image
+    :arg dispType: Displacement type - either ``'absolute'`` or ``'relative'``.
+                   If not provided, is automatically inferred from the data.
+    :return:       A :class:`.DisplacementField`
     """
     from . import nonlinear
     return nonlinear.DisplacementField(fname,
                                        src,
                                        ref,
                                        srcSpace='fsl',
-                                       refSpace='fsl')
+                                       refSpace='fsl',
+                                       dispType=dispType)
 
 
 def _readFnirtCoefficientField(fname, img, src, ref):
@@ -114,14 +117,16 @@ def _readFnirtCoefficientField(fname, img, src, ref):
                                       fieldToRefMat=fieldToRefMat)
 
 
-def readFnirt(fname, src, ref):
+def readFnirt(fname, src, ref, dispType=None):
     """Reads a non-linear FNIRT transformation image, returning
     a :class:`.DisplacementField` or :class:`.CoefficientField` depending
     on the file type.
 
-    :arg fname: File name of FNIRT transformation
-    :arg src:   Source image
-    :arg ref:   Reference image
+    :arg fname:    File name of FNIRT transformation
+    :arg src:      Source image
+    :arg ref:      Reference image
+    :arg dispType: Displacement type - either ``'absolute'`` or ``'relative'``.
+                   If not provided, is automatically inferred from the data.
     """
 
     # Figure out whether the file
@@ -139,7 +144,7 @@ def readFnirt(fname, src, ref):
              constants.FSL_TOPUP_QUADRATIC_SPLINE_COEFFICIENTS)
 
     if img.intent in disps:
-        return _readFnirtDisplacementField(fname, img, src, ref)
+        return _readFnirtDisplacementField(fname, img, src, ref, dispType)
     elif img.intent in coefs:
         return _readFnirtCoefficientField(fname, img, src, ref)
     else:
diff --git a/fsl/transform/x5.py b/fsl/transform/x5.py
index 1d29a5777663d2b9c6f88cfac2648a7266636e8f..e1e709fcf829e937621a91968c7d01fd50479a4b 100644
--- a/fsl/transform/x5.py
+++ b/fsl/transform/x5.py
@@ -402,10 +402,10 @@ def readNonLinearX5(fname):
         root = f['/']
         _validateNonLinearTransform(root)
 
-        if root['SubType'] == 'displacement':
-            field = _readDisplacementField(root)
-        elif root['SubType'] == 'coefficient':
-            field = _readCoefficientField(root)
+        subtype = root.attrs['SubType']
+
+        if   subtype == 'displacement': field = _readDisplacementField(root)
+        elif subtype == 'coefficient':  field = _readCoefficientField(root)
 
     return field
 
@@ -484,8 +484,8 @@ def _writeAffine(group, xform):
     :arg xform: ``numpy`` array containing a ``(4, 4)`` affine transformation.
     """
 
-    xform = np.asarray(xform,                 dtype=np.float64)
-    inv   = np.asarray(affine.inverse(xform), dtype=np.float64)
+    xform = np.asarray(xform,                dtype=np.float64)
+    inv   = np.asarray(affine.invert(xform), dtype=np.float64)
 
     group.attrs['Type'] = 'linear'
     group.create_dataset('Transform', data=xform)
@@ -624,7 +624,7 @@ def _writeNonLinearCommon(group, field):
     _writeAffine(group.create_group('Post'), post)
 
     if field.srcToRefMat is not None:
-        _writeAffine(group.create_group('InitialAlignment', field.srcToRefMat))
+        _writeAffine(group.create_group('InitialAlignment'), field.srcToRefMat)
 
 
 def _readDisplacementField(group):
@@ -674,15 +674,15 @@ def _readCoefficientField(group):
     src, ref, pre, post, init, srcSpace, refSpace = _readNonLinearCommon(group)
 
     field      = np.array(group['Transform'])
-    ftype      = group['Representation']
-    spacing    = group['Parameters/Spacing']
+    ftype      = group.attrs['Representation']
+    spacing    = group['Parameters'].attrs['Spacing']
     refToField = _readAffine(group['Parameters/ReferenceToField'])
     fieldToRef = affine.invert(refToField)
 
     if   ftype == 'quadratic bspline': ftype = 'quadratic'
     elif ftype == 'cubic bspline':     ftype = 'cubic'
 
-    if spacing.shape != 3:
+    if spacing.shape != (3,):
         raise X5Error('Invalid spacing: {}'.format(spacing))
 
     field = nonlinear.CoefficientField(field,
@@ -714,7 +714,7 @@ def _writeCoefficientField(group, field):
     elif field.fieldType == 'quadratic':
         group.attrs['Representation'] = 'quadratic bspline'
 
-    xform = np.field.data.astype(np.float64)
+    xform = field.data.astype(np.float64)
 
     group.create_dataset('Transform', data=xform)