diff --git a/README b/README
--- a/README
+++ b/README
@@ -4,20 +4,21 @@
 
 REQUIREMENTS ----------------------------
 
-Development packages of:
-
-1) GNU Scientific Library (http://www.gnu.org/software/gsl)
-
-2) BLAS and LAPACK (http://www.netlib.org/lapack)
+1) GNU Scientific Library (http://www.gnu.org/software/gsl).
+   In Ubuntu we need the package "libgsl0-dev".
 
-3) ATLAS (recommended) (http://math-atlas.sourceforge.net/)
+2) BLAS/LAPACK (http://www.netlib.org/lapack).
+   An optimized implementation is recommended. I have tested:
 
-For example, in Ubuntu Linux we need:
+   - Intel's MKL (http://www.intel.com/cd/software/products).
+     There is a free noncommercial download of MKL for Linux.
 
-- libgsl0-dev
-- refblas3-dev
-- lapack3-dev
-- atlas3-base-dev (or a version specifically tuned for your machine)
+   - ATLAS (http://math-atlas.sourceforge.net).
+     In Ubuntu the required packages are "refblas3-dev", "lapack3-dev",
+     and "atlas3-base-dev" (or a version tuned for your machine).
+     Please note that ATLAS currently requires compilation -fviaC in 32bit
+     machines. Otherwise many functions fail, producing strange NaN's.
+     Even with -fvia-C we may get wrong behavior in some cases.
 
 For ghc-6.8.x you may also need:
 
@@ -46,6 +47,19 @@
     $ runhaskell Setup.lhs haddock
     $ runhaskell Setup.lhs install
 
+Using Intel's MKL:
+
+    - add/modify environment variables (e.g. in your .bashrc):
+          export LD_LIBRARY_PATH=/path/to/mkl/lib/arch
+          export    LIBRARY_PATH=/path/to/mkl/lib/arch
+      where arch = "32" or "em64t"
+
+    - add the "-fmkl" flag in the cabal configuration command:
+           $ runhaskell Setup.lhs configure --prefix=$HOME --user -fmkl
+           $ runhaskell Setup.lhs build
+           $ runhaskell Setup.lhs install
+
+
 See below for installation on Windows.
 
 TESTS ---------------------------------------------
@@ -88,7 +102,7 @@
   NaN's results on certain blas/lapack calls. In these machines
   the library is automatically compiled -fvia-C, which apparently
   solves the problem.
-  On 64-bit the default and faster -fasm seems to work well.
+  On 64-bit, or using MKL, the default and faster -fasm seems to work well.
 
 - On 64-bit machines the example "minimize.hs", when run from ghci,
   produces a segmentation fault. It happens in the call to
@@ -110,6 +124,9 @@
   A similar problem was reported at:
       http://article.gmane.org/gmane.linux.debian.devel.bugs.general/323065
 
+- On distributions with old GSL versions you should comment out a couple of functions
+  in the export lists of Ellint.hs and Debye.hs
+
 CHANGES ---------------------------------------------------------
 
 This is a new version of the library previously known as GSLHaskell.
@@ -142,22 +159,26 @@
    These headers are also available from:
        http://perception.inf.um.es/~aruiz/darcs/hmatrix/gsl.zip
 
-2) Install the package as usual:
+2) Copy libgsl.dll, libcblas.dll (from the binaries package gsl-1.8.bin.zip)
+   and liblapack.dll (borrowed from the R system) to the ghc folder, e.g.:
+       C:\ghc\ghc-6.x.x.
+   Rename libcblas.dll to libblas.dll.
+   They are needed to compile programs.
+   These three dlls are available from:
+       http://perception.inf.um.es/~aruiz/darcs/hmatrix/dll1.zip
+
+2.5) Remove the following functions from the export list of
+     lib/Numeric/GSL/Special/Ellint.hs:
+     ellint_Pcomp_e, ellint_Pcomp, ellint_Dcomp_e, ellint_Dcomp
+
+3) Install the package as usual:
        runhaskell Setup.lhs configure
        runhaskell Setup.lhs build
        runhaskell Setup.lhs install
 
-2.5) If configure cannot find ld please see:
+3.5) If configure cannot find ld please see:
        http://article.gmane.org/gmane.comp.lang.haskell.cafe/32025
 
-3) Copy libgsl.dll, libcblas.dll (from the binaries package gsl-1.8.bin.zip)
-   and liblapack.dll (borrowed from the R system) to the folder in which
-   hmatrix has been installed: C:\Program Files\haskell\hmatrix-x.x.x.x\ghc-6.x.x.
-   Rename libcblas.dll to libblas.dll.
-   They are needed to compile programs.
-   These three dlls are available from:
-       http://perception.inf.um.es/~aruiz/darcs/hmatrix/dll1.zip
-
 4) Copy the dlls available from:
        http://perception.inf.um.es/~aruiz/darcs/hmatrix/dll2.zip
    to the working directory or C:\windows\system
@@ -198,3 +219,5 @@
 
 - Xiao-Yong Jin reported a bug on x86_64 caused by the assumptions in f2c.h,
   which are wrong for this architecture.
+
+- Jason Schroeder reported an error in the documentation.
diff --git a/hmatrix.cabal b/hmatrix.cabal
--- a/hmatrix.cabal
+++ b/hmatrix.cabal
@@ -1,5 +1,5 @@
 Name:               hmatrix
-Version:            0.2.1.0
+Version:            0.3.0.0
 License:            GPL
 License-file:       LICENSE
 Author:             Alberto Ruiz
@@ -21,19 +21,19 @@
 flag splitBase
     description:    Choose the new smaller, split-up base package.
 
+flag mkl
+    description:    Link with Intel's MKL optimized libraries.
+    default:        False
+
 library
     if flag(splitBase)
       build-depends:    base >= 3, array, QuickCheck, HUnit, storable-complex
     else
       build-depends:    base < 3, QuickCheck, HUnit, storable-complex
 
-    if os(windows)
-      ghc-options:
-    else
-      if arch(x86_64)
-         ghc-options:
-      else
-         ghc-options:   -fvia-C
+    if !flag(mkl)
+      if !arch(x86_64)
+        ghc-options:    -fvia-C
 
     Build-Depends:      haskell98
     Extensions:         ForeignFunctionInterface
@@ -95,6 +95,13 @@
     C-sources:          lib/Data/Packed/Internal/auxi.c,
                         lib/Numeric/LinearAlgebra/LAPACK/lapack-aux.c,
                         lib/Numeric/GSL/gsl-aux.c
-    extra-libraries:    gsl blas lapack
+    if flag(mkl)
+      if arch(x86_64)
+        extra-libraries:   gsl mkl_lapack mkl_intel_lp64 mkl_sequential mkl_core
+      else
+        extra-libraries:   gsl mkl_lapack mkl_intel mkl_sequential mkl_core
+    else
+      extra-libraries:  gsl blas lapack
+
     cc-options:         -O4
     ghc-prof-options:   -auto-all
diff --git a/lib/Numeric/GSL/Minimization.hs b/lib/Numeric/GSL/Minimization.hs
--- a/lib/Numeric/GSL/Minimization.hs
+++ b/lib/Numeric/GSL/Minimization.hs
@@ -69,7 +69,7 @@
 
 The path to the solution can be graphically shown by means of:
 
-@'GSL.Plot.mplot' $ drop 3 ('toColumns' p)@
+@'Graphics.Plot.mplot' $ drop 3 ('toColumns' p)@
 
 -}
 minimizeNMSimplex :: ([Double] -> Double) -- ^ function to minimize
@@ -130,7 +130,7 @@
 
 The path to the solution can be graphically shown by means of:
 
-@'GSL.Plot.mplot' $ drop 2 ('toColumns' p)@
+@'Graphics.Plot.mplot' $ drop 2 ('toColumns' p)@
 
 -}     
 minimizeConjugateGradient ::
diff --git a/lib/Numeric/LinearAlgebra/Instances.hs b/lib/Numeric/LinearAlgebra/Instances.hs
--- a/lib/Numeric/LinearAlgebra/Instances.hs
+++ b/lib/Numeric/LinearAlgebra/Instances.hs
@@ -48,6 +48,24 @@
 
 ------------------------------------------------------------------
 
+instance (Element a, Read a) => Read (Matrix a) where
+    readsPrec _ s = [((rows><cols) . read $ listnums, rest)]
+        where (thing,rest) = breakAt ']' s
+              (dims,listnums) = breakAt ')' thing
+              cols = read . init . fst. breakAt ')' . snd . breakAt '<' $ dims
+              rows = read . snd . breakAt '(' .init . fst . breakAt '>' $ dims
+
+instance (Element a, Read a) => Read (Vector a) where
+    readsPrec _ s = [((d |>) . read $ listnums, rest)]
+        where (thing,rest) = breakAt ']' s
+              (dims,listnums) = breakAt '>' thing
+              d = read . init . fst . breakAt '|' $ dims
+
+breakAt c l = (a++[c],tail b) where
+    (a,b) = break (==c) l
+
+------------------------------------------------------------------
+
 adaptScalar f1 f2 f3 x y
     | dim x == 1 = f1   (x@>0) y
     | dim y == 1 = f3 x (y@>0)
diff --git a/lib/Numeric/LinearAlgebra/LAPACK/clapack.h b/lib/Numeric/LinearAlgebra/LAPACK/clapack.h
--- a/lib/Numeric/LinearAlgebra/LAPACK/clapack.h
+++ b/lib/Numeric/LinearAlgebra/LAPACK/clapack.h
@@ -1483,7 +1483,7 @@
 	doublereal *wi, doublereal *z__, integer *ldz, doublereal *work, 
 	integer *lwork, integer *info);
  
-/* Subroutine */ int dlabad_(doublereal *small, doublereal *large);
+/* Subroutine */ int dlabad_(doublereal *smalll, doublereal *large); /* !? */
  
 /* Subroutine */ int dlabrd_(integer *m, integer *n, integer *nb, doublereal *
 	a, integer *lda, doublereal *d__, doublereal *e, doublereal *tauq, 
@@ -2858,7 +2858,7 @@
 	 integer *ihi, real *h__, integer *ldh, real *wr, real *wi, real *z__,
 	 integer *ldz, real *work, integer *lwork, integer *info);
  
-/* Subroutine */ int slabad_(real *small, real *large);
+/* Subroutine */ int slabad_(real *smalll, real *large); /* !? */
  
 /* Subroutine */ int slabrd_(integer *m, integer *n, integer *nb, real *a, 
 	integer *lda, real *d__, real *e, real *tauq, real *taup, real *x, 
diff --git a/lib/Numeric/LinearAlgebra/Tests.hs b/lib/Numeric/LinearAlgebra/Tests.hs
--- a/lib/Numeric/LinearAlgebra/Tests.hs
+++ b/lib/Numeric/LinearAlgebra/Tests.hs
@@ -174,6 +174,11 @@
     test (\u -> sin u ** 2 + cos u ** 2 |~| (1::RM))
     test (\u -> cos u * tan u |~| sin (u::RM))
     test (\u -> (cos u * tan u) |~| sin (u::CM))
+    putStrLn "------ read . show"
+    test (\m -> (m::RM) == read (show m))
+    test (\m -> (m::CM) == read (show m))
+    test (\m -> toRows (m::RM) == read (show (toRows m)))
+    test (\m -> toRows (m::CM) == read (show (toRows m)))
     putStrLn "------ some unit tests"
     runTestTT $ TestList
         [ utest "1E5 rots" rotTest
diff --git a/lib/Numeric/LinearAlgebra/Tests/Properties.hs b/lib/Numeric/LinearAlgebra/Tests/Properties.hs
--- a/lib/Numeric/LinearAlgebra/Tests/Properties.hs
+++ b/lib/Numeric/LinearAlgebra/Tests/Properties.hs
@@ -40,7 +40,10 @@
 import Numeric.LinearAlgebra
 import Numeric.LinearAlgebra.Tests.Instances(Sq(..),Her(..),Rot(..))
 import Test.QuickCheck
+import Debug.Trace
 
+debug x = trace (show x) x
+
 -- relative error
 dist :: (Normed t, Num t) => t -> t -> Double
 dist a b = r
@@ -89,8 +92,9 @@
 
 -----------------------------------------------------
 
-luProp m = m |~| p <> l <> u && det p == s
+luProp m = m |~| p <> l <> u && f (det p) |~| f s
     where (l,u,p,s) = lu m
+          f x = fromList [x]
 
 invProp m = m <> inv m |~| ident (rows m)
 
