diff --git a/Config.hs b/Config.hs
--- a/Config.hs
+++ b/Config.hs
@@ -48,20 +48,20 @@
 
 -- compile, discarding error messages
 compile cmd = do
-    let processRecord = (shell $ join cmd) { std_out = CreatePipe
+    let processRecord = (shell $ unwords cmd) { std_out = CreatePipe
                                            , std_err = CreatePipe }
     ( _, _, _, h) <- createProcess processRecord
     waitForProcess h
 
 -- command to compile the test program
 compileCmd bInfo buildInfo = [ "gcc "
-                             , (join $ ccOptions buildInfo)  
-                             , (join $ cppOptions buildInfo) 
-                             , (join $ map ("-I"++) $ includeDirs buildInfo) 
+                             , (unwords $ ccOptions buildInfo)  
+                             , (unwords $ cppOptions buildInfo) 
+                             , (unwords $ map ("-I"++) $ includeDirs buildInfo) 
                              , testProgLoc bInfo
                              , "-o"
                              , testOutLoc bInfo 
-                             , (join $ map ("-L"++) $ extraLibDirs buildInfo) 
+                             , (unwords $ map ("-L"++) $ extraLibDirs buildInfo) 
                              ]
  
 -- compile a simple program with symbols from GSL and LAPACK with the given libs
@@ -72,7 +72,6 @@
                             ++ [ (prepend "-l" $ libs)
                                , (prepend "-framework " fmks) ] 
 
-join = intercalate " "
 prepend x = unwords . map (x++) . words
 
 check bInfo buildInfo libs fmks = (ExitSuccess ==) `fmap` testprog bInfo buildInfo libs fmks
diff --git a/INSTALL.md b/INSTALL.md
--- a/INSTALL.md
+++ b/INSTALL.md
@@ -21,12 +21,19 @@
 ## Mac OS/X ###############################################
 
 
-GSL must be installed via MacPorts:
+GSL must be installed via Homebrew or MacPorts.
 
+Via Homebrew:
+
+    $ brew install gsl
+    $ cabal install hmatrix
+
+Via MacPorts:
+
     $ sudo port install gsl +universal
     $ cabal install hmatrix
 
-(Contributed by Heinrich Apfelmus and Torsten Kemps-Benedix).
+(Contributed by Heinrich Apfelmus, Torsten Kemps-Benedix and Ted Fujimoto).
 
 ## Windows ###############################################
 
diff --git a/THANKS.md b/THANKS.md
--- a/THANKS.md
+++ b/THANKS.md
@@ -141,3 +141,15 @@
 
 - Henning Thielemann reported the pinv inefficient implementation.
 
+- bdoering reported the problem of zero absolute tolerance in the integration functions.
+
+- Alexei Uimanov replaced fromList by Vector.fromList.
+
+- Adam Vogt updated the code for ghc-7.7
+
+- Mike Meyer (mwm) added freeBSD library configuration information.
+
+- tfgit updated the OSX installation instructions via Homebrew
+
+
+
diff --git a/hmatrix.cabal b/hmatrix.cabal
--- a/hmatrix.cabal
+++ b/hmatrix.cabal
@@ -1,5 +1,5 @@
 Name:               hmatrix
-Version:            0.15.2.0
+Version:            0.15.2.1
 License:            GPL
 License-file:       LICENSE
 Author:             Alberto Ruiz
@@ -21,7 +21,7 @@
                     .
                     - "Numeric.LinearAlgebra": everything + instances of standard Haskell numeric classes
 Category:           Math
-tested-with:        GHC ==7.6
+tested-with:        GHC ==7.8
 
 cabal-version:      >=1.8
 
@@ -185,6 +185,11 @@
         if arch(i386)
             cc-options: -arch i386
         frameworks: Accelerate
+
+    if os(freebsd)
+       extra-lib-dirs: /usr/local/lib
+       include-dirs: /usr/local/include
+       extra-libraries: gsl blas lapack
 
     if os(windows)
         extra-libraries: gsl-0 blas lapack
diff --git a/lib/Data/Packed/Internal/Matrix.hs b/lib/Data/Packed/Internal/Matrix.hs
--- a/lib/Data/Packed/Internal/Matrix.hs
+++ b/lib/Data/Packed/Internal/Matrix.hs
@@ -154,7 +154,7 @@
 fromRows :: Element t => [Vector t] -> Matrix t
 fromRows vs = case compatdim (map dim vs) of
     Nothing -> error "fromRows applied to [] or to vectors with different sizes"
-    Just c  -> reshape c . join . map (adapt c) $ vs
+    Just c  -> reshape c . Data.Packed.Internal.Vector.join . map (adapt c) $ vs
   where
     adapt c v | dim v == c = v
               | otherwise = constantD (v@>0) c
diff --git a/lib/Data/Packed/Internal/Vector.hs b/lib/Data/Packed/Internal/Vector.hs
--- a/lib/Data/Packed/Internal/Vector.hs
+++ b/lib/Data/Packed/Internal/Vector.hs
@@ -16,7 +16,7 @@
 module Data.Packed.Internal.Vector (
     Vector, dim,
     fromList, toList, (|>),
-    join, (@>), safe, at, at', subVector, takesV,
+    Data.Packed.Internal.Vector.join, (@>), safe, at, at', subVector, takesV,
     mapVector, mapVectorWithIndex, zipVectorWith, unzipVectorWith,
     mapVectorM, mapVectorM_, mapVectorWithIndexM, mapVectorWithIndexM_,
     foldVector, foldVectorG, foldLoop, foldVectorWithIndex,
@@ -34,7 +34,7 @@
 import Data.Packed.Internal.Common
 import Data.Packed.Internal.Signatures
 import Foreign.Marshal.Alloc(free)
-import Foreign.Marshal.Array(peekArray, pokeArray, copyArray, advancePtr)
+import Foreign.Marshal.Array(peekArray, copyArray, advancePtr)
 import Foreign.ForeignPtr(ForeignPtr, castForeignPtr)
 import Foreign.Ptr(Ptr)
 import Foreign.Storable(Storable, peekElemOff, pokeElemOff, sizeOf)
@@ -57,6 +57,7 @@
 
 import qualified Data.Vector.Storable as Vector
 import Data.Vector.Storable(Vector,
+                            fromList,
                             unsafeToForeignPtr,
                             unsafeFromForeignPtr,
                             unsafeWith)
@@ -102,11 +103,6 @@
 4 |> [2.0,3.0,5.0,7.0]@
 
 -}
-fromList :: Storable a => [a] -> Vector a
-fromList l = unsafePerformIO $ do
-    v <- createVector (length l)
-    unsafeWith v $ \ p -> pokeArray p l
-    return v
 
 safeRead v = inlinePerformIO . unsafeWith v
 {-# INLINE safeRead #-}
diff --git a/lib/Numeric/ContainerBoot.hs b/lib/Numeric/ContainerBoot.hs
--- a/lib/Numeric/ContainerBoot.hs
+++ b/lib/Numeric/ContainerBoot.hs
@@ -510,20 +510,40 @@
 class Build f where
     build' :: BoundsOf f -> f -> ContainerOf f
 
-type family BoundsOf x
 
+#if MIN_VERSION_base(4,7,0)
+-- ghc >= 7.7 considers:
+--
+-- > a -> a
+-- > b -> b -> b
+--
+-- to overlap
+type family BoundsOf x where
+    BoundsOf (a -> a) = Int
+    BoundsOf (a->a->a) = (Int,Int)
+type family ContainerOf x where
+    ContainerOf (a->a) = Vector a
+    ContainerOf (a->a->a) = Matrix a
+#else
+type family BoundsOf x
+type family ContainerOf x
 type instance BoundsOf (a->a) = Int
 type instance BoundsOf (a->a->a) = (Int,Int)
-
-type family ContainerOf x
-
 type instance ContainerOf (a->a) = Vector a
 type instance ContainerOf (a->a->a) = Matrix a
+#endif
 
+
 instance (Element a, Num a) => Build (a->a) where
     build' = buildV
 
-instance (Element a, Num a) => Build (a->a->a) where
+instance (Element a,
+#if MIN_VERSION_base(4,7,0)
+        BoundsOf (a -> a -> a) ~ (Int,Int),
+        ContainerOf (a -> a -> a) ~ Matrix a,
+#endif
+        Num a)
+        => Build (a->a->a) where
     build' = buildM
 
 buildM (rc,cc) f = fromLists [ [f r c | c <- cs] | r <- rs ]
diff --git a/lib/Numeric/GSL/Integration.hs b/lib/Numeric/GSL/Integration.hs
--- a/lib/Numeric/GSL/Integration.hs
+++ b/lib/Numeric/GSL/Integration.hs
@@ -31,6 +31,8 @@
 import Data.Packed.Internal(check,(//))
 import System.IO.Unsafe(unsafePerformIO)
 
+eps = 1e-12
+
 {- | conversion of Haskell functions into function pointers that can be used in the C side
 -}
 foreign import ccall safe "wrapper" mkfun:: (Double -> Ptr() -> Double) -> IO( FunPtr (Double -> Ptr() -> Double)) 
@@ -55,7 +57,7 @@
     r <- malloc
     e <- malloc
     fp <- mkfun (\x _ -> f x) 
-    c_integrate_qags fp a b prec (fromIntegral n) r e // check "integrate_qags"
+    c_integrate_qags fp a b eps prec (fromIntegral n) r e // check "integrate_qags"
     vr <- peek r
     ve <- peek e
     let result = (vr,ve)
@@ -64,9 +66,9 @@
     freeHaskellFunPtr fp
     return result
 
-foreign import ccall safe "gsl-aux.h integrate_qags" 
- c_integrate_qags :: FunPtr (Double-> Ptr() -> Double) -> Double -> Double -> Double -> CInt
-                     -> Ptr Double -> Ptr Double -> IO CInt
+foreign import ccall safe "integrate_qags" c_integrate_qags
+    :: FunPtr (Double-> Ptr() -> Double) -> Double -> Double
+    -> Double -> Double -> CInt -> Ptr Double -> Ptr Double -> IO CInt
 
 -----------------------------------------------------------------
 {- | Numerical integration using /gsl_integration_qng/ (useful for fast integration of smooth functions). For example:
@@ -86,7 +88,7 @@
     r <- malloc
     e <- malloc
     fp <- mkfun (\x _ -> f x) 
-    c_integrate_qng fp a b prec r e  // check "integrate_qng"
+    c_integrate_qng fp a b eps prec r e  // check "integrate_qng"
     vr <- peek r
     ve <- peek e
     let result = (vr,ve)
@@ -95,9 +97,9 @@
     freeHaskellFunPtr fp
     return result
 
-foreign import ccall safe "gsl-aux.h integrate_qng" 
- c_integrate_qng :: FunPtr (Double-> Ptr() -> Double) -> Double -> Double -> Double 
-                    -> Ptr Double -> Ptr Double -> IO CInt
+foreign import ccall safe "integrate_qng" c_integrate_qng
+    :: FunPtr (Double-> Ptr() -> Double) -> Double -> Double
+    -> Double -> Double -> Ptr Double -> Ptr Double -> IO CInt
 
 --------------------------------------------------------------------
 {- | Numerical integration using /gsl_integration_qagi/ (integration over the infinite integral -Inf..Inf using QAGS). 
@@ -118,7 +120,7 @@
     r <- malloc
     e <- malloc
     fp <- mkfun (\x _ -> f x) 
-    c_integrate_qagi fp prec (fromIntegral n) r e // check "integrate_qagi"
+    c_integrate_qagi fp eps prec (fromIntegral n) r e // check "integrate_qagi"
     vr <- peek r
     ve <- peek e
     let result = (vr,ve)
@@ -127,9 +129,9 @@
     freeHaskellFunPtr fp
     return result
 
-foreign import ccall safe "gsl-aux.h integrate_qagi" 
- c_integrate_qagi :: FunPtr (Double-> Ptr() -> Double) -> Double -> CInt
-                     -> Ptr Double -> Ptr Double -> IO CInt
+foreign import ccall safe "integrate_qagi" c_integrate_qagi
+    :: FunPtr (Double-> Ptr() -> Double) -> Double -> Double
+    -> CInt -> Ptr Double -> Ptr Double -> IO CInt
 
 --------------------------------------------------------------------
 {- | Numerical integration using /gsl_integration_qagiu/ (integration over the semi-infinite integral a..Inf). 
@@ -151,7 +153,7 @@
     r <- malloc
     e <- malloc
     fp <- mkfun (\x _ -> f x) 
-    c_integrate_qagiu fp a prec (fromIntegral n) r e // check "integrate_qagiu"
+    c_integrate_qagiu fp a eps prec (fromIntegral n) r e // check "integrate_qagiu"
     vr <- peek r
     ve <- peek e
     let result = (vr,ve)
@@ -160,9 +162,9 @@
     freeHaskellFunPtr fp
     return result
 
-foreign import ccall safe "gsl-aux.h integrate_qagiu" 
- c_integrate_qagiu :: FunPtr (Double-> Ptr() -> Double) -> Double -> Double -> CInt
-                     -> Ptr Double -> Ptr Double -> IO CInt
+foreign import ccall safe "integrate_qagiu" c_integrate_qagiu
+    :: FunPtr (Double-> Ptr() -> Double) -> Double -> Double
+    -> Double -> CInt -> Ptr Double -> Ptr Double -> IO CInt
 
 --------------------------------------------------------------------
 {- | Numerical integration using /gsl_integration_qagil/ (integration over the semi-infinite integral -Inf..b). 
@@ -184,7 +186,7 @@
     r <- malloc
     e <- malloc
     fp <- mkfun (\x _ -> f x) 
-    c_integrate_qagil fp b prec (fromIntegral n) r e // check "integrate_qagil"
+    c_integrate_qagil fp b eps prec (fromIntegral n) r e // check "integrate_qagil"
     vr <- peek r
     ve <- peek e
     let result = (vr,ve)
@@ -193,9 +195,9 @@
     freeHaskellFunPtr fp
     return result
 
-foreign import ccall safe "gsl-aux.h integrate_qagil" 
- c_integrate_qagil :: FunPtr (Double-> Ptr() -> Double) -> Double -> Double -> CInt
-                     -> Ptr Double -> Ptr Double -> IO CInt
+foreign import ccall safe "gsl-aux.h integrate_qagil" c_integrate_qagil
+    :: FunPtr (Double-> Ptr() -> Double) -> Double -> Double
+    -> Double -> CInt -> Ptr Double -> Ptr Double -> IO CInt
 
 
 --------------------------------------------------------------------
@@ -231,7 +233,7 @@
     e <- malloc
     neval <- malloc
     fp <- mkfun (\x _ -> f x)
-    c_integrate_cquad fp a b prec (fromIntegral n) r e neval // check "integrate_cquad"
+    c_integrate_cquad fp a b eps prec (fromIntegral n) r e neval // check "integrate_cquad"
     vr <- peek r
     ve <- peek e
     vneval <- peek neval
@@ -242,6 +244,7 @@
     freeHaskellFunPtr fp
     return result
 
-foreign import ccall safe "gsl-aux.h integrate_cquad" 
- c_integrate_cquad :: FunPtr (Double-> Ptr() -> Double) -> Double -> Double -> Double -> CInt
-                     -> Ptr Double -> Ptr Double -> Ptr Int -> IO CInt
+foreign import ccall safe "integrate_cquad" c_integrate_cquad
+    :: FunPtr (Double-> Ptr() -> Double) -> Double -> Double
+    -> Double -> Double -> CInt -> Ptr Double -> Ptr Double -> Ptr Int -> IO CInt
+
diff --git a/lib/Numeric/GSL/gsl-aux.c b/lib/Numeric/GSL/gsl-aux.c
--- a/lib/Numeric/GSL/gsl-aux.c
+++ b/lib/Numeric/GSL/gsl-aux.c
@@ -737,80 +737,80 @@
 }
 
 
-int integrate_qng(double f(double, void*), double a, double b, double prec,
+int integrate_qng(double f(double, void*), double a, double b, double aprec, double prec,
                    double *result, double*error) {
     DEBUGMSG("integrate_qng");
     gsl_function F;
     F.function = f;
     F.params = NULL;
     size_t neval;
-    int res = gsl_integration_qng (&F, a,b, 0, prec, result, error, &neval); 
+    int res = gsl_integration_qng (&F, a,b, aprec, prec, result, error, &neval);
     CHECK(res,res);
     OK
 }
 
-int integrate_qags(double f(double,void*), double a, double b, double prec, int w, 
+int integrate_qags(double f(double,void*), double a, double b, double aprec, double prec, int w,
                double *result, double* error) {
     DEBUGMSG("integrate_qags");
     gsl_integration_workspace * wk = gsl_integration_workspace_alloc (w);
     gsl_function F;
     F.function = f;
     F.params = NULL;
-    int res = gsl_integration_qags (&F, a,b, 0, prec, w,wk, result, error); 
+    int res = gsl_integration_qags (&F, a,b, aprec, prec, w,wk, result, error);
     CHECK(res,res);
     gsl_integration_workspace_free (wk); 
     OK
 }
 
-int integrate_qagi(double f(double,void*), double prec, int w, 
+int integrate_qagi(double f(double,void*), double aprec, double prec, int w,
                double *result, double* error) {
     DEBUGMSG("integrate_qagi");
     gsl_integration_workspace * wk = gsl_integration_workspace_alloc (w);
     gsl_function F;
     F.function = f;
     F.params = NULL;
-    int res = gsl_integration_qagi (&F, 0, prec, w,wk, result, error); 
+    int res = gsl_integration_qagi (&F, aprec, prec, w,wk, result, error);
     CHECK(res,res);
     gsl_integration_workspace_free (wk); 
     OK
 }
 
 
-int integrate_qagiu(double f(double,void*), double a, double prec, int w, 
+int integrate_qagiu(double f(double,void*), double a, double aprec, double prec, int w,
                double *result, double* error) {
     DEBUGMSG("integrate_qagiu");
     gsl_integration_workspace * wk = gsl_integration_workspace_alloc (w);
     gsl_function F;
     F.function = f;
     F.params = NULL;
-    int res = gsl_integration_qagiu (&F, a, 0, prec, w,wk, result, error); 
+    int res = gsl_integration_qagiu (&F, a, aprec, prec, w,wk, result, error);
     CHECK(res,res);
     gsl_integration_workspace_free (wk); 
     OK
 }
 
 
-int integrate_qagil(double f(double,void*), double b, double prec, int w, 
+int integrate_qagil(double f(double,void*), double b, double aprec, double prec, int w,
                double *result, double* error) {
     DEBUGMSG("integrate_qagil");
     gsl_integration_workspace * wk = gsl_integration_workspace_alloc (w);
     gsl_function F;
     F.function = f;
     F.params = NULL;
-    int res = gsl_integration_qagil (&F, b, 0, prec, w,wk, result, error); 
+    int res = gsl_integration_qagil (&F, b, aprec, prec, w,wk, result, error);
     CHECK(res,res);
     gsl_integration_workspace_free (wk); 
     OK
 }
 
-int integrate_cquad(double f(double,void*), double a, double b, double prec,
+int integrate_cquad(double f(double,void*), double a, double b, double aprec, double prec,
                     int w, double *result, double* error, int *neval) {
     DEBUGMSG("integrate_cquad");
     gsl_integration_cquad_workspace * wk = gsl_integration_cquad_workspace_alloc (w);
     gsl_function F;
     F.function = f;
     F.params = NULL;
-    int res = gsl_integration_cquad (&F, a, b, 0, prec, wk, result, error, neval); 
+    int res = gsl_integration_cquad (&F, a, b, aprec, prec, wk, result, error, neval);
     CHECK(res,res);
     gsl_integration_cquad_workspace_free (wk); 
     OK
diff --git a/lib/Numeric/LinearAlgebra/Util.hs b/lib/Numeric/LinearAlgebra/Util.hs
--- a/lib/Numeric/LinearAlgebra/Util.hs
+++ b/lib/Numeric/LinearAlgebra/Util.hs
@@ -97,7 +97,7 @@
 -- | concatenation of real vectors
 infixl 3 &
 (&) :: Vector Double -> Vector Double -> Vector Double
-a & b = join [a,b]
+a & b = Numeric.Container.join [a,b]
 
 -- | horizontal concatenation of real matrices
 infixl 3 !
@@ -206,7 +206,7 @@
 
 vech :: Element t => Matrix t -> Vector t
 -- ^ half-vectorization (of the lower triangular part)
-vech m = join . zipWith f [0..] . toColumns $ m
+vech m = Numeric.Container.join . zipWith f [0..] . toColumns $ m
   where
     f k v = subVector k (dim v - k) v
 
