diff --git a/Lib/collections.py b/Lib/collections.py
index 70fa903..90ed776 100644
--- a/Lib/collections.py
+++ b/Lib/collections.py
@@ -1,7 +1,8 @@
-__all__ = ['deque', 'defaultdict', 'NamedTuple']
+__all__ = ['deque', 'defaultdict', 'namedtuple']
 
 from _collections import deque, defaultdict
 from operator import itemgetter as _itemgetter
+from keyword import iskeyword as _iskeyword
 import sys as _sys
 
 # For bootstrapping reasons, the collection ABCs are defined in _abcoll.py.
@@ -10,11 +11,10 @@
 import _abcoll
 __all__ += _abcoll.__all__
 
-
-def NamedTuple(typename, s, verbose=False):
+def namedtuple(typename, field_names, verbose=False):
     """Returns a new subclass of tuple with named fields.
 
-    >>> Point = NamedTuple('Point', 'x y')
+    >>> Point = namedtuple('Point', 'x y')
     >>> Point.__doc__                   # docstring for the new class
     'Point(x, y)'
     >>> p = Point(11, y=22)             # instantiate with positional args or keywords
@@ -25,19 +25,36 @@
     (11, 22)
     >>> p.x + p.y                       # fields also accessable by name
     33
-    >>> p                               # readable __repr__ with name=value style
+    >>> d = p.__asdict__()              # convert to a dictionary
+    >>> d['x']
+    11
+    >>> Point(**d)                      # convert from a dictionary
     Point(x=11, y=22)
     >>> p.__replace__('x', 100)         # __replace__() is like str.replace() but targets a named field
     Point(x=100, y=22)
-    >>> d = dict(zip(p.__fields__, p))  # use __fields__ to make a dictionary
-    >>> d['x']
-    11
 
     """
 
-    field_names = tuple(s.replace(',', ' ').split())    # names separated by spaces and/or commas
-    if not ''.join((typename,) + field_names).replace('_', '').isalnum():
-        raise ValueError('Type names and field names can only contain alphanumeric characters and underscores')
+    # Parse and validate the field names
+    if isinstance(field_names, str):
+        field_names = field_names.replace(',', ' ').split() # names separated by whitespace and/or commas
+    field_names = tuple(field_names)
+    for name in (typename,) + field_names:
+        if not name.replace('_', '').isalnum():
+            raise ValueError('Type names and field names can only contain alphanumeric characters and underscores: %r' % name)
+        if _iskeyword(name):
+            raise ValueError('Type names and field names cannot be a keyword: %r' % name)
+        if name[0].isdigit():
+            raise ValueError('Type names and field names cannot start with a number: %r' % name)
+    seen_names = set()
+    for name in field_names:
+        if name.startswith('__') and name.endswith('__'):
+            raise ValueError('Field names cannot start and end with double underscores: %r' % name)
+        if name in seen_names:
+            raise ValueError('Encountered duplicate field name: %r' % name)
+        seen_names.add(name)
+
+    # Create and fill-in the class template
     argtxt = repr(field_names).replace("'", "")[1:-1]   # tuple repr without parens or quotes
     reprtxt = ', '.join('%s=%%r' % name for name in field_names)
     template = '''class %(typename)s(tuple):
@@ -48,18 +65,31 @@
             return tuple.__new__(cls, (%(argtxt)s))
         def __repr__(self):
             return '%(typename)s(%(reprtxt)s)' %% self
-        def __replace__(self, field, value):
+        def __asdict__(self, dict=dict, zip=zip):
+            'Return a new dict mapping field names to their values'
+            return dict(zip(%(field_names)r, self))
+        def __replace__(self, field, value, dict=dict, zip=zip):
             'Return a new %(typename)s object replacing one field with a new value'
             return %(typename)s(**dict(list(zip(%(field_names)r, self)) + [(field, value)]))  \n''' % locals()
     for i, name in enumerate(field_names):
         template += '        %s = property(itemgetter(%d))\n' % (name, i)
     if verbose:
         print(template)
-    m = dict(itemgetter=_itemgetter)
-    exec(template, m)
-    result = m[typename]
+
+    # Execute the template string in a temporary namespace
+    namespace = dict(itemgetter=_itemgetter)
+    try:
+        exec(template, namespace)
+    except SyntaxError as e:
+        raise SyntaxError(e.message + ':\n' + template)
+    result = namespace[typename]
+
+    # For pickling to work, the __module__ variable needs to be set to the frame
+    # where the named tuple is created.  Bypass this step in enviroments where
+    # sys._getframe is not defined (Jython for example).
     if hasattr(_sys, '_getframe'):
         result.__module__ = _sys._getframe(1).f_globals['__name__']
+
     return result
 
 
@@ -69,10 +99,10 @@
 if __name__ == '__main__':
     # verify that instances can be pickled
     from pickle import loads, dumps
-    Point = NamedTuple('Point', 'x, y', True)
+    Point = namedtuple('Point', 'x, y', True)
     p = Point(x=10, y=20)
     assert p == loads(dumps(p))
 
     import doctest
-    TestResults = NamedTuple('TestResults', 'failed attempted')
+    TestResults = namedtuple('TestResults', 'failed attempted')
     print(TestResults(*doctest.testmod()))
