diff --git a/Mac/Modules/ctbmodule.c b/Mac/Modules/ctbmodule.c
index ef03f92..759264c 100644
--- a/Mac/Modules/ctbmodule.c
+++ b/Mac/Modules/ctbmodule.c
@@ -26,7 +26,7 @@
 /* ctbcm objects */
 
 
-#include "allobjects.h"
+#include "Python.h"
 
 #include "macglue.h"
 
@@ -46,19 +46,19 @@
 #define 	_CommToolboxTrap		0x8B
 #define 	_UnimplementedOSTrap	0x9F
 
-extern object *PyErr_Mac(object *,int);
+extern PyObject *PyErr_Mac(PyObject *,int);
 
-static object *ErrorObject;
+static PyObject *ErrorObject;
 
 typedef struct {
-	OB_HEAD
+	PyObject_HEAD
 	ConnHandle hdl;		/* The handle to the connection */
-	object *callback;	/* Python callback routine */
+	PyObject *callback;	/* Python callback routine */
 	int has_callback;	/* True if callback not None */
 	int err;			/* Error to pass to the callback */
 } ctbcmobject;
 
-staticforward typeobject ctbcmtype;
+staticforward PyTypeObject ctbcmtype;
 
 #define is_ctbcmobject(v)		((v)->ob_type == &ctbcmtype)
 
@@ -86,7 +86,7 @@
 	initialized = 0;
 	
 	if ( !TrapAvailable(_CommToolboxTrap, OSTrap) ) {
-		err_setstr(ErrorObject, "CTB not available");
+		PyErr_SetString(ErrorObject, "CTB not available");
 		return 0;
 	}
 	if ( (err=InitCTBUtilities()) ) {
@@ -110,16 +110,16 @@
 	void *arg;
 {
 	ctbcmobject *self = (ctbcmobject *)arg;
-	object *args, *rv;
+	PyObject *args, *rv;
 	
 	if ( !self->has_callback )    /* It could have been removed in the meantime */
 		return 0;
-	args = mkvalue("(i)", self->err);
-	rv = call_object(self->callback, args);
-	DECREF(args);
+	args = Py_BuildValue("(i)", self->err);
+	rv = PyEval_CallObject(self->callback, args);
+	Py_DECREF(args);
 	if( rv == NULL )
 		return -1;
-	DECREF(rv);
+	Py_DECREF(rv);
 	return 0;
 }
 
@@ -139,15 +139,15 @@
 
 static ctbcmobject *
 newctbcmobject(arg)
-	object *arg;
+	PyObject *arg;
 {
 	ctbcmobject *self;
-	self = NEWOBJ(ctbcmobject, &ctbcmtype);
+	self = PyObject_NEW(ctbcmobject, &ctbcmtype);
 	if (self == NULL)
 		return NULL;
 	self->hdl = NULL;
-	INCREF(None);
-	self->callback = None;
+	Py_INCREF(Py_None);
+	self->callback = Py_None;
 	self->has_callback = 0;
 	return self;
 }
@@ -164,104 +164,104 @@
 		CMDispose(self->hdl);
 		self->hdl = NULL;
 	}
-	DEL(self);
+	PyMem_DEL(self);
 }
 
-static object *
+static PyObject *
 ctbcm_open(self, args)
 	ctbcmobject *self;
-	object *args;
+	PyObject *args;
 {
 	long timeout;
 	OSErr err;
 	ConnectionCompletionUPP cb_upp = NewConnectionCompletionProc(ctbcm_ctbcallback);
 	
-	if (!getargs(args, "l", &timeout))
+	if (!PyArg_Parse(args, "l", &timeout))
 		return NULL;
 	if ( (err=CMOpen(self->hdl, self->has_callback, cb_upp, timeout)) < 0)
 		return PyErr_Mac(ErrorObject, (int)err);
-	INCREF(None);
-	return None;
+	Py_INCREF(Py_None);
+	return Py_None;
 }
 
-static object *
+static PyObject *
 ctbcm_listen(self, args)
 	ctbcmobject *self;
-	object *args;
+	PyObject *args;
 {
 	long timeout;
 	OSErr err;
 	ConnectionCompletionUPP cb_upp = NewConnectionCompletionProc(ctbcm_ctbcallback);
 	
-	if (!getargs(args, "l", &timeout))
+	if (!PyArg_Parse(args, "l", &timeout))
 		return NULL;
 	if ( (err=CMListen(self->hdl,self->has_callback, cb_upp, timeout)) < 0)
 		return PyErr_Mac(ErrorObject, (int)err);
-	INCREF(None);
-	return None;
+	Py_INCREF(Py_None);
+	return Py_None;
 }
 
-static object *
+static PyObject *
 ctbcm_accept(self, args)
 	ctbcmobject *self;
-	object *args;
+	PyObject *args;
 {
 	int accept;
 	OSErr err;
 	
-	if (!getargs(args, "i", &accept))
+	if (!PyArg_Parse(args, "i", &accept))
 		return NULL;
 	if ( (err=CMAccept(self->hdl, accept)) < 0)
 		return PyErr_Mac(ErrorObject, (int)err);
-	INCREF(None);
-	return None;
+	Py_INCREF(Py_None);
+	return Py_None;
 }
 
-static object *
+static PyObject *
 ctbcm_close(self, args)
 	ctbcmobject *self;
-	object *args;
+	PyObject *args;
 {
 	int now;
 	long timeout;
 	OSErr err;
 	ConnectionCompletionUPP cb_upp = NewConnectionCompletionProc(ctbcm_ctbcallback);
 	
-	if (!getargs(args, "(li)", &timeout, &now))
+	if (!PyArg_Parse(args, "(li)", &timeout, &now))
 		return NULL;
 	if ( (err=CMClose(self->hdl, self->has_callback, cb_upp, timeout, now)) < 0)
 		return PyErr_Mac(ErrorObject, (int)err);
-	INCREF(None);
-	return None;
+	Py_INCREF(Py_None);
+	return Py_None;
 }
 
-static object *
+static PyObject *
 ctbcm_read(self, args)
 	ctbcmobject *self;
-	object *args;
+	PyObject *args;
 {
 	long timeout, len;
 	int chan;
 	CMFlags flags;
 	OSErr err;
-	object *rv;
+	PyObject *rv;
 	ConnectionCompletionUPP cb_upp = NewConnectionCompletionProc(ctbcm_ctbcallback);
 	
-	if (!getargs(args, "(lil)", &len, &chan, &timeout))
+	if (!PyArg_Parse(args, "(lil)", &len, &chan, &timeout))
 		return NULL;
-	if ((rv=newsizedstringobject(NULL, len)) == NULL)
+	if ((rv=PyString_FromStringAndSize(NULL, len)) == NULL)
 		return NULL;
-	if ((err=CMRead(self->hdl, (Ptr)getstringvalue(rv), &len, (CMChannel)chan,
+	if ((err=CMRead(self->hdl, (Ptr)PyString_AsString(rv), &len, (CMChannel)chan,
 				self->has_callback, cb_upp, timeout, &flags)) < 0)
 		return PyErr_Mac(ErrorObject, (int)err);
-	resizestring(&rv, len);
-	return mkvalue("(Oi)", rv, (int)flags);
+	_PyString_Resize(&rv, len);
+	return Py_BuildValue("(Oi)", rv, (int)flags);
 }
 
-static object *
+static PyObject *
 ctbcm_write(self, args)
 	ctbcmobject *self;
-	object *args;
+	PyObject *args;
 {
 	long timeout, len;
 	int chan, ilen, flags;
@@ -269,184 +269,184 @@
 	char *buf;
 	ConnectionCompletionUPP cb_upp = NewConnectionCompletionProc(ctbcm_ctbcallback);
 	
-	if (!getargs(args, "(s#ili)", &buf, &ilen, &chan, &timeout, &flags))
+	if (!PyArg_Parse(args, "(s#ili)", &buf, &ilen, &chan, &timeout, &flags))
 		return NULL;
 	len = ilen;
 	if ((err=CMWrite(self->hdl, (Ptr)buf, &len, (CMChannel)chan,
 				self->has_callback, cb_upp, timeout, (CMFlags)flags)) < 0)
 		return PyErr_Mac(ErrorObject, (int)err);
-	return newintobject((int)len);
+	return PyInt_FromLong((int)len);
 }
 
-static object *
+static PyObject *
 ctbcm_status(self, args)
 	ctbcmobject *self;
-	object *args;
+	PyObject *args;
 {
 	CMBufferSizes sizes;
 	CMStatFlags flags;
 	OSErr err;
-	object *rv;
+	PyObject *rv;
 	
-	if (!getnoarg(args))
+	if (!PyArg_NoArgs(args))
 		return NULL;
 	if ((err=CMStatus(self->hdl, sizes, &flags)) < 0)
 		return PyErr_Mac(ErrorObject, (int)err);
-	rv = mkvalue("(llllll)", sizes[0], sizes[1], sizes[2], sizes[3], sizes[4], sizes[5]);
+	rv = Py_BuildValue("(llllll)", sizes[0], sizes[1], sizes[2], sizes[3], sizes[4], sizes[5]);
 	if ( rv == NULL )
 		return NULL;
-	return mkvalue("(Ol)", rv, (long)flags);
+	return Py_BuildValue("(Ol)", rv, (long)flags);
 }
 
-static object *
+static PyObject *
 ctbcm_getconfig(self, args)
 	ctbcmobject *self;
-	object *args;
+	PyObject *args;
 {
 	char *rv;
 
-	if (!getnoarg(args))
+	if (!PyArg_NoArgs(args))
 		return NULL;
 	if ((rv=(char *)CMGetConfig(self->hdl)) == NULL ) {
-		err_setstr(ErrorObject, "CMGetConfig failed");
+		PyErr_SetString(ErrorObject, "CMGetConfig failed");
 		return NULL;
 	}
-	return newstringobject(rv);
+	return PyString_FromString(rv);
 }
 
-static object *
+static PyObject *
 ctbcm_setconfig(self, args)
 	ctbcmobject *self;
-	object *args;
+	PyObject *args;
 {
 	char *cfg;
 	OSErr err;
 	
-	if (!getargs(args, "s", &cfg))
+	if (!PyArg_Parse(args, "s", &cfg))
 		return NULL;
 	if ((err=CMSetConfig(self->hdl, (Ptr)cfg)) < 0)
 		return PyErr_Mac(ErrorObject, err);
-	return newintobject((int)err);
+	return PyInt_FromLong((int)err);
 }
 
-static object *
+static PyObject *
 ctbcm_choose(self, args)
 	ctbcmobject *self;
-	object *args;
+	PyObject *args;
 {
 	int rv;
 	Point pt;
 
-	if (!getnoarg(args))
+	if (!PyArg_NoArgs(args))
 		return NULL;
 	pt.v = 40;
 	pt.h = 40;
 	rv=CMChoose(&self->hdl, pt, (ConnectionChooseIdleUPP)0);
-	return newintobject(rv);
+	return PyInt_FromLong(rv);
 }
 
-static object *
+static PyObject *
 ctbcm_idle(self, args)
 	ctbcmobject *self;
-	object *args;
+	PyObject *args;
 {
-	if (!getnoarg(args))
+	if (!PyArg_NoArgs(args))
 		return NULL;
 	CMIdle(self->hdl);
-	INCREF(None);
-	return None;
+	Py_INCREF(Py_None);
+	return Py_None;
 }
 
-static object *
+static PyObject *
 ctbcm_abort(self, args)
 	ctbcmobject *self;
-	object *args;
+	PyObject *args;
 {
-	if (!getnoarg(args))
+	if (!PyArg_NoArgs(args))
 		return NULL;
 	CMAbort(self->hdl);
-	INCREF(None);
-	return None;
+	Py_INCREF(Py_None);
+	return Py_None;
 }
 
-static object *
+static PyObject *
 ctbcm_reset(self, args)
 	ctbcmobject *self;
-	object *args;
+	PyObject *args;
 {
-	if (!getnoarg(args))
+	if (!PyArg_NoArgs(args))
 		return NULL;
 	CMReset(self->hdl);
-	INCREF(None);
-	return None;
+	Py_INCREF(Py_None);
+	return Py_None;
 }
 
-static object *
+static PyObject *
 ctbcm_break(self, args)
 	ctbcmobject *self;
-	object *args;
+	PyObject *args;
 {
 	long duration;
 	ConnectionCompletionUPP cb_upp = NewConnectionCompletionProc(ctbcm_ctbcallback);
 	
-	if (!getargs(args, "l", &duration))
+	if (!PyArg_Parse(args, "l", &duration))
 		return NULL;
 	CMBreak(self->hdl, duration,self->has_callback, cb_upp);
-	INCREF(None);
-	return None;
+	Py_INCREF(Py_None);
+	return Py_None;
 }
 
-static struct methodlist ctbcm_methods[] = {
-	{"Open",		(method)ctbcm_open},
-	{"Close",		(method)ctbcm_close},
-	{"Read",		(method)ctbcm_read},
-	{"Write",		(method)ctbcm_write},
-	{"Status",		(method)ctbcm_status},
-	{"GetConfig",	(method)ctbcm_getconfig},
-	{"SetConfig",	(method)ctbcm_setconfig},
-	{"Choose",		(method)ctbcm_choose},
-	{"Idle",		(method)ctbcm_idle},
-	{"Listen",		(method)ctbcm_listen},
-	{"Accept",		(method)ctbcm_accept},
-	{"Abort",		(method)ctbcm_abort},
-	{"Reset",		(method)ctbcm_reset},
-	{"Break",		(method)ctbcm_break},
+static struct PyMethodDef ctbcm_methods[] = {
+	{"Open",		(PyCFunction)ctbcm_open},
+	{"Close",		(PyCFunction)ctbcm_close},
+	{"Read",		(PyCFunction)ctbcm_read},
+	{"Write",		(PyCFunction)ctbcm_write},
+	{"Status",		(PyCFunction)ctbcm_status},
+	{"GetConfig",	(PyCFunction)ctbcm_getconfig},
+	{"SetConfig",	(PyCFunction)ctbcm_setconfig},
+	{"Choose",		(PyCFunction)ctbcm_choose},
+	{"Idle",		(PyCFunction)ctbcm_idle},
+	{"Listen",		(PyCFunction)ctbcm_listen},
+	{"Accept",		(PyCFunction)ctbcm_accept},
+	{"Abort",		(PyCFunction)ctbcm_abort},
+	{"Reset",		(PyCFunction)ctbcm_reset},
+	{"Break",		(PyCFunction)ctbcm_break},
 	{NULL,		NULL}		/* sentinel */
 };
 
-static object *
+static PyObject *
 ctbcm_getattr(self, name)
 	ctbcmobject *self;
 	char *name;
 {
 	if ( strcmp(name, "callback") == 0 ) {
-		INCREF(self->callback);
+		Py_INCREF(self->callback);
 		return self->callback;
 	}
-	return findmethod(ctbcm_methods, (object *)self, name);
+	return Py_FindMethod(ctbcm_methods, (PyObject *)self, name);
 }
 
 static int
 ctbcm_setattr(self, name, v)
 	ctbcmobject *self;
 	char *name;
-	object *v;
+	PyObject *v;
 {
 	if ( strcmp(name, "callback") != 0 ) {
-		err_setstr(AttributeError, "ctbcm objects have callback attr only");
+		PyErr_SetString(PyExc_AttributeError, "ctbcm objects have callback attr only");
 		return -1;
 	}
 	if ( v == NULL ) {
-		v = None;
+		v = Py_None;
 	}
-	INCREF(v);	/* XXXX Must I do this? */
+	Py_INCREF(v);	/* XXXX Must I do this? */
 	self->callback = v;
-	self->has_callback = (v != None);
+	self->has_callback = (v != Py_None);
 	return 0;
 }
 
-statichere typeobject ctbcmtype = {
-	OB_HEAD_INIT(&Typetype)
+statichere PyTypeObject ctbcmtype = {
+	PyObject_HEAD_INIT(&PyType_Type)
 	0,			/*ob_size*/
 	"ctbcm",			/*tp_name*/
 	sizeof(ctbcmobject),	/*tp_basicsize*/
@@ -467,13 +467,13 @@
 
 /* Function of no arguments returning new ctbcm object */
 
-static object *
+static PyObject *
 ctb_cmnew(self, args)
-	object *self; /* Not used */
-	object *args;
+	PyObject *self; /* Not used */
+	PyObject *args;
 {
 	int strlen;
-	object *sizes_obj;
+	PyObject *sizes_obj;
 	char *c_str;
 	unsigned char p_str[255];
 	CMBufferSizes sizes;
@@ -481,16 +481,16 @@
 	ConnHandle hdl;
 	ctbcmobject *rv;
 	
-	if (!getargs(args, "(s#O)", &c_str, &strlen, &sizes_obj))
+	if (!PyArg_Parse(args, "(s#O)", &c_str, &strlen, &sizes_obj))
 		return NULL;
 	strncpy((char *)p_str+1, c_str, strlen);
 	p_str[0] = strlen;
 	if (!initialize_ctb())
 		return NULL;
-	if ( sizes_obj == None ) {
+	if ( sizes_obj == Py_None ) {
 		memset(sizes, '\0', sizeof sizes);
 	} else {
-		if ( !getargs(sizes_obj, "(llllll)", &sizes[0], &sizes[1], &sizes[2],
+		if ( !PyArg_Parse(sizes_obj, "(llllll)", &sizes[0], &sizes[1], &sizes[2],
 						&sizes[3], &sizes[4], &sizes[5]))
 			return NULL;
 	}
@@ -498,7 +498,7 @@
 		return PyErr_Mac(ErrorObject, procid);
 	hdl = CMNew(procid, cmNoMenus|cmQuiet, sizes, 0, 0);
 	if ( hdl == NULL ) {
-		err_setstr(ErrorObject, "CMNew failed");
+		PyErr_SetString(ErrorObject, "CMNew failed");
 		return NULL;
 	}
 	rv = newctbcmobject(args);
@@ -506,26 +506,26 @@
 	    return NULL;   /* XXXX Should dispose of hdl */
 	rv->hdl = hdl;
 	CMSetUserData(hdl, (long)rv);
-	return (object *)rv;
+	return (PyObject *)rv;
 }
 
-static object *
+static PyObject *
 ctb_available(self, args)
-	object *self;
-	object *args;
+	PyObject *self;
+	PyObject *args;
 {
 	int ok;
 	
-	if (!getnoarg(args))
+	if (!PyArg_NoArgs(args))
 		return NULL;
 	ok = initialize_ctb();
-	err_clear();
-	return newintobject(ok);
+	PyErr_Clear();
+	return PyInt_FromLong(ok);
 }
 
 /* List of functions defined in the module */
 
-static struct methodlist ctb_methods[] = {
+static struct PyMethodDef ctb_methods[] = {
 	{"CMNew",		ctb_cmnew},
 	{"available",	ctb_available},
 	{NULL,		NULL}		/* sentinel */
@@ -537,15 +537,15 @@
 void
 initctb()
 {
-	object *m, *d, *o;
+	PyObject *m, *d, *o;
 
 	/* Create the module and add the functions */
-	m = initmodule("ctb", ctb_methods);
+	m = Py_InitModule("ctb", ctb_methods);
 
 	/* Add some symbolic constants to the module */
-	d = getmoduledict(m);
+	d = PyModule_GetDict(m);
 	
-#define CMCONST(name, value) o = newintobject(value); dictinsert(d, name, o)
+#define CMCONST(name, value) o = PyInt_FromLong(value); PyDict_SetItemString(d, name, o)
 
 	CMCONST("cmData", 1);
 	CMCONST("cmCntl", 2);
@@ -576,10 +576,10 @@
 	CMCONST("cmStatusListenPend", 0x2000);
 	CMCONST("cmStatusIncomingCallPresent", 0x4000);
 	
-	ErrorObject = newstringobject("ctb.error");
-	dictinsert(d, "error", ErrorObject);
+	ErrorObject = PyString_FromString("ctb.error");
+	PyDict_SetItemString(d, "error", ErrorObject);
 
 	/* Check for errors */
-	if (err_occurred())
-		fatal("can't initialize module ctb");
+	if (PyErr_Occurred())
+		Py_FatalError("can't initialize module ctb");
 }
diff --git a/Mac/Modules/gestaltmodule.c b/Mac/Modules/gestaltmodule.c
index 3494d64..700cd2a 100644
--- a/Mac/Modules/gestaltmodule.c
+++ b/Mac/Modules/gestaltmodule.c
@@ -24,26 +24,25 @@
 
 /* Macintosh Gestalt interface */
 
-#include "allobjects.h"
-#include "modsupport.h"
+#include "Python.h"
 
 #include <Types.h>
 #include <GestaltEqu.h>
 
-static object *
+static PyObject *
 gestalt_gestalt(self, args)
-	object *self;
-	object *args;
+	PyObject *self;
+	PyObject *args;
 {
 	OSErr iErr;
 	char *str;
 	int size;
 	OSType selector;
 	long response;
-	if (!getargs(args, "s#", &str, &size))
+	if (!PyArg_Parse(args, "s#", &str, &size))
 		return NULL;
 	if (size != 4) {
-		err_setstr(TypeError, "gestalt arg must be 4-char string");
+		PyErr_SetString(PyExc_TypeError, "gestalt arg must be 4-char string");
 		return NULL;
 	}
 	selector = *(OSType*)str;
@@ -51,13 +50,13 @@
 	if (iErr != 0) {
 		char buf[100];
 		sprintf(buf, "Gestalt error code %d", iErr);
-		err_setstr(RuntimeError, buf);
+		PyErr_SetString(PyExc_RuntimeError, buf);
 		return NULL;
 	}
-	return newintobject(response);
+	return PyInt_FromLong(response);
 }
 
-static struct methodlist gestalt_methods[] = {
+static struct PyMethodDef gestalt_methods[] = {
 	{"gestalt", gestalt_gestalt},
 	{NULL, NULL} /* Sentinel */
 };
@@ -65,5 +64,5 @@
 void
 initgestalt()
 {
-	initmodule("gestalt", gestalt_methods);
+	Py_InitModule("gestalt", gestalt_methods);
 }
diff --git a/Mac/Modules/macfsmodule.c b/Mac/Modules/macfsmodule.c
index e8a7fb9..8eef28e 100644
--- a/Mac/Modules/macfsmodule.c
+++ b/Mac/Modules/macfsmodule.c
@@ -22,8 +22,7 @@
 
 ******************************************************************/
 
-#include "allobjects.h"
-#include "modsupport.h"		/* For getargs() etc. */
+#include "Python.h"
 #include "macglue.h"
 
 #include <Memory.h>
@@ -39,17 +38,17 @@
 #define FileFilterUPP FileFilterProcPtr
 #endif
 
-static object *ErrorObject;
+static PyObject *ErrorObject;
 
 /* ----------------------------------------------------- */
 /* Declarations for objects of type Alias */
 
 typedef struct {
-	OB_HEAD
+	PyObject_HEAD
 	AliasHandle alias;
 } mfsaobject;
 
-staticforward typeobject Mfsatype;
+staticforward PyTypeObject Mfsatype;
 
 #define is_mfsaobject(v)		((v)->ob_type == &Mfsatype)
 
@@ -57,11 +56,11 @@
 /* Declarations for objects of type FSSpec */
 
 typedef struct {
-	OB_HEAD
+	PyObject_HEAD
 	FSSpec fsspec;
 } mfssobject;
 
-staticforward typeobject Mfsstype;
+staticforward PyTypeObject Mfsstype;
 
 #define is_mfssobject(v)		((v)->ob_type == &Mfsstype)
 
@@ -70,11 +69,11 @@
 /* Declarations for objects of type FInfo */
 
 typedef struct {
-	OB_HEAD
+	PyObject_HEAD
 	FInfo finfo;
 } mfsiobject;
 
-staticforward typeobject Mfsitype;
+staticforward PyTypeObject Mfsitype;
 
 #define is_mfsiobject(v)		((v)->ob_type == &Mfsitype)
 
@@ -83,17 +82,17 @@
 
 /* ---------------------------------------------------------------- */
 
-static object *
+static PyObject *
 mfsa_Resolve(self, args)
 	mfsaobject *self;
-	object *args;
+	PyObject *args;
 {
 	FSSpec from, *fromp, result;
 	Boolean changed;
 	OSErr err;
 	
 	from.name[0] = 0;
-	if (!newgetargs(args, "|O&", PyMac_GetFSSpec, &from))
+	if (!PyArg_ParseTuple(args, "|O&", PyMac_GetFSSpec, &from))
 		return NULL;
 	if (from.name[0] )
 		fromp = &from;
@@ -104,39 +103,39 @@
 		PyErr_Mac(ErrorObject, err);
 		return NULL;
 	}
-	return mkvalue("(Oi)", newmfssobject(&result), (int)changed);
+	return Py_BuildValue("(Oi)", newmfssobject(&result), (int)changed);
 }
 
-static object *
+static PyObject *
 mfsa_GetInfo(self, args)
 	mfsaobject *self;
-	object *args;
+	PyObject *args;
 {
 	Str63 value;
 	int i;
 	OSErr err;
 	
-	if (!newgetargs(args, "i", &i))
+	if (!PyArg_ParseTuple(args, "i", &i))
 		return NULL;
 	err = GetAliasInfo(self->alias, (AliasInfoType)i, value);
 	if ( err ) {
 		PyErr_Mac(ErrorObject, err);
 		return 0;
 	}
-	return newsizedstringobject((char *)&value[1], value[0]);
+	return PyString_FromStringAndSize((char *)&value[1], value[0]);
 }
 
-static object *
+static PyObject *
 mfsa_Update(self, args)
 	mfsaobject *self;
-	object *args;
+	PyObject *args;
 {
 	FSSpec target, fromfile, *fromfilep;
 	OSErr err;
 	Boolean changed;
 	
 	fromfile.name[0] = 0;
-	if (!newgetargs(args, "O&|O&",  PyMac_GetFSSpec, &target,
+	if (!PyArg_ParseTuple(args, "O&|O&",  PyMac_GetFSSpec, &target,
 					 PyMac_GetFSSpec, &fromfile))
 		return NULL;
 	if ( fromfile.name[0] )
@@ -148,20 +147,20 @@
 		PyErr_Mac(ErrorObject, err);
 		return 0;
 	}
-	return mkvalue("i", (int)changed);
+	return Py_BuildValue("i", (int)changed);
 }
 
-static struct methodlist mfsa_methods[] = {
-	{"Resolve",	(method)mfsa_Resolve,	1},
-	{"GetInfo",	(method)mfsa_GetInfo,	1},
-	{"Update",	(method)mfsa_Update,	1},
+static struct PyMethodDef mfsa_methods[] = {
+	{"Resolve",	(PyCFunction)mfsa_Resolve,	1},
+	{"GetInfo",	(PyCFunction)mfsa_GetInfo,	1},
+	{"Update",	(PyCFunction)mfsa_Update,	1},
  
 	{NULL,		NULL}		/* sentinel */
 };
 
 /* ---------- */
 
-static object *
+static PyObject *
 mfsa_getattr(self, name)
 	mfsaobject *self;
 	char *name;
@@ -176,7 +175,7 @@
 		HUnlock((Handle)self->alias);
 		return rv;
 	}
-	return findmethod(mfsa_methods, (object *)self, name);
+	return Py_FindMethod(mfsa_methods, (PyObject *)self, name);
 }
 
 mfsaobject *
@@ -185,7 +184,7 @@
 {
 	mfsaobject *self;
 
-	self = NEWOBJ(mfsaobject, &Mfsatype);
+	self = PyObject_NEW(mfsaobject, &Mfsatype);
 	if (self == NULL)
 		return NULL;
 	self->alias = alias;
@@ -203,11 +202,11 @@
 	}
 #endif
 		
-	DEL(self);
+	PyMem_DEL(self);
 }
 
-statichere typeobject Mfsatype = {
-	OB_HEAD_INIT(&Typetype)
+statichere PyTypeObject Mfsatype = {
+	PyObject_HEAD_INIT(&PyType_Type)
 	0,				/*ob_size*/
 	"Alias",			/*tp_name*/
 	sizeof(mfsaobject),		/*tp_basicsize*/
@@ -230,7 +229,7 @@
 
 /* ---------------------------------------------------------------- */
 
-static struct methodlist mfsi_methods[] = {
+static struct PyMethodDef mfsi_methods[] = {
 	
 	{NULL,		NULL}		/* sentinel */
 };
@@ -242,7 +241,7 @@
 {
 	mfsiobject *self;
 	
-	self = NEWOBJ(mfsiobject, &Mfsitype);
+	self = PyObject_NEW(mfsiobject, &Mfsitype);
 	if (self == NULL)
 		return NULL;
 	memset((char *)&self->finfo, '\0', sizeof(self->finfo));
@@ -253,10 +252,10 @@
 mfsi_dealloc(self)
 	mfsiobject *self;
 {
-	DEL(self);
+	PyMem_DEL(self);
 }
 
-static object *
+static PyObject *
 mfsi_getattr(self, name)
 	mfsiobject *self;
 	char *name;
@@ -272,7 +271,7 @@
 	else if ( strcmp(name, "Fldr") == 0 )
 		return Py_BuildValue("i", (int)self->finfo.fdFldr);
 	else
-		return findmethod(mfsi_methods, (object *)self, name);
+		return Py_FindMethod(mfsi_methods, (PyObject *)self, name);
 }
 
 
@@ -280,13 +279,13 @@
 mfsi_setattr(self, name, v)
 	mfsiobject *self;
 	char *name;
-	object *v;
+	PyObject *v;
 {
 	int rv;
 	int i;
 	
 	if ( v == NULL ) {
-		err_setstr(AttributeError, "Cannot delete attribute");
+		PyErr_SetString(PyExc_AttributeError, "Cannot delete attribute");
 		return -1;
 	}
 	if ( strcmp(name, "Type") == 0 )
@@ -302,7 +301,7 @@
 		rv = PyArg_Parse(v, "i", &i);
 		self->finfo.fdFldr = (short)i;
 	} else {
-		err_setstr(AttributeError, "No such attribute");
+		PyErr_SetString(PyExc_AttributeError, "No such attribute");
 		return -1;
 	}
 	if (rv)
@@ -311,8 +310,8 @@
 }
 
 
-static typeobject Mfsitype = {
-	OB_HEAD_INIT(&Typetype)
+static PyTypeObject Mfsitype = {
+	PyObject_HEAD_INIT(&PyType_Type)
 	0,				/*ob_size*/
 	"FInfo object",			/*tp_name*/
 	sizeof(mfsiobject),		/*tp_basicsize*/
@@ -340,7 +339,7 @@
 */
 FSSpec *
 mfs_GetFSSpecFSSpec(self)
-	object *self;
+	PyObject *self;
 {
 	if ( is_mfssobject(self) )
 		return &((mfssobject *)self)->fsspec;
@@ -395,46 +394,46 @@
 	return error;
 }
 
-static object *
+static PyObject *
 mfss_as_pathname(self, args)
 	mfssobject *self;
-	object *args;
+	PyObject *args;
 {
 	char strbuf[257];
 	OSErr err;
 
-	if (!newgetargs(args, ""))
+	if (!PyArg_ParseTuple(args, ""))
 		return NULL;
 	err = PyMac_GetFullPath(&self->fsspec, strbuf);
 	if ( err ) {
 		PyErr_Mac(ErrorObject, err);
 		return NULL;
 	}
-	return newstringobject(strbuf);
+	return PyString_FromString(strbuf);
 }
 
-static object *
+static PyObject *
 mfss_as_tuple(self, args)
 	mfssobject *self;
-	object *args;
+	PyObject *args;
 {
-	if (!newgetargs(args, ""))
+	if (!PyArg_ParseTuple(args, ""))
 		return NULL;
 	return Py_BuildValue("(iis#)", self->fsspec.vRefNum, self->fsspec.parID, 
 						&self->fsspec.name[1], self->fsspec.name[0]);
 }
 
-static object *
+static PyObject *
 mfss_NewAlias(self, args)
 	mfssobject *self;
-	object *args;
+	PyObject *args;
 {
 	FSSpec src, *srcp;
 	OSErr err;
 	AliasHandle alias;
 	
 	src.name[0] = 0;
-	if (!newgetargs(args, "|O&", PyMac_GetFSSpec, &src))
+	if (!PyArg_ParseTuple(args, "|O&", PyMac_GetFSSpec, &src))
 		return NULL;
 	if ( src.name[0] )
 		srcp = &src;
@@ -446,37 +445,37 @@
 		return NULL;
 	}
 	
-	return (object *)newmfsaobject(alias);
+	return (PyObject *)newmfsaobject(alias);
 }
 
-static object *
+static PyObject *
 mfss_NewAliasMinimal(self, args)
 	mfssobject *self;
-	object *args;
+	PyObject *args;
 {
 	OSErr err;
 	AliasHandle alias;
 	
-	if (!newgetargs(args, ""))
+	if (!PyArg_ParseTuple(args, ""))
 		return NULL;
 	err = NewAliasMinimal(&self->fsspec, &alias);
 	if ( err ) {
 		PyErr_Mac(ErrorObject, err);
 		return NULL;
 	}
-	return (object *)newmfsaobject(alias);
+	return (PyObject *)newmfsaobject(alias);
 }
 
 /* XXXX These routines should be replaced by a wrapper to the *FInfo routines */
-static object *
+static PyObject *
 mfss_GetCreatorType(self, args)
 	mfssobject *self;
-	object *args;
+	PyObject *args;
 {
 	OSErr err;
 	FInfo info;
 	
-	if (!newgetargs(args, ""))
+	if (!PyArg_ParseTuple(args, ""))
 		return NULL;
 	err = FSpGetFInfo(&self->fsspec, &info);
 	if ( err ) {
@@ -487,16 +486,16 @@
 	           PyMac_BuildOSType, info.fdCreator, PyMac_BuildOSType, info.fdType);
 }
 
-static object *
+static PyObject *
 mfss_SetCreatorType(self, args)
 	mfssobject *self;
-	object *args;
+	PyObject *args;
 {
 	OSErr err;
 	OSType creator, type;
 	FInfo info;
 	
-	if (!newgetargs(args, "O&O&", PyMac_GetOSType, &creator, PyMac_GetOSType, &type))
+	if (!PyArg_ParseTuple(args, "O&O&", PyMac_GetOSType, &creator, PyMac_GetOSType, &type))
 		return NULL;
 	err = FSpGetFInfo(&self->fsspec, &info);
 	if ( err ) {
@@ -510,78 +509,78 @@
 		PyErr_Mac(ErrorObject, err);
 		return NULL;
 	}
-	INCREF(None);
-	return None;
+	Py_INCREF(Py_None);
+	return Py_None;
 }
 
-static object *
+static PyObject *
 mfss_GetFInfo(self, args)
 	mfssobject *self;
-	object *args;
+	PyObject *args;
 {
 	OSErr err;
 	mfsiobject *fip;
 	
 	
-	if (!newgetargs(args, ""))
+	if (!PyArg_ParseTuple(args, ""))
 		return NULL;
 	if ( (fip=newmfsiobject()) == NULL )
 		return NULL;
 	err = FSpGetFInfo(&self->fsspec, &fip->finfo);
 	if ( err ) {
 		PyErr_Mac(ErrorObject, err);
-		DECREF(fip);
+		Py_DECREF(fip);
 		return NULL;
 	}
-	return (object *)fip;
+	return (PyObject *)fip;
 }
 
-static object *
+static PyObject *
 mfss_SetFInfo(self, args)
 	mfssobject *self;
-	object *args;
+	PyObject *args;
 {
 	OSErr err;
 	mfsiobject *fip;
 	
-	if (!newgetargs(args, "O!", &Mfsitype, &fip))
+	if (!PyArg_ParseTuple(args, "O!", &Mfsitype, &fip))
 		return NULL;
 	err = FSpSetFInfo(&self->fsspec, &fip->finfo);
 	if ( err ) {
 		PyErr_Mac(ErrorObject, err);
 		return NULL;
 	}
-	INCREF(None);
-	return None;
+	Py_INCREF(Py_None);
+	return Py_None;
 }
 
-static object *
+static PyObject *
 mfss_GetDates(self, args)
 	mfssobject *self;
-	object *args;
+	PyObject *args;
 {
 	OSErr err;
 	unsigned long crdat, mddat, bkdat;
 	
-	if (!newgetargs(args, ""))
+	if (!PyArg_ParseTuple(args, ""))
 		return NULL;
 	err = PyMac_GetFileDates(&self->fsspec, &crdat, &mddat, &bkdat);
 	if ( err ) {
 		PyErr_Mac(ErrorObject, err);
 		return NULL;
 	}
-	return mkvalue("ddd", (double)crdat, (double)mddat, (double)bkdat);
+	return Py_BuildValue("ddd", (double)crdat, (double)mddat, (double)bkdat);
 }
 
-static object *
+static PyObject *
 mfss_SetDates(self, args)
 	mfssobject *self;
-	object *args;
+	PyObject *args;
 {
 	OSErr err;
 	double crdat, mddat, bkdat;
 	
-	if (!newgetargs(args, "ddd", &crdat, &mddat, &bkdat))
+	if (!PyArg_ParseTuple(args, "ddd", &crdat, &mddat, &bkdat))
 		return NULL;
 	err = PyMac_SetFileDates(&self->fsspec, (unsigned long)crdat, 
 				(unsigned long)mddat, (unsigned long)bkdat);
@@ -589,35 +588,35 @@
 		PyErr_Mac(ErrorObject, err);
 		return NULL;
 	}
-	INCREF(None);
-	return None;
+	Py_INCREF(Py_None);
+	return Py_None;
 }
 
-static struct methodlist mfss_methods[] = {
-	{"as_pathname",		(method)mfss_as_pathname,			1},
-	{"as_tuple",		(method)mfss_as_tuple,				1},
-	{"NewAlias",		(method)mfss_NewAlias,				1},
-	{"NewAliasMinimal",	(method)mfss_NewAliasMinimal,		1},
-	{"GetCreatorType",	(method)mfss_GetCreatorType,		1},
-	{"SetCreatorType",	(method)mfss_SetCreatorType,		1},
-	{"GetFInfo",		(method)mfss_GetFInfo,				1},
-	{"SetFInfo",		(method)mfss_SetFInfo,				1},
-	{"GetDates",		(method)mfss_GetDates,				1},
-	{"SetDates",		(method)mfss_SetDates,				1},
+static struct PyMethodDef mfss_methods[] = {
+	{"as_pathname",		(PyCFunction)mfss_as_pathname,			1},
+	{"as_tuple",		(PyCFunction)mfss_as_tuple,				1},
+	{"NewAlias",		(PyCFunction)mfss_NewAlias,				1},
+	{"NewAliasMinimal",	(PyCFunction)mfss_NewAliasMinimal,		1},
+	{"GetCreatorType",	(PyCFunction)mfss_GetCreatorType,		1},
+	{"SetCreatorType",	(PyCFunction)mfss_SetCreatorType,		1},
+	{"GetFInfo",		(PyCFunction)mfss_GetFInfo,				1},
+	{"SetFInfo",		(PyCFunction)mfss_SetFInfo,				1},
+	{"GetDates",		(PyCFunction)mfss_GetDates,				1},
+	{"SetDates",		(PyCFunction)mfss_SetDates,				1},
  
 	{NULL,			NULL}		/* sentinel */
 };
 
 /* ---------- */
 
-static object *
+static PyObject *
 mfss_getattr(self, name)
 	mfssobject *self;
 	char *name;
 {
 	if ( strcmp(name, "data") == 0)
 		return PyString_FromStringAndSize((char *)&self->fsspec, sizeof(FSSpec));	
-	return findmethod(mfss_methods, (object *)self, name);
+	return Py_FindMethod(mfss_methods, (PyObject *)self, name);
 }
 
 mfssobject *
@@ -626,7 +625,7 @@
 {
 	mfssobject *self;
 	
-	self = NEWOBJ(mfssobject, &Mfsstype);
+	self = PyObject_NEW(mfssobject, &Mfsstype);
 	if (self == NULL)
 		return NULL;
 	self->fsspec = *fss;
@@ -637,10 +636,10 @@
 mfss_dealloc(self)
 	mfssobject *self;
 {
-	DEL(self);
+	PyMem_DEL(self);
 }
 
-static object *
+static PyObject *
 mfss_repr(self)
 	mfssobject *self;
 {
@@ -650,7 +649,7 @@
 		self->fsspec.vRefNum, 
 		self->fsspec.parID,
 		self->fsspec.name[0], self->fsspec.name+1);
-	return newstringobject(buf);
+	return PyString_FromString(buf);
 }
 
 static int
@@ -673,8 +672,8 @@
 	return res;
 }
 
-statichere typeobject Mfsstype = {
-	OB_HEAD_INIT(&Typetype)
+statichere PyTypeObject Mfsstype = {
+	PyObject_HEAD_INIT(&PyType_Type)
 	0,				/*ob_size*/
 	"FSSpec",			/*tp_name*/
 	sizeof(mfssobject),		/*tp_basicsize*/
@@ -695,29 +694,29 @@
 /* End of code for FSSpec objects */
 /* -------------------------------------------------------- */
 
-static object *
+static PyObject *
 mfs_ResolveAliasFile(self, args)
-	object *self;	/* Not used */
-	object *args;
+	PyObject *self;	/* Not used */
+	PyObject *args;
 {
 	FSSpec fss;
 	Boolean chain = 1, isfolder, wasaliased;
 	OSErr err;
 
-	if (!newgetargs(args, "O&|i", PyMac_GetFSSpec, &fss, &chain))
+	if (!PyArg_ParseTuple(args, "O&|i", PyMac_GetFSSpec, &fss, &chain))
 		return NULL;
 	err = ResolveAliasFile(&fss, chain, &isfolder, &wasaliased);
 	if ( err ) {
 		PyErr_Mac(ErrorObject, err);
 		return NULL;
 	}
-	return mkvalue("Oii", newmfssobject(&fss), (int)isfolder, (int)wasaliased);
+	return Py_BuildValue("Oii", newmfssobject(&fss), (int)isfolder, (int)wasaliased);
 }
 
-static object *
+static PyObject *
 mfs_StandardGetFile(self, args)
-	object *self;	/* Not used */
-	object *args;
+	PyObject *self;	/* Not used */
+	PyObject *args;
 {
 	SFTypeList list;
 	short numtypes;
@@ -725,7 +724,7 @@
 	
 	list[0] = list[1] = list[2] = list[3] = 0;
 	numtypes = 0;
-	if (!newgetargs(args, "|O&O&O&O&", PyMac_GetOSType, &list[0],
+	if (!PyArg_ParseTuple(args, "|O&O&O&O&", PyMac_GetOSType, &list[0],
 			 PyMac_GetOSType, &list[1], PyMac_GetOSType, &list[2],
 			  PyMac_GetOSType, &list[3]) )
 		return NULL;
@@ -735,13 +734,13 @@
 	if ( numtypes == 0 )
 		numtypes = -1;
 	StandardGetFile((FileFilterUPP)0, numtypes, list, &reply);
-	return mkvalue("(Oi)", newmfssobject(&reply.sfFile), reply.sfGood);
+	return Py_BuildValue("(Oi)", newmfssobject(&reply.sfFile), reply.sfGood);
 }
 
-static object *
+static PyObject *
 mfs_PromptGetFile(self, args)
-	object *self;	/* Not used */
-	object *args;
+	PyObject *self;	/* Not used */
+	PyObject *args;
 {
 	SFTypeList list;
 	short numtypes;
@@ -750,7 +749,7 @@
 	
 	list[0] = list[1] = list[2] = list[3] = 0;
 	numtypes = 0;
-	if (!newgetargs(args, "s|O&O&O&O&", &prompt, PyMac_GetOSType, &list[0],
+	if (!PyArg_ParseTuple(args, "s|O&O&O&O&", &prompt, PyMac_GetOSType, &list[0],
 			 PyMac_GetOSType, &list[1], PyMac_GetOSType, &list[2],
 			  PyMac_GetOSType, &list[3]) )
 		return NULL;
@@ -760,30 +759,30 @@
 	if ( numtypes == 0 )
 		numtypes = -1;
 	PyMac_PromptGetFile(numtypes, list, &reply, prompt);
-	return mkvalue("(Oi)", newmfssobject(&reply.sfFile), reply.sfGood);
+	return Py_BuildValue("(Oi)", newmfssobject(&reply.sfFile), reply.sfGood);
 }
 
-static object *
+static PyObject *
 mfs_StandardPutFile(self, args)
-	object *self;	/* Not used */
-	object *args;
+	PyObject *self;	/* Not used */
+	PyObject *args;
 {
 	Str255 prompt, dft;
 	StandardFileReply reply;
 	
 	dft[0] = 0;
-	if (!newgetargs(args, "O&|O&", PyMac_GetStr255, &prompt, PyMac_GetStr255, &dft) )
+	if (!PyArg_ParseTuple(args, "O&|O&", PyMac_GetStr255, &prompt, PyMac_GetStr255, &dft) )
 		return NULL;
 	StandardPutFile(prompt, dft, &reply);
-	return mkvalue("(Oi)",newmfssobject(&reply.sfFile), reply.sfGood);
+	return Py_BuildValue("(Oi)",newmfssobject(&reply.sfFile), reply.sfGood);
 }
 
 /*
 ** Set initial directory for file dialogs */
-static object *
+static PyObject *
 mfs_SetFolder(self, args)
-	object *self;
-	object *args;
+	PyObject *self;
+	PyObject *args;
 {
 	FSSpec spec;
 	FSSpec ospec;
@@ -797,53 +796,53 @@
 	
 	/* Go to working directory by default */
 	(void)FSMakeFSSpec(0, 0, "\p:placeholder", &spec);
-	if (!newgetargs(args, "|O&", PyMac_GetFSSpec, &spec))
+	if (!PyArg_ParseTuple(args, "|O&", PyMac_GetFSSpec, &spec))
 		return NULL;
 	/* Set standard-file working directory */
 	LMSetSFSaveDisk(-spec.vRefNum);
 	LMSetCurDirStore(spec.parID);
-	return (object *)newmfssobject(&ospec);
+	return (PyObject *)newmfssobject(&ospec);
 }
 
-static object *
+static PyObject *
 mfs_FSSpec(self, args)
-	object *self;	/* Not used */
-	object *args;
+	PyObject *self;	/* Not used */
+	PyObject *args;
 {
 	FSSpec fss;
 
-	if (!newgetargs(args, "O&", PyMac_GetFSSpec, &fss))
+	if (!PyArg_ParseTuple(args, "O&", PyMac_GetFSSpec, &fss))
 		return NULL;
-	return (object *)newmfssobject(&fss);
+	return (PyObject *)newmfssobject(&fss);
 }
 
-static object *
+static PyObject *
 mfs_RawFSSpec(self, args)
-	object *self;	/* Not used */
-	object *args;
+	PyObject *self;	/* Not used */
+	PyObject *args;
 {
 	FSSpec *fssp;
 	int size;
 
-	if (!newgetargs(args, "s#", &fssp, &size))
+	if (!PyArg_ParseTuple(args, "s#", &fssp, &size))
 		return NULL;
 	if ( size != sizeof(FSSpec) ) {
 		PyErr_SetString(PyExc_TypeError, "Incorrect size for FSSpec record");
 		return NULL;
 	}
-	return (object *)newmfssobject(fssp);
+	return (PyObject *)newmfssobject(fssp);
 }
 
-static object *
+static PyObject *
 mfs_RawAlias(self, args)
-	object *self;	/* Not used */
-	object *args;
+	PyObject *self;	/* Not used */
+	PyObject *args;
 {
 	char *dataptr;
 	Handle h;
 	int size;
 
-	if (!newgetargs(args, "s#", &dataptr, &size))
+	if (!PyArg_ParseTuple(args, "s#", &dataptr, &size))
 		return NULL;
 	h = NewHandle(size);
 	if ( h == NULL ) {
@@ -853,29 +852,29 @@
 	HLock(h);
 	memcpy((char *)*h, dataptr, size);
 	HUnlock(h);
-	return (object *)newmfsaobject((AliasHandle)h);
+	return (PyObject *)newmfsaobject((AliasHandle)h);
 }
 
-static object *
+static PyObject *
 mfs_GetDirectory(self, args)
-	object *self;	/* Not used */
-	object *args;
+	PyObject *self;	/* Not used */
+	PyObject *args;
 {
 	FSSpec fsdir;
 	int ok;
 	char *prompt = NULL;
 		
-	if (!newgetargs(args, "|s", &prompt) )
+	if (!PyArg_ParseTuple(args, "|s", &prompt) )
 		return NULL;
 		
 	ok = PyMac_GetDirectory(&fsdir, prompt);
-	return mkvalue("(Oi)", newmfssobject(&fsdir), ok);
+	return Py_BuildValue("(Oi)", newmfssobject(&fsdir), ok);
 }
 
-static object *
+static PyObject *
 mfs_FindFolder(self, args)
-	object *self;	/* Not used */
-	object *args;
+	PyObject *self;	/* Not used */
+	PyObject *args;
 {
 	OSErr err;
 	short where;
@@ -884,46 +883,46 @@
 	short refnum;
 	long dirid;
 		
-	if (!newgetargs(args, "hO&i", &where, PyMac_GetOSType, &which, &create) )
+	if (!PyArg_ParseTuple(args, "hO&i", &where, PyMac_GetOSType, &which, &create) )
 		return NULL;
 	err = FindFolder(where, which, (Boolean)create, &refnum, &dirid);
 	if ( err ) {
 		PyErr_Mac(ErrorObject, err);
 		return NULL;
 	}
-	return mkvalue("(ii)", refnum, dirid);
+	return Py_BuildValue("(ii)", refnum, dirid);
 }
 
-static object *
+static PyObject *
 mfs_FindApplication(self, args)
-	object *self;	/* Not used */
-	object *args;
+	PyObject *self;	/* Not used */
+	PyObject *args;
 {
 	OSErr err;
 	OSType which;
 	FSSpec	fss;
 		
-	if (!newgetargs(args, "O&", PyMac_GetOSType, &which) )
+	if (!PyArg_ParseTuple(args, "O&", PyMac_GetOSType, &which) )
 		return NULL;
 	err = FindApplicationFromCreator(which, &fss);
 	if ( err ) {
 		PyErr_Mac(ErrorObject, err);
 		return NULL;
 	}
-	return (object *)newmfssobject(&fss);
+	return (PyObject *)newmfssobject(&fss);
 }
 
-static object *
+static PyObject *
 mfs_FInfo(self, args)
-	object *self;
-	object *args;
+	PyObject *self;
+	PyObject *args;
 {	
-	return (object *)newmfsiobject();
+	return (PyObject *)newmfsiobject();
 }
 
 /* List of methods defined in the module */
 
-static struct methodlist mfs_methods[] = {
+static struct PyMethodDef mfs_methods[] = {
 	{"ResolveAliasFile",	mfs_ResolveAliasFile,	1},
 	{"StandardGetFile",		mfs_StandardGetFile,	1},
 	{"PromptGetFile",		mfs_PromptGetFile,		1},
@@ -946,19 +945,19 @@
 void
 initmacfs()
 {
-	object *m, *d;
+	PyObject *m, *d;
 
 	/* Create the module and add the functions */
-	m = initmodule("macfs", mfs_methods);
+	m = Py_InitModule("macfs", mfs_methods);
 
 	/* Add some symbolic constants to the module */
-	d = getmoduledict(m);
-	ErrorObject = newstringobject("macfs.error");
-	dictinsert(d, "error", ErrorObject);
+	d = PyModule_GetDict(m);
+	ErrorObject = PyString_FromString("macfs.error");
+	PyDict_SetItemString(d, "error", ErrorObject);
 
 	/* XXXX Add constants here */
 	
 	/* Check for errors */
-	if (err_occurred())
-		fatal("can't initialize module macfs");
+	if (PyErr_Occurred())
+		Py_FatalError("can't initialize module macfs");
 }
diff --git a/Mac/Modules/macmodule.c b/Mac/Modules/macmodule.c
index 4231346..b94b713 100644
--- a/Mac/Modules/macmodule.c
+++ b/Mac/Modules/macmodule.c
@@ -24,8 +24,7 @@
 
 /* Mac module implementation */
 
-#include "allobjects.h"
-#include "modsupport.h"
+#include "Python.h"
 #include "ceval.h"
 
 #include <stdio.h>
@@ -89,100 +88,100 @@
 
 #ifndef USE_GUSI
 
-int chdir PROTO((const char *path));
-int mkdir PROTO((const char *path, int mode));
-DIR * opendir PROTO((char *));
-void closedir PROTO((DIR *));
-struct dirent * readdir PROTO((DIR *));
-int rmdir PROTO((const char *path));
-int sync PROTO((void));
+int chdir Py_PROTO((const char *path));
+int mkdir Py_PROTO((const char *path, int mode));
+DIR * opendir Py_PROTO((char *));
+void closedir Py_PROTO((DIR *));
+struct dirent * readdir Py_PROTO((DIR *));
+int rmdir Py_PROTO((const char *path));
+int sync Py_PROTO((void));
 
 #if defined(THINK_C) || defined(__SC__)
-int unlink PROTO((char *));
+int unlink Py_PROTO((char *));
 #else
-int unlink PROTO((const char *));
+int unlink Py_PROTO((const char *));
 #endif
 
 #endif /* USE_GUSI */
 
-char *getwd PROTO((char *));
-char *getbootvol PROTO((void));
+char *getwd Py_PROTO((char *));
+char *getbootvol Py_PROTO((void));
 
 
-static object *MacError; /* Exception mac.error */
+static PyObject *MacError; /* Exception mac.error */
 
 /* Set a MAC-specific error from errno, and return NULL */
 
-static object * 
+static PyObject * 
 mac_error() 
 {
-	return err_errno(MacError);
+	return PyErr_SetFromErrno(MacError);
 }
 
 /* MAC generic methods */
 
-static object *
+static PyObject *
 mac_1str(args, func)
-	object *args;
-	int (*func) FPROTO((const char *));
+	PyObject *args;
+	int (*func) Py_FPROTO((const char *));
 {
 	char *path1;
 	int res;
-	if (!getargs(args, "s", &path1))
+	if (!PyArg_Parse(args, "s", &path1))
 		return NULL;
-	BGN_SAVE
+	Py_BEGIN_ALLOW_THREADS
 	res = (*func)(path1);
-	END_SAVE
+	Py_END_ALLOW_THREADS
 	if (res < 0)
 		return mac_error();
-	INCREF(None);
-	return None;
+	Py_INCREF(Py_None);
+	return Py_None;
 }
 
-static object *
+static PyObject *
 mac_2str(args, func)
-	object *args;
-	int (*func) FPROTO((const char *, const char *));
+	PyObject *args;
+	int (*func) Py_FPROTO((const char *, const char *));
 {
 	char *path1, *path2;
 	int res;
-	if (!getargs(args, "(ss)", &path1, &path2))
+	if (!PyArg_Parse(args, "(ss)", &path1, &path2))
 		return NULL;
-	BGN_SAVE
+	Py_BEGIN_ALLOW_THREADS
 	res = (*func)(path1, path2);
-	END_SAVE
+	Py_END_ALLOW_THREADS
 	if (res < 0)
 		return mac_error();
-	INCREF(None);
-	return None;
+	Py_INCREF(Py_None);
+	return Py_None;
 }
 
-static object *
+static PyObject *
 mac_strint(args, func)
-	object *args;
-	int (*func) FPROTO((const char *, int));
+	PyObject *args;
+	int (*func) Py_FPROTO((const char *, int));
 {
 	char *path;
 	int i;
 	int res;
-	if (!getargs(args, "(si)", &path, &i))
+	if (!PyArg_Parse(args, "(si)", &path, &i))
 		return NULL;
-	BGN_SAVE
+	Py_BEGIN_ALLOW_THREADS
 	res = (*func)(path, i);
-	END_SAVE
+	Py_END_ALLOW_THREADS
 	if (res < 0)
 		return mac_error();
-	INCREF(None);
-	return None;
+	Py_INCREF(Py_None);
+	return Py_None;
 }
 
-static object *
+static PyObject *
 mac_chdir(self, args)
-	object *self;
-	object *args;
+	PyObject *self;
+	PyObject *args;
 {
 #ifdef USE_GUSI
-	object *rv;
+	PyObject *rv;
 	
 	/* Change MacOS's idea of wd too */
 	rv = mac_1str(args, chdir);
@@ -194,264 +193,264 @@
 
 }
 
-static object *
+static PyObject *
 mac_close(self, args)
-	object *self;
-	object *args;
+	PyObject *self;
+	PyObject *args;
 {
 	int fd, res;
-	if (!getargs(args, "i", &fd))
+	if (!PyArg_Parse(args, "i", &fd))
 		return NULL;
-	BGN_SAVE
+	Py_BEGIN_ALLOW_THREADS
 	res = close(fd);
-	END_SAVE
+	Py_END_ALLOW_THREADS
 #ifndef USE_GUSI
 	/* GUSI gives surious errors here? */
 	if (res < 0)
 		return mac_error();
 #endif
-	INCREF(None);
-	return None;
+	Py_INCREF(Py_None);
+	return Py_None;
 }
 
 #ifdef WEHAVE_DUP
 
-static object *
+static PyObject *
 mac_dup(self, args)
-	object *self;
-	object *args;
+	PyObject *self;
+	PyObject *args;
 {
 	int fd;
-	if (!getargs(args, "i", &fd))
+	if (!PyArg_Parse(args, "i", &fd))
 		return NULL;
-	BGN_SAVE
+	Py_BEGIN_ALLOW_THREADS
 	fd = dup(fd);
-	END_SAVE
+	Py_END_ALLOW_THREADS
 	if (fd < 0)
 		return mac_error();
-	return newintobject((long)fd);
+	return PyInt_FromLong((long)fd);
 }
 
 #endif
 
 #ifdef WEHAVE_FDOPEN
-static object *
+static PyObject *
 mac_fdopen(self, args)
-	object *self;
-	object *args;
+	PyObject *self;
+	PyObject *args;
 {
-	extern int fclose PROTO((FILE *));
+	extern int fclose Py_PROTO((FILE *));
 	int fd;
 	char *mode;
 	FILE *fp;
-	if (!getargs(args, "(is)", &fd, &mode))
+	if (!PyArg_Parse(args, "(is)", &fd, &mode))
 		return NULL;
-	BGN_SAVE
+	Py_BEGIN_ALLOW_THREADS
 	fp = fdopen(fd, mode);
-	END_SAVE
+	Py_END_ALLOW_THREADS
 	if (fp == NULL)
 		return mac_error();
-	return newopenfileobject(fp, "(fdopen)", mode, fclose);
+	return PyFile_FromFile(fp, "(fdopen)", mode, fclose);
 }
 #endif
 
-static object *
+static PyObject *
 mac_getbootvol(self, args)
-	object *self;
-	object *args;
+	PyObject *self;
+	PyObject *args;
 {
 	char *res;
-	if (!getnoarg(args))
+	if (!PyArg_NoArgs(args))
 		return NULL;
-	BGN_SAVE
+	Py_BEGIN_ALLOW_THREADS
 	res = getbootvol();
-	END_SAVE
+	Py_END_ALLOW_THREADS
 	if (res == NULL)
 		return mac_error();
-	return newstringobject(res);
+	return PyString_FromString(res);
 }
 
-static object *
+static PyObject *
 mac_getcwd(self, args)
-	object *self;
-	object *args;
+	PyObject *self;
+	PyObject *args;
 {
 	char path[MAXPATHLEN];
 	char *res;
-	if (!getnoarg(args))
+	if (!PyArg_NoArgs(args))
 		return NULL;
-	BGN_SAVE
+	Py_BEGIN_ALLOW_THREADS
 #ifdef USE_GUSI
 	res = getcwd(path, sizeof path);
 #else
 	res = getwd(path);
 #endif
-	END_SAVE
+	Py_END_ALLOW_THREADS
 	if (res == NULL) {
-		err_setstr(MacError, path);
+		PyErr_SetString(MacError, path);
 		return NULL;
 	}
-	return newstringobject(res);
+	return PyString_FromString(res);
 }
 
-static object *
+static PyObject *
 mac_listdir(self, args)
-	object *self;
-	object *args;
+	PyObject *self;
+	PyObject *args;
 {
 	char *name;
-	object *d, *v;
+	PyObject *d, *v;
 	DIR *dirp;
 	struct dirent *ep;
-	if (!getargs(args, "s", &name))
+	if (!PyArg_Parse(args, "s", &name))
 		return NULL;
-	BGN_SAVE
+	Py_BEGIN_ALLOW_THREADS
 	if ((dirp = opendir(name)) == NULL) {
-		RET_SAVE
+		Py_BLOCK_THREADS
 		return mac_error();
 	}
-	if ((d = newlistobject(0)) == NULL) {
+	if ((d = PyList_New(0)) == NULL) {
 		closedir(dirp);
-		RET_SAVE
+		Py_BLOCK_THREADS
 		return NULL;
 	}
 	while ((ep = readdir(dirp)) != NULL) {
-		v = newstringobject(ep->d_name);
+		v = PyString_FromString(ep->d_name);
 		if (v == NULL) {
-			DECREF(d);
+			Py_DECREF(d);
 			d = NULL;
 			break;
 		}
-		if (addlistitem(d, v) != 0) {
-			DECREF(v);
-			DECREF(d);
+		if (PyList_Append(d, v) != 0) {
+			Py_DECREF(v);
+			Py_DECREF(d);
 			d = NULL;
 			break;
 		}
-		DECREF(v);
+		Py_DECREF(v);
 	}
 	closedir(dirp);
-	END_SAVE
+	Py_END_ALLOW_THREADS
 
 	return d;
 }
 
-static object *
+static PyObject *
 mac_lseek(self, args)
-	object *self;
-	object *args;
+	PyObject *self;
+	PyObject *args;
 {
 	int fd;
 	int where;
 	int how;
 	long res;
-	if (!getargs(args, "(iii)", &fd, &where, &how))
+	if (!PyArg_Parse(args, "(iii)", &fd, &where, &how))
 		return NULL;
-	BGN_SAVE
+	Py_BEGIN_ALLOW_THREADS
 	res = lseek(fd, (long)where, how);
-	END_SAVE
+	Py_END_ALLOW_THREADS
 	if (res < 0)
 		return mac_error();
-	return newintobject(res);
+	return PyInt_FromLong(res);
 }
 
-static object *
+static PyObject *
 mac_mkdir(self, args)
-	object *self;
-	object *args;
+	PyObject *self;
+	PyObject *args;
 {
 	int res;
 	char *path;
 	int mode = 0777; /* Unused */
-	if (!newgetargs(args, "s|i", &path, &mode))
+	if (!PyArg_ParseTuple(args, "s|i", &path, &mode))
 		return NULL;
-	BGN_SAVE
+	Py_BEGIN_ALLOW_THREADS
 #ifdef USE_GUSI
 	res = mkdir(path);
 #else
 	res = mkdir(path, mode);
 #endif
-	END_SAVE
+	Py_END_ALLOW_THREADS
 	if (res < 0)
 		return mac_error();
-	INCREF(None);
-	return None;
+	Py_INCREF(Py_None);
+	return Py_None;
 }
 
-static object *
+static PyObject *
 mac_open(self, args)
-	object *self;
-	object *args;
+	PyObject *self;
+	PyObject *args;
 {
 	char *path;
 	int mode;
 	int fd;
-	if (!getargs(args, "(si)", &path, &mode))
+	if (!PyArg_Parse(args, "(si)", &path, &mode))
 		return NULL;
-	BGN_SAVE
+	Py_BEGIN_ALLOW_THREADS
 	fd = open(path, mode);
-	END_SAVE
+	Py_END_ALLOW_THREADS
 	if (fd < 0)
 		return mac_error();
-	return newintobject((long)fd);
+	return PyInt_FromLong((long)fd);
 }
 
-static object *
+static PyObject *
 mac_read(self, args)
-	object *self;
-	object *args;
+	PyObject *self;
+	PyObject *args;
 {
 	int fd, size;
-	object *buffer;
-	if (!getargs(args, "(ii)", &fd, &size))
+	PyObject *buffer;
+	if (!PyArg_Parse(args, "(ii)", &fd, &size))
 		return NULL;
-	buffer = newsizedstringobject((char *)NULL, size);
+	buffer = PyString_FromStringAndSize((char *)NULL, size);
 	if (buffer == NULL)
 		return NULL;
-	BGN_SAVE
-	size = read(fd, getstringvalue(buffer), size);
-	END_SAVE
+	Py_BEGIN_ALLOW_THREADS
+	size = read(fd, PyString_AsString(buffer), size);
+	Py_END_ALLOW_THREADS
 	if (size < 0) {
-		DECREF(buffer);
+		Py_DECREF(buffer);
 		return mac_error();
 	}
-	resizestring(&buffer, size);
+	_PyString_Resize(&buffer, size);
 	return buffer;
 }
 
-static object *
+static PyObject *
 mac_rename(self, args)
-	object *self;
-	object *args;
+	PyObject *self;
+	PyObject *args;
 {
 	return mac_2str(args, rename);
 }
 
-static object *
+static PyObject *
 mac_rmdir(self, args)
-	object *self;
-	object *args;
+	PyObject *self;
+	PyObject *args;
 {
 	return mac_1str(args, rmdir);
 }
 
-static object *
+static PyObject *
 mac_stat(self, args)
-	object *self;
-	object *args;
+	PyObject *self;
+	PyObject *args;
 {
 	struct stat st;
 	char *path;
 	int res;
-	if (!getargs(args, "s", &path))
+	if (!PyArg_Parse(args, "s", &path))
 		return NULL;
-	BGN_SAVE
+	Py_BEGIN_ALLOW_THREADS
 	res = stat(path, &st);
-	END_SAVE
+	Py_END_ALLOW_THREADS
 	if (res != 0)
 		return mac_error();
 #if 1
-	return mkvalue("(lllllllddd)",
+	return Py_BuildValue("(lllllllddd)",
 		    (long)st.st_mode,
 		    (long)st.st_ino,
 		    (long)st.st_dev,
@@ -463,7 +462,7 @@
 		    (double)st.st_mtime,
 		    (double)st.st_ctime);
 #else
-	return mkvalue("(llllllllll)",
+	return Py_BuildValue("(llllllllll)",
 		    (long)st.st_mode,
 		    (long)st.st_ino,
 		    (long)st.st_dev,
@@ -477,34 +476,34 @@
 #endif
 }
 
-static object *
+static PyObject *
 mac_xstat(self, args)
-	object *self;
-	object *args;
+	PyObject *self;
+	PyObject *args;
 {
 	struct macstat mst;
 	struct stat st;
 	char *path;
 	int res;
-	if (!getargs(args, "s", &path))
+	if (!PyArg_Parse(args, "s", &path))
 		return NULL;
 	/*
 	** Convoluted: we want stat() and xstat() to agree, so we call both
 	** stat and macstat, and use the latter only for values not provided by
 	** the former.
 	*/
-	BGN_SAVE
+	Py_BEGIN_ALLOW_THREADS
 	res = macstat(path, &mst);
-	END_SAVE
+	Py_END_ALLOW_THREADS
 	if (res != 0)
 		return mac_error();
-	BGN_SAVE
+	Py_BEGIN_ALLOW_THREADS
 	res = stat(path, &st);
-	END_SAVE
+	Py_END_ALLOW_THREADS
 	if (res != 0)
 		return mac_error();
 #if 1
-	return mkvalue("(llllllldddls#s#)",
+	return Py_BuildValue("(llllllldddls#s#)",
 		    (long)st.st_mode,
 		    (long)st.st_ino,
 		    (long)st.st_dev,
@@ -519,7 +518,7 @@
 		    mst.st_creator, 4,
 		    mst.st_type, 4);
 #else
-	return mkvalue("(llllllllllls#s#)",
+	return Py_BuildValue("(llllllllllls#s#)",
 		    (long)st.st_mode,
 		    (long)st.st_ino,
 		    (long)st.st_dev,
@@ -536,61 +535,61 @@
 #endif
 }
 
-static object *
+static PyObject *
 mac_sync(self, args)
-	object *self;
-	object *args;
+	PyObject *self;
+	PyObject *args;
 {
 	int res;
-	if (!getnoarg(args))
+	if (!PyArg_NoArgs(args))
 		return NULL;
-	BGN_SAVE
+	Py_BEGIN_ALLOW_THREADS
 	res = sync();
-	END_SAVE
+	Py_END_ALLOW_THREADS
 	if (res != 0)
 		return mac_error();
-	INCREF(None);
-	return None;
+	Py_INCREF(Py_None);
+	return Py_None;
 }
 
-static object *
+static PyObject *
 mac_unlink(self, args)
-	object *self;
-	object *args;
+	PyObject *self;
+	PyObject *args;
 {
 	return mac_1str(args, (int (*)(const char *))unlink);
 }
 
-static object *
+static PyObject *
 mac_write(self, args)
-	object *self;
-	object *args;
+	PyObject *self;
+	PyObject *args;
 {
 	int fd, size;
 	char *buffer;
-	if (!getargs(args, "(is#)", &fd, &buffer, &size))
+	if (!PyArg_Parse(args, "(is#)", &fd, &buffer, &size))
 		return NULL;
-	BGN_SAVE
+	Py_BEGIN_ALLOW_THREADS
 	size = write(fd, buffer, size);
-	END_SAVE
+	Py_END_ALLOW_THREADS
 	if (size < 0)
 		return mac_error();
-	return newintobject((long)size);
+	return PyInt_FromLong((long)size);
 }
 
 #ifdef USE_MALLOC_DEBUG
-static object *
+static PyObject *
 mac_mstats(self, args)
-	object*self;
-	object *args;
+	PyObject*self;
+	PyObject *args;
 {
 	mstats("python");
-	INCREF(None);
-	return None;
+	Py_INCREF(Py_None);
+	return Py_None;
 }
 #endif USE_MALLOC_DEBUG
 
-static struct methodlist mac_methods[] = {
+static struct PyMethodDef mac_methods[] = {
 	{"chdir",	mac_chdir},
 	{"close",	mac_close},
 #ifdef WEHAVE_DUP
@@ -625,13 +624,13 @@
 void
 initmac()
 {
-	object *m, *d;
+	PyObject *m, *d;
 	
-	m = initmodule("mac", mac_methods);
-	d = getmoduledict(m);
+	m = Py_InitModule("mac", mac_methods);
+	d = PyModule_GetDict(m);
 	
 	/* Initialize mac.error exception */
-	MacError = newstringobject("mac.error");
-	if (MacError == NULL || dictinsert(d, "error", MacError) != 0)
-		fatal("can't define mac.error");
+	MacError = PyString_FromString("mac.error");
+	if (MacError == NULL || PyDict_SetItemString(d, "error", MacError) != 0)
+		Py_FatalError("can't define mac.error");
 }
diff --git a/Mac/Modules/macspeechmodule.c b/Mac/Modules/macspeechmodule.c
index 6a6e3d5..e804ac1 100644
--- a/Mac/Modules/macspeechmodule.c
+++ b/Mac/Modules/macspeechmodule.c
@@ -24,8 +24,7 @@
 
 /* xx module */
 
-#include "allobjects.h"
-#include "modsupport.h"
+#include "Python.h"
 
 #include <GestaltEqu.h>
 #include "Speech.h"
@@ -48,7 +47,7 @@
 #define double2fixed(x) ((Fixed)((x)*32768.0))
 
 char *CurrentSpeech;
-object *ms_error_object;
+PyObject *ms_error_object;
 int speech_available;
 
 static
@@ -68,12 +67,12 @@
 static
 check_available() {
 	if ( !speech_available ) {
-		err_setstr(ms_error_object, "Speech Mgr not available");
+		PyErr_SetString(ms_error_object, "Speech Mgr not available");
 		return 0;
 	}
 #ifdef __powerc
 	if ( !lib_available ) {
-		err_setstr(ms_error_object, "Speech Mgr available, but shared lib missing");
+		PyErr_SetString(ms_error_object, "Speech Mgr available, but shared lib missing");
 		return 0;
 	}
 #endif
@@ -85,12 +84,12 @@
 ** Part one - the speech channel object
 */
 typedef struct {
-	OB_HEAD
+	PyObject_HEAD
 	SpeechChannel chan;
-	object *curtext;	/* If non-NULL current text being spoken */
+	PyObject *curtext;	/* If non-NULL current text being spoken */
 } scobject;
 
-staticforward typeobject sctype;
+staticforward PyTypeObject sctype;
 
 #define is_scobject(v)		((v)->ob_type == &sctype)
 
@@ -101,11 +100,11 @@
 	scobject *self;
 	OSErr err;
 	
-	self = NEWOBJ(scobject, &sctype);
+	self = PyObject_NEW(scobject, &sctype);
 	if (self == NULL)
 		return NULL;
 	if ( (err=NewSpeechChannel(arg, &self->chan)) != 0) {
-		DECREF(self);
+		Py_DECREF(self);
 		return (scobject *)PyErr_Mac(ms_error_object, err);
 	}
 	self->curtext = NULL;
@@ -119,146 +118,146 @@
 	scobject *self;
 {
 	DisposeSpeechChannel(self->chan);
-	DEL(self);
+	PyMem_DEL(self);
 }
 
-static object *
+static PyObject *
 sc_Stop(self, args)
 	scobject *self;
-	object *args;
+	PyObject *args;
 {
 	OSErr err;
 	
-	if (!getnoarg(args))
+	if (!PyArg_NoArgs(args))
 		return NULL;
 	if ((err=StopSpeech(self->chan)) != 0) {
 		PyErr_Mac(ms_error_object, err);
 		return NULL;
 	}
 	if ( self->curtext ) {
-		DECREF(self->curtext);
+		Py_DECREF(self->curtext);
 		self->curtext = NULL;
 	}
-	INCREF(None);
-	return None;
+	Py_INCREF(Py_None);
+	return Py_None;
 }
 
-static object *
+static PyObject *
 sc_SpeakText(self, args)
 	scobject *self;
-	object *args;
+	PyObject *args;
 {
 	OSErr err;
 	char *str;
 	int len;
 	
-	if (!getargs(args, "s#", &str, &len))
+	if (!PyArg_Parse(args, "s#", &str, &len))
 		return NULL;
 	if ( self->curtext ) {
 		StopSpeech(self->chan);
-		DECREF(self->curtext);
+		Py_DECREF(self->curtext);
 		self->curtext = NULL;
 	}
 	if ((err=SpeakText(self->chan, (Ptr)str, (long)len)) != 0) {
 		PyErr_Mac(ms_error_object, err);
 		return 0;
 	}
-	(void)getargs(args, "O", &self->curtext);	/* Or should I check this? */
-	INCREF(self->curtext);
-	INCREF(None);
-	return None;
+	(void)PyArg_Parse(args, "O", &self->curtext);	/* Or should I check this? */
+	Py_INCREF(self->curtext);
+	Py_INCREF(Py_None);
+	return Py_None;
 }
 
-static object *
+static PyObject *
 sc_GetRate(self, args)
 	scobject *self;
-	object *args;
+	PyObject *args;
 {
 	OSErr err;
 	Fixed farg;
 	
-	if (!getnoarg(args))
+	if (!PyArg_NoArgs(args))
 		return NULL;
 	if ((err=GetSpeechRate(self->chan, &farg)) != 0) {
 		PyErr_Mac(ms_error_object, err);
 		return 0;
 	}
-	return newfloatobject(fixed2double(farg));
+	return PyFloat_FromDouble(fixed2double(farg));
 }
 
-static object *
+static PyObject *
 sc_GetPitch(self, args)
 	scobject *self;
-	object *args;
+	PyObject *args;
 {
 	OSErr err;
 	Fixed farg;
 	
-	if (!getnoarg(args))
+	if (!PyArg_NoArgs(args))
 		return NULL;
 	if ((err=GetSpeechPitch(self->chan, &farg)) != 0) {
 		PyErr_Mac(ms_error_object, err);
 		return 0;
 	}
-	return newfloatobject(fixed2double(farg));
+	return PyFloat_FromDouble(fixed2double(farg));
 }
 
-static object *
+static PyObject *
 sc_SetRate(self, args)
 	scobject *self;
-	object *args;
+	PyObject *args;
 {
 	OSErr err;
 	double darg;
 	
-	if (!getargs(args, "d", &darg))
+	if (!PyArg_Parse(args, "d", &darg))
 		return NULL;
 	if ((err=SetSpeechRate(self->chan, double2fixed(darg))) != 0) {
 		PyErr_Mac(ms_error_object, err);
 		return 0;
 	}
-	INCREF(None);
-	return None;
+	Py_INCREF(Py_None);
+	return Py_None;
 }
 
-static object *
+static PyObject *
 sc_SetPitch(self, args)
 	scobject *self;
-	object *args;
+	PyObject *args;
 {
 	OSErr err;
 	double darg;
 	
-	if (!getargs(args, "d", &darg))
+	if (!PyArg_Parse(args, "d", &darg))
 		return NULL;
 	if ((err=SetSpeechPitch(self->chan, double2fixed(darg))) != 0) {
 		PyErr_Mac(ms_error_object, err);
 		return NULL;
 	}
-	INCREF(None);
-	return None;
+	Py_INCREF(Py_None);
+	return Py_None;
 }
 
-static struct methodlist sc_methods[] = {
-	{"Stop",		(method)sc_Stop},
-	{"SetRate",		(method)sc_SetRate},
-	{"GetRate",		(method)sc_GetRate},
-	{"SetPitch",	(method)sc_SetPitch},
-	{"GetPitch",	(method)sc_GetPitch},
-	{"SpeakText",	(method)sc_SpeakText},
+static struct PyMethodDef sc_methods[] = {
+	{"Stop",		(PyCFunction)sc_Stop},
+	{"SetRate",		(PyCFunction)sc_SetRate},
+	{"GetRate",		(PyCFunction)sc_GetRate},
+	{"SetPitch",	(PyCFunction)sc_SetPitch},
+	{"GetPitch",	(PyCFunction)sc_GetPitch},
+	{"SpeakText",	(PyCFunction)sc_SpeakText},
 	{NULL,			NULL}		/* sentinel */
 };
 
-static object *
+static PyObject *
 sc_getattr(self, name)
 	scobject *self;
 	char *name;
 {
-	return findmethod(sc_methods, (object *)self, name);
+	return Py_FindMethod(sc_methods, (PyObject *)self, name);
 }
 
-static typeobject sctype = {
-	OB_HEAD_INIT(&Typetype)
+static PyTypeObject sctype = {
+	PyObject_HEAD_INIT(&PyType_Type)
 	0,			/*ob_size*/
 	"MacSpeechChannel",			/*tp_name*/
 	sizeof(scobject),	/*tp_basicsize*/
@@ -281,13 +280,13 @@
 ** Part two - the voice object
 */
 typedef struct {
-	OB_HEAD
+	PyObject_HEAD
 	int		initialized;
 	VoiceSpec	vs;
 	VoiceDescription vd;
 } mvobject;
 
-staticforward typeobject mvtype;
+staticforward PyTypeObject mvtype;
 
 #define is_mvobject(v)		((v)->ob_type == &mvtype)
 
@@ -295,7 +294,7 @@
 newmvobject()
 {
 	mvobject *self;
-	self = NEWOBJ(mvobject, &mvtype);
+	self = PyObject_NEW(mvobject, &mvtype);
 	if (self == NULL)
 		return NULL;
 	self->initialized = 0;
@@ -326,56 +325,56 @@
 mv_dealloc(self)
 	mvobject *self;
 {
-	DEL(self);
+	PyMem_DEL(self);
 }
 
-static object *
+static PyObject *
 mv_getgender(self, args)
 	mvobject *self;
-	object *args;
+	PyObject *args;
 {
-	object *rv;
+	PyObject *rv;
 	
-	if (!getnoarg(args))
+	if (!PyArg_NoArgs(args))
 		return NULL;
 	if (!self->initialized) {
-		err_setstr(ms_error_object, "Uninitialized voice");
+		PyErr_SetString(ms_error_object, "Uninitialized voice");
 		return NULL;
 	}
-	rv = newintobject(self->vd.gender);
+	rv = PyInt_FromLong(self->vd.gender);
 	return rv;
 }
 
-static object *
+static PyObject *
 mv_newchannel(self, args)
 	mvobject *self;
-	object *args;
+	PyObject *args;
 {	
-	if (!getnoarg(args))
+	if (!PyArg_NoArgs(args))
 		return NULL;
 	if (!self->initialized) {
-		err_setstr(ms_error_object, "Uninitialized voice");
+		PyErr_SetString(ms_error_object, "Uninitialized voice");
 		return NULL;
 	}
-	return (object *)newscobject(&self->vs);
+	return (PyObject *)newscobject(&self->vs);
 }
 
-static struct methodlist mv_methods[] = {
-	{"GetGender",	(method)mv_getgender},
-	{"NewChannel",	(method)mv_newchannel},
+static struct PyMethodDef mv_methods[] = {
+	{"GetGender",	(PyCFunction)mv_getgender},
+	{"NewChannel",	(PyCFunction)mv_newchannel},
 	{NULL,		NULL}		/* sentinel */
 };
 
-static object *
+static PyObject *
 mv_getattr(self, name)
 	mvobject *self;
 	char *name;
 {
-	return findmethod(mv_methods, (object *)self, name);
+	return Py_FindMethod(mv_methods, (PyObject *)self, name);
 }
 
-static typeobject mvtype = {
-	OB_HEAD_INIT(&Typetype)
+static PyTypeObject mvtype = {
+	PyObject_HEAD_INIT(&PyType_Type)
 	0,			/*ob_size*/
 	"MacVoice",			/*tp_name*/
 	sizeof(mvobject),	/*tp_basicsize*/
@@ -401,46 +400,46 @@
 
 /* See if Speech manager available */
 
-static object *
+static PyObject *
 ms_Available(self, args)
-	object *self; /* Not used */
-	object *args;
+	PyObject *self; /* Not used */
+	PyObject *args;
 {
 	
-	if (!getnoarg(args))
+	if (!PyArg_NoArgs(args))
 		return NULL;
-	return newintobject(speech_available);
+	return PyInt_FromLong(speech_available);
 }
 
 /* Count number of busy speeches */
 
-static object *
+static PyObject *
 ms_Busy(self, args)
-	object *self; /* Not used */
-	object *args;
+	PyObject *self; /* Not used */
+	PyObject *args;
 {
 	short result;
 	
-	if (!getnoarg(args))
+	if (!PyArg_NoArgs(args))
 		return NULL;
 	if ( !check_available() )
 		return NULL;
 	result = SpeechBusy();
-	return newintobject(result);
+	return PyInt_FromLong(result);
 }
 
 /* Say something */
 
-static object *
+static PyObject *
 ms_SpeakString(self, args)
-	object *self; /* Not used */
-	object *args;
+	PyObject *self; /* Not used */
+	PyObject *args;
 {
 	OSErr err;
 	char *str;
 	int len;
 	
-	if (!getstrarg(args, &str))
+	if (!PyArg_Parse(args, "s", &str))
 		return NULL;
 	if ( !check_available())
 		return NULL;
@@ -459,68 +458,68 @@
 		PyErr_Mac(ms_error_object, err);
 		return NULL;
 	}
-	INCREF(None);
-	return None;
+	Py_INCREF(Py_None);
+	return Py_None;
 }
 
 
 /* Count number of available voices */
 
-static object *
+static PyObject *
 ms_CountVoices(self, args)
-	object *self; /* Not used */
-	object *args;
+	PyObject *self; /* Not used */
+	PyObject *args;
 {
 	short result;
 	
-	if (!getnoarg(args))
+	if (!PyArg_NoArgs(args))
 		return NULL;
 	if ( !check_available())
 		return NULL;
 	CountVoices(&result);
-	return newintobject(result);
+	return PyInt_FromLong(result);
 }
 
-static object *
+static PyObject *
 ms_GetIndVoice(self, args)
-	object *self; /* Not used */
-	object *args;
+	PyObject *self; /* Not used */
+	PyObject *args;
 {
 	mvobject *rv;
 	long ind;
 	
-	if( !getargs(args, "i", &ind))
+	if( !PyArg_Parse(args, "i", &ind))
 		return NULL;
 	if ( !check_available() )
 		return NULL;
 	rv = newmvobject();
 	if ( !initmvobject(rv, ind) ) {
-		DECREF(rv);
+		Py_DECREF(rv);
 		return NULL;
 	}
-	return (object *)rv;
+	return (PyObject *)rv;
 }
 
 
-static object *
+static PyObject *
 ms_Version(self, args)
-	object *self; /* Not used */
-	object *args;
+	PyObject *self; /* Not used */
+	PyObject *args;
 {
 	NumVersion v;
 	
-	if (!getnoarg(args))
+	if (!PyArg_NoArgs(args))
 		return NULL;
 	if ( !check_available())
 		return NULL;
 	v = SpeechManagerVersion();
-	return newintobject(*(int *)&v);
+	return PyInt_FromLong(*(int *)&v);
 }
 
 
 /* List of functions defined in the module */
 
-static struct methodlist ms_methods[] = {
+static struct PyMethodDef ms_methods[] = {
 	{"Available",	ms_Available},
 	{"CountVoices",	ms_CountVoices},
 	{"Busy",		ms_Busy},
@@ -535,18 +534,18 @@
 void
 initmacspeech()
 {
-	object *m, *d;
+	PyObject *m, *d;
 
 	speech_available = init_available();
 	/* Create the module and add the functions */
-	m = initmodule("macspeech", ms_methods);
+	m = Py_InitModule("macspeech", ms_methods);
 
 	/* Add some symbolic constants to the module */
-	d = getmoduledict(m);
-	ms_error_object = newstringobject("macspeech.error");
-	dictinsert(d, "error", ms_error_object);
+	d = PyModule_GetDict(m);
+	ms_error_object = PyString_FromString("macspeech.error");
+	PyDict_SetItemString(d, "error", ms_error_object);
 
 	/* Check for errors */
-	if (err_occurred())
-		fatal("can't initialize module macspeech");
+	if (PyErr_Occurred())
+		Py_FatalError("can't initialize module macspeech");
 }
