diff --git a/include/grpc++/client_context.h b/include/grpc++/client_context.h
index 19630c9b54415eb495e2aec3aa6f4ad48867330d..a58e9872e6097ad1886afc0adeda28e095d4a8f9 100644
--- a/include/grpc++/client_context.h
+++ b/include/grpc++/client_context.h
@@ -35,6 +35,7 @@
 #define GRPCXX_CLIENT_CONTEXT_H
 
 #include <map>
+#include <memory>
 #include <string>
 
 #include <grpc/support/log.h>
@@ -126,9 +127,10 @@ class ClientContext {
   friend class ::grpc::ClientAsyncResponseReader;
 
   grpc_call* call() { return call_; }
-  void set_call(grpc_call* call) {
+  void set_call(grpc_call* call, const std::shared_ptr<ChannelInterface>& channel) {
     GPR_ASSERT(call_ == nullptr);
     call_ = call;
+    channel_ = channel;
   }
 
   grpc_completion_queue* cq() { return cq_; }
@@ -137,6 +139,7 @@ class ClientContext {
   grpc::string authority() { return authority_; }
 
   bool initial_metadata_received_;
+  std::shared_ptr<ChannelInterface> channel_;
   grpc_call* call_;
   grpc_completion_queue* cq_;
   gpr_timespec deadline_;
diff --git a/src/cpp/client/channel.cc b/src/cpp/client/channel.cc
index ba8882278f540903f015ada298031f283e3465b8..c541ddfb487ac43f0cb60d95167e2f732326aa7a 100644
--- a/src/cpp/client/channel.cc
+++ b/src/cpp/client/channel.cc
@@ -71,7 +71,7 @@ Call Channel::CreateCall(const RpcMethod& method, ClientContext* context,
                                          : context->authority().c_str(),
                                      context->raw_deadline());
   GRPC_TIMER_MARK(CALL_CREATED, c_call);
-  context->set_call(c_call);
+  context->set_call(c_call, shared_from_this());
   return Call(c_call, this, cq);
 }
 
diff --git a/src/cpp/client/channel.h b/src/cpp/client/channel.h
index cd239247c8270c9518f39d27a068515c5dd31353..46009d20bad7692f3af5a0a74b6c3c0f354da80c 100644
--- a/src/cpp/client/channel.h
+++ b/src/cpp/client/channel.h
@@ -51,6 +51,7 @@ class Credentials;
 class StreamContextInterface;
 
 class Channel GRPC_FINAL : public GrpcLibrary,
+                           public std::enable_shared_from_this<Channel>,
                            public ChannelInterface {
  public:
   Channel(const grpc::string& target, grpc_channel* c_channel);