Allow _low.Server objects to be passed a ServerCredentials.
diff --git a/src/python/src/_adapter/_c_test.py b/src/python/src/_adapter/_c_test.py
index 19c91ff..210ac1f 100644
--- a/src/python/src/_adapter/_c_test.py
+++ b/src/python/src/_adapter/_c_test.py
@@ -92,7 +92,7 @@
     _c.init()
 
     completion_queue = _c.CompletionQueue()
-    server = _c.Server(completion_queue)
+    server = _c.Server(completion_queue, None)
     server.add_http2_addr('[::]:0')
     server.start()
     server.stop()
@@ -102,7 +102,7 @@
 
     service_tag = object()
     completion_queue = _c.CompletionQueue()
-    server = _c.Server(completion_queue)
+    server = _c.Server(completion_queue, None)
     server.add_http2_addr('[::]:0')
     server.start()
     server.service(service_tag)
@@ -119,7 +119,7 @@
     del completion_queue
 
     completion_queue = _c.CompletionQueue()
-    server = _c.Server(completion_queue)
+    server = _c.Server(completion_queue, None)
     server.add_http2_addr('[::]:0')
     server.start()
     thread = threading.Thread(target=completion_queue.get, args=(_FUTURE,))
@@ -162,6 +162,31 @@
 
     _c.shut_down()
 
+  @unittest.skip('TODO(nathaniel): find and use real-enough test credentials')
+  def test_secure_server(self):
+    _c.init()
+
+    server_credentials = _c.ServerCredentials(
+        'root certificate', (('private key', 'certificate chain'),))
+
+    completion_queue = _c.CompletionQueue()
+    server = _c.Server(completion_queue, server_credentials)
+    server.add_http2_addr('[::]:0')
+    server.start()
+    thread = threading.Thread(target=completion_queue.get, args=(_FUTURE,))
+    thread.start()
+    time.sleep(1)
+    server.stop()
+    completion_queue.stop()
+    for _ in range(_IDEMPOTENCE_DEMONSTRATION):
+      event = completion_queue.get(time.time() + _TIMEOUT)
+      self.assertIs(event.kind, _datatypes.Event.Kind.STOP)
+    thread.join()
+    del server
+    del completion_queue
+
+    _c.shut_down()
+
 
 if __name__ == '__main__':
   unittest.main()
diff --git a/src/python/src/_adapter/_low_test.py b/src/python/src/_adapter/_low_test.py
index 57b3be6..899ccf5 100644
--- a/src/python/src/_adapter/_low_test.py
+++ b/src/python/src/_adapter/_low_test.py
@@ -82,7 +82,7 @@
     self.host = 'localhost'
 
     self.server_completion_queue = _low.CompletionQueue()
-    self.server = _low.Server(self.server_completion_queue)
+    self.server = _low.Server(self.server_completion_queue, None)
     port = self.server.add_http2_addr('[::]:0')
     self.server.start()
 
@@ -260,7 +260,7 @@
     self.host = 'localhost'
 
     self.server_completion_queue = _low.CompletionQueue()
-    self.server = _low.Server(self.server_completion_queue)
+    self.server = _low.Server(self.server_completion_queue, None)
     port = self.server.add_http2_addr('[::]:0')
     self.server.start()
 
diff --git a/src/python/src/_adapter/_server.c b/src/python/src/_adapter/_server.c
index d2730d9..503be61 100644
--- a/src/python/src/_adapter/_server.c
+++ b/src/python/src/_adapter/_server.c
@@ -38,18 +38,30 @@
 
 #include "_adapter/_completion_queue.h"
 #include "_adapter/_error.h"
+#include "_adapter/_server_credentials.h"
 
 static int pygrpc_server_init(Server *self, PyObject *args, PyObject *kwds) {
   const PyObject *completion_queue;
-  if (!(PyArg_ParseTuple(args, "O!", &pygrpc_CompletionQueueType,
-                         &completion_queue))) {
+  PyObject *server_credentials;
+  if (!(PyArg_ParseTuple(args, "O!O", &pygrpc_CompletionQueueType,
+                         &completion_queue, &server_credentials))) {
     self->c_server = NULL;
     return -1;
   }
-
-  self->c_server = grpc_server_create(
-      ((CompletionQueue *)completion_queue)->c_completion_queue, NULL);
-  return 0;
+  if (server_credentials == Py_None) {
+    self->c_server = grpc_server_create(
+        ((CompletionQueue *)completion_queue)->c_completion_queue, NULL);
+    return 0;
+  } else if (PyObject_TypeCheck(server_credentials,
+                                &pygrpc_ServerCredentialsType)) {
+    self->c_server = grpc_secure_server_create(
+        ((ServerCredentials *)server_credentials)->c_server_credentials,
+        ((CompletionQueue *)completion_queue)->c_completion_queue, NULL);
+    return 0;
+  } else {
+    self->c_server = NULL;
+    return -1;
+  }
 }
 
 static void pygrpc_server_dealloc(Server *self) {
diff --git a/src/python/src/_adapter/fore.py b/src/python/src/_adapter/fore.py
index c307e7c..2f10275 100644
--- a/src/python/src/_adapter/fore.py
+++ b/src/python/src/_adapter/fore.py
@@ -265,7 +265,7 @@
     """
     with self._condition:
       self._completion_queue = _low.CompletionQueue()
-      self._server = _low.Server(self._completion_queue)
+      self._server = _low.Server(self._completion_queue, None)
       port = self._server.add_http2_addr(
           '[::]:%d' % (0 if self._port is None else self._port))
       self._server.start()