diff --git a/Objects/bytesobject.c b/Objects/bytesobject.c
index f306cb8..fb4a845 100644
--- a/Objects/bytesobject.c
+++ b/Objects/bytesobject.c
@@ -365,7 +365,7 @@
 }
 
 static void
-string_dealloc(PyObject *op)
+bytes_dealloc(PyObject *op)
 {
 	Py_TYPE(op)->tp_free(op);
 }
@@ -662,31 +662,31 @@
 }
 
 static PyObject *
-string_repr(PyObject *op)
+bytes_repr(PyObject *op)
 {
 	return PyBytes_Repr(op, 1);
 }
 
 static PyObject *
-string_str(PyObject *op)
+bytes_str(PyObject *op)
 {
 	if (Py_BytesWarningFlag) {
 		if (PyErr_WarnEx(PyExc_BytesWarning,
 				 "str() on a bytes instance", 1))
 			return NULL;
 	}
-	return string_repr(op);
+	return bytes_repr(op);
 }
 
 static Py_ssize_t
-string_length(PyBytesObject *a)
+bytes_length(PyBytesObject *a)
 {
 	return Py_SIZE(a);
 }
 
 /* This is also used by PyBytes_Concat() */
 static PyObject *
-string_concat(PyObject *a, PyObject *b)
+bytes_concat(PyObject *a, PyObject *b)
 {
 	Py_ssize_t size;
 	Py_buffer va, vb;
@@ -734,7 +734,7 @@
 }
 
 static PyObject *
-string_repeat(register PyBytesObject *a, register Py_ssize_t n)
+bytes_repeat(register PyBytesObject *a, register Py_ssize_t n)
 {
 	register Py_ssize_t i;
 	register Py_ssize_t j;
@@ -786,7 +786,7 @@
 }
 
 static int
-string_contains(PyObject *self, PyObject *arg)
+bytes_contains(PyObject *self, PyObject *arg)
 {
     Py_ssize_t ival = PyNumber_AsSsize_t(arg, PyExc_ValueError);
     if (ival == -1 && PyErr_Occurred()) {
@@ -809,7 +809,7 @@
 }
 
 static PyObject *
-string_item(PyBytesObject *a, register Py_ssize_t i)
+bytes_item(PyBytesObject *a, register Py_ssize_t i)
 {
 	if (i < 0 || i >= Py_SIZE(a)) {
 		PyErr_SetString(PyExc_IndexError, "index out of range");
@@ -819,7 +819,7 @@
 }
 
 static PyObject*
-string_richcompare(PyBytesObject *a, PyBytesObject *b, int op)
+bytes_richcompare(PyBytesObject *a, PyBytesObject *b, int op)
 {
 	int c;
 	Py_ssize_t len_a, len_b;
@@ -890,7 +890,7 @@
 }
 
 static long
-string_hash(PyBytesObject *a)
+bytes_hash(PyBytesObject *a)
 {
 	register Py_ssize_t len;
 	register unsigned char *p;
@@ -911,7 +911,7 @@
 }
 
 static PyObject*
-string_subscript(PyBytesObject* self, PyObject* item)
+bytes_subscript(PyBytesObject* self, PyObject* item)
 {
 	if (PyIndex_Check(item)) {
 		Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
@@ -976,31 +976,31 @@
 }
 
 static int
-string_buffer_getbuffer(PyBytesObject *self, Py_buffer *view, int flags)
+bytes_buffer_getbuffer(PyBytesObject *self, Py_buffer *view, int flags)
 {
 	return PyBuffer_FillInfo(view, (PyObject*)self, (void *)self->ob_sval, Py_SIZE(self),
 				 1, flags);
 }
 
-static PySequenceMethods string_as_sequence = {
-	(lenfunc)string_length, /*sq_length*/
-	(binaryfunc)string_concat, /*sq_concat*/
-	(ssizeargfunc)string_repeat, /*sq_repeat*/
-	(ssizeargfunc)string_item, /*sq_item*/
+static PySequenceMethods bytes_as_sequence = {
+	(lenfunc)bytes_length, /*sq_length*/
+	(binaryfunc)bytes_concat, /*sq_concat*/
+	(ssizeargfunc)bytes_repeat, /*sq_repeat*/
+	(ssizeargfunc)bytes_item, /*sq_item*/
 	0,		/*sq_slice*/
 	0,		/*sq_ass_item*/
 	0,		/*sq_ass_slice*/
-	(objobjproc)string_contains /*sq_contains*/
+	(objobjproc)bytes_contains /*sq_contains*/
 };
 
-static PyMappingMethods string_as_mapping = {
-	(lenfunc)string_length,
-	(binaryfunc)string_subscript,
+static PyMappingMethods bytes_as_mapping = {
+	(lenfunc)bytes_length,
+	(binaryfunc)bytes_subscript,
 	0,
 };
 
-static PyBufferProcs string_as_buffer = {
-	(getbufferproc)string_buffer_getbuffer,
+static PyBufferProcs bytes_as_buffer = {
+	(getbufferproc)bytes_buffer_getbuffer,
 	NULL,
 };
 
@@ -1150,7 +1150,7 @@
 If maxsplit is given, at most maxsplit splits are done.");
 
 static PyObject *
-string_split(PyBytesObject *self, PyObject *args)
+bytes_split(PyBytesObject *self, PyObject *args)
 {
 	Py_ssize_t len = PyBytes_GET_SIZE(self), n, i, j;
 	Py_ssize_t maxsplit = -1, count=0;
@@ -1230,7 +1230,7 @@
 found, returns B and two empty bytes objects.");
 
 static PyObject *
-string_partition(PyBytesObject *self, PyObject *sep_obj)
+bytes_partition(PyBytesObject *self, PyObject *sep_obj)
 {
 	const char *sep;
 	Py_ssize_t sep_len;
@@ -1258,7 +1258,7 @@
 bytes objects and B.");
 
 static PyObject *
-string_rpartition(PyBytesObject *self, PyObject *sep_obj)
+bytes_rpartition(PyBytesObject *self, PyObject *sep_obj)
 {
 	const char *sep;
 	Py_ssize_t sep_len;
@@ -1372,7 +1372,7 @@
 
 
 static PyObject *
-string_rsplit(PyBytesObject *self, PyObject *args)
+bytes_rsplit(PyBytesObject *self, PyObject *args)
 {
 	Py_ssize_t len = PyBytes_GET_SIZE(self), n, i, j;
 	Py_ssize_t maxsplit = -1, count=0;
@@ -1447,7 +1447,7 @@
 Example: b'.'.join([b'ab', b'pq', b'rs']) -> b'ab.pq.rs'.");
 
 static PyObject *
-string_join(PyObject *self, PyObject *orig)
+bytes_join(PyObject *self, PyObject *orig)
 {
 	char *sep = PyBytes_AS_STRING(self);
 	const Py_ssize_t seplen = PyBytes_GET_SIZE(self);
@@ -1542,11 +1542,11 @@
 {
 	assert(sep != NULL && PyBytes_Check(sep));
 	assert(x != NULL);
-	return string_join(sep, x);
+	return bytes_join(sep, x);
 }
 
 Py_LOCAL_INLINE(void)
-string_adjust_indices(Py_ssize_t *start, Py_ssize_t *end, Py_ssize_t len)
+bytes_adjust_indices(Py_ssize_t *start, Py_ssize_t *end, Py_ssize_t len)
 {
 	if (*end > len)
 		*end = len;
@@ -1561,7 +1561,7 @@
 }
 
 Py_LOCAL_INLINE(Py_ssize_t)
-string_find_internal(PyBytesObject *self, PyObject *args, int dir)
+bytes_find_internal(PyBytesObject *self, PyObject *args, int dir)
 {
 	PyObject *subobj;
 	const char *sub;
@@ -1612,9 +1612,9 @@
 Return -1 on failure.");
 
 static PyObject *
-string_find(PyBytesObject *self, PyObject *args)
+bytes_find(PyBytesObject *self, PyObject *args)
 {
-	Py_ssize_t result = string_find_internal(self, args, +1);
+	Py_ssize_t result = bytes_find_internal(self, args, +1);
 	if (result == -2)
 		return NULL;
 	return PyLong_FromSsize_t(result);
@@ -1627,9 +1627,9 @@
 Like B.find() but raise ValueError when the substring is not found.");
 
 static PyObject *
-string_index(PyBytesObject *self, PyObject *args)
+bytes_index(PyBytesObject *self, PyObject *args)
 {
-	Py_ssize_t result = string_find_internal(self, args, +1);
+	Py_ssize_t result = bytes_find_internal(self, args, +1);
 	if (result == -2)
 		return NULL;
 	if (result == -1) {
@@ -1651,9 +1651,9 @@
 Return -1 on failure.");
 
 static PyObject *
-string_rfind(PyBytesObject *self, PyObject *args)
+bytes_rfind(PyBytesObject *self, PyObject *args)
 {
-	Py_ssize_t result = string_find_internal(self, args, -1);
+	Py_ssize_t result = bytes_find_internal(self, args, -1);
 	if (result == -2)
 		return NULL;
 	return PyLong_FromSsize_t(result);
@@ -1666,9 +1666,9 @@
 Like B.rfind() but raise ValueError when the substring is not found.");
 
 static PyObject *
-string_rindex(PyBytesObject *self, PyObject *args)
+bytes_rindex(PyBytesObject *self, PyObject *args)
 {
-	Py_ssize_t result = string_find_internal(self, args, -1);
+	Py_ssize_t result = bytes_find_internal(self, args, -1);
 	if (result == -2)
 		return NULL;
 	if (result == -1) {
@@ -1772,7 +1772,7 @@
 Strip leading and trailing bytes contained in the argument.\n\
 If the argument is omitted, strip trailing ASCII whitespace.");
 static PyObject *
-string_strip(PyBytesObject *self, PyObject *args)
+bytes_strip(PyBytesObject *self, PyObject *args)
 {
 	if (PyTuple_GET_SIZE(args) == 0)
 		return do_strip(self, BOTHSTRIP); /* Common case */
@@ -1787,7 +1787,7 @@
 Strip leading bytes contained in the argument.\n\
 If the argument is omitted, strip leading ASCII whitespace.");
 static PyObject *
-string_lstrip(PyBytesObject *self, PyObject *args)
+bytes_lstrip(PyBytesObject *self, PyObject *args)
 {
 	if (PyTuple_GET_SIZE(args) == 0)
 		return do_strip(self, LEFTSTRIP); /* Common case */
@@ -1802,7 +1802,7 @@
 Strip trailing bytes contained in the argument.\n\
 If the argument is omitted, strip trailing ASCII whitespace.");
 static PyObject *
-string_rstrip(PyBytesObject *self, PyObject *args)
+bytes_rstrip(PyBytesObject *self, PyObject *args)
 {
 	if (PyTuple_GET_SIZE(args) == 0)
 		return do_strip(self, RIGHTSTRIP); /* Common case */
@@ -1819,7 +1819,7 @@
 as in slice notation.");
 
 static PyObject *
-string_count(PyBytesObject *self, PyObject *args)
+bytes_count(PyBytesObject *self, PyObject *args)
 {
 	PyObject *sub_obj;
 	const char *str = PyBytes_AS_STRING(self), *sub;
@@ -1837,7 +1837,7 @@
 	else if (PyObject_AsCharBuffer(sub_obj, &sub, &sub_len))
 		return NULL;
 
-	string_adjust_indices(&start, &end, PyBytes_GET_SIZE(self));
+	bytes_adjust_indices(&start, &end, PyBytes_GET_SIZE(self));
 
 	return PyLong_FromSsize_t(
 		stringlib_count(str + start, end - start, sub, sub_len)
@@ -1854,7 +1854,7 @@
 table, which must be a bytes object of length 256.");
 
 static PyObject *
-string_translate(PyBytesObject *self, PyObject *args)
+bytes_translate(PyBytesObject *self, PyObject *args)
 {
 	register char *input, *output;
 	const char *table;
@@ -1952,7 +1952,7 @@
 
 
 static PyObject *
-string_maketrans(PyObject *null, PyObject *args)
+bytes_maketrans(PyObject *null, PyObject *args)
 {
 	return _Py_bytes_maketrans(args);
 }
@@ -2560,7 +2560,7 @@
 given, only the first count occurrences are replaced.");
 
 static PyObject *
-string_replace(PyBytesObject *self, PyObject *args)
+bytes_replace(PyBytesObject *self, PyObject *args)
 {
 	Py_ssize_t count = -1;
 	PyObject *from, *to;
@@ -2596,7 +2596,7 @@
  * -1 on error, 0 if not found and 1 if found.
  */
 Py_LOCAL(int)
-_string_tailmatch(PyBytesObject *self, PyObject *substr, Py_ssize_t start,
+_bytes_tailmatch(PyBytesObject *self, PyObject *substr, Py_ssize_t start,
 		  Py_ssize_t end, int direction)
 {
 	Py_ssize_t len = PyBytes_GET_SIZE(self);
@@ -2612,7 +2612,7 @@
 		return -1;
 	str = PyBytes_AS_STRING(self);
 
-	string_adjust_indices(&start, &end, len);
+	bytes_adjust_indices(&start, &end, len);
 
 	if (direction < 0) {
 		/* startswith */
@@ -2641,7 +2641,7 @@
 prefix can also be a tuple of bytes to try.");
 
 static PyObject *
-string_startswith(PyBytesObject *self, PyObject *args)
+bytes_startswith(PyBytesObject *self, PyObject *args)
 {
 	Py_ssize_t start = 0;
 	Py_ssize_t end = PY_SSIZE_T_MAX;
@@ -2654,7 +2654,7 @@
 	if (PyTuple_Check(subobj)) {
 		Py_ssize_t i;
 		for (i = 0; i < PyTuple_GET_SIZE(subobj); i++) {
-			result = _string_tailmatch(self,
+			result = _bytes_tailmatch(self,
 					PyTuple_GET_ITEM(subobj, i),
 					start, end, -1);
 			if (result == -1)
@@ -2665,7 +2665,7 @@
 		}
 		Py_RETURN_FALSE;
 	}
-	result = _string_tailmatch(self, subobj, start, end, -1);
+	result = _bytes_tailmatch(self, subobj, start, end, -1);
 	if (result == -1)
 		return NULL;
 	else
@@ -2682,7 +2682,7 @@
 suffix can also be a tuple of bytes to try.");
 
 static PyObject *
-string_endswith(PyBytesObject *self, PyObject *args)
+bytes_endswith(PyBytesObject *self, PyObject *args)
 {
 	Py_ssize_t start = 0;
 	Py_ssize_t end = PY_SSIZE_T_MAX;
@@ -2695,7 +2695,7 @@
 	if (PyTuple_Check(subobj)) {
 		Py_ssize_t i;
 		for (i = 0; i < PyTuple_GET_SIZE(subobj); i++) {
-			result = _string_tailmatch(self,
+			result = _bytes_tailmatch(self,
 					PyTuple_GET_ITEM(subobj, i),
 					start, end, +1);
 			if (result == -1)
@@ -2706,7 +2706,7 @@
 		}
 		Py_RETURN_FALSE;
 	}
-	result = _string_tailmatch(self, subobj, start, end, +1);
+	result = _bytes_tailmatch(self, subobj, start, end, +1);
 	if (result == -1)
 		return NULL;
 	else
@@ -2725,7 +2725,7 @@
 able to handle UnicodeDecodeErrors.");
 
 static PyObject *
-string_decode(PyObject *self, PyObject *args)
+bytes_decode(PyObject *self, PyObject *args)
 {
 	const char *encoding = NULL;
 	const char *errors = NULL;
@@ -2762,7 +2762,7 @@
 }
 
 static PyObject *
-string_fromhex(PyObject *cls, PyObject *args)
+bytes_fromhex(PyObject *cls, PyObject *args)
 {
 	PyObject *newstring, *hexobj;
 	char *buf;
@@ -2806,10 +2806,10 @@
 }
 
 PyDoc_STRVAR(sizeof__doc__,
-"S.__sizeof__() -> size of S in memory, in bytes");
+"B.__sizeof__() -> size of B in memory, in bytes");
 
 static PyObject *
-string_sizeof(PyBytesObject *v)
+bytes_sizeof(PyBytesObject *v)
 {
 	Py_ssize_t res;
 	res = PyBytesObject_SIZE + Py_SIZE(v) * Py_TYPE(v)->tp_itemsize;
@@ -2818,28 +2818,28 @@
 
 
 static PyObject *
-string_getnewargs(PyBytesObject *v)
+bytes_getnewargs(PyBytesObject *v)
 {
 	return Py_BuildValue("(s#)", v->ob_sval, Py_SIZE(v));
 }
 
 
 static PyMethodDef
-string_methods[] = {
-	{"__getnewargs__",	(PyCFunction)string_getnewargs,	METH_NOARGS},
+bytes_methods[] = {
+	{"__getnewargs__",	(PyCFunction)bytes_getnewargs,	METH_NOARGS},
 	{"capitalize", (PyCFunction)stringlib_capitalize, METH_NOARGS,
 	 _Py_capitalize__doc__},
 	{"center", (PyCFunction)stringlib_center, METH_VARARGS, center__doc__},
-	{"count", (PyCFunction)string_count, METH_VARARGS, count__doc__},
-	{"decode", (PyCFunction)string_decode, METH_VARARGS, decode__doc__},
-	{"endswith", (PyCFunction)string_endswith, METH_VARARGS,
+	{"count", (PyCFunction)bytes_count, METH_VARARGS, count__doc__},
+	{"decode", (PyCFunction)bytes_decode, METH_VARARGS, decode__doc__},
+	{"endswith", (PyCFunction)bytes_endswith, METH_VARARGS,
          endswith__doc__},
 	{"expandtabs", (PyCFunction)stringlib_expandtabs, METH_VARARGS,
 	 expandtabs__doc__},
-	{"find", (PyCFunction)string_find, METH_VARARGS, find__doc__},
-        {"fromhex", (PyCFunction)string_fromhex, METH_VARARGS|METH_CLASS,
+	{"find", (PyCFunction)bytes_find, METH_VARARGS, find__doc__},
+        {"fromhex", (PyCFunction)bytes_fromhex, METH_VARARGS|METH_CLASS,
          fromhex_doc},
-	{"index", (PyCFunction)string_index, METH_VARARGS, index__doc__},
+	{"index", (PyCFunction)bytes_index, METH_VARARGS, index__doc__},
 	{"isalnum", (PyCFunction)stringlib_isalnum, METH_NOARGS,
          _Py_isalnum__doc__},
 	{"isalpha", (PyCFunction)stringlib_isalpha, METH_NOARGS,
@@ -2854,35 +2854,35 @@
          _Py_istitle__doc__},
 	{"isupper", (PyCFunction)stringlib_isupper, METH_NOARGS,
          _Py_isupper__doc__},
-	{"join", (PyCFunction)string_join, METH_O, join__doc__},
+	{"join", (PyCFunction)bytes_join, METH_O, join__doc__},
 	{"ljust", (PyCFunction)stringlib_ljust, METH_VARARGS, ljust__doc__},
 	{"lower", (PyCFunction)stringlib_lower, METH_NOARGS, _Py_lower__doc__},
-	{"lstrip", (PyCFunction)string_lstrip, METH_VARARGS, lstrip__doc__},
-	{"maketrans", (PyCFunction)string_maketrans, METH_VARARGS|METH_STATIC,
+	{"lstrip", (PyCFunction)bytes_lstrip, METH_VARARGS, lstrip__doc__},
+	{"maketrans", (PyCFunction)bytes_maketrans, METH_VARARGS|METH_STATIC,
 	 _Py_maketrans__doc__},
-	{"partition", (PyCFunction)string_partition, METH_O, partition__doc__},
-	{"replace", (PyCFunction)string_replace, METH_VARARGS, replace__doc__},
-	{"rfind", (PyCFunction)string_rfind, METH_VARARGS, rfind__doc__},
-	{"rindex", (PyCFunction)string_rindex, METH_VARARGS, rindex__doc__},
+	{"partition", (PyCFunction)bytes_partition, METH_O, partition__doc__},
+	{"replace", (PyCFunction)bytes_replace, METH_VARARGS, replace__doc__},
+	{"rfind", (PyCFunction)bytes_rfind, METH_VARARGS, rfind__doc__},
+	{"rindex", (PyCFunction)bytes_rindex, METH_VARARGS, rindex__doc__},
 	{"rjust", (PyCFunction)stringlib_rjust, METH_VARARGS, rjust__doc__},
-	{"rpartition", (PyCFunction)string_rpartition, METH_O,
+	{"rpartition", (PyCFunction)bytes_rpartition, METH_O,
 	 rpartition__doc__},
-	{"rsplit", (PyCFunction)string_rsplit, METH_VARARGS, rsplit__doc__},
-	{"rstrip", (PyCFunction)string_rstrip, METH_VARARGS, rstrip__doc__},
-	{"split", (PyCFunction)string_split, METH_VARARGS, split__doc__},
+	{"rsplit", (PyCFunction)bytes_rsplit, METH_VARARGS, rsplit__doc__},
+	{"rstrip", (PyCFunction)bytes_rstrip, METH_VARARGS, rstrip__doc__},
+	{"split", (PyCFunction)bytes_split, METH_VARARGS, split__doc__},
 	{"splitlines", (PyCFunction)stringlib_splitlines, METH_VARARGS,
 	 splitlines__doc__},
-	{"startswith", (PyCFunction)string_startswith, METH_VARARGS,
+	{"startswith", (PyCFunction)bytes_startswith, METH_VARARGS,
          startswith__doc__},
-	{"strip", (PyCFunction)string_strip, METH_VARARGS, strip__doc__},
+	{"strip", (PyCFunction)bytes_strip, METH_VARARGS, strip__doc__},
 	{"swapcase", (PyCFunction)stringlib_swapcase, METH_NOARGS,
 	 _Py_swapcase__doc__},
 	{"title", (PyCFunction)stringlib_title, METH_NOARGS, _Py_title__doc__},
-	{"translate", (PyCFunction)string_translate, METH_VARARGS,
+	{"translate", (PyCFunction)bytes_translate, METH_VARARGS,
 	 translate__doc__},
 	{"upper", (PyCFunction)stringlib_upper, METH_NOARGS, _Py_upper__doc__},
 	{"zfill", (PyCFunction)stringlib_zfill, METH_VARARGS, zfill__doc__},
-	{"__sizeof__", (PyCFunction)string_sizeof, METH_NOARGS,
+	{"__sizeof__", (PyCFunction)bytes_sizeof, METH_NOARGS,
 	 sizeof__doc__},
 	{NULL,     NULL}		     /* sentinel */
 };
@@ -2891,7 +2891,7 @@
 str_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
 
 static PyObject *
-string_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
+bytes_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 {
 	PyObject *x = NULL;
 	const char *encoding = NULL;
@@ -3058,7 +3058,7 @@
 	Py_ssize_t n;
 
 	assert(PyType_IsSubtype(type, &PyBytes_Type));
-	tmp = string_new(&PyBytes_Type, args, kwds);
+	tmp = bytes_new(&PyBytes_Type, args, kwds);
 	if (tmp == NULL)
 		return NULL;
 	assert(PyBytes_CheckExact(tmp));
@@ -3074,7 +3074,7 @@
 	return pnew;
 }
 
-PyDoc_STRVAR(string_doc,
+PyDoc_STRVAR(bytes_doc,
 "bytes(iterable_of_ints) -> bytes\n\
 bytes(string, encoding[, errors]) -> bytes\n\
 bytes(bytes_or_buffer) -> immutable copy of bytes_or_buffer\n\
@@ -3086,38 +3086,38 @@
   - a bytes or a buffer object\n\
   - any object implementing the buffer API.");
 
-static PyObject *str_iter(PyObject *seq);
+static PyObject *bytes_iter(PyObject *seq);
 
 PyTypeObject PyBytes_Type = {
 	PyVarObject_HEAD_INIT(&PyType_Type, 0)
 	"bytes",
 	PyBytesObject_SIZE,
 	sizeof(char),
- 	string_dealloc, 			/* tp_dealloc */
+ 	bytes_dealloc, 			/* tp_dealloc */
 	0,			 		/* tp_print */
 	0,					/* tp_getattr */
 	0,					/* tp_setattr */
 	0,					/* tp_reserved */
-	(reprfunc)string_repr, 			/* tp_repr */
+	(reprfunc)bytes_repr, 			/* tp_repr */
 	0,					/* tp_as_number */
-	&string_as_sequence,			/* tp_as_sequence */
-	&string_as_mapping,			/* tp_as_mapping */
-	(hashfunc)string_hash, 			/* tp_hash */
+	&bytes_as_sequence,			/* tp_as_sequence */
+	&bytes_as_mapping,			/* tp_as_mapping */
+	(hashfunc)bytes_hash, 			/* tp_hash */
 	0,					/* tp_call */
-	string_str,				/* tp_str */
+	bytes_str,				/* tp_str */
 	PyObject_GenericGetAttr,		/* tp_getattro */
 	0,					/* tp_setattro */
-	&string_as_buffer,			/* tp_as_buffer */
+	&bytes_as_buffer,			/* tp_as_buffer */
 	Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE |
 		Py_TPFLAGS_BYTES_SUBCLASS,	/* tp_flags */
-	string_doc,				/* tp_doc */
+	bytes_doc,				/* tp_doc */
 	0,					/* tp_traverse */
 	0,					/* tp_clear */
-	(richcmpfunc)string_richcompare,	/* tp_richcompare */
+	(richcmpfunc)bytes_richcompare,	        /* tp_richcompare */
 	0,					/* tp_weaklistoffset */
-	str_iter,				/* tp_iter */
+	bytes_iter,				/* tp_iter */
 	0,					/* tp_iternext */
-	string_methods,				/* tp_methods */
+	bytes_methods,				/* tp_methods */
 	0,					/* tp_members */
 	0,					/* tp_getset */
 	&PyBaseObject_Type,			/* tp_base */
@@ -3127,7 +3127,7 @@
 	0,					/* tp_dictoffset */
 	0,					/* tp_init */
 	0,					/* tp_alloc */
-	string_new,				/* tp_new */
+	bytes_new,				/* tp_new */
 	PyObject_Del,	                	/* tp_free */
 };
 
@@ -3143,7 +3143,7 @@
 		*pv = NULL;
 		return;
 	}
-	v = string_concat(*pv, w);
+	v = bytes_concat(*pv, w);
 	Py_DECREF(*pv);
 	*pv = v;
 }
@@ -3455,7 +3455,7 @@
 };
 
 static PyObject *
-str_iter(PyObject *seq)
+bytes_iter(PyObject *seq)
 {
 	striterobject *it;
 
