diff --git a/Misc/NEWS b/Misc/NEWS
index 8da277a..5cc62bf 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -84,10 +84,6 @@
 Core and builtins
 -----------------
 
-- Assignment to None has long been frowned upon.  Now there's a
-  warning message when you do this.  It also warns against assignment
-  to True or False.
-
 - A frame object's f_lineno attribute can now be written to from a
   trace function to change which line will execute next.  A command to
   exploit this from pdb has been added.  [SF patch #643835]
diff --git a/Python/compile.c b/Python/compile.c
index 8b1652d..c7ca534 100644
--- a/Python/compile.c
+++ b/Python/compile.c
@@ -575,7 +575,6 @@
 /* Prototype forward declarations */
 
 static int issue_warning(const char *, const char *, int);
-static int symtable_warn(struct symtable *, char *);
 static int com_init(struct compiling *, const char *);
 static void com_free(struct compiling *);
 static void com_push(struct compiling *, int);
@@ -1007,64 +1006,6 @@
 	return 0;
 }
 
-static int num_literals = 3;
-static char *literal_names[] = {"None", "True", "False"};
-static PyObject *literals;
-
-static int
-init_literals(void)
-{
-    int i;
-
-    literals = PyDict_New();
-    if (literals == NULL)
-	return -1;
-    for (i = 0; i < num_literals; i++)
-	if (PyDict_SetItemString(literals, literal_names[i], 
-				 Py_None) < 0) 
-	    return -1;
-    return 0;
-}
-
-static int
-check_literal(PyObject *name, struct compiling *c, struct symtable *st)
-{
-	/* check for literal names that will become keywords in the future */
-	if (literals == NULL && init_literals() < 0)
-		return -1;
-	if (!PyString_Check(name))
-		return -1;
-	if (PyDict_GetItem(literals, name)) {
-		char buf[1024];
-		PyOS_snprintf(buf, sizeof(buf), "'%s' may become a keyword", 
-			      PyString_AS_STRING(name));
-		if (c && (issue_warning(buf, c->c_filename, c->c_lineno) < 0))
-			return -1;
-		if (st && (symtable_warn(st, buf) < 0))
-			return -1;
-	}
-	return 0;
-}
-
-static int
-check_literal_str(const char *name, struct compiling *c, struct symtable *st)
-{
-	int i;
-
-	for (i = 0; i < num_literals; i++)
-		if (strcmp(literal_names[i], name) == 0) {
-			char buf[1024];
-			PyOS_snprintf(buf, sizeof(buf), 
-				      "'%s' may become a keyword", name);
-			if (c && 
-			    issue_warning(buf, c->c_filename, c->c_lineno) < 0)
-				return -1;
-			if (st && symtable_warn(st, buf) < 0)
-				return -1;
-		}
-	return 0;
-}
-
 static void
 com_addop_varname(struct compiling *c, int kind, char *name)
 {
@@ -1122,14 +1063,6 @@
 	}
 	Py_DECREF(v);
 
-	if (kind == VAR_STORE || kind == VAR_DELETE) {
-		if (check_literal(v, c, NULL) < 0) {
-			c->c_errors++;
-			i = 255;
-			goto done;
-		}
-	}
-
 	switch (kind) {
 	case VAR_LOAD:
 		switch (scope) {
@@ -1197,7 +1130,6 @@
 	/* XXX it is possible to write this code without the 1000
 	   chars on the total length of dotted names, I just can't be
 	   bothered right now */
-
 	if (TYPE(n) == STAR)
 		name = "*";
 	else if (TYPE(n) == dotted_name) {
@@ -1206,10 +1138,6 @@
 		name = buffer;
 		for (i = 0; i < NCH(n); i += 2) {
 			char *s = STR(CHILD(n, i));
-			if (check_literal_str(s, c, NULL) < 0) {
-			    name = NULL;
-			    break;
-			}
 			if (p + strlen(s) > buffer + (sizeof buffer) - 2) {
 				com_error(c, PyExc_MemoryError,
 					  "dotted_name too long");
@@ -1225,8 +1153,6 @@
 	else {
 		REQ(n, NAME);
 		name = STR(n);
-		if (check_literal_str(name, c, NULL) < 0)
-		    name = NULL;
 	}
 	com_addop_name(c, op, name);
 }
@@ -3046,13 +2972,9 @@
 		} else {
 			tup = PyTuple_New((NCH(n) - 2)/2);
 			for (i = 3; i < NCH(n); i += 2) {
-				char *s = STR(CHILD(CHILD(n, i), 0));
-				if (check_literal_str(s, c, NULL) < 0) {
-					c->c_errors++;
-					return;
-				}
 				PyTuple_SET_ITEM(tup, (i-3)/2, 
-						 PyString_FromString(s));
+					PyString_FromString(STR(
+						CHILD(CHILD(n, i), 0))));
 			}
 		}
 		com_addoparg(c, LOAD_CONST, com_addconst(c, tup));
@@ -3992,23 +3914,40 @@
 static void
 com_arglist(struct compiling *c, node *n)
 {
-	int i;
+	int nch, i, narg;
 	int complex = 0;
+	char nbuf[30];
 	REQ(n, varargslist);
 	/* varargslist:
 		(fpdef ['=' test] ',')* (fpdef ['=' test] | '*' .....) */
-	/* Check if the argument list includes nested tuples */
-	for (i = 0; i < NCH(n); i++)
-		if (TYPE(CHILD(n, i)) == LPAR) {
-			complex = 1;
+	nch = NCH(n);
+	/* Enter all arguments in table of locals */
+	for (i = 0, narg = 0; i < nch; i++) {
+		node *ch = CHILD(n, i);
+		node *fp;
+		if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
 			break;
+		REQ(ch, fpdef); /* fpdef: NAME | '(' fplist ')' */
+		fp = CHILD(ch, 0);
+		if (TYPE(fp) != NAME) {
+			PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
+			complex = 1;
 		}
-	/* If it does, generate code to unpack them. */
+		narg++;
+		/* all name updates handled by symtable */
+		if (++i >= nch)
+			break;
+		ch = CHILD(n, i);
+		if (TYPE(ch) == EQUAL)
+			i += 2;
+		else
+			REQ(ch, COMMA);
+	}
 	if (complex) {
 		/* Generate code for complex arguments only after
 		   having counted the simple arguments */
 		int ilocal = 0;
-		for (i = 0; i < NCH(n); i++) {
+		for (i = 0; i < nch; i++) {
 			node *ch = CHILD(n, i);
 			node *fp;
 			if (TYPE(ch) == STAR || TYPE(ch) == DOUBLESTAR)
@@ -4021,7 +3960,7 @@
 				com_fpdef(c, ch);
 			}
 			ilocal++;
-			if (++i >= NCH(n))
+			if (++i >= nch)
 				break;
 			ch = CHILD(n, i);
 			if (TYPE(ch) == EQUAL)
@@ -5420,7 +5359,7 @@
 symtable_params(struct symtable *st, node *n)
 {
 	int i, complex = -1, ext = 0;
-	node *c = NULL, *ch = NULL;
+	node *c = NULL;
 
 	if (TYPE(n) == parameters) {
 		n = CHILD(n, 1);
@@ -5437,14 +5376,9 @@
 		if (TYPE(c) == test) {
 			continue;
 		}
-		ch = CHILD(c, 0);
-		if (TYPE(ch) == NAME) {
-			if (check_literal_str(STR(ch), NULL, st) < 0) {
-				st->st_errors++;
-				return;
-			}
+		if (TYPE(CHILD(c, 0)) == NAME)
 			symtable_add_def(st, STR(CHILD(c, 0)), DEF_PARAM);
-		} else {
+		else {
 			char nbuf[30];
 			PyOS_snprintf(nbuf, sizeof(nbuf), ".%d", i);
 			symtable_add_def(st, nbuf, DEF_PARAM);
