diff --git a/product/ERP5Form/FormulatorPatch.py b/product/ERP5Form/FormulatorPatch.py
index 1f0f544cc49f0381b8ae91b1824a85993dd05b7f..34ee415bd220f7ea903bc326a161cd36683c5432 100644
--- a/product/ERP5Form/FormulatorPatch.py
+++ b/product/ERP5Form/FormulatorPatch.py
@@ -180,7 +180,12 @@ SelectionValidator.validate = SelectionValidator_validate
 from Products.Formulator.Validator import MultiSelectionValidator
 
 def MultiSelectionValidator_validate(self, field, key, REQUEST):
-    values = REQUEST.get(key, [])
+    values = REQUEST.get(key)
+    if values is None:
+        if field.get_value('required'):
+          raise Exception, 'Required field %s has not been transmitted. Check that all required fields are in visible groups.' % (repr(field.id), )
+        else:
+          raise KeyError, 'Field %s is not present in request object.' % (repr(field.id), )
     # NOTE: a hack to deal with single item selections
     if type(values) is not type([]):
         # put whatever we got in a list
@@ -237,14 +242,56 @@ MultiSelectionValidator.validate = MultiSelectionValidator_validate
 from Products.Formulator.Validator import BooleanValidator
 
 def BooleanValidator_validate(self, field, key, REQUEST):
-    result = not not REQUEST.get(key, 0)
-    if result==True:
+    result = REQUEST.get(key, REQUEST.get('default_%s' % (key, )))
+    if result is None:
+       if field.get_value('required'):
+         raise Exception, 'Required field %s has not been transmitted. Check that all required fields are in visible groups.' % (repr(field.id), )
+       else:
+         raise KeyError, 'Field %s is not present in request object.' % (repr(field.id), )
+    if (not not result)==True:
        return 1
     else:
        return 0
 
 BooleanValidator.validate = BooleanValidator_validate
 
+from Products.Formulator.Widget import CheckBoxWidget
+def CheckBoxWidget_render(self, field, key, value, REQUEST):
+  """Render checkbox.
+  """
+  rendered = [render_element("input",
+                             type="hidden",
+                             name="default_%s:int" % (key, ),
+                             value="0")
+             ]
+  if value:
+    rendered.append(render_element("input",
+                                   type="checkbox",
+                                   name=key,
+                                   css_class=field.get_value('css_class'),
+                                   checked=None,
+                                   extra=field.get_value('extra'))
+                   )
+  else:
+    rendered.append(render_element("input",
+                                   type="checkbox",
+                                   name=key,
+                                   css_class=field.get_value('css_class'),
+                                   extra=field.get_value('extra'))
+                   )
+  return "".join(rendered)
+
+CheckBoxWidget.render = CheckBoxWidget_render
+
+if 'required' not in CheckBoxWidget.property_names:
+  CheckBoxWidget.property_names = CheckBoxWidget.property_names + ['required']
+  CheckBoxWidget.required = fields.CheckBoxField('required',
+                                                   title='Required',
+                                                   description=(
+        "Enforces the need for the field to be rendered."),
+                                                   default=0)
+
+
 # Patch the render_view of a TextAreaWidget so that
 # it is rendered as a nice box, it is using the tag
 # readonly understood by most browsers for a text area
@@ -348,7 +395,12 @@ IntegerValidator.validate = IntegerValidator_validate
 
 def StringBaseValidator_validate(self, field, key, REQUEST):
   # We had to add this patch for hidden fields of type "list"
-  value = REQUEST.get(key, "")
+  value = REQUEST.get(key)
+  if value is None:
+    if field.get_value('required'):
+      raise Exception, 'Required field %s has not been transmitted. Check that all required fields are in visible groups.' % (repr(field.id), )
+    else:
+      raise KeyError, 'Field %s is not present in request object.' % (repr(field.id), )
   if type(value) is type('a'):
     value = string.strip(value)
   if field.get_value('required') and value == "":