diff --git a/Lib/test/test_winreg2.py b/Lib/test/test_winreg2.py
new file mode 100644
index 0000000..28c998e
--- /dev/null
+++ b/Lib/test/test_winreg2.py
@@ -0,0 +1,341 @@
+from winreg import hives, createKey, openKey, flags, deleteKey, regtypes
+import sys, traceback
+import time
+
+def testHives():
+    hivenames = ["HKEY_CLASSES_ROOT","HKEY_CURRENT_USER","HKEY_LOCAL_MACHINE",
+                "HKEY_USERS","HKEY_CURRENT_CONFIG"] #, # 
+    for hivename in hivenames:
+        hive = hives[ hivename ]
+        print hive.name
+        assert hive.handle
+        assert hive.getSubkeys()
+    for hivename in ["HKEY_DYN_DATA", "HKEY_PERFORMANCE_DATA"]:
+        hive =  hives[ hivename ]
+        print hive.name
+        assert hive.handle
+        assert not hive.getValues()
+        assert not hive.getSubkeys()
+
+def testNonZero():
+    key=hives["HKLM"].openSubkey( "SOFTWARE" )
+    assert key.openSubkey( "Microsoft" )
+    assert key
+    key.close()
+    assert not key
+    try:
+        key.openSubkey( "Microsoft" )
+        assert 0
+    except EnvironmentError:
+        pass
+
+def testCmp():
+    HKLM=hives["HKLM"]
+    assert (openKey("HKLM\\SOFTWARE")==\
+                        HKLM.openSubkey("SOFTWARE"))
+    assert not HKLM.openSubkey("SYSTEM")!=HKLM.openSubkey("SYSTEM")
+    assert HKLM.openSubkey("SOFTWARE")!=HKLM.openSubkey("SYSTEM")
+    assert not HKLM.openSubkey("SOFTWARE")==HKLM.openSubkey("SYSTEM")
+    assert not HKLM.openSubkey("SOFTWARE")=="spam"
+    assert ((HKLM.openSubkey("SOFTWARE")<"spam") !=
+                        (HKLM.openSubkey("SOFTWARE")>"spam"))
+
+def testClose(): 
+    key=hives["HKLM"].openSubkey( "SOFTWARE" )
+    assert key
+    key.close()
+    assert not key
+
+def testOpen():
+    assert openKey( r"HKLM" )
+    assert openKey( r"HKLM\HARDWARE" )
+    assert openKey( r"HKLM\HARDWARE\DESCRIPTION\System" )
+
+def testOpenFailure():
+    try:
+        print openKey( r"HKCU\Software\Python\A\B\C\D" )
+        assert 0 #
+    except EnvironmentError:
+        pass
+
+def testDeleteKey():
+    createKey( r"HKCU\Software\Python\A\B\C\D" )
+    deleteKey( r"HKCU\Software\Python\A\B\C\D" )
+    deleteKey( r"HKCU\Software\Python\A\B\C" )
+    deleteKey( r"HKCU\Software\Python\A\B" )
+    assert "A" in \
+            openKey(r"HKCU\Software\Python").getSubkeys().keys()
+    openKey( r"HKCU\Software\Python" ).deleteSubkey( r"A" )
+    assert "A" not in \
+            openKey(r"HKCU\Software\Python").getSubkeys().keys()
+
+def testDeleteValue():
+    key=createKey( r"HKCU\Software\Python\A" )
+    key.setValue( "abcde", "fghij" )
+    assert key.getValueData( "abcde" )=="fghij"
+    assert "abcde" in key.getValues().keys()
+    assert "fghij" in map( lambda x:x[1], key.getValues().values() )
+    assert "abcde" in key.getValues().keys()
+    key.deleteValue( "abcde" )
+    assert "abcde" not in key.getValues().keys()
+    assert "fghij" not in map( lambda x:x[1], key.getValues().values() )
+    deleteKey( r"HKCU\Software\Python\A" )
+
+def testCreateKey():
+    key=createKey( r"HKCU\Software\Python\A" )
+    assert openKey( r"HKCU\Software\Python").getSubkeys().has_key( "A" )
+    deleteKey( r"HKCU\Software\Python\A" )
+    assert not openKey( r"HKCU\Software\Python").getSubkeys().\
+                        has_key( "A" )
+    key=openKey( r"HKCU\Software\Python" ).createSubkey( "A" )
+
+def testOpenKeyWithFlags():
+    assert openKey( r"HKCU\Software\Python", 
+                                flags["KEY_READ"])
+    assert openKey( r"HKCU\Software\Python", 
+                                flags["KEY_ALL_ACCESS"])
+
+def testGetSubkeys():
+    keys=openKey( r"HKCU\Software" ).getSubkeys()
+    assert keys
+    index=0
+    for i in keys:
+        index=index+1
+    assert index==len( keys )
+
+def testGetValueNameDataAndType(): pass
+
+def testGetSubkeyNames():
+    subkeyNames=hives["HKLM"].getSubkeyNames()
+    assert len( subkeyNames )==len(hives["HKLM"].getSubkeys())
+    for name in subkeyNames:
+        assert type( name )==type("")
+
+def testGetValueNames(): 
+    valNames=hives["HKLM"].getValueNames()
+    assert len( valNames )==len(hives["HKLM"].getValues())
+    for name in valNames:
+        assert type( name )==type("")
+
+def testRepr():
+    assert repr(hives["HKCU"])==str(hives["HKCU"])
+
+def testSetStringValue():
+    hives["HKCU"].setValue( "Blah", "abc" )
+    assert hives["HKCU"].getValueData( "Blah" )=="abc"
+    assert hives["HKCU"].getValues().has_key( "Blah" )
+    del hives["HKCU"].getValues()[ "Blah" ]
+    assert not hives["HKCU"].getValues().has_key( "Blah" )
+
+def testDeleteValue():
+    hives["HKCU"].setValue( "Blah", "abc" )
+    assert hives["HKCU"].getValues().has_key( "Blah" )
+    del hives["HKCU"].getValues()[ "Blah" ]
+    assert not hives["HKCU"].getValues().has_key( "Blah" )
+    hives["HKCU"].setValue( "Blah", "abc" )
+    hives["HKCU"].deleteValue( "Blah" )
+    assert not hives["HKCU"].getValues().has_key( "Blah" )
+
+def testKeyDict_ClearKeys():
+    createKey( "HKLM\\Software\\a\\b\\c\\d\\e" )
+    createKey( "HKLM\\Software\\a\\b\\c\\d\\f" )
+    createKey( "HKLM\\Software\\a\\b\\c\\d\\g" )
+    createKey( "HKLM\\Software\\a\\b\\c\\d\\h" )
+    createKey( "HKLM\\Software\\a\\b\\c\\d\\i" )
+    key=openKey( "HKLM\\Software\\a\\b\\c\\d" )
+    assert key.getSubkeys()
+    key.getSubkeys().clear()
+    assert not key.getSubkeys()
+    assert not openKey( "HKLM\\Software\\a\\b\\c\\d").getSubkeys()
+    deleteKey( "HKLM\\Software\\a\\b\\c\\d" )
+    deleteKey( "HKLM\\Software\\a\\b\\c" )
+    deleteKey( "HKLM\\Software\\a\\b" )
+    deleteKey( "HKLM\\Software\\a" )
+
+def testUnicodeKeyName(): pass
+
+def testUnicodeValueName(): pass
+
+def testGetValueDataFromEnum(): pass
+
+def testGetValueDataFromName(): pass
+
+def testGetBinaryData(): pass
+
+
+def testSetIntValue():
+    key=createKey( "HKLM\\Software\\a\\b")
+    key.setValue( "abcd", 5 )
+    assert key.getValueData( "abcd" )==5
+    assert key.getValues()[ "abcd" ][1]==5
+    key.deleteValue( "abcd" )
+    key.getValues()["abcd"]=5
+    assert key.getValues()[ "abcd" ][1]==5
+    key.deleteValue( "abcd" )
+    key.getValues()["abcd"]=(5,regtypes["REG_DWORD"])
+    assert key.getValues()[ "abcd" ][1]==5
+    key.deleteValue( "abcd" )
+    key.deleteKey( "HKLM\\Software\\a\\b")
+    key.deleteKey( "HKLM\\Software\\a")
+
+def testSetBinaryValue(): 
+    key=createKey( "HKLM\\Software\\a\\b")
+    key.setValue( "abcd", array.array( 'c', "PPPPPPPPPPPPPPP") )
+    key.setValue( "abcde", array.array( 'c', "PPPPPPPPPPPPPPP"), 
+                       regtypes["REG_BINARY"] )
+    assert key.getValues()["abcd"]==key.getValues()["abcde"]
+    key.deleteKey( "HKLM\\Software\\a\\b")
+    key.deleteKey( "HKLM\\Software\\a")
+
+def testSetNone(): pass
+
+def testSetString(): pass
+
+def testSetExpandString(): pass
+
+def testSetBinaryData(): pass
+
+def testSetDword(): pass
+
+def testSetDwordBigEndian(): pass
+
+def testSetLink(): pass
+
+def testSetMultiSz(): pass
+
+def testSetResourceList(): pass
+
+def testSetFullResourceDescription(): pass
+
+def testSetResourceRequirementsList(): pass
+
+
+
+def testFlush(): pass
+
+def testSave(): pass
+
+def testLoad(): pass
+
+
+
+
+
+def testNoneType(): pass
+
+def testStringType(): pass
+
+def testExpandStringType(): pass
+
+def testDWordType(): pass
+
+def testDWordBigEndianType(): pass
+
+def testLinkType(): pass
+
+def testMultiStringType(): pass
+
+def testResourceLinkType(): pass
+
+def testResourceDescriptionType(): pass
+
+def testResourceRequirementsListType(): pass
+
+
+def getSubkeysDict(): pass
+
+def testKeyDict_Get(): pass
+
+def testKeyDict_HasKey(): pass
+
+def testKeyDict_Keys(): pass
+
+def testKeyDict_Values(): pass
+
+def testKeyDict_Items(): pass
+
+def testKeyDict_Length(): pass
+
+def testKeyDict_Map(): pass
+
+def testKeyDict_GetItem(): pass
+
+def testKeyDict_DelItem(): pass
+
+def testRemote(): pass
+
+def testShortcuts(): pass
+
+
+
+def getValues(): pass
+
+def testValueDict_ClearKeys(): pass
+
+def testValueDict_Get(): pass
+
+def testValueDict_HasKey(): pass
+
+def testValueDict_Keys(): pass
+
+def testValueDict_Values(): pass
+
+def testValueDict_Items(): pass
+
+def testValueDict_Length(): pass
+
+def testValueDict_Map(): pass
+
+def testValueDict_GetItem(): pass
+
+def testValueDict_DelItem(): pass
+
+for name in globals().keys():
+    if name[0:4]=="test":
+        func=globals()[ name ]
+        try:
+            func()
+            print "Test Passed: %s" % name
+        except Exception, e:
+            print "Test Failed: %s" % name
+            traceback.print_exc()
+
+j=[0]*len( regtypes )
+
+k=0
+
+def test1( basekey ):
+    global k
+    for (name, data, type) in basekey.getValues():
+        j[type.intval]=j[type.intval]+1
+        if j[type.intval]==1:
+            pass
+            #print "[[%s]] %s [%s] = %s "% (type.msname, name, basekey, value)
+    keys=basekey.getSubkeys()
+    index=0
+    k=k+1
+    if(k%2500)==0:
+        dump()
+    while 1:
+        try:
+            test1( keys[index] )
+            index=index+1
+        except IndexError:
+            break
+            print "Done", basekey, index
+        except (WindowsError, EnvironmentError):
+            index=index+1
+            dumpfile.write( "Skipping %s %s"% (basekey, index))
+
+def dump(dumpfile):
+    for i in range( len( j )):
+        dumpfile.write( "%s %s\n" %( i,j[i] ))
+
+def testRecursive():
+    dumpfile=open( "foo.txt", "w" )
+    start=time.time()
+    for hive in hives.values():
+        dumpfile.write( "Hive: %s\n" % hive )
+        test1( hive )
+        dump(dumpfile)
+    print time.time()-start
