diff --git a/product/ERP5Form/ListBox.py b/product/ERP5Form/ListBox.py
index 57a85c1e2e64c76471ff0f32c250077c93d8875d..73110dcbec408fe92172d5ab14e6e2dca28f0746 100644
--- a/product/ERP5Form/ListBox.py
+++ b/product/ERP5Form/ListBox.py
@@ -2771,7 +2771,7 @@ class ListBoxValidator(Validator.Validator):
           selected_uid_set = set(REQUEST.get('uids', ()))
         #LOG('ListBox.validate: REQUEST',0,REQUEST)
         errors = []
-        object_list = None
+        object_dict = None
         # We have two things to do in the case of temp objects,
         # the first thing is to create a list with new temp objects
         # then try to validate some data, and then create again
@@ -2780,19 +2780,27 @@ class ListBoxValidator(Validator.Validator):
         listbox = {}
         for uid in listbox_uids:
           if uid[:4] == 'new_':
-            if object_list is None:
+            if object_dict is None:
               list_method = field.get_value('list_method')
               list_method = getattr(here, list_method.method_name)
               #LOG('ListBoxValidator', 0, 'call %s' % repr(list_method))
               object_list = list_method(REQUEST=REQUEST, **params)
+              object_dict = dict()
+              for obj in object_list:
+                o_uid = obj.getUid()
+                assert o_uid not in object_dict,\
+                  "List method returned duplicate uid %s %s" % (
+                    o_uid, object_dict)
+                object_dict[o_uid] = obj
+
             row_key = uid[4:]
-            for o in object_list:
-              if o.getUid() == uid:
-                break
-            else:
+            try:
+              o = object_dict[uid]
+            except KeyError:
               # First case: dialog input to create new objects
               o = newTempBase(portal, row_key) # Arghhh - XXX acquisition problem - use portal root
               o.uid = uid
+
             listbox[row_key] = row_result = {}
             # We first try to set a listbox corresponding to all things
             # we can validate, so that we can use the same list
@@ -2811,24 +2819,34 @@ class ListBoxValidator(Validator.Validator):
                   pass
                 except KeyError:
                   pass
+
         # Here we generate again the object_list with listbox the listbox we
         # have just created
+        # XXX why ? -jerome
         if listbox:
           list_method = field.get_value('list_method')
           list_method = getattr(here, list_method.method_name)
           REQUEST.set(field.id, listbox)
           object_list = list_method(REQUEST=REQUEST, **params)
+          object_dict = dict()
+          for obj in object_list:
+            o_uid = obj.getUid()
+            assert o_uid not in object_dict,\
+              "List method returned duplicate uid %s" % o_uid
+            object_dict[o_uid] = obj
+
+
         for uid in listbox_uids:
           row_result = {}
           if uid[:4] == 'new_':
-            # First case: dialog input to create new objects
             row_key = uid[4:]
-            for o in object_list:
-              if o.getUid() == uid:
-                break
-            else:
+            try:
+              o = object_dict[uid]
+            except KeyError:
+              # First case: dialog input to create new objects
               o = newTempBase(portal, row_key) # Arghhh - XXX acquisition problem - use portal root
               o.uid = uid
+
             for sql in editable_column_ids:
               editable_field = editable_field_dict.get(sql.replace('.', '_'))
               if editable_field is not None:
@@ -2895,6 +2913,7 @@ class ListBoxValidator(Validator.Validator):
             #except:
             else:
               LOG("ListBox WARNING",0,"Object uid %s could not be validated" % uid)
+
           result[row_key] = row_result
           if select:
             row_result['listbox_selected'] = uid in selected_uid_set