diff --git a/fsl/data/atlases.py b/fsl/data/atlases.py
index b34499d17555a3386ea52da4198ce5e21d3b79ad..8d5dad9bd679b4bd8786de4a5a8e41c21db3d310 100644
--- a/fsl/data/atlases.py
+++ b/fsl/data/atlases.py
@@ -54,7 +54,7 @@ import fsl.data.image                     as fslimage
 import fsl.data.constants                 as constants
 from   fsl.utils.platform import platform as platform
 import fsl.utils.image.resample           as resample
-import fsl.transform                      as transform
+import fsl.transform.affine               as affine
 import fsl.utils.notifier                 as notifier
 import fsl.utils.settings                 as fslsettings
 
@@ -572,7 +572,7 @@ class AtlasDescription(object):
         # Load the appropriate transformation matrix
         # and transform all those voxel coordinates
         # into world coordinates
-        coords = transform.transform(coords, self.xforms[0])
+        coords = affine.transform(coords, self.xforms[0])
 
         # Update the coordinates
         # in our label objects
@@ -810,7 +810,7 @@ class LabelAtlas(Atlas):
         """
 
         if not voxel:
-            loc = transform.transform([loc], self.worldToVoxMat)[0]
+            loc = affine.transform([loc], self.worldToVoxMat)[0]
             loc = [int(v) for v in loc.round()]
 
         if loc[0] <  0             or \
@@ -983,7 +983,7 @@ class ProbabilisticAtlas(Atlas):
         """
 
         if not voxel:
-            loc = transform.transform([loc], self.worldToVoxMat)[0]
+            loc = affine.transform([loc], self.worldToVoxMat)[0]
             loc = [int(v) for v in loc.round()]
 
         if loc[0] <  0             or \
diff --git a/fsl/data/featanalysis.py b/fsl/data/featanalysis.py
index fbaaf694244c19045d37a45c2bc9ecd53038777a..718ef679b0502337ecf5aba68a481b336fedd0e6 100644
--- a/fsl/data/featanalysis.py
+++ b/fsl/data/featanalysis.py
@@ -47,11 +47,10 @@ import                   logging
 import os.path        as op
 import numpy          as np
 
-import fsl.utils.path as fslpath
-import fsl.transform  as transform
-
-from . import image   as fslimage
-from . import            featdesign
+import fsl.utils.path       as fslpath
+import fsl.transform.affine as affine
+from . import image         as fslimage
+from . import                  featdesign
 
 
 log = logging.getLogger(__name__)
@@ -467,9 +466,9 @@ def loadClusterResults(featdir, settings, contrast):
         zcog    = [c.zcogx,    c.zcogy,    c.zcogz]
         copemax = [c.copemaxx, c.copemaxy, c.copemaxz]
 
-        zmax    = transform.transform([zmax],    coordXform)[0].round()
-        zcog    = transform.transform([zcog],    coordXform)[0].round()
-        copemax = transform.transform([copemax], coordXform)[0].round()
+        zmax    = affine.transform([zmax],    coordXform)[0].round()
+        zcog    = affine.transform([zcog],    coordXform)[0].round()
+        copemax = affine.transform([copemax], coordXform)[0].round()
 
         c.zmaxx,   c.zmaxy,    c.zmaxz    = zmax
         c.zcogx,   c.zcogy,    c.zcogz    = zcog
diff --git a/fsl/data/image.py b/fsl/data/image.py
index 03dfc48a0aae0e91108861954f6d1bc6b61c629b..95aa3875dfbd547323336cd017700378aa75fd6a 100644
--- a/fsl/data/image.py
+++ b/fsl/data/image.py
@@ -46,7 +46,7 @@ import nibabel           as nib
 import nibabel.fileslice as fileslice
 
 import fsl.utils.meta        as meta
-import fsl.transform         as transform
+import fsl.transform.affine  as affine
 import fsl.utils.notifier    as notifier
 import fsl.utils.memoize     as memoize
 import fsl.utils.path        as fslpath
@@ -332,9 +332,9 @@ class Nifti(notifier.Notifier, meta.Meta):
             refpix        = (header.get('intent_p1', 1),
                              header.get('intent_p2', 1),
                              header.get('intent_p3', 1))
-            voxToWorldMat = transform.concat(
-                transform.scaleOffsetXform(refpix,  0),
-                transform.scaleOffsetXform(knotpix, 0))
+            voxToWorldMat = affine.concat(
+                affine.scaleOffsetXform(refpix,  0),
+                affine.scaleOffsetXform(knotpix, 0))
 
         # If the qform or sform codes are unknown,
         # then we can't assume that the transform
@@ -348,7 +348,7 @@ class Nifti(notifier.Notifier, meta.Meta):
         # should just be a straight scaling matrix.
         elif qform == 0 and sform == 0:
             pixdims       = header.get_zooms()
-            voxToWorldMat = transform.scaleOffsetXform(pixdims, 0)
+            voxToWorldMat = affine.scaleOffsetXform(pixdims, 0)
 
         # Otherwise we let nibabel decide
         # which transform to use.
@@ -389,21 +389,21 @@ class Nifti(notifier.Notifier, meta.Meta):
 
         if isneuro:
             x                 = (shape[0] - 1) * pixdim[0]
-            flip              = transform.scaleOffsetXform([-1, 1, 1],
-                                                           [ x, 0, 0])
-            voxToScaledVoxMat = transform.concat(flip, voxToScaledVoxMat)
+            flip              = affine.scaleOffsetXform([-1, 1, 1],
+                                                        [ x, 0, 0])
+            voxToScaledVoxMat = affine.concat(flip, voxToScaledVoxMat)
 
         affines['fsl',   'fsl']   = np.eye(4)
         affines['voxel', 'voxel'] = np.eye(4)
         affines['world', 'world'] = np.eye(4)
         affines['voxel', 'world'] = voxToWorldMat
-        affines['world', 'voxel'] = transform.invert(voxToWorldMat)
+        affines['world', 'voxel'] = affine.invert(voxToWorldMat)
         affines['voxel', 'fsl']   = voxToScaledVoxMat
-        affines['fsl',   'voxel'] = transform.invert(voxToScaledVoxMat)
-        affines['fsl',   'world'] = transform.concat(affines['voxel', 'world'],
-                                                     affines['fsl',   'voxel'])
-        affines['world', 'fsl']   = transform.concat(affines['voxel',   'fsl'],
-                                                     affines['world', 'voxel'])
+        affines['fsl',   'voxel'] = affine.invert(voxToScaledVoxMat)
+        affines['fsl',   'world'] = affine.concat(affines['voxel', 'world'],
+                                                  affines['fsl',   'voxel'])
+        affines['world', 'fsl']   = affine.concat(affines['voxel',   'fsl'],
+                                                  affines['world', 'voxel'])
 
         return affines, isneuro
 
diff --git a/fsl/data/mesh.py b/fsl/data/mesh.py
index d512972d11904703d8db062815e2cb4b94dc4bd4..c15e49ced5f972e39e01af4c520053ecdb6b809a 100644
--- a/fsl/data/mesh.py
+++ b/fsl/data/mesh.py
@@ -33,9 +33,9 @@ import collections
 import os.path as op
 import numpy   as np
 
-import fsl.utils.meta     as meta
-import fsl.utils.notifier as notifier
-import fsl.transform      as transform
+import fsl.utils.meta       as meta
+import fsl.utils.notifier   as notifier
+import fsl.transform.affine as affine
 
 
 log = logging.getLogger(__name__)
@@ -693,7 +693,7 @@ def calcFaceNormals(vertices, indices):
     v2 = vertices[indices[:, 2]]
 
     fnormals = np.cross((v1 - v0), (v2 - v0))
-    fnormals = transform.normalise(fnormals)
+    fnormals = affine.normalise(fnormals)
 
     return fnormals
 
@@ -724,7 +724,7 @@ def calcVertexNormals(vertices, indices, fnormals):
         vnormals[v2, :] += fnormals[i]
 
     # normalise to unit length
-    return transform.normalise(vnormals)
+    return affine.normalise(vnormals)
 
 
 def needsFixing(vertices, indices, fnormals, loBounds, hiBounds):
@@ -769,4 +769,4 @@ def needsFixing(vertices, indices, fnormals, loBounds, hiBounds):
     # vertex to the camera is positive
     # If it isn't, we need to flip the
     # triangle winding order.
-    return np.dot(n, transform.normalise(camera - vert)) < 0
+    return np.dot(n, affine.normalise(camera - vert)) < 0
diff --git a/fsl/data/mghimage.py b/fsl/data/mghimage.py
index 9693d21fab84f09e00163736fc4344600d834dc4..fea4c9970ecae56ec84f2274f656f11e3e6df2e8 100644
--- a/fsl/data/mghimage.py
+++ b/fsl/data/mghimage.py
@@ -14,9 +14,9 @@ import os.path as op
 import            six
 import nibabel as nib
 
-import fsl.utils.path as fslpath
-import fsl.transform  as transform
-import fsl.data.image as fslimage
+import fsl.utils.path       as fslpath
+import fsl.transform.affine as affine
+import fsl.data.image       as fslimage
 
 
 ALLOWED_EXTENSIONS = ['.mgz', '.mgh']
@@ -55,12 +55,12 @@ class MGHImage(fslimage.Image):
             filename = None
 
         data     = image.get_data()
-        affine   = image.affine
+        xform    = image.affine
         vox2surf = image.header.get_vox2ras_tkr()
 
         fslimage.Image.__init__(self,
                                 data,
-                                xform=affine,
+                                xform=xform,
                                 name=name,
                                 dataSource=filename)
 
@@ -68,9 +68,9 @@ class MGHImage(fslimage.Image):
             self.setMeta('mghImageFile', filename)
 
         self.__voxToSurfMat   = vox2surf
-        self.__surfToVoxMat   = transform.invert(vox2surf)
-        self.__surfToWorldMat = transform.concat(affine, self.__surfToVoxMat)
-        self.__worldToSurfMat = transform.invert(self.__surfToWorldMat)
+        self.__surfToVoxMat   = affine.invert(vox2surf)
+        self.__surfToWorldMat = affine.concat(affine, self.__surfToVoxMat)
+        self.__worldToSurfMat = affine.invert(self.__surfToWorldMat)
 
 
     def save(self, filename=None):
diff --git a/fsl/transform/__init__.py b/fsl/transform/__init__.py
index 8961c518224a444e79e68bd3bc54df2f63acd626..2c86ce512aeda3a909c8cae11e2a11a06796cb70 100644
--- a/fsl/transform/__init__.py
+++ b/fsl/transform/__init__.py
@@ -6,41 +6,14 @@
 # Author: Paul McCarthy <pauldmccarthy@gmail.com>
 #
 """This module contains functions for working with linear and non-linear FSL
-transformations.
-"""
-
-
-from .affine import (  # noqa
-    invert,
-    concat,
-    veclength,
-    normalise,
-    scaleOffsetXform,
-    compose,
-    decompose,
-    rotMatToAffine,
-    rotMatToAxisAngles,
-    axisAnglesToRotMat,
-    axisBounds,
-    transform,
-    transformNormal,
-    rmsdev)
+transformations. Functionality is split across the following modules:
 
-from .flirt  import (  # noqa
-    readFlirt,
-    writeFlirt,
-    fromFlirt,
-    toFlirt,
-    flirtMatrixToSform,
-    sformToFlirtMatrix)
+.. autosummary::
+   :nosignatures:
 
-from .fnirt import (  # noqa
-    readFnirt,
-    toFnirt,
-    fromFnirt)
-
-from .x5 import (  # noqa
-    readLinearX5,
-    writeLinearX5,
-    readNonLinearX5,
-    writeNonLinearX5)
+   .affine
+   .flirt
+   .fnirt
+   .nonlinear
+   .x5
+"""