diff --git a/Lib/idlelib/configDialog.py b/Lib/idlelib/configDialog.py
index a68330d..f8db74d 100644
--- a/Lib/idlelib/configDialog.py
+++ b/Lib/idlelib/configDialog.py
@@ -1,5 +1,13 @@
-"""
-configuration dialog
+"""IDLE Configuration Dialog: support user customization of IDLE by GUI
+
+Customize font faces, sizes, and colorization attributes.  Set indentation
+defaults.  Customize keybindings.  Colorization and keybindings can be
+saved as user defined sets.  Select startup options including shell/editor
+and default window size.  Define additional help sources.
+
+Note that tab width in IDLE is currently fixed at eight due to Tk issues.
+Refer to comment in EditorWindow autoindent code for details.
+
 """
 from Tkinter import *
 import tkMessageBox, tkColorChooser, tkFont
@@ -11,6 +19,7 @@
 from keybindingDialog import GetKeysDialog
 from configSectionNameDialog import GetCfgSectionNameDialog
 from configHelpSourceEdit import GetHelpSourceDialog
+
 class ConfigDialog(Toplevel):
     """
     configuration dialog for idle
@@ -336,11 +345,11 @@
         frameHelp=Frame(frame,borderwidth=2,relief=GROOVE)
         #frameRun
         labelRunTitle=Label(frameRun,text='Startup Preferences')
-        labelRunChoiceTitle=Label(frameRun,text='On startup : ')
+        labelRunChoiceTitle=Label(frameRun,text='On Startup : ')
         radioStartupEdit=Radiobutton(frameRun,variable=self.startupEdit,
-            value=1,command=self.SetKeysType,text="open Edit Window")
+            value=1,command=self.SetKeysType,text="Open Edit Window")
         radioStartupShell=Radiobutton(frameRun,variable=self.startupEdit,
-            value=0,command=self.SetKeysType,text='open Shell Window')
+            value=0,command=self.SetKeysType,text='Open Shell Window')
         #frameWinSize
         labelWinSizeTitle=Label(frameWinSize,text='Initial Window Size'+
                 '  (in characters)')
@@ -354,7 +363,7 @@
         labelHelpTitle=Label(frameHelp,text='Help Options')
         frameHelpList=Frame(frameHelp)
         frameHelpListButtons=Frame(frameHelpList)
-        labelHelpListTitle=Label(frameHelpList,text='Additional (html) Help Sources:')
+        labelHelpListTitle=Label(frameHelpList,text='Additional Help Sources:')
         scrollHelpList=Scrollbar(frameHelpList)
         self.listHelp=Listbox(frameHelpList,height=5,takefocus=FALSE,
                 exportselection=FALSE)
@@ -840,11 +849,11 @@
             apply(self.textHighlightSample.tag_config,(element,),colours)
         self.SetColourSample()
 
-    def OnCheckUserHelpBrowser(self):
-        if self.userHelpBrowser.get():
-            self.entryHelpBrowser.config(state=NORMAL)
-        else:
-            self.entryHelpBrowser.config(state=DISABLED)
+##     def OnCheckUserHelpBrowser(self):
+##         if self.userHelpBrowser.get():
+##             self.entryHelpBrowser.config(state=NORMAL)
+##         else:
+##             self.entryHelpBrowser.config(state=DISABLED)
 
     def HelpSourceSelected(self,event):
         self.SetHelpListButtonStates()
@@ -890,7 +899,7 @@
         self.SetHelpListButtonStates()
 
     def UpdateUserHelpChangedItems(self):
-        #clear and rebuild the HelpFiles secion in self.changedItems
+        #clear and rebuild the HelpFiles section in self.changedItems
         if self.changedItems['main'].has_key('HelpFiles'):
             del(self.changedItems['main']['HelpFiles'])
         for num in range(1,len(self.userHelpList)+1):
@@ -1069,19 +1078,18 @@
         return idleConf.userCfg[configType].SetOption(section,item,value)
 
     def SaveAllChangedConfigs(self):
-        """
-        save all configuration changes to user config files.
-        """
-        #this section gets completely replaced
-        idleConf.userCfg['main'].remove_section('HelpFiles')
+        "Save configuration changes to the user config file."
         idleConf.userCfg['main'].Save()
         for configType in self.changedItems.keys():
-            cfgTypeHasChanges=0
+            cfgTypeHasChanges = False
             for section in self.changedItems[configType].keys():
+                if section == 'HelpFiles':
+                    #this section gets completely replaced
+                    idleConf.userCfg['main'].remove_section('HelpFiles')
                 for item in self.changedItems[configType][section].keys():
-                    value=self.changedItems[configType][section][item]
+                    value = self.changedItems[configType][section][item]
                     if self.SetUserValue(configType,section,item,value):
-                        cfgTypeHasChanges=1
+                        cfgTypeHasChanges = True
             if cfgTypeHasChanges:
                 idleConf.userCfg[configType].Save()
         self.ResetChangedItems() #clear the changed items dict
diff --git a/Lib/idlelib/configHelpSourceEdit.py b/Lib/idlelib/configHelpSourceEdit.py
index f262ee6..bd799da 100644
--- a/Lib/idlelib/configHelpSourceEdit.py
+++ b/Lib/idlelib/configHelpSourceEdit.py
@@ -1,119 +1,126 @@
-"""
-Dialog that allows user to specify or edit the parameters for a user configured
-help source.
-"""
+"Dialog to specify or edit the parameters for a user configured help source."
+
 from Tkinter import *
 import tkMessageBox
 import os
 
 class GetHelpSourceDialog(Toplevel):
-    def __init__(self,parent,title,menuItem='',filePath=''):
+    def __init__(self, parent, title, menuItem='', filePath=''):
         """
         menuItem - string, the menu item to edit, if any
         filePath - string, the help file path to edit, if any
         """
         Toplevel.__init__(self, parent)
         self.configure(borderwidth=5)
-        self.resizable(height=FALSE,width=FALSE)
+        self.resizable(height=FALSE, width=FALSE)
         self.title(title)
         self.transient(parent)
         self.grab_set()
         self.protocol("WM_DELETE_WINDOW", self.Cancel)
         self.parent = parent
-        self.result=None
+        self.result = None
         self.CreateWidgets()
         self.menu.set(menuItem)
         self.path.set(filePath)
         self.withdraw() #hide while setting geometry
-        self.update_idletasks()
         #needs to be done here so that the winfo_reqwidth is valid
+        self.update_idletasks()
+        #centre dialog over parent:
         self.geometry("+%d+%d" %
-            ((parent.winfo_rootx()+((parent.winfo_width()/2)
-                -(self.winfo_reqwidth()/2)),
-              parent.winfo_rooty()+((parent.winfo_height()/2)
-                -(self.winfo_reqheight()/2)) )) ) #centre dialog over parent
+                      ((parent.winfo_rootx() + ((parent.winfo_width()/2)
+                                                -(self.winfo_reqwidth()/2)),
+                        parent.winfo_rooty() + ((parent.winfo_height()/2)
+                                                -(self.winfo_reqheight()/2)))))
         self.deiconify() #geometry set, unhide
+        self.bind('<Return>', self.Ok)
         self.wait_window()
 
     def CreateWidgets(self):
-        self.menu=StringVar(self)
-        self.path=StringVar(self)
-        self.fontSize=StringVar(self)
-        self.frameMain = Frame(self,borderwidth=2,relief=SUNKEN)
-        self.frameMain.pack(side=TOP,expand=TRUE,fill=BOTH)
-        labelMenu=Label(self.frameMain,anchor=W,justify=LEFT,
-                text='Menu Item:')
-        self.entryMenu=Entry(self.frameMain,textvariable=self.menu,width=30)
+        self.menu = StringVar(self)
+        self.path = StringVar(self)
+        self.fontSize = StringVar(self)
+        self.frameMain = Frame(self, borderwidth=2, relief=SUNKEN)
+        self.frameMain.pack(side=TOP, expand=TRUE, fill=BOTH)
+        labelMenu = Label(self.frameMain, anchor=W, justify=LEFT,
+                          text='Menu Item:')
+        self.entryMenu = Entry(self.frameMain, textvariable=self.menu,
+                               width=30)
         self.entryMenu.focus_set()
-        labelPath=Label(self.frameMain,anchor=W,justify=LEFT,
-                text='Help File Path:')
-        self.entryPath=Entry(self.frameMain,textvariable=self.path,width=40)
+        labelPath = Label(self.frameMain, anchor=W, justify=LEFT,
+                          text='Help File Path:')
+        self.entryPath = Entry(self.frameMain, textvariable=self.path,
+                               width=40)
         self.entryMenu.focus_set()
-        labelMenu.pack(anchor=W,padx=5,pady=3)
-        self.entryMenu.pack(anchor=W,padx=5,pady=3)
-        labelPath.pack(anchor=W,padx=5,pady=3)
-        self.entryPath.pack(anchor=W,padx=5,pady=3)
-        frameButtons=Frame(self)
-        frameButtons.pack(side=BOTTOM,fill=X)
-        self.buttonOk = Button(frameButtons,text='Ok',
-                width=8,command=self.Ok)
-        self.buttonOk.grid(row=0,column=0,padx=5,pady=5)
-        self.buttonCancel = Button(frameButtons,text='Cancel',
-                width=8,command=self.Cancel)
-        self.buttonCancel.grid(row=0,column=1,padx=5,pady=5)
+        labelMenu.pack(anchor=W, padx=5, pady=3)
+        self.entryMenu.pack(anchor=W, padx=5, pady=3)
+        labelPath.pack(anchor=W, padx=5, pady=3)
+        self.entryPath.pack(anchor=W, padx=5, pady=3)
+        frameButtons = Frame(self)
+        frameButtons.pack(side=BOTTOM, fill=X)
+        self.buttonOk = Button(frameButtons, text='OK',
+                               width=8, default=ACTIVE,  command=self.Ok)
+        self.buttonOk.grid(row=0, column=0, padx=5,pady=5)
+        self.buttonOk.bind('<Return>', self.Ok)
+        #self.buttonOk.focus()
+        self.buttonCancel = Button(frameButtons, text='Cancel',
+                                   width=8, command=self.Cancel)
+        self.buttonCancel.grid(row=0, column=1, padx=5, pady=5)
 
     def MenuOk(self):
-        #simple validity check for a sensible
-        #menu item name
-        menuOk=1
-        menu=self.menu.get()
+        "Simple validity check for a sensible menu item name"
+        menuOk = True
+        menu = self.menu.get()
         menu.strip()
-        if not menu: #no menu item specified
+        if not menu:
             tkMessageBox.showerror(title='Menu Item Error',
-                    message='No menu item specified.')
+                                   message='No menu item specified',
+                                   parent=self)
             self.entryMenu.focus_set()
-            menuOk=0
-        elif len(menu)>30: #menu item name too long
+            menuOk = False
+        elif len(menu) > 30:
             tkMessageBox.showerror(title='Menu Item Error',
-                    message='Menu item too long. It should be no more '+
-                    'than 30 characters.')
+                                   message='Menu item too long:'
+                                           '\nLimit 30 characters.',
+                                   parent=self)
             self.entryMenu.focus_set()
-            menuOk=0
+            menuOk = False
         return menuOk
 
     def PathOk(self):
-        #simple validity check for menu file path
-        pathOk=1
-        path=self.path.get()
+        "Simple validity check for menu file path"
+        pathOk = True
+        path = self.path.get()
         path.strip()
         if not path: #no path specified
             tkMessageBox.showerror(title='File Path Error',
-                    message='No help file path specified.')
+                                   message='No help file path specified.',
+                                   parent=self)
             self.entryPath.focus_set()
-            pathOk=0
+            pathOk = False
         elif not os.path.exists(path):
             tkMessageBox.showerror(title='File Path Error',
-                    message='Help file path does not exist.')
+                                   message='Help file path does not exist.',
+                                   parent=self)
             self.entryPath.focus_set()
-            pathOk=0
+            pathOk = False
         return pathOk
 
     def Ok(self, event=None):
-        if self.MenuOk():
-            if self.PathOk():
-                self.result=( self.menu.get().strip(),self.path.get().strip() )
-                self.destroy()
+        if self.MenuOk() and self.PathOk():
+            self.result = (self.menu.get().strip(),
+                           self.path.get().strip())
+            self.destroy()
 
     def Cancel(self, event=None):
-        self.result=None
+        self.result = None
         self.destroy()
 
 if __name__ == '__main__':
     #test the dialog
-    root=Tk()
+    root = Tk()
     def run():
-        keySeq=''
-        dlg=GetHelpSourceDialog(root,'Get Help Source')
+        keySeq = ''
+        dlg = GetHelpSourceDialog(root, 'Get Help Source')
         print dlg.result
-    Button(root,text='Dialog',command=run).pack()
+    Button(root,text='Dialog', command=run).pack()
     root.mainloop()
