diff --git a/hmm-lapack.cabal b/hmm-lapack.cabal
--- a/hmm-lapack.cabal
+++ b/hmm-lapack.cabal
@@ -1,5 +1,5 @@
 Name:                hmm-lapack
-Version:             0.3.0.2
+Version:             0.3.0.3
 Synopsis:            Hidden Markov Models using LAPACK primitives
 Description:
   Hidden Markov Models implemented using LAPACK data types and operations.
@@ -41,7 +41,7 @@
   Changes.md
 
 Source-Repository this
-  Tag:         0.3.0.2
+  Tag:         0.3.0.3
   Type:        darcs
   Location:    http://hub.darcs.net/thielema/hmm-lapack
 
@@ -67,7 +67,7 @@
     Math.HiddenMarkovModel.Utility
     Math.HiddenMarkovModel.CSV
   Build-Depends:
-    lapack >=0.2 && <0.3,
+    lapack >=0.2.2 && <0.3,
     fixed-length >=0.2.1 && <0.3,
     tfp >=1.0 && <1.1,
     netlib-ffi >=0.1.1 && <0.2,
diff --git a/src/Math/HiddenMarkovModel.hs b/src/Math/HiddenMarkovModel.hs
--- a/src/Math/HiddenMarkovModel.hs
+++ b/src/Math/HiddenMarkovModel.hs
@@ -26,12 +26,11 @@
 import Math.HiddenMarkovModel.Private
           (T(..), Trained(..), mergeTrained, toCells, parseCSV)
 import Math.HiddenMarkovModel.Utility
-          (SquareMatrix, squareConstant,
+          (SquareMatrix, squareConstant, distance,
            randomItemProp, normalizeProb, attachOnes)
 
 import qualified Numeric.LAPACK.Matrix as Matrix
 import qualified Numeric.LAPACK.Vector as Vector
-import qualified Numeric.LAPACK.Scalar as Scalar
 
 import qualified Numeric.Netlib.Class as Class
 
@@ -182,27 +181,12 @@
 should suffice for defining an abort criterion.
 -}
 deviation ::
-   (Shape.InvIndexed sh, Eq sh, Class.Real prob, Ord prob) =>
+   (Shape.C sh, Eq sh, Class.Real prob, Ord prob) =>
    T distr sh prob -> T distr sh prob -> prob
 deviation hmm0 hmm1 =
-   deviationVec (initial hmm0) (initial hmm1)
+   distance (initial hmm0) (initial hmm1)
    `max`
-   deviationVec (transition hmm0) (transition hmm1)
-
-deviationVec ::
-   (Shape.InvIndexed sh, Eq sh, Class.Real a) =>
-   StorableArray.Array sh a -> StorableArray.Array sh a -> a
-deviationVec =
-   getDeviation $ Class.switchReal deviationVecAux deviationVecAux
-
-newtype Deviation f a = Deviation {getDeviation :: f a -> f a -> a}
-
-deviationVecAux ::
-   (Shape.InvIndexed sh, Eq sh, Ord a, Class.Real a, Scalar.RealOf a ~ a) =>
-   Deviation (StorableArray.Array sh) a
-deviationVecAux =
-   Deviation $ \x y ->
-      Scalar.absolute $ snd $ Vector.argAbsMaximum $ Vector.sub x y
+   distance (transition hmm0) (transition hmm1)
 
 
 toCSV ::
diff --git a/src/Math/HiddenMarkovModel/CSV.hs b/src/Math/HiddenMarkovModel/CSV.hs
--- a/src/Math/HiddenMarkovModel/CSV.hs
+++ b/src/Math/HiddenMarkovModel/CSV.hs
@@ -114,7 +114,6 @@
 parseVectorCells =
    parseVectorFields =<< getRow
 
--- ToDo: Maybe check row consistency already here?
 parseVectorFields ::
    (Read a, Class.Real a) =>
    CSV.CSVRow -> CSVParser (Vector ZeroInt a)
diff --git a/src/Math/HiddenMarkovModel/Distribution.hs b/src/Math/HiddenMarkovModel/Distribution.hs
--- a/src/Math/HiddenMarkovModel/Distribution.hs
+++ b/src/Math/HiddenMarkovModel/Distribution.hs
@@ -314,7 +314,6 @@
                 (error "Distribution.normalize: undefined array element")) $
           distr
 
--- ToDo: could be managed by semigroup
 maybePlus :: (a -> a -> a) -> Maybe a -> Maybe a -> Maybe a
 maybePlus f mx my = liftA2 f mx my <|> mx <|> my
 
diff --git a/src/Math/HiddenMarkovModel/Example/SineWave.hs b/src/Math/HiddenMarkovModel/Example/SineWave.hs
--- a/src/Math/HiddenMarkovModel/Example/SineWave.hs
+++ b/src/Math/HiddenMarkovModel/Example/SineWave.hs
@@ -11,10 +11,10 @@
 import qualified Math.HiddenMarkovModel as HMM
 import qualified Math.HiddenMarkovModel.Distribution as Distr
 import Math.HiddenMarkovModel.Utility
-         (normalizeProb, squareFromLists, hermitianFromList, singleton)
+         (normalizeProb, squareFromLists, hermitianFromList)
 
 import qualified Numeric.LAPACK.Vector as Vector
-import Numeric.LAPACK.Vector (Vector)
+import Numeric.LAPACK.Vector (Vector, singleton)
 
 import qualified Data.Array.Comfort.Boxed as Array
 import qualified Data.Array.Comfort.Shape as Shape
diff --git a/src/Math/HiddenMarkovModel/Example/TrafficLightPrivate.hs b/src/Math/HiddenMarkovModel/Example/TrafficLightPrivate.hs
--- a/src/Math/HiddenMarkovModel/Example/TrafficLightPrivate.hs
+++ b/src/Math/HiddenMarkovModel/Example/TrafficLightPrivate.hs
@@ -44,7 +44,6 @@
    symbolFromCell = maybeRead
 
 
--- data State = StateRed | StateYellowDown | StateGreen | StateYellowUp
 data State = StateRed | StateYellowRG | StateGreen | StateYellowGR
    deriving (Eq, Ord, Enum, Bounded)
 
diff --git a/src/Math/HiddenMarkovModel/Test.hs b/src/Math/HiddenMarkovModel/Test.hs
--- a/src/Math/HiddenMarkovModel/Test.hs
+++ b/src/Math/HiddenMarkovModel/Test.hs
@@ -11,7 +11,7 @@
 import qualified Math.HiddenMarkovModel.Normalized as Normalized
 import qualified Math.HiddenMarkovModel.Private as Priv
 import qualified Math.HiddenMarkovModel.Distribution as Distr
-import Math.HiddenMarkovModel.Utility (SquareMatrix, squareFromLists)
+import Math.HiddenMarkovModel.Utility (SquareMatrix, squareFromLists, distance)
 
 import qualified Numeric.LAPACK.Vector as Vector
 import qualified Numeric.LAPACK.ShapeStatic as ShapeStatic
@@ -123,12 +123,6 @@
         Priv.zetaFromAlphaBeta recipLikelihood alphas betas,
         uncurry Normalized.zetaFromAlphaBeta $
         Normalized.alphaBeta hmm sequ)
-
-
-distance ::
-   (Shape.C sh, Eq sh) =>
-   Vector.Vector sh Double -> Vector.Vector sh Double -> Double
-distance x y = Vector.normInf (Vector.sub x y)
 
 
 {- |
diff --git a/src/Math/HiddenMarkovModel/Utility.hs b/src/Math/HiddenMarkovModel/Utility.hs
--- a/src/Math/HiddenMarkovModel/Utility.hs
+++ b/src/Math/HiddenMarkovModel/Utility.hs
@@ -50,10 +50,7 @@
 vectorDim :: Shape.C sh => Vector sh a -> Int
 vectorDim = Shape.size . StorableArray.shape
 
-singleton :: (Class.Real a) => a -> Vector () a
-singleton = Vector.constant ()
 
-
 hermitianFromList ::
    (Shape.C sh, Storable a) => sh -> [a] -> Hermitian.Hermitian sh a
 hermitianFromList = Hermitian.fromList MatrixShape.RowMajor
@@ -70,3 +67,15 @@
 
 diagonal :: (Shape.C sh, Class.Real a) => Vector sh a -> Diagonal sh a
 diagonal = Triangular.diagonal MatrixShape.RowMajor
+
+
+newtype Distance f a = Distance {getDistance :: f a -> f a -> a}
+
+distance ::
+   (Shape.C sh, Eq sh, Class.Real a) =>
+   Vector sh a -> Vector sh a -> a
+distance =
+   getDistance $
+   Class.switchReal
+      (Distance $ (Vector.normInf .) . Vector.sub)
+      (Distance $ (Vector.normInf .) . Vector.sub)
