diff --git a/src/cpp/codegen/codegen_init.cc b/src/cpp/codegen/codegen_init.cc
new file mode 100644
index 0000000..99b6c9c
--- /dev/null
+++ b/src/cpp/codegen/codegen_init.cc
@@ -0,0 +1,38 @@
+/*
+ *
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#include <grpc++/impl/codegen/core_codegen_interface.h>
+#include <grpc++/impl/codegen/grpc_library.h>
+
+grpc::CoreCodegenInterface *grpc::g_core_codegen_interface = nullptr;
+grpc::GrpcLibraryInterface* grpc::g_glip = nullptr;
diff --git a/src/cpp/codegen/core_codegen.cc b/src/cpp/codegen/core_codegen.cc
index 00e8005..b052cc6 100644
--- a/src/cpp/codegen/core_codegen.cc
+++ b/src/cpp/codegen/core_codegen.cc
@@ -31,9 +31,10 @@
  *
  */
 
+#include "src/cpp/codegen/core_codegen.h"
+
 #include <stdlib.h>
 
-#include <grpc++/impl/codegen/core_codegen_interface.h>
 #include <grpc++/support/config.h>
 #include <grpc/byte_buffer.h>
 #include <grpc/byte_buffer_reader.h>
@@ -47,6 +48,8 @@
 
 #include "src/core/profiling/timers.h"
 
+grpc::CoreCodegenInterface* grpc::g_core_codegen_interface = nullptr;
+
 namespace {
 
 const int kGrpcBufferWriterMaxBufferLength = 8192;
@@ -167,86 +170,84 @@
 
 namespace grpc {
 
-class CoreCodegen : public CoreCodegenInterface {
- private:
-  grpc_completion_queue* grpc_completion_queue_create(void* reserved) override {
-    return ::grpc_completion_queue_create(reserved);
-  }
+grpc_completion_queue* CoreCodegen::grpc_completion_queue_create(
+    void* reserved) {
+  return ::grpc_completion_queue_create(reserved);
+}
 
-  void grpc_completion_queue_destroy(grpc_completion_queue* cq) override {
-    ::grpc_completion_queue_destroy(cq);
-  }
+void CoreCodegen::grpc_completion_queue_destroy(grpc_completion_queue* cq) {
+  ::grpc_completion_queue_destroy(cq);
+}
 
-  grpc_event grpc_completion_queue_pluck(grpc_completion_queue* cq, void* tag,
-                                         gpr_timespec deadline,
-                                         void* reserved) override {
-    return ::grpc_completion_queue_pluck(cq, tag, deadline, reserved);
-  }
+grpc_event CoreCodegen::grpc_completion_queue_pluck(grpc_completion_queue* cq,
+                                                    void* tag,
+                                                    gpr_timespec deadline,
+                                                    void* reserved) {
+  return ::grpc_completion_queue_pluck(cq, tag, deadline, reserved);
+}
 
-  void* gpr_malloc(size_t size) override { return ::gpr_malloc(size); }
+void* CoreCodegen::gpr_malloc(size_t size) { return ::gpr_malloc(size); }
 
-  void gpr_free(void* p) override { return ::gpr_free(p); }
+void CoreCodegen::gpr_free(void* p) { return ::gpr_free(p); }
 
-  void grpc_byte_buffer_destroy(grpc_byte_buffer* bb) override {
-    ::grpc_byte_buffer_destroy(bb);
-  }
+void CoreCodegen::grpc_byte_buffer_destroy(grpc_byte_buffer* bb) {
+  ::grpc_byte_buffer_destroy(bb);
+}
 
-  void grpc_metadata_array_init(grpc_metadata_array* array) override {
-    ::grpc_metadata_array_init(array);
-  }
+void CoreCodegen::grpc_metadata_array_init(grpc_metadata_array* array) {
+  ::grpc_metadata_array_init(array);
+}
 
-  void grpc_metadata_array_destroy(grpc_metadata_array* array) override {
-    ::grpc_metadata_array_destroy(array);
-  }
+void CoreCodegen::grpc_metadata_array_destroy(grpc_metadata_array* array) {
+  ::grpc_metadata_array_destroy(array);
+}
 
-  void assert_fail(const char* failed_assertion) override {
-    gpr_log(GPR_ERROR, "assertion failed: %s", failed_assertion);
-    abort();
-  }
+void CoreCodegen::assert_fail(const char* failed_assertion) {
+  gpr_log(GPR_ERROR, "assertion failed: %s", failed_assertion);
+  abort();
+}
 
-  Status SerializeProto(const grpc::protobuf::Message& msg,
-                        grpc_byte_buffer** bp) override {
-    GPR_TIMER_SCOPE("SerializeProto", 0);
-    int byte_size = msg.ByteSize();
-    if (byte_size <= kGrpcBufferWriterMaxBufferLength) {
-      gpr_slice slice = gpr_slice_malloc(byte_size);
-      GPR_ASSERT(
-          GPR_SLICE_END_PTR(slice) ==
-          msg.SerializeWithCachedSizesToArray(GPR_SLICE_START_PTR(slice)));
-      *bp = grpc_raw_byte_buffer_create(&slice, 1);
-      gpr_slice_unref(slice);
-      return Status::OK;
-    } else {
-      GrpcBufferWriter writer(bp, kGrpcBufferWriterMaxBufferLength);
-      return msg.SerializeToZeroCopyStream(&writer)
-                 ? Status::OK
-                 : Status(StatusCode::INTERNAL, "Failed to serialize message");
-    }
-  }
-
-  Status DeserializeProto(grpc_byte_buffer* buffer,
-                          grpc::protobuf::Message* msg,
-                          int max_message_size) override {
-    GPR_TIMER_SCOPE("DeserializeProto", 0);
-    if (buffer == nullptr) {
-      return Status(StatusCode::INTERNAL, "No payload");
-    }
-    GrpcBufferReader reader(buffer);
-    ::grpc::protobuf::io::CodedInputStream decoder(&reader);
-    if (max_message_size > 0) {
-      decoder.SetTotalBytesLimit(max_message_size, max_message_size);
-    }
-    if (!msg->ParseFromCodedStream(&decoder)) {
-      grpc_byte_buffer_destroy(buffer);
-      return Status(StatusCode::INTERNAL, msg->InitializationErrorString());
-    }
-    if (!decoder.ConsumedEntireMessage()) {
-      grpc_byte_buffer_destroy(buffer);
-      return Status(StatusCode::INTERNAL, "Did not read entire message");
-    }
-    grpc_byte_buffer_destroy(buffer);
+Status CoreCodegen::SerializeProto(const grpc::protobuf::Message& msg,
+                                   grpc_byte_buffer** bp) {
+  GPR_TIMER_SCOPE("SerializeProto", 0);
+  int byte_size = msg.ByteSize();
+  if (byte_size <= kGrpcBufferWriterMaxBufferLength) {
+    gpr_slice slice = gpr_slice_malloc(byte_size);
+    GPR_ASSERT(GPR_SLICE_END_PTR(slice) ==
+               msg.SerializeWithCachedSizesToArray(GPR_SLICE_START_PTR(slice)));
+    *bp = grpc_raw_byte_buffer_create(&slice, 1);
+    gpr_slice_unref(slice);
     return Status::OK;
+  } else {
+    GrpcBufferWriter writer(bp, kGrpcBufferWriterMaxBufferLength);
+    return msg.SerializeToZeroCopyStream(&writer)
+               ? Status::OK
+               : Status(StatusCode::INTERNAL, "Failed to serialize message");
   }
-};
+}
+
+Status CoreCodegen::DeserializeProto(grpc_byte_buffer* buffer,
+                                     grpc::protobuf::Message* msg,
+                                     int max_message_size) {
+  GPR_TIMER_SCOPE("DeserializeProto", 0);
+  if (buffer == nullptr) {
+    return Status(StatusCode::INTERNAL, "No payload");
+  }
+  GrpcBufferReader reader(buffer);
+  ::grpc::protobuf::io::CodedInputStream decoder(&reader);
+  if (max_message_size > 0) {
+    decoder.SetTotalBytesLimit(max_message_size, max_message_size);
+  }
+  if (!msg->ParseFromCodedStream(&decoder)) {
+    grpc_byte_buffer_destroy(buffer);
+    return Status(StatusCode::INTERNAL, msg->InitializationErrorString());
+  }
+  if (!decoder.ConsumedEntireMessage()) {
+    grpc_byte_buffer_destroy(buffer);
+    return Status(StatusCode::INTERNAL, "Did not read entire message");
+  }
+  grpc_byte_buffer_destroy(buffer);
+  return Status::OK;
+}
 
 }  // namespace grpc
diff --git a/src/cpp/codegen/core_codegen.h b/src/cpp/codegen/core_codegen.h
new file mode 100644
index 0000000..b591209
--- /dev/null
+++ b/src/cpp/codegen/core_codegen.h
@@ -0,0 +1,70 @@
+/*
+ *
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#include <grpc++/impl/codegen/core_codegen_interface.h>
+#include <grpc/impl/codegen/grpc_types.h>
+#include <grpc/byte_buffer.h>
+
+namespace grpc {
+
+class CoreCodegen : public CoreCodegenInterface {
+ private:
+  grpc_completion_queue* grpc_completion_queue_create(void* reserved) override;
+
+  void grpc_completion_queue_destroy(grpc_completion_queue* cq) override;
+
+  grpc_event grpc_completion_queue_pluck(grpc_completion_queue* cq, void* tag,
+                                         gpr_timespec deadline,
+                                         void* reserved) override;
+
+  void* gpr_malloc(size_t size) override;
+
+  void gpr_free(void* p) override;
+
+  void grpc_byte_buffer_destroy(grpc_byte_buffer* bb) override;
+
+  void grpc_metadata_array_init(grpc_metadata_array* array) override;
+
+  void grpc_metadata_array_destroy(grpc_metadata_array* array) override;
+
+  void assert_fail(const char* failed_assertion) override;
+
+  Status SerializeProto(const grpc::protobuf::Message& msg,
+                        grpc_byte_buffer** bp) override;
+
+  Status DeserializeProto(grpc_byte_buffer* buffer,
+                          grpc::protobuf::Message* msg,
+                          int max_message_size) override;
+};
+
+}  // namespace grpc
