diff --git a/fsl/fslview/gl/gl21/gllinevector_funcs.py b/fsl/fslview/gl/gl21/gllinevector_funcs.py
index c7316871b0fcd642043089b748e31339cf175db5..b9105ca656ce3188b2eb214d70af4891045bed6e 100644
--- a/fsl/fslview/gl/gl21/gllinevector_funcs.py
+++ b/fsl/fslview/gl/gl21/gllinevector_funcs.py
@@ -72,7 +72,13 @@ def updateShaderState(self):
     cmapXform       = self.xColourTexture.getCoordinateTransform()
     voxToDisplayMat = display.getTransform('voxel', 'display')
     useSpline       = display.interpolation == 'spline'
-    imageShape      = np.array(self.image.shape, dtype=np.float32) 
+    imageShape      = np.array(self.image.shape, dtype=np.float32)
+
+    voxValXform     = np.array(voxValXform,     dtype=np.float32).ravel('C')
+    cmapXform       = np.array(cmapXform,       dtype=np.float32).ravel('C')
+    voxToDisplayMat = np.array(voxToDisplayMat, dtype=np.float32).ravel('C')
+
+    print voxToDisplayMat
 
     gl.glUseProgram(self.shaders)
 
@@ -95,14 +101,36 @@ def updateShaderState(self):
 
 
 def preDraw(self):
-    pass
+    gl.glUseProgram(self.shaders)
 
+    
 def draw(self, zpos, xform=None):
-    pass
+
+    if self.display.transform != 'id':
+        print "oh no you don't ({})".format(self.display.transform)
+        return
+
+    slices           = [slice(None)] * 3
+    slices[self.zax] = np.floor(zpos)
+
+    vertices = self.voxelVertices[slices[0], slices[1], slices[2], :]
+
+    nvertices = vertices.size / 3
+
+    print vertices.shape
+    
+    vertices  = vertices.ravel('C')
+
+
+    gl.glDrawArrays(gl.GL_LINES, 0, nvertices)
 
 
 def drawAll(self, zposes, xforms):
-    pass 
+
+    # TODO a proper implementation
+    for zpos, xform in zip(zposes, xforms):
+        draw(zpos, xform)
+
 
 def postDraw(self):
-    pass 
+    gl.glUseProgram(0)
diff --git a/fsl/fslview/gl/gl21/gllinevector_vert.glsl b/fsl/fslview/gl/gl21/gllinevector_vert.glsl
index 439f8915af6d6c680b10a2dad233be315a0c1e06..8eebfaf35dce0205f086e65f40738f8a5f56b633 100644
--- a/fsl/fslview/gl/gl21/gllinevector_vert.glsl
+++ b/fsl/fslview/gl/gl21/gllinevector_vert.glsl
@@ -5,7 +5,7 @@
  */
 #version 120
 
-uniform mat4 voxToDisplayMat
+uniform mat4 voxToDisplayMat;
 uniform vec3 imageShape;
 
 attribute vec3 vertex;
@@ -19,5 +19,5 @@ void main(void) {
   fragVoxCoord = floor(vertex);
   fragTexCoord = fragVoxCoord / imageShape;
 
-  gl_Position = gl_ModelViewProjectionMatrix * voxToDisplayMat * vec4(vertex, 1);
+  gl_Position = gl_ModelViewProjectionMatrix * vec4(vertex, 1);
 }
diff --git a/fsl/fslview/gl/gl21/glvector_frag.glsl b/fsl/fslview/gl/gl21/glvector_frag.glsl
index 971f5c9f4557b79cf3c6484f9130ad5cc2e19504..1742aff9941f52fa3a0b6cf7f61902c698a8891a 100644
--- a/fsl/fslview/gl/gl21/glvector_frag.glsl
+++ b/fsl/fslview/gl/gl21/glvector_frag.glsl
@@ -134,5 +134,6 @@ void main(void) {
   if (modValue < modThreshold)
       voxColour.a = 0.0;
 
-  gl_FragColor = voxColour;
+  // gl_FragColor = voxColour;
+  gl_FragColor = vec4(1, 0, 0, 1);
 }
diff --git a/fsl/fslview/gl/gllinevector.py b/fsl/fslview/gl/gllinevector.py
index 2ac5419efcabf09247aa6a48625d344f12119fe7..584f08b6f232de144656be03474a6e854e541df5 100644
--- a/fsl/fslview/gl/gllinevector.py
+++ b/fsl/fslview/gl/gllinevector.py
@@ -20,7 +20,7 @@ class GLLineVector(glvector.GLVector):
     def __init__(self, image, display):
         glvector.GLVector.__init__(self, image, display)
 
-        self.__generateLineVertices(self)
+        self.__generateLineVertices()
 
         def vertexUpdate(*a):
             self.__generateLineVertices()
@@ -65,9 +65,9 @@ class GLLineVector(glvector.GLVector):
 
         # Offset each vertex by the
         # corresponding voxel coordinates
-        vertices[:, :, :, 0] += np.arange(image.shape[0])
-        vertices[:, :, :, 1] += np.arange(image.shape[1])
-        vertices[:, :, :, 2] += np.arange(image.shape[2])
+        vertices[:, :, :, 0] += np.arange(image.shape[0]).reshape((image.shape[0], 1, 1))
+        vertices[:, :, :, 1] += np.arange(image.shape[1]).reshape((1, image.shape[1], 1))
+        vertices[:, :, :, 2] += np.arange(image.shape[2]).reshape((1, 1, image.shape[2]))
 
         self.voxelVertices = vertices
     
diff --git a/fsl/fslview/gl/globject.py b/fsl/fslview/gl/globject.py
index 9a110a04e5f0449e3a776a1d20ededdd19fcbbb5..81bb34dcfb26853b967094edcb7b4258265df23e 100644
--- a/fsl/fslview/gl/globject.py
+++ b/fsl/fslview/gl/globject.py
@@ -35,14 +35,16 @@ def createGLObject(image, display):
     :arg display: A :class:`~fsl.fslview.displaycontext.Display` instance.
     """
 
-    import fsl.fslview.gl.glvolume    as glvolume
-    import fsl.fslview.gl.glmask      as glmask
-    import fsl.fslview.gl.glrgbvector as glrgbvector
+    import fsl.fslview.gl.glvolume     as glvolume
+    import fsl.fslview.gl.glmask       as glmask
+    import fsl.fslview.gl.glrgbvector  as glrgbvector
+    import fsl.fslview.gl.gllinevector as gllinevector
 
     _objectmap = {
-        'volume'    : glvolume   .GLVolume,
-        'mask'      : glmask     .GLMask,
-        'rgbvector' : glrgbvector.GLRGBVector
+        'volume'     : glvolume    .GLVolume,
+        'mask'       : glmask      .GLMask,
+        'rgbvector'  : glrgbvector .GLRGBVector,
+        'linevector' : gllinevector.GLLineVector
     } 
 
     ctr = _objectmap.get(display.imageType, None)
diff --git a/fsl/fslview/gl/shaders.py b/fsl/fslview/gl/shaders.py
index f56e1b946d6c65d85c6ab57fe9961cd51a2617e7..dba2eae2fb3dff6e6287ef876bacd79ecece3850 100644
--- a/fsl/fslview/gl/shaders.py
+++ b/fsl/fslview/gl/shaders.py
@@ -47,8 +47,8 @@ _shaderTypePrefixMap = td.TypeDict({
     ('GLLineVector', 'vert', False) : 'gllinevector',
     ('GLLineVector', 'vert', True)  : 'gllinevector',
     
-    ('GLLineVector', 'frag', False) : 'gllinevector',
-    ('GLLineVector', 'frag', True)  : 'gllinevector', 
+    ('GLLineVector', 'frag', False) : 'glvector',
+    ('GLLineVector', 'frag', True)  : 'glvector_fast', 
 })
 """This dictionary provides a mapping between :class:`.GLObject` types,
 and file name prefixes, identifying the shader programs to use.