diff --git a/product/ERP5Form/ListBox.py b/product/ERP5Form/ListBox.py
index 2dd5273651cd22991caac122d148aa930bb11b8c..ab80ca1476651cc7fac50072398618d82a2ba025 100755
--- a/product/ERP5Form/ListBox.py
+++ b/product/ERP5Form/ListBox.py
@@ -35,10 +35,15 @@ from Products.Formulator.MethodField import BoundMethod
 from Selection import Selection
 from DateTime import DateTime
 from Products.ERP5Type.Utils import getPath
+from xml.sax.saxutils import escape
+from copy import copy
 
 from Acquisition import aq_base, aq_inner, aq_parent, aq_self
 from zLOG import LOG
 
+import random 
+import md5
+
 def getAsList(a):
   l = []
   for e in a:
@@ -328,8 +333,12 @@ class ListBoxWidget(Widget.Widget):
         stat_method = field.get_value('stat_method')
         selection_index = REQUEST.get('selection_index')
         selection_name = field.get_value('selection_name')
+        #selection_name = REQUEST.get('selection_name',None)
+        #if selection_name is None:
+        #  selection_name = str(random.randrange(1,2147483600))
         current_selection_name = REQUEST.get('selection_name','default')
         list_action = here.absolute_url() + '/' + field.get_value('list_action')
+        object_list = []
 
         #LOG('Listbox',0,'search_columns1: %s' % str(search_columns))
         if search_columns == [] or search_columns is None or search_columns == '':
@@ -656,6 +665,20 @@ class ListBoxWidget(Widget.Widget):
           # PERFORMANCE
           report_sections = ( (None, 0, 0, object_list, len(object_list), 0),  )
 
+        object_uid_list = map(lambda x: x.uid, object_list)
+        LOG('ListBox.render, object_uid_list:',0,object_uid_list)
+        # Then construct the md5 corresponding this uid list
+        # It is used in order to do some checks in scripts.
+        # For example, if we do delete objects, then we do have a list of
+        # objects to delete, but it is possible that on another tab the selection
+        # change, and then when we confirm the deletion, we don't delete what
+        # we want, so this is really dangerous. with this md5 we can check if the
+        # selection is the same
+        sorted_object_uid_list = copy(object_uid_list)
+        sorted_object_uid_list.sort()
+        md5_string = escape(md5.new(str(sorted_object_uid_list)).digest())
+        #md5_string = md5.new(str(object_uid_list)).digest()
+
 
         #LOG("Selection", 0, str(selection.__dict__))
         
@@ -699,6 +722,9 @@ class ListBoxWidget(Widget.Widget):
         selection_line = """\
 <input type="hidden" name="list_selection_name" value="%s" />
 """ % selection_name
+        selection_line +="""\
+<input type="hidden" name="md5_object_uid_list" value="%s" />
+""" % md5_string
 
         # Create the Page Selector
         if start == 0:
@@ -1019,6 +1045,7 @@ onChange="submitAction(this.form,'%s/portal_selections/setReportRoot')">
               my_field_id = '%s_%s' % (field.id, alias)
               my_field = form.get_field(my_field_id)
               key = my_field.id + '_%s' % o.uid
+              #if attribute_value is Noe
               cell_body = my_field.render(value = attribute_value, REQUEST = o, key = key)
               list_body = list_body + \
                   ('<td class=\"%s\">%s</td>' % (td_css, cell_body))
@@ -1141,6 +1168,7 @@ class ListBoxValidator(Validator.Validator):
 
         result = {}
         listbox_uids = REQUEST.get('%s_uid' % field.id, [])
+        errors = []
         for uid in listbox_uids:
           try:
             # We must try this
@@ -1163,7 +1191,10 @@ class ListBoxValidator(Validator.Validator):
                 except:
                   attribute_value = getattr(o,property_id, None)
                 REQUEST.cell = o # We need cell
-                value = my_field.validator.validate(my_field, key, REQUEST) # We need cell
+                try:
+                  value = my_field.validator.validate(my_field, key, REQUEST) # We need cell
+                except ValidationError, err: # XXXX import missing
+                  errors.append(err)
                 if my_field.meta_type == "MultiListField":
                   test_equal = 1
                   # Sometimes, the attribute is not a list
@@ -1188,6 +1219,9 @@ class ListBoxValidator(Validator.Validator):
                   result[o.getUrl()][sql] = value
           except:
             LOG("ListBox WARNING",0,"Object uid %s could not be validated" % uid)
+        if len(errors):
+          # XXX update
+          pass 
         return result
 
 ListBoxValidatorInstance = ListBoxValidator()