Index: django/newforms/formsets.py
===================================================================
--- django/newforms/formsets.py	(revision 7028)
+++ django/newforms/formsets.py	(working copy)
@@ -7,6 +7,7 @@
 
 # special field names
 FORM_COUNT_FIELD_NAME = 'COUNT'
+REQUIRED_FORMS_COUNT_FIELD_NAME = 'REQUIRED'
 ORDERING_FIELD_NAME = 'ORDER'
 DELETION_FIELD_NAME = 'DELETE'
 
@@ -17,6 +18,7 @@
     increment the count field of this form as well.
     """
     def __init__(self, *args, **kwargs):
+        self.base_fields[REQUIRED_FORMS_COUNT_FIELD_NAME] = IntegerField(widget=HiddenInput)
         self.base_fields[FORM_COUNT_FIELD_NAME] = IntegerField(widget=HiddenInput)
         super(ManagementForm, self).__init__(*args, **kwargs)
 
@@ -37,8 +39,8 @@
             self.management_form = ManagementForm(data, files, auto_id=self.auto_id, prefix=self.prefix)
             if self.management_form.is_valid():
                 self.total_forms = self.management_form.cleaned_data[FORM_COUNT_FIELD_NAME]
-                self.required_forms = self.total_forms - self.num_extra
-                self.change_form_count = self.total_forms - self.num_extra
+                self.required_forms = self.management_form.cleaned_data[REQUIRED_FORMS_COUNT_FIELD_NAME]
+                self.change_form_count = self.required_forms
             else:
                 # not sure that ValidationError is the best thing to raise here
                 raise ValidationError('ManagementForm data is missing or has been tampered with')
@@ -46,12 +48,20 @@
             self.change_form_count = len(initial)
             self.required_forms = len(initial)
             self.total_forms = self.required_forms + self.num_extra
-            self.management_form = ManagementForm(initial={FORM_COUNT_FIELD_NAME: self.total_forms}, auto_id=self.auto_id, prefix=self.prefix)
+            initial = {
+                    FORM_COUNT_FIELD_NAME: self.total_forms,
+                    REQUIRED_FORMS_COUNT_FIELD_NAME: self.required_forms,
+            }
+            self.management_form = ManagementForm(initial=initial, auto_id=self.auto_id, prefix=self.prefix)
         else:
             self.change_form_count = 0
             self.required_forms = 0
             self.total_forms = self.num_extra
-            self.management_form = ManagementForm(initial={FORM_COUNT_FIELD_NAME: self.total_forms}, auto_id=self.auto_id, prefix=self.prefix)
+            initial = {
+                    FORM_COUNT_FIELD_NAME: self.total_forms,
+                    REQUIRED_FORMS_COUNT_FIELD_NAME: self.required_forms,
+            }
+            self.management_form = ManagementForm(initial=initial, auto_id=self.auto_id, prefix=self.prefix)
 
     def _get_add_forms(self):
         """Return a list of all the add forms in this ``FormSet``."""
Index: tests/modeltests/model_formsets/models.py
===================================================================
--- tests/modeltests/model_formsets/models.py	(revision 7028)
+++ tests/modeltests/model_formsets/models.py	(working copy)
@@ -30,6 +30,7 @@
 
 >>> data = {
 ...     'form-COUNT': '3',
+...     'form-REQUIRED': '0', # number of forms filled before
 ...     'form-0-name': 'Charles Baudelaire',
 ...     'form-1-name': 'Arthur Rimbaud',
 ...     'form-2-name': '',
@@ -66,6 +67,7 @@
 
 >>> data = {
 ...     'form-COUNT': '3',
+...     'form-REQUIRED': '2', # number of forms filled before
 ...     'form-0-id': '2',
 ...     'form-0-name': 'Arthur Rimbaud',
 ...     'form-1-id': '1',
@@ -107,6 +109,7 @@
 
 >>> data = {
 ...     'form-COUNT': '4',
+...     'form-REQUIRED': '3', # number of forms filled before
 ...     'form-0-id': '2',
 ...     'form-0-name': 'Arthur Rimbaud',
 ...     'form-1-id': '1',
@@ -148,6 +151,7 @@
 
 >>> data = {
 ...     'book_set-COUNT': '3',
+...     'book_set-REQUIRED': '0', # number of forms filled before
 ...     'book_set-0-title': 'Les Fleurs du Mal',
 ...     'book_set-1-title': '',
 ...     'book_set-2-title': '',
@@ -181,6 +185,7 @@
 
 >>> data = {
 ...     'book_set-COUNT': '3',
+...     'book_set-REQUIRED': '1', # number of forms filled before
 ...     'book_set-0-id': '1',
 ...     'book_set-0-title': 'Les Fleurs du Mal',
 ...     'book_set-1-title': 'Le Spleen de Paris',
Index: tests/regressiontests/forms/formsets.py
===================================================================
--- tests/regressiontests/forms/formsets.py	(revision 7028)
+++ tests/regressiontests/forms/formsets.py	(working copy)
@@ -33,6 +33,7 @@
 
 >>> data = {
 ...     'choices-COUNT': '1', # the number of forms rendered
+...     'choices-REQUIRED': '0', # number of forms filled before
 ...     'choices-0-choice': 'Calexico',
 ...     'choices-0-votes': '100',
 ... }
@@ -58,6 +59,8 @@
 
 >>> data = {
 ...     'choices-COUNT': '1', # the number of forms rendered
+...     'choices-REQUIRED': '1', # number of forms filled before
+...     'choices-REQUIRED': '0', # number of forms filled before
 ...     'choices-0-choice': 'Calexico',
 ...     'choices-0-votes': '',
 ... }
@@ -94,6 +97,7 @@
 
 >>> data = {
 ...     'choices-COUNT': '2', # the number of forms rendered
+...     'choices-REQUIRED': '1', # number of forms filled before
 ...     'choices-0-choice': 'Calexico',
 ...     'choices-0-votes': '100',
 ...     'choices-1-choice': '',
@@ -114,6 +118,7 @@
 
 >>> data = {
 ...     'choices-COUNT': '2', # the number of forms rendered
+...     'choices-REQUIRED': '1', # number of forms filled before
 ...     'choices-0-choice': 'Calexico',
 ...     'choices-0-votes': '100',
 ...     'choices-1-choice': 'The Decemberists',
@@ -133,6 +138,7 @@
 
 >>> data = {
 ...     'choices-COUNT': '2', # the number of forms rendered
+...     'choices-REQUIRED': '1', # number of forms filled before
 ...     'choices-0-choice': '', # deleted value
 ...     'choices-0-votes': '', # deleted value
 ...     'choices-1-choice': '',
@@ -169,6 +175,7 @@
 
 >>> data = {
 ...     'choices-COUNT': '3', # the number of forms rendered
+...     'choices-REQUIRED': '0', # number of forms filled before
 ...     'choices-0-choice': '',
 ...     'choices-0-votes': '',
 ...     'choices-1-choice': '',
@@ -188,6 +195,7 @@
 
 >>> data = {
 ...     'choices-COUNT': '3', # the number of forms rendered
+...     'choices-REQUIRED': '0', # number of forms filled before
 ...     'choices-0-choice': 'Calexico',
 ...     'choices-0-votes': '100',
 ...     'choices-1-choice': '',
@@ -207,6 +215,7 @@
 
 >>> data = {
 ...     'choices-COUNT': '3', # the number of forms rendered
+...     'choices-REQUIRED': '0', # number of forms filled before
 ...     'choices-0-choice': 'Calexico',
 ...     'choices-0-votes': '100',
 ...     'choices-1-choice': 'The Decemberists',
@@ -244,6 +253,7 @@
 
 >>> data = {
 ...     'choices-COUNT': '3', # the number of forms rendered
+...     'choices-REQUIRED': '1', # number of forms filled before
 ...     'choices-0-choice': 'Calexico',
 ...     'choices-0-votes': '100',
 ...     'choices-1-choice': '',
@@ -289,6 +299,7 @@
 
 >>> data = {
 ...     'choices-COUNT': '3', # the number of forms rendered
+...     'choices-REQUIRED': '2', # number of forms filled before
 ...     'choices-0-choice': 'Calexico',
 ...     'choices-0-votes': '100',
 ...     'choices-0-DELETE': '',
@@ -336,6 +347,7 @@
 
 >>> data = {
 ...     'choices-COUNT': '3', # the number of forms rendered
+...     'choices-REQUIRED': '2', # number of forms filled before
 ...     'choices-0-choice': 'Calexico',
 ...     'choices-0-votes': '100',
 ...     'choices-0-ORDER': '1',
@@ -391,6 +403,7 @@
 
 >>> data = {
 ...     'choices-COUNT': '4', # the number of forms rendered
+...     'choices-REQUIRED': '3', # number of forms filled before
 ...     'choices-0-choice': 'Calexico',
 ...     'choices-0-votes': '100',
 ...     'choices-0-ORDER': '1',
@@ -451,6 +464,7 @@
 
 >>> data = {
 ...     'drinks-COUNT': '2',
+...     'drinks-REQUIRED': '0', # number of forms filled before
 ...     'drinks-0-name': 'Gin and Tonic',
 ...     'drinks-1-name': 'Gin and Tonic',
 ... }
@@ -471,6 +485,7 @@
 
 >>> data = {
 ...     'drinks-COUNT': '2',
+...     'drinks-REQUIRED': '0', # number of forms filled before
 ...     'drinks-0-name': 'Gin and Tonic',
 ...     'drinks-1-name': 'Bloody Mary',
 ... }
