Index: django/contrib/admin/options.py
===================================================================
--- django/contrib/admin/options.py	(revision 7266)
+++ django/contrib/admin/options.py	(working copy)
@@ -161,6 +161,11 @@
             kwargs['widget'] = widgets.AdminTimeWidget
             return db_field.formfield(**kwargs)
 
+        # For BooleanFields, use a special widget with a custom css class.
+        if isinstance(db_field, models.BooleanField):
+            kwargs['widget'] = widgets.AdminBooleanSelectWidget
+            return db_field.formfield(**kwargs)
+
         # For FileFields and ImageFields add a link to the current file.
         if isinstance(db_field, models.ImageField) or isinstance(db_field, models.FileField):
             kwargs['widget'] = widgets.AdminFileWidget
Index: django/contrib/admin/widgets.py
===================================================================
--- django/contrib/admin/widgets.py	(revision 7266)
+++ django/contrib/admin/widgets.py	(working copy)
@@ -7,6 +7,7 @@
 from django.utils.text import capfirst, truncate_words
 from django.utils.translation import ugettext as _
 from django.utils.safestring import mark_safe
+from django.utils.encoding import force_unicode
 from django.conf import settings
 
 class FilteredSelectMultiple(forms.SelectMultiple):
@@ -46,7 +47,31 @@
 
     def __init__(self, attrs={}):
         super(AdminTimeWidget, self).__init__(attrs={'class': 'vTimeField', 'size': '8'})
+
+class AdminBooleanSelectRenderer(forms.widgets.RadioFieldRenderer):
+    def render(self):
+        """Outputs a <ul> for this set of radio fields."""
+        return mark_safe(u'<ul class="plainlist">\n%s\n</ul>' % u'\n'.join([u'<li>%s</li>'
+                % force_unicode(w) for w in self]))
+
+class AdminBooleanSelectWidget(forms.RadioSelect):
+    renderer = AdminBooleanSelectRenderer
     
+    def __init__(self, attrs=None):
+        choices = ((u'1', _('Yes')), (u'2', _('No')))
+        super(AdminBooleanSelectWidget, self).__init__(attrs, choices)
+
+    def render(self, name, value, attrs=None, choices=()):
+        try:
+            value = {True: u'1', False: u'2', u'1': u'1', u'2': u'2'}[value]
+        except KeyError:
+            value = u'2'
+        return super(AdminBooleanSelectWidget, self).render(name, value, attrs, choices)
+
+    def value_from_datadict(self, data, files, name):
+        value = data.get(name, None)
+        return {u'1': True, u'2': False, True: True, False: False}.get(value, None)
+    
 class AdminSplitDateTime(forms.SplitDateTimeWidget):
     """
     A SplitDateTime Widget that has some admin-specific styling.
Index: tests/regressiontests/admin_widgets/models.py
===================================================================
--- tests/regressiontests/admin_widgets/models.py	(revision 7266)
+++ tests/regressiontests/admin_widgets/models.py	(working copy)
@@ -28,6 +28,7 @@
 >>> from django.contrib.admin.widgets import FilteredSelectMultiple, AdminSplitDateTime
 >>> from django.contrib.admin.widgets import AdminFileWidget, ForeignKeyRawIdWidget, ManyToManyRawIdWidget
 >>> from django.contrib.admin.widgets import RelatedFieldWidgetWrapper
+>>> from django.contrib.admin.widgets import AdminBooleanSelectWidget
 
 Calling conditional_escape on the output of widget.render will simulate what
 happens in the template. This is easier than setting up a template and context
@@ -67,7 +68,139 @@
 >>> print conditional_escape(w.render('test', [m1.pk, m2.pk], attrs={}))
 <input type="text" name="test" value="1,2" class="vManyToManyRawIdAdminField" /><a href="../../../admin_widgets/member/" class="related-lookup" id="lookup_id_test" onclick="return showRelatedObjectLookupPopup(this);"> <img src="%(ADMIN_MEDIA_PREFIX)simg/admin/selector-search.gif" width="16" height="16" alt="Lookup"></a>
 
+The list should have a plainlist class, otherwise both radioselects would be rendered with square bullets in front of them in the Admin.
+
+>>> w = AdminBooleanSelectWidget()
+>>> print conditional_escape(w.render('test', False))
+<ul class="plainlist">
+<li><label><input type="radio" name="test" value="1" /> Yes</label></li>
+<li><label><input checked="checked" type="radio" name="test" value="2" /> No</label></li>
+</ul>
+
+>>> print conditional_escape(w.render('test', True))
+<ul class="plainlist">
+<li><label><input checked="checked" type="radio" name="test" value="1" /> Yes</label></li>
+<li><label><input type="radio" name="test" value="2" /> No</label></li>
+</ul>
 """ % {
     'ADMIN_MEDIA_PREFIX': settings.ADMIN_MEDIA_PREFIX,
     'MEDIA_URL': settings.MEDIA_URL,
-}}
+}, 'HOOK_TESTS': """
+>>> from django.db import models
+>>> from django.contrib.admin.options import BaseModelAdmin
+
+Make sure that the formfield_for_dbfield in the BaseModelAdmin hooks the right admin widgets to admin fields.
+
+>>> bma = BaseModelAdmin()
+
+Check widget for fields that are not hooked, should return normal widget
+
+>>> unhooked_fields = [
+...     models.AutoField(primary_key=True),
+...     models.CharField(),
+...     models.CommaSeparatedIntegerField(),
+...     models.DecimalField(),
+...     models.EmailField(),
+...     models.FilePathField(),
+...     models.FloatField(),
+...     models.IntegerField(),
+...     models.IPAddressField(),
+...     models.NullBooleanField(),
+...     models.PhoneNumberField(),
+...     models.PositiveIntegerField(),
+...     models.PositiveSmallIntegerField(),
+...     models.SlugField(),
+...     models.SmallIntegerField(),
+...     models.TextField(),
+...     models.TimeField(),
+...     models.URLField(),
+...     models.USStateField(),
+...     models.XMLField()
+... ]
+
+>>> for model_field in unhooked_fields:
+...     field = bma.formfield_for_dbfield(model_field)
+...     field
+<django.newforms.fields.CharField object at ...>
+<django.newforms.fields.CharField object at ...>
+<django.newforms.fields.DecimalField object at ...>
+<django.newforms.fields.EmailField object at ...>
+<django.newforms.fields.CharField object at ...>
+<django.newforms.fields.FloatField object at ...>
+<django.newforms.fields.IntegerField object at ...>
+<django.newforms.fields.IPAddressField object at ...>
+<django.newforms.fields.NullBooleanField object at ...>
+<django.contrib.localflavor.us.forms.USPhoneNumberField object at ...>
+<django.newforms.fields.IntegerField object at ...>
+<django.newforms.fields.IntegerField object at ...>
+<django.newforms.fields.CharField object at ...>
+<django.newforms.fields.IntegerField object at ...>
+<django.newforms.fields.CharField object at ...>
+<django.newforms.fields.TimeField object at ...>
+<django.newforms.fields.URLField object at ...>
+<django.newforms.fields.CharField object at ...>
+<django.newforms.fields.CharField object at ...>
+
+Check widget for fields that are hooked, should return special admin widgets.
+
+>>> field = bma.formfield_for_dbfield(models.DateTimeField())
+>>> field.widget
+<django.contrib.admin.widgets.AdminSplitDateTime object at ...>
+
+>>> field = bma.formfield_for_dbfield(models.DateField())
+>>> field.widget
+<django.contrib.admin.widgets.AdminDateWidget object at ...>
+
+>>> field = bma.formfield_for_dbfield(models.TimeField())
+>>> field.widget
+<django.contrib.admin.widgets.AdminTimeWidget object at ...>
+
+>>> field = bma.formfield_for_dbfield(models.BooleanField())
+>>> field.widget
+<django.contrib.admin.widgets.AdminBooleanSelectWidget object at ...>
+
+>>> field = bma.formfield_for_dbfield(models.ImageField())
+>>> field.widget
+<django.contrib.admin.widgets.AdminFileWidget object at ...>
+
+>>> field = bma.formfield_for_dbfield(models.FileField())
+>>> field.widget
+<django.contrib.admin.widgets.AdminFileWidget object at ...>
+
+Test ForeignKey and ManyToManyField widgets here, use the model defined
+above to retrieve the ForeignKey field, as to be able to traverse the relation.
+
+Make sure that ForeignKey field returns a raw id widget when the field is flagged as such. 
+
+>>> bma.raw_id_fields = ('band', )
+>>> field = bma.formfield_for_dbfield(Album._meta.get_field('band'))
+>>> field.widget
+<django.contrib.admin.widgets.ForeignKeyRawIdWidget object at ...>
+
+Check to see if normal widget is returned when no raw id is selected.
+
+>>> bma.raw_id_fields = ()
+>>> bma.admin_site = 'admin site'
+>>> field = bma.formfield_for_dbfield(Album._meta.get_field('band'))
+>>> field.widget
+<django.newforms.widgets.Select object at ...>
+
+Do the same for ManyToManyField.
+
+>>> bma.raw_id_fields = ('members',)
+>>> field = bma.formfield_for_dbfield(Band._meta.get_field('members'))
+>>> field.widget
+<django.contrib.admin.widgets.ManyToManyRawIdWidget object at ...>
+
+Check for no raw id in.
+
+>>> bma.raw_id_fields = ()
+>>> field = bma.formfield_for_dbfield(Band._meta.get_field('members'))
+>>> field.widget
+<django.newforms.widgets.SelectMultiple object at ...>
+
+>>> bma.filter_horizontal = ('members', )
+>>> field = bma.formfield_for_dbfield(Band._meta.get_field('members'))
+>>> field.widget
+<django.contrib.admin.widgets.FilteredSelectMultiple object at ...>
+"""}
\ No newline at end of file
Index: AUTHORS
===================================================================
--- AUTHORS	(revision 7266)
+++ AUTHORS	(working copy)
@@ -283,7 +283,7 @@
     Philippe Raoult <philippe.raoult@n2nsoft.com>
     Massimiliano Ravelli <massimiliano.ravelli@gmail.com>
     Brian Ray <http://brianray.chipy.org/>
-    remco@diji.biz
+    Remco Wendt <remco@diji.biz>
     David Reynolds <david@reynoldsfamily.org.uk>
     rhettg@gmail.com
     ricardojbarrios@gmail.com
