diff --git a/Lib/plat-win/winreg.py b/Lib/plat-win/winreg.py
index f8b8c3a..6fec5c7 100644
--- a/Lib/plat-win/winreg.py
+++ b/Lib/plat-win/winreg.py
@@ -1,3 +1,34 @@
+"""
+Windows registry support.
+
+openKey( keyname ) 
+    open existing key object
+
+>>> key=openKey( r"HKLM\HARDWARE\DESCRIPTION\System" )
+
+createKey( keyname ) 
+    create a key if it doesn't already exist
+
+>>> key=createKey( r"HKLM\SOFTWARE\Python\Test" )
+
+deleteKey( keyname ) 
+    delete a key if it exists
+    Note: deleteKey may not be recursive on all platforms.
+
+>>> key=createKey( r"HKLM\SOFTWARE\Python\Test" )
+
+RemoteKey( machine, top_level_key ): 
+    open a key on another machine.
+    You can use the returned key as a basis for opens, creates and deletes
+    on the other machine.
+
+>>> key=RemoteKey( "somemachine", "HKLM" )
+
+For information on the key API, open a key and look at its docstring.
+
+
+"""
+
 import _winreg
 import sys
 import exceptions
@@ -6,12 +37,14 @@
 import string
 
 class RegType:
+    "Represents one of the types that can go into the registry"
     def __init__( self, msname, friendlyname ):
         self.msname=msname
         self.friendlyname=friendlyname
         self.intval=getattr( _winreg, msname )
 
     def __repr__( self ):
+        "Return a useful representation of the type object"
         return "<RegType %d: %s %s>" % \
                         (self.intval, self.msname, self.friendlyname )
 
@@ -49,20 +82,24 @@
     regtypes[constant.msname]=constant
 
 class _DictBase:
+    "Base class for dictionary-type objects"
     def __init__( self, key ):
         self.key=key
 
     def clear( self ):
+        "Clear the list of keys/data values, as in dictionaries"
         keys=list( self.keys() )
         map( self.__delitem__, keys )
 
     def get( self, item, defaultVal=None ):
+        "Get a key/value by name or index"
         try:
             return self.__getitem__( item )
         except (IndexError, EnvironmentError, WindowsError):
             return defaultVal
 
     def has_key( self, item ):
+        "Check if a key/data value with a particular name exists"
         try:
             self.__getitem__( item )
             return 1
@@ -70,6 +107,7 @@
             return 0
 
     def keys( self ):
+        "Get a list of key/data value names"
         keys=[] 
         try:
             for i in xrange( 0, sys.maxint ):
@@ -80,18 +118,21 @@
         return keys
 
     def values( self ):
+        "Get a list of key objects or data values"
         values=[]  # map() doesn't use the IndexError semantics...
         for i in self:
             values.append( i )
         return values
 
     def items( self ):
+        "Get pairs of keyname/key object or valuename/value data"
         return map( None, self.keys(), self.values() )
 
     def __len__( self ):
         return len( self.keys() )
 
 def _getName( item, nameFromNum ):
+    "Helper function -- don't use it directly"
     if type( item ) == IntType:
         try:
             keyname = nameFromNum( item )
@@ -107,6 +148,7 @@
 
 
 class RegValuesDict( _DictBase ):
+    "A dictionary of registry data values"
     def _nameFromNum( self, i ):
         return self.key._nameFromNum( i )
 
@@ -124,9 +166,9 @@
     def __delitem__( self, item ):
         valname=_getName( item, self._nameFromNum )
         self.key.deleteValue( valname )
-
     
 class RegKeysDict( _DictBase ):
+    "A dictionary of registry keys"
     def _nameFromNum( self, item ):
         return _winreg.EnumKey( self.key.handle, item )
 
@@ -139,6 +181,7 @@
         self.key.deleteSubkey( keyname )
 
 def openKey( keyname, samFlags=None ):
+    "Open a key by name"
     lst=string.split( keyname, "\\", 1 )
     if len( lst )==2:
         hivename,path=lst
@@ -161,49 +204,61 @@
 
 
 class RegKey:
+    "A registry key object"
+
+    def __init__( self, name, handle=None ):
+        self.name=name
+        self.handle=handle
+
     def _nameFromNum( self, item ):
+        "internal"
         (name,data,datatype)=_winreg.EnumValue( self.handle, item )
         return name
 
     def __nonzero__(self):
+        "Is the key open?"
         if self.handle:
             return 1
         else:
             return 0
 
     def __cmp__ (self, other ):
+        "Compare two keys for equality"
         if hasattr( other, "handle" ) and hasattr( other, "name" ):
             return cmp( self.name, other.name )
         else:
             return cmp( self.handle, other )
 
-    def __init__( self, name, handle=None ):
-        self.name=name
-        self.handle=handle
-
     def __repr__( self ):
         return "<Windows RegKey: %s>"% self.name
 
     def close(self ):
+        "Close the key"
         return _winreg.CloseKey( self.handle )
 
     def getSubkeyNames( self ):
+        "Get a list of subkey names"
         return self.getSubkeys().keys()
 
     def getValueNames( self ):
+        "Get a list of value names"
         return self.getValues().keys()
 
     def deleteSubkey( self, subkey ):
+        "Delete a subkey by name"
         return _winreg.DeleteKey( self.handle, subkey )
         
     def deleteValue( self, valname ):
+        "Delete a value by name"
         return _winreg.DeleteValue( self.handle, valname )
 
     def createSubkey( self, keyname ):
+        "Create a subkey by name"
         handle=_winreg.CreateKey( self.handle, keyname )
         return RegKey( self.name+"\\"+keyname, handle)
 
     def openSubkey( self, keyname, samFlags=None ):
+        "Open a named subkey"
         if samFlags:
             handle=_winreg.OpenKey( self.handle, keyname, 0, samFlags )
         else:
@@ -211,12 +266,15 @@
         return RegKey( self.name+"\\"+keyname, handle )
 
     def getSubkeys( self ):
+        "Get a dictionary-like mapping of subkeys"
         return RegKeysDict( self )
 
     def getValues( self ):
+        "Get a dictionary-like mapping of data values"
         return RegValuesDict( self )
 
     def getValueNameDataAndType( self, valname ):
+        "Get a data value's name, data and type all at one time"
         try:
             if type( valname )==IntType:
                 (valname,data,datatype)=_winreg.EnumValue( self.handle, valname )
@@ -233,10 +291,12 @@
         return (valname, data, _typeConstants[datatype] )
 
     def getValueData( self, valname ):
+        "Get a data value's data."
         name, data, type=self.getValueNameDataAndType( valname )
         return data
 
     def setValue( self, valname, data, regtype=None ):
+        "Set a data value's data (and optionally type)"
         if regtype:
             typeint=regtype.intval
         else:
@@ -250,16 +310,22 @@
         _winreg.SetValueEx( self.handle, valname, 0, typeint, data )
 
     def flush(self ):
+        "Make sure that all changes are written to the registry. "
+        "Only use this if you know what you are doing. "
+        "It isn't usually needed."
         _winreg.FlushKey( self.keyobbj )
 
     def save( self, filename ):
+        "Save a key to a filename"
         _winreg.SaveKey( self.keyobj, filename )
 
     def load( self, subkey, filename ):
+        "Load a key from a filename"
         return _winreg.RegLoadKey( self.handle, subkey, filename )
 
 
 class RemoteKey( RegKey ):
+    "Open a key on a remote machine"
     def __init__( self, machine, topLevelKey ):
         assert topLevelKey in _hivenames 
         self.handle =  _winreg.ConnectRegistry( machine, parentKey )
