diff --git a/Bio/PDB/Common.hs b/Bio/PDB/Common.hs
--- a/Bio/PDB/Common.hs
+++ b/Bio/PDB/Common.hs
@@ -1,9 +1,9 @@
 -- | Common datatype aliases.
-module Bio.PDB.Common(String(..), Vector3(..))
+module Bio.PDB.Common(String(..), V3(..))
 
 where
 
-import Data.Vector.V3
+import Linear
 
 import Prelude hiding(String)
 
@@ -15,6 +15,6 @@
 type String = BS.ByteString
 
 -- -- | Datatype for 3D locations (numbers are in ångströms.)
---instance NFData Vector3 where
---  rnf (Vector3 (x, y, z)) = x `seq` y `seq` z `seq` ()
+--instance NFData V3 where
+--  rnf (V3 (x, y, z)) = x `seq` y `seq` z `seq` ()
 
diff --git a/Bio/PDB/EventParser/PDBEventPrinter.hs b/Bio/PDB/EventParser/PDBEventPrinter.hs
--- a/Bio/PDB/EventParser/PDBEventPrinter.hs
+++ b/Bio/PDB/EventParser/PDBEventPrinter.hs
@@ -33,7 +33,7 @@
                     resid     = rid,
                     resins    = rins,
                     altloc    = al,
-                    coords    = Vector3 x y z,
+                    coords    = V3 x y z,
                     occupancy = occ,
                     bfactor   = bf,
                     segid     = sid,
@@ -206,7 +206,7 @@
                                               (BS.unpack grp)
                                               z
 print handle TVECT  { serial = sn,
-                      vec    = Vector3 a b c } = hPrintf handle "TVECT %4d%10.5f%10.5f%10.5f\n" sn a b c
+                      vec    = V3 a b c } = hPrintf handle "TVECT %4d%10.5f%10.5f%10.5f\n" sn a b c
 print handle JRNL   { cont    = c,
                       content = contents,
                       isFirst = aJRNL } = printJRNL contents
@@ -283,8 +283,8 @@
                                                                   str
   where str = BS.unpack (BS.intercalate sep l)
 
--- | Prints a matrix given as a list of 'Vector3's.
-printMatrix :: Handle -> BS.ByteString -> Int -> [Vector3] -> [Double] -> IO ()
+-- | Prints a matrix given as a list of 'V3 Double's.
+printMatrix :: Handle -> BS.ByteString -> Int -> [V3 Double] -> [Double] -> IO ()
 printMatrix handle ident n []         []     = return ()
 printMatrix handle ident n (vec:vecs) (f:fs) = do hPrintf handle "%5s%c    " (BS.unpack ident) cn
                                                   mapM_ printEntry [a, b, c]
@@ -293,5 +293,5 @@
   where [cn] = show n
         printEntry :: Double -> IO ()
         printEntry = hPrintf handle "%10.6f"
-        Vector3 a b c = vec
+        V3 a b c = vec
 
diff --git a/Bio/PDB/EventParser/PDBEvents.hs b/Bio/PDB/EventParser/PDBEvents.hs
--- a/Bio/PDB/EventParser/PDBEvents.hs
+++ b/Bio/PDB/EventParser/PDBEvents.hs
@@ -1,7 +1,7 @@
 -- | This module contains datatype declaration for PDB parsing
 -- events generated by 'PDBEventParser' module.
 module Bio.PDB.EventParser.PDBEvents(
-  String,Vector3(..),ATID(..),RESID(..),PDBEvent(..),
+  String,V3(..),ATID(..),RESID(..),PDBEvent(..),
   StrandSenseT(..),HelixT(..),ExpMethod(..))
 where
 
@@ -12,7 +12,7 @@
 import Bio.PDB.EventParser.HelixTypes
 import Bio.PDB.EventParser.StrandSense 
 
-import Bio.PDB.Common(String,Vector3(..))
+import Bio.PDB.Common(String,V3(..))
 
 -- | Atom id: atom name, residue name, chain, residue id, residue insertion code
 newtype ATID = ATID (String, String, Char, Int, Char)
@@ -30,7 +30,7 @@
                        resid     :: !Int,
                        resins    :: !Char,
                        altloc    :: !Char,
-                       coords    :: !Vector3,
+                       coords    :: !(V3 Double),
                        occupancy :: !Double,
                        bfactor   :: !Double,
                        segid     :: !String,
@@ -45,7 +45,7 @@
                          resid     :: !Int,
                          resins    :: !Char,
                          altloc    :: !Char,
-                         coords    :: !Vector3,
+                         coords    :: !(V3 Double),
                          occupancy :: !Double,
                          bfactor   :: !Double,
                          segid     :: !String,
@@ -167,15 +167,15 @@
                          curAt      :: Maybe ATID,
                          prevAt     :: Maybe ATID  }    |
                 ORIGXn { n       :: Int,
-                         o       :: [Vector3],
+                         o       :: [V3 Double],
                          t       :: [Double]  }          | 
                 SCALEn { n       :: Int,
-                         o       :: [Vector3],
+                         o       :: [V3 Double],
                          t       :: [Double]  }          | 
                 MTRIXn { serial  :: !Int,
                          relMol  :: !Bool,
                          n       :: !Int,
-                         o       :: ![Vector3],
+                         o       :: ![V3 Double],
                          t       :: ![Double]  }         | 
                 CRYST1 { a       :: !Double,
                          b       :: !Double,
@@ -249,7 +249,7 @@
                          symOp1   :: !String,
                          symOp2   :: !String }          |
                 TVECT  { serial  :: !Int,
-                         vec     :: Vector3 }             |
+                         vec     :: V3 Double }             |
                 JRNL   { cont    :: !Int,
                          content :: ![(String, String)],
                          isFirst :: !Bool }             |
diff --git a/Bio/PDB/EventParser/ParseATOM.hs b/Bio/PDB/EventParser/ParseATOM.hs
--- a/Bio/PDB/EventParser/ParseATOM.hs
+++ b/Bio/PDB/EventParser/ParseATOM.hs
@@ -150,7 +150,7 @@
     elt            = unstr fElt
     charge         = unstr fCharge
     -- assemble record
-    coords         = Vector3 x y z
+    coords         = V3 x y z
     result         = case rectag of 
                        "ATOM  " -> ATOM   atid atnam resnam chain resid insid altloc coords occ bFact segid elt charge False
                        "HETATM" -> ATOM   atid atnam resnam chain resid insid altloc coords occ bFact segid elt charge True
diff --git a/Bio/PDB/EventParser/ParseMatrixRecord.hs b/Bio/PDB/EventParser/ParseMatrixRecord.hs
--- a/Bio/PDB/EventParser/ParseMatrixRecord.hs
+++ b/Bio/PDB/EventParser/ParseMatrixRecord.hs
@@ -51,7 +51,7 @@
 -- (3) input line number
 --
 -- Result is a monad action returning a list of 'PDBEvent's.
-parseMatrixRecord :: (Monad m) =>(Int -> Bool -> Int -> [Vector3] -> [Double] -> PDBEvent)-> String-> Int-> m [PDBEvent]
+parseMatrixRecord :: (Monad m) =>(Int -> Bool -> Int -> [V3 Double] -> [Double] -> PDBEvent)-> String-> Int-> m [PDBEvent]
 parseMatrixRecord cons line line_no = return $ if null errs
                                                  then [result]
                                                  else errs
@@ -67,7 +67,7 @@
     IFDouble o3     = fo3
     IFDouble t      = ft
     IFInt   relMol = fRelMol
-    result = cons serial (relMol==1) n [Vector3 o1 o2 o3] [t]
+    result = cons serial (relMol==1) n [V3 o1 o2 o3] [t]
 
 -- | Parses a SCALEn record.
 --
diff --git a/Bio/PDB/EventParser/ParseTVECT.hs b/Bio/PDB/EventParser/ParseTVECT.hs
--- a/Bio/PDB/EventParser/ParseTVECT.hs
+++ b/Bio/PDB/EventParser/ParseTVECT.hs
@@ -56,7 +56,7 @@
     IFDouble t1     = ft1
     IFDouble t2     = ft2
     IFDouble t3     = ft3
-    result = TVECT serial $ Vector3 t1 t2 t3
+    result = TVECT serial $ V3 t1 t2 t3
 
 -- NOTE: consecutive "TVECT" records should be merged into a single multiline entry with SUCH method
 --mergeTVECTRecords :: [PDBEvent] -> m [PDBEvent]
diff --git a/Bio/PDB/Structure.hs b/Bio/PDB/Structure.hs
--- a/Bio/PDB/Structure.hs
+++ b/Bio/PDB/Structure.hs
@@ -9,7 +9,7 @@
 
 import GHC.Generics(Generic)
 import Prelude hiding(String)
-import Bio.PDB.EventParser.PDBEvents(String, Vector3(..)) -- extract to a separate module?
+import Bio.PDB.EventParser.PDBEvents(String, V3(..)) -- extract to a separate module?
 import Control.DeepSeq
 --import Data.Derive.NFData
 import Bio.PDB.Structure.List as L
@@ -68,7 +68,7 @@
 -- | NOTE: disordered atoms are now reported as multiplicates
 data Atom      = Atom      { atName    :: !String,
                              atSerial  :: !Int,
-                             coord     :: !Vector3,
+                             coord     :: !(V3 Double),
 
                              bFactor   :: !Double,
                              occupancy :: !Double,
diff --git a/Bio/PDB/Structure/Neighbours.hs b/Bio/PDB/Structure/Neighbours.hs
--- a/Bio/PDB/Structure/Neighbours.hs
+++ b/Bio/PDB/Structure/Neighbours.hs
@@ -10,7 +10,7 @@
 import qualified Data.Octree                as Oct
 import           Bio.PDB.Structure
 import           Bio.PDB.Iterable
-import           Data.Vector.V3
+import           Linear
 
 -- | Octree of `Atom`s.
 type AtomOctree = Oct.Octree Atom
@@ -26,9 +26,9 @@
 makeOctree   = Oct.fromList . Prelude.map extract . itfoldr (:) []
 
 -- | Find all `Atom`s within a given radius from a point.
-findInRadius :: AtomOctree -> Double -> Vector3 ->      [(Vector3, Atom)]
+findInRadius :: AtomOctree -> Double -> V3 Double -> [(V3 Double, Atom)]
 findInRadius = Oct.withinRange
 
 -- | Find an `Atom`s closest to a point.
-findNearest  :: AtomOctree ->           Vector3 -> Maybe (Vector3, Atom)
+findNearest  :: AtomOctree -> V3 Double -> Maybe (V3 Double, Atom)
 findNearest  = Oct.nearest
diff --git a/Bio/PDB/Structure/Vector.hs b/Bio/PDB/Structure/Vector.hs
--- a/Bio/PDB/Structure/Vector.hs
+++ b/Bio/PDB/Structure/Vector.hs
@@ -1,60 +1,59 @@
 {-# LANGUAGE NoMonomorphismRestriction, BangPatterns #-}
 -- | This module wraps 3D vector operations, and adds missing ones.
-module Bio.PDB.Structure.Vector(Vector3(..),
-                                unpackVector3,
+module Bio.PDB.Structure.Vector(V3(..),
+                                unpackV3,
                                 vnormalise, vdot, (*|), (|*),
                                 vzip, vmap,
                                 vnorm, vproj, vperpend, vperpends, vdihedral) where
 
-import qualified Data.Vector.Class as C
-import Data.Vector.V3
+import Linear
 import Data.List(foldl')
 import Test.QuickCheck
 
 -- | Unpacks an abstract 3D vector into a triple of 'Double's.
-unpackVector3 :: Vector3 -> (Double, Double, Double)
-unpackVector3 (Vector3 x y z) = (x, y, z)
+unpackV3 :: V3 Double -> (Double, Double, Double)
+unpackV3 (V3 x y z) = (x, y, z)
 
 -- | Maps an operation that modifies a 'Double' onto a 3D vector.
 {-# INLINE vmap #-}
-vmap :: (Double -> Double) -> Vector3 -> Vector3
-vmap = C.vmap
+vmap :: (Double -> Double) -> V3 Double -> V3 Double
+vmap = fmap
 
 -- | Maps an operation on a pair of 'Double's onto a pair of 3D vectors
 --   coordinatewise.
-vzip :: (Double -> Double -> Double) -> Vector3 -> Vector3 -> Vector3
-vzip = C.vzip
+vzip :: (Double -> Double -> Double) -> V3 Double -> V3 Double -> V3 Double
+vzip = liftI2
 
 -- | Normalises to a unit vector in the same direction as input.
 {-# INLINE vnormalise #-}
-vnormalise :: Vector3 -> Vector3
-vnormalise = C.vnormalise 
+vnormalise :: V3 Double -> V3 Double
+vnormalise = normalize 
 
 {-# INLINE vdot #-}
 -- | Computes a dot product of two 3D vectors.
-vdot :: Vector3 -> Vector3 -> Double
-vdot = C.vdot
+vdot :: V3 Double -> V3 Double -> Double
+vdot = dot
 
 {-# INLINE vnorm #-}
 -- | 2-norm of a vector (also called a magnitude or length.)
-vnorm :: Vector3 -> Double
-vnorm = C.vmag
+vnorm :: V3 Double -> Double
+vnorm = norm
 
 {-# INLINE vdihedral #-}
 -- | Compute dihedral between three bond vectors using spherical angle formula.
-vdihedral :: Vector3 -> Vector3 -> Vector3 -> Double
-vdihedral !a !b !c = atan2 (vnorm b * (a `vdot`  (b `vcross` c)))
-                           ((a `vcross` b) `vdot` (b `vcross` c))
+vdihedral :: V3 Double -> V3 Double -> V3 Double -> Double
+vdihedral !a !b !c = atan2 (vnorm b * (a `vdot`  (b `cross` c)))
+                           ((a `cross` b) `vdot` (b `cross` c))
 
 {-# INLINE (*|) #-}
 -- | Scalar product. (asterisk - "*" - indicates side on which one can put a scalar.)
-(*|) :: Double -> Vector3  -> Vector3
-(*|) = (C.*|)
+(*|) :: Double -> V3 Double -> V3 Double
+(*|) = (*^)
 
 {-# INLINE (|*) #-}
 -- | Scalar product. (asterisk - "*" - indicates side on which one can put a scalar.)
-(|*) :: Vector3  -> Double -> Vector3
-(|*) = (C.|*)
+(|*) :: V3 Double -> Double -> V3 Double
+(|*) = (^*)
 
 {-# INLINE vproj #-}
 -- | Finds a vector component of the first vector that is a projection onto direction of second vector.
@@ -72,11 +71,10 @@
 -- | Finds a component of the vector v that is perpendicular to all vectors in a list.
 vperpends v ws = foldl' vperpend v ws
 
-instance Arbitrary Vector3 where
+instance Arbitrary a => Arbitrary (V3 a) where
   arbitrary = do a <- arbitrary
                  b <- arbitrary
                  c <- arbitrary
-                 return $ Vector3 a b c
-
+                 return $ V3 a b c
 
 
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -27,19 +27,16 @@
 
 In particular one may considering these features:
 
-* Migrate out of `text-format`, since it gives portability trouble, and slows things down when printing.
-* Migrate from `AC-Vector` to another vector library:
-    - `vector-space`
-    - or `linear`
+* Implement basic spatial operations of RMS superposition (with SVD),
+affine transform on a substructure.
 * Use `lens` to facilitate access to the data structures.
     - torsion angles within protein/RNA chain.
 * Add Octree to the default data structure (with automatic update.)
+* Migrate out of `text-format`, since it gives portability trouble, and slows things down when printing.
 * Write a combinator library for generic fast parsing.
 * Checking whether GHC 7.8 improved efficiency of fixed point arithmetic,
 since PDB coordinates have dynamic range of just ~2^20 bits, with smallest
 step of 0.001.
-* Implement basic spatial operations of RMS superposition (with SVD),
-affine transform on a substructure.
 * Class-based wrappers showing Structure-Model-Chain-Residue-Atom interface
 with possible wrapping of Repa/Accelerate arrays for fast computation.
 
diff --git a/hPDB.cabal b/hPDB.cabal
--- a/hPDB.cabal
+++ b/hPDB.cabal
@@ -1,5 +1,5 @@
 name:                hPDB
-version:             1.4.0.0
+version:             1.5.0.0
 synopsis:            Protein Databank file format library
 homepage:            https://github.com/BioHaskell/hPDB
 stability:           stable
@@ -63,7 +63,7 @@
                     mtl,
                     template-haskell,
                     vector,
-                    AC-Vector,
+                    linear,
                     containers,
                     unordered-containers >= 0.2.5.0,
                     deepseq,
@@ -74,7 +74,7 @@
                     parallel >= 3.0.0.0,
                     bytestring,
                     zlib,
-                    Octree>= 0.5
+                    Octree>= 0.6
   if flag(have-sse2)
     ghc-options: -msse2 
   if flag(have-mmap)
