diff --git a/Network/AMQP.hs b/Network/AMQP.hs
--- a/Network/AMQP.hs
+++ b/Network/AMQP.hs
@@ -52,6 +52,7 @@
     openConnection,
     openConnection',
     closeConnection,
+    addConnectionClosedHandler,
    
     -- * Channel
     Channel,
@@ -543,6 +544,7 @@
                     connClosed :: MVar (Maybe String),
                     connClosedLock :: MVar (), -- used by closeConnection to block until connection-close handshake is complete
                     connWriteLock :: MVar (), -- to ensure atomic writes to the socket
+                    connClosedHandlers :: MVar [IO ()],
                     lastChannelID :: MVar Int --for auto-incrementing the channelIDs
                 }
                     
@@ -626,7 +628,8 @@
     cClosed <- newMVar Nothing
     writeLock <- newMVar ()
     ccl <- newEmptyMVar
-    let conn = Connection sock connChannels (fromIntegral maxFrameSize) cClosed ccl writeLock lastChanID
+    connClosedHandlers <- newMVar []
+    let conn = Connection sock connChannels (fromIntegral maxFrameSize) cClosed ccl writeLock connClosedHandlers lastChanID
     
     --spawn the connectionReceiver
     forkIO $ CE.finally (connectionReceiver conn) 
@@ -643,6 +646,10 @@
                 
                 -- mark connection as closed, so all pending calls to 'closeConnection' can now return
                 tryPutMVar ccl ()
+                
+                -- notify connection-close-handlers
+                withMVar connClosedHandlers sequence
+                
                 )
 
     return conn
@@ -678,10 +685,23 @@
             return ()
         ) 
    
-    -- wait for connection_close_ok by the server
+    -- wait for connection_close_ok by the server; this MVar gets filled in the CE.finally handler in openConnection'
     readMVar $ connClosedLock c
     return ()
     
+
+-- | @addConnectionClosedHandler conn ifClosed handler@ adds a @handler@ that will be called after the connection is closed (either by calling @closeConnection@ or by an exception). If the @ifClosed@ parameter is True and the connection is already closed, the handler will be called immediately. If @ifClosed == False@ and the connection is already closed, the handler will never be called
+addConnectionClosedHandler :: Connection -> Bool -> IO () -> IO ()
+addConnectionClosedHandler conn ifClosed handler = do
+    withMVar (connClosed conn) $ \cc -> do
+        case cc of
+            -- connection is already closed, so call the handler directly
+            Just _ | ifClosed == True -> handler
+            
+            -- otherweise add it to the list
+            _ -> modifyMVar_ (connClosedHandlers conn) $ \old -> return $ handler:old
+        
+            
     
 
     
diff --git a/amqp.cabal b/amqp.cabal
--- a/amqp.cabal
+++ b/amqp.cabal
@@ -1,5 +1,5 @@
 Name:                amqp
-Version:             0.2.6
+Version:             0.2.7
 Synopsis:            Client library for AMQP servers (currently only RabbitMQ)
 Description:         Client library for AMQP servers (currently only RabbitMQ)
 License:             BSD3
