diff --git a/network-transport.cabal b/network-transport.cabal
--- a/network-transport.cabal
+++ b/network-transport.cabal
@@ -1,12 +1,12 @@
 Name:          network-transport
-Version:       0.3.0
+Version:       0.3.0.1
 Cabal-Version: >=1.6
 Build-Type:    Simple
 License:       BSD3 
 License-File:  LICENSE
 Copyright:     Well-Typed LLP
 Author:        Duncan Coutts, Nicolas Wu, Edsko de Vries
-Maintainer:    edsko@well-typed.com, dcoutts@well-typed.com
+Maintainer:    edsko@well-typed.com, duncan@well-typed.com
 Stability:     experimental
 Homepage:      http://github.com/haskell-distributed/distributed-process
 Bug-Reports:   mailto:edsko@well-typed.com
@@ -65,7 +65,7 @@
 
 Library
   Build-Depends:   base >= 4.3 && < 5,
-                   binary >= 0.5 && < 0.6,
+                   binary >= 0.5 && < 0.7,
                    bytestring >= 0.9 && < 0.11,
                    transformers >= 0.2 && < 0.4
   Exposed-Modules: Network.Transport,
diff --git a/src/Network/Transport/Util.hs b/src/Network/Transport/Util.hs
--- a/src/Network/Transport/Util.hs
+++ b/src/Network/Transport/Util.hs
@@ -9,6 +9,7 @@
   , EndPointAddress
   , newEndPoint
   )
+import Control.Exception (throwIO)
 import Control.Concurrent (forkIO)
 import Control.Concurrent.MVar (newEmptyMVar, putMVar, takeMVar)
 
@@ -17,9 +18,16 @@
 -- Returns the address of the new end point.
 spawn :: Transport -> (EndPoint -> IO ()) -> IO EndPointAddress 
 spawn transport proc = do
-  addr <- newEmptyMVar
+  addrMVar <- newEmptyMVar
   forkIO $ do
-    Right endpoint <- newEndPoint transport
-    putMVar addr (address endpoint)
-    proc endpoint
-  takeMVar addr
+    mEndPoint <- newEndPoint transport
+    case mEndPoint of
+      Left err ->
+        putMVar addrMVar (Left err)
+      Right endPoint -> do
+        putMVar addrMVar (Right (address endPoint))
+        proc endPoint
+  mAddr <- takeMVar addrMVar
+  case mAddr of
+    Left err   -> throwIO err
+    Right addr -> return addr
