diff --git a/CHANGES b/CHANGES
--- a/CHANGES
+++ b/CHANGES
@@ -6,5 +6,9 @@
 		updated to reflect exportation of check from Data.Packed.Development
 		   in hmatrix-0.9.3.0
 
-0.1.03:		
-		added Numeric.GSL.Regression.Linear
+0.1.0.3:		
+		added Numeric.GSL.Fitting.Linear
+
+0.1.0.4:
+		fixed argument types in Numeric.GSL.Fitting.Linear
+		removed redundant imports
diff --git a/configure.hs b/configure.hs
--- a/configure.hs
+++ b/configure.hs
@@ -18,7 +18,7 @@
 -}
 
 import System
-import System.Directory(createDirectoryIfMissing)
+import System.Directory(createDirectoryIfMissing,getCurrentDirectory,getDirectoryContents)
 import Data.List(isPrefixOf, intercalate)
 import Distribution.Simple.LocalBuildInfo
 import Distribution.Simple.Configure
@@ -96,6 +96,12 @@
           cs x   = x
 
 main = do
+    dir <- getCurrentDirectory
+    putStrLn $ "Current directory: " ++ dir
+
+    files <- getDirectoryContents dir
+    mapM_ putStrLn files
+
     putStr "Checking foreign libraries..."
 
     args <- getArgs
diff --git a/hstatistics.cabal b/hstatistics.cabal
--- a/hstatistics.cabal
+++ b/hstatistics.cabal
@@ -1,5 +1,5 @@
 Name:               hstatistics
-Version:            0.1.0.3
+Version:            0.1.0.4
 License:            GPL
 License-file:       LICENSE
 Copyright:          (c) A.V.H. McPhail 2010
diff --git a/lib/Numeric/GSL/Distribution/Continuous.hs b/lib/Numeric/GSL/Distribution/Continuous.hs
--- a/lib/Numeric/GSL/Distribution/Continuous.hs
+++ b/lib/Numeric/GSL/Distribution/Continuous.hs
@@ -36,13 +36,14 @@
 
 --import Numeric.LinearAlgebra.Linear
 
-import Control.Monad(when)
+--import Control.Monad(when)
 
 import Foreign hiding(shift)
-import Foreign.ForeignPtr
+--import Foreign.ForeignPtr
 --import Foreign.Marshal.Alloc(alloca)
-import Foreign.C.Types(CInt,CChar)
-import Foreign.C.String(newCString,peekCString)
+--import Foreign.C.Types(CInt,CChar)
+import Foreign.C.Types(CInt)
+--import Foreign.C.String(newCString,peekCString)
 
 --import GHC.ForeignPtr           (mallocPlainForeignPtrBytes)
 
diff --git a/lib/Numeric/GSL/Distribution/Discrete.hs b/lib/Numeric/GSL/Distribution/Discrete.hs
--- a/lib/Numeric/GSL/Distribution/Discrete.hs
+++ b/lib/Numeric/GSL/Distribution/Discrete.hs
@@ -32,13 +32,14 @@
 
 --import Numeric.LinearAlgebra.Linear
 
-import Control.Monad(when)
+--import Control.Monad(when)
 
 import Foreign hiding(shift)
-import Foreign.ForeignPtr
+--import Foreign.ForeignPtr
 --import Foreign.Marshal.Alloc(alloca)
-import Foreign.C.Types(CInt,CUInt,CChar)
-import Foreign.C.String(newCString,peekCString)
+--import Foreign.C.Types(CInt,CUInt,CChar)
+import Foreign.C.Types(CInt,CUInt)
+--import Foreign.C.String(newCString,peekCString)
 
 --import GHC.ForeignPtr           (mallocPlainForeignPtrBytes)
 
diff --git a/lib/Numeric/GSL/Fitting/Linear.hs b/lib/Numeric/GSL/Fitting/Linear.hs
--- a/lib/Numeric/GSL/Fitting/Linear.hs
+++ b/lib/Numeric/GSL/Fitting/Linear.hs
@@ -14,13 +14,13 @@
 -----------------------------------------------------------------------------
 
 module Numeric.GSL.Fitting.Linear (
-                                   linear, linear_w
+                                   linear, linear_w, linear_est
                              ) where
 
 -----------------------------------------------------------------------------
 
 import Data.Packed.Vector
-import Data.Packed.Matrix
+--import Data.Packed.Matrix
 import Data.Packed.Development
 
 --import Numeric.LinearAlgebra.Linear
@@ -28,7 +28,7 @@
 --import Control.Monad(when)
 
 import Foreign
-import Foreign.ForeignPtr
+--import Foreign.ForeignPtr
 --import Foreign.Marshal.Alloc(alloca)
 import Foreign.C.Types(CInt)
 --import Foreign.C.String(newCString,peekCString)
@@ -45,22 +45,27 @@
 -- | fits the model Y = C X
 linear :: Vector Double    -- ^ x data
        -> Vector Double    -- ^ y data
-       -> (Vector Double,Vector Double,Matrix Double,Matrix Double,Matrix Double,Matrix Double) -- ^ (c_0,c_1,cov_00,cov_01,cov_11,chi_sq)
+       -> (Double,Double,Double,Double,Double,Double) -- ^ (c_0,c_1,cov_00,cov_01,cov_11,chi_sq)
 linear x y = unsafePerformIO $ do
-           let s = dim x
-           c0 <- createVector 1
-           c1 <- createVector 1
-           cov00 <- createMatrix RowMajor s s
-           cov01 <- createMatrix RowMajor s s
-           cov11 <- createMatrix RowMajor s s
-           chi_sq <- createMatrix RowMajor s s
-           app8 fitting_linear vec x vec y vec c0 vec c1 mat cov00 mat cov01 mat cov11 mat chi_sq "linear"
-           return (c0,c1,cov00,cov01,cov11,chi_sq)
+           alloca $ \c0 ->
+               alloca $ \c1 ->
+                   alloca $ \chi_sq -> 
+                       alloca $ \cov00 -> 
+                           alloca $ \cov01 -> 
+                               alloca $ \cov11 -> do
+                                                  app2 (fitting_linear c0 c1 chi_sq cov00 cov01 cov11) vec x vec y "linear"
+                                                  c0' <- peek c0
+                                                  c1' <- peek c1
+                                                  cov00' <- peek cov00
+                                                  cov01' <- peek cov01
+                                                  cov11' <- peek cov11
+                                                  chi_sq' <- peek chi_sq
+                                                  return (c0',c1',cov00',cov01',cov11',chi_sq')
 
 
 -----------------------------------------------------------------------------
 
-foreign import ccall "fitting-aux.h linear" fitting_linear :: CInt -> Ptr Double -> CInt -> Ptr Double -> CInt -> Ptr Double -> CInt -> Ptr Double -> CInt -> CInt -> Ptr Double -> CInt -> CInt -> Ptr Double -> CInt -> CInt -> Ptr Double -> CInt -> CInt -> Ptr Double -> IO CInt
+foreign import ccall "fitting-aux.h linear" fitting_linear :: Ptr Double -> Ptr Double -> Ptr Double -> Ptr Double -> Ptr Double -> Ptr Double -> CInt -> Ptr Double -> CInt -> Ptr Double -> IO CInt
 
 -----------------------------------------------------------------------------
 
@@ -68,21 +73,47 @@
 linear_w :: Vector Double    -- ^ x data
          -> Vector Double    -- ^ x weights
          -> Vector Double    -- ^ y data
-         -> (Vector Double,Vector Double,Matrix Double,Matrix Double,Matrix Double,Matrix Double) -- ^ (c_0,c_1,cov_00,cov_01,cov_11,chi_sq)
+         -> (Double,Double,Double,Double,Double,Double) -- ^ (c_0,c_1,cov_00,cov_01,cov_11,chi_sq)
 linear_w x w y = unsafePerformIO $ do
-             let s = dim x
-             c0 <- createVector 1
-             c1 <- createVector 1
-             cov00 <- createMatrix RowMajor s s
-             cov01 <- createMatrix RowMajor s s
-             cov11 <- createMatrix RowMajor s s
-             chi_sq <- createMatrix RowMajor s s
-             app9 fitting_linear_w vec x vec w vec y vec c0 vec c1 mat cov00 mat cov01 mat cov11 mat chi_sq "linear_w"
-             return (c0,c1,cov00,cov01,cov11,chi_sq)
+             alloca $ \c0 ->
+                 alloca $ \c1 ->
+                     alloca $ \chi_sq ->
+                       alloca $ \cov00 -> 
+                           alloca $ \cov01 -> 
+                               alloca $ \cov11 -> do
+                                                  app3 (fitting_linear_w c0 c1 chi_sq cov00 cov01 cov11) vec x vec w vec y "linear_w"
+                                                  c0' <- peek c0
+                                                  c1' <- peek c1
+                                                  cov00' <- peek cov00
+                                                  cov01' <- peek cov01
+                                                  cov11' <- peek cov11
+                                                  chi_sq' <- peek chi_sq
+                                                  return (c0',c1',cov00',cov01',cov11',chi_sq')
 
+-----------------------------------------------------------------------------
 
+foreign import ccall "fitting-aux.h linear_weighted" fitting_linear_w :: Ptr Double -> Ptr Double -> Ptr Double -> Ptr Double -> Ptr Double -> Ptr Double -> CInt -> Ptr Double -> CInt -> Ptr Double -> CInt -> Ptr Double -> IO CInt
+
 -----------------------------------------------------------------------------
 
-foreign import ccall "fitting-aux.h linear_weighted" fitting_linear_w :: CInt -> Ptr Double -> CInt -> Ptr Double -> CInt -> Ptr Double -> CInt -> Ptr Double -> CInt -> Ptr Double -> CInt -> CInt -> Ptr Double -> CInt -> CInt -> Ptr Double -> CInt -> CInt -> Ptr Double -> CInt -> CInt -> Ptr Double -> IO CInt
+-- | computes the fitted function and standard deviation at the input point
+linear_est :: Double          -- ^ x data point
+           -> Double          -- ^ c0
+           -> Double          -- ^ c1
+           -> Double          -- ^ cov00
+           -> Double          -- ^ cov01
+           -> Double          -- ^ cov11
+           -> (Double,Double) -- ^ (y,error)
+linear_est x c0 c1 cov00 cov01 cov11 = unsafePerformIO $ do
+                                       alloca $ \y ->
+                                           alloca $ \e -> do
+                                               check "linear_est" $ fitting_linear_est x c0 c1 cov00 cov01 cov11 y e
+                                               y' <- peek y
+                                               e' <- peek e
+                                               return (y',e')
+
+-----------------------------------------------------------------------------
+
+foreign import ccall "fitting-aux.h linear_estimate" fitting_linear_est :: Double -> Double -> Double -> Double -> Double -> Double -> Ptr Double -> Ptr Double -> IO CInt
 
 -----------------------------------------------------------------------------
diff --git a/lib/Numeric/GSL/Histogram.hs b/lib/Numeric/GSL/Histogram.hs
--- a/lib/Numeric/GSL/Histogram.hs
+++ b/lib/Numeric/GSL/Histogram.hs
@@ -40,13 +40,14 @@
 
 --import Numeric.LinearAlgebra.Linear
 
-import Control.Monad
+--import Control.Monad
 
 import Foreign hiding(shift)
-import Foreign.ForeignPtr
-import Foreign.Marshal.Alloc(alloca)
+--import Foreign.ForeignPtr
+--import Foreign.Marshal.Alloc(alloca)
 import Foreign.C.Types(CInt,CChar)
-import Foreign.C.String(newCString,peekCString)
+--import Foreign.C.String(newCString,peekCString)
+import Foreign.C.String(newCString)
 --import Control.Monad(when)
 
 --import GHC.ForeignPtr           (mallocPlainForeignPtrBytes)
@@ -108,7 +109,7 @@
 fromLimitsIO n (l,u) = do
                          h <- histogram_new (fromIntegral n)
                          h' <- newForeignPtr histogram_free h
-                         withForeignPtr h' (\f -> histogram_set_ranges_uniform f l u)
+                         check "set_ranges_uniform" $ withForeignPtr h' (\f -> histogram_set_ranges_uniform f l u)
                          return $ H n h'
 
 foreign import ccall "gsl-histogram.h gsl_histogram_set_ranges" histogram_set_ranges :: HistHandle -> CInt -> Ptr Double -> IO CInt
@@ -190,9 +191,7 @@
 
 -- | add 1.0 to the correct bin, fails silently if the value is outside the range
 incrementIO :: Histogram -> Double -> IO ()
-incrementIO (H _ h) x = do
-                       withForeignPtr h (\f -> histogram_increment f x)
-                       return ()
+incrementIO (H _ h) x = withForeignPtr h (\f -> check "increment" $ histogram_increment f x)
 
 -- | add 1.0 to the correct bin for each element of the vector, fails silently if the value is outside the range
 incrementListIO :: Histogram -> [Double] -> IO ()
@@ -206,9 +205,7 @@
 
 -- | adds the weight (second Double) to the bin appropriate for the value (first Double)
 accumulateIO :: Histogram -> Double -> Double -> IO ()
-accumulateIO (H _ h) x w = do
-                           withForeignPtr h (\f -> histogram_accumulate f x w)
-                           return ()
+accumulateIO (H _ h) x w = withForeignPtr h (\f -> check "accumulate" $ histogram_accumulate f x w)
 
 -- | add the weight (snd) to the correct bin for each (fst) element of the list, fails silently if the value is outside the range
 accumulateListIO :: Histogram -> [(Double,Double)] -> IO ()
@@ -232,7 +229,7 @@
 getRange (H _ h) b = unsafePerformIO $ do
                    alloca $ \l ->
                        alloca $ \u -> do
-                       withForeignPtr h (\f -> histogram_get_range f (fromIntegral b) l u)
+                       check "get_range" $ withForeignPtr h (\f -> histogram_get_range f (fromIntegral b) l u)
                        l' <- peek l
                        u' <- peek u
                        return (l',u')
@@ -251,9 +248,7 @@
 
 -- | reset all the bins to zero
 reset :: Histogram -> IO ()
-reset (H _ h) = do
-                 withForeignPtr h histogram_reset
-                 return ()
+reset (H _ h) = withForeignPtr h histogram_reset
 
 foreign import ccall "gsl-histogram.h gsl_histogram_increment" histogram_increment :: HistHandle -> Double -> IO CInt
 foreign import ccall "gsl-histogram.h gsl_histogram_accumulate" histogram_accumulate :: HistHandle -> Double -> Double -> IO CInt
@@ -458,7 +453,7 @@
                         p <- histogram_pdf_new $ fromIntegral b 
                         p' <- newForeignPtr histogram_pdf_free p
                         withForeignPtr p' $ \p'' -> 
-                            withForeignPtr h $ \h' -> histogram_pdf_init p'' h'
+                            withForeignPtr h $ \h' -> check "pdf_init" $ histogram_pdf_init p'' h'
                         return $ P p'
 
 -- | given a randomm from the uniform distribution [0,1], draw a random sample from the PDF
diff --git a/lib/Numeric/GSL/Histogram2D.hs b/lib/Numeric/GSL/Histogram2D.hs
--- a/lib/Numeric/GSL/Histogram2D.hs
+++ b/lib/Numeric/GSL/Histogram2D.hs
@@ -41,14 +41,15 @@
 
 --import Numeric.LinearAlgebra.Linear
 
-import Control.Monad
+--import Control.Monad
+--import Control.Monad(when)
 
 import Foreign hiding(shift)
-import Foreign.ForeignPtr
-import Foreign.Marshal.Alloc(alloca)
+--import Foreign.ForeignPtr
+--import Foreign.Marshal.Alloc(alloca)
 import Foreign.C.Types(CInt,CChar)
-import Foreign.C.String(newCString,peekCString)
---import Control.Monad(when)
+--import Foreign.C.String(newCString,peekCString)
+import Foreign.C.String(newCString)
 
 --import GHC.ForeignPtr           (mallocPlainForeignPtrBytes)
 
@@ -114,7 +115,7 @@
 fromLimitsIO nx ny (lx,ux) (uy,ly) = do
                                    h <- histogram2d_new (fromIntegral nx) (fromIntegral ny)
                                    h' <- newForeignPtr histogram2d_free h
-                                   withForeignPtr h' (\f -> histogram2d_set_ranges_uniform f lx ux ly uy)
+                                   check "set_ranges_uniform" $ withForeignPtr h' (\f -> histogram2d_set_ranges_uniform f lx ux ly uy)
                                    return $ H nx ny h'
 
 foreign import ccall "gsl-histogram2d.h gsl_histogram2d_set_ranges" histogram2d_set_ranges :: Hist2DHandle -> Ptr Double -> CInt -> Ptr Double -> CInt -> IO CInt
@@ -203,7 +204,7 @@
 -- | add 1.0 to the correct bin, fails silently if the value is outside the range
 incrementIO :: Histogram2D -> Double -> Double -> IO ()
 incrementIO (H _ _ h) x y = do
-                            withForeignPtr h (\f -> histogram2d_increment f x y)
+                            check "increment" $ withForeignPtr h (\f -> histogram2d_increment f x y)
                             return ()
 
 -- | add 1.0 to the correct bin for each element of the vector pair, fails silently if the value is outside the range
@@ -219,7 +220,7 @@
 -- | Adds the weight (third Double) to the bin appropriate for the value (first two Doubles)
 accumulateIO :: Histogram2D -> Double -> Double -> Double -> IO ()
 accumulateIO (H _ _ h) x y w = do
-                               withForeignPtr h (\f -> histogram2d_accumulate f x y w)
+                               check "accumulate" $ withForeignPtr h (\f -> histogram2d_accumulate f x y w)
                                return ()
 
 -- | add the weight (third) to the correct bin for each vector pair element, fails silently if the value is outside the range
@@ -242,7 +243,7 @@
 getXRange (H _ _ h) b = unsafePerformIO $ do
                         alloca $ \l ->
                             alloca $ \u -> do
-                            withForeignPtr h (\f -> histogram2d_get_xrange f (fromIntegral b) l u)
+                            check "get_xrange" $ withForeignPtr h (\f -> histogram2d_get_xrange f (fromIntegral b) l u)
                             l' <- peek l
                             u' <- peek u
                             return (l',u')
@@ -252,7 +253,7 @@
 getYRange (H _ _ h) b = unsafePerformIO $ do
                         alloca $ \l ->
                             alloca $ \u -> do
-                            withForeignPtr h (\f -> histogram2d_get_yrange f (fromIntegral b) l u)
+                            check "get_yrange" $ withForeignPtr h (\f -> histogram2d_get_yrange f (fromIntegral b) l u)
                             l' <- peek l
                             u' <- peek u
                             return (l',u')
@@ -283,9 +284,7 @@
 
 -- | reset all the bins to zero
 reset :: Histogram2D -> IO ()
-reset (H _ _ h) = do
-                 withForeignPtr h histogram2d_reset
-                 return ()
+reset (H _ _ h) = withForeignPtr h histogram2d_reset
 
 foreign import ccall "gsl-histogram2d.h gsl_histogram2d_increment" histogram2d_increment :: Hist2DHandle -> Double -> Double -> IO CInt
 foreign import ccall "gsl-histogram2d.h gsl_histogram2d_accumulate" histogram2d_accumulate :: Hist2DHandle -> Double -> Double -> Double -> IO CInt
@@ -520,7 +519,7 @@
                               p' <- newForeignPtr histogram2d_pdf_free p
                               withForeignPtr p' $ \p'' -> 
                                   withForeignPtr h $ \h' -> do
-                                                histogram2d_pdf_init p'' h'
+                                                check "pdf_init" $ histogram2d_pdf_init p'' h'
                                                 return $ P p'
 
 -- | given a randomm from the uniform distribution [0,1], draw a random sample from the PDF
diff --git a/lib/Numeric/GSL/Permutation.hs b/lib/Numeric/GSL/Permutation.hs
--- a/lib/Numeric/GSL/Permutation.hs
+++ b/lib/Numeric/GSL/Permutation.hs
@@ -37,13 +37,14 @@
 
 --import Numeric.LinearAlgebra.Linear
 
-import Control.Monad(when)
+--import Control.Monad(when)
 
 import Foreign hiding(shift)
-import Foreign.ForeignPtr
+--import Foreign.ForeignPtr
 --import Foreign.Marshal.Alloc(alloca)
 import Foreign.C.Types(CInt,CChar)
-import Foreign.C.String(newCString,peekCString)
+--import Foreign.C.String(newCString,peekCString)
+import Foreign.C.String(newCString)
 
 --import GHC.ForeignPtr           (mallocPlainForeignPtrBytes)
 
diff --git a/lib/Numeric/GSL/Statistics.hs b/lib/Numeric/GSL/Statistics.hs
--- a/lib/Numeric/GSL/Statistics.hs
+++ b/lib/Numeric/GSL/Statistics.hs
@@ -50,7 +50,7 @@
 
 import Foreign
 import Foreign.C.Types(CInt)
-import Foreign.Marshal.Alloc(alloca)
+--import Foreign.Marshal.Alloc(alloca)
 
 -----------------------------------------------------------------------------
 
diff --git a/lib/Numeric/GSL/fitting-aux.c b/lib/Numeric/GSL/fitting-aux.c
--- a/lib/Numeric/GSL/fitting-aux.c
+++ b/lib/Numeric/GSL/fitting-aux.c
@@ -1,28 +1,29 @@
 #include <gsl/gsl_fit.h>
 
-int linear(int xs, const double* x, int ys, const double* y,
-	   int c0s, double* c0, int c1s, double* c1,
-	   int cov00x, int cov00y, double* cov00,
-	   int cov01x, int cov01y, double* cov01,
-	   int cov11x, int cov11y, double* cov11,
-	   int chi_sqx, int chi_sqy, double* chi_sq)
+int linear(double* c0, double* c1, double* chi_sq,
+	   double* cov00, double* cov01, double* cov11,
+	   int xs, const double* x, int ys, const double* y)
 {
-  if (xs != ys || xs != c0s || xs != c1s) return 2000; //BAD_SIZE
+  if (xs != ys) return 2000; //BAD_SIZE
   
   return gsl_fit_linear(x,1,y,1,xs,c0,c1,cov00,cov01,cov11,chi_sq);
 }
 
-int linear_weighted(int xs, const double* x, int ws, const double * w, 
-		    int ys, const double* y,
-		    int c0s, double* c0, int c1s, double* c1,
-		    int cov00x, int cov00y, double* cov00,
-		    int cov01x, int cov01y, double* cov01,
-		    int cov11x, int cov11y, double* cov11,
-		    int chi_sqx, int chi_sqy, double* chi_sq)
+int linear_weighted(double* c0, double* c1, double* chi_sq,
+		    double* cov00, double* cov01, double* cov11,
+		    int xs, const double* x, 
+		    int ws, const double * w, 
+		    int ys, const double* y)
 {
-  if (xs != ys || xs != ws || xs != c0s || xs != c1s) return 2000; //BAD_SIZE
+  if (xs != ys || xs != ws) return 2000; //BAD_SIZE
   
   return gsl_fit_wlinear(x,1,w,1,y,1,xs,c0,c1,cov00,cov01,cov11,chi_sq);
 }
 
 
+int linear_estimate(double x, double c0, double c1, 
+		    double cov00, double cov01, double cov11,
+		    double* y, double* e)
+{
+  return gsl_fit_linear_est(x,c0,c1,cov00,cov01,cov11,y,e);
+}
