diff --git a/product/ERP5Catalog/tests/testERP5Catalog.py b/product/ERP5Catalog/tests/testERP5Catalog.py
index c621aa352b0690a9981700fb128e1c0992abab58..df02b0bb066539f485bf5dd2eacdf7452440ecbf 100644
--- a/product/ERP5Catalog/tests/testERP5Catalog.py
+++ b/product/ERP5Catalog/tests/testERP5Catalog.py
@@ -2484,6 +2484,106 @@ VALUES
       sql_catalog.sql_search_tables = current_sql_search_tables
       get_transaction().commit()
 
+  def test_ObjectReindexationConcurency(self, quiet=quiet, run=run_all_test):
+    if not run:
+      return
+
+    portal = self.getPortalObject()
+
+    portal_activities = getattr(portal, 'portal_activities', None)
+    if portal_activities is None:
+      ZopeTestCase._print('\n Skipping test_ObjectReindexatoinConcurency (portal_activities not found)')
+      return
+
+    container = organisation_module = portal.organisation_module
+    document_1 = container.newContent()
+    document_1_1 = document_1.newContent()
+    document_1_2 = document_1.newContent()
+    document_2 = container.newContent()
+    get_transaction().commit()
+    self.tic()
+    # First case: parent, then child
+    document_1.reindexObject()
+    self.assertEqual(len(portal_activities.getMessageList()), 0)
+    get_transaction().commit()
+    self.assertEqual(len(portal_activities.getMessageList()), 1)
+    portal_activities.distribute()
+    self.assertEqual(len([x for x in portal_activities.getMessageList() if x.processing_node == 0]), 1)
+    document_1_1.reindexObject()
+    get_transaction().commit()
+    self.assertEqual(len(portal_activities.getMessageList()), 2)
+    portal_activities.distribute()
+    self.assertEqual(len([x for x in portal_activities.getMessageList() if x.processing_node == 0]), 1)
+    self.tic()
+    # Variation of first case: parent's borther along
+    document_1.reindexObject()
+    document_2.reindexObject()
+    self.assertEqual(len(portal_activities.getMessageList()), 0)
+    get_transaction().commit()
+    self.assertEqual(len(portal_activities.getMessageList()), 2)
+    portal_activities.distribute()
+    self.assertEqual(len([x for x in portal_activities.getMessageList() if x.processing_node == 0]), 2)
+    document_1_1.reindexObject()
+    get_transaction().commit()
+    self.assertEqual(len(portal_activities.getMessageList()), 3)
+    portal_activities.distribute()
+    self.assertEqual(len([x for x in portal_activities.getMessageList() if x.processing_node == 0]), 2)
+    self.tic()
+    # Second case: child, then parent
+    document_1_1.reindexObject()
+    self.assertEqual(len(portal_activities.getMessageList()), 0)
+    get_transaction().commit()
+    self.assertEqual(len(portal_activities.getMessageList()), 1)
+    portal_activities.distribute()
+    self.assertEqual(len([x for x in portal_activities.getMessageList() if x.processing_node == 0]), 1)
+    document_1.reindexObject()
+    get_transaction().commit()
+    self.assertEqual(len(portal_activities.getMessageList()), 2)
+    portal_activities.distribute()
+    self.assertEqual(len([x for x in portal_activities.getMessageList() if x.processing_node == 0]), 1)
+    self.tic()
+    # Variation of second case: parent's borther along
+    document_1_1.reindexObject()
+    document_2.reindexObject()
+    self.assertEqual(len(portal_activities.getMessageList()), 0)
+    get_transaction().commit()
+    self.assertEqual(len(portal_activities.getMessageList()), 2)
+    portal_activities.distribute()
+    self.assertEqual(len([x for x in portal_activities.getMessageList() if x.processing_node == 0]), 2)
+    document_1.reindexObject()
+    get_transaction().commit()
+    self.assertEqual(len(portal_activities.getMessageList()), 3)
+    portal_activities.distribute()
+    self.assertEqual(len([x for x in portal_activities.getMessageList() if x.processing_node == 0]), 2)
+    self.tic()
+    # Third case: child 1, then child 2
+    document_1_1.reindexObject()
+    self.assertEqual(len(portal_activities.getMessageList()), 0)
+    get_transaction().commit()
+    self.assertEqual(len(portal_activities.getMessageList()), 1)
+    portal_activities.distribute()
+    self.assertEqual(len([x for x in portal_activities.getMessageList() if x.processing_node == 0]), 1)
+    document_1_2.reindexObject()
+    get_transaction().commit()
+    self.assertEqual(len(portal_activities.getMessageList()), 2)
+    portal_activities.distribute()
+    self.assertEqual(len([x for x in portal_activities.getMessageList() if x.processing_node == 0]), 1)
+    self.tic()
+    # Variation of third case: parent's borther along
+    document_1_1.reindexObject()
+    document_2.reindexObject()
+    self.assertEqual(len(portal_activities.getMessageList()), 0)
+    get_transaction().commit()
+    self.assertEqual(len(portal_activities.getMessageList()), 2)
+    portal_activities.distribute()
+    self.assertEqual(len([x for x in portal_activities.getMessageList() if x.processing_node == 0]), 2)
+    document_1_2.reindexObject()
+    get_transaction().commit()
+    self.assertEqual(len(portal_activities.getMessageList()), 3)
+    portal_activities.distribute()
+    self.assertEqual(len([x for x in portal_activities.getMessageList() if x.processing_node == 0]), 2)
+    self.tic()
+
 def test_suite():
   suite = unittest.TestSuite()
   suite.addTest(unittest.makeSuite(TestERP5Catalog))