Checkpoint.  218 tests are okay; 53 are failing.  Done so far:
- all classes are new-style (but ripping out classobject.[ch] isn't done)
- int/int -> float
- all exceptions must derive from BaseException
- absolute import
- 'as' and 'with' are keywords
diff --git a/Python/ceval.c b/Python/ceval.c
index de2b35b..c854fcf 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -3025,15 +3025,7 @@
 		Py_DECREF(tmp);
 	}
 
-	if (PyString_CheckExact(type)) {
-		/* Raising builtin string is deprecated but still allowed --
-		 * do nothing.  Raising an instance of a new-style str
-		 * subclass is right out. */
-		if (PyErr_Warn(PyExc_DeprecationWarning,
-			   "raising a string exception is deprecated"))
-			goto raise_error;
-	}
-	else if (PyExceptionClass_Check(type))
+	if (PyExceptionClass_Check(type))
 		PyErr_NormalizeException(&type, &value, &tb);
 
 	else if (PyExceptionInstance_Check(type)) {
@@ -3054,10 +3046,8 @@
 	else {
 		/* Not something you can raise.  You get an exception
 		   anyway, just not what you specified :-) */
-		PyErr_Format(PyExc_TypeError,
-			     "exceptions must be classes, instances, or "
-			     "strings (deprecated), not %s",
-			     type->ob_type->tp_name);
+		PyErr_SetString(PyExc_TypeError,
+                                "exceptions must derive from BaseException");
 		goto raise_error;
 	}
 	PyErr_Restore(type, value, tb);
@@ -4148,7 +4138,7 @@
 		if (g != NULL && PyDict_Check(g))
 			metaclass = PyDict_GetItemString(g, "__metaclass__");
 		if (metaclass == NULL)
-			metaclass = (PyObject *) &PyClass_Type;
+			metaclass = (PyObject *) &PyType_Type;
 		Py_INCREF(metaclass);
 	}
 	result = PyObject_CallFunction(metaclass, "OOO", name, bases, methods);
diff --git a/Python/compile.c b/Python/compile.c
index baf3989..cfc6ef1 100644
--- a/Python/compile.c
+++ b/Python/compile.c
@@ -2464,11 +2464,7 @@
 		int r;
 		PyObject *level;
 
-		if (c->c_flags && (c->c_flags->cf_flags & CO_FUTURE_ABSIMPORT))
-			level = PyInt_FromLong(0);
-		else
-			level = PyInt_FromLong(-1);
-
+                level = PyInt_FromLong(0);
 		if (level == NULL)
 			return 0;
 
@@ -2511,12 +2507,7 @@
 	if (!names)
 		return 0;
 
-	if (s->v.ImportFrom.level == 0 && c->c_flags &&
-	    !(c->c_flags->cf_flags & CO_FUTURE_ABSIMPORT))
-		level = PyInt_FromLong(-1);
-	else
-		level = PyInt_FromLong(s->v.ImportFrom.level);
-
+        level = PyInt_FromLong(s->v.ImportFrom.level);
 	if (!level) {
 		Py_DECREF(names);
 		return 0;
@@ -2746,10 +2737,7 @@
 	case Mult:
 		return BINARY_MULTIPLY;
 	case Div:
-		if (c->c_flags && c->c_flags->cf_flags & CO_FUTURE_DIVISION)
-			return BINARY_TRUE_DIVIDE;
-		else
-			return BINARY_DIVIDE;
+		return BINARY_TRUE_DIVIDE;
 	case Mod:
 		return BINARY_MODULO;
 	case Pow:
@@ -2809,10 +2797,7 @@
 	case Mult:
 		return INPLACE_MULTIPLY;
 	case Div:
-		if (c->c_flags && c->c_flags->cf_flags & CO_FUTURE_DIVISION)
-			return INPLACE_TRUE_DIVIDE;
-		else
-			return INPLACE_DIVIDE;
+		return INPLACE_TRUE_DIVIDE;
 	case Mod:
 		return INPLACE_MODULO;
 	case Pow:
diff --git a/Python/errors.c b/Python/errors.c
index 7fc4c97..a64900b 100644
--- a/Python/errors.c
+++ b/Python/errors.c
@@ -557,7 +557,8 @@
 	bases = PyTuple_Pack(1, base);
 	if (bases == NULL)
 		goto failure;
-	result = PyClass_New(bases, dict, classname);
+	result = PyObject_CallFunction((PyObject *) (base->ob_type),
+				       "OOO", classname, bases, dict);
   failure:
 	Py_XDECREF(bases);
 	Py_XDECREF(mydict);
diff --git a/Python/future.c b/Python/future.c
index 4a48ba5..1902f1d 100644
--- a/Python/future.c
+++ b/Python/future.c
@@ -28,11 +28,11 @@
 		} else if (strcmp(feature, FUTURE_GENERATORS) == 0) {
 			continue;
 		} else if (strcmp(feature, FUTURE_DIVISION) == 0) {
-			ff->ff_features |= CO_FUTURE_DIVISION;
+			continue;
 		} else if (strcmp(feature, FUTURE_ABSIMPORT) == 0) {
-			ff->ff_features |= CO_FUTURE_ABSIMPORT;
+			continue;
 		} else if (strcmp(feature, FUTURE_WITH_STATEMENT) == 0) {
-			ff->ff_features |= CO_FUTURE_WITH_STATEMENT;
+			continue;
 		} else if (strcmp(feature, "braces") == 0) {
 			PyErr_SetString(PyExc_SyntaxError,
 					"not a chance");
diff --git a/Python/getargs.c b/Python/getargs.c
index 8ee7d2f..fac0b6f 100644
--- a/Python/getargs.c
+++ b/Python/getargs.c
@@ -486,15 +486,16 @@
 
 #define CONV_UNICODE "(unicode conversion error)"
 
-/* explicitly check for float arguments when integers are expected.  For now
- * signal a warning.  Returns true if an exception was raised. */
+/* Explicitly check for float arguments when integers are expected.
+   Return 1 for error, 0 if ok. */
 static int
 float_argument_error(PyObject *arg)
 {
-	if (PyFloat_Check(arg) &&
-	    PyErr_Warn(PyExc_DeprecationWarning,
-		       "integer argument expected, got float" ))
+	if (PyFloat_Check(arg)) {
+		PyErr_SetString(PyExc_TypeError,
+				"integer argument expected, got float" );
 		return 1;
+	}
 	else
 		return 0;
 }
diff --git a/Python/graminit.c b/Python/graminit.c
index 1853ca4..40f1770 100644
--- a/Python/graminit.c
+++ b/Python/graminit.c
@@ -556,9 +556,8 @@
 static arc arcs_27_0[1] = {
 	{19, 1},
 };
-static arc arcs_27_1[3] = {
+static arc arcs_27_1[2] = {
 	{78, 2},
-	{19, 2},
 	{0, 1},
 };
 static arc arcs_27_2[1] = {
@@ -569,16 +568,15 @@
 };
 static state states_27[4] = {
 	{1, arcs_27_0},
-	{3, arcs_27_1},
+	{2, arcs_27_1},
 	{1, arcs_27_2},
 	{1, arcs_27_3},
 };
 static arc arcs_28_0[1] = {
 	{12, 1},
 };
-static arc arcs_28_1[3] = {
+static arc arcs_28_1[2] = {
 	{78, 2},
-	{19, 2},
 	{0, 1},
 };
 static arc arcs_28_2[1] = {
@@ -589,7 +587,7 @@
 };
 static state states_28[4] = {
 	{1, arcs_28_0},
-	{3, arcs_28_1},
+	{2, arcs_28_1},
 	{1, arcs_28_2},
 	{1, arcs_28_3},
 };
@@ -917,9 +915,8 @@
 	{1, arcs_40_4},
 	{1, arcs_40_5},
 };
-static arc arcs_41_0[2] = {
+static arc arcs_41_0[1] = {
 	{78, 1},
-	{19, 1},
 };
 static arc arcs_41_1[1] = {
 	{82, 2},
@@ -928,7 +925,7 @@
 	{0, 2},
 };
 static state states_41[3] = {
-	{2, arcs_41_0},
+	{1, arcs_41_0},
 	{1, arcs_41_1},
 	{1, arcs_41_2},
 };
@@ -1870,7 +1867,7 @@
 	{296, "with_stmt", 0, 6, states_40,
 	 "\000\000\000\000\000\000\000\000\000\000\000\000\010\000\000\000\000\000\000\000\000"},
 	{297, "with_var", 0, 3, states_41,
-	 "\000\000\010\000\000\000\000\000\000\100\000\000\000\000\000\000\000\000\000\000\000"},
+	 "\000\000\000\000\000\000\000\000\000\100\000\000\000\000\000\000\000\000\000\000\000"},
 	{298, "except_clause", 0, 5, states_42,
 	 "\000\000\000\000\000\000\000\000\000\000\000\000\040\000\000\000\000\000\000\000\000"},
 	{299, "suite", 0, 5, states_43,
diff --git a/Python/import.c b/Python/import.c
index 73051a2..b64594d 100644
--- a/Python/import.c
+++ b/Python/import.c
@@ -28,7 +28,7 @@
    a .pyc file in text mode the magic number will be wrong; also, the
    Apple MPW compiler swaps their values, botching string constants.
 
-   The magic numbers must be spaced apart atleast 2 values, as the
+   The magic numbers must be spaced apart at least 2 values, as the
    -U interpeter flag will cause MAGIC+1 being used. They have been
    odd numbers for some time now.
 
@@ -56,9 +56,10 @@
        Python 2.5a0: 62081 (ast-branch)
        Python 2.5a0: 62091 (with)
        Python 2.5a0: 62092 (changed WITH_CLEANUP opcode)
+       Python 3000:   3000
 .
 */
-#define MAGIC (62092 | ((long)'\r'<<16) | ((long)'\n'<<24))
+#define MAGIC (3000 | ((long)'\r'<<16) | ((long)'\n'<<24))
 
 /* Magic word as global; note that _PyImport_Init() can change the
    value of this global to accommodate for alterations of how the
diff --git a/Python/pythonrun.c b/Python/pythonrun.c
index 7b1f264..d04d111 100644
--- a/Python/pythonrun.c
+++ b/Python/pythonrun.c
@@ -696,9 +696,7 @@
 /* compute parser flags based on compiler flags */
 #define PARSER_FLAGS(flags) \
 	((flags) ? ((((flags)->cf_flags & PyCF_DONT_IMPLY_DEDENT) ? \
-		      PyPARSE_DONT_IMPLY_DEDENT : 0) \
-		    | ((flags)->cf_flags & CO_FUTURE_WITH_STATEMENT ? \
-		       PyPARSE_WITH_IS_KEYWORD : 0)) : 0)
+		      PyPARSE_DONT_IMPLY_DEDENT : 0)) : 0)
 
 int
 PyRun_InteractiveOneFlags(FILE *fp, const char *filename, PyCompilerFlags *flags)