diff --git a/Lib/test/test_ast.py b/Lib/test/test_ast.py
index d080032..f4fbc94 100644
--- a/Lib/test/test_ast.py
+++ b/Lib/test/test_ast.py
@@ -1,4 +1,5 @@
-import sys
+import sys, unittest
+from test import test_support
 import _ast
 
 def to_tuple(t):
@@ -15,6 +16,7 @@
         result.append(to_tuple(getattr(t, f)))
     return tuple(result)
 
+
 # These tests are compiled through "exec"
 # There should be atleast one test per statement
 exec_tests = [
@@ -112,42 +114,83 @@
 # TODO: expr_context, slice, boolop, operator, unaryop, cmpop, comprehension
 # excepthandler, arguments, keywords, alias
 
-if __name__=='__main__' and sys.argv[1:] == ['-g']:
-    for statements, kind in ((exec_tests, "exec"), (single_tests, "single"),
-                             (eval_tests, "eval")):
-        print(kind+"_results = [")
-        for s in statements:
-            print(repr(to_tuple(compile(s, "?", kind, 0x400)))+",")
-        print("]")
-    print("run_tests()")
-    raise SystemExit
+class AST_Tests(unittest.TestCase):
 
-def test_order(ast_node, parent_pos):
+    def _assert_order(self, ast_node, parent_pos):
+        if not isinstance(ast_node, _ast.AST) or ast_node._fields is None:
+            return
+        if isinstance(ast_node, (_ast.expr, _ast.stmt, _ast.excepthandler)):
+            node_pos = (ast_node.lineno, ast_node.col_offset)
+            self.assert_(node_pos >= parent_pos)
+            parent_pos = (ast_node.lineno, ast_node.col_offset)
+        for name in ast_node._fields:
+            value = getattr(ast_node, name)
+            if isinstance(value, list):
+                for child in value:
+                    self._assert_order(child, parent_pos)
+            elif value is not None:
+                self._assert_order(value, parent_pos)
 
-    if not isinstance(ast_node, _ast.AST) or ast_node._fields is None:
+    def test_snippets(self):
+        for input, output, kind in ((exec_tests, exec_results, "exec"),
+                                    (single_tests, single_results, "single"),
+                                    (eval_tests, eval_results, "eval")):
+            for i, o in zip(input, output):
+                ast_tree = compile(i, "?", kind, _ast.PyCF_ONLY_AST)
+                self.assertEquals(to_tuple(ast_tree), o)
+                self._assert_order(ast_tree, (0, 0))
+
+    def test_nodeclasses(self):
+        x = _ast.BinOp(1, 2, 3, lineno=0)
+        self.assertEquals(x.left, 1)
+        self.assertEquals(x.op, 2)
+        self.assertEquals(x.right, 3)
+        self.assertEquals(x.lineno, 0)
+
+        # node raises exception when not given enough arguments
+        self.assertRaises(TypeError, _ast.BinOp, 1, 2)
+
+        # can set attributes through kwargs too
+        x = _ast.BinOp(left=1, op=2, right=3, lineno=0)
+        self.assertEquals(x.left, 1)
+        self.assertEquals(x.op, 2)
+        self.assertEquals(x.right, 3)
+        self.assertEquals(x.lineno, 0)
+
+        # this used to fail because Sub._fields was None
+        x = _ast.Sub()
+
+    def test_pickling(self):
+        import pickle
+        mods = [pickle]
+        try:
+            import cPickle
+            mods.append(cPickle)
+        except ImportError:
+            pass
+        protocols = [0, 1, 2]
+        for mod in mods:
+            for protocol in protocols:
+                for ast in (compile(i, "?", "exec", 0x400) for i in exec_tests):
+                    ast2 = mod.loads(mod.dumps(ast, protocol))
+                    self.assertEquals(to_tuple(ast2), to_tuple(ast))
+
+def test_main():
+    test_support.run_unittest(AST_Tests)
+
+def main():
+    if __name__ != '__main__':
         return
-    if isinstance(ast_node, (_ast.expr, _ast.stmt, _ast.excepthandler)):
-        node_pos = (ast_node.lineno, ast_node.col_offset)
-        assert node_pos >= parent_pos, (node_pos, parent_pos)
-        parent_pos = (ast_node.lineno, ast_node.col_offset)
-    for name in ast_node._fields:
-        value = getattr(ast_node, name)
-        if isinstance(value, list):
-            for child in value:
-                test_order(child, parent_pos)
-        elif value is not None:
-            test_order(value, parent_pos)
-
-def run_tests():
-    for input, output, kind in ((exec_tests, exec_results, "exec"),
-                                (single_tests, single_results, "single"),
-                                (eval_tests, eval_results, "eval")):
-        for i, o in zip(input, output):
-            ast_tree = compile(i, "?", kind, 0x400)
-            tup = to_tuple(ast_tree)
-            assert tup == o, ("kind=%r\ninput=%r\nexpected=%r\ngot=%r" %
-                              (kind, i, o, tup))
-            test_order(ast_tree, (0, 0))
+    if sys.argv[1:] == ['-g']:
+        for statements, kind in ((exec_tests, "exec"), (single_tests, "single"),
+                                 (eval_tests, "eval")):
+            print(kind+"_results = [")
+            for s in statements:
+                print(repr(to_tuple(compile(s, "?", kind, 0x400)))+",")
+            print("]")
+        print("main()")
+        raise SystemExit
+    test_main()
 
 #### EVERYTHING BELOW IS GENERATED #####
 exec_results = [
@@ -194,4 +237,4 @@
 ('Expression', ('Tuple', (1, 0), [('Num', (1, 0), 1), ('Num', (1, 2), 2), ('Num', (1, 4), 3)], ('Load',))),
 ('Expression', ('Call', (1, 0), ('Attribute', (1, 0), ('Attribute', (1, 0), ('Attribute', (1, 0), ('Name', (1, 0), 'a', ('Load',)), 'b', ('Load',)), 'c', ('Load',)), 'd', ('Load',)), [('Subscript', (1, 8), ('Attribute', (1, 8), ('Name', (1, 8), 'a', ('Load',)), 'b', ('Load',)), ('Slice', ('Num', (1, 12), 1), ('Num', (1, 14), 2), None), ('Load',))], [], None, None)),
 ]
-run_tests()
+main()
diff --git a/Parser/asdl_c.py b/Parser/asdl_c.py
index a38c268..1c83f50 100755
--- a/Parser/asdl_c.py
+++ b/Parser/asdl_c.py
@@ -628,9 +628,34 @@
     return res;
 }
 
+/* Pickling support */
+static PyObject *
+ast_type_reduce(PyObject *self, PyObject *unused)
+{
+    PyObject *res;
+    PyObject *dict = PyObject_GetAttrString(self, "__dict__");
+    if (dict == NULL) {
+        if (PyErr_ExceptionMatches(PyExc_AttributeError))
+            PyErr_Clear();
+        else
+            return NULL;
+    }
+    if (dict) {
+        res = Py_BuildValue("O()O", Py_TYPE(self), dict);
+        Py_DECREF(dict);
+        return res;
+    }
+    return Py_BuildValue("O()", Py_TYPE(self));
+}
+
+static PyMethodDef ast_type_methods[] = {
+    {"__reduce__", ast_type_reduce, METH_NOARGS, NULL},
+    {NULL}
+};
+
 static PyTypeObject AST_type = {
     PyVarObject_HEAD_INIT(&PyType_Type, 0)
-    "AST",
+    "_ast.AST",
     sizeof(PyObject),
     0,
     0,                       /* tp_dealloc */
@@ -656,7 +681,7 @@
     0,                       /* tp_weaklistoffset */
     0,                       /* tp_iter */
     0,                       /* tp_iternext */
-    0,                       /* tp_methods */
+    ast_type_methods,        /* tp_methods */
     0,                       /* tp_members */
     0,                       /* tp_getset */
     0,                       /* tp_base */
@@ -675,14 +700,9 @@
 {
     PyObject *fnames, *result;
     int i;
-    if (num_fields) {
-        fnames = PyTuple_New(num_fields);
-        if (!fnames) return NULL;
-    } else {
-        fnames = Py_None;
-        Py_INCREF(Py_None);
-    }
-    for(i=0; i < num_fields; i++) {
+    fnames = PyTuple_New(num_fields);
+    if (!fnames) return NULL;
+    for (i = 0; i < num_fields; i++) {
         PyObject *field = PyUnicode_FromString(fields[i]);
         if (!field) {
             Py_DECREF(fnames);
diff --git a/Python/Python-ast.c b/Python/Python-ast.c
index a50435f..9e9ba06 100644
--- a/Python/Python-ast.c
+++ b/Python/Python-ast.c
@@ -2,7 +2,7 @@
 
 
 /*
-   __version__ 57783.
+   __version__ 62078.
 
    This module must be committed separately after each AST grammar change;
    The __version__ number is set to the revision number of the commit
@@ -445,9 +445,34 @@
     return res;
 }
 
+/* Pickling support */
+static PyObject *
+ast_type_reduce(PyObject *self, PyObject *unused)
+{
+    PyObject *res;
+    PyObject *dict = PyObject_GetAttrString(self, "__dict__");
+    if (dict == NULL) {
+        if (PyErr_ExceptionMatches(PyExc_AttributeError))
+            PyErr_Clear();
+        else
+            return NULL;
+    }
+    if (dict) {
+        res = Py_BuildValue("O()O", Py_TYPE(self), dict);
+        Py_DECREF(dict);
+        return res;
+    }
+    return Py_BuildValue("O()", Py_TYPE(self));
+}
+
+static PyMethodDef ast_type_methods[] = {
+    {"__reduce__", ast_type_reduce, METH_NOARGS, NULL},
+    {NULL}
+};
+
 static PyTypeObject AST_type = {
     PyVarObject_HEAD_INIT(&PyType_Type, 0)
-    "AST",
+    "_ast.AST",
     sizeof(PyObject),
     0,
     0,                       /* tp_dealloc */
@@ -473,7 +498,7 @@
     0,                       /* tp_weaklistoffset */
     0,                       /* tp_iter */
     0,                       /* tp_iternext */
-    0,                       /* tp_methods */
+    ast_type_methods,        /* tp_methods */
     0,                       /* tp_members */
     0,                       /* tp_getset */
     0,                       /* tp_base */
@@ -492,14 +517,9 @@
 {
     PyObject *fnames, *result;
     int i;
-    if (num_fields) {
-        fnames = PyTuple_New(num_fields);
-        if (!fnames) return NULL;
-    } else {
-        fnames = Py_None;
-        Py_INCREF(Py_None);
-    }
-    for(i=0; i < num_fields; i++) {
+    fnames = PyTuple_New(num_fields);
+    if (!fnames) return NULL;
+    for (i = 0; i < num_fields; i++) {
         PyObject *field = PyUnicode_FromString(fields[i]);
         if (!field) {
             Py_DECREF(fnames);
@@ -6375,7 +6395,7 @@
         if (PyDict_SetItemString(d, "AST", (PyObject*)&AST_type) < 0) return;
         if (PyModule_AddIntConstant(m, "PyCF_ONLY_AST", PyCF_ONLY_AST) < 0)
                 return;
-        if (PyModule_AddStringConstant(m, "__version__", "57783") < 0)
+        if (PyModule_AddStringConstant(m, "__version__", "62078") < 0)
                 return;
         if (PyDict_SetItemString(d, "mod", (PyObject*)mod_type) < 0) return;
         if (PyDict_SetItemString(d, "Module", (PyObject*)Module_type) < 0)
