diff --git a/lib/python/OFS/Application.py b/lib/python/OFS/Application.py
index 6ec3078be4ef977b3e8f62c78bd2521b45cee7dd..68e0435a3655d4c2bdcf9218869de6692a295e54 100644
--- a/lib/python/OFS/Application.py
+++ b/lib/python/OFS/Application.py
@@ -84,8 +84,8 @@
 ##############################################################################
 __doc__='''Application support
 
-$Id: Application.py,v 1.156 2001/08/07 18:36:48 evan Exp $'''
-__version__='$Revision: 1.156 $'[11:-2]
+$Id: Application.py,v 1.157 2001/08/09 20:41:00 chrism Exp $'''
+__version__='$Revision: 1.157 $'[11:-2]
 
 import Globals,Folder,os,sys,App.Product, App.ProductRegistry, misc_
 import time, traceback, os, string, Products
@@ -310,19 +310,18 @@ class Application(Globals.ApplicationDefaultPermissions,
         products=self.Control_Panel.Products
         for product in products.objectValues():
             items=list(product.objectItems())
-            finished=[]
-            idx=0
-            while(idx < len(items)):
-                name, ob = items[idx]
+            finished_dict={}
+            finished = finished_dict.has_key
+            while items:
+                name, ob = items.pop()
                 base=getattr(ob, 'aq_base', ob)
-                if base in finished:
-                    idx=idx+1
+                if finished(id(base)):
                     continue
-                finished.append(base)
+                finished_dict[id(base)] = None
                 try:
                     # Try to re-register ZClasses if they need it.
-                    if hasattr(ob, '_register') and hasattr(ob, '_zclass_'):
-                        class_id=getattr(ob._zclass_, '__module__', None)
+                    if hasattr(base,'_register') and hasattr(base,'_zclass_'):
+                        class_id=getattr(base._zclass_, '__module__', None)
                         if class_id and not reg_has_key(class_id):
                             ob._register()
                             result=1
@@ -331,11 +330,11 @@ class Application(Globals.ApplicationDefaultPermissions,
                                     'Registered ZClass: %s' % ob.id
                                     )
                     # Include subobjects.
-                    if hasattr(ob, 'objectItems'):
+                    if hasattr(base, 'objectItems'):
                         m = list(ob.objectItems())
                         items.extend(m)
                     # Try to find ZClasses-in-ZClasses.
-                    if hasattr(ob, 'propertysheets'):
+                    if hasattr(base, 'propertysheets'):
                         ps = ob.propertysheets
                         if (hasattr(ps, 'methods') and
                             hasattr(ps.methods, 'objectItems')):
@@ -343,8 +342,8 @@ class Application(Globals.ApplicationDefaultPermissions,
                             items.extend(m)
                 except:
                     LOG('Zope', WARNING,
-                        'Broken objects exist in product %s.' % product.id)
-                idx = idx + 1
+                        'Broken objects exist in product %s.' % product.id,
+                        error=sys.exc_info())
 
         return result
 
@@ -353,8 +352,15 @@ class Application(Globals.ApplicationDefaultPermissions,
         """Check the global (zclass) registry for problems, which can
         be caused by things like disk-based products being deleted.
         Return true if a problem is found"""
-        try:    keys=list(self._p_jar.root()['ZGlobals'].keys())
-        except: return 1
+        try:
+            keys=list(self._p_jar.root()['ZGlobals'].keys())
+        except:
+            LOG('Zope', ERROR,
+                'A problem was found when checking the global product '\
+                'registry.  This is probably due to a Product being '\
+                'uninstalled or renamed.  The traceback follows.',
+                error=sys.exc_info())
+            return 1
         return 0
 
 
@@ -461,20 +467,17 @@ def initialize(app):
     bad_things=0
     try:
         if app.checkGlobalRegistry():
+            LOG('Zope', INFO,
+                'Beginning attempt to rebuild the global ZClass registry.')
             app.fixupZClassDependencies(rebuild=1)
             did_fixups=1
             LOG('Zope', INFO,
-                'A broken ZClass dependency was found in the global ' \
-                'class registry. This is probably due to a product ' \
-                'being uninstalled. The registry has successfully ' \
-                'been rebuilt.')
+                'The global ZClass registry has successfully been rebuilt.')
             get_transaction().note('Rebuilt global product registry')
             get_transaction().commit()
     except:
         bad_things=1
-        LOG('Zope', ERROR,
-            'A problem was found in the global product registry but '
-            'the attempt to rebuild the registry failed.',
+        LOG('Zope', ERROR, 'The attempt to rebuild the registry failed.',
             error=sys.exc_info())
         get_transaction().abort()
 
@@ -491,7 +494,10 @@ def initialize(app):
         # product was added or updated and we are not a ZEO client.
         if getattr(Globals, '__disk_product_installed__', 0):
             try:
+                LOG('Zope', INFO, 'New disk product detected, determining '\
+                    'if we need to fix up any ZClasses.')
                 if app.fixupZClassDependencies():
+                    LOG('Zope', INFO, 'Repaired broken ZClass dependencies.')
                     get_transaction().commit()
             except:
                 LOG('Zope', ERROR,