OpenSSL.SSL mostly builds cleanly now
diff --git a/OpenSSL/ssl/connection.c b/OpenSSL/ssl/connection.c
index d53f45c..741c130 100755
--- a/OpenSSL/ssl/connection.c
+++ b/OpenSSL/ssl/connection.c
@@ -276,7 +276,7 @@
     }
 
     ret = SSL_pending(self->ssl);
-    return PyInt_FromLong((long)ret);
+    return PyLong_FromLong((long)ret);
 }
 
 static char ssl_Connection_bio_write_doc[] = "\n\
@@ -317,7 +317,7 @@
         return NULL;
     }
 
-    return PyInt_FromLong((long)ret);
+    return PyLong_FromLong((long)ret);
 }
 
 static char ssl_Connection_send_doc[] = "\n\
@@ -352,7 +352,7 @@
     err = SSL_get_error(self->ssl, ret);
     if (err == SSL_ERROR_NONE)
     {
-        return PyInt_FromLong((long)ret);
+        return PyLong_FromLong((long)ret);
     }
     else
     {
@@ -429,12 +429,12 @@
     if (!PyArg_ParseTuple(args, "i|i:recv", &bufsiz, &flags))
         return NULL;
 
-    buf = PyString_FromStringAndSize(NULL, bufsiz);
+    buf = PyBytes_FromStringAndSize(NULL, bufsiz);
     if (buf == NULL)
         return NULL;
 
     MY_BEGIN_ALLOW_THREADS(self->tstate)
-    ret = SSL_read(self->ssl, PyString_AsString(buf), bufsiz);
+    ret = SSL_read(self->ssl, PyBytes_AsString(buf), bufsiz);
     MY_END_ALLOW_THREADS(self->tstate)
 
     if (PyErr_Occurred())
@@ -447,7 +447,7 @@
     err = SSL_get_error(self->ssl, ret);
     if (err == SSL_ERROR_NONE)
     {
-        if (ret != bufsiz && _PyString_Resize(&buf, ret) < 0)
+        if (ret != bufsiz && _PyBytes_Resize(&buf, ret) < 0)
             return NULL;
         return buf;
     }
@@ -481,11 +481,11 @@
     if (!PyArg_ParseTuple(args, "i:bio_read", &bufsiz))
         return NULL;
 
-    buf = PyString_FromStringAndSize(NULL, bufsiz);
+    buf = PyBytes_FromStringAndSize(NULL, bufsiz);
     if (buf == NULL)
         return NULL;
 
-    ret = BIO_read(self->from_ssl, PyString_AsString(buf), bufsiz);
+    ret = BIO_read(self->from_ssl, PyBytes_AsString(buf), bufsiz);
 
     if (PyErr_Occurred())
     {
@@ -506,7 +506,7 @@
     /*
      * Shrink the string to match the number of bytes we actually read.
      */
-    if (ret != bufsiz && _PyString_Resize(&buf, ret) < 0)
+    if (ret != bufsiz && _PyBytes_Resize(&buf, ret) < 0)
     {
         Py_DECREF(buf);
         return NULL;
@@ -536,7 +536,7 @@
         return NULL;
     }
 
-    return PyInt_FromLong((long)ret);
+    return PyLong_FromLong((long)ret);
 }
 
 static char ssl_Connection_do_handshake_doc[] = "\n\
@@ -589,7 +589,7 @@
     if (!PyArg_ParseTuple(args, ":renegotiate_pending"))
         return NULL;
 
-    return PyInt_FromLong((long)SSL_renegotiate_pending(self->ssl));
+    return PyLong_FromLong((long)SSL_renegotiate_pending(self->ssl));
 }
 #endif
 
@@ -604,7 +604,7 @@
     if (!PyArg_ParseTuple(args, ":total_renegotiations"))
         return NULL;
 
-    return PyInt_FromLong(SSL_total_renegotiations(self->ssl));
+    return PyLong_FromLong(SSL_total_renegotiations(self->ssl));
 }
 
 static char ssl_Connection_set_accept_state_doc[] = "\n\
@@ -686,11 +686,6 @@
 
     ret = PyEval_CallObject(meth, args);
     Py_DECREF(meth);
-    if (ret == NULL)
-        return NULL;
-    if (PyInt_Check(ret) && PyInt_AsLong(ret) != 0)
-        return ret;
-
     return ret;
 }
 
@@ -820,7 +815,7 @@
     lst = PyList_New(0);
     while ((ret = SSL_get_cipher_list(self->ssl, idx)) != NULL)
     {
-        item = PyString_FromString(ret);
+        item = PyText_FromString(ret);
         PyList_Append(lst, item);
         Py_DECREF(item);
         idx++;
@@ -942,7 +937,7 @@
     if (!PyArg_ParseTuple(args, ":get_shutdown"))
         return NULL;
 
-    return PyInt_FromLong((long)SSL_get_shutdown(self->ssl));
+    return PyLong_FromLong((long)SSL_get_shutdown(self->ssl));
 }
 
 static char ssl_Connection_set_shutdown_doc[] = "\n\
@@ -975,7 +970,7 @@
     if (!PyArg_ParseTuple(args, ":state_string"))
         return NULL;
 
-    return PyString_FromString(SSL_state_string_long(self->ssl));
+    return PyText_FromString(SSL_state_string_long(self->ssl));
 }
 
 static char ssl_Connection_client_random_doc[] = "\n\
@@ -993,7 +988,7 @@
         Py_INCREF(Py_None);
         return Py_None;
     }
-    return PyString_FromStringAndSize( (const char *) self->ssl->s3->client_random, SSL3_RANDOM_SIZE);
+    return PyBytes_FromStringAndSize( (const char *) self->ssl->s3->client_random, SSL3_RANDOM_SIZE);
 }
 
 static char ssl_Connection_server_random_doc[] = "\n\
@@ -1011,7 +1006,7 @@
         Py_INCREF(Py_None);
         return Py_None;
     }
-    return PyString_FromStringAndSize( (const char *) self->ssl->s3->server_random, SSL3_RANDOM_SIZE);
+    return PyBytes_FromStringAndSize( (const char *) self->ssl->s3->server_random, SSL3_RANDOM_SIZE);
 }
 
 static char ssl_Connection_master_key_doc[] = "\n\
@@ -1029,7 +1024,7 @@
         Py_INCREF(Py_None);
         return Py_None;
     }
-    return PyString_FromStringAndSize( (const char *) self->ssl->session->master_key, self->ssl->session->master_key_length);
+    return PyBytes_FromStringAndSize( (const char *) self->ssl->session->master_key, self->ssl->session->master_key_length);
 }
 
 static char ssl_Connection_sock_shutdown_doc[] = "\n\
@@ -1086,7 +1081,7 @@
     if (!PyArg_ParseTuple(args, ":want_read"))
         return NULL;
 
-    return PyInt_FromLong((long)SSL_want_read(self->ssl));
+    return PyLong_FromLong((long)SSL_want_read(self->ssl));
 }
 
 static char ssl_Connection_want_write_doc[] = "\n\
@@ -1101,7 +1096,7 @@
     if (!PyArg_ParseTuple(args, ":want_write"))
         return NULL;
 
-    return PyInt_FromLong((long)SSL_want_write(self->ssl));
+    return PyLong_FromLong((long)SSL_want_write(self->ssl));
 }
 
 /*
@@ -1284,8 +1279,8 @@
 ssl_Connection_getattr(ssl_ConnectionObj *self, char *name)
 {
     PyObject *meth;
-    
-    meth = Py_FindMethod(ssl_Connection_methods, (PyObject *)self, name);
+
+    meth = ssl_Connection_Type.tp_getattr((PyObject *)self, name);
 
     if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_AttributeError))
     {
@@ -1357,8 +1352,7 @@
 }
 
 PyTypeObject ssl_Connection_Type = {
-    PyObject_HEAD_INIT(NULL)
-    0,
+    PyVarObject_HEAD_INIT(&PyType_Type, 0)
     "OpenSSL.SSL.Connection",
     sizeof(ssl_ConnectionObj),
     0,
diff --git a/OpenSSL/ssl/context.c b/OpenSSL/ssl/context.c
index 98cc01c..bfd8ffe 100644
--- a/OpenSSL/ssl/context.c
+++ b/OpenSSL/ssl/context.c
@@ -115,7 +115,7 @@
 	goto out;
     }
 
-    if (!PyString_Check(ret)) {
+    if (!PyBytes_Check(ret)) {
         /*
          * XXX Returned something that wasn't a string.  This is bogus.  We'll
          * return 0 and OpenSSL will treat it as an error, resulting in an
@@ -125,7 +125,7 @@
         goto out;
     }
 
-    len = PyString_Size(ret);
+    len = PyBytes_Size(ret);
     if (len > maxlen) {
         /*
          * Returned more than we said they were allowed to return.  Just
@@ -135,7 +135,7 @@
         len = maxlen;
     }
 
-    str = PyString_AsString(ret);
+    str = PyBytes_AsString(ret);
     strncpy(buf, str, len);
     Py_XDECREF(ret);
 
@@ -723,7 +723,7 @@
         return NULL;
 
     mode = SSL_CTX_get_verify_mode(self->ctx);
-    return PyInt_FromLong((long)mode);
+    return PyLong_FromLong((long)mode);
 }
 
 static char ssl_Context_get_verify_depth_doc[] = "\n\
@@ -740,7 +740,7 @@
         return NULL;
 
     depth = SSL_CTX_get_verify_depth(self->ctx);
-    return PyInt_FromLong((long)depth);
+    return PyLong_FromLong((long)depth);
 }
 
 static char ssl_Context_load_tmp_dh_doc[] = "\n\
@@ -1042,7 +1042,7 @@
     if (!PyArg_ParseTuple(args, "l:set_options", &options))
         return NULL;
 
-    return PyInt_FromLong(SSL_CTX_set_options(self->ctx, options));
+    return PyLong_FromLong(SSL_CTX_set_options(self->ctx, options));
 }
 
 
@@ -1243,8 +1243,7 @@
 
 
 PyTypeObject ssl_Context_Type = {
-    PyObject_HEAD_INIT(NULL)
-    0,
+    PyVarObject_HEAD_INIT(&PyType_Type, 0)
     "OpenSSL.SSL.Context",
     sizeof(ssl_ContextObj),
     0,
diff --git a/OpenSSL/ssl/ssl.c b/OpenSSL/ssl/ssl.c
index 94d4844..00b9617 100644
--- a/OpenSSL/ssl/ssl.c
+++ b/OpenSSL/ssl/ssl.c
@@ -30,7 +30,9 @@
 See the file RATIONALE for a short explanation of why this module was written.\n\
 ";
 
+#ifndef PY3
 void **crypto_API;
+#endif
 
 int _pyOpenSSL_tstate_key;
 
@@ -48,34 +50,51 @@
     { NULL, NULL }
 };
 
+#ifdef PY3
+static struct PyModuleDef sslmodule = {
+    PyModuleDef_HEAD_INIT,
+    "SSL",
+    ssl_doc,
+    -1,
+    ssl_methods
+};
+#endif
+
 /*
  * Initialize SSL sub module
  *
  * Arguments: None
  * Returns:   None
  */
-void
-initSSL(void)
-{
+PyOpenSSL_MODINIT(SSL) {
+    PyObject *module;
+#ifndef PY3
     static void *ssl_API[ssl_API_pointers];
     PyObject *ssl_api_object;
-    PyObject *module;
+
+    import_crypto();
+#endif
 
     SSL_library_init();
     ERR_load_SSL_strings();
 
-    import_crypto();
-
-    if ((module = Py_InitModule3("SSL", ssl_methods, ssl_doc)) == NULL) {
-        return;
+#ifdef PY3
+    module = PyModule_Create(&sslmodule);
+#else
+    module = Py_InitModule3("SSL", ssl_methods, ssl_doc);
+#endif
+    if (module == NULL) {
+        return NULL;
     }
 
+#ifndef PY3
     /* Initialize the C API pointer array */
     ssl_API[ssl_Context_New_NUM]    = (void *)ssl_Context_New;
     ssl_API[ssl_Connection_New_NUM] = (void *)ssl_Connection_New;
     ssl_api_object = PyCObject_FromVoidPtr((void *)ssl_API, NULL);
     if (ssl_api_object != NULL)
         PyModule_AddObject(module, "_C_API", ssl_api_object);
+#endif
 
     /* Exceptions */
 /*
@@ -177,6 +196,14 @@
     _pyOpenSSL_tstate_key = PyThread_create_key();
 #endif
 
-  error:
+#ifdef PY3
+    return module;
+#endif
+
+error:
+#ifdef PY3
+    return NULL;
+#else
     ;
+#endif
 }