       return (RpcError err)
 
 clientWaitForStatus :: ClientReaderWriter -> IO (RpcReply RpcStatus)
-clientWaitForStatus crw@(ClientReaderWriter{..}) = do
-  status <- tryReadMVar statusFromServer
-  case status of
-    Nothing -> do
-      recvStatusOp <- opRecvStatusOnClient crw
-      res <- callBatch crw [ OpX recvStatusOp ]
-      case res of
-        RpcOk _ -> do
-          st <- opRead recvStatusOp
-          return (RpcOk st)
-        RpcError err -> do
-          return (RpcError err)
-    Just st -> return (RpcOk st)
+clientWaitForStatus ClientReaderWriter{..} = do
+  status <- readMVar statusFromServer
+  return (RpcOk status)
 
 clientClose :: ClientReaderWriter -> IO ()
 clientClose (ClientReaderWriter{..}) = do

  callBatch crw [ OpX sendCloseOp ]

clientCloseCall :: ClientReaderWriter -> IO ()
clientCloseCall ClientReaderWriter { callMVar_ = callMVar } =
  withMVar callMVar $ \call ->
  grpcCallDestroy call

type Rpc req resp a = ReaderT (Client req resp) (ExceptT RpcError IO) a


  callMVar_ :: MVar Call,
  initialMDRef :: !(IORef (Maybe [Metadata])),
  trailingMDRef :: !(IORef (Maybe [Metadata])),
  statusFromServer :: !(MVar RpcStatus),
  statusFromServerTag :: !(MVar CQ.EventDesc)
}

newClientReaderWriter :: ClientContext -> MVar Call -> IO ClientReaderWriter
