The real suport for augmented assignment: new opcodes, new PyNumber and
PySequence methods and functions, new tokens.
diff --git a/Include/abstract.h b/Include/abstract.h
index fe1fa4b..9c18bbd 100644
--- a/Include/abstract.h
+++ b/Include/abstract.h
@@ -664,6 +664,108 @@
 	 float(o).
        */
 	 
+/*  In-place variants of (some of) the above number protocol functions */
+
+     DL_IMPORT(PyObject *) PyNumber_InPlaceAdd(PyObject *o1, PyObject *o2);
+
+       /*
+	 Returns the result of adding o2 to o1, possibly in-place, or null
+	 on failure.  This is the equivalent of the Python expression:
+	 o1 += o2.
+
+       */
+
+     DL_IMPORT(PyObject *) PyNumber_InPlaceSubtract(PyObject *o1, PyObject *o2);
+
+       /*
+	 Returns the result of subtracting o2 from o1, possibly in-place or
+	 null on failure.  This is the equivalent of the Python expression:
+	 o1 -= o2.
+
+       */
+
+     DL_IMPORT(PyObject *) PyNumber_InPlaceMultiply(PyObject *o1, PyObject *o2);
+
+       /*
+	 Returns the result of multiplying o1 by o2, possibly in-place, or
+	 null on failure.  This is the equivalent of the Python expression:
+	 o1 *= o2.
+
+       */
+
+     DL_IMPORT(PyObject *) PyNumber_InPlaceDivide(PyObject *o1, PyObject *o2);
+
+       /*
+	 Returns the result of dividing o1 by o2, possibly in-place, or null
+	 on failure.  This is the equivalent of the Python expression:
+	 o1 /= o2.
+
+       */
+
+     DL_IMPORT(PyObject *) PyNumber_InPlaceRemainder(PyObject *o1, PyObject *o2);
+
+       /*
+	 Returns the remainder of dividing o1 by o2, possibly in-place, or
+	 null on failure.  This is the equivalent of the Python expression:
+	 o1 %= o2.
+
+       */
+
+     DL_IMPORT(PyObject *) PyNumber_InPlacePower(PyObject *o1, PyObject *o2,
+     						 PyObject *o3);
+
+       /*
+	 Returns the result of raising o1 to the power of o2, possibly
+	 in-place, or null on failure.  This is the equivalent of the Python
+	 expression: o1 **= o2, or pow(o1, o2, o3) if o3 is present.
+
+       */
+
+     DL_IMPORT(PyObject *) PyNumber_InPlaceLshift(PyObject *o1, PyObject *o2);
+
+       /*
+	 Returns the result of left shifting o1 by o2, possibly in-place, or
+	 null on failure.  This is the equivalent of the Python expression:
+	 o1 <<= o2.
+
+       */
+
+     DL_IMPORT(PyObject *) PyNumber_InPlaceRshift(PyObject *o1, PyObject *o2);
+
+       /*
+	 Returns the result of right shifting o1 by o2, possibly in-place or
+	 null on failure.  This is the equivalent of the Python expression:
+	 o1 >>= o2.
+
+       */
+
+     DL_IMPORT(PyObject *) PyNumber_InPlaceAnd(PyObject *o1, PyObject *o2);
+
+       /*
+	 Returns the result of bitwise and of o1 and o2, possibly in-place,
+	 or null on failure. This is the equivalent of the Python
+	 expression: o1 &= o2.
+
+       */
+
+     DL_IMPORT(PyObject *) PyNumber_InPlaceXor(PyObject *o1, PyObject *o2);
+
+       /*
+	 Returns the bitwise exclusive or of o1 by o2, possibly in-place, or
+	 null on failure.  This is the equivalent of the Python expression:
+	 o1 ^= o2.
+
+       */
+
+     DL_IMPORT(PyObject *) PyNumber_InPlaceOr(PyObject *o1, PyObject *o2);
+
+       /*
+	 Returns the result of bitwise or or o1 and o2, possibly in-place,
+	 or null on failure.  This is the equivalent of the Python
+	 expression: o1 |= o2.
+
+       */
+
 
 /*  Sequence protocol:*/
 
@@ -824,6 +926,26 @@
 	 expression: o.index(value).
        */
 
+/* In-place versions of some of the above Sequence functions. */
+
+     DL_IMPORT(PyObject *) PySequence_InPlaceConcat(PyObject *o1, PyObject *o2);
+
+       /*
+	 Append o2 to o1, in-place when possible. Return the resulting
+	 object, which could be o1, or NULL on failure.  This is the
+	 equivalent of the Python expression: o1 += o2.
+
+       */
+
+     DL_IMPORT(PyObject *) PySequence_InPlaceRepeat(PyObject *o, int count);
+
+       /*
+	 Repeat o1 by count, in-place when possible. Return the resulting
+	 object, which could be o1, or NULL on failure.  This is the
+	 equivalent of the Python expression: o1 *= count.
+
+       */
+
 /*  Mapping protocol:*/
 
      DL_IMPORT(int) PyMapping_Check(PyObject *o);
diff --git a/Include/classobject.h b/Include/classobject.h
index 2902e77..67416e4 100644
--- a/Include/classobject.h
+++ b/Include/classobject.h
@@ -73,6 +73,10 @@
                                                 PyObject * (*)(PyObject *,
                                                                PyObject *));
 
+extern DL_IMPORT(int)
+PyInstance_HalfBinOp(PyObject *, PyObject *, char *, PyObject **,
+			PyObject * (*)(PyObject *, PyObject *), int);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/Include/graminit.h b/Include/graminit.h
index e0f2c2a..350df35 100644
--- a/Include/graminit.h
+++ b/Include/graminit.h
@@ -10,54 +10,55 @@
 #define simple_stmt 265
 #define small_stmt 266
 #define expr_stmt 267
-#define print_stmt 268
-#define del_stmt 269
-#define pass_stmt 270
-#define flow_stmt 271
-#define break_stmt 272
-#define continue_stmt 273
-#define return_stmt 274
-#define raise_stmt 275
-#define import_stmt 276
-#define import_as_name 277
-#define dotted_as_name 278
-#define dotted_name 279
-#define global_stmt 280
-#define exec_stmt 281
-#define assert_stmt 282
-#define compound_stmt 283
-#define if_stmt 284
-#define while_stmt 285
-#define for_stmt 286
-#define try_stmt 287
-#define except_clause 288
-#define suite 289
-#define test 290
-#define and_test 291
-#define not_test 292
-#define comparison 293
-#define comp_op 294
-#define expr 295
-#define xor_expr 296
-#define and_expr 297
-#define shift_expr 298
-#define arith_expr 299
-#define term 300
-#define factor 301
-#define power 302
-#define atom 303
-#define listmaker 304
-#define lambdef 305
-#define trailer 306
-#define subscriptlist 307
-#define subscript 308
-#define sliceop 309
-#define exprlist 310
-#define testlist 311
-#define dictmaker 312
-#define classdef 313
-#define arglist 314
-#define argument 315
-#define list_iter 316
-#define list_for 317
-#define list_if 318
+#define augassign 268
+#define print_stmt 269
+#define del_stmt 270
+#define pass_stmt 271
+#define flow_stmt 272
+#define break_stmt 273
+#define continue_stmt 274
+#define return_stmt 275
+#define raise_stmt 276
+#define import_stmt 277
+#define import_as_name 278
+#define dotted_as_name 279
+#define dotted_name 280
+#define global_stmt 281
+#define exec_stmt 282
+#define assert_stmt 283
+#define compound_stmt 284
+#define if_stmt 285
+#define while_stmt 286
+#define for_stmt 287
+#define try_stmt 288
+#define except_clause 289
+#define suite 290
+#define test 291
+#define and_test 292
+#define not_test 293
+#define comparison 294
+#define comp_op 295
+#define expr 296
+#define xor_expr 297
+#define and_expr 298
+#define shift_expr 299
+#define arith_expr 300
+#define term 301
+#define factor 302
+#define power 303
+#define atom 304
+#define listmaker 305
+#define lambdef 306
+#define trailer 307
+#define subscriptlist 308
+#define subscript 309
+#define sliceop 310
+#define exprlist 311
+#define testlist 312
+#define dictmaker 313
+#define classdef 314
+#define arglist 315
+#define argument 316
+#define list_iter 317
+#define list_for 318
+#define list_if 319
diff --git a/Include/object.h b/Include/object.h
index 72a5282..0cfa179 100644
--- a/Include/object.h
+++ b/Include/object.h
@@ -151,6 +151,17 @@
 	unaryfunc nb_float;
 	unaryfunc nb_oct;
 	unaryfunc nb_hex;
+	binaryfunc nb_inplace_add;
+	binaryfunc nb_inplace_subtract;
+	binaryfunc nb_inplace_multiply;
+	binaryfunc nb_inplace_divide;
+	binaryfunc nb_inplace_remainder;
+	ternaryfunc nb_inplace_power;
+	binaryfunc nb_inplace_lshift;
+	binaryfunc nb_inplace_rshift;
+	binaryfunc nb_inplace_and;
+	binaryfunc nb_inplace_xor;
+	binaryfunc nb_inplace_or;
 } PyNumberMethods;
 
 typedef struct {
@@ -162,6 +173,8 @@
 	intobjargproc sq_ass_item;
 	intintobjargproc sq_ass_slice;
 	objobjproc sq_contains;
+	binaryfunc sq_inplace_concat;
+	intargfunc sq_inplace_repeat;
 } PySequenceMethods;
 
 typedef struct {
@@ -315,8 +328,12 @@
 #define Py_TPFLAGS_GC 0
 #endif
 
+/* PySequenceMethods and PyNumberMethods contain in-place operators */
+#define Py_TPFLAGS_HAVE_INPLACEOPS (1L<<3)
+
 #define Py_TPFLAGS_DEFAULT  (Py_TPFLAGS_HAVE_GETCHARBUFFER | \
-                             Py_TPFLAGS_HAVE_SEQUENCE_IN)
+                             Py_TPFLAGS_HAVE_SEQUENCE_IN | \
+                             Py_TPFLAGS_HAVE_INPLACEOPS)
 
 #define PyType_HasFeature(t,f)  (((t)->tp_flags & (f)) != 0)
 
diff --git a/Include/opcode.h b/Include/opcode.h
index f900aa9..d46e5b8 100644
--- a/Include/opcode.h
+++ b/Include/opcode.h
@@ -21,6 +21,7 @@
 #define ROT_TWO		2
 #define ROT_THREE	3
 #define DUP_TOP		4
+#define ROT_FOUR	5
 
 #define UNARY_POSITIVE	10
 #define UNARY_NEGATIVE	11
@@ -47,6 +48,11 @@
 #define DELETE_SLICE	50
 /* Also uses 51-53 */
 
+#define INPLACE_ADD	55
+#define INPLACE_SUBTRACT	56
+#define INPLACE_MULTIPLY	57
+#define INPLACE_DIVIDE	58
+#define INPLACE_MODULO	59
 #define STORE_SUBSCR	60
 #define DELETE_SUBSCR	61
 
@@ -55,14 +61,18 @@
 #define BINARY_AND	64
 #define BINARY_XOR	65
 #define BINARY_OR	66
-
+#define INPLACE_POWER	67
 
 #define PRINT_EXPR	70
 #define PRINT_ITEM	71
 #define PRINT_NEWLINE	72
 #define PRINT_ITEM_TO   73
 #define PRINT_NEWLINE_TO 74
-
+#define INPLACE_LSHIFT	75
+#define INPLACE_RSHIFT	76
+#define INPLACE_AND	77
+#define INPLACE_XOR	78
+#define INPLACE_OR	79
 #define BREAK_LOOP	80
 
 #define LOAD_LOCALS	82
@@ -84,7 +94,7 @@
 #define DELETE_ATTR	96	/* "" */
 #define STORE_GLOBAL	97	/* "" */
 #define DELETE_GLOBAL	98	/* "" */
-
+#define DUP_TOPX	99	/* number of items to duplicate */
 #define LOAD_CONST	100	/* Index in const list */
 #define LOAD_NAME	101	/* Index in name list */
 #define BUILD_TUPLE	102	/* Number of tuple items */
diff --git a/Include/token.h b/Include/token.h
index 88ef3fc..d6bdc85 100644
--- a/Include/token.h
+++ b/Include/token.h
@@ -53,10 +53,21 @@
 #define LEFTSHIFT	34
 #define RIGHTSHIFT	35
 #define DOUBLESTAR	36
+#define PLUSEQUAL	37
+#define MINEQUAL	38
+#define STAREQUAL	39
+#define SLASHEQUAL	40
+#define PERCENTEQUAL	41
+#define AMPEREQUAL	42
+#define VBAREQUAL	43
+#define CIRCUMFLEXEQUAL	44
+#define LEFTSHIFTEQUAL	45
+#define RIGHTSHIFTEQUAL	46
+#define DOUBLESTAREQUAL	47
 /* Don't forget to update the table _PyParser_TokenNames in tokenizer.c! */
-#define OP		37
-#define ERRORTOKEN	38
-#define N_TOKENS	39
+#define OP		48
+#define ERRORTOKEN	49
+#define N_TOKENS	50
 
 /* Special definitions for cooperation with parser */