diff --git a/Doc/lib/libfuncs.tex b/Doc/lib/libfuncs.tex
index 7d64f93..abafcad 100644
--- a/Doc/lib/libfuncs.tex
+++ b/Doc/lib/libfuncs.tex
@@ -477,6 +477,17 @@
   and is known to vary.}
 \end{funcdesc}
 
+\begin{funcdesc}{frozenset}{\optional{iterable}}
+  Return a frozenset object whose elements are taken from \var{iterable}.
+  Frozensets are sets that have no update methods but can be hashed and
+  used as members of other sets or as dictionary keys.  The elements of
+  a frozenset must be immutable themselves.  To represent sets of sets,
+  the inner sets should also be \class{frozenset} objects.  If
+  \var{iterable} is not specified, returns a new empty set,
+  \code{frozenset([])}.
+  \versionadded{2.4}  
+\end{funcdesc}
+
 \begin{funcdesc}{getattr}{object, name\optional{, default}}
   Return the value of the named attributed of \var{object}.  \var{name}
   must be a string.  If the string is the name of one of the object's
@@ -897,6 +908,14 @@
   \code{round(0.5)} is \code{1.0} and \code{round(-0.5)} is \code{-1.0}).
 \end{funcdesc}
 
+\begin{funcdesc}{set}{\optional{iterable}}
+  Return a set whose elements are taken from \var{iterable}.  The elements
+  must be immutable.  To represent sets of sets, the inner sets should
+  be \class{frozenset} objects.  If \var{iterable} is not specified,
+  returns a new empty set, \code{set([])}.
+  \versionadded{2.4}  
+\end{funcdesc}
+
 \begin{funcdesc}{setattr}{object, name, value}
   This is the counterpart of \function{getattr()}.  The arguments are an
   object, a string and an arbitrary value.  The string may name an
diff --git a/Include/Python.h b/Include/Python.h
index 26d2211..9379c66 100644
--- a/Include/Python.h
+++ b/Include/Python.h
@@ -86,6 +86,7 @@
 #include "listobject.h"
 #include "dictobject.h"
 #include "enumobject.h"
+#include "setobject.h"
 #include "methodobject.h"
 #include "moduleobject.h"
 #include "funcobject.h"
diff --git a/Include/setobject.h b/Include/setobject.h
new file mode 100644
index 0000000..eeffa8a
--- /dev/null
+++ b/Include/setobject.h
@@ -0,0 +1,26 @@
+
+/* Set object interface */
+
+#ifndef Py_SETOBJECT_H
+#define Py_SETOBJECT_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+This data structure is shared by set and frozenset objects.
+*/
+
+typedef struct {
+	PyObject_HEAD
+	PyObject *data;
+	long hash;	/* only used by frozenset objects */
+} PySetObject;
+
+PyAPI_DATA(PyTypeObject) PySet_Type;
+PyAPI_DATA(PyTypeObject) PyFrozenSet_Type;
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* !Py_SETOBJECT_H */
diff --git a/Lib/_strptime.py b/Lib/_strptime.py
index 4746544..df04674 100644
--- a/Lib/_strptime.py
+++ b/Lib/_strptime.py
@@ -16,7 +16,6 @@
 from re import compile as re_compile
 from re import IGNORECASE
 from datetime import date as datetime_date
-from sets import ImmutableSet as sets_ImmutableSet
 try:
     from thread import allocate_lock as _thread_allocate_lock
 except:
@@ -165,11 +164,11 @@
             time.tzset()
         except AttributeError:
             pass
-        no_saving = sets_ImmutableSet(["utc", "gmt", time.tzname[0].lower()])
+        no_saving = frozenset(["utc", "gmt", time.tzname[0].lower()])
         if time.daylight:
-            has_saving = sets_ImmutableSet([time.tzname[1].lower()])
+            has_saving = frozenset([time.tzname[1].lower()])
         else:
-            has_saving = sets_ImmutableSet()
+            has_saving = frozenset()
         self.timezone = (no_saving, has_saving)
 
 
diff --git a/Lib/test/regrtest.py b/Lib/test/regrtest.py
index 6d0c242..733c8a5 100755
--- a/Lib/test/regrtest.py
+++ b/Lib/test/regrtest.py
@@ -75,7 +75,6 @@
 import random
 import cStringIO
 import warnings
-from sets import Set
 
 # I see no other way to suppress these warnings;
 # putting them in test_grammar.py has no effect:
@@ -306,7 +305,7 @@
         e = _ExpectedSkips()
         plat = sys.platform
         if e.isvalid():
-            surprise = Set(skipped) - e.getexpected() - Set(resource_denieds)
+            surprise = set(skipped) - e.getexpected() - set(resource_denieds)
             if surprise:
                 print count(len(surprise), "skip"), \
                       "unexpected on", plat + ":"
@@ -948,7 +947,7 @@
         self.valid = False
         if sys.platform in _expectations:
             s = _expectations[sys.platform]
-            self.expected = Set(s.split())
+            self.expected = set(s.split())
 
             if not os.path.supports_unicode_filenames:
                 self.expected.add('test_pep277')
diff --git a/Lib/test/test___all__.py b/Lib/test/test___all__.py
index 99eaa59..0370c1a 100644
--- a/Lib/test/test___all__.py
+++ b/Lib/test/test___all__.py
@@ -2,7 +2,6 @@
 from test import test_support
 
 from test.test_support import verify, verbose
-from sets import Set
 import sys
 import warnings
 
@@ -43,8 +42,8 @@
         exec "from %s import *" % modname in names
         if names.has_key("__builtins__"):
             del names["__builtins__"]
-        keys = Set(names)
-        all = Set(sys.modules[modname].__all__)
+        keys = set(names)
+        all = set(sys.modules[modname].__all__)
         verify(keys==all, "%s != %s" % (keys, all))
 
     def test_all(self):
diff --git a/Lib/test/test_builtin.py b/Lib/test/test_builtin.py
index e84cfbd..d47a9da 100644
--- a/Lib/test/test_builtin.py
+++ b/Lib/test/test_builtin.py
@@ -2,7 +2,6 @@
 
 import test.test_support, unittest
 from test.test_support import fcmp, have_unicode, TESTFN, unlink
-from sets import Set
 
 import sys, warnings, cStringIO
 warnings.filterwarnings("ignore", "hex../oct.. of negative int",
@@ -1104,9 +1103,9 @@
     get_vars_f2 = staticmethod(get_vars_f2)
 
     def test_vars(self):
-        self.assertEqual(Set(vars()), Set(dir()))
+        self.assertEqual(set(vars()), set(dir()))
         import sys
-        self.assertEqual(Set(vars(sys)), Set(dir(sys)))
+        self.assertEqual(set(vars(sys)), set(dir(sys)))
         self.assertEqual(self.get_vars_f0(), {})
         self.assertEqual(self.get_vars_f2(), {'a': 1, 'b': 2})
         self.assertRaises(TypeError, vars, 42, 42)
diff --git a/Lib/test/test_enumerate.py b/Lib/test/test_enumerate.py
index b073606..636f883 100644
--- a/Lib/test/test_enumerate.py
+++ b/Lib/test/test_enumerate.py
@@ -1,5 +1,4 @@
 import unittest
-from sets import Set
 
 from test import test_support
 
@@ -105,8 +104,8 @@
     def test_tuple_reuse(self):
         # Tests an implementation detail where tuple is reused
         # whenever nothing else holds a reference to it
-        self.assertEqual(len(Set(map(id, list(enumerate(self.seq))))), len(self.seq))
-        self.assertEqual(len(Set(map(id, enumerate(self.seq)))), min(1,len(self.seq)))
+        self.assertEqual(len(set(map(id, list(enumerate(self.seq))))), len(self.seq))
+        self.assertEqual(len(set(map(id, enumerate(self.seq)))), min(1,len(self.seq)))
 
 class MyEnum(enumerate):
     pass
diff --git a/Lib/test/test_glob.py b/Lib/test/test_glob.py
index dd33691..31de30d 100644
--- a/Lib/test/test_glob.py
+++ b/Lib/test/test_glob.py
@@ -2,7 +2,6 @@
 from test.test_support import run_unittest, TESTFN
 import glob
 import os
-from sets import Set
 
 def mkdirs(fname):
     if os.path.exists(fname) or fname == '':
@@ -62,7 +61,7 @@
         return glob.glob(p)
 
     def assertSequencesEqual_noorder(self, l1, l2):
-        self.assertEqual(Set(l1), Set(l2))
+        self.assertEqual(set(l1), set(l2))
 
     def test_glob_literal(self):
         eq = self.assertSequencesEqual_noorder
diff --git a/Lib/test/test_pyclbr.py b/Lib/test/test_pyclbr.py
index 1229962..db1fc43 100644
--- a/Lib/test/test_pyclbr.py
+++ b/Lib/test/test_pyclbr.py
@@ -7,7 +7,6 @@
 from types import ClassType, FunctionType, MethodType
 import pyclbr
 from unittest import TestCase
-from sets import Set
 
 # This next line triggers an error on old versions of pyclbr.
 
@@ -24,7 +23,7 @@
 
     def assertListEq(self, l1, l2, ignore):
         ''' succeed iff {l1} - {ignore} == {l2} - {ignore} '''
-        missing = (Set(l1) ^ Set(l2)) - Set(ignore)
+        missing = (set(l1) ^ set(l2)) - set(ignore)
         if missing:
             print >>sys.stderr, "l1=%r\nl2=%r\nignore=%r" % (l1, l2, ignore)
             self.fail("%r missing" % missing.pop())
diff --git a/Lib/test/test_random.py b/Lib/test/test_random.py
index 3796c3b..8d005a2 100644
--- a/Lib/test/test_random.py
+++ b/Lib/test/test_random.py
@@ -6,7 +6,6 @@
 import pickle
 import warnings
 from math import log, exp, sqrt, pi
-from sets import Set
 from test import test_support
 
 class TestBasicOps(unittest.TestCase):
@@ -64,9 +63,9 @@
         for k in xrange(N+1):
             s = self.gen.sample(population, k)
             self.assertEqual(len(s), k)
-            uniq = Set(s)
+            uniq = set(s)
             self.assertEqual(len(uniq), k)
-            self.failUnless(uniq <= Set(population))
+            self.failUnless(uniq <= set(population))
         self.assertEqual(self.gen.sample([], 0), [])  # test edge case N==k==0
 
     def test_sample_distribution(self):
@@ -89,8 +88,7 @@
 
     def test_sample_inputs(self):
         # SF bug #801342 -- population can be any iterable defining __len__()
-        from sets import Set
-        self.gen.sample(Set(range(20)), 2)
+        self.gen.sample(set(range(20)), 2)
         self.gen.sample(range(20), 2)
         self.gen.sample(xrange(20), 2)
         self.gen.sample(dict.fromkeys('abcdefghijklmnopqrst'), 2)
@@ -256,8 +254,8 @@
 
     def test_rangelimits(self):
         for start, stop in [(-2,0), (-(2**60)-2,-(2**60)), (2**60,2**60+2)]:
-            self.assertEqual(Set(range(start,stop)),
-                Set([self.gen.randrange(start,stop) for i in xrange(100)]))
+            self.assertEqual(set(range(start,stop)),
+                set([self.gen.randrange(start,stop) for i in xrange(100)]))
 
     def test_genrandbits(self):
         # Verify cross-platform repeatability
@@ -364,7 +362,7 @@
 
     def test__all__(self):
         # tests validity but not completeness of the __all__ list
-        self.failUnless(Set(random.__all__) <= Set(dir(random)))
+        self.failUnless(set(random.__all__) <= set(dir(random)))
 
 def test_main(verbose=None):
     testclasses =    (WichmannHill_TestBasicOps,
diff --git a/Lib/test/test_set.py b/Lib/test/test_set.py
new file mode 100644
index 0000000..1edb2dd
--- /dev/null
+++ b/Lib/test/test_set.py
@@ -0,0 +1,1183 @@
+import unittest
+from test import test_support
+import operator
+import copy
+import pickle
+
+class PassThru(Exception):
+    pass
+
+def check_pass_thru():
+    raise PassThru
+    yield 1
+
+class TestJointOps(unittest.TestCase):
+    # Tests common to both set and frozenset
+
+    def setUp(self):
+        self.word = word = 'simsalabim'
+        self.otherword = 'madagascar'
+        self.letters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
+        self.s = self.thetype(word)
+        self.d = dict.fromkeys(word)
+
+    def test_uniquification(self):
+        actual = list.sorted(self.s)
+        expected = list.sorted(self.d)
+        self.assertEqual(actual, expected)
+        self.assertRaises(PassThru, self.thetype, check_pass_thru())
+        self.assertRaises(TypeError, self.thetype, [[]])
+
+    def test_len(self):
+        self.assertEqual(len(self.s), len(self.d))
+
+    def test_contains(self):
+        for c in self.letters:
+            self.assertEqual(c in self.s, c in self.d)
+        self.assertRaises(TypeError, self.s.__contains__, [[]])
+
+    def test_copy(self):
+        dup = self.s.copy()
+        self.assertEqual(self.s, dup)
+        self.assertNotEqual(id(self.s), id(dup))
+
+    def test_union(self):
+        u = self.s.union(self.otherword)
+        for c in self.letters:
+            self.assertEqual(c in u, c in self.d or c in self.otherword)
+        self.assertEqual(type(u), self.thetype)
+        self.assertRaises(PassThru, self.s.union, check_pass_thru())
+        self.assertRaises(TypeError, self.s.union, [[]])
+
+    def test_or(self):
+        i = self.s.union(self.otherword)
+        self.assertEqual(self.s | set(self.otherword), i)
+        self.assertEqual(self.s | frozenset(self.otherword), i)
+        try:
+            self.s | self.otherword
+        except TypeError:
+            pass
+        else:
+            self.fail("s|t did not screen-out general iterables")
+
+    def test_intersection(self):
+        i = self.s.intersection(self.otherword)
+        for c in self.letters:
+            self.assertEqual(c in i, c in self.d and c in self.otherword)
+        self.assertEqual(type(i), self.thetype)
+        self.assertRaises(PassThru, self.s.intersection, check_pass_thru())
+
+    def test_and(self):
+        i = self.s.intersection(self.otherword)
+        self.assertEqual(self.s & set(self.otherword), i)
+        self.assertEqual(self.s & frozenset(self.otherword), i)
+        try:
+            self.s & self.otherword
+        except TypeError:
+            pass
+        else:
+            self.fail("s&t did not screen-out general iterables")
+
+    def test_difference(self):
+        i = self.s.difference(self.otherword)
+        for c in self.letters:
+            self.assertEqual(c in i, c in self.d and c not in self.otherword)
+        self.assertEqual(type(i), self.thetype)
+        self.assertRaises(PassThru, self.s.difference, check_pass_thru())
+        self.assertRaises(TypeError, self.s.difference, [[]])
+
+    def test_sub(self):
+        i = self.s.difference(self.otherword)
+        self.assertEqual(self.s - set(self.otherword), i)
+        self.assertEqual(self.s - frozenset(self.otherword), i)
+        try:
+            self.s - self.otherword
+        except TypeError:
+            pass
+        else:
+            self.fail("s-t did not screen-out general iterables")
+
+    def test_symmetric_difference(self):
+        i = self.s.symmetric_difference(self.otherword)
+        for c in self.letters:
+            self.assertEqual(c in i, (c in self.d) ^ (c in self.otherword))
+        self.assertEqual(type(i), self.thetype)
+        self.assertRaises(PassThru, self.s.symmetric_difference, check_pass_thru())
+        self.assertRaises(TypeError, self.s.symmetric_difference, [[]])
+
+    def test_xor(self):
+        i = self.s.symmetric_difference(self.otherword)
+        self.assertEqual(self.s ^ set(self.otherword), i)
+        self.assertEqual(self.s ^ frozenset(self.otherword), i)
+        try:
+            self.s ^ self.otherword
+        except TypeError:
+            pass
+        else:
+            self.fail("s^t did not screen-out general iterables")
+
+    def test_equality(self):
+        self.assertEqual(self.s, set(self.word))
+        self.assertEqual(self.s, frozenset(self.word))
+        self.assertEqual(self.s == self.word, False)
+        self.assertNotEqual(self.s, set(self.otherword))
+        self.assertNotEqual(self.s, frozenset(self.otherword))
+        self.assertEqual(self.s != self.word, True)
+
+    def test_setOfFrozensets(self):
+        t = map(frozenset, ['abcdef', 'bcd', 'bdcb', 'fed', 'fedccba'])
+        s = self.thetype(t)
+        self.assertEqual(len(s), 3)
+
+    def test_compare(self):
+        self.assertRaises(TypeError, self.s.__cmp__, self.s)
+
+    def test_sub_and_super(self):
+        p, q, r = map(self.thetype, ['ab', 'abcde', 'def'])
+        self.assert_(p < q)
+        self.assert_(p <= q)
+        self.assert_(q <= q)
+        self.assert_(q > p)
+        self.assert_(q >= p)
+        self.failIf(q < r)
+        self.failIf(q <= r)
+        self.failIf(q > r)
+        self.failIf(q >= r)
+
+    def test_pickling(self):
+        p = pickle.dumps(self.s)
+        dup = pickle.loads(p)
+        self.assertEqual(self.s, dup, "%s != %s" % (self.s, dup))
+
+class TestSet(TestJointOps):
+    thetype = set
+
+    def test_hash(self):
+        self.assertRaises(TypeError, hash, self.s)
+
+    def test_clear(self):
+        self.s.clear()
+        self.assertEqual(self.s, set([]))
+
+    def test_add(self):
+        self.s.add('Q')
+        self.assert_('Q' in self.s)
+        self.assertRaises(TypeError, self.s.add, [])
+
+    def test_remove(self):
+        self.s.remove('a')
+        self.assert_('a' not in self.s)
+        self.assertRaises(KeyError, self.s.remove, 'Q')
+        self.assertRaises(TypeError, self.s.remove, [])
+
+    def test_discard(self):
+        self.s.discard('a')
+        self.assert_('a' not in self.s)
+        self.s.discard('Q')
+        self.assertRaises(TypeError, self.s.discard, [])
+
+    def test_pop(self):
+        for i in xrange(len(self.s)):
+            elem = self.s.pop()
+            self.assert_(elem not in self.s)
+        self.assertRaises(KeyError, self.s.pop)
+
+    def test_union_update(self):
+        retval = self.s.union_update(self.otherword)
+        self.assertEqual(retval, None)
+        for c in (self.word + self.otherword):
+            self.assert_(c in self.s)
+        self.assertRaises(PassThru, self.s.union_update, check_pass_thru())
+        self.assertRaises(TypeError, self.s.union_update, [[]])
+
+    def test_ior(self):
+        self.s |= set(self.otherword)
+        for c in (self.word + self.otherword):
+            self.assert_(c in self.s)
+
+    def test_intersection_update(self):
+        retval = self.s.intersection_update(self.otherword)
+        self.assertEqual(retval, None)
+        for c in (self.word + self.otherword):
+            if c in self.otherword and c in self.word:
+                self.assert_(c in self.s)
+            else:
+                self.assert_(c not in self.s)
+        self.assertRaises(PassThru, self.s.intersection_update, check_pass_thru())
+        self.assertRaises(TypeError, self.s.intersection_update, [[]])
+
+    def test_iand(self):
+        self.s &= set(self.otherword)
+        for c in (self.word + self.otherword):
+            if c in self.otherword and c in self.word:
+                self.assert_(c in self.s)
+            else:
+                self.assert_(c not in self.s)
+
+    def test_difference_update(self):
+        retval = self.s.difference_update(self.otherword)
+        self.assertEqual(retval, None)
+        for c in (self.word + self.otherword):
+            if c in self.word and c not in self.otherword:
+                self.assert_(c in self.s)
+            else:
+                self.assert_(c not in self.s)
+        self.assertRaises(PassThru, self.s.difference_update, check_pass_thru())
+        self.assertRaises(TypeError, self.s.difference_update, [[]])
+
+    def test_isub(self):
+        self.s -= set(self.otherword)
+        for c in (self.word + self.otherword):
+            if c in self.word and c not in self.otherword:
+                self.assert_(c in self.s)
+            else:
+                self.assert_(c not in self.s)
+
+    def test_symmetric_difference_update(self):
+        retval = self.s.symmetric_difference_update(self.otherword)
+        self.assertEqual(retval, None)
+        for c in (self.word + self.otherword):
+            if (c in self.word) ^ (c in self.otherword):
+                self.assert_(c in self.s)
+            else:
+                self.assert_(c not in self.s)
+        self.assertRaises(PassThru, self.s.symmetric_difference_update, check_pass_thru())
+        self.assertRaises(TypeError, self.s.symmetric_difference_update, [[]])
+
+    def test_ixor(self):
+        self.s ^= set(self.otherword)
+        for c in (self.word + self.otherword):
+            if (c in self.word) ^ (c in self.otherword):
+                self.assert_(c in self.s)
+            else:
+                self.assert_(c not in self.s)
+
+
+class TestFrozenSet(TestJointOps):
+    thetype = frozenset
+
+    def test_hash(self):
+        self.assertEqual(hash(frozenset('abcdeb')), hash(frozenset('ebecda')))
+
+    def test_frozen_as_dictkey(self):
+        seq = range(10) + list('abcdefg') + ['apple']
+        key1 = frozenset(seq)
+        key2 = frozenset(reversed(seq))
+        self.assertEqual(key1, key2)
+        self.assertNotEqual(id(key1), id(key2))
+        d = {}
+        d[key1] = 42
+        self.assertEqual(d[key2], 42)
+
+    def test_hash_caching(self):
+        f = frozenset('abcdcda')
+        self.assertEqual(hash(f), hash(f))
+
+# Tests taken from test_sets.py =============================================
+
+empty_set = set()
+
+#==============================================================================
+
+class TestBasicOps(unittest.TestCase):
+
+    def test_repr(self):
+        if self.repr is not None:
+            self.assertEqual(`self.set`, self.repr)
+
+    def test_length(self):
+        self.assertEqual(len(self.set), self.length)
+
+    def test_self_equality(self):
+        self.assertEqual(self.set, self.set)
+
+    def test_equivalent_equality(self):
+        self.assertEqual(self.set, self.dup)
+
+    def test_copy(self):
+        self.assertEqual(self.set.copy(), self.dup)
+
+    def test_self_union(self):
+        result = self.set | self.set
+        self.assertEqual(result, self.dup)
+
+    def test_empty_union(self):
+        result = self.set | empty_set
+        self.assertEqual(result, self.dup)
+
+    def test_union_empty(self):
+        result = empty_set | self.set
+        self.assertEqual(result, self.dup)
+
+    def test_self_intersection(self):
+        result = self.set & self.set
+        self.assertEqual(result, self.dup)
+
+    def test_empty_intersection(self):
+        result = self.set & empty_set
+        self.assertEqual(result, empty_set)
+
+    def test_intersection_empty(self):
+        result = empty_set & self.set
+        self.assertEqual(result, empty_set)
+
+    def test_self_symmetric_difference(self):
+        result = self.set ^ self.set
+        self.assertEqual(result, empty_set)
+
+    def checkempty_symmetric_difference(self):
+        result = self.set ^ empty_set
+        self.assertEqual(result, self.set)
+
+    def test_self_difference(self):
+        result = self.set - self.set
+        self.assertEqual(result, empty_set)
+
+    def test_empty_difference(self):
+        result = self.set - empty_set
+        self.assertEqual(result, self.dup)
+
+    def test_empty_difference_rev(self):
+        result = empty_set - self.set
+        self.assertEqual(result, empty_set)
+
+    def test_iteration(self):
+        for v in self.set:
+            self.assert_(v in self.values)
+
+    def test_pickling(self):
+        p = pickle.dumps(self.set)
+        copy = pickle.loads(p)
+        self.assertEqual(self.set, copy,
+                         "%s != %s" % (self.set, copy))
+
+#------------------------------------------------------------------------------
+
+class TestBasicOpsEmpty(TestBasicOps):
+    def setUp(self):
+        self.case   = "empty set"
+        self.values = []
+        self.set    = set(self.values)
+        self.dup    = set(self.values)
+        self.length = 0
+        self.repr   = "set([])"
+
+#------------------------------------------------------------------------------
+
+class TestBasicOpsSingleton(TestBasicOps):
+    def setUp(self):
+        self.case   = "unit set (number)"
+        self.values = [3]
+        self.set    = set(self.values)
+        self.dup    = set(self.values)
+        self.length = 1
+        self.repr   = "set([3])"
+
+    def test_in(self):
+        self.failUnless(3 in self.set)
+
+    def test_not_in(self):
+        self.failUnless(2 not in self.set)
+
+#------------------------------------------------------------------------------
+
+class TestBasicOpsTuple(TestBasicOps):
+    def setUp(self):
+        self.case   = "unit set (tuple)"
+        self.values = [(0, "zero")]
+        self.set    = set(self.values)
+        self.dup    = set(self.values)
+        self.length = 1
+        self.repr   = "set([(0, 'zero')])"
+
+    def test_in(self):
+        self.failUnless((0, "zero") in self.set)
+
+    def test_not_in(self):
+        self.failUnless(9 not in self.set)
+
+#------------------------------------------------------------------------------
+
+class TestBasicOpsTriple(TestBasicOps):
+    def setUp(self):
+        self.case   = "triple set"
+        self.values = [0, "zero", operator.add]
+        self.set    = set(self.values)
+        self.dup    = set(self.values)
+        self.length = 3
+        self.repr   = None
+
+#==============================================================================
+
+def baditer():
+    raise TypeError
+    yield True
+
+def gooditer():
+    yield True
+
+class TestExceptionPropagation(unittest.TestCase):
+    """SF 628246:  Set constructor should not trap iterator TypeErrors"""
+
+    def test_instanceWithException(self):
+        self.assertRaises(TypeError, set, baditer())
+
+    def test_instancesWithoutException(self):
+        # All of these iterables should load without exception.
+        set([1,2,3])
+        set((1,2,3))
+        set({'one':1, 'two':2, 'three':3})
+        set(xrange(3))
+        set('abc')
+        set(gooditer())
+
+#==============================================================================
+
+class TestSetOfSets(unittest.TestCase):
+    def test_constructor(self):
+        inner = frozenset([1])
+        outer = set([inner])
+        element = outer.pop()
+        self.assertEqual(type(element), frozenset)
+        outer.add(inner)        # Rebuild set of sets with .add method
+        outer.remove(inner)
+        self.assertEqual(outer, set())   # Verify that remove worked
+        outer.discard(inner)    # Absence of KeyError indicates working fine
+
+#==============================================================================
+
+class TestBinaryOps(unittest.TestCase):
+    def setUp(self):
+        self.set = set((2, 4, 6))
+
+    def test_eq(self):              # SF bug 643115
+        self.assertEqual(self.set, set({2:1,4:3,6:5}))
+
+    def test_union_subset(self):
+        result = self.set | set([2])
+        self.assertEqual(result, set((2, 4, 6)))
+
+    def test_union_superset(self):
+        result = self.set | set([2, 4, 6, 8])
+        self.assertEqual(result, set([2, 4, 6, 8]))
+
+    def test_union_overlap(self):
+        result = self.set | set([3, 4, 5])
+        self.assertEqual(result, set([2, 3, 4, 5, 6]))
+
+    def test_union_non_overlap(self):
+        result = self.set | set([8])
+        self.assertEqual(result, set([2, 4, 6, 8]))
+
+    def test_intersection_subset(self):
+        result = self.set & set((2, 4))
+        self.assertEqual(result, set((2, 4)))
+
+    def test_intersection_superset(self):
+        result = self.set & set([2, 4, 6, 8])
+        self.assertEqual(result, set([2, 4, 6]))
+
+    def test_intersection_overlap(self):
+        result = self.set & set([3, 4, 5])
+        self.assertEqual(result, set([4]))
+
+    def test_intersection_non_overlap(self):
+        result = self.set & set([8])
+        self.assertEqual(result, empty_set)
+
+    def test_sym_difference_subset(self):
+        result = self.set ^ set((2, 4))
+        self.assertEqual(result, set([6]))
+
+    def test_sym_difference_superset(self):
+        result = self.set ^ set((2, 4, 6, 8))
+        self.assertEqual(result, set([8]))
+
+    def test_sym_difference_overlap(self):
+        result = self.set ^ set((3, 4, 5))
+        self.assertEqual(result, set([2, 3, 5, 6]))
+
+    def test_sym_difference_non_overlap(self):
+        result = self.set ^ set([8])
+        self.assertEqual(result, set([2, 4, 6, 8]))
+
+    def test_cmp(self):
+        a, b = set('a'), set('b')
+        self.assertRaises(TypeError, cmp, a, b)
+
+        # You can view this as a buglet:  cmp(a, a) does not raise TypeError,
+        # because __eq__ is tried before __cmp__, and a.__eq__(a) returns True,
+        # which Python thinks is good enough to synthesize a cmp() result
+        # without calling __cmp__.
+        self.assertEqual(cmp(a, a), 0)
+
+        self.assertRaises(TypeError, cmp, a, 12)
+        self.assertRaises(TypeError, cmp, "abc", a)
+
+#==============================================================================
+
+class TestUpdateOps(unittest.TestCase):
+    def setUp(self):
+        self.set = set((2, 4, 6))
+
+    def test_union_subset(self):
+        self.set |= set([2])
+        self.assertEqual(self.set, set((2, 4, 6)))
+
+    def test_union_superset(self):
+        self.set |= set([2, 4, 6, 8])
+        self.assertEqual(self.set, set([2, 4, 6, 8]))
+
+    def test_union_overlap(self):
+        self.set |= set([3, 4, 5])
+        self.assertEqual(self.set, set([2, 3, 4, 5, 6]))
+
+    def test_union_non_overlap(self):
+        self.set |= set([8])
+        self.assertEqual(self.set, set([2, 4, 6, 8]))
+
+    def test_union_method_call(self):
+        self.set.union_update(set([3, 4, 5]))
+        self.assertEqual(self.set, set([2, 3, 4, 5, 6]))
+
+    def test_intersection_subset(self):
+        self.set &= set((2, 4))
+        self.assertEqual(self.set, set((2, 4)))
+
+    def test_intersection_superset(self):
+        self.set &= set([2, 4, 6, 8])
+        self.assertEqual(self.set, set([2, 4, 6]))
+
+    def test_intersection_overlap(self):
+        self.set &= set([3, 4, 5])
+        self.assertEqual(self.set, set([4]))
+
+    def test_intersection_non_overlap(self):
+        self.set &= set([8])
+        self.assertEqual(self.set, empty_set)
+
+    def test_intersection_method_call(self):
+        self.set.intersection_update(set([3, 4, 5]))
+        self.assertEqual(self.set, set([4]))
+
+    def test_sym_difference_subset(self):
+        self.set ^= set((2, 4))
+        self.assertEqual(self.set, set([6]))
+
+    def test_sym_difference_superset(self):
+        self.set ^= set((2, 4, 6, 8))
+        self.assertEqual(self.set, set([8]))
+
+    def test_sym_difference_overlap(self):
+        self.set ^= set((3, 4, 5))
+        self.assertEqual(self.set, set([2, 3, 5, 6]))
+
+    def test_sym_difference_non_overlap(self):
+        self.set ^= set([8])
+        self.assertEqual(self.set, set([2, 4, 6, 8]))
+
+    def test_sym_difference_method_call(self):
+        self.set.symmetric_difference_update(set([3, 4, 5]))
+        self.assertEqual(self.set, set([2, 3, 5, 6]))
+
+    def test_difference_subset(self):
+        self.set -= set((2, 4))
+        self.assertEqual(self.set, set([6]))
+
+    def test_difference_superset(self):
+        self.set -= set((2, 4, 6, 8))
+        self.assertEqual(self.set, set([]))
+
+    def test_difference_overlap(self):
+        self.set -= set((3, 4, 5))
+        self.assertEqual(self.set, set([2, 6]))
+
+    def test_difference_non_overlap(self):
+        self.set -= set([8])
+        self.assertEqual(self.set, set([2, 4, 6]))
+
+    def test_difference_method_call(self):
+        self.set.difference_update(set([3, 4, 5]))
+        self.assertEqual(self.set, set([2, 6]))
+
+#==============================================================================
+
+class TestMutate(unittest.TestCase):
+    def setUp(self):
+        self.values = ["a", "b", "c"]
+        self.set = set(self.values)
+
+    def test_add_present(self):
+        self.set.add("c")
+        self.assertEqual(self.set, set("abc"))
+
+    def test_add_absent(self):
+        self.set.add("d")
+        self.assertEqual(self.set, set("abcd"))
+
+    def test_add_until_full(self):
+        tmp = set()
+        expected_len = 0
+        for v in self.values:
+            tmp.add(v)
+            expected_len += 1
+            self.assertEqual(len(tmp), expected_len)
+        self.assertEqual(tmp, self.set)
+
+    def test_remove_present(self):
+        self.set.remove("b")
+        self.assertEqual(self.set, set("ac"))
+
+    def test_remove_absent(self):
+        try:
+            self.set.remove("d")
+            self.fail("Removing missing element should have raised LookupError")
+        except LookupError:
+            pass
+
+    def test_remove_until_empty(self):
+        expected_len = len(self.set)
+        for v in self.values:
+            self.set.remove(v)
+            expected_len -= 1
+            self.assertEqual(len(self.set), expected_len)
+
+    def test_discard_present(self):
+        self.set.discard("c")
+        self.assertEqual(self.set, set("ab"))
+
+    def test_discard_absent(self):
+        self.set.discard("d")
+        self.assertEqual(self.set, set("abc"))
+
+    def test_clear(self):
+        self.set.clear()
+        self.assertEqual(len(self.set), 0)
+
+    def test_pop(self):
+        popped = {}
+        while self.set:
+            popped[self.set.pop()] = None
+        self.assertEqual(len(popped), len(self.values))
+        for v in self.values:
+            self.failUnless(v in popped)
+
+    def test_update_empty_tuple(self):
+        self.set.union_update(())
+        self.assertEqual(self.set, set(self.values))
+
+    def test_update_unit_tuple_overlap(self):
+        self.set.union_update(("a",))
+        self.assertEqual(self.set, set(self.values))
+
+    def test_update_unit_tuple_non_overlap(self):
+        self.set.union_update(("a", "z"))
+        self.assertEqual(self.set, set(self.values + ["z"]))
+
+#==============================================================================
+
+class TestSubsets(unittest.TestCase):
+
+    case2method = {"<=": "issubset",
+                   ">=": "issuperset",
+                  }
+
+    reverse = {"==": "==",
+               "!=": "!=",
+               "<":  ">",
+               ">":  "<",
+               "<=": ">=",
+               ">=": "<=",
+              }
+
+    def test_issubset(self):
+        x = self.left
+        y = self.right
+        for case in "!=", "==", "<", "<=", ">", ">=":
+            expected = case in self.cases
+            # Test the binary infix spelling.
+            result = eval("x" + case + "y", locals())
+            self.assertEqual(result, expected)
+            # Test the "friendly" method-name spelling, if one exists.
+            if case in TestSubsets.case2method:
+                method = getattr(x, TestSubsets.case2method[case])
+                result = method(y)
+                self.assertEqual(result, expected)
+
+            # Now do the same for the operands reversed.
+            rcase = TestSubsets.reverse[case]
+            result = eval("y" + rcase + "x", locals())
+            self.assertEqual(result, expected)
+            if rcase in TestSubsets.case2method:
+                method = getattr(y, TestSubsets.case2method[rcase])
+                result = method(x)
+                self.assertEqual(result, expected)
+#------------------------------------------------------------------------------
+
+class TestSubsetEqualEmpty(TestSubsets):
+    left  = set()
+    right = set()
+    name  = "both empty"
+    cases = "==", "<=", ">="
+
+#------------------------------------------------------------------------------
+
+class TestSubsetEqualNonEmpty(TestSubsets):
+    left  = set([1, 2])
+    right = set([1, 2])
+    name  = "equal pair"
+    cases = "==", "<=", ">="
+
+#------------------------------------------------------------------------------
+
+class TestSubsetEmptyNonEmpty(TestSubsets):
+    left  = set()
+    right = set([1, 2])
+    name  = "one empty, one non-empty"
+    cases = "!=", "<", "<="
+
+#------------------------------------------------------------------------------
+
+class TestSubsetPartial(TestSubsets):
+    left  = set([1])
+    right = set([1, 2])
+    name  = "one a non-empty proper subset of other"
+    cases = "!=", "<", "<="
+
+#------------------------------------------------------------------------------
+
+class TestSubsetNonOverlap(TestSubsets):
+    left  = set([1])
+    right = set([2])
+    name  = "neither empty, neither contains"
+    cases = "!="
+
+#==============================================================================
+
+class TestOnlySetsInBinaryOps(unittest.TestCase):
+
+    def test_eq_ne(self):
+        # Unlike the others, this is testing that == and != *are* allowed.
+        self.assertEqual(self.other == self.set, False)
+        self.assertEqual(self.set == self.other, False)
+        self.assertEqual(self.other != self.set, True)
+        self.assertEqual(self.set != self.other, True)
+
+    def test_ge_gt_le_lt(self):
+        self.assertRaises(TypeError, lambda: self.set < self.other)
+        self.assertRaises(TypeError, lambda: self.set <= self.other)
+        self.assertRaises(TypeError, lambda: self.set > self.other)
+        self.assertRaises(TypeError, lambda: self.set >= self.other)
+
+        self.assertRaises(TypeError, lambda: self.other < self.set)
+        self.assertRaises(TypeError, lambda: self.other <= self.set)
+        self.assertRaises(TypeError, lambda: self.other > self.set)
+        self.assertRaises(TypeError, lambda: self.other >= self.set)
+
+    def test_union_update_operator(self):
+        try:
+            self.set |= self.other
+        except TypeError:
+            pass
+        else:
+            self.fail("expected TypeError")
+
+    def test_union_update(self):
+        if self.otherIsIterable:
+            self.set.union_update(self.other)
+        else:
+            self.assertRaises(TypeError, self.set.union_update, self.other)
+
+    def test_union(self):
+        self.assertRaises(TypeError, lambda: self.set | self.other)
+        self.assertRaises(TypeError, lambda: self.other | self.set)
+        if self.otherIsIterable:
+            self.set.union(self.other)
+        else:
+            self.assertRaises(TypeError, self.set.union, self.other)
+
+    def test_intersection_update_operator(self):
+        try:
+            self.set &= self.other
+        except TypeError:
+            pass
+        else:
+            self.fail("expected TypeError")
+
+    def test_intersection_update(self):
+        if self.otherIsIterable:
+            self.set.intersection_update(self.other)
+        else:
+            self.assertRaises(TypeError,
+                              self.set.intersection_update,
+                              self.other)
+
+    def test_intersection(self):
+        self.assertRaises(TypeError, lambda: self.set & self.other)
+        self.assertRaises(TypeError, lambda: self.other & self.set)
+        if self.otherIsIterable:
+            self.set.intersection(self.other)
+        else:
+            self.assertRaises(TypeError, self.set.intersection, self.other)
+
+    def test_sym_difference_update_operator(self):
+        try:
+            self.set ^= self.other
+        except TypeError:
+            pass
+        else:
+            self.fail("expected TypeError")
+
+    def test_sym_difference_update(self):
+        if self.otherIsIterable:
+            self.set.symmetric_difference_update(self.other)
+        else:
+            self.assertRaises(TypeError,
+                              self.set.symmetric_difference_update,
+                              self.other)
+
+    def test_sym_difference(self):
+        self.assertRaises(TypeError, lambda: self.set ^ self.other)
+        self.assertRaises(TypeError, lambda: self.other ^ self.set)
+        if self.otherIsIterable:
+            self.set.symmetric_difference(self.other)
+        else:
+            self.assertRaises(TypeError, self.set.symmetric_difference, self.other)
+
+    def test_difference_update_operator(self):
+        try:
+            self.set -= self.other
+        except TypeError:
+            pass
+        else:
+            self.fail("expected TypeError")
+
+    def test_difference_update(self):
+        if self.otherIsIterable:
+            self.set.difference_update(self.other)
+        else:
+            self.assertRaises(TypeError,
+                              self.set.difference_update,
+                              self.other)
+
+    def test_difference(self):
+        self.assertRaises(TypeError, lambda: self.set - self.other)
+        self.assertRaises(TypeError, lambda: self.other - self.set)
+        if self.otherIsIterable:
+            self.set.difference(self.other)
+        else:
+            self.assertRaises(TypeError, self.set.difference, self.other)
+
+#------------------------------------------------------------------------------
+
+class TestOnlySetsNumeric(TestOnlySetsInBinaryOps):
+    def setUp(self):
+        self.set   = set((1, 2, 3))
+        self.other = 19
+        self.otherIsIterable = False
+
+#------------------------------------------------------------------------------
+
+class TestOnlySetsDict(TestOnlySetsInBinaryOps):
+    def setUp(self):
+        self.set   = set((1, 2, 3))
+        self.other = {1:2, 3:4}
+        self.otherIsIterable = True
+
+#------------------------------------------------------------------------------
+
+class TestOnlySetsOperator(TestOnlySetsInBinaryOps):
+    def setUp(self):
+        self.set   = set((1, 2, 3))
+        self.other = operator.add
+        self.otherIsIterable = False
+
+#------------------------------------------------------------------------------
+
+class TestOnlySetsTuple(TestOnlySetsInBinaryOps):
+    def setUp(self):
+        self.set   = set((1, 2, 3))
+        self.other = (2, 4, 6)
+        self.otherIsIterable = True
+
+#------------------------------------------------------------------------------
+
+class TestOnlySetsString(TestOnlySetsInBinaryOps):
+    def setUp(self):
+        self.set   = set((1, 2, 3))
+        self.other = 'abc'
+        self.otherIsIterable = True
+
+#------------------------------------------------------------------------------
+
+class TestOnlySetsGenerator(TestOnlySetsInBinaryOps):
+    def setUp(self):
+        def gen():
+            for i in xrange(0, 10, 2):
+                yield i
+        self.set   = set((1, 2, 3))
+        self.other = gen()
+        self.otherIsIterable = True
+
+#==============================================================================
+
+class TestCopying(unittest.TestCase):
+
+    def test_copy(self):
+        dup = self.set.copy()
+        dup_list = list(dup); dup_list.sort()
+        set_list = list(self.set); set_list.sort()
+        self.assertEqual(len(dup_list), len(set_list))
+        for i in range(len(dup_list)):
+            self.failUnless(dup_list[i] is set_list[i])
+
+    def test_deep_copy(self):
+        dup = copy.deepcopy(self.set)
+        ##print type(dup), `dup`
+        dup_list = list(dup); dup_list.sort()
+        set_list = list(self.set); set_list.sort()
+        self.assertEqual(len(dup_list), len(set_list))
+        for i in range(len(dup_list)):
+            self.assertEqual(dup_list[i], set_list[i])
+
+#------------------------------------------------------------------------------
+
+class TestCopyingEmpty(TestCopying):
+    def setUp(self):
+        self.set = set()
+
+#------------------------------------------------------------------------------
+
+class TestCopyingSingleton(TestCopying):
+    def setUp(self):
+        self.set = set(["hello"])
+
+#------------------------------------------------------------------------------
+
+class TestCopyingTriple(TestCopying):
+    def setUp(self):
+        self.set = set(["zero", 0, None])
+
+#------------------------------------------------------------------------------
+
+class TestCopyingTuple(TestCopying):
+    def setUp(self):
+        self.set = set([(1, 2)])
+
+#------------------------------------------------------------------------------
+
+class TestCopyingNested(TestCopying):
+    def setUp(self):
+        self.set = set([((1, 2), (3, 4))])
+
+#==============================================================================
+
+class TestIdentities(unittest.TestCase):
+    def setUp(self):
+        self.a = set('abracadabra')
+        self.b = set('alacazam')
+
+    def test_binopsVsSubsets(self):
+        a, b = self.a, self.b
+        self.assert_(a - b < a)
+        self.assert_(b - a < b)
+        self.assert_(a & b < a)
+        self.assert_(a & b < b)
+        self.assert_(a | b > a)
+        self.assert_(a | b > b)
+        self.assert_(a ^ b < a | b)
+
+    def test_commutativity(self):
+        a, b = self.a, self.b
+        self.assertEqual(a&b, b&a)
+        self.assertEqual(a|b, b|a)
+        self.assertEqual(a^b, b^a)
+        if a != b:
+            self.assertNotEqual(a-b, b-a)
+
+    def test_summations(self):
+        # check that sums of parts equal the whole
+        a, b = self.a, self.b
+        self.assertEqual((a-b)|(a&b)|(b-a), a|b)
+        self.assertEqual((a&b)|(a^b), a|b)
+        self.assertEqual(a|(b-a), a|b)
+        self.assertEqual((a-b)|b, a|b)
+        self.assertEqual((a-b)|(a&b), a)
+        self.assertEqual((b-a)|(a&b), b)
+        self.assertEqual((a-b)|(b-a), a^b)
+
+    def test_exclusion(self):
+        # check that inverse operations show non-overlap
+        a, b, zero = self.a, self.b, set()
+        self.assertEqual((a-b)&b, zero)
+        self.assertEqual((b-a)&a, zero)
+        self.assertEqual((a&b)&(a^b), zero)
+
+# Tests derived from test_itertools.py =======================================
+
+def R(seqn):
+    'Regular generator'
+    for i in seqn:
+        yield i
+
+class G:
+    'Sequence using __getitem__'
+    def __init__(self, seqn):
+        self.seqn = seqn
+    def __getitem__(self, i):
+        return self.seqn[i]
+
+class I:
+    'Sequence using iterator protocol'
+    def __init__(self, seqn):
+        self.seqn = seqn
+        self.i = 0
+    def __iter__(self):
+        return self
+    def next(self):
+        if self.i >= len(self.seqn): raise StopIteration
+        v = self.seqn[self.i]
+        self.i += 1
+        return v
+
+class Ig:
+    'Sequence using iterator protocol defined with a generator'
+    def __init__(self, seqn):
+        self.seqn = seqn
+        self.i = 0
+    def __iter__(self):
+        for val in self.seqn:
+            yield val
+
+class X:
+    'Missing __getitem__ and __iter__'
+    def __init__(self, seqn):
+        self.seqn = seqn
+        self.i = 0
+    def next(self):
+        if self.i >= len(self.seqn): raise StopIteration
+        v = self.seqn[self.i]
+        self.i += 1
+        return v
+
+class N:
+    'Iterator missing next()'
+    def __init__(self, seqn):
+        self.seqn = seqn
+        self.i = 0
+    def __iter__(self):
+        return self
+
+class E:
+    'Test propagation of exceptions'
+    def __init__(self, seqn):
+        self.seqn = seqn
+        self.i = 0
+    def __iter__(self):
+        return self
+    def next(self):
+        3/0
+
+class S:
+    'Test immediate stop'
+    def __init__(self, seqn):
+        pass
+    def __iter__(self):
+        return self
+    def next(self):
+        raise StopIteration
+
+from itertools import chain, imap
+def L(seqn):
+    'Test multiple tiers of iterators'
+    return chain(imap(lambda x:x, R(Ig(G(seqn)))))
+
+class TestVariousIteratorArgs(unittest.TestCase):
+
+    def test_constructor(self):
+        for cons in (set, frozenset):
+            for s in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5)):
+                for g in (G, I, Ig, S, L, R):
+                    self.assertEqual(list.sorted(cons(g(s))), list.sorted(g(s)))
+                self.assertRaises(TypeError, cons , X(s))
+                self.assertRaises(TypeError, cons , N(s))
+                self.assertRaises(ZeroDivisionError, cons , E(s))
+
+    def test_inline_methods(self):
+        s = set('november')
+        for data in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5), 'december'):
+            for meth in (s.union, s.intersection, s.difference, s.symmetric_difference):
+                for g in (G, I, Ig, L, R):
+                    expected = meth(data)
+                    actual = meth(G(data))
+                    self.assertEqual(list.sorted(actual), list.sorted(expected))
+                self.assertRaises(TypeError, meth, X(s))
+                self.assertRaises(TypeError, meth, N(s))
+                self.assertRaises(ZeroDivisionError, meth, E(s))
+
+    def test_inplace_methods(self):
+        for data in ("123", "", range(1000), ('do', 1.2), xrange(2000,2200,5), 'december'):
+            for methname in ('union_update', 'intersection_update',
+                             'difference_update', 'symmetric_difference_update'):
+                for g in (G, I, Ig, S, L, R):
+                    s = set('january')
+                    t = s.copy()
+                    getattr(s, methname)(list(g(data)))
+                    getattr(t, methname)(g(data))
+                    self.assertEqual(list.sorted(s), list.sorted(t))
+
+                self.assertRaises(TypeError, getattr(set('january'), methname), X(data))
+                self.assertRaises(TypeError, getattr(set('january'), methname), N(data))
+                self.assertRaises(ZeroDivisionError, getattr(set('january'), methname), E(data))
+
+#==============================================================================
+
+def test_main(verbose=None):
+    import sys
+    from test import test_sets
+    test_classes = (
+        TestSet,
+        TestFrozenSet,
+        TestSetOfSets,
+        TestExceptionPropagation,
+        TestBasicOpsEmpty,
+        TestBasicOpsSingleton,
+        TestBasicOpsTuple,
+        TestBasicOpsTriple,
+        TestBinaryOps,
+        TestUpdateOps,
+        TestMutate,
+        TestSubsetEqualEmpty,
+        TestSubsetEqualNonEmpty,
+        TestSubsetEmptyNonEmpty,
+        TestSubsetPartial,
+        TestSubsetNonOverlap,
+        TestOnlySetsNumeric,
+        TestOnlySetsDict,
+        TestOnlySetsOperator,
+        TestOnlySetsTuple,
+        TestOnlySetsString,
+        TestOnlySetsGenerator,
+        TestCopyingEmpty,
+        TestCopyingSingleton,
+        TestCopyingTriple,
+        TestCopyingTuple,
+        TestCopyingNested,
+        TestIdentities,
+        TestVariousIteratorArgs,
+        )
+
+    test_support.run_unittest(*test_classes)
+
+    # verify reference counting
+    if verbose and hasattr(sys, "gettotalrefcount"):
+        import gc
+        counts = [None] * 5
+        for i in xrange(len(counts)):
+            test_support.run_unittest(*test_classes)
+            gc.collect()
+            counts[i] = sys.gettotalrefcount()
+        print counts
+
+if __name__ == "__main__":
+    test_main(verbose=True)
diff --git a/Lib/test/test_sort.py b/Lib/test/test_sort.py
index 1c10230..053b338 100644
--- a/Lib/test/test_sort.py
+++ b/Lib/test/test_sort.py
@@ -1,7 +1,6 @@
 from test.test_support import verbose
 import random
 from UserList import UserList
-from sets import Set
 
 nerrors = 0
 
@@ -230,7 +229,7 @@
             self.assertEqual(list.sorted(s), list.sorted(T(s)))
 
         s = ''.join(dict.fromkeys(s).keys())  # unique letters only
-        for T in [unicode, Set, list, tuple, dict.fromkeys]:
+        for T in [unicode, set, frozenset, list, tuple, dict.fromkeys]:
             self.assertEqual(list.sorted(s), list.sorted(T(s)))
 
     def test_baddecorator(self):
diff --git a/Lib/test/test_strptime.py b/Lib/test/test_strptime.py
index 4dcc82a..70745eb 100644
--- a/Lib/test/test_strptime.py
+++ b/Lib/test/test_strptime.py
@@ -4,7 +4,6 @@
 import time
 import locale
 import re
-import sets
 import sys
 from test import test_support
 
@@ -17,10 +16,10 @@
 
 class LocaleTime_Tests(unittest.TestCase):
     """Tests for _strptime.LocaleTime.
-    
+
     All values are lower-cased when stored in LocaleTime, so make sure to
     compare values after running ``lower`` on them.
-    
+
     """
 
     def setUp(self):
@@ -167,7 +166,7 @@
         # Make sure when tuple or something has no values no regex is generated.
         # Fixes bug #661354
         test_locale = _strptime.LocaleTime()
-        test_locale.timezone = (sets.ImmutableSet(), sets.ImmutableSet())
+        test_locale.timezone = (frozenset(), frozenset())
         self.failUnless(_strptime.TimeRE(test_locale).pattern("%Z") == '',
                         "with timezone == ('',''), TimeRE().pattern('%Z') != ''")
 
diff --git a/Lib/test/test_userdict.py b/Lib/test/test_userdict.py
index 399ddda..602fd90 100644
--- a/Lib/test/test_userdict.py
+++ b/Lib/test/test_userdict.py
@@ -1,8 +1,6 @@
 # Check every path through every method of UserDict
 
 import test.test_support, unittest
-from sets import Set
-
 import UserDict
 
 class TestMappingProtocol(unittest.TestCase):
@@ -69,7 +67,7 @@
             self.assert_(hasattr(iter, 'next'))
             self.assert_(hasattr(iter, '__iter__'))
             x = list(iter)
-            self.assert_(Set(x)==Set(lst)==Set(ref))
+            self.assert_(set(x)==set(lst)==set(ref))
         check_iterandlist(d.iterkeys(), d.keys(), self.reference.keys())
         check_iterandlist(iter(d), d.keys(), self.reference.keys())
         check_iterandlist(d.itervalues(), d.values(), self.reference.values())
@@ -242,7 +240,7 @@
         for k in u2:
             ikeys.append(k)
         keys = u2.keys()
-        self.assertEqual(Set(ikeys), Set(keys))
+        self.assertEqual(set(ikeys), set(keys))
 
         # Test setdefault
         t = UserDict.UserDict()
diff --git a/Lib/test/test_weakref.py b/Lib/test/test_weakref.py
index 093133e..0209faf 100644
--- a/Lib/test/test_weakref.py
+++ b/Lib/test/test_weakref.py
@@ -4,7 +4,6 @@
 import weakref
 
 from test import test_support
-from sets import Set
 
 
 class C:
@@ -392,7 +391,7 @@
                          "wrong object returned by weak dict!")
         items1 = dict.items()
         items2 = dict.copy().items()
-        self.assert_(Set(items1) == Set(items2),
+        self.assert_(set(items1) == set(items2),
                      "cloning of weak-keyed dictionary did not work!")
         del items1, items2
         self.assert_(len(dict) == self.COUNT)
diff --git a/Makefile.pre.in b/Makefile.pre.in
index c87bf6e..3c3c119 100644
--- a/Makefile.pre.in
+++ b/Makefile.pre.in
@@ -275,6 +275,7 @@
 		Objects/object.o \
 		Objects/obmalloc.o \
 		Objects/rangeobject.o \
+                Objects/setobject.o \
 		Objects/sliceobject.o \
 		Objects/stringobject.o \
 		Objects/structseq.o \
@@ -500,6 +501,7 @@
 		Include/pystate.h \
 		Include/pythonrun.h \
 		Include/rangeobject.h \
+                Include/setobject.h \
 		Include/sliceobject.h \
 		Include/stringobject.h \
 		Include/structseq.h \
diff --git a/Misc/NEWS b/Misc/NEWS
index 14a70f1..444231e 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -12,6 +12,8 @@
 Core and builtins
 -----------------
 
+- Added two builtin types, set() and frozenset().
+
 - Critical bugfix, for SF bug 840829:  if cyclic garbage collection
   happened to occur during a weakref callback for a new-style class
   instance, subtle memory corruption was the result (in a release build;
diff --git a/Objects/setobject.c b/Objects/setobject.c
new file mode 100644
index 0000000..0845840
--- /dev/null
+++ b/Objects/setobject.c
@@ -0,0 +1,1073 @@
+#include "Python.h"
+
+/* set object implementation 
+   written and maintained by Raymond D. Hettinger <python@rcn.com>
+   derived from sets.py written by Greg V. Wilson, Alex Martelli, 
+   Guido van Rossum, Raymond Hettinger, and Tim Peters.
+
+   Copyright (c) 2003 Python Software Foundation.
+   All rights reserved.
+*/
+
+/* Fast access macros */ 
+
+#define DICT_CONTAINS(d, k)  (d->ob_type->tp_as_sequence->sq_contains(d, k))
+#define IS_SET(so)	(so->ob_type == &PySet_Type || so->ob_type == &PyFrozenSet_Type)
+
+/* set object **********************************************************/
+
+static PyObject *
+make_new_set(PyTypeObject *type, PyObject *iterable)
+{
+	PyObject *data;
+	PyObject *it = NULL;
+	PyObject *item;
+	PySetObject *so;
+
+	/* Get iterator. */
+	if (iterable != NULL) {
+		it = PyObject_GetIter(iterable);
+		if (it == NULL)
+			return NULL;
+	}
+
+	data = PyDict_New();
+	if (data == NULL) {
+		Py_DECREF(it);
+		return NULL;
+	}
+
+	while (it != NULL && (item = PyIter_Next(it)) != NULL) {
+                if (PyDict_SetItem(data, item, Py_True) == -1) {
+			Py_DECREF(it);
+			Py_DECREF(data);
+			Py_DECREF(item);
+			PyErr_SetString(PyExc_TypeError,
+					"all set entries must be immutable");
+			return NULL;
+                } 
+		Py_DECREF(item);
+	}
+	Py_XDECREF(it);
+	if (PyErr_Occurred()) {
+		Py_DECREF(data);
+		return NULL;
+	}
+
+	/* create PySetObject structure */
+	so = (PySetObject *)type->tp_alloc(type, 0);
+	if (so == NULL) {
+		Py_DECREF(data);
+		return NULL;
+	}
+	so->data = data;
+	so->hash = -1;
+
+	return (PyObject *)so;
+}
+
+static PyObject *
+set_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
+{
+	PyObject *iterable = NULL;
+
+	if (!PyArg_UnpackTuple(args, type->tp_name, 0, 1, &iterable))
+		return NULL;
+	return make_new_set(type, iterable);
+}
+
+static void
+set_dealloc(PySetObject *so)
+{
+	PyObject_GC_UnTrack(so);
+	Py_XDECREF(so->data);
+	so->ob_type->tp_free(so);
+}
+
+static int
+set_traverse(PySetObject *so, visitproc visit, void *arg)
+{
+	if (so->data)
+		return visit(so->data, arg);
+	return 0;
+}
+
+static PyObject *
+set_iter(PySetObject *so)
+{
+	return PyObject_GetIter(so->data);
+}
+
+static int
+set_len(PySetObject *so)
+{
+	return PyDict_Size(so->data);
+}
+
+static int
+set_contains(PySetObject *so, PyObject *key)
+{
+	return DICT_CONTAINS(so->data, key);
+}
+
+static PyObject *
+set_copy(PySetObject *so)
+{
+	PyObject *data;
+	PySetObject *newso;
+
+	data = PyDict_Copy(so->data);
+	if (data == NULL)
+		return NULL;
+
+	newso = (PySetObject *)(so->ob_type->tp_alloc(so->ob_type, 0));
+	if (newso == NULL) {
+		Py_DECREF(data);
+		return NULL;
+	}
+	newso->data = data;
+	newso->hash = so->hash;
+	return (PyObject *)newso;
+}
+
+PyDoc_STRVAR(copy_doc, "Return a shallow copy of a set.");
+
+static PyObject *
+set_union(PySetObject *so, PyObject *other)
+{
+	PySetObject *result;
+	PyObject *item, *data, *it;
+
+	result = (PySetObject *)set_copy(so);
+	it = PyObject_GetIter(other);
+	if (it == NULL) {
+		Py_DECREF(result);
+		return NULL;
+	}
+	data = result->data;
+	while ((item = PyIter_Next(it)) != NULL) {
+                if (PyDict_SetItem(data, item, Py_True) == -1) {
+			Py_DECREF(it);
+			Py_DECREF(result);
+			Py_DECREF(item);
+			PyErr_SetString(PyExc_TypeError,
+					"all set entries must be immutable");
+			return NULL;
+                } 
+		Py_DECREF(item);
+	}
+	Py_DECREF(it);
+	if (PyErr_Occurred()) {
+		Py_DECREF(result);
+		return NULL;
+	}
+	return (PyObject *)result;
+}
+
+PyDoc_STRVAR(union_doc,
+ "Return the union of two sets as a new set.\n\
+\n\
+(i.e. all elements that are in either set.)");
+
+static PyObject *
+set_union_update(PySetObject *so, PyObject *other)
+{
+	PyObject *item, *data, *it;
+
+	it = PyObject_GetIter(other);
+	if (it == NULL)
+		return NULL;
+	data = so->data;
+
+	while ((item = PyIter_Next(it)) != NULL) {
+                if (PyDict_SetItem(data, item, Py_True) == -1) {
+			Py_DECREF(it);
+			Py_DECREF(item);
+			PyErr_SetString(PyExc_TypeError,
+					"all set entries must be immutable");
+			return NULL;
+                } 
+		Py_DECREF(item);
+	}
+	Py_DECREF(it);
+	if (PyErr_Occurred())
+		return NULL;
+	Py_RETURN_NONE;
+}
+
+PyDoc_STRVAR(union_update_doc, 
+"Update a set with the union of itself and another.");
+
+static PyObject *
+set_or(PySetObject *so, PyObject *other)
+{
+	if (!IS_SET(so) || !IS_SET(other)) {
+		Py_INCREF(Py_NotImplemented);
+		return Py_NotImplemented;
+	}
+	return set_union(so, other);
+}
+
+static PyObject *
+set_ior(PySetObject *so, PyObject *other)
+{
+	PyObject *result;
+
+	if (!IS_SET(other)) {
+		Py_INCREF(Py_NotImplemented);
+		return Py_NotImplemented;
+	}
+	result = set_union_update(so, other);
+	if (result == NULL)
+		return NULL;
+	Py_DECREF(result);
+	Py_INCREF(so);
+	return (PyObject *)so;
+}
+
+static PyObject *
+set_intersection(PySetObject *so, PyObject *other)
+{
+	PySetObject *result;
+	PyObject *item, *selfdata, *tgtdata, *it;
+
+	result = (PySetObject *)make_new_set(so->ob_type, NULL);
+	if (result == NULL)
+		return NULL;
+	
+	it = PyObject_GetIter(other);
+	if (it == NULL) {
+		Py_DECREF(result);
+		return NULL;
+	}
+
+	selfdata = so->data;
+	tgtdata = result->data;
+	while ((item = PyIter_Next(it)) != NULL) {
+		if (DICT_CONTAINS(selfdata, item)) {
+			if (PyDict_SetItem(tgtdata, item, Py_True) == -1) {
+				Py_DECREF(it);
+				Py_DECREF(result);
+				Py_DECREF(item);
+				PyErr_SetString(PyExc_TypeError,
+						"all set entries must be immutable");
+				return NULL;
+			}
+		}
+		Py_DECREF(item);
+	}
+	Py_DECREF(it);
+	if (PyErr_Occurred()) {
+		Py_DECREF(result);
+		return NULL;
+	}
+	return (PyObject *)result;
+}
+
+PyDoc_STRVAR(intersection_doc,
+"Return the intersection of two sets as a new set.\n\
+\n\
+(i.e. all elements that are in both sets.)");
+
+static PyObject *
+set_intersection_update(PySetObject *so, PyObject *other)
+{
+	PyObject *item, *selfdata, *it, *newdict, *tmp;
+
+	newdict = PyDict_New();
+	if (newdict == NULL)
+		return newdict;
+
+	it = PyObject_GetIter(other);
+	if (it == NULL) {
+		Py_DECREF(newdict);
+		return NULL;
+	}
+
+	selfdata = so->data;
+	while ((item = PyIter_Next(it)) != NULL) {
+		if (DICT_CONTAINS(selfdata, item)) {
+			if (PyDict_SetItem(newdict, item, Py_True) == -1) {
+				Py_DECREF(newdict);
+				Py_DECREF(it);
+				Py_DECREF(item);
+				PyErr_SetString(PyExc_TypeError,
+						"all set entries must be immutable");
+				return NULL;
+			}
+		}
+		Py_DECREF(item);
+	}
+	Py_DECREF(it);
+	if (PyErr_Occurred()) {
+		Py_DECREF(newdict);
+		return NULL;
+	}
+	tmp = so->data;
+	so->data = newdict;
+	Py_DECREF(tmp);
+	Py_RETURN_NONE;
+}
+
+PyDoc_STRVAR(intersection_update_doc,
+"Update a set with the intersection of itself and another.");
+
+static PyObject *
+set_and(PySetObject *so, PyObject *other)
+{
+	if (!IS_SET(so) || !IS_SET(other)) {
+		Py_INCREF(Py_NotImplemented);
+		return Py_NotImplemented;
+	}
+	return set_intersection(so, other);
+}
+
+static PyObject *
+set_iand(PySetObject *so, PyObject *other)
+{
+	PyObject *result;
+
+	if (!IS_SET(other)) {
+		Py_INCREF(Py_NotImplemented);
+		return Py_NotImplemented;
+	}
+	result = set_intersection_update(so, other);
+	if (result == NULL)
+		return NULL;
+	Py_DECREF(result);
+	Py_INCREF(so);
+	return (PyObject *)so;
+}
+
+static PyObject *
+set_difference(PySetObject *so, PyObject *other)
+{
+	PySetObject *result;
+	PyObject *item, *tgtdata, *it;
+
+	result = (PySetObject *)set_copy(so);
+	if (result == NULL)
+		return NULL;
+	
+	it = PyObject_GetIter(other);
+	if (it == NULL) {
+		Py_DECREF(result);
+		return NULL;
+	}
+
+	tgtdata = result->data;
+	while ((item = PyIter_Next(it)) != NULL) {
+		if (PyDict_DelItem(tgtdata, item) == -1) {
+			if (PyErr_ExceptionMatches(PyExc_KeyError))
+				PyErr_Clear();
+			else {
+				Py_DECREF(it);
+				Py_DECREF(result);
+				Py_DECREF(item);
+				return NULL;
+			}
+		}
+		Py_DECREF(item);
+	}
+	Py_DECREF(it);
+	if (PyErr_Occurred()) {
+		Py_DECREF(result);
+		return NULL;
+	}
+	return (PyObject *)result;
+}
+
+PyDoc_STRVAR(difference_doc,
+"Return the difference of two sets as a new set.\n\
+\n\
+(i.e. all elements that are in this set but not the other.)");
+
+static PyObject *
+set_difference_update(PySetObject *so, PyObject *other)
+{
+	PyObject *item, *tgtdata, *it;
+	
+	it = PyObject_GetIter(other);
+	if (it == NULL)
+		return NULL;
+
+	tgtdata = so->data;
+	while ((item = PyIter_Next(it)) != NULL) {
+		if (PyDict_DelItem(tgtdata, item) == -1) {
+			if (PyErr_ExceptionMatches(PyExc_KeyError))
+				PyErr_Clear();
+			else {
+				Py_DECREF(it);
+				Py_DECREF(item);
+				return NULL;
+			}
+		}
+		Py_DECREF(item);
+	}
+	Py_DECREF(it);
+	if (PyErr_Occurred())
+		return NULL;
+	Py_RETURN_NONE;
+}
+
+PyDoc_STRVAR(difference_update_doc,
+"Remove all elements of another set from this set.");
+
+static PyObject *
+set_sub(PySetObject *so, PyObject *other)
+{
+	if (!IS_SET(so) || !IS_SET(other)) {
+		Py_INCREF(Py_NotImplemented);
+		return Py_NotImplemented;
+	}
+	return set_difference(so, other);
+}
+
+static PyObject *
+set_isub(PySetObject *so, PyObject *other)
+{
+	PyObject *result;
+
+	if (!IS_SET(other)) {
+		Py_INCREF(Py_NotImplemented);
+		return Py_NotImplemented;
+	}
+	result = set_difference_update(so, other);
+	if (result == NULL)
+		return NULL;
+	Py_DECREF(result);
+	Py_INCREF(so);
+	return (PyObject *)so;
+}
+
+static PyObject *
+set_symmetric_difference(PySetObject *so, PyObject *other)
+{
+	PySetObject *result, *otherset;
+	PyObject *item, *selfdata, *otherdata, *tgtdata, *it;
+
+	selfdata = so->data;
+
+	result = (PySetObject *)set_copy(so);
+	if (result == NULL)
+		return NULL;
+	tgtdata = result->data;
+
+	otherset = (PySetObject *)make_new_set(so->ob_type, other);
+	if (otherset == NULL) {
+		Py_DECREF(result);
+		return NULL;
+	}
+	otherdata = otherset->data;	
+
+	it = PyObject_GetIter(otherdata);
+	if (it == NULL) {
+		Py_DECREF(otherset);
+		Py_DECREF(result);
+		return NULL;
+	}
+
+	while ((item = PyIter_Next(it)) != NULL) {
+		if (PyDict_DelItem(tgtdata, item) == -1) {
+			PyErr_Clear();
+			if (PyDict_SetItem(tgtdata, item, Py_True) == -1) {
+				Py_DECREF(it);
+				Py_DECREF(otherset);
+				Py_DECREF(result);
+				Py_DECREF(item);
+				PyErr_SetString(PyExc_TypeError,
+						"all set entries must be immutable");
+				return NULL;
+			} 
+		}
+		Py_DECREF(item);
+	}
+	Py_DECREF(it);
+	Py_DECREF(otherset);
+	if (PyErr_Occurred()) {
+		Py_DECREF(result);
+		return NULL;
+	}
+	return (PyObject *)result;
+}
+
+PyDoc_STRVAR(symmetric_difference_doc,
+"Return the symmetric difference of two sets as a new set.\n\
+\n\
+(i.e. all elements that are in exactly one of the sets.)");
+
+static PyObject *
+set_symmetric_difference_update(PySetObject *so, PyObject *other)
+{
+	PyObject *item, *selfdata, *it, *otherdata;
+	PySetObject *otherset = NULL;
+
+	selfdata = so->data;
+
+	if (PyDict_Check(other))
+		otherdata = other;
+	else if (IS_SET(other))
+		otherdata = ((PySetObject *)other)->data;
+	else {
+		otherset = (PySetObject *)make_new_set(so->ob_type, other);
+		if (otherset == NULL)
+			return NULL;
+		otherdata = otherset->data;
+	}
+
+	it = PyObject_GetIter(otherdata);
+	if (it == NULL)
+		return NULL;
+
+	while ((item = PyIter_Next(it)) != NULL) {
+		if (DICT_CONTAINS(selfdata, item)) {
+			if (PyDict_DelItem(selfdata, item) == -1) {
+				Py_XDECREF(otherset);
+				Py_DECREF(it);
+				Py_DECREF(item);
+				PyErr_SetString(PyExc_TypeError,
+						"all set entries must be immutable");
+				return NULL;
+			}
+		} else {
+			if (PyDict_SetItem(selfdata, item, Py_True) == -1) {
+				Py_XDECREF(otherset);
+				Py_DECREF(it);
+				Py_DECREF(item);
+				PyErr_SetString(PyExc_TypeError,
+						"all set entries must be immutable");
+				return NULL;
+			}
+		}
+		Py_DECREF(item);
+	}
+	Py_XDECREF(otherset);
+	Py_DECREF(it);
+	if (PyErr_Occurred())
+		return NULL;
+	Py_RETURN_NONE;
+}
+
+PyDoc_STRVAR(symmetric_difference_update_doc,
+"Update a set with the symmetric difference of itself and another.");
+
+static PyObject *
+set_xor(PySetObject *so, PyObject *other)
+{
+	if (!IS_SET(so) || !IS_SET(other)) {
+		Py_INCREF(Py_NotImplemented);
+		return Py_NotImplemented;
+	}
+	return set_symmetric_difference(so, other);
+}
+
+static PyObject *
+set_ixor(PySetObject *so, PyObject *other)
+{
+	PyObject *result;
+
+	if (!IS_SET(other)) {
+		Py_INCREF(Py_NotImplemented);
+		return Py_NotImplemented;
+	}
+	result = set_symmetric_difference_update(so, other);
+	if (result == NULL)
+		return NULL;
+	Py_DECREF(result);
+	Py_INCREF(so);
+	return (PyObject *)so;
+}
+
+static PyObject *
+set_issubset(PySetObject *so, PyObject *other)
+{
+	PyObject *otherdata, *it, *item;
+
+	if (!IS_SET(other)) {
+		PyErr_SetString(PyExc_TypeError, "can only compare to a set");
+		return NULL;
+	}
+	if (set_len(so) > set_len((PySetObject *)other)) 
+		Py_RETURN_FALSE;
+	
+	it = PyObject_GetIter(so->data);
+	if (it == NULL)
+		return NULL;
+
+	otherdata = ((PySetObject *)other)->data;
+	while ((item = PyIter_Next(it)) != NULL) {
+		if (!DICT_CONTAINS(otherdata, item)) {
+			Py_DECREF(it);
+			Py_DECREF(item);
+			Py_RETURN_FALSE;
+		}
+		Py_DECREF(item);
+	}
+	Py_DECREF(it);
+	Py_RETURN_TRUE;
+}
+
+PyDoc_STRVAR(issubset_doc, "Report whether another set contains this set.");
+
+static PyObject *
+set_issuperset(PySetObject *so, PyObject *other)
+{
+	if (!IS_SET(other)) {
+		PyErr_SetString(PyExc_TypeError, "can only compare to a set");
+		return NULL;
+	}
+	return set_issubset((PySetObject *)other, (PyObject *)so);
+}
+
+PyDoc_STRVAR(issuperset_doc, "Report whether this set contains another set.");
+
+static long
+set_nohash(PyObject *self)
+{
+	PyErr_SetString(PyExc_TypeError, "set objects are unhashable");
+	return -1;
+}
+
+static int
+set_nocmp(PyObject *self)
+{
+	PyErr_SetString(PyExc_TypeError, "cannot compare sets using cmp()");
+	return -1;
+}
+
+static long
+frozenset_hash(PyObject *self)
+{
+	PyObject *it, *item;
+	PySetObject *so = (PySetObject *)self;
+	long hash = 0;
+
+	if (so->hash != -1)
+		return so->hash;
+		
+	it = PyObject_GetIter(((PySetObject *)so)->data);
+	if (it == NULL) 
+		return -1;
+
+	while ((item = PyIter_Next(it)) != NULL) {
+		hash ^= PyObject_Hash(item);
+		Py_DECREF(item);
+	}
+	so->hash = hash;
+	Py_DECREF(it);
+	return hash;
+}
+
+static PyObject *
+set_richcompare(PySetObject *v, PyObject *w, int op)
+{
+	/* XXX factor out is_set test */
+	if (op == Py_EQ && !IS_SET(w))
+		Py_RETURN_FALSE;
+	else if (op == Py_NE && !IS_SET(w))
+		Py_RETURN_TRUE;
+	if (!IS_SET(w)) {
+		PyErr_SetString(PyExc_TypeError, "can only compare to a set");
+		return NULL;
+	}
+	switch (op) {
+	case Py_EQ:
+	case Py_NE:
+		return PyObject_RichCompare(((PySetObject *)v)->data, 
+			((PySetObject *)w)->data, op);
+	case Py_LE:
+		return set_issubset((PySetObject *)v, w);
+	case Py_GE:
+		return set_issuperset((PySetObject *)v, w);
+	case Py_LT:
+		if (set_len(v) >= set_len((PySetObject *)w))
+			Py_RETURN_FALSE;		
+		return set_issubset((PySetObject *)v, w);
+	case Py_GT:
+		if (set_len(v) <= set_len((PySetObject *)w))
+			Py_RETURN_FALSE;
+		return set_issuperset((PySetObject *)v, w);
+	}
+	Py_INCREF(Py_NotImplemented);
+	return Py_NotImplemented;
+}
+
+static PyObject *
+set_repr(PySetObject *so)
+{
+	PyObject *keys, *result, *listrepr;
+
+	keys = PyDict_Keys(so->data);
+	listrepr = PyObject_Repr(keys);
+	Py_DECREF(keys);
+
+	result = PyString_FromFormat("%s(%s)", so->ob_type->tp_name,
+		PyString_AS_STRING(listrepr));
+	Py_DECREF(listrepr);
+	return result;
+}
+
+static int
+set_tp_print(PySetObject *so, FILE *fp, int flags)
+{
+	PyObject *it, *item;
+	int firstpass=1;
+
+	it = PyObject_GetIter(so->data);
+	if (it == NULL)
+		return -1;
+	fprintf(fp, "%s([", so->ob_type->tp_name);
+
+	while ((item = PyIter_Next(it)) != NULL) {
+		if (firstpass == 1)
+			firstpass = 0;
+		else
+			fprintf(fp, ",");
+		if (PyObject_Print(item, fp, 0) != 0) {
+			Py_DECREF(it);
+			Py_DECREF(item);
+			return -1;
+		}
+		Py_DECREF(item);
+	}
+	Py_DECREF(it);
+	fprintf(fp, "])");
+	return 0;
+}
+
+static PyObject *
+set_clear(PySetObject *so)
+{
+	PyDict_Clear(so->data);
+	so->hash = -1;
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+PyDoc_STRVAR(clear_doc, "Remove all elements from this set.");
+
+static int
+set_tp_clear(PySetObject *so)
+{
+	PyDict_Clear(so->data);
+	so->hash = -1;
+	return 0;
+}
+
+static PyObject *
+set_add(PySetObject *so, PyObject *item)
+{
+	if (PyDict_SetItem(so->data, item, Py_True) == -1)
+		return NULL;
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+PyDoc_STRVAR(add_doc, 
+"Add an element to a set.\n\
+\n\
+This has no effect if the element is already present.");
+
+static PyObject *
+set_remove(PySetObject *so, PyObject *item)
+{
+	if (PyDict_DelItem(so->data, item) == -1)
+		return NULL;
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+PyDoc_STRVAR(remove_doc,
+"Remove an element from a set; it must be a member.\n\
+\n\
+If the element is not a member, raise a KeyError.");
+
+static PyObject *
+set_discard(PySetObject *so, PyObject *item)
+{
+	if (PyDict_DelItem(so->data, item) == -1)
+		if  (PyErr_ExceptionMatches(PyExc_KeyError))
+			PyErr_Clear();
+		else
+			return NULL;
+	Py_INCREF(Py_None);
+	return Py_None;
+}
+
+PyDoc_STRVAR(discard_doc,
+"Remove an element from a set if it is a member.\n\
+\n\
+If the element is not a member, do nothing."); 
+
+static PyObject *
+set_pop(PySetObject *so)
+{
+	PyObject *key, *value;
+	int pos = 0;
+
+	if (!PyDict_Next(so->data, &pos, &key, &value)) {
+		PyErr_SetString(PyExc_KeyError, "pop from an empty set");
+		return NULL;
+	}
+	Py_INCREF(key);
+	if (PyDict_DelItem(so->data, key) == -1)
+		PyErr_Clear();
+	return key;
+}
+
+PyDoc_STRVAR(pop_doc, "Remove and return an arbitrary set element.");
+
+static PyObject *
+set_reduce(PySetObject *so)
+{
+	PyObject *keys=NULL, *args=NULL, *result=NULL;
+
+	keys = PyDict_Keys(so->data);
+	if (keys == NULL)
+		goto done;
+	args = PyTuple_Pack(1, keys);
+	if (args == NULL)
+		goto done;
+	result = PyTuple_Pack(2, so->ob_type, args);
+done:
+	Py_XDECREF(args);
+	Py_XDECREF(keys);
+	return result;
+}
+
+PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
+
+static PySequenceMethods set_as_sequence = {
+	(inquiry)set_len,		/* sq_length */
+	0,				/* sq_concat */
+	0,				/* sq_repeat */
+	0,				/* sq_item */
+	0,				/* sq_slice */
+	0,				/* sq_ass_item */
+	0,				/* sq_ass_slice */
+	(objobjproc)set_contains,	/* sq_contains */
+};
+
+/* set object ********************************************************/
+
+static PyMethodDef set_methods[] = {
+	{"add",		(PyCFunction)set_add,		METH_O,
+	 add_doc},
+	{"clear",	(PyCFunction)set_clear,		METH_NOARGS,
+	 clear_doc},
+	{"copy",	(PyCFunction)set_copy,		METH_NOARGS,
+	 copy_doc},
+	{"__copy__",	(PyCFunction)set_copy,		METH_NOARGS,
+	 copy_doc},
+	{"discard",	(PyCFunction)set_discard,	METH_O,
+	 discard_doc},
+	{"difference",	(PyCFunction)set_difference,	METH_O,
+	 difference_doc},
+	{"difference_update",	(PyCFunction)set_difference_update,	METH_O,
+	 difference_update_doc},
+	{"intersection",(PyCFunction)set_intersection,	METH_O,
+	 intersection_doc},
+	{"intersection_update",(PyCFunction)set_intersection_update,	METH_O,
+	 intersection_update_doc},
+	{"issubset",	(PyCFunction)set_issubset,	METH_O,
+	 issubset_doc},
+	{"issuperset",	(PyCFunction)set_issuperset,	METH_O,
+	 issuperset_doc},
+	{"pop",		(PyCFunction)set_pop,		METH_NOARGS,
+	 pop_doc},
+	{"__reduce__",	(PyCFunction)set_reduce,	METH_NOARGS,
+	 reduce_doc},
+	{"remove",	(PyCFunction)set_remove,	METH_O,
+	 remove_doc},
+	{"symmetric_difference",(PyCFunction)set_symmetric_difference,	METH_O,
+	 symmetric_difference_doc},
+	{"symmetric_difference_update",(PyCFunction)set_symmetric_difference_update,	METH_O,
+	 symmetric_difference_update_doc},
+	{"union",	(PyCFunction)set_union,		METH_O,
+	 union_doc},
+	{"union_update",(PyCFunction)set_union_update,	METH_O,
+	 union_update_doc},
+	{NULL,		NULL}	/* sentinel */
+};
+
+static PyNumberMethods set_as_number = {
+	0,				/*nb_add*/
+	(binaryfunc)set_sub,		/*nb_subtract*/
+	0,				/*nb_multiply*/
+	0,				/*nb_divide*/
+	0,				/*nb_remainder*/
+	0,				/*nb_divmod*/
+	0,				/*nb_power*/
+	0,				/*nb_negative*/
+	0,				/*nb_positive*/
+	0,				/*nb_absolute*/
+	0,				/*nb_nonzero*/
+	0,				/*nb_invert*/
+	0,				/*nb_lshift*/
+	0,				/*nb_rshift*/
+	(binaryfunc)set_and,		/*nb_and*/
+	(binaryfunc)set_xor,		/*nb_xor*/
+	(binaryfunc)set_or,		/*nb_or*/
+	0,				/*nb_coerce*/
+	0,				/*nb_int*/
+	0,				/*nb_long*/
+	0,				/*nb_float*/
+	0,				/*nb_oct*/
+	0, 				/*nb_hex*/
+	0,				/*nb_inplace_add*/
+	(binaryfunc)set_isub,		/*nb_inplace_subtract*/
+	0,				/*nb_inplace_multiply*/
+	0,				/*nb_inplace_divide*/
+	0,				/*nb_inplace_remainder*/
+	0,				/*nb_inplace_power*/
+	0,				/*nb_inplace_lshift*/
+	0,				/*nb_inplace_rshift*/
+	(binaryfunc)set_iand,		/*nb_inplace_and*/
+	(binaryfunc)set_ixor,		/*nb_inplace_xor*/
+	(binaryfunc)set_ior,		/*nb_inplace_or*/
+};
+
+PyDoc_STRVAR(set_doc,
+"set(iterable) --> set object\n\
+\n\
+Build an unordered collection.");
+
+PyTypeObject PySet_Type = {
+	PyObject_HEAD_INIT(&PyType_Type)
+	0,				/* ob_size */
+	"set",				/* tp_name */
+	sizeof(PySetObject),		/* tp_basicsize */
+	0,				/* tp_itemsize */
+	/* methods */
+	(destructor)set_dealloc,	/* tp_dealloc */
+	(printfunc)set_tp_print,	/* tp_print */
+	0,				/* tp_getattr */
+	0,				/* tp_setattr */
+	(cmpfunc)set_nocmp,		/* tp_compare */
+	(reprfunc)set_repr,		/* tp_repr */
+	&set_as_number,			/* tp_as_number */
+	&set_as_sequence,		/* tp_as_sequence */
+	0,				/* tp_as_mapping */
+	set_nohash,			/* tp_hash */
+	0,				/* tp_call */
+	0,				/* tp_str */
+	PyObject_GenericGetAttr,	/* tp_getattro */
+	0,				/* tp_setattro */
+	0,				/* tp_as_buffer */
+	Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_CHECKTYPES |
+		Py_TPFLAGS_BASETYPE,	/* tp_flags */
+	set_doc,			/* tp_doc */
+	(traverseproc)set_traverse,	/* tp_traverse */
+	(inquiry)set_tp_clear,		/* tp_clear */
+	(richcmpfunc)set_richcompare,	/* tp_richcompare */
+	0,				/* tp_weaklistoffset */
+	(getiterfunc)set_iter,		/* tp_iter */
+	0,				/* tp_iternext */
+	set_methods,			/* tp_methods */
+	0,				/* tp_members */
+	0,				/* tp_getset */
+	0,				/* tp_base */
+	0,				/* tp_dict */
+	0,				/* tp_descr_get */
+	0,				/* tp_descr_set */
+	0,				/* tp_dictoffset */
+	0,				/* tp_init */
+	PyType_GenericAlloc,		/* tp_alloc */
+	set_new,			/* tp_new */
+	PyObject_GC_Del,		/* tp_free */
+};
+
+/* frozenset object ********************************************************/
+
+
+static PyMethodDef frozenset_methods[] = {
+	{"copy",	(PyCFunction)set_copy,		METH_NOARGS,
+	 copy_doc},
+	{"__copy__",	(PyCFunction)set_copy,		METH_NOARGS,
+	 copy_doc},
+	{"difference",(PyCFunction)set_difference,	METH_O,
+	 difference_doc},
+	{"intersection",(PyCFunction)set_intersection,	METH_O,
+	 intersection_doc},
+	{"issubset",(PyCFunction)set_issubset,		METH_O,
+	 issubset_doc},
+	{"issuperset",(PyCFunction)set_issuperset,	METH_O,
+	 issuperset_doc},
+	{"__reduce__",	(PyCFunction)set_reduce,	METH_NOARGS,
+	 reduce_doc},
+	{"symmetric_difference",(PyCFunction)set_symmetric_difference,	METH_O,
+	 symmetric_difference_doc},
+	{"union",	(PyCFunction)set_union,		METH_O,
+	 union_doc},
+	{NULL,		NULL}	/* sentinel */
+};
+
+static PyNumberMethods frozenset_as_number = {
+	0,				/*nb_add*/
+	(binaryfunc)set_sub,		/*nb_subtract*/
+	0,				/*nb_multiply*/
+	0,				/*nb_divide*/
+	0,				/*nb_remainder*/
+	0,				/*nb_divmod*/
+	0,				/*nb_power*/
+	0,				/*nb_negative*/
+	0,				/*nb_positive*/
+	0,				/*nb_absolute*/
+	0,				/*nb_nonzero*/
+	0,				/*nb_invert*/
+	0,				/*nb_lshift*/
+	0,				/*nb_rshift*/
+	(binaryfunc)set_and,		/*nb_and*/
+	(binaryfunc)set_xor,		/*nb_xor*/
+	(binaryfunc)set_or,		/*nb_or*/
+};
+
+PyDoc_STRVAR(frozenset_doc,
+"frozenset(iterable) --> frozenset object\n\
+\n\
+Build an immutable unordered collection.");
+
+PyTypeObject PyFrozenSet_Type = {
+	PyObject_HEAD_INIT(&PyType_Type)
+	0,				/* ob_size */
+	"frozenset",			/* tp_name */
+	sizeof(PySetObject),		/* tp_basicsize */
+	0,				/* tp_itemsize */
+	/* methods */
+	(destructor)set_dealloc,	/* tp_dealloc */
+	(printfunc)set_tp_print,	/* tp_print */
+	0,				/* tp_getattr */
+	0,				/* tp_setattr */
+	(cmpfunc)set_nocmp,		/* tp_compare */
+	(reprfunc)set_repr,		/* tp_repr */
+	&frozenset_as_number,		/* tp_as_number */
+	&set_as_sequence,		/* tp_as_sequence */
+	0,				/* tp_as_mapping */
+	frozenset_hash,			/* tp_hash */
+	0,				/* tp_call */
+	0,				/* tp_str */
+	PyObject_GenericGetAttr,	/* tp_getattro */
+	0,				/* tp_setattro */
+	0,				/* tp_as_buffer */
+	Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_CHECKTYPES |
+		Py_TPFLAGS_BASETYPE,	/* tp_flags */
+	frozenset_doc,			/* tp_doc */
+	(traverseproc)set_traverse,	/* tp_traverse */
+	0,				/* tp_clear */
+	(richcmpfunc)set_richcompare,	/* tp_richcompare */
+	0,				/* tp_weaklistoffset */
+	(getiterfunc)set_iter,		/* tp_iter */
+	0,				/* tp_iternext */
+	frozenset_methods,		/* tp_methods */
+	0,				/* tp_members */
+	0,				/* tp_getset */
+	0,				/* tp_base */
+	0,				/* tp_dict */
+	0,				/* tp_descr_get */
+	0,				/* tp_descr_set */
+	0,				/* tp_dictoffset */
+	0,				/* tp_init */
+	PyType_GenericAlloc,		/* tp_alloc */
+	set_new,			/* tp_new */
+	PyObject_GC_Del,		/* tp_free */
+};
diff --git a/PCbuild/pythoncore.dsp b/PCbuild/pythoncore.dsp
index 1ccc83a..768e4c0 100644
--- a/PCbuild/pythoncore.dsp
+++ b/PCbuild/pythoncore.dsp
@@ -467,6 +467,10 @@
 # End Source File
 # Begin Source File
 
+SOURCE=..\Objects\setobject.c
+# End Source File
+# Begin Source File
+
 SOURCE=..\Modules\shamodule.c
 # End Source File
 # Begin Source File
diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c
index 35283fc..2fb8206 100644
--- a/Python/bltinmodule.c
+++ b/Python/bltinmodule.c
@@ -2116,12 +2116,14 @@
 	SETBUILTIN("dict",		&PyDict_Type);
  	SETBUILTIN("enumerate",		&PyEnum_Type);
 	SETBUILTIN("float",		&PyFloat_Type);
+	SETBUILTIN("frozenset",		&PyFrozenSet_Type);
 	SETBUILTIN("property",		&PyProperty_Type);
 	SETBUILTIN("int",		&PyInt_Type);
 	SETBUILTIN("list",		&PyList_Type);
 	SETBUILTIN("long",		&PyLong_Type);
 	SETBUILTIN("object",		&PyBaseObject_Type);
 	SETBUILTIN("reversed",		&PyReversed_Type);
+	SETBUILTIN("set",		&PySet_Type);
 	SETBUILTIN("slice",		&PySlice_Type);
 	SETBUILTIN("staticmethod",	&PyStaticMethod_Type);
 	SETBUILTIN("str",		&PyString_Type);
