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
diff --git a/src/python/grpcio/setup.py b/src/python/grpcio/setup.py
index a948ca1fac6d819cb7ebc5d38ff0bb3f2aa7a63f..b8a98c3d859f2243bdcc6305d14edd74dc519f86 100644
--- a/src/python/grpcio/setup.py
+++ b/src/python/grpcio/setup.py
@@ -163,7 +163,7 @@ else:
 
 setuptools.setup(
     name='grpcio',
-    version='0.11.0b2',
+    version='0.12.0b0',
     ext_modules=CYTHON_EXTENSION_MODULES,
     packages=list(PACKAGES),
     package_dir=PACKAGE_DIRECTORIES,
diff --git a/tools/run_tests/run_lcov.sh b/tools/run_tests/run_lcov.sh
index ec97ebf0a5b8ca5c24352b6e79a16ad0edb491a3..796a0b5ceb2fe1834a1a84fc847dc0825120ad77 100755
--- a/tools/run_tests/run_lcov.sh
+++ b/tools/run_tests/run_lcov.sh
@@ -33,7 +33,7 @@ set -ex
 out=$(readlink -f ${1:-coverage})
 
 root=$(readlink -f $(dirname $0)/../..)
-shift
+shift || true
 tmp=$(mktemp)
 cd $root
 tools/run_tests/run_tests.py -c gcov -l c c++ $@ || true