diff --git a/product/ERP5/Tool/WorkflowTool.py b/product/ERP5/Tool/WorkflowTool.py
index 7b0f6bc694212ab8ff80074e6fb834fe226fd78f..fa30bb60cdfb507c28109f1417687421bd65d8ba 100644
--- a/product/ERP5/Tool/WorkflowTool.py
+++ b/product/ERP5/Tool/WorkflowTool.py
@@ -127,7 +127,7 @@ class WorkflowTool(BaseTool, OriginalWorkflowTool):
     """
     from Products.ERP5.InteractionWorkflow import InteractionWorkflowDefinition
     from Products.ERP5Workflow.Document.InteractionWorkflow import InteractionWorkflow
-    workflow_list = self.getWorkflowValueListFor(ob.getPortalType())
+    workflow_list = self.getWorkflowsFor(ob.getPortalType())
     if wf_id is None:
       if not workflow_list:
         raise WorkflowException('No workflows found.')
@@ -154,7 +154,7 @@ class WorkflowTool(BaseTool, OriginalWorkflowTool):
     """
     from Products.ERP5.InteractionWorkflow import InteractionWorkflowDefinition
     from Products.ERP5Workflow.Document.InteractionWorkflow import InteractionWorkflow
-    for workflow in (wf_id and (self[wf_id],) or self.getWorkflowValueListFor(ob.getPortalType())):
+    for workflow in (wf_id and (self[wf_id],) or self.getWorkflowsFor(ob.getPortalType())):
       if not isinstance(workflow, InteractionWorkflowDefinition) and \
           not isinstance(workflow, InteractionWorkflow):
         if state_id in workflow.getStateIdList():
@@ -162,7 +162,7 @@ class WorkflowTool(BaseTool, OriginalWorkflowTool):
     return False
 
   def doActionFor(self, ob, action, wf_id=None, *args, **kw):
-    workflow_list = self.getWorkflowValueListFor(ob.getPortalType())
+    workflow_list = self.getWorkflowsFor(ob.getPortalType())
     action_ref = action
     if wf_id is None:
       if workflow_list == []:
@@ -189,36 +189,46 @@ class WorkflowTool(BaseTool, OriginalWorkflowTool):
     return self._invokeWithNotification(
       workflow_list, ob, action, wf.doActionFor, (ob, action) + args, kw)
 
-  def getWorkflowValueListFor(self, ob):
-    """ Return a list of workflows bound to selected object, this workflow
-        list may contain both DC Workflow and Workflow.
+  def getWorkflowValueListForChain(self, ob):
+    """ add type assigned workflows to _chain_by_type.
     """
-    workflow_list = []
-
     if isinstance(ob, basestring):
         portal_type_id = ob
     elif hasattr(aq_base(ob), 'getPortalType'):
         portal_type_id = ob.getPortalType()
     else:
         portal_type_id = None
+    if portal_type_id is not None:
+      portal_type = self.getPortalObject().portal_types._getOb(portal_type_id, None)
+      if portal_type is not None:
+        for workflow_id in portal_type.getTypeWorkflowList():
+          if workflow_id not in self._chains_by_type[portal_type_id]:
+            self.addTypeCBT(portal_type_id, workflow_id)
+
+  def getChainFor(self, ob):
+      """ Get the chain that applies to the given object.
+      """
+      # add type assigned workflows to _chain_by_type.
+      self.getWorkflowValueListForChain(ob)
+      cbt = self._chains_by_type
+      if isinstance(ob, basestring):
+          pt = ob
+      elif hasattr(aq_base(ob), 'getPortalTypeName'):
+          pt = ob.getPortalTypeName()
+      else:
+          pt = None
 
-    if portal_type_id is None:
-        return workflow_list
-
-    portal_type = self.getPortalObject().portal_types._getOb(portal_type_id, None)
-
-    # Workflow assignment:
-    if portal_type is not None:
-      for workflow_id in portal_type.getTypeWorkflowList():
-        workflow_list.append(self._getOb(workflow_id))
-    # DCWorkflow assignment
-    for wf_id in self.getChainFor(ob):
-      wf = self.getWorkflowById(wf_id)
-      if wf is not None:
-        workflow_list.append(wf)
-    return workflow_list
+      if pt is None:
+          return ()
 
-  #getWorkflowsFor = getWorkflowValueListFor
+      chain = None
+      if cbt is not None:
+          chain = cbt.get(pt, None)
+          # Note that if chain is not in cbt or has a value of
+          # None, we use a default chain.
+      if chain is None:
+          return self.getDefaultChain()
+      return chain
 
   security.declarePrivate('getHistoryOf')
   def getHistoryOf(self, wf_id, ob):
@@ -246,7 +256,7 @@ class WorkflowTool(BaseTool, OriginalWorkflowTool):
     temp_workflow_id_list = []
     for dc_workflow in self.getPortalObject().portal_workflow.objectValues():
       workflow_type = dc_workflow.__class__.__name__
-      if workflow_type == 'Workflow' or workflow_type == 'Interaction Workflow':
+      if workflow_type in ['Workflow', 'Interaction Workflow']:
         continue
       temp_workflow = self.dc_workflow_asERP5Object(self, dc_workflow, temp_obj)
       temp_workflow_list.append(temp_workflow)
@@ -527,7 +537,7 @@ class WorkflowTool(BaseTool, OriginalWorkflowTool):
   def isTransitionPossible(self, ob, transition_id, wf_id=None):
     """Test if the given transition exist from the current state.
     """
-    for workflow in (wf_id and (self[wf_id],) or self.getWorkflowValueListFor(ob.getPortalType())):
+    for workflow in (wf_id and (self[wf_id],) or self.getWorkflowsFor(ob.getPortalType())):
       state = workflow._getWorkflowStateOf(ob)
       if state and transition_id in state.getDestinationReferenceList():
         return 1