Migrate to Cython
diff --git a/src/python/grpcio/grpc/_adapter/_c/module.c b/src/python/grpcio/grpc/_adapter/_c/module.c
deleted file mode 100644
index 9b93b05..0000000
--- a/src/python/grpcio/grpc/_adapter/_c/module.c
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- *
- * Copyright 2015, 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 <stdlib.h>
-
-#define PY_SSIZE_T_CLEAN
-#include <Python.h>
-#include <grpc/grpc.h>
-
-#include "grpc/_adapter/_c/types.h"
-
-static PyMethodDef c_methods[] = {
-    {NULL}
-};
-
-PyMODINIT_FUNC init_c(void) {
-  PyObject *module;
-
-  module = Py_InitModule3("_c", c_methods,
-                          "Wrappings of C structures and functions.");
-
-  if (pygrpc_module_add_types(module) < 0) {
-    return;
-  }
-
-  if (PyModule_AddStringConstant(
-          module, "PRIMARY_USER_AGENT_KEY",
-          GRPC_ARG_PRIMARY_USER_AGENT_STRING) < 0) {
-    return;
-  }
-
-  /* GRPC maintains an internal counter of how many times it has been
-     initialized and handles multiple pairs of grpc_init()/grpc_shutdown()
-     invocations accordingly. */
-  grpc_init();
-  atexit(&grpc_shutdown);
-}
diff --git a/src/python/grpcio/grpc/_adapter/_c/types.c b/src/python/grpcio/grpc/_adapter/_c/types.c
deleted file mode 100644
index 8dedf59..0000000
--- a/src/python/grpcio/grpc/_adapter/_c/types.c
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- *
- * Copyright 2015, 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/_adapter/_c/types.h"
-
-#define PY_SSIZE_T_CLEAN
-#include <Python.h>
-#include <grpc/grpc.h>
-
-int pygrpc_module_add_types(PyObject *module) {
-  int i;
-  PyTypeObject *types[] = {
-      &pygrpc_CallCredentials_type,
-      &pygrpc_ChannelCredentials_type,
-      &pygrpc_ServerCredentials_type,
-      &pygrpc_CompletionQueue_type,
-      &pygrpc_Call_type,
-      &pygrpc_Channel_type,
-      &pygrpc_Server_type
-  };
-  for (i = 0; i < sizeof(types)/sizeof(PyTypeObject *); ++i) {
-    if (PyType_Ready(types[i]) < 0) {
-      return -1;
-    }
-  }
-  for (i = 0; i < sizeof(types)/sizeof(PyTypeObject *); ++i) {
-    Py_INCREF(types[i]);
-    PyModule_AddObject(module, types[i]->tp_name, (PyObject *)types[i]);
-  }
-  return 0;
-}
diff --git a/src/python/grpcio/grpc/_adapter/_c/types.h b/src/python/grpcio/grpc/_adapter/_c/types.h
deleted file mode 100644
index 9ab415d..0000000
--- a/src/python/grpcio/grpc/_adapter/_c/types.h
+++ /dev/null
@@ -1,286 +0,0 @@
-/*
- *
- * Copyright 2015, 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.
- *
- */
-
-#ifndef GRPC__ADAPTER__C_TYPES_H_
-#define GRPC__ADAPTER__C_TYPES_H_
-
-#define PY_SSIZE_T_CLEAN
-#include <Python.h>
-#include <grpc/grpc.h>
-#include <grpc/grpc_security.h>
-
-
-/*=========================*/
-/* Client-side credentials */
-/*=========================*/
-
-typedef struct ChannelCredentials {
-  PyObject_HEAD
-  grpc_channel_credentials *c_creds;
-} ChannelCredentials;
-void pygrpc_ChannelCredentials_dealloc(ChannelCredentials *self);
-ChannelCredentials *pygrpc_ChannelCredentials_google_default(
-    PyTypeObject *type, PyObject *ignored);
-ChannelCredentials *pygrpc_ChannelCredentials_ssl(
-    PyTypeObject *type, PyObject *args, PyObject *kwargs);
-ChannelCredentials *pygrpc_ChannelCredentials_composite(
-    PyTypeObject *type, PyObject *args, PyObject *kwargs);
-extern PyTypeObject pygrpc_ChannelCredentials_type;
-
-typedef struct CallCredentials {
-  PyObject_HEAD
-  grpc_call_credentials *c_creds;
-} CallCredentials;
-void pygrpc_CallCredentials_dealloc(CallCredentials *self);
-CallCredentials *pygrpc_CallCredentials_composite(
-    PyTypeObject *type, PyObject *args, PyObject *kwargs);
-CallCredentials *pygrpc_CallCredentials_compute_engine(
-    PyTypeObject *type, PyObject *ignored);
-CallCredentials *pygrpc_CallCredentials_jwt(
-    PyTypeObject *type, PyObject *args, PyObject *kwargs);
-CallCredentials *pygrpc_CallCredentials_refresh_token(
-    PyTypeObject *type, PyObject *args, PyObject *kwargs);
-CallCredentials *pygrpc_CallCredentials_iam(
-    PyTypeObject *type, PyObject *args, PyObject *kwargs);
-extern PyTypeObject pygrpc_CallCredentials_type;
-
-/*=========================*/
-/* Server-side credentials */
-/*=========================*/
-
-typedef struct ServerCredentials {
-  PyObject_HEAD
-  grpc_server_credentials *c_creds;
-} ServerCredentials;
-void pygrpc_ServerCredentials_dealloc(ServerCredentials *self);
-ServerCredentials *pygrpc_ServerCredentials_ssl(
-    PyTypeObject *type, PyObject *args, PyObject *kwargs);
-extern PyTypeObject pygrpc_ServerCredentials_type;
-
-
-/*==================*/
-/* Completion queue */
-/*==================*/
-
-typedef struct CompletionQueue {
-  PyObject_HEAD
-  grpc_completion_queue *c_cq;
-} CompletionQueue;
-CompletionQueue *pygrpc_CompletionQueue_new(
-    PyTypeObject *type, PyObject *args, PyObject *kwargs);
-void pygrpc_CompletionQueue_dealloc(CompletionQueue *self);
-PyObject *pygrpc_CompletionQueue_next(
-    CompletionQueue *self, PyObject *args, PyObject *kwargs);
-PyObject *pygrpc_CompletionQueue_shutdown(
-    CompletionQueue *self, PyObject *ignored);
-extern PyTypeObject pygrpc_CompletionQueue_type;
-
-
-/*======*/
-/* Call */
-/*======*/
-
-typedef struct Call {
-  PyObject_HEAD
-  grpc_call *c_call;
-  CompletionQueue *cq;
-} Call;
-Call *pygrpc_Call_new_empty(CompletionQueue *cq);
-void pygrpc_Call_dealloc(Call *self);
-PyObject *pygrpc_Call_start_batch(Call *self, PyObject *args, PyObject *kwargs);
-PyObject *pygrpc_Call_cancel(Call *self, PyObject *args, PyObject *kwargs);
-PyObject *pygrpc_Call_peer(Call *self);
-PyObject *pygrpc_Call_set_credentials(Call *self, PyObject *args,
-                                      PyObject *kwargs);
-extern PyTypeObject pygrpc_Call_type;
-
-
-/*=========*/
-/* Channel */
-/*=========*/
-
-typedef struct Channel {
-  PyObject_HEAD
-  grpc_channel *c_chan;
-} Channel;
-Channel *pygrpc_Channel_new(
-    PyTypeObject *type, PyObject *args, PyObject *kwargs);
-void pygrpc_Channel_dealloc(Channel *self);
-Call *pygrpc_Channel_create_call(
-    Channel *self, PyObject *args, PyObject *kwargs);
-PyObject *pygrpc_Channel_check_connectivity_state(Channel *self, PyObject *args,
-                                                  PyObject *kwargs);
-PyObject *pygrpc_Channel_watch_connectivity_state(Channel *self, PyObject *args,
-                                                  PyObject *kwargs);
-PyObject *pygrpc_Channel_target(Channel *self);
-extern PyTypeObject pygrpc_Channel_type;
-
-
-/*========*/
-/* Server */
-/*========*/
-
-typedef struct Server {
-  PyObject_HEAD
-  grpc_server *c_serv;
-  CompletionQueue *cq;
-  int shutdown_called;
-} Server;
-Server *pygrpc_Server_new(PyTypeObject *type, PyObject *args, PyObject *kwargs);
-void pygrpc_Server_dealloc(Server *self);
-PyObject *pygrpc_Server_request_call(
-    Server *self, PyObject *args, PyObject *kwargs);
-PyObject *pygrpc_Server_add_http2_port(
-    Server *self, PyObject *args, PyObject *kwargs);
-PyObject *pygrpc_Server_start(Server *self, PyObject *ignored);
-PyObject *pygrpc_Server_shutdown(
-    Server *self, PyObject *args, PyObject *kwargs);
-PyObject *pygrpc_Server_cancel_all_calls(Server *self, PyObject *unused);
-extern PyTypeObject pygrpc_Server_type;
-
-/*=========*/
-/* Utility */
-/*=========*/
-
-/* Every tag that passes from Python GRPC to GRPC core is of this type. */
-typedef struct pygrpc_tag {
-  PyObject *user_tag;
-  Call *call;
-  grpc_call_details request_call_details;
-  grpc_metadata_array request_metadata;
-  grpc_op *ops;
-  size_t nops;
-  int is_new_call;
-} pygrpc_tag;
-
-/* Construct a tag associated with a batch call. Does not take ownership of the
-   resources in the elements of ops. */
-pygrpc_tag *pygrpc_produce_batch_tag(PyObject *user_tag, Call *call,
-                                     grpc_op *ops, size_t nops);
-
-
-/* Construct a tag associated with a server request. The calling code should
-   use the appropriate fields of the produced tag in the invocation of
-   grpc_server_request_call. */
-pygrpc_tag *pygrpc_produce_request_tag(PyObject *user_tag, Call *empty_call);
-
-/* Construct a tag associated with a server shutdown. */
-pygrpc_tag *pygrpc_produce_server_shutdown_tag(PyObject *user_tag);
-
-/* Construct a tag associated with a channel state change. */
-pygrpc_tag *pygrpc_produce_channel_state_change_tag(PyObject *user_tag);
-
-/* Frees all resources owned by the tag and the tag itself. */
-void pygrpc_discard_tag(pygrpc_tag *tag);
-
-/* Consumes an event and its associated tag, providing a Python tuple of the
-   form `(type, tag, call, call_details, results)` (where type is an integer
-   corresponding to a grpc_completion_type, tag is an arbitrary PyObject, call
-   is the call object associated with the event [if any], call_details is a
-   tuple of form `(method, host, deadline)` [if such details are available],
-   and resultd is a list of tuples of form `(type, metadata, message, status,
-   cancelled)` [where type corresponds to a grpc_op_type, metadata is a
-   sequence of 2-sequences of strings, message is a byte string, and status is
-   a 2-tuple of an integer corresponding to grpc_status_code and a string of
-   status details]).
-
-   Frees all resources associated with the event tag. */
-PyObject *pygrpc_consume_event(grpc_event event);
-
-/* Transliterate the Python tuple of form `(type, metadata, message,
-   status)` (where type is an integer corresponding to a grpc_op_type, metadata
-   is a sequence of 2-sequences of strings, message is a byte string, and
-   status is 2-tuple of an integer corresponding to grpc_status_code and a
-   string of status details) to a grpc_op suitable for use in a
-   grpc_call_start_batch invocation. The grpc_op is a 'directory' of resources
-   that must be freed after GRPC core is done with them.
-
-   Calls gpr_malloc (or the appropriate type-specific grpc_*_create function)
-   to populate the appropriate union-discriminated members of the op.
-
-   Returns true on success, false on failure. */
-int pygrpc_produce_op(PyObject *op, grpc_op *result);
-
-/* Discards all resources associated with the passed in op that was produced by
-   pygrpc_produce_op. */
-void pygrpc_discard_op(grpc_op op);
-
-/* Transliterate the grpc_ops (which have been sent through a
-   grpc_call_start_batch invocation and whose corresponding event has appeared
-   on a completion queue) to a Python tuple of form `(type, metadata, message,
-   status, cancelled)` (where type is an integer corresponding to a
-   grpc_op_type, metadata is a sequence of 2-sequences of strings, message is a
-   byte string, and status is 2-tuple of an integer corresponding to
-   grpc_status_code and a string of status details).
-
-   Calls gpr_free (or the appropriate type-specific grpc_*_destroy function) on
-   the appropriate union-discriminated populated members of the ops. */
-PyObject *pygrpc_consume_ops(grpc_op *op, size_t nops);
-
-/* Transliterate from a gpr_timespec to a double (in units of seconds, either
-   from the epoch if interpreted absolutely or as a delta otherwise). */
-double pygrpc_cast_gpr_timespec_to_double(gpr_timespec timespec);
-
-/* Transliterate from a double (in units of seconds from the epoch if
-   interpreted absolutely or as a delta otherwise) to a gpr_timespec. */
-gpr_timespec pygrpc_cast_double_to_gpr_timespec(double seconds);
-
-/* Returns true on success, false on failure. */
-int pygrpc_cast_pyseq_to_send_metadata(
-    PyObject *pyseq, grpc_metadata **metadata, size_t *count);
-/* Returns a metadata array as a Python object on success, else NULL. */
-PyObject *pygrpc_cast_metadata_array_to_pyseq(grpc_metadata_array metadata);
-
-/* Transliterate from a list of python channel arguments (2-tuples of string
-   and string|integer|None) to a grpc_channel_args object. The strings placed
-   in the grpc_channel_args object's grpc_arg elements are views of the Python
-   object. The Python object must live long enough for the grpc_channel_args
-   to be used. Arguments set to None are silently ignored. Returns true on
-   success, false on failure. */
-int pygrpc_produce_channel_args(PyObject *py_args, grpc_channel_args *c_args);
-void pygrpc_discard_channel_args(grpc_channel_args args);
-
-/* Read the bytes from grpc_byte_buffer to a gpr_malloc'd array of bytes;
-   output to result and result_size. */
-void pygrpc_byte_buffer_to_bytes(
-    grpc_byte_buffer *buffer, char **result, size_t *result_size);
-
-
-/*========*/
-/* Module */
-/*========*/
-
-/* Returns 0 on success, -1 on failure. */
-int pygrpc_module_add_types(PyObject *module);
-
-#endif  /* GRPC__ADAPTER__C_TYPES_H_ */
diff --git a/src/python/grpcio/grpc/_adapter/_c/types/call.c b/src/python/grpcio/grpc/_adapter/_c/types/call.c
deleted file mode 100644
index 04ec871..0000000
--- a/src/python/grpcio/grpc/_adapter/_c/types/call.c
+++ /dev/null
@@ -1,186 +0,0 @@
-/*
- *
- * Copyright 2015, 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/_adapter/_c/types.h"
-
-#define PY_SSIZE_T_CLEAN
-#include <Python.h>
-#include <grpc/grpc.h>
-#include <grpc/support/alloc.h>
-
-
-PyMethodDef pygrpc_Call_methods[] = {
-    {"start_batch", (PyCFunction)pygrpc_Call_start_batch, METH_KEYWORDS, ""},
-    {"cancel", (PyCFunction)pygrpc_Call_cancel, METH_KEYWORDS, ""},
-    {"peer", (PyCFunction)pygrpc_Call_peer, METH_NOARGS, ""},
-    {"set_credentials", (PyCFunction)pygrpc_Call_set_credentials, METH_KEYWORDS,
-     ""},
-    {NULL}
-};
-const char pygrpc_Call_doc[] = "See grpc._adapter._types.Call.";
-PyTypeObject pygrpc_Call_type = {
-    PyObject_HEAD_INIT(NULL)
-    0,                                        /* ob_size */
-    "Call",                                   /* tp_name */
-    sizeof(Call),                             /* tp_basicsize */
-    0,                                        /* tp_itemsize */
-    (destructor)pygrpc_Call_dealloc,          /* tp_dealloc */
-    0,                                        /* tp_print */
-    0,                                        /* tp_getattr */
-    0,                                        /* tp_setattr */
-    0,                                        /* tp_compare */
-    0,                                        /* tp_repr */
-    0,                                        /* tp_as_number */
-    0,                                        /* tp_as_sequence */
-    0,                                        /* tp_as_mapping */
-    0,                                        /* tp_hash */
-    0,                                        /* tp_call */
-    0,                                        /* tp_str */
-    0,                                        /* tp_getattro */
-    0,                                        /* tp_setattro */
-    0,                                        /* tp_as_buffer */
-    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
-    pygrpc_Call_doc,                          /* tp_doc */
-    0,                                        /* tp_traverse */
-    0,                                        /* tp_clear */
-    0,                                        /* tp_richcompare */
-    0,                                        /* tp_weaklistoffset */
-    0,                                        /* tp_iter */
-    0,                                        /* tp_iternext */
-    pygrpc_Call_methods,                      /* tp_methods */
-    0,                                        /* tp_members */
-    0,                                        /* tp_getset */
-    0,                                        /* tp_base */
-    0,                                        /* tp_dict */
-    0,                                        /* tp_descr_get */
-    0,                                        /* tp_descr_set */
-    0,                                        /* tp_dictoffset */
-    0,                                        /* tp_init */
-    0,                                        /* tp_alloc */
-    0                                         /* tp_new */
-};
-
-Call *pygrpc_Call_new_empty(CompletionQueue *cq) {
-  Call *call = (Call *)pygrpc_Call_type.tp_alloc(&pygrpc_Call_type, 0);
-  call->c_call = NULL;
-  call->cq = cq;
-  Py_XINCREF(call->cq);
-  return call;
-}
-void pygrpc_Call_dealloc(Call *self) {
-  if (self->c_call) {
-    grpc_call_destroy(self->c_call);
-  }
-  Py_XDECREF(self->cq);
-  self->ob_type->tp_free((PyObject *)self);
-}
-PyObject *pygrpc_Call_start_batch(Call *self, PyObject *args, PyObject *kwargs) {
-  PyObject *op_list;
-  PyObject *user_tag;
-  grpc_op *ops;
-  size_t nops;
-  size_t i;
-  size_t j;
-  pygrpc_tag *tag;
-  grpc_call_error errcode;
-  static char *keywords[] = {"ops", "tag", NULL};
-  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO:start_batch", keywords,
-                                   &op_list, &user_tag)) {
-    return NULL;
-  }
-  if (!PyList_Check(op_list)) {
-    PyErr_SetString(PyExc_TypeError, "expected a list of OpArgs");
-    return NULL;
-  }
-  nops = PyList_Size(op_list);
-  ops = gpr_malloc(sizeof(grpc_op) * nops);
-  for (i = 0; i < nops; ++i) {
-    PyObject *item = PyList_GET_ITEM(op_list, i);
-    if (!pygrpc_produce_op(item, &ops[i])) {
-      for (j = 0; j < i; ++j) {
-        pygrpc_discard_op(ops[j]);
-      }
-      return NULL;
-    }
-  }
-  tag = pygrpc_produce_batch_tag(user_tag, self, ops, nops);
-  errcode = grpc_call_start_batch(self->c_call, tag->ops, tag->nops, tag, NULL);
-  gpr_free(ops);
-  return PyInt_FromLong(errcode);
-}
-PyObject *pygrpc_Call_cancel(Call *self, PyObject *args, PyObject *kwargs) {
-  PyObject *py_code = NULL;
-  grpc_call_error errcode;
-  int code;
-  char *details = NULL;
-  static char *keywords[] = {"code", "details", NULL};
-  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|Os:start_batch", keywords,
-                                   &py_code, &details)) {
-    return NULL;
-  }
-  if (py_code != NULL && details != NULL) {
-    if (!PyInt_Check(py_code)) {
-      PyErr_SetString(PyExc_TypeError, "expected integer code");
-      return NULL;
-    }
-    code = PyInt_AsLong(py_code);
-    errcode = grpc_call_cancel_with_status(self->c_call, code, details, NULL);
-  } else if (py_code != NULL || details != NULL) {
-    PyErr_SetString(PyExc_ValueError,
-                    "if `code` is specified, so must `details`");
-    return NULL;
-  } else {
-    errcode = grpc_call_cancel(self->c_call, NULL);
-  }
-  return PyInt_FromLong(errcode);
-}
-
-PyObject *pygrpc_Call_peer(Call *self) {
-  char *peer = grpc_call_get_peer(self->c_call);
-  PyObject *py_peer = PyString_FromString(peer);
-  gpr_free(peer);
-  return py_peer;
-}
-PyObject *pygrpc_Call_set_credentials(Call *self, PyObject *args,
-                                      PyObject *kwargs) {
-  CallCredentials *creds;
-  grpc_call_error errcode;
-  static char *keywords[] = {"creds", NULL};
-  if (!PyArg_ParseTupleAndKeywords(
-      args, kwargs, "O!:set_credentials", keywords,
-      &pygrpc_CallCredentials_type, &creds)) {
-    return NULL;
-  }
-  errcode = grpc_call_set_credentials(self->c_call, creds->c_creds);
-  return PyInt_FromLong(errcode);
-}
diff --git a/src/python/grpcio/grpc/_adapter/_c/types/call_credentials.c b/src/python/grpcio/grpc/_adapter/_c/types/call_credentials.c
deleted file mode 100644
index 5a15a6e..0000000
--- a/src/python/grpcio/grpc/_adapter/_c/types/call_credentials.c
+++ /dev/null
@@ -1,203 +0,0 @@
-/*
- *
- * Copyright 2015, 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/_adapter/_c/types.h"
-
-#define PY_SSIZE_T_CLEAN
-#include <Python.h>
-#include <grpc/grpc.h>
-#include <grpc/grpc_security.h>
-
-
-PyMethodDef pygrpc_CallCredentials_methods[] = {
-    {"composite", (PyCFunction)pygrpc_CallCredentials_composite,
-     METH_CLASS|METH_KEYWORDS, ""},
-    {"compute_engine", (PyCFunction)pygrpc_CallCredentials_compute_engine,
-     METH_CLASS|METH_NOARGS, ""},
-    {"jwt", (PyCFunction)pygrpc_CallCredentials_jwt,
-     METH_CLASS|METH_KEYWORDS, ""},
-    {"refresh_token", (PyCFunction)pygrpc_CallCredentials_refresh_token,
-     METH_CLASS|METH_KEYWORDS, ""},
-    {"iam", (PyCFunction)pygrpc_CallCredentials_iam,
-     METH_CLASS|METH_KEYWORDS, ""},
-    {NULL}
-};
-
-const char pygrpc_CallCredentials_doc[] = "";
-PyTypeObject pygrpc_CallCredentials_type = {
-    PyObject_HEAD_INIT(NULL)
-    0,                                        /* ob_size */
-    "CallCredentials",                        /* tp_name */
-    sizeof(CallCredentials),                  /* tp_basicsize */
-    0,                                        /* tp_itemsize */
-    (destructor)pygrpc_CallCredentials_dealloc, /* tp_dealloc */
-    0,                                        /* tp_print */
-    0,                                        /* tp_getattr */
-    0,                                        /* tp_setattr */
-    0,                                        /* tp_compare */
-    0,                                        /* tp_repr */
-    0,                                        /* tp_as_number */
-    0,                                        /* tp_as_sequence */
-    0,                                        /* tp_as_mapping */
-    0,                                        /* tp_hash */
-    0,                                        /* tp_call */
-    0,                                        /* tp_str */
-    0,                                        /* tp_getattro */
-    0,                                        /* tp_setattro */
-    0,                                        /* tp_as_buffer */
-    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
-    pygrpc_CallCredentials_doc,             /* tp_doc */
-    0,                                        /* tp_traverse */
-    0,                                        /* tp_clear */
-    0,                                        /* tp_richcompare */
-    0,                                        /* tp_weaklistoffset */
-    0,                                        /* tp_iter */
-    0,                                        /* tp_iternext */
-    pygrpc_CallCredentials_methods,         /* tp_methods */
-    0,                                        /* tp_members */
-    0,                                        /* tp_getset */
-    0,                                        /* tp_base */
-    0,                                        /* tp_dict */
-    0,                                        /* tp_descr_get */
-    0,                                        /* tp_descr_set */
-    0,                                        /* tp_dictoffset */
-    0,                                        /* tp_init */
-    0,                                        /* tp_alloc */
-    0                                         /* tp_new */
-};
-
-void pygrpc_CallCredentials_dealloc(CallCredentials *self) {
-  grpc_call_credentials_release(self->c_creds);
-  self->ob_type->tp_free((PyObject *)self);
-}
-
-CallCredentials *pygrpc_CallCredentials_composite(
-    PyTypeObject *type, PyObject *args, PyObject *kwargs) {
-  CallCredentials *self;
-  CallCredentials *creds1;
-  CallCredentials *creds2;
-  static char *keywords[] = {"creds1", "creds2", NULL};
-  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!O!:composite", keywords,
-        &pygrpc_CallCredentials_type, &creds1,
-        &pygrpc_CallCredentials_type, &creds2)) {
-    return NULL;
-  }
-  self = (CallCredentials *)type->tp_alloc(type, 0);
-  self->c_creds =
-      grpc_composite_call_credentials_create(
-          creds1->c_creds, creds2->c_creds, NULL);
-  if (!self->c_creds) {
-    Py_DECREF(self);
-    PyErr_SetString(PyExc_RuntimeError, "couldn't create composite credentials");
-    return NULL;
-  }
-  return self;
-}
-
-CallCredentials *pygrpc_CallCredentials_compute_engine(
-    PyTypeObject *type, PyObject *ignored) {
-  CallCredentials *self = (CallCredentials *)type->tp_alloc(type, 0);
-  self->c_creds = grpc_google_compute_engine_credentials_create(NULL);
-  if (!self->c_creds) {
-    Py_DECREF(self);
-    PyErr_SetString(PyExc_RuntimeError,
-                    "couldn't create compute engine credentials");
-    return NULL;
-  }
-  return self;
-}
-
-/* TODO: Rename this credentials to something like service_account_jwt_access */
-CallCredentials *pygrpc_CallCredentials_jwt(
-    PyTypeObject *type, PyObject *args, PyObject *kwargs) {
-  CallCredentials *self;
-  const char *json_key;
-  double lifetime;
-  static char *keywords[] = {"json_key", "token_lifetime", NULL};
-  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "sd:jwt", keywords,
-        &json_key, &lifetime)) {
-    return NULL;
-  }
-  self = (CallCredentials *)type->tp_alloc(type, 0);
-  self->c_creds = grpc_service_account_jwt_access_credentials_create(
-      json_key, pygrpc_cast_double_to_gpr_timespec(lifetime), NULL);
-  if (!self->c_creds) {
-    Py_DECREF(self);
-    PyErr_SetString(PyExc_RuntimeError, "couldn't create JWT credentials");
-    return NULL;
-  }
-  return self;
-}
-
-CallCredentials *pygrpc_CallCredentials_refresh_token(
-    PyTypeObject *type, PyObject *args, PyObject *kwargs) {
-  CallCredentials *self;
-  const char *json_refresh_token;
-  static char *keywords[] = {"json_refresh_token", NULL};
-  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s:refresh_token", keywords,
-        &json_refresh_token)) {
-    return NULL;
-  }
-  self = (CallCredentials *)type->tp_alloc(type, 0);
-  self->c_creds =
-      grpc_google_refresh_token_credentials_create(json_refresh_token, NULL);
-  if (!self->c_creds) {
-    Py_DECREF(self);
-    PyErr_SetString(PyExc_RuntimeError,
-                    "couldn't create credentials from refresh token");
-    return NULL;
-  }
-  return self;
-}
-
-CallCredentials *pygrpc_CallCredentials_iam(
-    PyTypeObject *type, PyObject *args, PyObject *kwargs) {
-  CallCredentials *self;
-  const char *authorization_token;
-  const char *authority_selector;
-  static char *keywords[] = {"authorization_token", "authority_selector", NULL};
-  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "ss:iam", keywords,
-        &authorization_token, &authority_selector)) {
-    return NULL;
-  }
-  self = (CallCredentials *)type->tp_alloc(type, 0);
-  self->c_creds = grpc_google_iam_credentials_create(authorization_token,
-                                                     authority_selector, NULL);
-  if (!self->c_creds) {
-    Py_DECREF(self);
-    PyErr_SetString(PyExc_RuntimeError, "couldn't create IAM credentials");
-    return NULL;
-  }
-  return self;
-}
-
diff --git a/src/python/grpcio/grpc/_adapter/_c/types/channel.c b/src/python/grpcio/grpc/_adapter/_c/types/channel.c
deleted file mode 100644
index c4db2a0..0000000
--- a/src/python/grpcio/grpc/_adapter/_c/types/channel.c
+++ /dev/null
@@ -1,187 +0,0 @@
-/*
- *
- * Copyright 2015, 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/_adapter/_c/types.h"
-
-#define PY_SSIZE_T_CLEAN
-#include <Python.h>
-#include <grpc/grpc.h>
-#include <grpc/support/alloc.h>
-
-
-PyMethodDef pygrpc_Channel_methods[] = {
-    {"create_call", (PyCFunction)pygrpc_Channel_create_call, METH_KEYWORDS, ""},
-    {"check_connectivity_state", (PyCFunction)pygrpc_Channel_check_connectivity_state, METH_KEYWORDS, ""},
-    {"watch_connectivity_state", (PyCFunction)pygrpc_Channel_watch_connectivity_state, METH_KEYWORDS, ""},
-    {"target", (PyCFunction)pygrpc_Channel_target, METH_NOARGS, ""},
-    {NULL}
-};
-const char pygrpc_Channel_doc[] = "See grpc._adapter._types.Channel.";
-PyTypeObject pygrpc_Channel_type = {
-    PyObject_HEAD_INIT(NULL)
-    0,                                        /* ob_size */
-    "Channel",                                /* tp_name */
-    sizeof(Channel),                          /* tp_basicsize */
-    0,                                        /* tp_itemsize */
-    (destructor)pygrpc_Channel_dealloc,       /* tp_dealloc */
-    0,                                        /* tp_print */
-    0,                                        /* tp_getattr */
-    0,                                        /* tp_setattr */
-    0,                                        /* tp_compare */
-    0,                                        /* tp_repr */
-    0,                                        /* tp_as_number */
-    0,                                        /* tp_as_sequence */
-    0,                                        /* tp_as_mapping */
-    0,                                        /* tp_hash */
-    0,                                        /* tp_call */
-    0,                                        /* tp_str */
-    0,                                        /* tp_getattro */
-    0,                                        /* tp_setattro */
-    0,                                        /* tp_as_buffer */
-    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
-    pygrpc_Channel_doc,                       /* tp_doc */
-    0,                                        /* tp_traverse */
-    0,                                        /* tp_clear */
-    0,                                        /* tp_richcompare */
-    0,                                        /* tp_weaklistoffset */
-    0,                                        /* tp_iter */
-    0,                                        /* tp_iternext */
-    pygrpc_Channel_methods,                   /* tp_methods */
-    0,                                        /* tp_members */
-    0,                                        /* tp_getset */
-    0,                                        /* tp_base */
-    0,                                        /* tp_dict */
-    0,                                        /* tp_descr_get */
-    0,                                        /* tp_descr_set */
-    0,                                        /* tp_dictoffset */
-    0,                                        /* tp_init */
-    0,                                        /* tp_alloc */
-    (newfunc)pygrpc_Channel_new               /* tp_new */
-};
-
-Channel *pygrpc_Channel_new(
-    PyTypeObject *type, PyObject *args, PyObject *kwargs) {
-  Channel *self;
-  const char *target;
-  PyObject *py_args;
-  ChannelCredentials *creds = NULL;
-  grpc_channel_args c_args;
-  char *keywords[] = {"target", "args", "creds", NULL};
-  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "sO|O!:Channel", keywords,
-        &target, &py_args, &pygrpc_ChannelCredentials_type, &creds)) {
-    return NULL;
-  }
-  if (!pygrpc_produce_channel_args(py_args, &c_args)) {
-    return NULL;
-  }
-  self = (Channel *)type->tp_alloc(type, 0);
-  if (creds) {
-    self->c_chan =
-        grpc_secure_channel_create(creds->c_creds, target, &c_args, NULL);
-  } else {
-    self->c_chan = grpc_insecure_channel_create(target, &c_args, NULL);
-  }
-  pygrpc_discard_channel_args(c_args);
-  return self;
-}
-void pygrpc_Channel_dealloc(Channel *self) {
-  grpc_channel_destroy(self->c_chan);
-  self->ob_type->tp_free((PyObject *)self);
-}
-
-Call *pygrpc_Channel_create_call(
-    Channel *self, PyObject *args, PyObject *kwargs) {
-  Call *call;
-  CompletionQueue *cq;
-  const char *method;
-  const char *host;
-  double deadline;
-  char *keywords[] = {"cq", "method", "host", "deadline", NULL};
-  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!szd:create_call", keywords,
-        &pygrpc_CompletionQueue_type, &cq, &method, &host, &deadline)) {
-    return NULL;
-  }
-  call = pygrpc_Call_new_empty(cq);
-  call->c_call = grpc_channel_create_call(
-      self->c_chan, NULL, GRPC_PROPAGATE_DEFAULTS, cq->c_cq, method, host,
-      pygrpc_cast_double_to_gpr_timespec(deadline), NULL);
-  return call;
-}
-
-PyObject *pygrpc_Channel_check_connectivity_state(
-    Channel *self, PyObject *args, PyObject *kwargs) {
-  PyObject *py_try_to_connect;
-  int try_to_connect;
-  char *keywords[] = {"try_to_connect", NULL};
-  grpc_connectivity_state state;
-  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O:connectivity_state", keywords,
-                                   &py_try_to_connect)) {
-    return NULL;
-  }
-  if (!PyBool_Check(py_try_to_connect)) {
-    Py_XDECREF(py_try_to_connect);
-    return NULL;
-  }
-  try_to_connect = Py_True == py_try_to_connect;
-  Py_DECREF(py_try_to_connect);
-  state = grpc_channel_check_connectivity_state(self->c_chan, try_to_connect);
-  return PyInt_FromLong(state);
-}
-
-PyObject *pygrpc_Channel_watch_connectivity_state(
-    Channel *self, PyObject *args, PyObject *kwargs) {
-  PyObject *tag;
-  double deadline;
-  int last_observed_state;
-  CompletionQueue *completion_queue;
-  char *keywords[] = {"last_observed_state", "deadline",
-                      "completion_queue", "tag", NULL};
-  if (!PyArg_ParseTupleAndKeywords(
-      args, kwargs, "idO!O:watch_connectivity_state", keywords,
-      &last_observed_state, &deadline, &pygrpc_CompletionQueue_type,
-      &completion_queue, &tag)) {
-    return NULL;
-  }
-  grpc_channel_watch_connectivity_state(
-      self->c_chan, (grpc_connectivity_state)last_observed_state,
-      pygrpc_cast_double_to_gpr_timespec(deadline), completion_queue->c_cq,
-      pygrpc_produce_channel_state_change_tag(tag));
-  Py_RETURN_NONE;
-}
-
-PyObject *pygrpc_Channel_target(Channel *self) {
-  char *target = grpc_channel_get_target(self->c_chan);
-  PyObject *py_target = PyString_FromString(target);
-  gpr_free(target);
-  return py_target;
-}
diff --git a/src/python/grpcio/grpc/_adapter/_c/types/channel_credentials.c b/src/python/grpcio/grpc/_adapter/_c/types/channel_credentials.c
deleted file mode 100644
index 83b1fc0..0000000
--- a/src/python/grpcio/grpc/_adapter/_c/types/channel_credentials.c
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- *
- * Copyright 2015, 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/_adapter/_c/types.h"
-
-#define PY_SSIZE_T_CLEAN
-#include <Python.h>
-#include <grpc/grpc.h>
-#include <grpc/grpc_security.h>
-
-
-PyMethodDef pygrpc_ChannelCredentials_methods[] = {
-    {"google_default", (PyCFunction)pygrpc_ChannelCredentials_google_default,
-     METH_CLASS|METH_NOARGS, ""},
-    {"ssl", (PyCFunction)pygrpc_ChannelCredentials_ssl,
-     METH_CLASS|METH_KEYWORDS, ""},
-    {"composite", (PyCFunction)pygrpc_ChannelCredentials_composite,
-     METH_CLASS|METH_KEYWORDS, ""},
-    {NULL}
-};
-
-const char pygrpc_ChannelCredentials_doc[] = "";
-PyTypeObject pygrpc_ChannelCredentials_type = {
-    PyObject_HEAD_INIT(NULL)
-    0,                                        /* ob_size */
-    "ChannelCredentials",                     /* tp_name */
-    sizeof(ChannelCredentials),               /* tp_basicsize */
-    0,                                        /* tp_itemsize */
-    (destructor)pygrpc_ChannelCredentials_dealloc, /* tp_dealloc */
-    0,                                        /* tp_print */
-    0,                                        /* tp_getattr */
-    0,                                        /* tp_setattr */
-    0,                                        /* tp_compare */
-    0,                                        /* tp_repr */
-    0,                                        /* tp_as_number */
-    0,                                        /* tp_as_sequence */
-    0,                                        /* tp_as_mapping */
-    0,                                        /* tp_hash */
-    0,                                        /* tp_call */
-    0,                                        /* tp_str */
-    0,                                        /* tp_getattro */
-    0,                                        /* tp_setattro */
-    0,                                        /* tp_as_buffer */
-    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
-    pygrpc_ChannelCredentials_doc,             /* tp_doc */
-    0,                                        /* tp_traverse */
-    0,                                        /* tp_clear */
-    0,                                        /* tp_richcompare */
-    0,                                        /* tp_weaklistoffset */
-    0,                                        /* tp_iter */
-    0,                                        /* tp_iternext */
-    pygrpc_ChannelCredentials_methods,         /* tp_methods */
-    0,                                        /* tp_members */
-    0,                                        /* tp_getset */
-    0,                                        /* tp_base */
-    0,                                        /* tp_dict */
-    0,                                        /* tp_descr_get */
-    0,                                        /* tp_descr_set */
-    0,                                        /* tp_dictoffset */
-    0,                                        /* tp_init */
-    0,                                        /* tp_alloc */
-    0                                         /* tp_new */
-};
-
-void pygrpc_ChannelCredentials_dealloc(ChannelCredentials *self) {
-  grpc_channel_credentials_release(self->c_creds);
-  self->ob_type->tp_free((PyObject *)self);
-}
-
-ChannelCredentials *pygrpc_ChannelCredentials_google_default(
-    PyTypeObject *type, PyObject *ignored) {
-  ChannelCredentials *self = (ChannelCredentials *)type->tp_alloc(type, 0);
-  self->c_creds = grpc_google_default_credentials_create();
-  if (!self->c_creds) {
-    Py_DECREF(self);
-    PyErr_SetString(PyExc_RuntimeError,
-                    "couldn't create Google default credentials");
-    return NULL;
-  }
-  return self;
-}
-
-ChannelCredentials *pygrpc_ChannelCredentials_ssl(
-    PyTypeObject *type, PyObject *args, PyObject *kwargs) {
-  ChannelCredentials *self;
-  const char *root_certs;
-  const char *private_key = NULL;
-  const char *cert_chain = NULL;
-  grpc_ssl_pem_key_cert_pair key_cert_pair;
-  static char *keywords[] = {"root_certs", "private_key", "cert_chain", NULL};
-  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "z|zz:ssl", keywords,
-        &root_certs, &private_key, &cert_chain)) {
-    return NULL;
-  }
-  self = (ChannelCredentials *)type->tp_alloc(type, 0);
-  if (private_key && cert_chain) {
-    key_cert_pair.private_key = private_key;
-    key_cert_pair.cert_chain = cert_chain;
-    self->c_creds =
-        grpc_ssl_credentials_create(root_certs, &key_cert_pair, NULL);
-  } else {
-    self->c_creds = grpc_ssl_credentials_create(root_certs, NULL, NULL);
-  }
-  if (!self->c_creds) {
-    Py_DECREF(self);
-    PyErr_SetString(PyExc_RuntimeError, "couldn't create ssl credentials");
-    return NULL;
-  }
-  return self;
-}
-
-ChannelCredentials *pygrpc_ChannelCredentials_composite(
-    PyTypeObject *type, PyObject *args, PyObject *kwargs) {
-  ChannelCredentials *self;
-  ChannelCredentials *creds1;
-  CallCredentials *creds2;
-  static char *keywords[] = {"creds1", "creds2", NULL};
-  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!O!:composite", keywords,
-        &pygrpc_ChannelCredentials_type, &creds1,
-        &pygrpc_CallCredentials_type, &creds2)) {
-    return NULL;
-  }
-  self = (ChannelCredentials *)type->tp_alloc(type, 0);
-  self->c_creds =
-      grpc_composite_channel_credentials_create(
-          creds1->c_creds, creds2->c_creds, NULL);
-  if (!self->c_creds) {
-    Py_DECREF(self);
-    PyErr_SetString(
-        PyExc_RuntimeError, "couldn't create composite credentials");
-    return NULL;
-  }
-  return self;
-}
-
diff --git a/src/python/grpcio/grpc/_adapter/_c/types/completion_queue.c b/src/python/grpcio/grpc/_adapter/_c/types/completion_queue.c
deleted file mode 100644
index d8bb89c..0000000
--- a/src/python/grpcio/grpc/_adapter/_c/types/completion_queue.c
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- *
- * Copyright 2015, 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/_adapter/_c/types.h"
-
-#define PY_SSIZE_T_CLEAN
-#include <Python.h>
-#include <grpc/grpc.h>
-
-
-PyMethodDef pygrpc_CompletionQueue_methods[] = {
-    {"next", (PyCFunction)pygrpc_CompletionQueue_next, METH_KEYWORDS, ""},
-    {"shutdown", (PyCFunction)pygrpc_CompletionQueue_shutdown, METH_NOARGS, ""},
-    {NULL}
-};
-const char pygrpc_CompletionQueue_doc[] =
-    "See grpc._adapter._types.CompletionQueue.";
-PyTypeObject pygrpc_CompletionQueue_type = {
-    PyObject_HEAD_INIT(NULL)
-    0,                                        /* ob_size */
-    "CompletionQueue",                        /* tp_name */
-    sizeof(CompletionQueue),                  /* tp_basicsize */
-    0,                                        /* tp_itemsize */
-    (destructor)pygrpc_CompletionQueue_dealloc, /* tp_dealloc */
-    0,                                        /* tp_print */
-    0,                                        /* tp_getattr */
-    0,                                        /* tp_setattr */
-    0,                                        /* tp_compare */
-    0,                                        /* tp_repr */
-    0,                                        /* tp_as_number */
-    0,                                        /* tp_as_sequence */
-    0,                                        /* tp_as_mapping */
-    0,                                        /* tp_hash */
-    0,                                        /* tp_call */
-    0,                                        /* tp_str */
-    0,                                        /* tp_getattro */
-    0,                                        /* tp_setattro */
-    0,                                        /* tp_as_buffer */
-    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
-    pygrpc_CompletionQueue_doc,               /* tp_doc */
-    0,                                        /* tp_traverse */
-    0,                                        /* tp_clear */
-    0,                                        /* tp_richcompare */
-    0,                                        /* tp_weaklistoffset */
-    0,                                        /* tp_iter */
-    0,                                        /* tp_iternext */
-    pygrpc_CompletionQueue_methods,           /* tp_methods */
-    0,                                        /* tp_members */
-    0,                                        /* tp_getset */
-    0,                                        /* tp_base */
-    0,                                        /* tp_dict */
-    0,                                        /* tp_descr_get */
-    0,                                        /* tp_descr_set */
-    0,                                        /* tp_dictoffset */
-    0,                                        /* tp_init */
-    0,                                        /* tp_alloc */
-    (newfunc)pygrpc_CompletionQueue_new       /* tp_new */
-};
-
-CompletionQueue *pygrpc_CompletionQueue_new(
-    PyTypeObject *type, PyObject *args, PyObject *kwargs) {
-  CompletionQueue *self = (CompletionQueue *)type->tp_alloc(type, 0);
-  self->c_cq = grpc_completion_queue_create(NULL);
-  return self;
-}
-
-void pygrpc_CompletionQueue_dealloc(CompletionQueue *self) {
-  grpc_completion_queue_destroy(self->c_cq);
-  self->ob_type->tp_free((PyObject *)self);
-}
-
-PyObject *pygrpc_CompletionQueue_next(
-    CompletionQueue *self, PyObject *args, PyObject *kwargs) {
-  double deadline;
-  grpc_event event;
-  PyObject *transliterated_event;
-  static char *keywords[] = {"deadline", NULL};
-  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "d:next", keywords,
-                                   &deadline)) {
-    return NULL;
-  }
-  Py_BEGIN_ALLOW_THREADS;
-  event = grpc_completion_queue_next(
-      self->c_cq, pygrpc_cast_double_to_gpr_timespec(deadline), NULL);
-  Py_END_ALLOW_THREADS;
-  transliterated_event = pygrpc_consume_event(event);
-  return transliterated_event;
-}
-
-PyObject *pygrpc_CompletionQueue_shutdown(
-    CompletionQueue *self, PyObject *ignored) {
-  grpc_completion_queue_shutdown(self->c_cq);
-  Py_RETURN_NONE;
-}
diff --git a/src/python/grpcio/grpc/_adapter/_c/types/server.c b/src/python/grpcio/grpc/_adapter/_c/types/server.c
deleted file mode 100644
index 8feab8a..0000000
--- a/src/python/grpcio/grpc/_adapter/_c/types/server.c
+++ /dev/null
@@ -1,196 +0,0 @@
-/*
- *
- * Copyright 2015, 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/_adapter/_c/types.h"
-
-#define PY_SSIZE_T_CLEAN
-#include <Python.h>
-#include <grpc/grpc.h>
-
-
-PyMethodDef pygrpc_Server_methods[] = {
-    {"request_call", (PyCFunction)pygrpc_Server_request_call,
-     METH_KEYWORDS, ""},
-    {"add_http2_port", (PyCFunction)pygrpc_Server_add_http2_port,
-     METH_KEYWORDS, ""},
-    {"start", (PyCFunction)pygrpc_Server_start, METH_NOARGS, ""},
-    {"shutdown", (PyCFunction)pygrpc_Server_shutdown, METH_KEYWORDS, ""},
-    {"cancel_all_calls", (PyCFunction)pygrpc_Server_cancel_all_calls,
-     METH_NOARGS, ""},
-    {NULL}
-};
-const char pygrpc_Server_doc[] = "See grpc._adapter._types.Server.";
-PyTypeObject pygrpc_Server_type = {
-    PyObject_HEAD_INIT(NULL)
-    0,                                        /* ob_size */
-    "Server",                                 /* tp_name */
-    sizeof(Server),                           /* tp_basicsize */
-    0,                                        /* tp_itemsize */
-    (destructor)pygrpc_Server_dealloc,        /* tp_dealloc */
-    0,                                        /* tp_print */
-    0,                                        /* tp_getattr */
-    0,                                        /* tp_setattr */
-    0,                                        /* tp_compare */
-    0,                                        /* tp_repr */
-    0,                                        /* tp_as_number */
-    0,                                        /* tp_as_sequence */
-    0,                                        /* tp_as_mapping */
-    0,                                        /* tp_hash */
-    0,                                        /* tp_call */
-    0,                                        /* tp_str */
-    0,                                        /* tp_getattro */
-    0,                                        /* tp_setattro */
-    0,                                        /* tp_as_buffer */
-    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
-    pygrpc_Server_doc,                        /* tp_doc */
-    0,                                        /* tp_traverse */
-    0,                                        /* tp_clear */
-    0,                                        /* tp_richcompare */
-    0,                                        /* tp_weaklistoffset */
-    0,                                        /* tp_iter */
-    0,                                        /* tp_iternext */
-    pygrpc_Server_methods,                    /* tp_methods */
-    0,                                        /* tp_members */
-    0,                                        /* tp_getset */
-    0,                                        /* tp_base */
-    0,                                        /* tp_dict */
-    0,                                        /* tp_descr_get */
-    0,                                        /* tp_descr_set */
-    0,                                        /* tp_dictoffset */
-    0,                                        /* tp_init */
-    0,                                        /* tp_alloc */
-    (newfunc)pygrpc_Server_new                /* tp_new */
-};
-
-Server *pygrpc_Server_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) {
-  Server *self;
-  CompletionQueue *cq;
-  PyObject *py_args;
-  grpc_channel_args c_args;
-  char *keywords[] = {"cq", "args", NULL};
-  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!O:Server", keywords,
-        &pygrpc_CompletionQueue_type, &cq, &py_args)) {
-    return NULL;
-  }
-  if (!pygrpc_produce_channel_args(py_args, &c_args)) {
-    return NULL;
-  }
-  self = (Server *)type->tp_alloc(type, 0);
-  self->c_serv = grpc_server_create(&c_args, NULL);
-  grpc_server_register_completion_queue(self->c_serv, cq->c_cq, NULL);
-  pygrpc_discard_channel_args(c_args);
-  self->cq = cq;
-  Py_INCREF(self->cq);
-  self->shutdown_called = 0;
-  return self;
-}
-
-void pygrpc_Server_dealloc(Server *self) {
-  grpc_server_destroy(self->c_serv);
-  Py_XDECREF(self->cq);
-  self->ob_type->tp_free((PyObject *)self);
-}
-
-PyObject *pygrpc_Server_request_call(
-    Server *self, PyObject *args, PyObject *kwargs) {
-  CompletionQueue *cq;
-  PyObject *user_tag;
-  pygrpc_tag *tag;
-  Call *empty_call;
-  grpc_call_error errcode;
-  static char *keywords[] = {"cq", "tag", NULL};
-  if (!PyArg_ParseTupleAndKeywords(
-      args, kwargs, "O!O", keywords,
-      &pygrpc_CompletionQueue_type, &cq, &user_tag)) {
-    return NULL;
-  }
-  empty_call = pygrpc_Call_new_empty(cq);
-  tag = pygrpc_produce_request_tag(user_tag, empty_call);
-  errcode = grpc_server_request_call(
-      self->c_serv, &tag->call->c_call, &tag->request_call_details,
-      &tag->request_metadata, tag->call->cq->c_cq, self->cq->c_cq, tag);
-  Py_DECREF(empty_call);
-  return PyInt_FromLong(errcode);
-}
-
-PyObject *pygrpc_Server_add_http2_port(
-    Server *self, PyObject *args, PyObject *kwargs) {
-  const char *addr;
-  ServerCredentials *creds = NULL;
-  int port;
-  static char *keywords[] = {"addr", "creds", NULL};
-  if (!PyArg_ParseTupleAndKeywords(
-      args, kwargs, "s|O!:add_http2_port", keywords,
-      &addr, &pygrpc_ServerCredentials_type, &creds)) {
-    return NULL;
-  }
-  if (creds) {
-    port = grpc_server_add_secure_http2_port(
-        self->c_serv, addr, creds->c_creds);
-  } else {
-    port = grpc_server_add_insecure_http2_port(self->c_serv, addr);
-  }
-  return PyInt_FromLong(port);
-
-}
-
-PyObject *pygrpc_Server_start(Server *self, PyObject *ignored) {
-  grpc_server_start(self->c_serv);
-  self->shutdown_called = 0;
-  Py_RETURN_NONE;
-}
-
-PyObject *pygrpc_Server_shutdown(
-    Server *self, PyObject *args, PyObject *kwargs) {
-  PyObject *user_tag;
-  pygrpc_tag *tag;
-  static char *keywords[] = {"tag", NULL};
-  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O", keywords, &user_tag)) {
-    return NULL;
-  }
-  tag = pygrpc_produce_server_shutdown_tag(user_tag);
-  grpc_server_shutdown_and_notify(self->c_serv, self->cq->c_cq, tag);
-  self->shutdown_called = 1;
-  Py_RETURN_NONE;
-}
-
-PyObject *pygrpc_Server_cancel_all_calls(Server *self, PyObject *unused) {
-  if (!self->shutdown_called) {
-    PyErr_SetString(
-        PyExc_RuntimeError,
-        "shutdown must have been called prior to calling cancel_all_calls!");
-    return NULL;
-  }
-  grpc_server_cancel_all_calls(self->c_serv);
-  Py_RETURN_NONE;
-}
diff --git a/src/python/grpcio/grpc/_adapter/_c/types/server_credentials.c b/src/python/grpcio/grpc/_adapter/_c/types/server_credentials.c
deleted file mode 100644
index df51a99..0000000
--- a/src/python/grpcio/grpc/_adapter/_c/types/server_credentials.c
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- *
- * Copyright 2015, 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/_adapter/_c/types.h"
-
-#define PY_SSIZE_T_CLEAN
-#include <Python.h>
-#include <grpc/grpc.h>
-#include <grpc/grpc_security.h>
-#include <grpc/support/alloc.h>
-
-
-PyMethodDef pygrpc_ServerCredentials_methods[] = {
-    {"ssl", (PyCFunction)pygrpc_ServerCredentials_ssl,
-     METH_CLASS|METH_KEYWORDS, ""},
-    {NULL}
-};
-const char pygrpc_ServerCredentials_doc[] = "";
-PyTypeObject pygrpc_ServerCredentials_type = {
-    PyObject_HEAD_INIT(NULL)
-    0,                                        /* ob_size */
-    "ServerCredentials",                      /* tp_name */
-    sizeof(ServerCredentials),                /* tp_basicsize */
-    0,                                        /* tp_itemsize */
-    (destructor)pygrpc_ServerCredentials_dealloc, /* tp_dealloc */
-    0,                                        /* tp_print */
-    0,                                        /* tp_getattr */
-    0,                                        /* tp_setattr */
-    0,                                        /* tp_compare */
-    0,                                        /* tp_repr */
-    0,                                        /* tp_as_number */
-    0,                                        /* tp_as_sequence */
-    0,                                        /* tp_as_mapping */
-    0,                                        /* tp_hash */
-    0,                                        /* tp_call */
-    0,                                        /* tp_str */
-    0,                                        /* tp_getattro */
-    0,                                        /* tp_setattro */
-    0,                                        /* tp_as_buffer */
-    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
-    pygrpc_ServerCredentials_doc,             /* tp_doc */
-    0,                                        /* tp_traverse */
-    0,                                        /* tp_clear */
-    0,                                        /* tp_richcompare */
-    0,                                        /* tp_weaklistoffset */
-    0,                                        /* tp_iter */
-    0,                                        /* tp_iternext */
-    pygrpc_ServerCredentials_methods,         /* tp_methods */
-    0,                                        /* tp_members */
-    0,                                        /* tp_getset */
-    0,                                        /* tp_base */
-    0,                                        /* tp_dict */
-    0,                                        /* tp_descr_get */
-    0,                                        /* tp_descr_set */
-    0,                                        /* tp_dictoffset */
-    0,                                        /* tp_init */
-    0,                                        /* tp_alloc */
-    0                                         /* tp_new */
-};
-
-void pygrpc_ServerCredentials_dealloc(ServerCredentials *self) {
-  grpc_server_credentials_release(self->c_creds);
-  self->ob_type->tp_free((PyObject *)self);
-}
-
-ServerCredentials *pygrpc_ServerCredentials_ssl(
-    PyTypeObject *type, PyObject *args, PyObject *kwargs) {
-  ServerCredentials *self;
-  const char *root_certs;
-  PyObject *py_key_cert_pairs;
-  grpc_ssl_pem_key_cert_pair *key_cert_pairs;
-  int force_client_auth;
-  size_t num_key_cert_pairs;
-  size_t i;
-  static char *keywords[] = {
-      "root_certs", "key_cert_pairs", "force_client_auth", NULL};
-  if (!PyArg_ParseTupleAndKeywords(args, kwargs, "zOi:ssl", keywords,
-	&root_certs, &py_key_cert_pairs, &force_client_auth)) {
-    return NULL;
-  }
-  if (!PyList_Check(py_key_cert_pairs)) {
-    PyErr_SetString(PyExc_TypeError, "expected a list of 2-tuples of strings");
-    return NULL;
-  }
-  num_key_cert_pairs = PyList_Size(py_key_cert_pairs);
-  key_cert_pairs =
-      gpr_malloc(sizeof(grpc_ssl_pem_key_cert_pair) * num_key_cert_pairs);
-  for (i = 0; i < num_key_cert_pairs; ++i) {
-    PyObject *item = PyList_GET_ITEM(py_key_cert_pairs, i);
-    const char *key;
-    const char *cert;
-    if (!PyArg_ParseTuple(item, "zz", &key, &cert)) {
-      gpr_free(key_cert_pairs);
-      PyErr_SetString(PyExc_TypeError,
-                      "expected a list of 2-tuples of strings");
-      return NULL;
-    }
-    key_cert_pairs[i].private_key = key;
-    key_cert_pairs[i].cert_chain = cert;
-  }
-
-  self = (ServerCredentials *)type->tp_alloc(type, 0);
-  self->c_creds = grpc_ssl_server_credentials_create(
-      root_certs, key_cert_pairs, num_key_cert_pairs, force_client_auth, NULL);
-  gpr_free(key_cert_pairs);
-  return self;
-}
diff --git a/src/python/grpcio/grpc/_adapter/_c/utility.c b/src/python/grpcio/grpc/_adapter/_c/utility.c
deleted file mode 100644
index 590f7e0..0000000
--- a/src/python/grpcio/grpc/_adapter/_c/utility.c
+++ /dev/null
@@ -1,524 +0,0 @@
-/*
- *
- * Copyright 2015, 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 <math.h>
-#include <string.h>
-
-#define PY_SSIZE_T_CLEAN
-#include <Python.h>
-#include <grpc/grpc.h>
-#include <grpc/byte_buffer_reader.h>
-#include <grpc/support/alloc.h>
-#include <grpc/support/slice.h>
-#include <grpc/support/time.h>
-#include <grpc/support/string_util.h>
-
-#include "grpc/_adapter/_c/types.h"
-
-pygrpc_tag *pygrpc_produce_batch_tag(
-    PyObject *user_tag, Call *call, grpc_op *ops, size_t nops) {
-  pygrpc_tag *tag = gpr_malloc(sizeof(pygrpc_tag));
-  tag->user_tag = user_tag;
-  Py_XINCREF(tag->user_tag);
-  tag->call = call;
-  Py_XINCREF(tag->call);
-  tag->ops = gpr_malloc(sizeof(grpc_op)*nops);
-  memcpy(tag->ops, ops, sizeof(grpc_op)*nops);
-  tag->nops = nops;
-  grpc_call_details_init(&tag->request_call_details);
-  grpc_metadata_array_init(&tag->request_metadata);
-  tag->is_new_call = 0;
-  return tag;
-}
-
-pygrpc_tag *pygrpc_produce_request_tag(PyObject *user_tag, Call *empty_call) {
-  pygrpc_tag *tag = gpr_malloc(sizeof(pygrpc_tag));
-  tag->user_tag = user_tag;
-  Py_XINCREF(tag->user_tag);
-  tag->call = empty_call;
-  Py_XINCREF(tag->call);
-  tag->ops = NULL;
-  tag->nops = 0;
-  grpc_call_details_init(&tag->request_call_details);
-  grpc_metadata_array_init(&tag->request_metadata);
-  tag->is_new_call = 1;
-  return tag;
-}
-
-pygrpc_tag *pygrpc_produce_server_shutdown_tag(PyObject *user_tag) {
-  pygrpc_tag *tag = gpr_malloc(sizeof(pygrpc_tag));
-  tag->user_tag = user_tag;
-  Py_XINCREF(tag->user_tag);
-  tag->call = NULL;
-  tag->ops = NULL;
-  tag->nops = 0;
-  grpc_call_details_init(&tag->request_call_details);
-  grpc_metadata_array_init(&tag->request_metadata);
-  tag->is_new_call = 0;
-  return tag;
-}
-
-pygrpc_tag *pygrpc_produce_channel_state_change_tag(PyObject *user_tag) {
-  pygrpc_tag *tag = gpr_malloc(sizeof(pygrpc_tag));
-  tag->user_tag = user_tag;
-  Py_XINCREF(tag->user_tag);
-  tag->call = NULL;
-  tag->ops = NULL;
-  tag->nops = 0;
-  grpc_call_details_init(&tag->request_call_details);
-  grpc_metadata_array_init(&tag->request_metadata);
-  tag->is_new_call = 0;
-  return tag;
-}
-
-void pygrpc_discard_tag(pygrpc_tag *tag) {
-  if (!tag) {
-    return;
-  }
-  Py_XDECREF(tag->user_tag);
-  Py_XDECREF(tag->call);
-  gpr_free(tag->ops);
-  grpc_call_details_destroy(&tag->request_call_details);
-  grpc_metadata_array_destroy(&tag->request_metadata);
-  gpr_free(tag);
-}
-
-PyObject *pygrpc_consume_event(grpc_event event) {
-  pygrpc_tag *tag;
-  PyObject *result;
-  if (event.type == GRPC_QUEUE_TIMEOUT) {
-    Py_RETURN_NONE;
-  }
-  tag = event.tag;
-  switch (event.type) {
-  case GRPC_QUEUE_SHUTDOWN:
-    result = Py_BuildValue("iOOOOO", GRPC_QUEUE_SHUTDOWN,
-                           Py_None, Py_None, Py_None, Py_None, Py_True);
-    break;
-  case GRPC_OP_COMPLETE:
-    if (tag->is_new_call) {
-      result = Py_BuildValue(
-          "iOO(ssd)[(iNOOOO)]O", GRPC_OP_COMPLETE, tag->user_tag, tag->call,
-          tag->request_call_details.method, tag->request_call_details.host,
-          pygrpc_cast_gpr_timespec_to_double(tag->request_call_details.deadline),
-          GRPC_OP_RECV_INITIAL_METADATA,
-          pygrpc_cast_metadata_array_to_pyseq(tag->request_metadata), Py_None,
-          Py_None, Py_None, Py_None,
-          event.success ? Py_True : Py_False);
-    } else {
-      result = Py_BuildValue("iOOONO", GRPC_OP_COMPLETE, tag->user_tag,
-          tag->call ? (PyObject*)tag->call : Py_None, Py_None,
-          pygrpc_consume_ops(tag->ops, tag->nops),
-          event.success ? Py_True : Py_False);
-    }
-    break;
-  default:
-    PyErr_SetString(PyExc_ValueError,
-                    "unknown completion type; could not translate event");
-    return NULL;
-  }
-  pygrpc_discard_tag(tag);
-  return result;
-}
-
-int pygrpc_produce_op(PyObject *op, grpc_op *result) {
-  static const int OP_TUPLE_SIZE = 6;
-  static const int STATUS_TUPLE_SIZE = 2;
-  static const int TYPE_INDEX = 0;
-  static const int INITIAL_METADATA_INDEX = 1;
-  static const int TRAILING_METADATA_INDEX = 2;
-  static const int MESSAGE_INDEX = 3;
-  static const int STATUS_INDEX = 4;
-  static const int STATUS_CODE_INDEX = 0;
-  static const int STATUS_DETAILS_INDEX = 1;
-  static const int WRITE_FLAGS_INDEX = 5;
-  int type;
-  Py_ssize_t message_size;
-  char *message;
-  char *status_details;
-  gpr_slice message_slice;
-  grpc_op c_op;
-  if (!PyTuple_Check(op)) {
-    PyErr_SetString(PyExc_TypeError, "expected tuple op");
-    return 0;
-  }
-  if (PyTuple_Size(op) != OP_TUPLE_SIZE) {
-    char *buf;
-    gpr_asprintf(&buf, "expected tuple op of length %d", OP_TUPLE_SIZE);
-    PyErr_SetString(PyExc_ValueError, buf);
-    gpr_free(buf);
-    return 0;
-  }
-  type = PyInt_AsLong(PyTuple_GET_ITEM(op, TYPE_INDEX));
-  if (PyErr_Occurred()) {
-    return 0;
-  }
-  c_op.op = type;
-  c_op.reserved = NULL;
-  c_op.flags = PyInt_AsLong(PyTuple_GET_ITEM(op, WRITE_FLAGS_INDEX));
-  if (PyErr_Occurred()) {
-    return 0;
-  }
-  switch (type) {
-  case GRPC_OP_SEND_INITIAL_METADATA:
-    if (!pygrpc_cast_pyseq_to_send_metadata(
-            PyTuple_GetItem(op, INITIAL_METADATA_INDEX),
-            &c_op.data.send_initial_metadata.metadata,
-            &c_op.data.send_initial_metadata.count)) {
-      return 0;
-    }
-    break;
-  case GRPC_OP_SEND_MESSAGE:
-    PyString_AsStringAndSize(
-        PyTuple_GET_ITEM(op, MESSAGE_INDEX), &message, &message_size);
-    message_slice = gpr_slice_from_copied_buffer(message, message_size);
-    c_op.data.send_message = grpc_raw_byte_buffer_create(&message_slice, 1);
-    gpr_slice_unref(message_slice);
-    break;
-  case GRPC_OP_SEND_CLOSE_FROM_CLIENT:
-    /* Don't need to fill in any other fields. */
-    break;
-  case GRPC_OP_SEND_STATUS_FROM_SERVER:
-    if (!pygrpc_cast_pyseq_to_send_metadata(
-            PyTuple_GetItem(op, TRAILING_METADATA_INDEX),
-            &c_op.data.send_status_from_server.trailing_metadata,
-            &c_op.data.send_status_from_server.trailing_metadata_count)) {
-      return 0;
-    }
-    if (!PyTuple_Check(PyTuple_GET_ITEM(op, STATUS_INDEX))) {
-      char *buf;
-      gpr_asprintf(&buf, "expected tuple status in op of length %d",
-                   STATUS_TUPLE_SIZE);
-      PyErr_SetString(PyExc_ValueError, buf);
-      gpr_free(buf);
-      return 0;
-    }
-    c_op.data.send_status_from_server.status = PyInt_AsLong(
-        PyTuple_GET_ITEM(PyTuple_GET_ITEM(op, STATUS_INDEX), STATUS_CODE_INDEX));
-    status_details = PyString_AsString(
-        PyTuple_GET_ITEM(PyTuple_GET_ITEM(op, STATUS_INDEX), STATUS_DETAILS_INDEX));
-    if (PyErr_Occurred()) {
-      return 0;
-    }
-    c_op.data.send_status_from_server.status_details =
-        gpr_malloc(strlen(status_details) + 1);
-    strcpy((char *)c_op.data.send_status_from_server.status_details,
-           status_details);
-    break;
-  case GRPC_OP_RECV_INITIAL_METADATA:
-    c_op.data.recv_initial_metadata = gpr_malloc(sizeof(grpc_metadata_array));
-    grpc_metadata_array_init(c_op.data.recv_initial_metadata);
-    break;
-  case GRPC_OP_RECV_MESSAGE:
-    c_op.data.recv_message = gpr_malloc(sizeof(grpc_byte_buffer *));
-    break;
-  case GRPC_OP_RECV_STATUS_ON_CLIENT:
-    c_op.data.recv_status_on_client.trailing_metadata =
-        gpr_malloc(sizeof(grpc_metadata_array));
-    grpc_metadata_array_init(c_op.data.recv_status_on_client.trailing_metadata);
-    c_op.data.recv_status_on_client.status =
-        gpr_malloc(sizeof(grpc_status_code *));
-    c_op.data.recv_status_on_client.status_details =
-        gpr_malloc(sizeof(char *));
-    *c_op.data.recv_status_on_client.status_details = NULL;
-    c_op.data.recv_status_on_client.status_details_capacity =
-        gpr_malloc(sizeof(size_t));
-    *c_op.data.recv_status_on_client.status_details_capacity = 0;
-    break;
-  case GRPC_OP_RECV_CLOSE_ON_SERVER:
-    c_op.data.recv_close_on_server.cancelled = gpr_malloc(sizeof(int));
-    break;
-  default:
-    return 0;
-  }
-  *result = c_op;
-  return 1;
-}
-
-void pygrpc_discard_op(grpc_op op) {
-  size_t i;
-  switch(op.op) {
-  case GRPC_OP_SEND_INITIAL_METADATA:
-    /* Whenever we produce send-metadata, we allocate new strings (to handle
-       arbitrary sequence input as opposed to just lists or just tuples). We
-       thus must free those elements. */
-    for (i = 0; i < op.data.send_initial_metadata.count; ++i) {
-      gpr_free((void *)op.data.send_initial_metadata.metadata[i].key);
-      gpr_free((void *)op.data.send_initial_metadata.metadata[i].value);
-    }
-    gpr_free(op.data.send_initial_metadata.metadata);
-    break;
-  case GRPC_OP_SEND_MESSAGE:
-    grpc_byte_buffer_destroy(op.data.send_message);
-    break;
-  case GRPC_OP_SEND_CLOSE_FROM_CLIENT:
-    /* Don't need to free any fields. */
-    break;
-  case GRPC_OP_SEND_STATUS_FROM_SERVER:
-    /* Whenever we produce send-metadata, we allocate new strings (to handle
-       arbitrary sequence input as opposed to just lists or just tuples). We
-       thus must free those elements. */
-    for (i = 0; i < op.data.send_status_from_server.trailing_metadata_count;
-         ++i) {
-      gpr_free(
-          (void *)op.data.send_status_from_server.trailing_metadata[i].key);
-      gpr_free(
-          (void *)op.data.send_status_from_server.trailing_metadata[i].value);
-    }
-    gpr_free(op.data.send_status_from_server.trailing_metadata);
-    gpr_free((char *)op.data.send_status_from_server.status_details);
-    break;
-  case GRPC_OP_RECV_INITIAL_METADATA:
-    grpc_metadata_array_destroy(op.data.recv_initial_metadata);
-    gpr_free(op.data.recv_initial_metadata);
-    break;
-  case GRPC_OP_RECV_MESSAGE:
-    grpc_byte_buffer_destroy(*op.data.recv_message);
-    gpr_free(op.data.recv_message);
-    break;
-  case GRPC_OP_RECV_STATUS_ON_CLIENT:
-    grpc_metadata_array_destroy(op.data.recv_status_on_client.trailing_metadata);
-    gpr_free(op.data.recv_status_on_client.trailing_metadata);
-    gpr_free(op.data.recv_status_on_client.status);
-    gpr_free(*op.data.recv_status_on_client.status_details);
-    gpr_free(op.data.recv_status_on_client.status_details);
-    gpr_free(op.data.recv_status_on_client.status_details_capacity);
-    break;
-  case GRPC_OP_RECV_CLOSE_ON_SERVER:
-    gpr_free(op.data.recv_close_on_server.cancelled);
-    break;
-  }
-}
-
-PyObject *pygrpc_consume_ops(grpc_op *op, size_t nops) {
-  static const int TYPE_INDEX = 0;
-  static const int INITIAL_METADATA_INDEX = 1;
-  static const int TRAILING_METADATA_INDEX = 2;
-  static const int MESSAGE_INDEX = 3;
-  static const int STATUS_INDEX = 4;
-  static const int CANCELLED_INDEX = 5;
-  static const int OPRESULT_LENGTH = 6;
-  PyObject *list;
-  size_t i;
-  size_t j;
-  char *bytes;
-  size_t bytes_size;
-  PyObject *results = PyList_New(nops);
-  if (!results) {
-    return NULL;
-  }
-  for (i = 0; i < nops; ++i) {
-    PyObject *result = PyTuple_Pack(OPRESULT_LENGTH, Py_None, Py_None, Py_None,
-                                    Py_None, Py_None, Py_None);
-    PyTuple_SetItem(result, TYPE_INDEX, PyInt_FromLong(op[i].op));
-    switch(op[i].op) {
-    case GRPC_OP_RECV_INITIAL_METADATA:
-      PyTuple_SetItem(result, INITIAL_METADATA_INDEX,
-                      list=PyList_New(op[i].data.recv_initial_metadata->count));
-      for (j = 0; j < op[i].data.recv_initial_metadata->count; ++j) {
-        grpc_metadata md = op[i].data.recv_initial_metadata->metadata[j];
-        PyList_SetItem(list, j, Py_BuildValue("ss#", md.key, md.value,
-                                              (Py_ssize_t)md.value_length));
-      }
-      break;
-    case GRPC_OP_RECV_MESSAGE:
-      if (*op[i].data.recv_message) {
-        pygrpc_byte_buffer_to_bytes(
-            *op[i].data.recv_message, &bytes, &bytes_size);
-        PyTuple_SetItem(result, MESSAGE_INDEX,
-                        PyString_FromStringAndSize(bytes, bytes_size));
-        gpr_free(bytes);
-      } else {
-        PyTuple_SetItem(result, MESSAGE_INDEX, Py_BuildValue(""));
-      }
-      break;
-    case GRPC_OP_RECV_STATUS_ON_CLIENT:
-      PyTuple_SetItem(
-          result, TRAILING_METADATA_INDEX,
-          list = PyList_New(op[i].data.recv_status_on_client.trailing_metadata->count));
-      for (j = 0; j < op[i].data.recv_status_on_client.trailing_metadata->count; ++j) {
-        grpc_metadata md =
-            op[i].data.recv_status_on_client.trailing_metadata->metadata[j];
-        PyList_SetItem(list, j, Py_BuildValue("ss#", md.key, md.value,
-                                              (Py_ssize_t)md.value_length));
-      }
-      PyTuple_SetItem(
-          result, STATUS_INDEX, Py_BuildValue(
-              "is", *op[i].data.recv_status_on_client.status,
-              *op[i].data.recv_status_on_client.status_details));
-      break;
-    case GRPC_OP_RECV_CLOSE_ON_SERVER:
-      PyTuple_SetItem(
-          result, CANCELLED_INDEX,
-          PyBool_FromLong(*op[i].data.recv_close_on_server.cancelled));
-      break;
-    default:
-      break;
-    }
-    pygrpc_discard_op(op[i]);
-    PyList_SetItem(results, i, result);
-  }
-  return results;
-}
-
-double pygrpc_cast_gpr_timespec_to_double(gpr_timespec timespec) {
-  timespec = gpr_convert_clock_type(timespec, GPR_CLOCK_REALTIME);
-  return timespec.tv_sec + 1e-9*timespec.tv_nsec;
-}
-
-/* Because C89 doesn't have a way to check for infinity... */
-static int pygrpc_isinf(double x) {
-  return x * 0 != 0;
-}
-
-gpr_timespec pygrpc_cast_double_to_gpr_timespec(double seconds) {
-  gpr_timespec result;
-  if (pygrpc_isinf(seconds)) {
-    result = seconds > 0.0 ? gpr_inf_future(GPR_CLOCK_REALTIME)
-                           : gpr_inf_past(GPR_CLOCK_REALTIME);
-  } else {
-    result.tv_sec = (time_t)seconds;
-    result.tv_nsec = ((seconds - result.tv_sec) * 1e9);
-    result.clock_type = GPR_CLOCK_REALTIME;
-  }
-  return result;
-}
-
-int pygrpc_produce_channel_args(PyObject *py_args, grpc_channel_args *c_args) {
-  size_t num_args = PyList_Size(py_args);
-  size_t i;
-  grpc_channel_args args;
-  args.num_args = num_args;
-  args.args = gpr_malloc(sizeof(grpc_arg) * num_args);
-  for (i = 0; i < args.num_args; ++i) {
-    char *key;
-    PyObject *value;
-    if (!PyArg_ParseTuple(PyList_GetItem(py_args, i), "zO", &key, &value)) {
-      gpr_free(args.args);
-      args.num_args = 0;
-      args.args = NULL;
-      PyErr_SetString(PyExc_TypeError,
-                      "expected a list of 2-tuple of str and str|int|None");
-      return 0;
-    }
-    args.args[i].key = key;
-    if (PyInt_Check(value)) {
-      args.args[i].type = GRPC_ARG_INTEGER;
-      args.args[i].value.integer = PyInt_AsLong(value);
-    } else if (PyString_Check(value)) {
-      args.args[i].type = GRPC_ARG_STRING;
-      args.args[i].value.string = PyString_AsString(value);
-    } else if (value == Py_None) {
-      --args.num_args;
-      --i;
-      continue;
-    } else {
-      gpr_free(args.args);
-      args.num_args = 0;
-      args.args = NULL;
-      PyErr_SetString(PyExc_TypeError,
-                      "expected a list of 2-tuple of str and str|int|None");
-      return 0;
-    }
-  }
-  *c_args = args;
-  return 1;
-}
-
-void pygrpc_discard_channel_args(grpc_channel_args args) {
-  gpr_free(args.args);
-}
-
-int pygrpc_cast_pyseq_to_send_metadata(
-    PyObject *pyseq, grpc_metadata **metadata, size_t *count) {
-  size_t i;
-  Py_ssize_t value_length;
-  char *key;
-  char *value;
-  if (!PySequence_Check(pyseq)) {
-    return 0;
-  }
-  *count = PySequence_Size(pyseq);
-  *metadata = gpr_malloc(sizeof(grpc_metadata) * *count);
-  for (i = 0; i < *count; ++i) {
-    PyObject *item = PySequence_GetItem(pyseq, i);
-    if (!PyArg_ParseTuple(item, "ss#", &key, &value, &value_length)) {
-      Py_DECREF(item);
-      gpr_free(*metadata);
-      *count = 0;
-      *metadata = NULL;
-      return 0;
-    } else {
-      (*metadata)[i].key = gpr_strdup(key);
-      (*metadata)[i].value = gpr_malloc(value_length);
-      memcpy((void *)(*metadata)[i].value, value, value_length);
-      Py_DECREF(item);
-    }
-    (*metadata)[i].value_length = value_length;
-  }
-  return 1;
-}
-
-PyObject *pygrpc_cast_metadata_array_to_pyseq(grpc_metadata_array metadata) {
-  PyObject *result = PyTuple_New(metadata.count);
-  size_t i;
-  for (i = 0; i < metadata.count; ++i) {
-    PyTuple_SetItem(
-        result, i, Py_BuildValue(
-            "ss#", metadata.metadata[i].key, metadata.metadata[i].value,
-            (Py_ssize_t)metadata.metadata[i].value_length));
-    if (PyErr_Occurred()) {
-      Py_DECREF(result);
-      return NULL;
-    }
-  }
-  return result;
-}
-
-void pygrpc_byte_buffer_to_bytes(
-    grpc_byte_buffer *buffer, char **result, size_t *result_size) {
-  grpc_byte_buffer_reader reader;
-  gpr_slice slice;
-  char *read_result = NULL;
-  size_t size = 0;
-  grpc_byte_buffer_reader_init(&reader, buffer);
-  while (grpc_byte_buffer_reader_next(&reader, &slice)) {
-    read_result = gpr_realloc(read_result, size + GPR_SLICE_LENGTH(slice));
-    memcpy(read_result + size, GPR_SLICE_START_PTR(slice),
-           GPR_SLICE_LENGTH(slice));
-    size = size + GPR_SLICE_LENGTH(slice);
-    gpr_slice_unref(slice);
-  }
-  *result_size = size;
-  *result = read_result;
-}
diff --git a/src/python/grpcio/grpc/_adapter/_intermediary_low.py b/src/python/grpcio/grpc/_adapter/_intermediary_low.py
index 5634c20..f87446e 100644
--- a/src/python/grpcio/grpc/_adapter/_intermediary_low.py
+++ b/src/python/grpcio/grpc/_adapter/_intermediary_low.py
@@ -115,16 +115,20 @@
     return call
 
   def invoke(self, completion_queue, metadata_tag, finish_tag):
-    err0 = self._internal.start_batch([
+    err = self._internal.start_batch([
           _types.OpArgs.send_initial_metadata(self._metadata)
       ], _IGNORE_ME_TAG)
-    err1 = self._internal.start_batch([
+    if err != _types.CallError.OK:
+      return err
+    err = self._internal.start_batch([
           _types.OpArgs.recv_initial_metadata()
       ], _TagAdapter(metadata_tag, Event.Kind.METADATA_ACCEPTED))
-    err2 = self._internal.start_batch([
+    if err != _types.CallError.OK:
+      return err
+    err = self._internal.start_batch([
           _types.OpArgs.recv_status_on_client()
       ], _TagAdapter(finish_tag, Event.Kind.FINISH))
-    return err0 if err0 != _types.CallError.OK else err1 if err1 != _types.CallError.OK else err2 if err2 != _types.CallError.OK else _types.CallError.OK
+    return err
 
   def write(self, message, tag, flags):
     return self._internal.start_batch([
@@ -158,7 +162,8 @@
 
   def status(self, status, tag):
     return self._internal.start_batch([
-          _types.OpArgs.send_status_from_server(self._metadata, status.code, status.details)
+          _types.OpArgs.send_status_from_server(
+              self._metadata, status.code, status.details)
       ], _TagAdapter(tag, Event.Kind.COMPLETE_ACCEPTED))
 
   def cancel(self):
@@ -192,7 +197,7 @@
 
   def get(self, deadline=None):
     if deadline is None:
-      ev = self._internal.next()
+      ev = self._internal.next(float('+inf'))
     else:
       ev = self._internal.next(deadline)
     if ev is None:
@@ -248,6 +253,9 @@
   def service(self, tag):
     return self._internal.request_call(self._internal_cq, _TagAdapter(tag, Event.Kind.SERVICE_ACCEPTED))
 
+  def cancel_all_calls(self):
+    self._internal.cancel_all_calls()
+
   def stop(self):
     return self._internal.shutdown(_TagAdapter(None, Event.Kind.STOP))
 
@@ -256,12 +264,12 @@
   """Adapter from old _low.ClientCredentials interface to new _low.ChannelCredentials."""
 
   def __init__(self, root_certificates, private_key, certificate_chain):
-    self._internal = _low.ChannelCredentials.ssl(root_certificates, private_key, certificate_chain)
+    self._internal = _low.channel_credentials_ssl(root_certificates, private_key, certificate_chain)
 
 
 class ServerCredentials(object):
   """Adapter from old _low.ServerCredentials interface to new _low.ServerCredentials."""
 
   def __init__(self, root_credentials, pair_sequence, force_client_auth):
-    self._internal = _low.ServerCredentials.ssl(
-        root_credentials, list(pair_sequence), force_client_auth)
+    self._internal = _low.server_credentials_ssl(
+        root_credentials, pair_sequence, force_client_auth)
diff --git a/src/python/grpcio/grpc/_adapter/_low.py b/src/python/grpcio/grpc/_adapter/_low.py
index 57146aa..264c33b 100644
--- a/src/python/grpcio/grpc/_adapter/_low.py
+++ b/src/python/grpcio/grpc/_adapter/_low.py
@@ -28,35 +28,76 @@
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 from grpc import _grpcio_metadata
-from grpc._adapter import _c
+from grpc._cython import cygrpc
 from grpc._adapter import _types
 
 _USER_AGENT = 'Python-gRPC-{}'.format(_grpcio_metadata.__version__)
 
-ChannelCredentials = _c.ChannelCredentials
-CallCredentials = _c.CallCredentials
-ServerCredentials = _c.ServerCredentials
+ChannelCredentials = cygrpc.ChannelCredentials
+CallCredentials = cygrpc.CallCredentials
+ServerCredentials = cygrpc.ServerCredentials
+
+def server_credentials_ssl(root_credentials, pair_sequence, force_client_auth):
+  return cygrpc.server_credentials_ssl(
+      root_credentials,
+      [cygrpc.SslPemKeyCertPair(key, pem) for key, pem in pair_sequence],
+      force_client_auth)
+
+def channel_credentials_ssl(
+    root_certificates, private_key, certificate_chain):
+  pair = None
+  if private_key is not None or certificate_chain is not None:
+    pair = cygrpc.SslPemKeyCertPair(private_key, certificate_chain)
+  return cygrpc.channel_credentials_ssl(root_certificates, pair)
 
 
 class CompletionQueue(_types.CompletionQueue):
 
   def __init__(self):
-    self.completion_queue = _c.CompletionQueue()
+    self.completion_queue = cygrpc.CompletionQueue()
 
   def next(self, deadline=float('+inf')):
-    raw_event = self.completion_queue.next(deadline)
-    if raw_event is None:
+    raw_event = self.completion_queue.poll(cygrpc.Timespec(deadline))
+    if raw_event.type == cygrpc.CompletionType.queue_timeout:
       return None
-    event = _types.Event(*raw_event)
-    if event.call is not None:
-      event = event._replace(call=Call(event.call))
-    if event.call_details is not None:
-      event = event._replace(call_details=_types.CallDetails(*event.call_details))
-    if event.results is not None:
-      new_results = [_types.OpResult(*r) for r in event.results]
-      new_results = [r if r.status is None else r._replace(status=_types.Status(_types.StatusCode(r.status[0]), r.status[1])) for r in new_results]
-      event = event._replace(results=new_results)
-    return event
+    event_type = raw_event.type
+    event_tag = raw_event.tag
+    event_call = Call(raw_event.operation_call)
+    if raw_event.request_call_details:
+      event_call_details = _types.CallDetails(
+          raw_event.request_call_details.method,
+          raw_event.request_call_details.host,
+          float(raw_event.request_call_details.deadline))
+    else:
+      event_call_details = None
+    event_success = raw_event.success
+    event_results = []
+    if raw_event.is_new_request:
+      event_results.append(_types.OpResult(
+          _types.OpType.RECV_INITIAL_METADATA, raw_event.request_metadata,
+          None, None, None, None))
+    else:
+      if raw_event.batch_operations:
+        for operation in raw_event.batch_operations:
+          result_type = operation.type
+          result_initial_metadata = operation.received_metadata_or_none
+          result_trailing_metadata = operation.received_metadata_or_none
+          result_message = operation.received_message_or_none
+          if result_message is not None:
+            result_message = result_message.bytes()
+          result_cancelled = operation.received_cancelled_or_none
+          if operation.has_status:
+            result_status = _types.Status(
+                operation.received_status_code_or_none,
+                operation.received_status_details_or_none)
+          else:
+            result_status = None
+          event_results.append(
+              _types.OpResult(result_type, result_initial_metadata,
+                              result_trailing_metadata, result_message,
+                              result_status, result_cancelled))
+    return _types.Event(event_type, event_tag, event_call, event_call_details,
+                        event_results, event_success)
 
   def shutdown(self):
     self.completion_queue.shutdown()
@@ -68,7 +109,36 @@
     self.call = call
 
   def start_batch(self, ops, tag):
-    return self.call.start_batch(ops, tag)
+    translated_ops = []
+    for op in ops:
+      if op.type == _types.OpType.SEND_INITIAL_METADATA:
+        translated_op = cygrpc.operation_send_initial_metadata(
+            cygrpc.Metadata(
+                cygrpc.Metadatum(key, value)
+                for key, value in op.initial_metadata))
+      elif op.type == _types.OpType.SEND_MESSAGE:
+        translated_op = cygrpc.operation_send_message(op.message)
+      elif op.type == _types.OpType.SEND_CLOSE_FROM_CLIENT:
+        translated_op = cygrpc.operation_send_close_from_client()
+      elif op.type == _types.OpType.SEND_STATUS_FROM_SERVER:
+        translated_op = cygrpc.operation_send_status_from_server(
+            cygrpc.Metadata(
+                cygrpc.Metadatum(key, value)
+                for key, value in op.trailing_metadata),
+            op.status.code,
+            op.status.details)
+      elif op.type == _types.OpType.RECV_INITIAL_METADATA:
+        translated_op = cygrpc.operation_receive_initial_metadata()
+      elif op.type == _types.OpType.RECV_MESSAGE:
+        translated_op = cygrpc.operation_receive_message()
+      elif op.type == _types.OpType.RECV_STATUS_ON_CLIENT:
+        translated_op = cygrpc.operation_receive_status_on_client()
+      elif op.type == _types.OpType.RECV_CLOSE_ON_SERVER:
+        translated_op = cygrpc.operation_receive_close_on_server()
+      else:
+        raise ValueError('unexpected operation type {}'.format(op.type))
+      translated_ops.append(translated_op)
+    return self.call.start_batch(cygrpc.Operations(translated_ops), tag)
 
   def cancel(self, code=None, details=None):
     if code is None and details is None:
@@ -86,14 +156,20 @@
 class Channel(_types.Channel):
 
   def __init__(self, target, args, creds=None):
-    args = list(args) + [(_c.PRIMARY_USER_AGENT_KEY, _USER_AGENT)]
+    args = list(args) + [
+        (cygrpc.ChannelArgKey.primary_user_agent_string, _USER_AGENT)]
+    args = cygrpc.ChannelArgs(
+        cygrpc.ChannelArg(key, value) for key, value in args)
     if creds is None:
-      self.channel = _c.Channel(target, args)
+      self.channel = cygrpc.Channel(target, args)
     else:
-      self.channel = _c.Channel(target, args, creds)
+      self.channel = cygrpc.Channel(target, args, creds)
 
   def create_call(self, completion_queue, method, host, deadline=None):
-    return Call(self.channel.create_call(completion_queue.completion_queue, method, host, deadline))
+    internal_call = self.channel.create_call(
+        None, 0, completion_queue.completion_queue, method, host,
+        cygrpc.Timespec(deadline))
+    return Call(internal_call)
 
   def check_connectivity_state(self, try_to_connect):
     return self.channel.check_connectivity_state(try_to_connect)
@@ -101,7 +177,8 @@
   def watch_connectivity_state(self, last_observed_state, deadline,
                                completion_queue, tag):
     self.channel.watch_connectivity_state(
-        last_observed_state, deadline, completion_queue.completion_queue, tag)
+        last_observed_state, cygrpc.Timespec(deadline),
+        completion_queue.completion_queue, tag)
 
   def target(self):
     return self.channel.target()
@@ -112,7 +189,11 @@
 class Server(_types.Server):
 
   def __init__(self, completion_queue, args):
-    self.server = _c.Server(completion_queue.completion_queue, args)
+    args = cygrpc.ChannelArgs(
+        cygrpc.ChannelArg(key, value) for key, value in args)
+    self.server = cygrpc.Server(args)
+    self.server.register_completion_queue(completion_queue.completion_queue)
+    self.server_queue = completion_queue
 
   def add_http2_port(self, addr, creds=None):
     if creds is None:
@@ -124,10 +205,11 @@
     return self.server.start()
 
   def shutdown(self, tag=None):
-    return self.server.shutdown(tag)
+    return self.server.shutdown(self.server_queue.completion_queue, tag)
 
   def request_call(self, completion_queue, tag):
-    return self.server.request_call(completion_queue.completion_queue, tag)
+    return self.server.request_call(completion_queue.completion_queue,
+                                    self.server_queue.completion_queue, tag)
 
   def cancel_all_calls(self):
     return self.server.cancel_all_calls()
diff --git a/src/python/grpcio/grpc/_adapter/_types.py b/src/python/grpcio/grpc/_adapter/_types.py
index ca0fa06..3d5ab33 100644
--- a/src/python/grpcio/grpc/_adapter/_types.py
+++ b/src/python/grpcio/grpc/_adapter/_types.py
@@ -31,6 +31,8 @@
 import collections
 import enum
 
+from grpc._cython import cygrpc
+
 
 class GrpcChannelArgumentKeys(enum.Enum):
   """Mirrors keys used in grpc_channel_args for GRPC-specific arguments."""
@@ -40,77 +42,77 @@
 @enum.unique
 class CallError(enum.IntEnum):
   """Mirrors grpc_call_error in the C core."""
-  OK                        = 0
-  ERROR                     = 1
-  ERROR_NOT_ON_SERVER       = 2
-  ERROR_NOT_ON_CLIENT       = 3
-  ERROR_ALREADY_ACCEPTED    = 4
-  ERROR_ALREADY_INVOKED     = 5
-  ERROR_NOT_INVOKED         = 6
-  ERROR_ALREADY_FINISHED    = 7
-  ERROR_TOO_MANY_OPERATIONS = 8
-  ERROR_INVALID_FLAGS       = 9
-  ERROR_INVALID_METADATA    = 10
+  OK                        = cygrpc.CallError.ok
+  ERROR                     = cygrpc.CallError.error
+  ERROR_NOT_ON_SERVER       = cygrpc.CallError.not_on_server
+  ERROR_NOT_ON_CLIENT       = cygrpc.CallError.not_on_client
+  ERROR_ALREADY_ACCEPTED    = cygrpc.CallError.already_accepted
+  ERROR_ALREADY_INVOKED     = cygrpc.CallError.already_invoked
+  ERROR_NOT_INVOKED         = cygrpc.CallError.not_invoked
+  ERROR_ALREADY_FINISHED    = cygrpc.CallError.already_finished
+  ERROR_TOO_MANY_OPERATIONS = cygrpc.CallError.too_many_operations
+  ERROR_INVALID_FLAGS       = cygrpc.CallError.invalid_flags
+  ERROR_INVALID_METADATA    = cygrpc.CallError.invalid_metadata
 
 
 @enum.unique
 class StatusCode(enum.IntEnum):
   """Mirrors grpc_status_code in the C core."""
-  OK                  = 0
-  CANCELLED           = 1
-  UNKNOWN             = 2
-  INVALID_ARGUMENT    = 3
-  DEADLINE_EXCEEDED   = 4
-  NOT_FOUND           = 5
-  ALREADY_EXISTS      = 6
-  PERMISSION_DENIED   = 7
-  RESOURCE_EXHAUSTED  = 8
-  FAILED_PRECONDITION = 9
-  ABORTED             = 10
-  OUT_OF_RANGE        = 11
-  UNIMPLEMENTED       = 12
-  INTERNAL            = 13
-  UNAVAILABLE         = 14
-  DATA_LOSS           = 15
-  UNAUTHENTICATED     = 16
+  OK                  = cygrpc.StatusCode.ok
+  CANCELLED           = cygrpc.StatusCode.cancelled
+  UNKNOWN             = cygrpc.StatusCode.unknown
+  INVALID_ARGUMENT    = cygrpc.StatusCode.invalid_argument
+  DEADLINE_EXCEEDED   = cygrpc.StatusCode.deadline_exceeded
+  NOT_FOUND           = cygrpc.StatusCode.not_found
+  ALREADY_EXISTS      = cygrpc.StatusCode.already_exists
+  PERMISSION_DENIED   = cygrpc.StatusCode.permission_denied
+  RESOURCE_EXHAUSTED  = cygrpc.StatusCode.resource_exhausted
+  FAILED_PRECONDITION = cygrpc.StatusCode.failed_precondition
+  ABORTED             = cygrpc.StatusCode.aborted
+  OUT_OF_RANGE        = cygrpc.StatusCode.out_of_range
+  UNIMPLEMENTED       = cygrpc.StatusCode.unimplemented
+  INTERNAL            = cygrpc.StatusCode.internal
+  UNAVAILABLE         = cygrpc.StatusCode.unavailable
+  DATA_LOSS           = cygrpc.StatusCode.data_loss
+  UNAUTHENTICATED     = cygrpc.StatusCode.unauthenticated
 
 
 @enum.unique
 class OpWriteFlags(enum.IntEnum):
   """Mirrors defined write-flag constants in the C core."""
-  WRITE_BUFFER_HINT = 1
-  WRITE_NO_COMPRESS = 2
+  WRITE_BUFFER_HINT = cygrpc.WriteFlag.buffer_hint
+  WRITE_NO_COMPRESS = cygrpc.WriteFlag.no_compress
 
 
 @enum.unique
 class OpType(enum.IntEnum):
   """Mirrors grpc_op_type in the C core."""
-  SEND_INITIAL_METADATA   = 0
-  SEND_MESSAGE            = 1
-  SEND_CLOSE_FROM_CLIENT  = 2
-  SEND_STATUS_FROM_SERVER = 3
-  RECV_INITIAL_METADATA   = 4
-  RECV_MESSAGE            = 5
-  RECV_STATUS_ON_CLIENT   = 6
-  RECV_CLOSE_ON_SERVER    = 7
+  SEND_INITIAL_METADATA   = cygrpc.OperationType.send_initial_metadata
+  SEND_MESSAGE            = cygrpc.OperationType.send_message
+  SEND_CLOSE_FROM_CLIENT  = cygrpc.OperationType.send_close_from_client
+  SEND_STATUS_FROM_SERVER = cygrpc.OperationType.send_status_from_server
+  RECV_INITIAL_METADATA   = cygrpc.OperationType.receive_initial_metadata
+  RECV_MESSAGE            = cygrpc.OperationType.receive_message
+  RECV_STATUS_ON_CLIENT   = cygrpc.OperationType.receive_status_on_client
+  RECV_CLOSE_ON_SERVER    = cygrpc.OperationType.receive_close_on_server
 
 
 @enum.unique
 class EventType(enum.IntEnum):
   """Mirrors grpc_completion_type in the C core."""
-  QUEUE_SHUTDOWN = 0
-  QUEUE_TIMEOUT  = 1  # if seen on the Python side, something went horridly wrong
-  OP_COMPLETE    = 2
+  QUEUE_SHUTDOWN = cygrpc.CompletionType.queue_shutdown
+  QUEUE_TIMEOUT  = cygrpc.CompletionType.queue_timeout
+  OP_COMPLETE    = cygrpc.CompletionType.operation_complete
 
 
 @enum.unique
 class ConnectivityState(enum.IntEnum):
   """Mirrors grpc_connectivity_state in the C core."""
-  IDLE              = 0
-  CONNECTING        = 1
-  READY             = 2
-  TRANSIENT_FAILURE = 3
-  FATAL_FAILURE     = 4
+  IDLE              = cygrpc.ConnectivityState.idle
+  CONNECTING        = cygrpc.ConnectivityState.connecting
+  READY             = cygrpc.ConnectivityState.ready
+  TRANSIENT_FAILURE = cygrpc.ConnectivityState.transient_failure
+  FATAL_FAILURE     = cygrpc.ConnectivityState.fatal_failure
 
 
 class Status(collections.namedtuple(
diff --git a/src/python/grpcio/setup.py b/src/python/grpcio/setup.py
index 8ac185b..a948ca1 100644
--- a/src/python/grpcio/setup.py
+++ b/src/python/grpcio/setup.py
@@ -57,19 +57,6 @@
 # the installation.
 INSTALL_TESTS = os.environ.get('GRPC_PYTHON_INSTALL_TESTS', False)
 
-C_EXTENSION_SOURCES = (
-    'grpc/_adapter/_c/module.c',
-    'grpc/_adapter/_c/types.c',
-    'grpc/_adapter/_c/utility.c',
-    'grpc/_adapter/_c/types/call_credentials.c',
-    'grpc/_adapter/_c/types/channel_credentials.c',
-    'grpc/_adapter/_c/types/server_credentials.c',
-    'grpc/_adapter/_c/types/completion_queue.c',
-    'grpc/_adapter/_c/types/call.c',
-    'grpc/_adapter/_c/types/channel.c',
-    'grpc/_adapter/_c/types/server.c',
-)
-
 CYTHON_EXTENSION_PACKAGE_NAMES = ()
 
 CYTHON_EXTENSION_MODULE_NAMES = (
@@ -94,14 +81,6 @@
     EXTENSION_LIBRARIES += ('rt',)
 
 
-C_EXTENSION_MODULE = _core.Extension(
-    'grpc._adapter._c', sources=list(C_EXTENSION_SOURCES),
-    include_dirs=list(EXTENSION_INCLUDE_DIRECTORIES),
-    libraries=list(EXTENSION_LIBRARIES)
-)
-EXTENSION_MODULES = [C_EXTENSION_MODULE]
-
-
 def cython_extensions(package_names, module_names, include_dirs, libraries,
                       build_with_cython=False):
   file_extension = 'pyx' if build_with_cython else 'c'
@@ -185,7 +164,7 @@
 setuptools.setup(
     name='grpcio',
     version='0.11.0b2',
-    ext_modules=EXTENSION_MODULES + CYTHON_EXTENSION_MODULES,
+    ext_modules=CYTHON_EXTENSION_MODULES,
     packages=list(PACKAGES),
     package_dir=PACKAGE_DIRECTORIES,
     install_requires=INSTALL_REQUIRES,
diff --git a/src/python/grpcio/tests/unit/_adapter/_c_test.py b/src/python/grpcio/tests/unit/_adapter/_c_test.py
deleted file mode 100644
index fe020e2..0000000
--- a/src/python/grpcio/tests/unit/_adapter/_c_test.py
+++ /dev/null
@@ -1,55 +0,0 @@
-# Copyright 2015, 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.
-
-import time
-import unittest
-
-from grpc._adapter import _c
-from grpc._adapter import _types
-
-
-class CTypeSmokeTest(unittest.TestCase):
-
-  def testCompletionQueueUpDown(self):
-    completion_queue = _c.CompletionQueue()
-    del completion_queue
-
-  def testServerUpDown(self):
-    completion_queue = _c.CompletionQueue()
-    serv = _c.Server(completion_queue, [])
-    del serv
-    del completion_queue
-
-  def testChannelUpDown(self):
-    channel = _c.Channel('[::]:0', [])
-    del channel
-
-
-if __name__ == '__main__':
-  unittest.main(verbosity=2)
diff --git a/src/python/grpcio/tests/unit/_adapter/_intermediary_low_test.py b/src/python/grpcio/tests/unit/_adapter/_intermediary_low_test.py
index 90ad0b9..a6fd823 100644
--- a/src/python/grpcio/tests/unit/_adapter/_intermediary_low_test.py
+++ b/src/python/grpcio/tests/unit/_adapter/_intermediary_low_test.py
@@ -115,6 +115,7 @@
 
   def tearDown(self):
     self.server.stop()
+    self.server.cancel_all_calls()
     self.server_completion_queue.stop()
     self.client_completion_queue.stop()
     self.server_completion_queue_thread.join()
@@ -286,11 +287,6 @@
                         set((server_trailing_metadata_key,
                              server_trailing_binary_metadata_key,)))
 
-    server_timeout_none_event = self.server_completion_queue.get(0)
-    self.assertIsNone(server_timeout_none_event)
-    client_timeout_none_event = self.client_completion_queue.get(0)
-    self.assertIsNone(client_timeout_none_event)
-
     self.assertSequenceEqual(test_data, server_data)
     self.assertSequenceEqual(test_data, client_data)
 
@@ -335,6 +331,7 @@
 
   def tearDown(self):
     self.server.stop()
+    self.server.cancel_all_calls()
     self.server_completion_queue.stop()
     self.client_completion_queue.stop()
     self.server_completion_queue_thread.join()
@@ -410,14 +407,9 @@
 
     finish_event = self.client_events.get()
     self.assertEqual(_low.Event.Kind.FINISH, finish_event.kind)
-    self.assertEqual(_low.Status(_low.Code.CANCELLED, 'Cancelled'), 
+    self.assertEqual(_low.Status(_low.Code.CANCELLED, 'Cancelled'),
                                  finish_event.status)
 
-    server_timeout_none_event = self.server_completion_queue.get(0)
-    self.assertIsNone(server_timeout_none_event)
-    client_timeout_none_event = self.client_completion_queue.get(0)
-    self.assertIsNone(client_timeout_none_event)
-
     self.assertSequenceEqual(test_data, server_data)
     self.assertSequenceEqual(test_data, client_data)
 
diff --git a/src/python/grpcio/tests/unit/_adapter/_low_test.py b/src/python/grpcio/tests/unit/_adapter/_low_test.py
index 39b6f24..ec46617 100644
--- a/src/python/grpcio/tests/unit/_adapter/_low_test.py
+++ b/src/python/grpcio/tests/unit/_adapter/_low_test.py
@@ -80,11 +80,11 @@
     del self.client_channel
 
     self.client_completion_queue.shutdown()
-    while (self.client_completion_queue.next().type !=
+    while (self.client_completion_queue.next(float('+inf')).type !=
            _types.EventType.QUEUE_SHUTDOWN):
       pass
     self.server_completion_queue.shutdown()
-    while (self.server_completion_queue.next().type !=
+    while (self.server_completion_queue.next(float('+inf')).type !=
            _types.EventType.QUEUE_SHUTDOWN):
       pass
 
@@ -294,8 +294,12 @@
 
     # Now try to shutdown the server and expect that we see server shutdown
     # almost immediately after calling cancel_all_calls.
+
+    # First attempt to cancel all calls before shutting down, and expect
+    # our state machine to catch the erroneous API use.
     with self.assertRaises(RuntimeError):
       self.server.cancel_all_calls()
+
     shutdown_tag = object()
     self.server.shutdown(shutdown_tag)
     pre_cancel_timestamp = time.time()