diff --git a/product/ERP5/Document/BusinessProcess.py b/product/ERP5/Document/BusinessProcess.py
index cf84550e1fb263a49eda6478d8161388e8abac13..fe3d551f3c9458606cee2b679da268ebb501cd65 100644
--- a/product/ERP5/Document/BusinessProcess.py
+++ b/product/ERP5/Document/BusinessProcess.py
@@ -138,12 +138,6 @@ class BusinessProcess(Path, XMLObject):
     kw.setdefault('portal_type', self.getPortalTradeModelPathTypeList())
     kw.setdefault('sort_on', 'int_index')
     original_path_list = self.objectValues(**kw) # Why Object Values ??? XXX-JPS
-    LOG('self', 0, repr(self))
-    LOG('objectValues', 0, repr(self.objectValues()))
-    LOG('portal_type', 0, repr(kw['portal_type']))
-    LOG('objectValues kw', 0, repr(self.objectValues(**kw)))
-    LOG('trade_phase', 0, trade_phase)
-    LOG('original_path_list', 0, original_path_list)
     # Separate the selection of trade model paths into two steps
     # for easier debugging.
     # First, collect trade model paths which can be applicable to a given context.
@@ -152,7 +146,6 @@ class BusinessProcess(Path, XMLObject):
       # Filter our business path which trade phase does not match
       if trade_phase is None or trade_phase.intersection(path.getTradePhaseList()):
         path_list.append(path)
-    LOG('path_list', 0, path_list)
     # Then, filter trade model paths by Predicate API.
     # FIXME: Ideally, we should use the Domain Tool to search business paths,
     # and avoid using the low level Predicate API. But the Domain Tool does
@@ -187,7 +180,6 @@ class BusinessProcess(Path, XMLObject):
       raise ValueError('a reference date method must be defined on every Trade Model Path')
 
     explanation_cache = _getExplanationCache(explanation)
-    LOG('calling explanation_cache.getReferenceDate', 0, '%s %s %s %s' % (explanation, self, trade_date, reference_date_method_id))
     reference_date = explanation_cache.getReferenceDate(self, trade_date, reference_date_method_id)
 
     # Computer start_date and stop_date (XXX-JPS this could be cached and accelerated)    
@@ -245,9 +237,9 @@ class BusinessProcess(Path, XMLObject):
     # FIXME: Ideally, we should use the Domain Tool to search business links,
     # and avoid using the low level Predicate API. But the Domain Tool does
     # support the condition above without scripting?
-    LOG('business_link_list', 0, repr(business_link_list))
     if context is None:
-      LOG('context is None', 0, repr(business_link_list))
+      LOG('ERP5.Document.BusinessProcess', 0, 'Context is None %r' %
+                  (business_link_list,))
       return business_link_list
     return [business_link for business_link in business_link_list
                 if business_link.test(context)]
@@ -262,7 +254,6 @@ class BusinessProcess(Path, XMLObject):
 
     business_link -- a Business Link document
     """
-    LOG('In isBusinessLinkCompleted', 0, repr(business_link))
     # Return False if Business Link is not completed
     if not business_link.isCompleted(explanation):
       return False
@@ -362,9 +353,7 @@ class BusinessProcess(Path, XMLObject):
     business_link -- a Business Link document
     """
     # If everything is delivered, no need to build
-    LOG('In isBusinessLinkBuildable', 0, repr(business_link))
     if business_link.isDelivered(explanation):
-      LOG('In isBusinessLinkBuildable', 0, 'business link is delivered and thus False')
       return False
     # We must take the closure cause only way to combine business process
     closure_process = _getBusinessLinkClosure(self, explanation, business_link)
@@ -522,10 +511,8 @@ class BusinessProcess(Path, XMLObject):
 
     trade_state -- a Trade State category
     """
-    LOG('In isTradeStateCompleted', 0, repr(trade_state))
     for business_link in self.getBusinessLinkValueList(successor=trade_state):
       if not self.isBusinessLinkCompleted(explanation, business_link):
-        LOG('A business link is not completed', 0, repr(business_link))
         return False
     return True      
 
@@ -837,6 +824,5 @@ class BusinessProcess(Path, XMLObject):
     """
       Build whatever is buildable
     """
-    LOG('In business process build', 0, repr(explanation))
     for business_link in self.getBuildableBusinessLinkValueList(explanation):
       business_link.build(explanation=explanation)
diff --git a/product/ERP5/ExplanationCache.py b/product/ERP5/ExplanationCache.py
index d47c388e54da0844ec86609fc08f1aa9e072a0c7..36e4d7279609cdf4bbf4850d3a3b24bee2b11961 100644
--- a/product/ERP5/ExplanationCache.py
+++ b/product/ERP5/ExplanationCache.py
@@ -116,8 +116,6 @@ class ExplanationCache:
       simulation_movement_id = simulation_movement.getId()
       insert_movement = True
       for path_id in container_path:
-        LOG('path_dict', 0, repr(path_dict))
-        LOG('local_path_dict', 0, repr(local_path_dict))
         local_path_dict = local_path_dict.setdefault(path_id, {})
         if type(local_path_dict) is not types.DictType:
           # A movement was already inserted
@@ -125,7 +123,6 @@ class ExplanationCache:
           break
       if insert_movement:
         local_path_dict[simulation_movement_id] = simulation_movement
-      LOG('path_dict result', 0, repr(path_dict))
 
     # For each delivery movement
     for movement in self._getDeliveryMovementList():
@@ -137,8 +134,6 @@ class ExplanationCache:
     # assembling path '/erp5/portal_simulation/1/34/23/43%'
     result = []
     def browsePathDict(prefix, local_path_dict):
-      LOG('browsePathDict result in', 0, repr(result))
-      LOG('browsePathDict local_path_dict in', 0, repr(local_path_dict))
       for key, value in local_path_dict.items():
         if type(value) is not types.DictType:
           # We have a real root
@@ -147,7 +142,6 @@ class ExplanationCache:
           # XXX-JPS here we must add all parent movements XXX-JPS
         else:
           browsePathDict('%s/%s' % (prefix, key), value) # Recursing with string append is slow XXX-JPS
-      LOG('browsePathDict result out', 0, repr(result))
 
     # path_dict is typically like this:
     #  {'': {'erp5': {'portal_simulation': {'3': {'4': <SimulationMovement at /erp5/portal_simulation/3/4>}}}}}
@@ -210,7 +204,6 @@ class ExplanationCache:
           kw['path'] = self.getSimulationPathPatternList() # XXX-JPS Explicit Query is better
         if kw.get('explanation_uid', None) is None:
           kw['explanation_uid'] = self.getRootExplanationUidList()
-        LOG('lookup movements', 0, repr(kw))
         self.simulation_movement_cache[kw_tuple] = \
                self.portal_catalog(portal_type="Simulation Movement",
                                    **kw)
@@ -342,7 +335,6 @@ class ExplanationCache:
     # whenever trade model path define time constraints within the same
     # movement generator (ie. transformation with multiple phases)
     path_list = business_process.getTradeModelPathValueList(trade_phase=trade_phase, context=business_process)
-    LOG('path_list', 0, '%s' % trade_phase)
     if not len(path_list):
       raise ValueError('No Trade Model Path defines a reference data.')
 
diff --git a/product/ERP5/mixin/rule.py b/product/ERP5/mixin/rule.py
index e4c18dcc9a5622276e5c66759f478e76a140929c..8cca344cb975c6c463a932c1a2b7c8259e231a6b 100644
--- a/product/ERP5/mixin/rule.py
+++ b/product/ERP5/mixin/rule.py
@@ -98,7 +98,6 @@ class MovementGeneratorMixin:
     # Build a list of movement and business path
     input_movement_list = self._getInputMovementList(
                             movement_list=movement_list, rounding=rounding)
-    LOG('_getInputMovementList', 0, repr(input_movement_list))
     for input_movement in input_movement_list:
       # Merge movement and business path properties (core implementation)
       # Lookup Business Process through composition (NOT UNION)