diff --git a/Doc/lib/libarray.tex b/Doc/lib/libarray.tex
index 0e1a411..7be96aa 100644
--- a/Doc/lib/libarray.tex
+++ b/Doc/lib/libarray.tex
@@ -83,6 +83,14 @@
 data from a file written on a machine with a different byte order.
 \end{methoddesc}
 
+\begin{methoddesc}[array]{count}{x}
+Return the number of occurences of \var{x} in the array.
+\end{methoddesc}
+
+\begin{methoddesc}[array]{extend}{a}
+Append array items from \var{a} to the end of the array.
+\end{methoddesc}
+
 \begin{methoddesc}[array]{fromfile}{f, n}
 Read \var{n} items (as machine values) from the file object \var{f}
 and append them to the end of the array.  If less than \var{n} items
@@ -104,11 +112,22 @@
 file using the \method{fromfile()} method).
 \end{methoddesc}
 
+\begin{methoddesc}[array]{index}{x}
+Return the smallest \var{i} such that \var{i} is the index of
+the first occurence of \var{x} in the array.
+\end{methoddesc}
+
 \begin{methoddesc}[array]{insert}{i, x}
 Insert a new item with value \var{x} in the array before position
 \var{i}.
 \end{methoddesc}
 
+\begin{methoddesc}[array]{pop}{\optional{i}}
+Removes the item with the index \var{i} from the array and returns
+it. The optional argument defaults to \code{-1}, so that by default
+the last item is removed and returned. 
+\end{methoddesc}
+
 \begin{methoddesc}[array]{read}{f, n}
 \deprecated {1.5.1}
   {Use the \method{fromfile()} method.}
@@ -120,6 +139,10 @@
 do.
 \end{methoddesc}
 
+\begin{methoddesc}[array]{remove}{x}
+Remove the first occurence of \var{x} from the array.
+\end{methoddesc}
+
 \begin{methoddesc}[array]{reverse}{}
 Reverse the order of the items in the array.
 \end{methoddesc}
diff --git a/Doc/lib/libstdtypes.tex b/Doc/lib/libstdtypes.tex
index 2dca492..4f8020e 100644
--- a/Doc/lib/libstdtypes.tex
+++ b/Doc/lib/libstdtypes.tex
@@ -506,8 +506,8 @@
 \item[(3)] Raises \exception{ValueError} when \var{x} is not found in
   \var{s}.
 
-\item[(4)] The \method{pop()} method is experimental and not supported 
-  by other mutable sequence types than lists.  The optional argument
+\item[(4)] The \method{pop()} method is experimental and at the moment
+  only supported by the list and array types.  The optional argument
   \var{i} defaults to \code{-1}, so that by default the last item is
   removed and returned.
 
diff --git a/Lib/test/test_array.py b/Lib/test/test_array.py
index a82ace5..d3fe7e9 100755
--- a/Lib/test/test_array.py
+++ b/Lib/test/test_array.py
@@ -105,6 +105,26 @@
             a[1:-1] = a
             if a != array.array(type, "aabcdee"):
                 raise TestFailed, "array(%s) self-slice-assign (cntr)" % `type`
+            if a.index("e") != 5:
+            	raise TestFailed, "array(%s) index-test" % `type`
+            if a.count("a") != 2:
+            	raise TestFailed, "array(%s) count-test" % `type`
+            a.remove("e")
+            if a != array.array(type, "aabcde"):
+            	raise TestFailed, "array(%s) remove-test" % `type`
+            if a.pop(0) != "a":
+            	raise TestFailed, "array(%s) pop-test" % `type`
+            if a.pop(1) != "b":
+            	raise TestFailed, "array(%s) pop-test" % `type`
+            a.extend(array.array(type, "xyz"))
+            if a != array.array(type, "acdexyz"):
+                raise TestFailed, "array(%s) extend-test" % `type`
+            a.pop()
+            a.pop()
+            a.pop()
+            a.pop()
+            if a != array.array(type, "acd"):
+            	raise TestFailed, "array(%s) pop-test" % `type`
         else:
             a = array.array(type, [1, 2, 3, 4, 5])
             a[:-1] = a
@@ -118,6 +138,26 @@
             a[1:-1] = a
             if a != array.array(type, [1, 1, 2, 3, 4, 5, 5]):
                 raise TestFailed, "array(%s) self-slice-assign (cntr)" % `type`
+            if a.index(5) != 5:
+            	raise TestFailed, "array(%s) index-test" % `type`
+            if a.count(1) != 2:
+            	raise TestFailed, "array(%s) count-test" % `type`
+            a.remove(5)
+            if a != array.array(type, [1, 1, 2, 3, 4, 5]):
+            	raise TestFailed, "array(%s) remove-test" % `type`
+            if a.pop(0) != 1:
+            	raise TestFailed, "array(%s) pop-test" % `type`
+            if a.pop(1) != 2:
+            	raise TestFailed, "array(%s) pop-test" % `type`
+            a.extend(array.array(type, [7, 8, 9]))
+            if a != array.array(type, [1, 3, 4, 5, 7, 8, 9]):
+                raise TestFailed, "array(%s) extend-test" % `type`
+            a.pop()
+            a.pop()
+            a.pop()
+            a.pop()
+            if a != array.array(type, [1, 3, 4]):
+            	raise TestFailed, "array(%s) pop-test" % `type`
 
         # test that overflow exceptions are raised as expected for assignment
         # to array of specific integral types
diff --git a/Modules/arraymodule.c b/Modules/arraymodule.c
index 55a0dce..a011d30 100644
--- a/Modules/arraymodule.c
+++ b/Modules/arraymodule.c
@@ -674,6 +674,163 @@
 }
 
 static PyObject *
+array_count(arrayobject *self, PyObject *args)
+{
+	int count = 0;
+	int i;
+	PyObject *v;
+
+        if (!PyArg_ParseTuple(args, "O:count", &v))
+		return NULL;
+	for (i = 0; i < self->ob_size; i++) {
+		PyObject *selfi = getarrayitem((PyObject *)self, i);
+		if (PyObject_Compare(selfi, v) == 0)
+			count++;
+		Py_DECREF(selfi);
+		if (PyErr_Occurred())
+			return NULL;
+	}
+	return PyInt_FromLong((long)count);
+}
+
+static char count_doc [] =
+"count (x)\n\
+\n\
+Return number of occurences of x in the array.";
+
+static PyObject *
+array_index(arrayobject *self, PyObject *args)
+{
+	int i;
+	PyObject *v;
+
+	if (!PyArg_ParseTuple(args, "O:index", &v))
+		return NULL;
+	for (i = 0; i < self->ob_size; i++) {
+		PyObject *selfi = getarrayitem((PyObject *)self, i);
+		if (PyObject_Compare(selfi, v) == 0) {
+			Py_DECREF(selfi);
+			return PyInt_FromLong((long)i);
+		}
+		Py_DECREF(selfi);
+		if (PyErr_Occurred())
+			return NULL;
+	}
+	PyErr_SetString(PyExc_ValueError, "array.index(x): x not in list");
+	return NULL;
+}
+
+static char index_doc [] =
+"index (x)\n\
+\n\
+Return index of first occurence of x in the array.";
+
+static PyObject *
+array_remove(arrayobject *self, PyObject *args)
+{
+	int i;
+	PyObject *v;
+
+        if (!PyArg_ParseTuple(args, "O:remove", &v))
+		return NULL;
+	for (i = 0; i < self->ob_size; i++) {
+		PyObject *selfi = getarrayitem((PyObject *)self,i);
+		if (PyObject_Compare(selfi, v) == 0) {
+			Py_DECREF(selfi);
+			if (array_ass_slice(self, i, i+1,
+					   (PyObject *)NULL) != 0)
+				return NULL;
+			Py_INCREF(Py_None);
+			return Py_None;
+		}
+		Py_DECREF(selfi);
+		if (PyErr_Occurred())
+			return NULL;
+	}
+	PyErr_SetString(PyExc_ValueError, "array.remove(x): x not in list");
+	return NULL;
+}
+
+static char remove_doc [] =
+"remove (x)\n\
+\n\
+Remove the first occurence of x in the array.";
+
+static PyObject *
+array_pop(arrayobject *self, PyObject *args)
+{
+	int i = -1;
+	PyObject *v;
+	if (!PyArg_ParseTuple(args, "|i:pop", &i))
+		return NULL;
+	if (self->ob_size == 0) {
+		/* Special-case most common failure cause */
+		PyErr_SetString(PyExc_IndexError, "pop from empty array");
+		return NULL;
+	}
+	if (i < 0)
+		i += self->ob_size;
+	if (i < 0 || i >= self->ob_size) {
+		PyErr_SetString(PyExc_IndexError, "pop index out of range");
+		return NULL;
+	}
+	v = getarrayitem((PyObject *)self,i);
+	if (array_ass_slice(self, i, i+1, (PyObject *)NULL) != 0) {
+		Py_DECREF(v);
+		return NULL;
+	}
+	return v;
+}
+
+static char pop_doc [] =
+"pop ([i])\n\
+\n\
+Return the i-th element and delete it from the array. i defaults to -1.";
+
+static PyObject *
+array_extend(self, args)
+	arrayobject *self;
+	PyObject *args;
+{
+	int size;
+        PyObject    *bb;
+        arrayobject *np;
+        
+	if (!PyArg_ParseTuple(args, "O:extend", &bb))
+            return NULL;
+        
+	if (!is_arrayobject(bb)) {
+		PyErr_Format(PyExc_TypeError,
+			     "can only append array (not \"%.200s\") to array",
+			     bb->ob_type->tp_name);
+		return NULL;
+	}
+#define b ((arrayobject *)bb)
+	if (self->ob_descr != b->ob_descr) {
+		PyErr_SetString(PyExc_TypeError,
+			     "can only append arrays of same kind");
+		return NULL;
+	}
+	size = self->ob_size + b->ob_size;
+        PyMem_RESIZE(self->ob_item, char, size*self->ob_descr->itemsize);
+        if (self->ob_item == NULL) {
+                PyObject_Del(self);
+                return PyErr_NoMemory();
+        }
+	memcpy(self->ob_item + self->ob_size*self->ob_descr->itemsize,
+               b->ob_item, b->ob_size*b->ob_descr->itemsize);
+        self->ob_size = size;
+        Py_INCREF(Py_None);
+	return Py_None;
+#undef b
+}
+
+static char extend_doc [] =
+"extend(array)\n\
+\n\
+ Append array items to the end of the array.";
+
+static PyObject *
 array_insert(arrayobject *self, PyObject *args)
 {
 	int i;
@@ -816,74 +973,6 @@
 \n\
 Reverse the order of the items in the array.";
 
-/* The following routines were adapted from listobject.c but not converted.
-   To make them work you will have to work! */
-
-#if 0
-static PyObject *
-array_index(arrayobject *self, PyObject *args)
-{
-	int i;
-	
-	if (args == NULL) {
-		PyErr_BadArgument();
-		return NULL;
-	}
-	for (i = 0; i < self->ob_size; i++) {
-		if (PyObject_Compare(self->ob_item[i], args) == 0)
-			return PyInt_FromLong((long)i);
-		/* XXX PyErr_Occurred */
-	}
-	PyErr_SetString(PyExc_ValueError, "array.index(x): x not in array");
-	return NULL;
-}
-#endif
-
-#if 0
-static PyObject *
-array_count(arrayobject *self, PyObject *args)
-{
-	int count = 0;
-	int i;
-	
-	if (args == NULL) {
-		PyErr_BadArgument();
-		return NULL;
-	}
-	for (i = 0; i < self->ob_size; i++) {
-		if (PyObject_Compare(self->ob_item[i], args) == 0)
-			count++;
-		/* XXX PyErr_Occurred */
-	}
-	return PyInt_FromLong((long)count);
-}
-#endif
-
-#if 0
-static PyObject *
-array_remove(arrayobject *self, PyObject *args)
-{
-	int i;
-	
-	if (args == NULL) {
-		PyErr_BadArgument();
-		return NULL;
-	}
-	for (i = 0; i < self->ob_size; i++) {
-		if (PyObject_Compare(self->ob_item[i], args) == 0) {
-			if (array_ass_slice(self, i, i+1,
-					    (PyObject *)NULL) != 0)
-				return NULL;
-			Py_INCREF(Py_None);
-			return Py_None;
-		}
-		/* XXX PyErr_Occurred */
-	}
-	PyErr_SetString(PyExc_ValueError, "array.remove(x): x not in array");
-	return NULL;
-}
-#endif
-
 static PyObject *
 array_fromfile(arrayobject *self, PyObject *args)
 {
@@ -1095,16 +1184,18 @@
 	{"buffer_info", (PyCFunction)array_buffer_info, 0, buffer_info_doc},
 	{"byteswap",	(PyCFunction)array_byteswap, METH_VARARGS,
          byteswap_doc},
-/*	{"count",	(method)array_count},*/
+	{"count",	(PyCFunction)array_count, 1, count_doc},
+	{"extend",      (PyCFunction)array_extend, 1, extend_doc},
 	{"fromfile",	(PyCFunction)array_fromfile, 0, fromfile_doc},
 	{"fromlist",	(PyCFunction)array_fromlist, 0, fromlist_doc},
 	{"fromstring",	(PyCFunction)array_fromstring, 0, fromstring_doc},
-/*	{"index",	(method)array_index},*/
+	{"index",	(PyCFunction)array_index, 1, index_doc},
 	{"insert",	(PyCFunction)array_insert, 0, insert_doc},
+	{"pop",		(PyCFunction)array_pop, 1, pop_doc},
 	{"read",	(PyCFunction)array_fromfile, 0, fromfile_doc},
-/*	{"remove",	(method)array_remove},*/
+	{"remove",	(PyCFunction)array_remove, 1, remove_doc},
 	{"reverse",	(PyCFunction)array_reverse, 0, reverse_doc},
-/*	{"sort",	(method)array_sort},*/
+/*	{"sort",	(PyCFunction)array_sort, 0, sort_doc},*/
 	{"tofile",	(PyCFunction)array_tofile, 0, tofile_doc},
 	{"tolist",	(PyCFunction)array_tolist, 0, tolist_doc},
 	{"tostring",	(PyCFunction)array_tostring, 0, tostring_doc},
@@ -1364,11 +1455,16 @@
 append() -- append a new item to the end of the array\n\
 buffer_info() -- return information giving the current memory info\n\
 byteswap() -- byteswap all the items of the array\n\
+count() -- return number of occurences of an object\n\
+extend() -- extend array by appending array elements\n\
 fromfile() -- read items from a file object\n\
 fromlist() -- append items from the list\n\
 fromstring() -- append items from the string\n\
+index() -- return index of first occurence of an object\n\
 insert() -- insert a new item into the array at a provided position\n\
+pop() -- remove and return item (default last)\n\
 read() -- DEPRECATED, use fromfile()\n\
+remove() -- remove first occurence of an object\n\
 reverse() -- reverse the order of the items in the array\n\
 tofile() -- write all items to a file object\n\
 tolist() -- return the array converted to an ordinary list\n\
