diff --git a/include/grpc++/byte_buffer.h b/include/grpc++/byte_buffer.h
index 80b3397a2d7786b1370017dd72f5957bd7b7ad6a..5f419764a5f10fbd25a78b69e6c42d935a84a012 100644
--- a/include/grpc++/byte_buffer.h
+++ b/include/grpc++/byte_buffer.h
@@ -90,8 +90,10 @@ class SerializationTraits<ByteBuffer, void> {
     dest->set_buffer(byte_buffer);
     return Status::OK;
   }
-  static bool Serialize(const ByteBuffer& source, grpc_byte_buffer** buffer) {
+  static bool Serialize(const ByteBuffer& source, grpc_byte_buffer** buffer, 
+                        bool* own_buffer) {
     *buffer = source.buffer();
+    *own_buffer = false;
     return true;
   }
 };
diff --git a/include/grpc++/impl/call.h b/include/grpc++/impl/call.h
index eb8027cef5ef5d0bd1afa5d98ce8f90ccccacb99..43d3805827c13b712d457e598099af385f265064 100644
--- a/include/grpc++/impl/call.h
+++ b/include/grpc++/impl/call.h
@@ -95,11 +95,11 @@ class CallOpSendInitialMetadata {
 
 class CallOpSendMessage {
  public:
-  CallOpSendMessage() : send_buf_(nullptr) {}
+  CallOpSendMessage() : send_buf_(nullptr), own_buf_(false) {}
 
   template <class M>
   bool SendMessage(const M& message) GRPC_MUST_USE_RESULT {
-    return SerializationTraits<M>::Serialize(message, &send_buf_);
+    return SerializationTraits<M>::Serialize(message, &send_buf_, &own_buf_);
   }
 
  protected:
@@ -110,11 +110,12 @@ class CallOpSendMessage {
     op->data.send_message = send_buf_;
   }
   void FinishOp(void* tag, bool* status, int max_message_size) {
-    grpc_byte_buffer_destroy(send_buf_);
+    if (own_buf_) grpc_byte_buffer_destroy(send_buf_);
   }
 
  private:
   grpc_byte_buffer* send_buf_;
+  bool own_buf_;
 };
 
 template <class R>
diff --git a/include/grpc++/impl/proto_utils.h b/include/grpc++/impl/proto_utils.h
index ee19859198e97aae976541584f693cb19517b45e..bf82f2b23d3955e9008e0e5c9340bc410f098e11 100644
--- a/include/grpc++/impl/proto_utils.h
+++ b/include/grpc++/impl/proto_utils.h
@@ -59,7 +59,8 @@ class SerializationTraits<T, typename std::enable_if<std::is_base_of<
                                  grpc::protobuf::Message, T>::value>::type> {
  public:
   static bool Serialize(const grpc::protobuf::Message& msg,
-                        grpc_byte_buffer** buffer) {
+                        grpc_byte_buffer** buffer, bool* own_buffer) {
+    *own_buffer = true;
     return SerializeProto(msg, buffer);
   }
   static Status Deserialize(grpc_byte_buffer* buffer,