diff --git a/Lib/idlelib/Debugger.py b/Lib/idlelib/Debugger.py
index 4653146..1039c16 100644
--- a/Lib/idlelib/Debugger.py
+++ b/Lib/idlelib/Debugger.py
@@ -320,17 +320,27 @@
         text.tag_add("BREAK", "insert linestart", "insert lineend +1char")
 
     def clear_breakpoint_here(self, edit):
-         text = edit.text
-         filename = edit.io.filename
-         if not filename:
-                 text.bell()
-                 return
-         lineno = int(float(text.index("insert")))
-         msg = self.idb.clear_break(filename, lineno)
-         if msg:
-             text.bell()
-             return
-         text.tag_remove("BREAK", "insert linestart",\
-                         "insert lineend +1char")
+        text = edit.text
+        filename = edit.io.filename
+        if not filename:
+            text.bell()
+            return
+        lineno = int(float(text.index("insert")))
+        msg = self.idb.clear_break(filename, lineno)
+        if msg:
+            text.bell()
+            return
+        text.tag_remove("BREAK", "insert linestart",\
+                        "insert lineend +1char")
 
-
+    def clear_file_breaks(self, edit):
+        text = edit.text
+        filename = edit.io.filename
+        if not filename:
+            text.bell()
+            return
+        msg = self.idb.clear_all_file_breaks(filename)
+        if msg:
+            text.bell()
+            return
+        text.tag_delete("BREAK")
diff --git a/Lib/idlelib/EditorWindow.py b/Lib/idlelib/EditorWindow.py
index be074b0..453e6ca 100644
--- a/Lib/idlelib/EditorWindow.py
+++ b/Lib/idlelib/EditorWindow.py
@@ -490,15 +490,15 @@
         self.per.insertfilter(self.undo)
         
     def ResetColorizer(self):
-        #this function is called from configDialog.py
-        #to update the colour theme if it is changed
+        "Update the colour theme if it is changed"
+        # Called from configDialog.py
         if self.color:
             self.color = self.ColorDelegator()
             self.per.insertfilter(self.color)
 
     def ResetFont(self):
-        #this function is called from configDialog.py
-        #to update the text widgets' font if it is changed
+        "Update the text widgets' font if it is changed" 
+        # Called from configDialog.py
         fontWeight='normal'
         if idleConf.GetOption('main','EditorWindow','font-bold',type='bool'):
             fontWeight='bold'
@@ -507,8 +507,8 @@
                 fontWeight))
 
     def ResetKeybindings(self):
-        #this function is called from configDialog.py
-        #to update the keybindings if they are changed
+        "Update the keybindings if they are changed"
+        # Called from configDialog.py
         self.Bindings.default_keydefs=idleConf.GetCurrentKeySet()
         keydefs = self.Bindings.default_keydefs
         for event, keylist in keydefs.items():
@@ -540,7 +540,7 @@
                             #print 'accel now:',accel,'\n'
 
     def ResetExtraHelpMenu(self):
-        #load or update the Extra Help menu if required
+        "Load or update the Extra Help menu if required"
         menuList=idleConf.GetAllExtraHelpSourcesList()
         helpMenu=self.menudict['help']
         cascadeIndex=helpMenu.index(END)-1
@@ -564,7 +564,7 @@
         return DisplayExtraHelp
                     
     def UpdateRecentFilesList(self,newFile=None):
-        #load or update the recent files list, and menu if required
+        "Load or update the recent files list, and menu if required"
         rfList=[]
         if os.path.exists(self.recentFilesPath):
             RFfile=open(self.recentFilesPath,'r')
@@ -578,8 +578,9 @@
                 rfList.remove(newFile)
             rfList.insert(0,newFile)
         rfList=self.__CleanRecentFiles(rfList)
-        print self.top.instanceDict
-        print self
+        #print self.flist.inversedict
+        #print self.top.instanceDict
+        #print self
         if rfList:
             for instance in self.top.instanceDict.keys():
                 instance.menuRecentFiles.delete(1,END)
@@ -695,10 +696,12 @@
         return reply
 
     def _close(self):
-        print self.io.filename
+        #print self.io.filename
         if self.io.filename:
             self.UpdateRecentFilesList(newFile=self.io.filename)
-            
+        shell = self.flist.pyshell
+        if shell and shell.interp.debugger:
+            shell.interp.debugger.clear_file_breaks(self)
         WindowList.unregister_callback(self.postwindowsmenu)
         if self.close_hook:
             self.close_hook()
@@ -756,7 +759,6 @@
                 methodname = methodname + "_event"
                 if hasattr(ins, methodname):
                     self.text.bind(vevent, getattr(ins, methodname))
-       
         if hasattr(ins, "menudefs"):
             self.fill_menus(ins.menudefs, keydefs)
         return ins
@@ -771,8 +773,10 @@
                 apply(text.event_add, (event,) + tuple(keylist))
 
     def fill_menus(self, defs=None, keydefs=None):
-        # Fill the menus. Menus that are absent or None in
-        # self.menudict are ignored.
+        """Add appropriate entries to the menus and submenus
+
+        Menus that are absent or None in self.menudict are ignored.
+        """
         if defs is None:
             defs = self.Bindings.menudefs
         if keydefs is None:
diff --git a/Lib/idlelib/PyShell.py b/Lib/idlelib/PyShell.py
index f418a57..6fb7f69 100644
--- a/Lib/idlelib/PyShell.py
+++ b/Lib/idlelib/PyShell.py
@@ -119,8 +119,7 @@
                                     
 
 class PyShellFileList(FileList):
-
-    # File list when a shell is present
+    "Extend base class: file list when a shell is present"
 
     EditorWindow = PyShellEditorWindow
 
@@ -136,8 +135,7 @@
 
 
 class ModifiedColorDelegator(ColorDelegator):
-
-    # Colorizer for the shell window itself
+    "Extend base class: colorizer for the shell window itself"
     
     def __init__(self):
         ColorDelegator.__init__(self)
@@ -161,8 +159,7 @@
         })
 
 class ModifiedUndoDelegator(UndoDelegator):
-
-    # Forbid insert/delete before the I/O mark
+    "Extend base class: forbid insert/delete before the I/O mark"
 
     def insert(self, index, chars, tags=None):
         try:
@@ -283,12 +280,12 @@
     gid = 0
 
     def execsource(self, source):
-        # Like runsource() but assumes complete exec source
+        "Like runsource() but assumes complete exec source"
         filename = self.stuffsource(source)
         self.execfile(filename, source)
 
     def execfile(self, filename, source=None):
-        # Execute an existing file
+        "Execute an existing file"
         if source is None:
             source = open(filename, "r").read()
         try:
@@ -300,7 +297,7 @@
             self.runcode(code)
 
     def runsource(self, source):
-        # Extend base class to stuff the source in the line cache first
+        "Extend base class method: Stuff the source in the line cache first"
         filename = self.stuffsource(source)
         self.more = 0
         self.save_warnings_filters = warnings.filters[:]
@@ -313,7 +310,7 @@
                 self.save_warnings_filters = None
 
     def stuffsource(self, source):
-        # Stuff source in the filename cache
+        "Stuff source in the filename cache"
         filename = "<pyshell#%d>" % self.gid
         self.gid = self.gid + 1
         lines = string.split(source, "\n")
@@ -321,8 +318,12 @@
         return filename
 
     def showsyntaxerror(self, filename=None):
-        # Extend base class to color the offending position
-        # (instead of printing it and pointing at it with a caret)
+        """Extend base class method: Add Colorizing
+
+        Color the offending position instead of printing it and pointing at it
+        with a caret.
+
+        """
         text = self.tkconsole.text
         stuff = self.unpackerror()
         if not stuff:
@@ -357,7 +358,7 @@
             return None
 
     def showtraceback(self):
-        # Extend base class method to reset output properly
+        "Extend base class method to reset output properly"
         self.tkconsole.resetoutput()
         self.checklinecache()
         InteractiveInterpreter.showtraceback(self)
@@ -379,7 +380,7 @@
         return self.debugger
 
     def runcommand(self, code):
-        # This runs the code without invoking the debugger.
+        "Run the code without invoking the debugger"
         # The code better not raise an exception!
         if self.tkconsole.executing:
             tkMessageBox.showerror(
@@ -395,7 +396,7 @@
         return 1
 
     def runcode(self, code):
-        # Override base class method
+        "Override base class method"
         if self.tkconsole.executing:
             tkMessageBox.showerror(
                 "Already executing",
@@ -403,7 +404,7 @@
                 "please wait until it is finished.",
                 master=self.tkconsole.text)
             return
-
+        #
         self.checklinecache()
         if self.save_warnings_filters is not None:
             warnings.filters[:] = self.save_warnings_filters
@@ -414,7 +415,7 @@
             self.active_seq = self.rpcclt.asynccall("exec", "runcode",
                                                     (code,), {})
             return
-
+        #
         try:
             self.tkconsole.beginexecuting()
             try:
@@ -433,12 +434,12 @@
                     self.showtraceback()
             except:
                 self.showtraceback()
-
+        #        
         finally:
             self.tkconsole.endexecuting()
 
     def write(self, s):
-        # Override base class write
+        "Override base class method"
         self.tkconsole.console.write(s)
 
 class PyShell(OutputWindow):
@@ -565,7 +566,7 @@
         ##sys.settrace(self._cancel_check)
 
     def endexecuting(self):
-        # Helper for ModifiedInterpreter
+        "Helper for ModifiedInterpreter"
         ##sys.settrace(None)
         ##self._cancel_check = None
         self.executing = 0
@@ -573,7 +574,7 @@
         self.showprompt()
 
     def close(self):
-        # Extend base class method
+        "Extend EditorWindow.close()"
         if self.executing:
             # XXX Need to ask a question here
             if not tkMessageBox.askokcancel(
@@ -586,9 +587,10 @@
             if self.reading:
                 self.top.quit()
             return "cancel"
-        return OutputWindow.close(self)
+        return EditorWindow.close(self)
 
     def _close(self):
+        "Extend EditorWindow._close(), shut down debugger and execution server"
         self.close_debugger()
         self.interp.kill_subprocess()
         # Restore std streams
@@ -601,10 +603,10 @@
         self.auto = None
         self.flist.pyshell = None
         self.history = None
-        OutputWindow._close(self) # Really EditorWindow._close
+        EditorWindow._close(self)
 
     def ispythonsource(self, filename):
-        # Override this so EditorWindow never removes the colorizer
+        "Override EditorWindow method: never remove the colorizer"
         return 1
 
     def short_title(self):
@@ -781,9 +783,6 @@
             i = i-1
         line = line[:i]
         more = self.interp.runsource(line)
-        # XXX This was causing extra prompt with shell  KBK
-#       if not more:
-#           self.showprompt()
 
     def cancel_check(self, frame, what, args,
                      dooneevent=tkinter.dooneevent,
diff --git a/Lib/idlelib/RemoteDebugger.py b/Lib/idlelib/RemoteDebugger.py
index a5b4e7e..84a51a5 100644
--- a/Lib/idlelib/RemoteDebugger.py
+++ b/Lib/idlelib/RemoteDebugger.py
@@ -101,6 +101,9 @@
     def clear_break(self, filename, lineno):
         msg = self.idb.clear_break(filename, lineno)
 
+    def clear_all_file_breaks(self, filename):
+        msg = self.idb.clear_all_file_breaks(filename)
+
     #----------called by a FrameProxy----------
 
     def frame_attr(self, fid, name):
@@ -148,14 +151,6 @@
         dict = dicttable[did]
         value = dict[key]
         value = repr(value)
-#          try:
-#              # Test for picklability
-#              import cPickle
-#              pklstr = cPickle.dumps(value)
-#          except:
-#              print >>sys.__stderr__, "** dict_item pickle failed: ", value
-#              raise    
-#              #value = None
         return value
 
 #----------end class IdbAdapter----------
@@ -165,9 +160,9 @@
     """Start the debugger and its RPC link in the Python subprocess
 
     Start the subprocess side of the split debugger and set up that side of the
-    RPC link by instantiating the GUIProxy, Idle debugger, and IdbAdapter
+    RPC link by instantiating the GUIProxy, Idb debugger, and IdbAdapter
     objects and linking them together.  Register the IdbAdapter to handle RPC
-    requests from the split Debugger GUI via the IdbProxy.
+    requests from the split debugger GUI via the IdbProxy.
 
     """
     gui_proxy = GUIProxy(conn, gui_adap_oid)
@@ -316,12 +311,16 @@
     def clear_break(self, filename, lineno):
         msg = self.call("clear_break", filename, lineno)
 
+    def clear_all_file_breaks(self, filename):
+        msg = self.call("clear_all_file_breaks", filename)
+        
+
 def start_remote_debugger(conn, pyshell):
     """Start the subprocess debugger, initialize the debugger GUI and RPC link
 
     Request the RPCServer start the Python subprocess debugger and link.  Set
     up the Idle side of the split debugger by instantiating the IdbProxy,
-    Debugger GUI, and Debugger GUIAdapter objects and linking them together.
+    debugger GUI, and debugger GUIAdapter objects and linking them together.
 
     Register the GUIAdapter to handle debugger GUI interaction requests coming
     from the subprocess debugger via the GUIProxy.
