diff --git a/Numeric/LBFGS.hs b/Numeric/LBFGS.hs
--- a/Numeric/LBFGS.hs
+++ b/Numeric/LBFGS.hs
@@ -15,10 +15,12 @@
 -- <http://www.chokkan.org/software/liblbfgs/>
 
 module Numeric.LBFGS (LineSearchAlgorithm(..), EvaluateFun,
-                      ProgressFun, LBFGSResult, lbfgs) where
+                      ProgressFun, LBFGSParameters(..), LBFGSResult(..),
+                      lbfgs) where
 
-import Data.Array.Storable (StorableArray,
-                            unsafeForeignPtrToStorableArray)
+import Data.Array.Storable (StorableArray)
+import Data.Array.Unsafe (unsafeForeignPtrToStorableArray)
+import Data.Maybe
 import Foreign.C.Types (CDouble, CInt)
 import Foreign.ForeignPtr (newForeignPtr_)
 import Foreign.Marshal.Alloc (malloc, free)
@@ -36,6 +38,18 @@
                          )
 
 -- |
+-- Parameters for the LBFGS minimization.
+data LBFGSParameters = LBFGSParameters {
+      lbfgsPast              :: Maybe Int,
+      lbfgsDelta             :: Double,
+      lbfgsLineSearch        :: LineSearchAlgorithm,
+      lbfgsL1NormCoefficient :: L1NormCoefficient
+}
+
+-- | Coefficient for the L1 norm of variables.
+type L1NormCoefficient = Maybe Double
+
+-- |
 -- Various line search algorithms. Wolfe backtracking algorithms require
 -- a coefficient.
 data LineSearchAlgorithm = DefaultLineSearch
@@ -45,28 +59,47 @@
                          | BacktrackingWolfe       {coeff :: Double }
                          | BacktrackingStrongWolfe {coeff :: Double }
 
-mergeLineSearchAlgorithm :: CLBFGSParameter -> LineSearchAlgorithm ->
+mergeLineSearchAlgorithm :: LineSearchAlgorithm -> CLBFGSParameter ->
                             CLBFGSParameter
-mergeLineSearchAlgorithm p DefaultLineSearch =
+mergeLineSearchAlgorithm DefaultLineSearch p =
     p {R.linesearch = R.defaultLineSearch}
-mergeLineSearchAlgorithm p MoreThuente =
+mergeLineSearchAlgorithm MoreThuente p =
     p { R.linesearch = R.moreThuente }
-mergeLineSearchAlgorithm p BacktrackingArmijo =
+mergeLineSearchAlgorithm BacktrackingArmijo p =
     p { R.linesearch = R.backtrackingArmijo }
-mergeLineSearchAlgorithm p Backtracking =
+mergeLineSearchAlgorithm Backtracking p =
     p { R.linesearch = R.backtracking }
-mergeLineSearchAlgorithm p (BacktrackingWolfe c) =
+mergeLineSearchAlgorithm (BacktrackingWolfe c) p =
     p { R.linesearch = R.backtrackingWolfe,
         R.wolfe      = realToFrac c }
-mergeLineSearchAlgorithm p (BacktrackingStrongWolfe c) =
+mergeLineSearchAlgorithm (BacktrackingStrongWolfe c) p =
     p { R.linesearch = R.backtrackingStrongWolfe,
         R.wolfe      = realToFrac c }
 
-withParam :: LineSearchAlgorithm -> CLBFGSParameter
-withParam lineSearch =
-    mergeLineSearchAlgorithm defaultCParam lineSearch
+mergeL1NormCoefficient :: L1NormCoefficient -> CInt -> CLBFGSParameter ->
+                          CLBFGSParameter
+mergeL1NormCoefficient Nothing _ p = p
+mergeL1NormCoefficient (Just l1) n p =
+    p { R.linesearch        = R.backtracking,
+        R.orthantwise_c     = realToFrac l1,
+        R.orthantwise_start = 0,
+        R.orthantwise_end   = n - 1 }
 
+mergePast :: Maybe Int -> Double -> CLBFGSParameter -> CLBFGSParameter
+mergePast Nothing           delta p = p { R.past = 0 }
+mergePast (Just iterations) delta p = p {
+                                        R.past  = fromIntegral iterations,
+                                        R.delta = realToFrac delta
+                                      }
 
+withParam :: LBFGSParameters -> CInt -> CLBFGSParameter
+withParam (LBFGSParameters past delta lineSearch l1NormCoeff) n =
+    mergeL1NormCoefficient l1NormCoeff n $ (mergeLineSearchAlgorithm lineSearch)
+                           $ mergePast past delta defaultCParam
+
+defaultLBFGSParameters :: LBFGSParameters
+defaultLBFGSParameters = LBFGSParameters Nothing 1e-5 DefaultLineSearch Nothing
+
 data LBFGSResult
     = Success
     | Stop
@@ -230,20 +263,21 @@
 -- |
 -- Start a L-BFGS optimization. The initial variables should be
 -- provided as a list of doubles.
-lbfgs :: LineSearchAlgorithm       -- ^ The line search algorithm
+lbfgs :: LBFGSParameters           -- ^ Parameters
       -> EvaluateFun a             -- ^ Objective function
       -> ProgressFun a             -- ^ Progress report function
       -> a                         -- ^ Instance data
       -> [Double]                  -- ^ Initial variable values
       -> IO(LBFGSResult, [Double]) -- ^ Result and variable values
-lbfgs ls evalFun progressFun inst p = lbfgs_ ls (wrapEvaluateFun evalFun)
-                                 (wrapProgressFun progressFun) inst p
+lbfgs lbfgsParams evalFun progressFun inst p = lbfgs_ lbfgsParams
+                                               (wrapEvaluateFun evalFun)
+                                               (wrapProgressFun progressFun) inst p
 
-lbfgs_ :: LineSearchAlgorithm -> CEvaluateFun a -> CProgressFun a -> a ->
+lbfgs_ :: LBFGSParameters -> CEvaluateFun a -> CProgressFun a -> a ->
           [Double] -> IO(LBFGSResult, [Double])
-lbfgs_ ls evalFun progressFun inst p = do
+lbfgs_ lbfgsParams evalFun progressFun inst p = do
   (n, pVec) <- listToVector p
-  let param = withParam ls
+  let param = withParam lbfgsParams n
   instP <- newStablePtr inst
   paramP <- malloc
   poke paramP param
diff --git a/Numeric/LBFGS/Raw.hsc b/Numeric/LBFGS/Raw.hsc
--- a/Numeric/LBFGS/Raw.hsc
+++ b/Numeric/LBFGS/Raw.hsc
@@ -53,7 +53,7 @@
 ) where
 
 import Foreign.Storable (Storable(..))
-import Foreign.C.Types (CDouble, CInt)
+import Foreign.C.Types (CDouble(..), CInt(..))
 import Foreign.Ptr (FunPtr, Ptr)
 import Foreign.StablePtr (StablePtr)
 
@@ -108,13 +108,13 @@
       gtol :: CDouble,
       xtol :: CDouble,
       orthantwise_c :: CDouble,
-      orthantwise_start :: CDouble,
-      orthantwise_end :: CDouble
+      orthantwise_start :: CInt,
+      orthantwise_end :: CInt
 } deriving Show
 
 defaultCParam :: CLBFGSParameter
 defaultCParam = CLBFGSParameter 6 1e-5 0 1e-5 0 defaultLineSearch 40 1e-20
-                1e20 1e-4 0.9 0.9 1.0e-16 0.0 0.0 (-1.0)
+                1e20 1e-4 0.9 0.9 1.0e-16 0.0 0 (-1)
 
 instance Storable CLBFGSParameter where
     sizeOf _ = #{size lbfgs_parameter_t}
diff --git a/cbits/lbfgs.c b/cbits/lbfgs.c
--- a/cbits/lbfgs.c
+++ b/cbits/lbfgs.c
@@ -490,7 +490,7 @@
 
         /* Report the progress. */
         if (cd.proc_progress) {
-            if (ret = cd.proc_progress(cd.instance, x, g, fx, xnorm, gnorm, step, cd.n, k, ls)) {
+            if ((ret = cd.proc_progress(cd.instance, x, g, fx, xnorm, gnorm, step, cd.n, k, ls))) {
                 goto lbfgs_exit;
             }
         }
diff --git a/lbfgs.cabal b/lbfgs.cabal
--- a/lbfgs.cabal
+++ b/lbfgs.cabal
@@ -1,5 +1,5 @@
 Name:               lbfgs
-Version:            0.0.3
+Version:            0.0.5
 License:            OtherLicense
 License-File:       LICENSE
 Copyright:          Daniël de Kok
