diff --git a/include/grpc++/impl/call.h b/include/grpc++/impl/call.h
index eef0e90cc99f6b52f804ea4e456dcaaa7c95d011..94b0f915c6f4593b31b67111256f6f1365c75eee 100644
--- a/include/grpc++/impl/call.h
+++ b/include/grpc++/impl/call.h
@@ -85,7 +85,7 @@ class CallOpSendInitialMetadata {
     op->data.send_initial_metadata.metadata = initial_metadata_;
   }
   void FinishOp(bool* status, int max_message_size) {
-    // nothing to do
+    send_ = false;
   }
 
   bool send_;
@@ -109,6 +109,7 @@ class CallOpSendMessage {
   }
   void FinishOp(bool* status, int max_message_size) {
     if (own_buf_) grpc_byte_buffer_destroy(send_buf_);
+    send_buf_ = nullptr;
   }
 
  private:
@@ -154,6 +155,7 @@ class CallOpRecvMessage {
       got_message = false;
       *status = false;
     }
+    message_ = nullptr;
   }
 
  private:
@@ -198,10 +200,12 @@ class CallOpGenericRecvMessage {
       got_message = false;
       *status = false;
     }
+    deserialize_ = DeserializeFunc();
   }
 
  private:
-  std::function<Status(grpc_byte_buffer*, int)> deserialize_;
+  typedef std::function<Status(grpc_byte_buffer*, int)> DeserializeFunc;
+  DeserializeFunc deserialize_;
   grpc_byte_buffer* recv_buf_;
 };
 
@@ -217,7 +221,7 @@ class CallOpClientSendClose {
     ops[(*nops)++].op = GRPC_OP_SEND_CLOSE_FROM_CLIENT;
   }
   void FinishOp(bool* status, int max_message_size) {
-    // nothing to do
+    send_ = false;
   }
 
  private:
@@ -251,7 +255,7 @@ class CallOpServerSendStatus {
   }
 
   void FinishOp(bool* status, int max_message_size) {
-    // nothing to do
+    send_status_details_ = false;
   }
 
  private:
@@ -281,7 +285,9 @@ class CallOpRecvInitialMetadata {
     op->data.recv_initial_metadata = &recv_initial_metadata_arr_;
   }
   void FinishOp(bool* status, int max_message_size) {
+    if (recv_initial_metadata_ == nullptr) return;
     FillMetadataMap(&recv_initial_metadata_arr_, recv_initial_metadata_);
+    recv_initial_metadata_ = nullptr;
   }
 
  private:
@@ -312,10 +318,12 @@ class CallOpClientRecvStatus {
   }
 
   void FinishOp(bool* status, int max_message_size) {
+    if (recv_status_ == nullptr) return;
     FillMetadataMap(&recv_trailing_metadata_arr_, recv_trailing_metadata_);
     *recv_status_ = Status(
         static_cast<StatusCode>(status_code_),
         status_details_ ? grpc::string(status_details_) : grpc::string());
+    recv_status_ = nullptr;
   }
 
  private: