diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,7 @@
+0.6.2
+-----------------------------------------------------------------------------
+- Bug fixes: #56 (we no longer call zmq_msg_close after successfull sends)
+
 0.6.1
 -----------------------------------------------------------------------------
 - Bug fixes: #55
diff --git a/src/System/ZMQ4.hs b/src/System/ZMQ4.hs
--- a/src/System/ZMQ4.hs
+++ b/src/System/ZMQ4.hs
@@ -792,14 +792,15 @@
 -- by default. Still 'send' is blocking the thread as long as the message
 -- can not be queued on the socket using GHC's 'threadWaitWrite'.
 send :: Sender a => Socket a -> [Flag] -> SB.ByteString -> IO ()
-send sock fls val = bracket (messageOf val) messageClose $ \m ->
-  onSocket "send" sock $ \s ->
-    retry "send" (waitWrite sock) $
+send sock fls val = bracketOnError (messageOf val) messageClose $ \m -> do
+    onSocket "send" sock $ \s ->
+        retry "send" (waitWrite sock) $
 #ifdef mingw32_HOST_OS
-          c_zmq_sendmsg s (msgPtr m) (combineFlags fls)
+            c_zmq_sendmsg s (msgPtr m) (combineFlags fls)
 #else
-          c_zmq_sendmsg s (msgPtr m) (combineFlags (DontWait : fls))
+            c_zmq_sendmsg s (msgPtr m) (combineFlags (DontWait : fls))
 #endif
+    messageFree m
 
 -- | Send the given 'LB.ByteString' over the socket
 -- (cf. <http://api.zeromq.org/4-0:zmq-sendmsg zmq_sendmsg>).
@@ -812,14 +813,15 @@
 -- by default. Still 'send'' is blocking the thread as long as the message
 -- can not be queued on the socket using GHC's 'threadWaitWrite'.
 send' :: Sender a => Socket a -> [Flag] -> LB.ByteString -> IO ()
-send' sock fls val = bracket (messageOfLazy val) messageClose $ \m ->
-  onSocket "send'" sock $ \s ->
-    retry "send'" (waitWrite sock) $
+send' sock fls val = bracketOnError (messageOfLazy val) messageClose $ \m -> do
+    onSocket "send'" sock $ \s ->
+        retry "send'" (waitWrite sock) $
 #ifdef mingw32_HOST_OS
-          c_zmq_sendmsg s (msgPtr m) (combineFlags fls)
+            c_zmq_sendmsg s (msgPtr m) (combineFlags fls)
 #else
-          c_zmq_sendmsg s (msgPtr m) (combineFlags (DontWait : fls))
+            c_zmq_sendmsg s (msgPtr m) (combineFlags (DontWait : fls))
 #endif
+    messageFree m
 
 -- | Send a multi-part message.
 -- This function applies the 'SendMore' 'Flag' between all message parts.
@@ -979,7 +981,7 @@
 --
 -- Proxy connects front to back socket
 --
--- Before calling proxy all sockets should be binded
+-- Before calling proxy all sockets should be bound
 --
 -- If the capture socket is not Nothing, the proxy  shall send all
 -- messages, received on both frontend and backend, to the capture socket.
diff --git a/src/System/ZMQ4/Internal.hs b/src/System/ZMQ4/Internal.hs
--- a/src/System/ZMQ4/Internal.hs
+++ b/src/System/ZMQ4/Internal.hs
@@ -20,6 +20,7 @@
     , messageOf
     , messageOfLazy
     , messageClose
+    , messageFree
     , messageInit
     , messageInitSize
     , setIntOpt
@@ -207,6 +208,9 @@
 messageClose (Message ptr) = do
     throwIfMinus1_ "messageClose" $ c_zmq_msg_close ptr
     free ptr
+
+messageFree :: Message -> IO ()
+messageFree (Message ptr) = free ptr
 
 messageInit :: IO Message
 messageInit = do
diff --git a/zeromq4-haskell.cabal b/zeromq4-haskell.cabal
--- a/zeromq4-haskell.cabal
+++ b/zeromq4-haskell.cabal
@@ -1,5 +1,5 @@
 name:               zeromq4-haskell
-version:            0.6.1
+version:            0.6.2
 synopsis:           Bindings to ZeroMQ 4.x
 category:           System, FFI
 license:            MIT
