anchor.diff:                     | Choice2Of2 e -> return e::es, true
                    }) []
   
  -      if r.Length = endPoints.Length then
  -        //TODO, make this an aggregate exception
  -        return! Async.Raise (new CommunicationException("Unable to send reply on all possible endpoints of reply channel."))
  +      if r.Length = endPoints.Length then return! Async.Raise r.Head
         else return ()
       }
   
  
positive.code:                | None -> Choice2Of2(new CommunicationTimeoutException("Timeout occurred while waiting for confirmation of message delivery.", actorId, TimeoutType.ConfirmationReceive) :> exn)
        with :? SocketException as e when e.SocketErrorCode = SocketError.TimedOut -> return Choice2Of2(new CommunicationTimeoutException("Timeout occurred while trying to establish connection.", actorId, TimeoutType.Connection, e) :> exn)
            | CommunicationException _ as e -> return Choice2Of2 e
            | e -> return Choice2Of2(new CommunicationException("Communication failure occurred while posting message.", actorId, e) :> exn)
      }
  
    let postMessage msgId msg =
      async {
        //this is memoized
        let! endPoints = address.ToEndPointsAsync()
  
        let! r = endPoints |> List.conditionalFoldAsync (fun es endPoint -> async {
                   let! r = tryPostOnEndpoint endPoint msgId msg
  
negative.code:       match r with
        | Some() ->
          return! protocolMessageStream.ProtocolStream.TryAsyncReadResponse()
        | None -> return! Async.Raise (new CommunicationTimeoutException("Timeout occurred while trying to write reply on channel.", self.ActorId, TimeoutType.MessageSend))
      }
  
    member self.TryAsyncReplyOnEndPoint(endPoint: IPEndPoint, reply: Reply<'T>) =
  