diff --git a/product/ERP5/Tool/TemplateTool.py b/product/ERP5/Tool/TemplateTool.py
index b44c1117948f510ed69881dd793d9b6a8f3330b2..aa630bef75163258463e9f0540836932c65d5ddf 100644
--- a/product/ERP5/Tool/TemplateTool.py
+++ b/product/ERP5/Tool/TemplateTool.py
@@ -1233,6 +1233,52 @@ class TemplateTool (BaseTool):
       return self.installBusinessTemplateListFromRepository(template_list,
         only_newer, update_catalog, activate=False)
 
+    security.declareProtected(Permissions.ManagePortal,
+         'resolveBusinessTemplateListDependency')
+    def resolveBusinessTemplateListDependency(self, template_title_list, 
+              newest_only=True):
+      available_bt5_list = self.getRepositoryBusinessTemplateList(
+        newest_only=newest_only)
+
+      installed_bt5_title_list = self.getInstalledBusinessTemplateTitleList()
+
+      bt5_set = set([])
+      for available_bt5 in available_bt5_list:
+        if available_bt5.title in template_title_list:
+          document = self.getInstalledBusinessTemplate(available_bt5.title)
+          if not newest_only or document is None or (document is not None and  \
+              (int(document.getRevision()) < int(available_bt5.getRevision()))):
+  
+            bt5 = self.decodeRepositoryBusinessTemplateUid(available_bt5.uid)
+            bt5_set.add(bt5)
+            for dep_repository, dep_id in self.getDependencyList(bt5):
+              if dep_repository != 'meta':
+                bt5_set.add((dep_repository, dep_id))
+              else:
+                provider_list = self.getProviderList(dep_id)
+                provider_installed = False
+                for provider in provider_list:
+                  if provider in [i[1].replace(".bt5", "") for i in bt5_set] or \
+                       provider in installed_bt5_title_list or \
+                       provider in template_title_list:
+                    provider_installed = True
+                    break
+
+                if not provider_installed:
+                  if len(provider_list) == 1:
+                    for candidate in available_bt5_list:
+                      if candidate.title == provider_list[0]:
+                        bt5_set.add(\
+                          self.decodeRepositoryBusinessTemplateUid(
+                              candidate.uid))
+                        break
+                  else:
+                    raise BusinessTemplateMissingDependency,\
+                      "Unable to resolve dependencies for %s, options are %s" \
+                          % (dep_id, provider_list)
+      
+      return self.sortBusinessTemplateList(list(bt5_set))
+
     security.declareProtected(Permissions.ManagePortal,
         'installBusinessTemplateListFromRepository')
     def installBusinessTemplateListFromRepository(self, template_list,
diff --git a/product/ERP5/tests/testTemplateTool.py b/product/ERP5/tests/testTemplateTool.py
index c9c533b483ceebc137bc9fb0af9a0adfdcf193da..2a5f835715b09bc0cc9c80a88c93d6075a8095fc 100644
--- a/product/ERP5/tests/testTemplateTool.py
+++ b/product/ERP5/tests/testTemplateTool.py
@@ -354,6 +354,68 @@ class TestTemplateTool(ERP5TypeTestCase):
     self.assertEquals(getBusinessTemplateUrl(url_list[2:], not_exist_bt5), None)
     self.assertEquals(getBusinessTemplateUrl(url_list[3:], not_exist_bt5), None)
     self.assertEquals(getBusinessTemplateUrl(url_list[4:], not_exist_bt5), None)
+
+  def test_resolveBusinessTemplateListDependency(self):
+    """ Test API able to return a complete list of bt5s to setup a sub set of
+    business templates.
+    """
+    repository = "http://www.erp5.org/dists/snapshot/bt5/"
+    template_tool = self.portal.portal_templates
+    bt5_id_list = ['erp5_accounting']
+    bt5_list = template_tool.resolveBusinessTemplateListDependency(bt5_id_list)
+    self.assertEquals([(repository, 'erp5_simulation.bt5'), 
+                       (repository, 'erp5_accounting.bt5')], bt5_list)
+
+    bt5_id_list = ['erp5_csv_style']
+    bt5_list = template_tool.resolveBusinessTemplateListDependency(bt5_id_list)
+    self.assertEquals([], bt5_list)
+
+    bt5_list = template_tool.resolveBusinessTemplateListDependency(
+                      bt5_id_list, False)
+    self.assertEquals([(repository, 'erp5_csv_style.bt5')], bt5_list)
+
+    bt5_id_list = ['erp5_base']
+    bt5_list = template_tool.resolveBusinessTemplateListDependency(
+           bt5_id_list, True)
+    self.assertEquals([], bt5_list)
+
+    bt5_id_list = ['erp5_configurator_ung']
+    bt5_list = template_tool.resolveBusinessTemplateListDependency(bt5_id_list)
+    self.assertEquals([(repository, 'erp5_workflow.bt5'),
+                       (repository, 'erp5_configurator.bt5'), 
+                       (repository, 'erp5_configurator_ung.bt5')], bt5_list)
+
+    bt5_id_list = ['erp5_configurator_ung', 'erp5_accounting', 'erp5_invoicing', 
+                   'erp5_crm']
+    bt5_list = template_tool.resolveBusinessTemplateListDependency(bt5_id_list)
+    self.assertEquals([(repository, 'erp5_ingestion_mysql_innodb_catalog.bt5'),
+                       (repository, 'erp5_workflow.bt5'),
+                       (repository, 'erp5_simulation.bt5'),
+                       (repository, 'erp5_pdm.bt5'),
+                       (repository, 'erp5_ingestion.bt5'),
+                       (repository, 'erp5_configurator.bt5'),
+                       (repository, 'erp5_trade.bt5'),
+                       (repository, 'erp5_accounting.bt5'),
+                       (repository, 'erp5_crm.bt5'),
+                       (repository, 'erp5_configurator_ung.bt5'),
+                       (repository, 'erp5_invoicing.bt5')], bt5_list)
+
+    bt5_id_list = ['erp5_base']
+    self.assertRaises(BusinessTemplateMissingDependency,
+                template_tool.resolveBusinessTemplateListDependency,
+                bt5_id_list, False)
+
+    bt5_id_list = ['erp5_dms', 'erp5_full_text_myisam_catalog', 'erp5_base']
+    bt5_list = template_tool.resolveBusinessTemplateListDependency(bt5_id_list,
+                                                                   False)
+    self.assertEquals([(repository, 'erp5_core_proxy_field_legacy.bt5'),
+                       (repository, 'erp5_full_text_myisam_catalog.bt5'),
+                        (repository, 'erp5_ingestion_mysql_innodb_catalog.bt5'),
+                        (repository, 'erp5_base.bt5'),
+                        (repository, 'erp5_jquery.bt5'),
+                        (repository, 'erp5_ingestion.bt5'),
+                        (repository, 'erp5_web.bt5'),
+                        (repository, 'erp5_dms.bt5')], bt5_list)
 def test_suite():
   suite = unittest.TestSuite()
   suite.addTest(unittest.makeSuite(TestTemplateTool))