diff --git a/Modules/arraymodule.c b/Modules/arraymodule.c
index 00f2477..3f7e163 100644
--- a/Modules/arraymodule.c
+++ b/Modules/arraymodule.c
@@ -144,6 +144,28 @@
 }
 
 static object *
+i_getitem(ap, i)
+	arrayobject *ap;
+	int i;
+{
+	return newintobject((long) ((int *)ap->ob_item)[i]);
+}
+
+static int
+i_setitem(ap, i, v)
+	arrayobject *ap;
+	int i;
+	object *v;
+{
+	int x;
+	if (!getargs(v, "i;array item must be integer", &x))
+		return -1;
+	if (i >= 0)
+		     ((int *)ap->ob_item)[i] = x;
+	return 0;
+}
+
+static object *
 l_getitem(ap, i)
 	arrayobject *ap;
 	int i;
@@ -214,11 +236,13 @@
 	{'c', sizeof(char), c_getitem, c_setitem},
 	{'b', sizeof(char), b_getitem, b_setitem},
 	{'h', sizeof(short), h_getitem, h_setitem},
+	{'i', sizeof(int), i_getitem, i_setitem},
 	{'l', sizeof(long), l_getitem, l_setitem},
 	{'f', sizeof(float), f_getitem, f_setitem},
 	{'d', sizeof(double), d_getitem, d_setitem},
 	{'\0', 0, 0, 0} /* Sentinel */
 };
+/* If we ever allow items larger than double, we must change reverse()! */
 	
 
 object *
@@ -239,7 +263,7 @@
 	if (nbytes / descr->itemsize != size) {
 		return err_nomem();
 	}
-	op = (arrayobject *) malloc(sizeof(arrayobject));
+	op = NEW(arrayobject, 1);
 	if (op == NULL) {
 		return err_nomem();
 	}
@@ -247,9 +271,9 @@
 		op->ob_item = NULL;
 	}
 	else {
-		op->ob_item = malloc(nbytes);
+		op->ob_item = NEW(char, nbytes);
 		if (op->ob_item == NULL) {
-			free((ANY *)op);
+			DEL(op);
 			return err_nomem();
 		}
 	}
@@ -355,8 +379,8 @@
 {
 	int i;
 	if (op->ob_item != NULL)
-		free((ANY *)op->ob_item);
-	free((ANY *)op);
+		DEL(op->ob_item);
+	DEL(op);
 }
 
 static int
@@ -644,6 +668,22 @@
 			p[3] = p0;
 		}
 		break;
+	case 8:
+		for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 8) {
+			char p0 = p[0];
+			char p1 = p[1];
+			char p2 = p[2];
+			char p3 = p[3];
+			p[0] = p[7];
+			p[1] = p[6];
+			p[2] = p[5];
+			p[3] = p[4];
+			p[4] = p3;
+			p[5] = p2;
+			p[6] = p1;
+			p[7] = p0;
+		}
+		break;
 	default:
 		err_setstr(RuntimeError,
 			   "don't know how to byteswap this array type");
@@ -653,33 +693,37 @@
 	return None;
 }
 
-#if 0
 static object *
 array_reverse(self, args)
 	arrayobject *self;
 	object *args;
 {
-	register object **p, **q;
-	register object *tmp;
-	
+	register int itemsize = self->ob_descr->itemsize;
+	register char *p, *q;
+	char tmp[sizeof(double)]; /* Assume that's the max item size */
+
 	if (args != NULL) {
 		err_badarg();
 		return NULL;
 	}
 
 	if (self->ob_size > 1) {
-		for (p = self->ob_item, q = self->ob_item + self->ob_size - 1;
-						p < q; p++, q--) {
-			tmp = *p;
-			*p = *q;
-			*q = tmp;
+		for (p = self->ob_item,
+		     q = self->ob_item + (self->ob_size - 1)*itemsize;
+		     p < q;
+		     p += itemsize, q -= itemsize) {
+			memmove(tmp, p, itemsize);
+			memmove(p, q, itemsize);
+			memmove(q, tmp, itemsize);
 		}
 	}
 	
 	INCREF(None);
 	return None;
 }
-#endif
+
+/* The following routines were adapted from listobject.c but not converted.
+   To make them work you will have to work! */
 
 #if 0
 static object *
@@ -750,7 +794,7 @@
 #endif
 
 static object *
-array_read(self, args)
+array_fromfile(self, args)
 	arrayobject *self;
 	object *args;
 {
@@ -790,7 +834,7 @@
 }
 
 static object *
-array_write(self, args)
+array_tofile(self, args)
 	arrayobject *self;
 	object *args;
 {
@@ -921,17 +965,19 @@
 	{"append",	array_append},
 	{"byteswap",	array_byteswap},
 /*	{"count",	array_count},*/
+	{"fromfile",	array_fromfile},
+	{"fromlist",	array_fromlist},
+	{"fromstring",	array_fromstring},
 /*	{"index",	array_index},*/
 	{"insert",	array_insert},
-/*	{"sort",	array_sort},*/
+	{"read",	array_fromfile},
 /*	{"remove",	array_remove},*/
-/*	{"reverse",	array_reverse},*/
-	{"read",	array_read},
-	{"write",	array_write},
-	{"fromlist",	array_fromlist},
+	{"reverse",	array_reverse},
+/*	{"sort",	array_sort},*/
+	{"tofile",	array_tofile},
 	{"tolist",	array_tolist},
-	{"fromstring",	array_fromstring},
 	{"tostring",	array_tostring},
+	{"write",	array_tofile},
 	{NULL,		NULL}		/* sentinel */
 };
 
diff --git a/Modules/config.c.in b/Modules/config.c.in
index fc80362..c9f56ac 100644
--- a/Modules/config.c.in
+++ b/Modules/config.c.in
@@ -62,12 +62,12 @@
 
 #include "patchlevel.h"
 
-#define VERSION "0.9.%d (%s)"
+#define VERSION "0.9.%d++ (%s)"
 
 #ifdef __DATE__
 #define DATE __DATE__
 #else
-#define DATE ">= 29 Jul 1993"
+#define DATE ">= 3 Nov 1993"
 #endif
 
 char version[80];
diff --git a/Modules/nismodule.c b/Modules/nismodule.c
index 9234127..5db26f4 100644
--- a/Modules/nismodule.c
+++ b/Modules/nismodule.c
@@ -67,9 +67,23 @@
 	object *indata;
 {
 	if (instatus == YP_TRUE) {
-		inkey[inkeylen]=0;
-		inval[invallen]=0;
-		dictinsert (indata, inkey, newstringobject (inval));
+		object *key = newsizedstringobject(inkey, inkeylen);
+		object *val = newsizedstringobject(inval, invallen);
+		int err;
+		if (key == NULL || val == NULL) {
+			/* XXX error -- don't know how to handle */
+			err_clear();
+			XDECREF(key);
+			XDECREF(val);
+			return 1;
+		}
+		err = mappinginsert(indata, key, val);
+		DECREF(key);
+		DECREF(val);
+		if (err != 0) {
+			err_clear();
+			return 1;
+		}
 		return 0;
 	}
 	return 1;
@@ -82,18 +96,18 @@
 {
 	char *match;
 	char *domain;
-	int len;
+	int keylen, len;
 	char *key, *map;
 	int err;
 	object *res;
 
-	if (!getargs(args, "(ss)", &key, &map))
+	if (!getargs(args, "(s#s)", &key, &keylen, &map))
 		return NULL;
 	if ((err = yp_get_default_domain(&domain)) != 0)
 		return nis_error(err);
 	BGN_SAVE
 	map = nis_mapname (map);
-	err = yp_match (domain, map, key, strlen (key), &match, &len);
+	err = yp_match (domain, map, key, keylen, &match, &len);
 	END_SAVE
 	if (err != 0)
 		return nis_error(err);
diff --git a/Modules/rotormodule.c b/Modules/rotormodule.c
index f01c5fe..d397e2c 100644
--- a/Modules/rotormodule.c
+++ b/Modules/rotormodule.c
@@ -154,7 +154,12 @@
 rotorobject *r;
 char *key;
 {
+#ifdef BUGGY_CODE_BW_COMPAT
+	/* See comments below */
 	int k1=995, k2=576, k3=767, k4=671, k5=463;
+#else
+	unsigned long k1=995, k2=576, k3=767, k4=671, k5=463;
+#endif
 	int i;
 	int len=strlen(key);
 	for (i=0;i<len;i++) {
diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c
index 5183069..9210bd1 100644
--- a/Python/bltinmodule.c
+++ b/Python/bltinmodule.c
@@ -67,7 +67,7 @@
 }
 
 static object *
-builtin_bagof(self, args)
+builtin_filter(self, args)
 	object *self;
 	object *args;
 {
@@ -101,7 +101,7 @@
 
 	if ((sqf = seq->ob_type->tp_as_sequence) == NULL) {
 		err_setstr(TypeError,
-			   "argument 2 to bagof() must be a sequence type");
+			   "argument 2 to filter() must be a sequence type");
 		goto Fail_2;
 	}
 
@@ -1121,7 +1121,6 @@
 static struct methodlist builtin_methods[] = {
 	{"abs",		builtin_abs},
 	{"apply",	builtin_apply},
-	{"bagof",	builtin_bagof},
 	{"chr",		builtin_chr},
 	{"cmp",		builtin_cmp},
 	{"coerce",	builtin_coerce},
@@ -1130,6 +1129,7 @@
 	{"divmod",	builtin_divmod},
 	{"eval",	builtin_eval},
 	{"execfile",	builtin_execfile},
+	{"filter",	builtin_filter},
 	{"float",	builtin_float},
 	{"getattr",	builtin_getattr},
 	{"hasattr",	builtin_hasattr},
@@ -1271,7 +1271,7 @@
 }
 
 
-/* Helper for bagof(): filter a tuple through a function */
+/* Helper for filter(): filter a tuple through a function */
 
 static object *
 filtertuple(func, tuple)
@@ -1324,7 +1324,7 @@
 }
 
 
-/* Helper for bagof(): filter a string through a function */
+/* Helper for filter(): filter a string through a function */
 
 static object *
 filterstring(func, strobj)
