diff --git a/include/grpc++/client_context.h b/include/grpc++/client_context.h
index 1b6769dee11b8899c84ce8e17cd92fc6c1612fe5..8e7c3579e3c105e910300432c9b6fcab2c9c4bf5 100644
--- a/include/grpc++/client_context.h
+++ b/include/grpc++/client_context.h
@@ -280,6 +280,17 @@ class ClientContext {
   /// There is no guarantee the call will be cancelled.
   void TryCancel();
 
+  /// Global Callbacks
+  ///
+  /// Can be set exactly once per application to install hooks whenever
+  /// a client context is constructed and destructed.
+  class GlobalCallbacks {
+   public:
+    virtual void DefaultConstructor(ClientContext* context) = 0;
+    virtual void Destructor(ClientContext* context) = 0;
+  };
+  static void SetGlobalCallbacks(GlobalCallbacks* callbacks);
+
  private:
   // Disallow copy and assign.
   ClientContext(const ClientContext&);
diff --git a/src/cpp/client/client_context.cc b/src/cpp/client/client_context.cc
index 9bb358b2339f123b58076ff0c6bc9fdb7dcbf153..2aa532808c54a2b2558ae4ac3b5fd0061fe55e00 100644
--- a/src/cpp/client/client_context.cc
+++ b/src/cpp/client/client_context.cc
@@ -45,17 +45,31 @@
 
 namespace grpc {
 
+class DefaultGlobalClientCallbacks GRPC_FINAL
+    : public ClientContext::GlobalCallbacks {
+ public:
+  void DefaultConstructor(ClientContext* context) GRPC_OVERRIDE {}
+  void Destructor(ClientContext* context) GRPC_OVERRIDE {}
+};
+
+static DefaultGlobalClientCallbacks g_default_client_callbacks;
+static ClientContext::GlobalCallbacks* g_client_callbacks =
+    &g_default_client_callbacks;
+
 ClientContext::ClientContext()
     : initial_metadata_received_(false),
       call_(nullptr),
       call_canceled_(false),
       deadline_(gpr_inf_future(GPR_CLOCK_REALTIME)),
-      propagate_from_call_(nullptr) {}
+      propagate_from_call_(nullptr) {
+  g_client_callbacks->DefaultConstructor(this);
+}
 
 ClientContext::~ClientContext() {
   if (call_) {
     grpc_call_destroy(call_);
   }
+  g_client_callbacks->Destructor(this);
 }
 
 std::unique_ptr<ClientContext> ClientContext::FromServerContext(
@@ -124,4 +138,11 @@ grpc::string ClientContext::peer() const {
   return peer;
 }
 
+void ClientContext::SetGlobalCallbacks(GlobalCallbacks* client_callbacks) {
+  GPR_ASSERT(g_client_callbacks == &g_default_client_callbacks);
+  GPR_ASSERT(client_callbacks != NULL);
+  GPR_ASSERT(client_callbacks != &g_default_client_callbacks);
+  g_client_callbacks = client_callbacks;
+}
+
 }  // namespace grpc