OpenSSL.crypto builds without warnings
diff --git a/OpenSSL/crypto/crl.c b/OpenSSL/crypto/crl.c
index 8e1c135..c9abbab 100644
--- a/OpenSSL/crypto/crl.c
+++ b/OpenSSL/crypto/crl.c
@@ -172,7 +172,7 @@
         return NULL;
     }
     buf_len = BIO_get_mem_data(bio, &temp);
-    buffer = PyString_FromStringAndSize(temp, buf_len);
+    buffer = PyBytes_FromStringAndSize(temp, buf_len);
     BIO_free(bio);
     return buffer;
 }
@@ -207,11 +207,6 @@
 #undef ADD_METHOD
 
 
-static PyObject *
-crypto_CRL_getattr(crypto_CRLObj *self, char *name) {
-    return Py_FindMethod(crypto_CRL_methods, (PyObject *)self, name);
-}
-
 static void
 crypto_CRL_dealloc(crypto_CRLObj *self) {
     X509_CRL_free(self->crl);
@@ -237,14 +232,13 @@
 }
 
 PyTypeObject crypto_CRL_Type = {
-    PyObject_HEAD_INIT(NULL)
-    0,
+    PyVarObject_HEAD_INIT(&PyType_Type, 0)
     "CRL",
     sizeof(crypto_CRLObj),
     0,
     (destructor)crypto_CRL_dealloc,
     NULL, /* print */
-    (getattrfunc)crypto_CRL_getattr,
+    NULL, /* getattr */
     NULL, /* setattr */
     NULL, /* compare */
     NULL, /* repr */
diff --git a/OpenSSL/crypto/netscape_spki.c b/OpenSSL/crypto/netscape_spki.c
index ada5ef6..ab3d463 100644
--- a/OpenSSL/crypto/netscape_spki.c
+++ b/OpenSSL/crypto/netscape_spki.c
@@ -149,7 +149,7 @@
         return NULL;
     }
 
-    return PyInt_FromLong((long)answer);
+    return PyLong_FromLong((long)answer);
 }
 
 static char crypto_NetscapeSPKI_b64_encode_doc[] = "\n\
@@ -167,7 +167,7 @@
         return NULL;
 
     str = NETSCAPE_SPKI_b64_encode(self->netscape_spki);
-    return PyString_FromString(str);
+    return PyBytes_FromString(str);
 }
 
 
@@ -243,29 +243,14 @@
 };
 #undef ADD_METHOD
 
-/*
- * Find attribute
- *
- * Arguments: self - The NetscapeSPKI object
- *            name - The attribute name
- * Returns:   A Python object for the attribute, or NULL if something went
- *            wrong
- */
-static PyObject *
-crypto_NetscapeSPKI_getattr(crypto_NetscapeSPKIObj *self, char *name)
-{
-    return Py_FindMethod(crypto_NetscapeSPKI_methods, (PyObject *)self, name);
-}
-
 PyTypeObject crypto_NetscapeSPKI_Type = {
-    PyObject_HEAD_INIT(NULL)
-    0,
+    PyVarObject_HEAD_INIT(&PyType_Type, 0)
     "NetscapeSPKI",
     sizeof(crypto_NetscapeSPKIObj),
     0,
     (destructor)crypto_NetscapeSPKI_dealloc,
     NULL, /* print */
-    (getattrfunc)crypto_NetscapeSPKI_getattr,
+    NULL, /* getattr */
     NULL, /* setattr */
     NULL, /* compare */
     NULL, /* repr */
diff --git a/OpenSSL/crypto/pkcs12.c b/OpenSSL/crypto/pkcs12.c
index 2302242..5483e42 100644
--- a/OpenSSL/crypto/pkcs12.c
+++ b/OpenSSL/crypto/pkcs12.c
@@ -202,7 +202,7 @@
         kwlist, &name))
         return NULL;
 
-    if (name != Py_None && ! PyString_CheckExact(name)) {
+    if (name != Py_None && ! PyBytes_CheckExact(name)) {
         PyErr_SetString(PyExc_TypeError, "name must be a str or None");
         return NULL;
     }
@@ -263,7 +263,7 @@
         }
     }
     if (self->friendlyname != Py_None) {
-        friendly_name = PyString_AsString(self->friendlyname);
+        friendly_name = PyBytes_AsString(self->friendlyname);
     }
 
     p12 = PKCS12_create(passphrase, friendly_name, pkey, x509, cacerts,
@@ -278,7 +278,7 @@
     bio = BIO_new(BIO_s_mem());
     i2d_PKCS12_bio(bio, p12);
     buf_len = BIO_get_mem_data(bio, &temp);
-    buffer = PyString_FromStringAndSize(temp, buf_len);
+    buffer = PyBytes_FromStringAndSize(temp, buf_len);
     BIO_free(bio);
     return buffer;
 }
@@ -439,20 +439,6 @@
 }
 
 /*
- * Find attribute
- *
- * Arguments: self - The PKCS12 object
- *            name - The attribute name
- * Returns:   A Python object for the attribute, or NULL if something went
- *            wrong
- */
-static PyObject *
-crypto_PKCS12_getattr(crypto_PKCS12Obj *self, char *name)
-{
-    return Py_FindMethod(crypto_PKCS12_methods, (PyObject *)self, name);
-}
-
-/*
  * Call the visitproc on all contained objects.
  *
  * Arguments: self - The PKCS12 object
@@ -512,14 +498,13 @@
 }
 
 PyTypeObject crypto_PKCS12_Type = {
-    PyObject_HEAD_INIT(NULL)
-    0,
+    PyVarObject_HEAD_INIT(&PyType_Type, 0)
     "PKCS12",
     sizeof(crypto_PKCS12Obj),
     0,
     (destructor)crypto_PKCS12_dealloc,
     NULL, /* print */
-    (getattrfunc)crypto_PKCS12_getattr,
+    NULL, /* getattr */
     NULL, /* setattr */
     NULL, /* compare */
     NULL, /* repr */
diff --git a/OpenSSL/crypto/pkcs7.c b/OpenSSL/crypto/pkcs7.c
index 1cb0813..8bfddb3 100644
--- a/OpenSSL/crypto/pkcs7.c
+++ b/OpenSSL/crypto/pkcs7.c
@@ -24,9 +24,9 @@
         return NULL;
 
     if (PKCS7_type_is_signed(self->pkcs7))
-        return PyInt_FromLong(1L);
+        return PyLong_FromLong(1L);
     else
-        return PyInt_FromLong(0L);
+        return PyLong_FromLong(0L);
 }
 
 static char crypto_PKCS7_type_is_enveloped_doc[] = "\n\
@@ -42,9 +42,9 @@
         return NULL;
 
     if (PKCS7_type_is_enveloped(self->pkcs7))
-        return PyInt_FromLong(1L);
+        return PyLong_FromLong(1L);
     else
-        return PyInt_FromLong(0L);
+        return PyLong_FromLong(0L);
 }
 
 static char crypto_PKCS7_type_is_signedAndEnveloped_doc[] = "\n\
@@ -60,9 +60,9 @@
         return NULL;
 
     if (PKCS7_type_is_signedAndEnveloped(self->pkcs7))
-        return PyInt_FromLong(1L);
+        return PyLong_FromLong(1L);
     else
-        return PyInt_FromLong(0L);
+        return PyLong_FromLong(0L);
 }
 
 static char crypto_PKCS7_type_is_data_doc[] = "\n\
@@ -78,9 +78,9 @@
         return NULL;
 
     if (PKCS7_type_is_data(self->pkcs7))
-        return PyInt_FromLong(1L);
+        return PyLong_FromLong(1L);
     else
-        return PyInt_FromLong(0L);
+        return PyLong_FromLong(0L);
 }
 
 static char crypto_PKCS7_get_type_name_doc[] = "\n\
@@ -98,7 +98,7 @@
     /* 
      * return a string with the typename
      */
-    return PyString_FromString(OBJ_nid2sn(OBJ_obj2nid(self->pkcs7->type)));
+    return PyBytes_FromString(OBJ_nid2sn(OBJ_obj2nid(self->pkcs7->type)));
 }
 
 /*
@@ -160,29 +160,14 @@
     PyObject_Del(self);
 }
 
-/*
- * Find attribute
- *
- * Arguments: self - The PKCS7 object
- *            name - The attribute name
- * Returns:   A Python object for the attribute, or NULL if something went
- *            wrong
- */
-static PyObject *
-crypto_PKCS7_getattr(crypto_PKCS7Obj *self, char *name)
-{
-    return Py_FindMethod(crypto_PKCS7_methods, (PyObject *)self, name);
-}
-
 PyTypeObject crypto_PKCS7_Type = {
-    PyObject_HEAD_INIT(NULL)
-    0,
+    PyVarObject_HEAD_INIT(&PyType_Type, 0)
     "PKCS7",
     sizeof(crypto_PKCS7Obj),
     0,
     (destructor)crypto_PKCS7_dealloc,
     NULL, /* print */
-    (getattrfunc)crypto_PKCS7_getattr,
+    NULL, /* getattr */
     NULL, /* setattr */
     NULL, /* compare */
     NULL, /* repr */
@@ -191,7 +176,19 @@
     NULL, /* as_mapping */
     NULL, /* hash */
     NULL, /* call */
-    NULL  /* str */
+    NULL,  /* str */
+    NULL, /* getattro */
+    NULL, /* setattro */
+    NULL, /* as_buffer */
+    Py_TPFLAGS_DEFAULT,
+    NULL, /* doc */
+    NULL, /* traverse */
+    NULL, /* clear */
+    NULL, /* tp_richcompare */
+    0, /* tp_weaklistoffset */
+    NULL, /* tp_iter */
+    NULL, /* tp_iternext */
+    crypto_PKCS7_methods, /* tp_methods */
 };
 
 /*
diff --git a/OpenSSL/crypto/pkey.c b/OpenSSL/crypto/pkey.c
index 583a2a1..82b9e06 100644
--- a/OpenSSL/crypto/pkey.c
+++ b/OpenSSL/crypto/pkey.c
@@ -88,7 +88,7 @@
     if (!PyArg_ParseTuple(args, ":bits"))
         return NULL;
 
-    return PyInt_FromLong(EVP_PKEY_bits(self->pkey));
+    return PyLong_FromLong(EVP_PKEY_bits(self->pkey));
 }
 
 static char crypto_PKey_type_doc[] = "\n\
@@ -103,7 +103,7 @@
     if (!PyArg_ParseTuple(args, ":type"))
         return NULL;
 
-    return PyInt_FromLong(self->pkey->type);
+    return PyLong_FromLong(self->pkey->type);
 }
 
 
@@ -196,29 +196,14 @@
     PyObject_Del(self);
 }
 
-/*
- * Find attribute
- *
- * Arguments: self - The PKey object
- *            name - The attribute name
- * Returns:   A Python object for the attribute, or NULL if something went
- *            wrong
- */
-static PyObject *
-crypto_PKey_getattr(crypto_PKeyObj *self, char *name)
-{
-    return Py_FindMethod(crypto_PKey_methods, (PyObject *)self, name);
-}
-
 PyTypeObject crypto_PKey_Type = {
-    PyObject_HEAD_INIT(NULL)
-    0,
+    PyVarObject_HEAD_INIT(&PyType_Type, 0)
     "OpenSSL.crypto.PKey",
     sizeof(crypto_PKeyObj),
     0,
     (destructor)crypto_PKey_dealloc,
     NULL, /* print */
-    (getattrfunc)crypto_PKey_getattr,
+    NULL, /* getattr */
     NULL, /* setattr */
     NULL, /* compare */
     NULL, /* repr */
diff --git a/OpenSSL/crypto/revoked.c b/OpenSSL/crypto/revoked.c
index 3042c4d..95cfcf4 100644
--- a/OpenSSL/crypto/revoked.c
+++ b/OpenSSL/crypto/revoked.c
@@ -36,7 +36,7 @@
     list = PyList_New(0);
     for (j = 0; j < NUM_REASONS; j++) {
         if(crl_reasons[j]) {
-            str = PyString_FromString(crl_reasons[j]);
+            str = PyBytes_FromString(crl_reasons[j]);
             PyList_Append(list, str);
             Py_DECREF(str);
         }
@@ -66,7 +66,7 @@
 
     /* Convert to a Python string. */
     str_len = BIO_get_mem_data(bio, &tmp_str);
-    str = PyString_FromStringAndSize(tmp_str, str_len);
+    str = PyBytes_FromStringAndSize(tmp_str, str_len);
 
     /* Cleanup */
     BIO_free(bio);
@@ -256,7 +256,7 @@
 
     /* Convert to a Python string. */
     str_len = BIO_get_mem_data(bio, &tmp_str);
-    str = PyString_FromStringAndSize(tmp_str, str_len);
+    str = PyBytes_FromStringAndSize(tmp_str, str_len);
 
     /* Cleanup */
     BIO_free(bio);
@@ -362,11 +362,6 @@
 #undef ADD_METHOD
 
 
-static PyObject *
-crypto_Revoked_getattr(crypto_RevokedObj *self, char *name) {
-    return Py_FindMethod(crypto_Revoked_methods, (PyObject *)self, name);
-}
-
 static void
 crypto_Revoked_dealloc(crypto_RevokedObj *self) {
     X509_REVOKED_free(self->revoked);
@@ -392,14 +387,13 @@
 }
 
 PyTypeObject crypto_Revoked_Type = {
-    PyObject_HEAD_INIT(NULL)
-    0,
+    PyVarObject_HEAD_INIT(&PyType_Type, 0)
     "Revoked",
     sizeof(crypto_RevokedObj),
     0,
     (destructor)crypto_Revoked_dealloc,
     NULL, /* print */
-    (getattrfunc)crypto_Revoked_getattr,
+    NULL, /* getattr */
     NULL, /* setattr */
     NULL, /* compare */
     NULL, /* repr */
diff --git a/OpenSSL/crypto/x509ext.c b/OpenSSL/crypto/x509ext.c
index 90ef543..995a079 100644
--- a/OpenSSL/crypto/x509ext.c
+++ b/OpenSSL/crypto/x509ext.c
@@ -25,7 +25,7 @@
     if (!PyArg_ParseTuple(args, ":get_critical"))
         return NULL;
 
-    return PyInt_FromLong(X509_EXTENSION_get_critical(self->x509_extension));
+    return PyLong_FromLong(X509_EXTENSION_get_critical(self->x509_extension));
 }
 
 static char crypto_X509Extension_get_short_name_doc[] = "\n\
@@ -47,7 +47,7 @@
 	obj = X509_EXTENSION_get_object(self->x509_extension);
 
 	extname = OBJ_nid2sn(OBJ_obj2nid(obj));
-	return PyString_FromString(extname);
+	return PyBytes_FromString(extname);
 }
 
 
@@ -214,20 +214,6 @@
 }
 
 /*
- * Find attribute
- *
- * Arguments: self - The X509Extension object
- *            name - The attribute name
- * Returns: A Python object for the attribute, or NULL if something
- *          went wrong.
- */       
-static PyObject *
-crypto_X509Extension_getattr(crypto_X509ExtensionObj *self, char *name)
-{
-    return Py_FindMethod(crypto_X509Extension_methods, (PyObject *)self, name);
-}
-
-/*
  * Print a nice text representation of the certificate request.
  */
 static PyObject *
@@ -246,7 +232,7 @@
     }
 
     str_len = BIO_get_mem_data(bio, &tmp_str);
-    str = PyString_FromStringAndSize(tmp_str, str_len);
+    str = PyText_FromStringAndSize(tmp_str, str_len);
 
     BIO_free(bio);
 
@@ -254,14 +240,13 @@
 }
 
 PyTypeObject crypto_X509Extension_Type = {
-    PyObject_HEAD_INIT(NULL)
-    0,
+    PyVarObject_HEAD_INIT(&PyType_Type, 0)
     "X509Extension",
     sizeof(crypto_X509ExtensionObj),
     0,
     (destructor)crypto_X509Extension_dealloc, 
     NULL, /* print */
-    (getattrfunc)crypto_X509Extension_getattr, 
+    NULL, /* getattr */
     NULL, /* setattr  (setattrfunc)crypto_X509Name_setattr, */
     NULL, /* compare */
     NULL, /* repr */ 
diff --git a/OpenSSL/crypto/x509req.c b/OpenSSL/crypto/x509req.c
index 14ae072..4237a45 100644
--- a/OpenSSL/crypto/x509req.c
+++ b/OpenSSL/crypto/x509req.c
@@ -166,7 +166,7 @@
         return NULL;
     }
 
-    return PyInt_FromLong(answer);
+    return PyLong_FromLong(answer);
 }
 
 static char crypto_X509Req_add_extensions_doc[] = "\n\
@@ -357,29 +357,14 @@
 }
 
 
-/*
- * Find attribute.
- *
- * Arguments: self - The X509Req object
- *            name - The attribute name
- * Returns:   A Python object for the attribute, or NULL if something went
- *            wrong
- */
-static PyObject *
-crypto_X509Req_getattr(crypto_X509ReqObj *self, char *name)
-{
-    return Py_FindMethod(crypto_X509Req_methods, (PyObject *)self, name);
-}
-
 PyTypeObject crypto_X509Req_Type = {
-    PyObject_HEAD_INIT(NULL)
-    0,
+    PyVarObject_HEAD_INIT(&PyType_Type, 0)
     "X509Req",
     sizeof(crypto_X509ReqObj),
     0,
     (destructor)crypto_X509Req_dealloc,
     NULL, /* print */
-    (getattrfunc)crypto_X509Req_getattr,
+    NULL, /* getattr */
     NULL, /* setattr */
     NULL, /* compare */
     NULL, /* repr */
diff --git a/OpenSSL/crypto/x509store.c b/OpenSSL/crypto/x509store.c
index 16af3b0..1452df6 100644
--- a/OpenSSL/crypto/x509store.c
+++ b/OpenSSL/crypto/x509store.c
@@ -92,36 +92,35 @@
 }
 
 
-/*
- * Find attribute.
- *
- * Arguments: self - The X509Store object
- *            name - The attribute name
- * Returns:   A Python object for the attribute, or NULL if something went
- *            wrong
- */
-static PyObject *
-crypto_X509Store_getattr(crypto_X509StoreObj *self, char *name)
-{
-    return Py_FindMethod(crypto_X509Store_methods, (PyObject *)self, name);
-}
-
 PyTypeObject crypto_X509Store_Type = {
-    PyObject_HEAD_INIT(NULL)
-    0,
+    PyVarObject_HEAD_INIT(&PyType_Type, 0)
     "X509Store",
     sizeof(crypto_X509StoreObj),
     0,
     (destructor)crypto_X509Store_dealloc,
     NULL, /* print */
-    (getattrfunc)crypto_X509Store_getattr,
+    NULL, /* getattr */
     NULL, /* setattr */
     NULL, /* compare */
     NULL, /* repr */
     NULL, /* as_number */
     NULL, /* as_sequence */
     NULL, /* as_mapping */
-    NULL  /* hash */
+    NULL,  /* hash */
+    NULL, /* call */
+    NULL, /* str */
+    NULL, /* getattro */
+    NULL, /* setattro */
+    NULL, /* as_buffer */
+    Py_TPFLAGS_DEFAULT,
+    NULL, /* doc */
+    NULL, /* traverse */
+    NULL, /* clear */
+    NULL, /* tp_richcompare */
+    0, /* tp_weaklistoffset */
+    NULL, /* tp_iter */
+    NULL, /* tp_iternext */
+    crypto_X509Store_methods, /* tp_methods */
 };
 
 
diff --git a/OpenSSL/py3k.h b/OpenSSL/py3k.h
index dc46b43..443ad8d 100644
--- a/OpenSSL/py3k.h
+++ b/OpenSSL/py3k.h
@@ -10,6 +10,7 @@
 PyInit_##name(void)
 
 #define PyText_FromString PyUnicode_FromString
+#define PyText_FromStringAndSize PyUnicode_FromStringAndSize
 
 #else /* (PY_VERSION_HEX >= 0x03000000) */
 
@@ -22,10 +23,12 @@
 
 #define PyBytes_Size PyString_Size
 #define PyBytes_Check PyString_Check
+#define PyBytes_CheckExact PyString_CheckExact
 #define PyBytes_AsString PyString_AsString
 #define PyBytes_FromStringAndSize PyString_FromStringAndSize
 
 #define PyText_FromString PyString_FromString
+#define PyText_FromStringAndSize PyString_FromStringAndSize
 
 #define PyOpenSSL_MODINIT(name)
 void \