Revert all changes unrelated to the new *client_CA* functionality.
diff --git a/src/crypto/netscape_spki.c b/src/crypto/netscape_spki.c
index 51bb83e..4fa9d8d 100644
--- a/src/crypto/netscape_spki.c
+++ b/src/crypto/netscape_spki.c
@@ -243,7 +243,7 @@
 PyTypeObject crypto_NetscapeSPKI_Type = {
     PyObject_HEAD_INIT(NULL)
     0,
-    "OpenSSL.crypto.NetscapeSPKI",
+    "NetscapeSPKI",
     sizeof(crypto_NetscapeSPKIObj),
     0,
     (destructor)crypto_NetscapeSPKI_dealloc,
diff --git a/src/crypto/pkcs12.c b/src/crypto/pkcs12.c
index da58df9..2302242 100644
--- a/src/crypto/pkcs12.c
+++ b/src/crypto/pkcs12.c
@@ -71,14 +71,14 @@
 \n\
 @returns: PKey object containing the private key\n\
 ";
-static PyObject *
+static crypto_PKeyObj *
 crypto_PKCS12_get_privatekey(crypto_PKCS12Obj *self, PyObject *args)
 {
     if (!PyArg_ParseTuple(args, ":get_privatekey"))
         return NULL;
 
     Py_INCREF(self->key);
-    return self->key;
+    return (crypto_PKeyObj *) self->key;
 }
 
 static char crypto_PKCS12_set_privatekey_doc[] = "\n\
@@ -514,7 +514,7 @@
 PyTypeObject crypto_PKCS12_Type = {
     PyObject_HEAD_INIT(NULL)
     0,
-    "OpenSSL.crypto.PKCS12",
+    "PKCS12",
     sizeof(crypto_PKCS12Obj),
     0,
     (destructor)crypto_PKCS12_dealloc,
diff --git a/src/crypto/pkcs7.c b/src/crypto/pkcs7.c
index ad9cbae..1cb0813 100644
--- a/src/crypto/pkcs7.c
+++ b/src/crypto/pkcs7.c
@@ -177,7 +177,7 @@
 PyTypeObject crypto_PKCS7_Type = {
     PyObject_HEAD_INIT(NULL)
     0,
-    "OpenSSL.crypto.PKCS7",
+    "PKCS7",
     sizeof(crypto_PKCS7Obj),
     0,
     (destructor)crypto_PKCS7_dealloc,
diff --git a/src/crypto/x509.c b/src/crypto/x509.c
index 7d3e46d..e089d40 100644
--- a/src/crypto/x509.c
+++ b/src/crypto/x509.c
@@ -800,7 +800,7 @@
 PyTypeObject crypto_X509_Type = {
     PyObject_HEAD_INIT(NULL)
     0,
-    "OpenSSL.crypto.X509",
+    "X509",
     sizeof(crypto_X509Obj),
     0,
     (destructor)crypto_X509_dealloc,
diff --git a/src/crypto/x509ext.c b/src/crypto/x509ext.c
index a8e5f14..90ef543 100644
--- a/src/crypto/x509ext.c
+++ b/src/crypto/x509ext.c
@@ -256,7 +256,7 @@
 PyTypeObject crypto_X509Extension_Type = {
     PyObject_HEAD_INIT(NULL)
     0,
-    "OpenSSL.crypto.X509Extension",
+    "X509Extension",
     sizeof(crypto_X509ExtensionObj),
     0,
     (destructor)crypto_X509Extension_dealloc, 
diff --git a/src/crypto/x509name.c b/src/crypto/x509name.c
index 77046fb..39fdcf8 100644
--- a/src/crypto/x509name.c
+++ b/src/crypto/x509name.c
@@ -55,22 +55,12 @@
 crypto_X509Name_new(PyTypeObject *subtype, PyObject *args, PyObject *kwargs)
 {
     crypto_X509NameObj *name;
-    X509_NAME *sslname;
-    PyObject *newname;
 
     if (!PyArg_ParseTuple(args, "O!:X509Name", &crypto_X509Name_Type, &name)) {
         return NULL;
     }
-    sslname = X509_NAME_dup(name->x509_name);
-    if (sslname == NULL) {
-        exception_from_error_queue(crypto_Error);
-        return NULL;
-    }
-    newname = (PyObject *)crypto_X509Name_New(sslname, 1);
-    if (newname == NULL) {
-        X509_NAME_free(sslname);
-    }
-    return newname;
+
+    return (PyObject *)crypto_X509Name_New(X509_NAME_dup(name->x509_name), 1);
 }
 
 
@@ -433,7 +423,7 @@
 PyTypeObject crypto_X509Name_Type = {
     PyObject_HEAD_INIT(NULL)
     0,
-    "OpenSSL.crypto.X509Name",
+    "X509Name",
     sizeof(crypto_X509NameObj),
     0,
     (destructor)crypto_X509Name_dealloc,
diff --git a/src/crypto/x509req.c b/src/crypto/x509req.c
index 486df93..07bd44b 100644
--- a/src/crypto/x509req.c
+++ b/src/crypto/x509req.c
@@ -372,7 +372,7 @@
 PyTypeObject crypto_X509Req_Type = {
     PyObject_HEAD_INIT(NULL)
     0,
-    "OpenSSL.crypto.X509Req",
+    "X509Req",
     sizeof(crypto_X509ReqObj),
     0,
     (destructor)crypto_X509Req_dealloc,
diff --git a/src/crypto/x509store.c b/src/crypto/x509store.c
index ce67e46..16af3b0 100644
--- a/src/crypto/x509store.c
+++ b/src/crypto/x509store.c
@@ -109,7 +109,7 @@
 PyTypeObject crypto_X509Store_Type = {
     PyObject_HEAD_INIT(NULL)
     0,
-    "OpenSSL.crypto.X509Store",
+    "X509Store",
     sizeof(crypto_X509StoreObj),
     0,
     (destructor)crypto_X509Store_dealloc,
diff --git a/src/ssl/connection.c b/src/ssl/connection.c
index bd39b66..90a9652 100755
--- a/src/ssl/connection.c
+++ b/src/ssl/connection.c
@@ -819,21 +819,10 @@
         return NULL;
 
     lst = PyList_New(0);
-    if (lst == NULL) {
-        return NULL;
-    }
     while ((ret = SSL_get_cipher_list(self->ssl, idx)) != NULL)
     {
         item = PyString_FromString(ret);
-        if (item == NULL) {
-            Py_DECREF(lst);
-            return NULL;
-        }
-        if (PyList_Append(lst, item)) {
-            Py_DECREF(lst);
-            Py_DECREF(item);
-            return NULL;
-        }
+        PyList_Append(lst, item);
         Py_DECREF(item);
         idx++;
     }
diff --git a/src/ssl/context.c b/src/ssl/context.c
index a3d798e..d03e92c 100644
--- a/src/ssl/context.c
+++ b/src/ssl/context.c
@@ -347,17 +347,11 @@
 static PyTypeObject *
 import_crypto_type(const char *name, size_t objsize)
 {
-    PyObject *module, *type;
+    PyObject *module, *type, *name_attr;
     PyTypeObject *res;
-    char modname[] = "OpenSSL.crypto";
-    char buffer[256] = "OpenSSL.crypto.";
+    int right_name;
 
-    if (strlen(buffer) + strlen(name) >= sizeof(buffer)) {
-        PyErr_BadInternalCall();
-        return NULL;
-    }
-    strcat(buffer, name);
-    module = PyImport_ImportModule(modname);
+    module = PyImport_ImportModule("OpenSSL.crypto");
     if (module == NULL) {
         return NULL;
     }
@@ -370,8 +364,16 @@
         Py_DECREF(type);
         return type_modified_error(name);
     }
+    name_attr = PyObject_GetAttrString(type, "__name__");
+    if (name_attr == NULL) {
+        Py_DECREF(type);
+        return NULL;
+    }
+    right_name = (PyString_CheckExact(name_attr) &&
+                  strcmp(name, PyString_AsString(name_attr)) == 0);
+    Py_DECREF(name_attr);
     res = (PyTypeObject *)type;
-    if (strcmp(buffer, res->tp_name) != 0 || res->tp_basicsize != objsize) {
+    if (!right_name || res->tp_basicsize != objsize) {
         Py_DECREF(type);
         return type_modified_error(name);
     }
diff --git a/src/util.c b/src/util.c
index 0ad93e3..ae6ee5e 100644
--- a/src/util.c
+++ b/src/util.c
@@ -22,40 +22,26 @@
 PyObject *
 error_queue_to_list(void) {
     PyObject *errlist, *tuple;
-    int failed;
     long err;
 
     errlist = PyList_New(0);
-    if (errlist == NULL) {
-        return NULL;
-    }
+
     while ((err = ERR_get_error()) != 0) {
-        tuple = Py_BuildValue("(sss)", ERR_lib_error_string(err),
-                                       ERR_func_error_string(err),
-                                       ERR_reason_error_string(err));
-        if (tuple == NULL) {
-            Py_DECREF(errlist);
-            return NULL;
-        }
-        failed = PyList_Append(errlist, tuple);
+	tuple = Py_BuildValue("(sss)", ERR_lib_error_string(err),
+		                       ERR_func_error_string(err),
+				       ERR_reason_error_string(err));
+        PyList_Append(errlist, tuple);
         Py_DECREF(tuple);
-        if (failed) {
-            Py_DECREF(errlist);
-            return NULL;
-        }
     }
 
     return errlist;
 }
 
-void exception_from_error_queue(PyObject *the_Error) {
+void exception_from_error_queue(PyObject *the_Error) { 
     PyObject *errlist = error_queue_to_list();
-
-    if (errlist != NULL) {
-        PyErr_SetObject(the_Error, errlist);
-        Py_DECREF(errlist);
-    }
-}
+    PyErr_SetObject(the_Error, errlist);
+    Py_DECREF(errlist);
+} 
 
 /*
  * Flush OpenSSL's error queue and ignore the result
@@ -71,5 +57,5 @@
      * very nasty things if we just invoked it with error_queue_to_list().
      */
     PyObject *list = error_queue_to_list();
-    Py_XDECREF(list);
+    Py_DECREF(list);
 }