diff --git a/include/grpc++/client_context.h b/include/grpc++/client_context.h
index 34945f32820d95c8d84cb7b834fa6c04eea1d1e7..d7fafac9b36dd8c411956c5c56431e7168c30c68 100644
--- a/include/grpc++/client_context.h
+++ b/include/grpc++/client_context.h
@@ -218,15 +218,11 @@ class ClientContext {
   void set_call(grpc_call* call,
                 const std::shared_ptr<ChannelInterface>& channel);
 
-  grpc_completion_queue* cq() { return cq_; }
-  void set_cq(grpc_completion_queue* cq) { cq_ = cq; }
-
   grpc::string authority() { return authority_; }
 
   bool initial_metadata_received_;
   std::shared_ptr<ChannelInterface> channel_;
   grpc_call* call_;
-  grpc_completion_queue* cq_;
   gpr_timespec deadline_;
   grpc::string authority_;
   std::shared_ptr<Credentials> creds_;
diff --git a/src/cpp/client/channel.cc b/src/cpp/client/channel.cc
index af7366eb01cab2ec974a92a1c2a8c3d94e4cf30b..1c2eecf7863d2aabb28b9a41d9d4813090f4d88c 100644
--- a/src/cpp/client/channel.cc
+++ b/src/cpp/client/channel.cc
@@ -61,19 +61,25 @@ Channel::~Channel() { grpc_channel_destroy(c_channel_); }
 
 Call Channel::CreateCall(const RpcMethod& method, ClientContext* context,
                          CompletionQueue* cq) {
-  const char* host_str = host_.empty() ? NULL : host_.c_str();
-  auto c_call = method.channel_tag() && context->authority().empty()
-                    ? grpc_channel_create_registered_call(
-                          c_channel_, context->propagate_from_call_,
-                          context->propagation_options_.c_bitmask(), cq->cq(),
-                          method.channel_tag(), context->raw_deadline())
-                    : grpc_channel_create_call(
-                          c_channel_, context->propagate_from_call_,
-                          context->propagation_options_.c_bitmask(), cq->cq(),
-                          method.name(), context->authority().empty()
-                                             ? host_str
-                                             : context->authority().c_str(),
-                          context->raw_deadline());
+  const bool kRegistered = method.channel_tag() && context->authority().empty();
+  grpc_call* c_call = NULL;
+  if (kRegistered) {
+    c_call = grpc_channel_create_registered_call(
+        c_channel_, context->propagate_from_call_,
+        context->propagation_options_.c_bitmask(), cq->cq(),
+        method.channel_tag(), context->raw_deadline());
+  } else {
+    const char* host_str = NULL;
+    if (!context->authority().empty()) {
+      host_str = context->authority().c_str();
+    } else if (!host_.empty()) {
+      host_str = host_.c_str();
+    }
+    c_call = grpc_channel_create_call(c_channel_, context->propagate_from_call_,
+                                      context->propagation_options_.c_bitmask(),
+                                      cq->cq(), method.name(), host_str,
+                                      context->raw_deadline());
+  }
   grpc_census_call_set_context(c_call, context->census_context());
   GRPC_TIMER_MARK(GRPC_PTAG_CPP_CALL_CREATED, c_call);
   context->set_call(c_call, shared_from_this());
diff --git a/src/cpp/client/client_context.cc b/src/cpp/client/client_context.cc
index 1ed2d389616e2a68ffa5b6a6eb09b0352f788e1b..dd86e7b108ac75c4566b2caeccab148803f7510d 100644
--- a/src/cpp/client/client_context.cc
+++ b/src/cpp/client/client_context.cc
@@ -48,7 +48,6 @@ namespace grpc {
 ClientContext::ClientContext()
     : initial_metadata_received_(false),
       call_(nullptr),
-      cq_(nullptr),
       deadline_(gpr_inf_future(GPR_CLOCK_REALTIME)),
       propagate_from_call_(nullptr) {}
 
@@ -56,14 +55,6 @@ ClientContext::~ClientContext() {
   if (call_) {
     grpc_call_destroy(call_);
   }
-  if (cq_) {
-    // Drain cq_.
-    grpc_completion_queue_shutdown(cq_);
-    while (grpc_completion_queue_next(cq_, gpr_inf_future(GPR_CLOCK_REALTIME))
-               .type != GRPC_QUEUE_SHUTDOWN)
-      ;
-    grpc_completion_queue_destroy(cq_);
-  }
 }
 
 std::unique_ptr<ClientContext> ClientContext::FromServerContext(