Index: /main/waeup.sirp/trunk/src/waeup/sirp/configure.zcml
===================================================================
--- /main/waeup.sirp/trunk/src/waeup/sirp/configure.zcml	(revision 6277)
+++ /main/waeup.sirp/trunk/src/waeup/sirp/configure.zcml	(revision 6278)
@@ -5,3 +5,4 @@
   <includeDependencies package="." />
   <grok:grok package="." />
+  <includeOverrides package="waeup.sirp.utils" file="overrides.zcml" />
 </configure>
Index: /main/waeup.sirp/trunk/src/waeup/sirp/ftesting.zcml
===================================================================
--- /main/waeup.sirp/trunk/src/waeup/sirp/ftesting.zcml	(revision 6277)
+++ /main/waeup.sirp/trunk/src/waeup/sirp/ftesting.zcml	(revision 6278)
@@ -6,5 +6,5 @@
 
   <include package="grok" />
-  <include package="waeup.sirp" />
+  <includeOverrides package="waeup.sirp" />
 
   <!-- Typical functional testing security setup -->
Index: /main/waeup.sirp/trunk/src/waeup/sirp/utils/converters.py
===================================================================
--- /main/waeup.sirp/trunk/src/waeup/sirp/utils/converters.py	(revision 6277)
+++ /main/waeup.sirp/trunk/src/waeup/sirp/utils/converters.py	(revision 6278)
@@ -4,10 +4,52 @@
 from zope.component import createObject
 from zope.formlib import form
+from zope.formlib.boolwidgets import CheckBoxWidget
 from zope.formlib.form import (
     _widgetKey, WidgetInputError, ValidationError, InputErrors, expandPrefix)
-from zope.formlib.interfaces import IInputWidget
+from zope.formlib.interfaces import IInputWidget, ISimpleInputWidget
 from zope.interface import Interface
 from zope.publisher.browser import TestRequest
 from waeup.sirp.interfaces import IObjectConverter
+
+class ExtendedCheckBoxWidget(CheckBoxWidget):
+    """A checkbox widget that supports more input values as True/False
+       markers.
+
+    The default bool widget expects the string 'on' as only valid
+    ``True`` value in HTML forms for bool fields.
+
+    This widget also accepts '1', 'true' and 'yes' for that. Also all
+    uppercase/lowecase combinations of these strings are accepted.
+
+    The widget still renders ``True`` to ``'on'`` when a form is
+    generated.
+    """
+    true_markers = ['1', 'true', 'on', 'yes']
+
+    def _toFieldValue(self, input):
+        """Convert from HTML presentation to Python bool."""
+        if not isinstance(input, basestring):
+            return False
+        return input.lower() in self.true_markers
+
+    def _getFormInput(self):
+        """Returns the form input used by `_toFieldValue`.
+
+        Return values:
+
+          ``'on'``  checkbox is checked
+          ``''``    checkbox is not checked
+          ``None``  form input was not provided
+
+        """
+        value = self.request.get(self.name)
+        if isinstance(value, basestring):
+            value = value.lower()
+        if value in self.true_markers:
+            return 'on'
+        elif self.name + '.used' in self.request:
+            return ''
+        else:
+            return None
 
 def getWidgetsData(widgets, form_prefix, data):
@@ -48,4 +90,5 @@
 
     return errors
+
 
 class DefaultObjectConverter(grok.Adapter):
Index: /main/waeup.sirp/trunk/src/waeup/sirp/utils/overrides.zcml
===================================================================
--- /main/waeup.sirp/trunk/src/waeup/sirp/utils/overrides.zcml	(revision 6278)
+++ /main/waeup.sirp/trunk/src/waeup/sirp/utils/overrides.zcml	(revision 6278)
@@ -0,0 +1,11 @@
+<configure xmlns="http://namespaces.zope.org/zope">
+
+  <adapter
+      for="zope.schema.interfaces.IBool
+           zope.publisher.interfaces.browser.IBrowserRequest"
+      provides="zope.formlib.interfaces.ISimpleInputWidget"
+      factory=".converters.ExtendedCheckBoxWidget"
+      permission="zope.Public"
+      />
+
+</configure>
Index: /main/waeup.sirp/trunk/src/waeup/sirp/utils/tests/test_converters.py
===================================================================
--- /main/waeup.sirp/trunk/src/waeup/sirp/utils/tests/test_converters.py	(revision 6277)
+++ /main/waeup.sirp/trunk/src/waeup/sirp/utils/tests/test_converters.py	(revision 6278)
@@ -171,4 +171,46 @@
         assert data2['vip'] is False
 
+    def test_bool_nonstandard_values1(self):
+        # We accept 'true', 'True', 'tRuE', 'faLSE' and similar.
+        contact1 = Contact()
+        contact2 = Contact()
+        input_data1 = dict(vip='True')
+        input_data2 = dict(vip='false')
+        converter = IObjectConverter(IContact) # a converter to IContact
+        err1, inv_err1, data1 = converter.fromStringDict(
+            input_data1, contact1)
+        err2, inv_err2, data2 = converter.fromStringDict(
+            input_data2, contact2)
+        assert data1['vip'] is True
+        assert data2['vip'] is False
+
+    def test_bool_nonstandard_values2(self):
+        # We accept '1' and '0' as bool values.
+        contact1 = Contact()
+        contact2 = Contact()
+        input_data1 = dict(vip='1')
+        input_data2 = dict(vip='0')
+        converter = IObjectConverter(IContact) # a converter to IContact
+        err1, inv_err1, data1 = converter.fromStringDict(
+            input_data1, contact1)
+        err2, inv_err2, data2 = converter.fromStringDict(
+            input_data2, contact2)
+        assert data1['vip'] is True
+        assert data2['vip'] is False
+
+    def test_bool_nonstandard_values3(self):
+        # We accept 'yEs', 'no' and similar as bool values.
+        contact1 = Contact()
+        contact2 = Contact()
+        input_data1 = dict(vip='Yes')
+        input_data2 = dict(vip='no')
+        converter = IObjectConverter(IContact) # a converter to IContact
+        err1, inv_err1, data1 = converter.fromStringDict(
+            input_data1, contact1)
+        err2, inv_err2, data2 = converter.fromStringDict(
+            input_data2, contact2)
+        assert data1['vip'] is True
+        assert data2['vip'] is False
+
     def test_int(self):
         contact = Contact()
