Index: django/forms/models.py
===================================================================
--- django/forms/models.py	(revision 14565)
+++ django/forms/models.py	(working copy)
@@ -1034,7 +1034,7 @@
         if self.required and not value:
             raise ValidationError(self.error_messages['required'])
         elif not self.required and not value:
-            return []
+            return self.queryset.none()
         if not isinstance(value, (list, tuple)):
             raise ValidationError(self.error_messages['list'])
         for pk in value:
Index: tests/regressiontests/forms/models.py
===================================================================
--- tests/regressiontests/forms/models.py	(revision 14565)
+++ tests/regressiontests/forms/models.py	(working copy)
@@ -4,6 +4,7 @@
 import tempfile
 
 from django.db import models
+from django.db.models.query import QuerySet
 # Can't import as "forms" due to implementation details in the test suite (the
 # current file is called "forms" and is already imported).
 from django import forms as django_forms
@@ -55,6 +56,8 @@
                                           default=lambda: ChoiceOptionModel.objects.filter(name='default'))
     multi_choice_int = models.ManyToManyField(ChoiceOptionModel, blank=False, related_name='multi_choice_int',
                                               default=lambda: [1])
+    multi_choice_optional = models.ManyToManyField(ChoiceOptionModel, blank=True, null=True,
+                                                   related_name='multi_choice_optional')
 
 class ChoiceFieldForm(django_forms.ModelForm):
     class Meta:
@@ -85,6 +88,16 @@
         self.assertNumQueries(1, test)
 
 class ModelFormCallableModelDefault(TestCase):
+    def test_empty_queryset_return(self):
+        "If a model's ManyToManyField has blank=True and is saved with no data, a queryset is returned."
+        option = ChoiceOptionModel.objects.create(id=1, name='default')
+        form = ChoiceFieldForm({'multi_choice_optional': '', 'choice': option.id, 'choice_int': 1,
+                              'multi_choice': ['1'], 'multi_choice_int': [1]})
+        self.assertEqual(form.is_valid(), True)
+        self.assertEqual(isinstance(form.cleaned_data['multi_choice_optional'], QuerySet), True)
+        # While we're at it, test whether a QuerySet is returned if there *is* a value.
+        self.assertEqual(isinstance(form.cleaned_data['multi_choice'], QuerySet), True)
+
     def test_no_empty_option(self):
         "If a model's ForeignKey has blank=False and a default, no empty option is created (Refs #10792)."
         option = ChoiceOptionModel.objects.create(name='default')
@@ -117,7 +130,12 @@
 <option value="1" selected="selected">ChoiceOption 1</option>
 <option value="2">ChoiceOption 2</option>
 <option value="3">ChoiceOption 3</option>
-</select><input type="hidden" name="initial-multi_choice_int" value="1" id="initial-id_multi_choice_int_0" /> <span class="helptext"> Hold down "Control", or "Command" on a Mac, to select more than one.</span></p>""")
+</select><input type="hidden" name="initial-multi_choice_int" value="1" id="initial-id_multi_choice_int_0" /> <span class="helptext"> Hold down "Control", or "Command" on a Mac, to select more than one.</span></p>
+<p><label for="id_multi_choice_optional">Multi choice optional:</label> <select multiple="multiple" name="multi_choice_optional" id="id_multi_choice_optional">
+<option value="1">ChoiceOption 1</option>
+<option value="2">ChoiceOption 2</option>
+<option value="3">ChoiceOption 3</option>
+</select> <span class="helptext"> Hold down "Control", or "Command" on a Mac, to select more than one.</span></p>""")
 
     def test_initial_instance_value(self):
         "Initial instances for model fields may also be instances (refs #7287)"
@@ -150,7 +168,12 @@
 <option value="2" selected="selected">ChoiceOption 2</option>
 <option value="3" selected="selected">ChoiceOption 3</option>
 </select><input type="hidden" name="initial-multi_choice_int" value="2" id="initial-id_multi_choice_int_0" />
-<input type="hidden" name="initial-multi_choice_int" value="3" id="initial-id_multi_choice_int_1" /> <span class="helptext"> Hold down "Control", or "Command" on a Mac, to select more than one.</span></p>""")
+<input type="hidden" name="initial-multi_choice_int" value="3" id="initial-id_multi_choice_int_1" /> <span class="helptext"> Hold down "Control", or "Command" on a Mac, to select more than one.</span></p>
+<p><label for="id_multi_choice_optional">Multi choice optional:</label> <select multiple="multiple" name="multi_choice_optional" id="id_multi_choice_optional">
+<option value="1">ChoiceOption 1</option>
+<option value="2">ChoiceOption 2</option>
+<option value="3">ChoiceOption 3</option>
+</select> <span class="helptext"> Hold down "Control", or "Command" on a Mac, to select more than one.</span></p>""")
 
 
 __test__ = {'API_TESTS': """
