diff --git a/ply-loader.cabal b/ply-loader.cabal
--- a/ply-loader.cabal
+++ b/ply-loader.cabal
@@ -1,5 +1,5 @@
 name:                ply-loader
-version:             0.1.1.1
+version:             0.1.1.2
 synopsis:            PLY file loader.
 
 description:         PLY is a lightweight file format for representing 3D
@@ -49,7 +49,7 @@
 
 executable ply2bin
   main-is:          Main.hs
-  ghc-options:      -O2 -Wall -threaded
+  ghc-options:      -O2 -Wall -threaded "-with-rtsopts=-N"
   hs-source-dirs:   src/executable
   build-depends:    base >= 4.6 && < 5, 
                     bytestring >= 0.10,
diff --git a/src/PLY/Conf.hs b/src/PLY/Conf.hs
--- a/src/PLY/Conf.hs
+++ b/src/PLY/Conf.hs
@@ -1,5 +1,5 @@
 {-# LANGUAGE OverloadedStrings #-}
--- |Parse Stanford 3D Scanning Repository ".conf" files that place
+-- |Parse Stanford 3D Scanning Repository \"@.conf@\" files that place
 -- individual PLY models into a consistent coordinate frame.
 module PLY.Conf (parseConf, Transformation, Conf(..)) where
 import Control.Applicative
@@ -24,7 +24,9 @@
 transformation :: Parser (V3 Double, Quaternion Double)
 transformation = (,) <$> vec <*> rotation
   where vec = (\[x,y,z] -> V3 x y z) <$> count 3 (skipSpace *> double)
-        rotation = Quaternion <$> (skipSpace *> double) <*> vec
+        rotation = flip Quaternion <$> vec <*> (skipSpace *> double)
+        --rotation = Quaternion <$> (skipSpace *> double) <*> vec
+        --rev (V3 x y z) = V3 z y x
 
 -- |Parse a mesh file specification.
 mesh :: Parser (ByteString, Transformation Double)
diff --git a/src/PLY/Data.hs b/src/PLY/Data.hs
--- a/src/PLY/Data.hs
+++ b/src/PLY/Data.hs
@@ -23,7 +23,6 @@
                  loadMeshesV3, loadHeader) where
 import Control.Applicative
 import Control.Concurrent.ParallelIO (parallel)
-import Control.Lens (view)
 import Data.Attoparsec.Char8
 import Data.ByteString (ByteString)
 import qualified Data.ByteString as BS
@@ -32,9 +31,7 @@
 import Data.Vector (Vector)
 import qualified Data.Vector as V
 import qualified Data.Vector.Storable as VS
-import Linear.Matrix (mkTransformation, (!*))
-import Linear.V3
-import Linear.V4 (vector)
+import Linear
 import System.Directory (canonicalizePath)
 import System.FilePath (takeDirectory, (</>))
 
@@ -116,28 +113,35 @@
 -- are loaded from the same directory that contained the @.conf@ file,
 -- and the data associated with @element@ (e.g. @\"vertex\"@) is
 -- loaded, transformed, and concatenated from all the meshes.
-loadMeshesV3 :: forall a. (PLYType a, Fractional a) => 
+loadMeshesV3 :: forall a. (PLYType a, Fractional a, Conjugate a, RealFloat a) =>
                 FilePath -> ByteString -> IO (Either [String] (VS.Vector (V3 a)))
 loadMeshesV3 confFile element = do dir <- takeDirectory <$> 
                                           canonicalizePath confFile
                                    c <- parseConf <$> BS.readFile confFile
+                                   let cam = let Right (Conf (t,r) _) = c
+                                             in fmap (fmap realToFrac) $
+                                                mkTransformation r t
                                    either (return . Left . (:[]))
-                                          (fmap checkConcat . loadAllMeshes dir)
+                                          (fmap checkConcat . loadAllMeshes dir cam)
                                           c
-    where checkErrors :: [Either String (VS.Vector (V3 a))] -> Either [String] [VS.Vector (V3 a)]
+    where checkErrors :: [Either String (VS.Vector (V3 a))]
+                      -> Either [String] [VS.Vector (V3 a)]
           checkErrors xs = let (ls,rs) = partitionEithers xs
                            in if null ls then Right rs else Left ls
-          checkConcat :: [Either String (VS.Vector (V3 a))] -> Either [String] (VS.Vector (V3 a))
+          checkConcat :: [Either String (VS.Vector (V3 a))]
+                      -> Either [String] (VS.Vector (V3 a))
           checkConcat = (fmap VS.concat $!) . checkErrors
-          loadMesh :: FilePath -> (ByteString, Transformation Double) -> 
-                      IO (Either String (VS.Vector (V3 a)))
-          loadMesh d (f, (t,r)) = 
-            let m = mkTransformation (fmap realToFrac r) (fmap realToFrac t)
+          loadMesh :: FilePath -> M44 a -> (ByteString, Transformation Double)
+                   -> IO (Either String (VS.Vector (V3 a)))
+          loadMesh d _cam (f, (t,r)) = 
+            -- It is convenient to ignore the camera transformation so
+            -- that the object is at the origin.
+            let m = (^+^ fmap realToFrac t ) . rotate (conjugate (fmap realToFrac r))
             in (loadPLY 
                 >=!> loadElementsV3 element
-                >=!> return . VS.map (view _xyz . (m !*) . vector))
+                >=!> return . VS.map m)
                <$> BS.readFile (d </> BC.unpack f)
-          loadAllMeshes :: FilePath -> Conf -> 
+          loadAllMeshes :: FilePath -> M44 a -> Conf -> 
                            IO ([Either String (VS.Vector (V3 a))])
-          loadAllMeshes dir = parallel . map (loadMesh dir) . meshes
+          loadAllMeshes dir cam = parallel . map (loadMesh dir cam) . meshes
 {-# INLINABLE loadMeshesV3 #-}
