diff --git a/README b/README
--- a/README
+++ b/README
@@ -3,7 +3,7 @@
 
 · Current status
 
-Version 0.1 - This software currently has *alpha* status, i.e. it had
+Version 0.2 - This software currently has *alpha* status, i.e. it had
 only seen very limited testing and changes to its API might happen.
 
 This software was developed and tested on Linux 2.6.31 with GHC-6.12.1
@@ -30,6 +30,7 @@
 - bind
 - connect
 - send
+- send'
 - flush
 - receive
 - poll
diff --git a/src/System/ZMQ.hs b/src/System/ZMQ.hs
--- a/src/System/ZMQ.hs
+++ b/src/System/ZMQ.hs
@@ -43,6 +43,7 @@
     bind,
     connect,
     send,
+    send',
     flush,
     receive,
 
@@ -52,6 +53,7 @@
 
 import Prelude hiding (init)
 import Control.Applicative
+import Control.Monad (foldM_)
 import Control.Exception
 import Data.Int
 import Data.Maybe
@@ -62,6 +64,7 @@
 import Foreign.C.String
 import Foreign.C.Types (CInt, CShort)
 import qualified Data.ByteString as SB
+import qualified Data.ByteString.Lazy as LB
 import qualified Data.ByteString.Unsafe as UB
 import System.Posix.Types (Fd(..))
 
@@ -336,11 +339,18 @@
 connect (Socket s) str = throwErrnoIfMinus1_ "connect" $
     withCString str (c_zmq_connect s)
 
--- | Send the given 'ByteString' over the socket (zmq_send).
+-- | Send the given 'SB.ByteString' over the socket (zmq_send).
 send :: Socket a -> SB.ByteString -> [Flag] -> IO ()
 send (Socket s) val fls = bracket (messageOf val) messageClose $ \m ->
     throwErrnoIfMinus1_ "send" $ c_zmq_send s (msgPtr m) (combine fls)
 
+-- | Send the given 'LB.ByteString' over the socket (zmq_send).
+--   This is operationally identical to @send socket (Strict.concat
+--   (Lazy.toChunks lbs)) flags@ but may be more efficient.
+send' :: Socket a -> LB.ByteString -> [Flag] -> IO ()
+send' (Socket s) val fls = bracket (messageOfLazy val) messageClose $ \m ->
+    throwErrnoIfMinus1_ "send'" $ c_zmq_send s (msgPtr m) (combine fls)
+
 -- | Flush the given socket (useful for 'send's with 'NoFlush').
 flush :: Socket a -> IO ()
 flush = throwErrnoIfMinus1_ "flush" . c_zmq_flush . sock
@@ -348,7 +358,7 @@
 -- | Receive a 'ByteString' from socket (zmq_recv).
 receive :: Socket a -> [Flag] -> IO (SB.ByteString)
 receive (Socket s) fls = bracket messageInit messageClose $ \m -> do
-    throwErrnoIfMinus1_ "receive" $ c_zmq_recv s (msgPtr m) (combine fls)
+    throwErrnoIfMinus1Retry_ "receive" $ c_zmq_recv s (msgPtr m) (combine fls)
     data_ptr <- c_zmq_msg_data (msgPtr m)
     size     <- c_zmq_msg_size (msgPtr m)
     SB.packCStringLen (data_ptr, fromIntegral size)
@@ -360,7 +370,7 @@
     let len = length fds
         ps  = map createZMQPoll fds
     withArray ps $ \ptr -> do
-        throwErrnoIfMinus1_ "poll" $
+        throwErrnoIfMinus1Retry_ "poll" $
             c_zmq_poll ptr (fromIntegral len) (fromIntegral to)
         ps' <- peekArray len ptr
         createPoll ps' []
@@ -405,6 +415,18 @@
     data_ptr <- c_zmq_msg_data (msgPtr msg)
     copyBytes data_ptr cstr len
     return msg
+
+messageOfLazy :: LB.ByteString -> IO Message
+messageOfLazy lbs = do
+    msg <- messageInitSize (fromIntegral len)
+    data_ptr <- c_zmq_msg_data (msgPtr msg)
+    let fn offset bs = UB.unsafeUseAsCStringLen bs $ \(cstr, str_len) -> do
+        copyBytes (data_ptr `plusPtr` offset) cstr str_len
+        return (offset + str_len)
+    foldM_ fn 0 (LB.toChunks lbs)
+    return msg
+ where
+    len = LB.length lbs
 
 messageClose :: Message -> IO ()
 messageClose (Message ptr) = do
diff --git a/src/System/ZMQ/Base.hsc b/src/System/ZMQ/Base.hsc
--- a/src/System/ZMQ/Base.hsc
+++ b/src/System/ZMQ/Base.hsc
@@ -155,11 +155,11 @@
 foreign import ccall unsafe "zmq.h zmq_flush"
     c_zmq_flush :: ZMQSocket -> IO CInt
 
-foreign import ccall unsafe "zmq.h zmq_recv"
+foreign import ccall safe "zmq.h zmq_recv"
     c_zmq_recv :: ZMQSocket -> ZMQMsgPtr -> CInt -> IO CInt
 
 -- poll
 
-foreign import ccall unsafe "zmq.h zmq_poll"
+foreign import ccall safe "zmq.h zmq_poll"
     c_zmq_poll :: ZMQPollPtr -> CInt -> CLong -> IO CInt
 
diff --git a/zeromq-haskell.cabal b/zeromq-haskell.cabal
--- a/zeromq-haskell.cabal
+++ b/zeromq-haskell.cabal
@@ -1,5 +1,5 @@
 name:               zeromq-haskell
-version:            0.1.2
+version:            0.2
 synopsis:           bindings to zeromq 
 description:        Bindings to zeromq (http://zeromq.org)
 category:           System, FFI
@@ -7,7 +7,7 @@
 license-file:       LICENSE
 author:             Toralf Wittner
 maintainer:         toralf.wittner@gmail.com
-copyright:          Copyright (c) 2010 Toralf Wittner
+copyright:          Copyright (c) 2010 Toralf Wittner, David Himmelstrup
 homepage:           http://github.com/twittner/zeromq-haskell/
 stability:          experimental
 tested-With:        GHC == 6.12.1
