diff --git a/product/ERP5/tests/testContributionRegistryTool.py b/product/ERP5/tests/testContributionRegistryTool.py
new file mode 100644
index 0000000000000000000000000000000000000000..e634ba909cf7381dac581fea4d408135e2379a2f
--- /dev/null
+++ b/product/ERP5/tests/testContributionRegistryTool.py
@@ -0,0 +1,160 @@
+#############################################################################
+#
+# Copyright (c) 2008 Nexedi SA and Contributors. All Rights Reserved.
+#                    Yusei TAHARA <yusei@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.
+#
+##############################################################################
+
+import unittest
+from Products.ERP5Type.tests.ERP5TypeTestCase import ERP5TypeTestCase
+from transaction import get_transaction
+
+
+class TestContributionRegistryTool(ERP5TypeTestCase):
+
+  run_all_test = 1
+
+  def getTitle(self):
+    return "Contribution Registry Tool"
+
+  def getBusinessTemplateList(self):
+    return ()
+
+  def afterSetUp(self):
+    self.setUpTestScript()
+    self.setUpMimeType()
+    self.setUpPredicate()
+
+  def setUpTestScript(self):
+    if getattr(self.portal, 'IngestionFile_testEvent', None) is not None:
+      return
+    python_script_src = (
+"""\
+## Script (Python) "IngestionFile_testEvent"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=predicate=None
+##title=
+##
+from Products.ERP5Type.Document import newTempEvent
+
+new_id = newTempEvent(context, 'subobject', data=context.getData())
+event = context[new_id]
+
+subject = event.getContentInformation().get('Subject', None)
+if subject == 'Fax':
+  return 'Fax Message'
+return predicate.getDestinationPortalType()
+""")
+    self.portal.manage_addProduct['PythonScripts'].manage_addPythonScript(id='IngestionFile_testEvent')
+    self.portal.IngestionFile_testEvent.write(python_script_src)
+    get_transaction().commit()
+    self.tic()
+
+  def setUpMimeType(self):
+    portal_categories = self.portal.portal_categories
+    if getattr(portal_categories, 'mime_type', None):
+      mime_type = portal_categories.newContent(portal_type='Base Category',
+                                               id='mime_type')
+      text = mime_type.newContent(portal_type='Category', id='text')
+      html = html.newContent(portal_type='Category', id='html')
+      get_transaction().commit()
+      self.tic()
+
+    if getattr(portal_categories, 'mime_type', None):
+      mime_type = portal_categories.newContent(portal_type='Base Category',
+                                               id='mime_type')
+      text = mime_type.newContent(portal_type='Category', id='message')
+      html = html.newContent(portal_type='Category', id='rfc822')
+      get_transaction().commit()
+      self.tic()
+
+  def setUpPredicate(self):
+    portal_contribution_registry = self.portal.portal_contribution_registry
+    if getattr(portal_contribution_registry, 'webpage_mimetype', None) is None:
+      predicate = portal_contribution_registry.newContent(
+        portal_type='Contribution Predicate',
+        id='webpage_mimetype')
+      predicate._setMembershipCriterionCategoryList(['mime_type/text/html'])
+      predicate._setMembershipCriterionBaseCategoryList(['mime_type'])
+      predicate.setDestinationPortalType('Web Page')
+      get_transaction().commit()
+      self.tic()
+
+    if getattr(portal_contribution_registry, 'my_predicate', None) is None:
+      predicate = portal_contribution_registry.newContent(
+        portal_type='Contribution Predicate',
+        id='my_predicate')
+      predicate._setMembershipCriterionCategoryList(['mime_type/message/rfc822'])
+      predicate._setMembershipCriterionBaseCategoryList(['mime_type'])
+      predicate.setCriterion('file_extension', identity=['eml'])
+      predicate.setDestinationPortalType('Mail Message')
+      predicate.setTestMethodId('IngestionFile_testEvent')
+      get_transaction().commit()
+      self.tic()
+
+  def testFindPortalTypeName(self, quiet=0, run=run_all_test):
+    tool = self.portal.portal_contribution_registry
+
+    # Test extension matching
+    self.assertEqual(tool.findPortalTypeName(file_name='test.txt'), 'Text')
+    self.assertEqual(tool.findPortalTypeName(file_name='test.odt'), 'Text')
+    self.assertEqual(tool.findPortalTypeName(file_name='001.jpg'), 'Image')
+    self.assertEqual(tool.findPortalTypeName(file_name='002.PNG'), 'Image')
+    self.assertEqual(tool.findPortalTypeName(file_name='002.PNG'), 'Image')
+    self.assertEqual(tool.findPortalTypeName(file_name='index.html'), 'Web Page')
+    # Unknown extension
+    self.assertEqual(tool.findPortalTypeName(file_name='index.xxx'), 'File')
+
+    # Test mimetype matching
+    self.assertEqual(tool.findPortalTypeName(mime_type='text/html'), 'Web Page')
+
+    # Unknown mimetype
+    self.assertEqual(tool.findPortalTypeName(mime_type='application/octet-stream'), 'File')
+
+    # Test both of extension and mimetype
+    self.assertNotEqual(tool.findPortalTypeName(file_name='message.eml'),
+                        'Mail Message')
+    self.assertNotEqual(tool.findPortalTypeName(mime_type='message/rfc822'),
+                        'Mail Message')
+    self.assertEqual(tool.findPortalTypeName(file_name='message.eml',
+                                             mime_type='message/rfc822'),
+                     'Mail Message')
+
+    # Test test script
+    data = """\
+Subject: Fax
+"""
+    self.assertEqual(tool.findPortalTypeName(file_name='message.eml',
+                                             mime_type='message/rfc822',
+                                             data=data),
+                     'Fax Message')
+
+def test_suite():
+  suite = unittest.TestSuite()
+  suite.addTest(unittest.makeSuite(TestContributionRegistryTool))
+  return suite