diff --git a/doc/pyOpenSSL.tex b/doc/pyOpenSSL.tex
index 69f01d5..cedeccb 100644
--- a/doc/pyOpenSSL.tex
+++ b/doc/pyOpenSSL.tex
@@ -853,7 +853,7 @@
 when requesting a client certificate.
 \end{methoddesc}
 
-\begin{methoddesc}[Context]{set_client_CA_list}{certificate_authorities}
+\begin{methoddesc}[Context]{set_client_ca_list}{certificate_authorities}
 Replace the current list of preferred certificate signers that would be
 sent to the client when requesting a client certificate with the
 \var{certificate_authorities} sequence of \class{OpenSSL.crypto.X509Name}s.
@@ -861,7 +861,7 @@
 \versionadded{0.10}
 \end{methoddesc}
 
-\begin{methoddesc}[Context]{add_client_CA}{certificate_authority}
+\begin{methoddesc}[Context]{add_client_ca}{certificate_authority}
 Extract a \class{OpenSSL.crypto.X509Name} from the \var{certificate_authority}
 \class{OpenSSL.crypto.X509} certificate and add it to the list of preferred
 certificate signers sent to the client when requesting a client certificate.
@@ -1042,7 +1042,7 @@
 but not it returns the entire list in one go.
 \end{methoddesc}
 
-\begin{methoddesc}[Connection]{get_client_CA_list}{}
+\begin{methoddesc}[Connection]{get_client_ca_list}{}
 Retrieve the list of preferred client certificate issuers sent by the server
 as \class{OpenSSL.crypto.X509Name} objects.
 
diff --git a/src/ssl/connection.c b/src/ssl/connection.c
index 90a9652..9fbeb01 100755
--- a/src/ssl/connection.c
+++ b/src/ssl/connection.c
@@ -829,22 +829,22 @@
     return lst;
 }
 
-static char ssl_Connection_get_client_CA_list_doc[] = "\n\
+static char ssl_Connection_get_client_ca_list_doc[] = "\n\
 Get CAs whose certificates are suggested for client authentication.\n\
 \n\
 @return: A list of X509Names representing the acceptable CAs as set by\n\
-         ssl.Context.{set, add}_client_CA* if this is a server connection\n\
+         ssl.Context.{set, add}_client_ca* if this is a server connection\n\
          or as sent by the server if this is a client connection.\n\
 ";
 
 static PyObject *
-ssl_Connection_get_client_CA_list(ssl_ConnectionObj *self, PyObject *args)
+ssl_Connection_get_client_ca_list(ssl_ConnectionObj *self, PyObject *args)
 {
     STACK_OF(X509_NAME) *CANames;
     PyObject *CAList;
     int i, n;
 
-    if (!PyArg_ParseTuple(args, ":get_client_CA_list")) {
+    if (!PyArg_ParseTuple(args, ":get_client_ca_list")) {
         return NULL;
     }
     CANames = SSL_get_client_CA_list(self->ssl);
@@ -1139,7 +1139,7 @@
     ADD_METHOD(bio_shutdown),
     ADD_METHOD(shutdown),
     ADD_METHOD(get_cipher_list),
-    ADD_METHOD(get_client_CA_list),
+    ADD_METHOD(get_client_ca_list),
     ADD_METHOD(makefile),
     ADD_METHOD(get_app_data),
     ADD_METHOD(set_app_data),
diff --git a/src/ssl/context.c b/src/ssl/context.c
index d03e92c..586d3ba 100644
--- a/src/ssl/context.c
+++ b/src/ssl/context.c
@@ -802,7 +802,7 @@
     }
 }
 
-static char ssl_Context_set_client_CA_list_doc[] = "\n\
+static char ssl_Context_set_client_ca_list_doc[] = "\n\
 Set the list of preferred client certificate signers for this server context.\n\
 \n\
 This list of certificate authorities will be sent to the client when the\n\
@@ -813,7 +813,7 @@
 ";
 
 static PyObject *
-ssl_Context_set_client_CA_list(ssl_ContextObj *self, PyObject *args)
+ssl_Context_set_client_ca_list(ssl_ContextObj *self, PyObject *args)
 {
     static PyTypeObject *X509NameType;
     PyObject *sequence, *tuple, *item;
@@ -829,7 +829,7 @@
             return NULL;
         }
     }
-    if (!PyArg_ParseTuple(args, "O:set_client_CA_list", &sequence)) {
+    if (!PyArg_ParseTuple(args, "O:set_client_ca_list", &sequence)) {
         return NULL;
     }
     tuple = PySequence_Tuple(sequence);
@@ -880,7 +880,7 @@
     return Py_None;
 }
 
-static char ssl_Context_add_client_CA_doc[] = "\n\
+static char ssl_Context_add_client_ca_doc[] = "\n\
 Add the CA certificate to the list of preferred signers for this context.\n\
 \n\
 The list of certificate authorities will be sent to the client when the\n\
@@ -891,11 +891,11 @@
 ";
 
 static PyObject *
-ssl_Context_add_client_CA(ssl_ContextObj *self, PyObject *args)
+ssl_Context_add_client_ca(ssl_ContextObj *self, PyObject *args)
 {
     crypto_X509Obj *cert;
 
-    cert = parse_certificate_argument("O!:add_client_CA", args);
+    cert = parse_certificate_argument("O!:add_client_ca", args);
     if (cert == NULL) {
         return NULL;
     }
@@ -1078,8 +1078,8 @@
     ADD_METHOD(get_verify_depth),
     ADD_METHOD(load_tmp_dh),
     ADD_METHOD(set_cipher_list),
-    ADD_METHOD(set_client_CA_list),
-    ADD_METHOD(add_client_CA),
+    ADD_METHOD(set_client_ca_list),
+    ADD_METHOD(add_client_ca),
     ADD_METHOD(set_timeout),
     ADD_METHOD(get_timeout),
     ADD_METHOD(set_info_callback),
diff --git a/test/test_ssl.py b/test/test_ssl.py
index 8a75ee0..a4727b6 100644
--- a/test/test_ssl.py
+++ b/test/test_ssl.py
@@ -583,35 +583,35 @@
         self.assertEquals(e.__class__, Error)
 
 
-    def _check_client_CA_list(self, func):
+    def _check_client_ca_list(self, func):
         server = self._server(None)
         client = self._client(None)
-        self.assertEqual(client.get_client_CA_list(), [])
-        self.assertEqual(server.get_client_CA_list(), [])
+        self.assertEqual(client.get_client_ca_list(), [])
+        self.assertEqual(server.get_client_ca_list(), [])
         ctx = server.get_context()
         expected = func(ctx)
-        self.assertEqual(client.get_client_CA_list(), [])
-        self.assertEqual(server.get_client_CA_list(), expected)
+        self.assertEqual(client.get_client_ca_list(), [])
+        self.assertEqual(server.get_client_ca_list(), expected)
         self._loopback(client, server)
-        self.assertEqual(client.get_client_CA_list(), expected)
-        self.assertEqual(server.get_client_CA_list(), expected)
+        self.assertEqual(client.get_client_ca_list(), expected)
+        self.assertEqual(server.get_client_ca_list(), expected)
 
 
-    def test_set_client_CA_list_basic(self):
+    def test_set_client_ca_list_basic(self):
         """
         Test paramater validation and return value for
-        L{Context.set_client_CA_list}.
+        L{Context.set_client_ca_list}.
         """
         ctx = Context(TLSv1_METHOD)
-        self.assertRaises(TypeError, ctx.set_client_CA_list, "spam")
-        self.assertRaises(TypeError, ctx.set_client_CA_list, ["spam"])
-        self.assertIdentical(ctx.set_client_CA_list([]), None)
+        self.assertRaises(TypeError, ctx.set_client_ca_list, "spam")
+        self.assertRaises(TypeError, ctx.set_client_ca_list, ["spam"])
+        self.assertIdentical(ctx.set_client_ca_list([]), None)
 
 
-    def test_set_client_CA_list_functional(self):
+    def test_set_client_ca_list_functional(self):
         """
-        The list of CAs set by L{Context.set_client_CA_list} and read by
-        L{Connection.get_client_CA_list} should match on server and
+        The list of CAs set by L{Context.set_client_ca_list} and read by
+        L{Connection.get_client_ca_list} should match on server and
         client side.
         """
         cacert = load_certificate(FILETYPE_PEM, root_cert_pem)
@@ -622,51 +622,51 @@
         sedesc = secert.get_subject()
         cldesc = clcert.get_subject()
 
-        def single_CA(ctx):
-            ctx.set_client_CA_list([cadesc])
+        def single_ca(ctx):
+            ctx.set_client_ca_list([cadesc])
             return [cadesc]
-        self._check_client_CA_list(single_CA)
+        self._check_client_ca_list(single_ca)
 
-        def no_CA(ctx):
-            ctx.set_client_CA_list([])
+        def no_ca(ctx):
+            ctx.set_client_ca_list([])
             return []
-        self._check_client_CA_list(no_CA)
+        self._check_client_ca_list(no_ca)
 
-        def multiple_CA(ctx):
+        def multiple_ca(ctx):
             L = [cadesc, sedesc, cldesc]
-            ctx.set_client_CA_list(L)
+            ctx.set_client_ca_list(L)
             return L
-        self._check_client_CA_list(multiple_CA)
+        self._check_client_ca_list(multiple_ca)
 
-        def changed_CA(ctx):
-            ctx.set_client_CA_list([sedesc, cldesc])
-            ctx.set_client_CA_list([cadesc])
+        def changed_ca(ctx):
+            ctx.set_client_ca_list([sedesc, cldesc])
+            ctx.set_client_ca_list([cadesc])
             return [cadesc]
-        self._check_client_CA_list(changed_CA)
+        self._check_client_ca_list(changed_ca)
 
-        def mutated_CA(ctx):
+        def mutated_ca(ctx):
             L = [cadesc]
-            ctx.set_client_CA_list([cadesc])
+            ctx.set_client_ca_list([cadesc])
             L.append(sedesc)
             return [cadesc]
-        self._check_client_CA_list(mutated_CA)
+        self._check_client_ca_list(mutated_ca)
 
 
-    def test_add_client_CA_basic(self):
+    def test_add_client_ca_basic(self):
         """
         Test paramater validation and return value for
-        L{Context.add_client_CA}.
+        L{Context.add_client_ca}.
         """
         ctx = Context(TLSv1_METHOD)
         cacert = load_certificate(FILETYPE_PEM, root_cert_pem)
-        self.assertRaises(TypeError, ctx.add_client_CA, "spam")
-        self.assertIdentical(ctx.add_client_CA(cacert), None)
+        self.assertRaises(TypeError, ctx.add_client_ca, "spam")
+        self.assertIdentical(ctx.add_client_ca(cacert), None)
 
 
-    def test_add_client_CA_functional(self):
+    def test_add_client_ca_functional(self):
         """
-        The list of CAs set by L{Context.add_client_CA} and read by
-        L{Connection.get_client_CA_list} should match on server and
+        The list of CAs set by L{Context.add_client_ca} and read by
+        L{Connection.get_client_ca_list} should match on server and
         client side.
         """
         cacert = load_certificate(FILETYPE_PEM, root_cert_pem)
@@ -677,29 +677,29 @@
         sedesc = secert.get_subject()
         cldesc = clcert.get_subject()
 
-        def single_CA(ctx):
-            ctx.add_client_CA(cacert)
+        def single_ca(ctx):
+            ctx.add_client_ca(cacert)
             return [cadesc]
-        self._check_client_CA_list(single_CA)
+        self._check_client_ca_list(single_ca)
 
-        def multiple_CA(ctx):
-            ctx.add_client_CA(cacert)
-            ctx.add_client_CA(secert)
+        def multiple_ca(ctx):
+            ctx.add_client_ca(cacert)
+            ctx.add_client_ca(secert)
             return [cadesc, sedesc]
-        self._check_client_CA_list(multiple_CA)
+        self._check_client_ca_list(multiple_ca)
 
-        def mixed_set_add_CA(ctx):
-            ctx.set_client_CA_list([cadesc, sedesc])
-            ctx.add_client_CA(clcert)
+        def mixed_set_add_ca(ctx):
+            ctx.set_client_ca_list([cadesc, sedesc])
+            ctx.add_client_ca(clcert)
             return [cadesc, sedesc, cldesc]
-        self._check_client_CA_list(mixed_set_add_CA)
+        self._check_client_ca_list(mixed_set_add_ca)
 
-        def set_replaces_add_CA(ctx):
-            ctx.add_client_CA(clcert)
-            ctx.set_client_CA_list([cadesc])
-            ctx.add_client_CA(secert)
+        def set_replaces_add_ca(ctx):
+            ctx.add_client_ca(clcert)
+            ctx.set_client_ca_list([cadesc])
+            ctx.add_client_ca(secert)
             return [cadesc, sedesc]
-        self._check_client_CA_list(set_replaces_add_CA)
+        self._check_client_ca_list(set_replaces_add_ca)
 
 
 
