Index: django/forms/models.py
===================================================================
--- django/forms/models.py	(revision 14864)
+++ django/forms/models.py	(working copy)
@@ -1032,7 +1032,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/tests/models.py
===================================================================
--- tests/regressiontests/forms/tests/models.py	(revision 14864)
+++ tests/regressiontests/forms/tests/models.py	(working copy)
@@ -1,6 +1,7 @@
 # -*- coding: utf-8 -*-
 import datetime
 from django.core.files.uploadedfile import SimpleUploadedFile
+from django.db.models.query import QuerySet
 from django.forms import Form, ModelForm, FileField, ModelChoiceField
 from django.test import TestCase
 from regressiontests.forms.models import ChoiceModel, ChoiceOptionModel, ChoiceFieldModel, FileModel, Group, BoundaryModel, Defaults
@@ -28,6 +29,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')
@@ -60,7 +71,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)"
@@ -93,7 +109,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>""")
 
 
 
Index: tests/regressiontests/forms/models.py
===================================================================
--- tests/regressiontests/forms/models.py	(revision 14864)
+++ tests/regressiontests/forms/models.py	(working copy)
@@ -57,6 +57,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 FileModel(models.Model):
Index: docs/ref/forms/fields.txt
===================================================================
--- docs/ref/forms/fields.txt	(revision 14864)
+++ docs/ref/forms/fields.txt	(working copy)
@@ -929,8 +929,8 @@
 .. class:: ModelMultipleChoiceField(**kwargs)
 
     * Default widget: ``SelectMultiple``
-    * Empty value: ``[]`` (an empty list)
-    * Normalizes to: A list of model instances.
+    * Empty value: An empty ``QuerySet`` (self.queryset.none())
+    * Normalizes to: A ``QuerySet`` of model instances.
     * Validates that every id in the given list of values exists in the
       queryset.
     * Error message keys: ``required``, ``list``, ``invalid_choice``,
