diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,4 +1,11 @@
-## [v1.4.1](https://github.com/diagrams/diagrams-lib/tree/v1.4.0.1) (2017-05-28)
+## [v1.4.1.1](https://github.com/diagrams/diagrams-lib/tree/v1.4.1.1) (2017-06-06)
+
+- Fix `Diagrams.Points.centroid` to make it total.
+- Fix bug in `Diagrams.Transform.Matrix.fromMatWithInv` (and hence
+  also related functions which called it, such as `fromMat22` and
+  `fromMat33`).
+
+## [v1.4.1](https://github.com/diagrams/diagrams-lib/tree/v1.4.1) (2017-05-28)
 
 - New functions `embeddedImage` and `loadImageEmbBS` for loading
   images.
diff --git a/diagrams-lib.cabal b/diagrams-lib.cabal
--- a/diagrams-lib.cabal
+++ b/diagrams-lib.cabal
@@ -1,5 +1,5 @@
 Name:                diagrams-lib
-Version:             1.4.1
+Version:             1.4.1.1
 Synopsis:            Embedded domain-specific language for declarative graphics
 Description:         Diagrams is a flexible, extensible EDSL for creating
                      graphics of many types.  Graphics can be created
@@ -163,6 +163,7 @@
                        deepseq >= 1.3 && < 1.5,
                        diagrams-lib,
                        lens,
+                       distributive,
                        numeric-extras,
                        diagrams-solve
   default-language:    Haskell2010
diff --git a/src/Diagrams/Points.hs b/src/Diagrams/Points.hs
--- a/src/Diagrams/Points.hs
+++ b/src/Diagrams/Points.hs
@@ -29,8 +29,11 @@
 import           Linear.Vector
 
 -- | The centroid of a set of /n/ points is their sum divided by /n/.
+--   Returns the origin for an empty list of points.
 centroid :: (Additive v, Fractional n) => [Point v n] -> Point v n
-centroid = meanV
+centroid [] = origin
+centroid ps = meanV ps
+{-# INLINE centroid #-}
 
 meanV :: (Foldable f, Additive v, Fractional a) => f (v a) -> v a
 meanV = uncurry (^/) . F.foldl' (\(s,c) e -> (e ^+^ s,c+1)) (zero,0)
diff --git a/src/Diagrams/Transform/Matrix.hs b/src/Diagrams/Transform/Matrix.hs
--- a/src/Diagrams/Transform/Matrix.hs
+++ b/src/Diagrams/Transform/Matrix.hs
@@ -40,13 +40,13 @@
 --   translation vector. Does not check if the matrix is not invertible
 --   (in which case the 'T2' will be invalid).
 fromMat22 :: Floating n => M22 n -> V2 n -> T2 n
-fromMat22 m v = flip (fromMatWithInv m) v $ inv22 m
+fromMat22 m v = fromMatWithInv m (inv22 m) v
 
 -- | Make a 3D transformation from a 3x3 transform matrix and a
 --   translation vector. Does not check if the matrix is not invertible
 --   (in which case the 'T3' will be invalid).
 fromMat33 :: Floating n => M33 n -> V3 n -> T3 n
-fromMat33 m v = flip (fromMatWithInv m) v $ inv33 m
+fromMat33 m v = fromMatWithInv m (inv33 m) v
 
 -- | Build a transform with a maxtrix along with its inverse.
 fromMatWithInv :: (Additive v, Distributive v, F.Foldable v, Num n)
@@ -55,8 +55,8 @@
   -> v n     -- ^ translation
   -> Transformation v n
 fromMatWithInv m m_ v =
-  Transformation ((*! m)            <-> (*! m_))
-                 ((*! distribute m) <-> (*! distribute m_))
+  Transformation ((m !*)            <-> (m_ !*))
+                 ((distribute m !*) <-> (distribute m_ !*))
                  v
 
 -- | Prism onto a 2D transformation from a 2x2 transform matrix and
diff --git a/test/Instances.hs b/test/Instances.hs
--- a/test/Instances.hs
+++ b/test/Instances.hs
@@ -13,7 +13,8 @@
 
 import           Diagrams.Prelude
 import           Numeric.Extras
-import           Test.Tasty.QuickCheck
+import           Test.Tasty.QuickCheck (Arbitrary(..), Gen)
+import qualified Test.Tasty.QuickCheck as QC
 
 ------------------------------------------------------------
     -- Approximate Comparison for Doubles, Points
@@ -36,6 +37,9 @@
 instance Approx n => Approx (V2 n) where
     z1 =~ z2 = (z1^._x) =~ (z2^._x) && (z1^._y) =~ (z2^._y)
 
+instance Approx n => Approx (V3 n) where
+    z1 =~ z2 = (z1^._x) =~ (z2^._x) && (z1^._y) =~ (z2^._y) && (z1^._z) =~ (z2^._z)
+
 instance Approx (v n) => Approx (Point v n) where
     p =~ q = view _Point p =~ view _Point q
 
@@ -86,10 +90,26 @@
     arbitrary = (^&) <$> arbitrary <*> arbitrary
     shrink (coords -> x :& y) = (^&) <$> shrink x <*> shrink y
 
+instance Arbitrary n => Arbitrary (V3 n) where
+    arbitrary = V3 <$> arbitrary <*> arbitrary <*> arbitrary
+    shrink (coords -> x :& y :& z) = V3 <$> shrink x <*> shrink y <*> shrink z
+
 instance Arbitrary (v n) => Arbitrary (Point v n) where
     arbitrary = P <$> arbitrary
     shrink (P v) = P <$> shrink v
 
+instance (Arbitrary n, Floating n, Ord n) => Arbitrary (Transformation V2 n) where
+    arbitrary = QC.sized arbT
+      where
+        arbT 0 = return mempty
+        arbT n = QC.oneof
+          [ rotation    <$> arbitrary
+          , scaling     <$> arbitrary
+          , translation <$> arbitrary
+          , reflectionAbout <$> arbitrary <*> arbitrary
+          , (<>) <$> arbT (n `div` 2) <*> arbT (n `div` 2)
+          ]
+
 instance Arbitrary n => Arbitrary (Angle n) where
     arbitrary = review rad <$> arbitrary
 
@@ -114,7 +134,7 @@
 --    shrink (OffsetClosed x) = OffsetClosed <$> shrink x
 
 instance Arbitrary n =>  Arbitrary (Segment Closed V2 n) where
-    arbitrary = oneof [Linear <$> arbitrary, Cubic <$> arbitrary <*> arbitrary <*> arbitrary]
+    arbitrary = QC.oneof [Linear <$> arbitrary, Cubic <$> arbitrary <*> arbitrary <*> arbitrary]
     -- shrink (Linear x) = Linear <$> shrink x
     -- shrink (Cubic x y z) = Linear z
     --                      : [Cubic x' y' z' | (x',y',z') <- shrink (x,y,z)]
@@ -128,5 +148,5 @@
 --    shrink (cutLoop -> l) = closeLine <$> shrink l
 
 instance (Arbitrary n, Floating n, Ord n) => Arbitrary (Trail V2 n) where
-    arbitrary = oneof [Trail <$> (arbitrary :: Gen (Trail' Loop V2 n)), Trail <$> (arbitrary :: Gen (Trail' Line V2 n))]
+    arbitrary = QC.oneof [Trail <$> (arbitrary :: Gen (Trail' Loop V2 n)), Trail <$> (arbitrary :: Gen (Trail' Line V2 n))]
 
diff --git a/test/Test.hs b/test/Test.hs
--- a/test/Test.hs
+++ b/test/Test.hs
@@ -3,6 +3,7 @@
 import qualified Diagrams.Test.Angle       as Angle
 import qualified Diagrams.Test.Direction   as Direction
 import qualified Diagrams.Test.Transform   as Transform
+import qualified Diagrams.Test.Transform.Matrix   as TransformMatrix
 import qualified Diagrams.Test.TwoD        as TwoD
 import qualified Diagrams.Test.TwoD.Offset as TwoD.Offset
 
@@ -15,6 +16,7 @@
     , Angle.tests
     , Direction.tests
     , Transform.tests
+    , TransformMatrix.tests
     , Trail.tests
     ]
 
