diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 24594f4423fa3a52c8b9f539cd652322e0b1bbaa..c9ab1d5ab688dc63b1bb8f45a9dd0b03e378cb91 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -235,7 +235,7 @@ variables:
 
     # Linux builds for wxPython are currently not
     # on pypi, but are available at this url.
-    - pip install -f https://wxpython.org/Phoenix/release-extras/linux/gtk3/debian-8/ wxpython
+    - pip install --only-binary wxpython -f https://wxpython.org/Phoenix/snapshot-builds/linux/gtk3/debian-8/ wxpython
 
     # All other deps can be installed as
     # normal. scipy is required by nibabel,
diff --git a/fsl/utils/callfsl.py b/fsl/utils/callfsl.py
index fa68a3f4d4fdb46324de5484563de8976114c7f5..d86856ebebef11420d85623d357d875b8dc96fd7 100644
--- a/fsl/utils/callfsl.py
+++ b/fsl/utils/callfsl.py
@@ -42,7 +42,7 @@ def callFSL(*args):
 
     log.debug('callfsl: {}'.format(' '.join(args)))
 
-    result = sp.check_output(args)
+    result = sp.check_output(args).decode('utf-8')
 
     log.debug('result: {}'.format(result))
 
diff --git a/fsl/utils/transform.py b/fsl/utils/transform.py
index 660148d00f2411c2961adc6ef9c20b6f3cf39273..d934d21ff5c675fac4f7c96a866c7a1954f9b8c6 100644
--- a/fsl/utils/transform.py
+++ b/fsl/utils/transform.py
@@ -62,6 +62,8 @@ def scaleOffsetXform(scales, offsets):
 
     if not isinstance(scales,  collections.Sequence): scales  = [scales]
     if not isinstance(offsets, collections.Sequence): offsets = [offsets]
+    if not isinstance(scales,  list):                 scales  = list(scales)
+    if not isinstance(offsets, list):                 offsets = list(offsets)
 
     lens = len(scales)
     leno = len(offsets)
@@ -90,7 +92,8 @@ def compose(scales, offsets, rotations, origin=None):
 
     :arg offsets:   Sequence of three offset values.
 
-    :arg rotations: Sequence of three rotation values, in radians.
+    :arg rotations: Sequence of three rotation values, in radians, or
+                    a rotation matrix of shape ``(3, 3)``.
 
     :arg origin:    Origin of rotation - must be scaled by the ``scales``.
                     If not provided, the rotation origin is ``(0, 0, 0)``.
@@ -98,6 +101,12 @@ def compose(scales, offsets, rotations, origin=None):
 
     preRotate  = np.eye(4)
     postRotate = np.eye(4)
+
+    rotations = np.array(rotations)
+
+    if rotations.shape == (3,):
+        rotations = axisAnglesToRotMat(*rotations)
+
     if origin is not None:
         preRotate[ 0, 3] = -origin[0]
         preRotate[ 1, 3] = -origin[1]
@@ -116,7 +125,8 @@ def compose(scales, offsets, rotations, origin=None):
     offset[ 0,  3] = offsets[0]
     offset[ 1,  3] = offsets[1]
     offset[ 2,  3] = offsets[2]
-    rotate[:3, :3] = axisAnglesToRotMat(*rotations)
+
+    rotate[:3, :3] = rotations
 
     return concat(offset, postRotate, rotate, preRotate, scale)