diff --git a/product/ERP5Configurator/tests/testConfiguratorItem.py b/product/ERP5Configurator/tests/testConfiguratorItem.py
new file mode 100644
index 0000000000000000000000000000000000000000..03812ad3ae6496d458d6fbb8ac639751991c8e04
--- /dev/null
+++ b/product/ERP5Configurator/tests/testConfiguratorItem.py
@@ -0,0 +1,351 @@
+##############################################################################
+# Copyright (c) 2012 Nexedi SA and Contributors. All Rights Reserved.
+#                     Rafael Monnerat <rafael@nexedi.com>
+#
+# WARNING: This program as such is intended to be used by professional
+# programmers who take the whole responsability of assessing all potential
+# consequences resulting from its eventual inadequacies and bugs
+# End users who are looking for a ready-to-use solution with commercial
+# garantees and support are strongly adviced to contract a Free Software
+# Service Company
+#
+# This program is Free Software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+#
+##############################################################################
+
+
+from AccessControl import Unauthorized
+import uuid
+from Products.ERP5Configurator.tests.ConfiguratorTestMixin import \
+                                             TestLiveConfiguratorWorkflowMixin
+
+from Products.ERP5Configurator import tests as test_folder
+
+class TestConfiguratorItem(TestLiveConfiguratorWorkflowMixin):
+  """
+    Test the Configurator Tool
+  """
+
+  def getBusinessTemplateList(self):
+    return ('erp5_core_proxy_field_legacy',
+            'erp5_full_text_myisam_catalog',
+            'erp5_base',
+            'erp5_workflow',
+            'erp5_configurator')
+
+  def createConfigurationSave(self):
+    """ Create a Business Configuration and a Configuration Save 
+    """
+    bc = self.portal.business_configuration_module.newContent()
+    return bc.newContent(portal_type="Configuration Save")
+    
+
+  def newUniqueUID(self):
+    """ Return a unique number id"""
+    return str(uuid.uuid1())
+
+  def testOrganisationConfiguratorItem(self):
+    """
+      The Anonymous user can not have access to view the Configurator Tool.
+    """
+    configuration_save = self.createConfigurationSave()
+
+    group_id = "some_group"
+
+    title = "test_%s" % self.newUniqueUID()
+    kw = { 'title': title,
+           'corporate_name': "test_corporate_name",
+           'default_address_city': 'test_default_address_city',
+           'default_email_text': 'test_default_email_text',
+           'default_telephone_text': 'test_default_telephone_text',
+           'default_address_zip_code': 'test_default_address_zip_code',
+           'default_address_region': 'test_default_address_region',
+           'default_address_street_address': 'test_default_address_street_address',
+         }
+
+
+    item = configuration_save.addConfigurationItem(  
+      "Organisation Configurator Item",
+      group=group_id, site='main', **kw)
+
+    self.stepTic()
+    item._build(configuration_save.getParentValue())
+    self.stepTic()
+
+    organisation = self.portal.portal_catalog.getResultValue(
+                       portal_type="Organisation", 
+                       title = title)
+
+    self.assertNotEquals(organisation, None)
+    
+    self.assertEquals(group_id, organisation.getGroup())
+    self.assertEquals(kw['title'], organisation.getTitle())
+    self.assertEquals(kw['corporate_name'], organisation.getCorporateName())
+    self.assertEquals(kw['default_address_city'],
+                      organisation.getDefaultAddressCity())
+    self.assertEquals(kw['default_email_text'],
+                      organisation.getDefaultEmailText())
+    self.assertEquals(kw['default_telephone_text'],
+                      organisation.getDefaultTelephoneText())
+    self.assertEquals(kw['default_address_zip_code'],
+                      organisation.getDefaultAddressZipCode())
+    self.assertEquals(kw['default_address_region'],
+                      organisation.getDefaultAddressRegion())
+
+    self.assertEquals(kw['default_address_street_address'],
+                      organisation.getDefaultAddressStreetAddress())
+
+    self.assertEquals('main', organisation.getSite())
+    self.assertEquals('validated', organisation.getValidationState())
+
+
+  def testCategoryConfiguratorItem(self):
+    """ Test Category Configurator Item """
+    configuration_save = self.createConfigurationSave()
+    bc = configuration_save.getParentValue()
+    
+    category_id_0 = "test_category_%s" % self.newUniqueUID()
+    item0 = configuration_save.addConfigurationItem(
+                                        "Category Configurator Item",
+                                        category_root='group',
+                                        object_id=category_id_0,
+                                        title="title_%s" % category_id_0)
+
+    category_id_1 = "test_category_%s" % self.newUniqueUID()
+    item1 = configuration_save.addConfigurationItem(
+                                        "Category Configurator Item",
+                                        category_root='group',
+                                        object_id=category_id_1,
+                                        title="title_%s" % category_id_1)
+
+    self.stepTic()
+    item0._build(bc)
+    self.stepTic()
+
+    category_0 = getattr(self.portal.portal_categories.group, category_id_0, None)
+    self.assertNotEquals(category_0, None)
+    self.assertEquals(category_0.getTitle(), "title_%s" % category_id_0)
+
+    category_1 = getattr(self.portal.portal_categories.group, category_id_1, None)
+    self.assertEquals(category_1, None)
+
+    item1._build(bc)
+    self.stepTic()
+
+    category_1 = getattr(self.portal.portal_categories.group, category_id_1, None)
+    self.assertNotEquals(category_1, None)
+    self.assertEquals(category_1.getTitle(), "title_%s" % category_id_1)
+
+    # recreate category_1 with new title
+
+    item2 = configuration_save.addConfigurationItem(
+                                        "Category Configurator Item",
+                                        category_root='group',
+                                        object_id=category_id_1,
+                                        title="new_title_%s" % category_id_1)
+
+    item2._build(bc)
+    self.stepTic()
+
+    category_1 = getattr(self.portal.portal_categories.group, 
+                         category_id_1, None)
+    self.assertNotEquals(category_1, None)
+    self.assertEquals(category_1.getTitle(), "new_title_%s" % category_id_1)
+
+  def testCurrencyConfiguratorItem(self):
+    """ Test Category Configurator Item """
+    configuration_save = self.createConfigurationSave()
+    bc = configuration_save.getParentValue()
+
+    eur_currency_id = "EUR"
+    eur_currency_title = "Euro"
+    item_eur = configuration_save.addConfigurationItem(
+                             "Currency Configurator Item",
+                             reference = eur_currency_id,
+                             base_unit_quantity = 0.01,
+                             title = eur_currency_title,)
+
+    brl_currency_id = "BRL"
+    brl_currency_title = "Brazillian Real"
+    item_brl = configuration_save.addConfigurationItem(
+                             "Currency Configurator Item",
+                             reference = brl_currency_id,
+                             base_unit_quantity = 0.01,
+                             title = brl_currency_title,)
+
+    self.stepTic()
+
+    item_eur._build(bc)
+    self.stepTic()
+
+    eur = getattr(self.portal.currency_module, eur_currency_id , None)
+    self.assertNotEquals(eur, None)
+    self.assertEquals(eur.getTitle(), eur_currency_title)
+
+    brl = getattr(self.portal.currency_module, brl_currency_id , None)
+    self.assertEquals(brl, None)
+
+    item_brl._build(bc)
+    self.stepTic()
+
+    brl = getattr(self.portal.currency_module, brl_currency_id , None)
+    self.assertNotEquals(brl, None)
+    self.assertEquals(brl.getTitle(), brl_currency_title)
+
+    # Build several times to not break portal.
+
+    item_brl._build(bc)
+    self.stepTic()
+    item_brl._build(bc)
+    self.stepTic()
+
+  def testPortalTypeRolesSpreadsheetConfiguratorItem(self):
+    """ Test Portal Type Roles Configurator Item """
+    configuration_save = self.createConfigurationSave()
+    bc = configuration_save.getParentValue()
+    category_tool = self.portal.portal_categories
+
+    test_folder_path = '/'.join(test_folder.__file__.split('/')[:-1])
+
+    f = open("%s/test_data/test_standard_portal_type_roles.ods" \
+               % test_folder_path, "r")
+    try:
+      data = f.read()
+    finally:
+      f.close()
+
+    if getattr(category_tool.group, "my_group", None) is None:
+      category_tool.group.newContent(id="my_group")
+
+    item = configuration_save.addConfigurationItem(
+      "Portal Type Roles Spreadsheet Configurator Item",
+      configuration_spreadsheet_data = data)
+
+
+    person_type = self.portal.portal_types["Person"]
+    person_module_type = self.portal.portal_types["Person Module"]
+
+    role_list = [i for i in person_type.objectValues(
+                 portal_type="Role Information")
+                 if i.getTitle() == "TestRole_Person"]
+
+    if len(role_list) > 0:
+      person_type.manage_delObjects([i.id for i in role_list])
+
+    role_list = [i for i in person_module_type.objectValues(
+                 portal_type="Role Information")
+                if i.getTitle() == "TestRole_PersonModule"]
+
+    if len(role_list) > 0:
+      person_module_type.manage_delObjects([i.id for i in role_list])
+
+    self.stepTic()
+    item._build(bc)
+    self.stepTic()
+
+    role_list = [i for i in person_type.objectValues(
+                 portal_type="Role Information") 
+                if i.getTitle() == "TestRole_Person"]
+
+    self.assertEquals(len(role_list), 1)
+
+    self.assertEquals(role_list[0].getDescription(), 
+                      "Configured by ERP5 Configurator")
+
+    self.assertEquals(role_list[0].getRoleNameList(), 
+                      ['Auditor', 'Author', 'Assignee'])
+
+    self.assertEquals(role_list[0].getRoleCategoryList(),
+                      ['group/my_group',])
+
+
+    role_list = [i for i in person_module_type.objectValues(
+                 portal_type="Role Information")
+                if i.getTitle() == "TestRole_PersonModule"]
+
+    self.assertEquals(len(role_list), 1)
+
+    self.assertEquals(role_list[0].getDescription(),
+                      "Configured by ERP5 Configurator")
+
+    self.assertEquals(role_list[0].getRoleNameList(),
+                      ['Auditor', 'Author'])
+
+    self.assertEquals(role_list[0].getRoleCategoryList(),
+                      ['group/my_group',])
+
+
+  def testCategoriesSpreadsheetConfiguratorItem(self):
+    """ Test Portal Type Roles Configurator Item """
+    configuration_save = self.createConfigurationSave()
+    bc = configuration_save.getParentValue()
+    category_tool = self.portal.portal_categories
+
+    test_folder_path = '/'.join(test_folder.__file__.split('/')[:-1])
+
+    f = open("%s/test_data/test_standard_categories.ods" \
+               % test_folder_path, "r")
+    try:
+      data = f.read()
+    finally:
+      f.close()
+
+    item = configuration_save.addConfigurationItem(
+      "Categories Spreadsheet Configurator Item",
+      configuration_spreadsheet_data = data)
+
+    self.stepTic()
+    item._build(bc)
+    self.stepTic()
+
+    base_category_list = ["group", "site", "business_application", 
+                          "function", "region"]
+
+    for base_category_id in base_category_list:
+      # Check first Level
+      base_category = getattr(category_tool, base_category_id)    
+      my_test = getattr(base_category, "my_test", None)
+      self.assertNotEquals(my_test, None)
+      self.assertEquals(my_test.getTitle(), "TEST")
+      self.assertEquals(my_test.getDescription(), "TEST")
+      self.assertEquals(my_test.getCodification(), "TEST")
+      self.assertEquals(my_test.getIntIndex(), 1)
+      # Check Second level
+      my_test = getattr(my_test, "my_test", None)
+      self.assertNotEquals(my_test, None)
+      self.assertEquals(my_test.getTitle(), "TEST")
+      self.assertEquals(my_test.getDescription(), "TEST")
+      self.assertEquals(my_test.getCodification(), "TEST")
+      self.assertEquals(my_test.getIntIndex(), 2)
+
+      # Check Thrid level
+      my_test = getattr(my_test, "my_test", None)
+      self.assertNotEquals(my_test, None)
+      self.assertEquals(my_test.getTitle(), "TEST")
+      self.assertEquals(my_test.getDescription(), "TEST")
+      self.assertEquals(my_test.getCodification(), "TEST")
+      self.assertEquals(my_test.getIntIndex(), 3)
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/product/ERP5Configurator/tests/test_data/test_standard_categories.ods b/product/ERP5Configurator/tests/test_data/test_standard_categories.ods
new file mode 100644
index 0000000000000000000000000000000000000000..61c143775ff4d71d02a52094efea22e3e62834a6
Binary files /dev/null and b/product/ERP5Configurator/tests/test_data/test_standard_categories.ods differ
diff --git a/product/ERP5Configurator/tests/test_data/test_standard_portal_type_roles.ods b/product/ERP5Configurator/tests/test_data/test_standard_portal_type_roles.ods
new file mode 100644
index 0000000000000000000000000000000000000000..aeb67aff840ff5a65ade63ca4aa1f13b291a99ce
Binary files /dev/null and b/product/ERP5Configurator/tests/test_data/test_standard_portal_type_roles.ods differ