diff --git a/django/contrib/flatpages/models.py b/django/contrib/flatpages/models.py
index 42ec155..18ce335 100644
--- a/django/contrib/flatpages/models.py
+++ b/django/contrib/flatpages/models.py
@@ -9,10 +9,12 @@ class FlatPage(models.Model):
     url = models.CharField(_('URL'), max_length=100, db_index=True)
     title = models.CharField(_('title'), max_length=200)
     content = models.TextField(_('content'), blank=True)
-    enable_comments = models.BooleanField(_('enable comments'))
+    enable_comments = models.BooleanField(_('enable comments'), default=False)
     template_name = models.CharField(_('template name'), max_length=70, blank=True,
         help_text=_("Example: 'flatpages/contact_page.html'. If this isn't provided, the system will use 'flatpages/default.html'."))
-    registration_required = models.BooleanField(_('registration required'), help_text=_("If this is checked, only logged-in users will be able to view the page."))
+    registration_required = models.BooleanField(_('registration required'),
+        help_text=_("If this is checked, only logged-in users will be able to view the page."),
+        default=False)
     sites = models.ManyToManyField(Site)
 
     class Meta:
diff --git a/django/db/models/fields/__init__.py b/django/db/models/fields/__init__.py
index 9db76a6..99bf2fe 100644
--- a/django/db/models/fields/__init__.py
+++ b/django/db/models/fields/__init__.py
@@ -568,8 +568,6 @@ class BooleanField(Field):
 
     def __init__(self, *args, **kwargs):
         kwargs['blank'] = True
-        if 'default' not in kwargs and not kwargs.get('null'):
-            kwargs['default'] = False
         Field.__init__(self, *args, **kwargs)
 
     def get_internal_type(self):
diff --git a/docs/ref/models/fields.txt b/docs/ref/models/fields.txt
index 23dcf4b..6d411d3 100644
--- a/docs/ref/models/fields.txt
+++ b/docs/ref/models/fields.txt
@@ -351,6 +351,11 @@ The admin represents this as a checkbox.
 If you need to accept :attr:`~Field.null` values then use
 :class:`NullBooleanField` instead.
 
+.. versionchanged:: 1.5
+    In previous versions of Django ``BooleanFields`` would have an implicit
+    default value of ``False``. Now it defaults to ``None`` if there is
+    no default specified.
+
 ``CharField``
 -------------
 
diff --git a/docs/releases/1.5.txt b/docs/releases/1.5.txt
index 33f5003..7062240 100644
--- a/docs/releases/1.5.txt
+++ b/docs/releases/1.5.txt
@@ -160,3 +160,10 @@ our own copy of ``simplejson``. You can safely change any use of
 
 The :func:`~django.utils.itercompat.product` function has been deprecated. Use
 the built-in :func:`itertools.product` instead.
+
+
+``BooleanField`` set to None when default value not specified
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+In previous versions of Django, a model's ``BooleanField`` would get ``False``
+value when no default was provided. Now ``None`` value is used.
diff --git a/tests/regressiontests/model_fields/tests.py b/tests/regressiontests/model_fields/tests.py
index 5d3d42e..a270235 100644
--- a/tests/regressiontests/model_fields/tests.py
+++ b/tests/regressiontests/model_fields/tests.py
@@ -211,6 +211,13 @@ class BooleanFieldTests(unittest.TestCase):
             select={'string_col': 'string'})[0]
         self.assertFalse(isinstance(b5.pk, bool))
 
+    def test_null_default(self):
+        # http://code.djangoproject.com/ticket/15124
+        from django.db import IntegrityError
+        b = BooleanModel()
+        self.assertEqual(b.bfield, None)
+        self.assertRaises(IntegrityError, b.save)
+
 class ChoicesTests(test.TestCase):
     def test_choices_and_field_display(self):
         """
diff --git a/tests/regressiontests/model_inheritance_regress/tests.py b/tests/regressiontests/model_inheritance_regress/tests.py
index 6855d70..80ffec9 100644
--- a/tests/regressiontests/model_inheritance_regress/tests.py
+++ b/tests/regressiontests/model_inheritance_regress/tests.py
@@ -180,11 +180,11 @@ class ModelInheritanceTest(TestCase):
         """
         Regression test for #6755
         """
-        r = Restaurant(serves_pizza=False)
+        r = Restaurant(serves_pizza=False, serves_hot_dogs=False)
         r.save()
         self.assertEqual(r.id, r.place_ptr_id)
         orig_id = r.id
-        r = Restaurant(place_ptr_id=orig_id, serves_pizza=True)
+        r = Restaurant(place_ptr_id=orig_id, serves_pizza=True, serves_hot_dogs=False)
         r.save()
         self.assertEqual(r.id, orig_id)
         self.assertEqual(r.id, r.place_ptr_id)
