diff --git a/django/contrib/admin/options.py b/django/contrib/admin/options.py
index 12490c8..4188a95 100644
--- a/django/contrib/admin/options.py
+++ b/django/contrib/admin/options.py
@@ -420,6 +420,31 @@ class ModelAdmin(BaseModelAdmin):
         for inline in self.inline_instances:
             yield inline.get_formset(request, obj)
 
+    def get_formset_instances(self, request, obj, change=True):
+        prefixes = {}
+
+        formsets = []
+        inlines = []
+
+        for FormSet, inline in zip(self.get_formsets(request), self.inline_instances):
+            prefix = FormSet.get_default_prefix()
+            prefixes[prefix] = prefixes.get(prefix, 0) + 1
+            if prefixes[prefix] != 1:
+                prefix = "%s-%s" % (prefix, prefixes[prefix])
+            if request.method == 'POST':
+                formset = FormSet(data=request.POST, files=request.FILES,
+                                  instance=obj,
+                                  save_as_new=request.POST.has_key("_saveasnew"),
+                                  prefix=prefix, queryset=inline.queryset(request))
+            else:
+                formset = FormSet(instance=obj, prefix=prefix,
+                                  queryset=inline.queryset(request))
+
+            formsets.append(formset)
+            inlines.append(inline)
+
+        return formsets, inlines
+
     def log_addition(self, request, object):
         """
         Log that an object has been successfully added.
@@ -777,6 +802,7 @@ class ModelAdmin(BaseModelAdmin):
 
         ModelForm = self.get_form(request)
         formsets = []
+        inlines = []
         if request.method == 'POST':
             form = ModelForm(request.POST, request.FILES)
             if form.is_valid():
@@ -785,17 +811,10 @@ class ModelAdmin(BaseModelAdmin):
             else:
                 form_validated = False
                 new_object = self.model()
-            prefixes = {}
-            for FormSet, inline in zip(self.get_formsets(request), self.inline_instances):
-                prefix = FormSet.get_default_prefix()
-                prefixes[prefix] = prefixes.get(prefix, 0) + 1
-                if prefixes[prefix] != 1:
-                    prefix = "%s-%s" % (prefix, prefixes[prefix])
-                formset = FormSet(data=request.POST, files=request.FILES,
-                                  instance=new_object,
-                                  save_as_new=request.POST.has_key("_saveasnew"),
-                                  prefix=prefix, queryset=inline.queryset(request))
-                formsets.append(formset)
+
+            formsets, inlines = self.get_formset_instances(request, new_object,
+                                                           False)
+
             if all_valid(formsets) and form_validated:
                 self.save_model(request, new_object, form, change=False)
                 form.save_m2m()
@@ -816,16 +835,8 @@ class ModelAdmin(BaseModelAdmin):
                 if isinstance(f, models.ManyToManyField):
                     initial[k] = initial[k].split(",")
             form = ModelForm(initial=initial)
-            prefixes = {}
-            for FormSet, inline in zip(self.get_formsets(request),
-                                       self.inline_instances):
-                prefix = FormSet.get_default_prefix()
-                prefixes[prefix] = prefixes.get(prefix, 0) + 1
-                if prefixes[prefix] != 1:
-                    prefix = "%s-%s" % (prefix, prefixes[prefix])
-                formset = FormSet(instance=self.model(), prefix=prefix,
-                                  queryset=inline.queryset(request))
-                formsets.append(formset)
+            formsets, inlines = self.get_formset_instances(request, self.model(),
+                                                           False)
 
         adminForm = helpers.AdminForm(form, list(self.get_fieldsets(request)),
             self.prepopulated_fields, self.get_readonly_fields(request),
@@ -833,7 +844,7 @@ class ModelAdmin(BaseModelAdmin):
         media = self.media + adminForm.media
 
         inline_admin_formsets = []
-        for inline, formset in zip(self.inline_instances, formsets):
+        for formset, inline in zip(formsets, inlines):
             fieldsets = list(inline.get_fieldsets(request))
             readonly = list(inline.get_readonly_fields(request))
             inline_admin_formset = helpers.InlineAdminFormSet(inline, formset,
@@ -841,6 +852,7 @@ class ModelAdmin(BaseModelAdmin):
             inline_admin_formsets.append(inline_admin_formset)
             media = media + inline_admin_formset.media
 
+
         context = {
             'title': _('Add %s') % force_unicode(opts.verbose_name),
             'adminform': adminForm,
@@ -875,6 +887,7 @@ class ModelAdmin(BaseModelAdmin):
 
         ModelForm = self.get_form(request, obj)
         formsets = []
+        inlines = []
         if request.method == 'POST':
             form = ModelForm(request.POST, request.FILES, instance=obj)
             if form.is_valid():
@@ -883,18 +896,8 @@ class ModelAdmin(BaseModelAdmin):
             else:
                 form_validated = False
                 new_object = obj
-            prefixes = {}
-            for FormSet, inline in zip(self.get_formsets(request, new_object),
-                                       self.inline_instances):
-                prefix = FormSet.get_default_prefix()
-                prefixes[prefix] = prefixes.get(prefix, 0) + 1
-                if prefixes[prefix] != 1:
-                    prefix = "%s-%s" % (prefix, prefixes[prefix])
-                formset = FormSet(request.POST, request.FILES,
-                                  instance=new_object, prefix=prefix,
-                                  queryset=inline.queryset(request))
-
-                formsets.append(formset)
+            formsets, inlines = self.get_formset_instances(request, new_object,
+                                                           True)
 
             if all_valid(formsets) and form_validated:
                 self.save_model(request, new_object, form, change=True)
@@ -908,15 +911,7 @@ class ModelAdmin(BaseModelAdmin):
 
         else:
             form = ModelForm(instance=obj)
-            prefixes = {}
-            for FormSet, inline in zip(self.get_formsets(request, obj), self.inline_instances):
-                prefix = FormSet.get_default_prefix()
-                prefixes[prefix] = prefixes.get(prefix, 0) + 1
-                if prefixes[prefix] != 1:
-                    prefix = "%s-%s" % (prefix, prefixes[prefix])
-                formset = FormSet(instance=obj, prefix=prefix,
-                                  queryset=inline.queryset(request))
-                formsets.append(formset)
+            formsets, inlines = self.get_formset_instances(request, obj, True)
 
         adminForm = helpers.AdminForm(form, self.get_fieldsets(request, obj),
             self.prepopulated_fields, self.get_readonly_fields(request, obj),
@@ -924,7 +919,7 @@ class ModelAdmin(BaseModelAdmin):
         media = self.media + adminForm.media
 
         inline_admin_formsets = []
-        for inline, formset in zip(self.inline_instances, formsets):
+        for formset, inline in zip(formsets, inlines):
             fieldsets = list(inline.get_fieldsets(request, obj))
             readonly = list(inline.get_readonly_fields(request, obj))
             inline_admin_formset = helpers.InlineAdminFormSet(inline, formset,
diff --git a/docs/ref/contrib/admin/index.txt b/docs/ref/contrib/admin/index.txt
index 0550576..6dfeada 100644
--- a/docs/ref/contrib/admin/index.txt
+++ b/docs/ref/contrib/admin/index.txt
@@ -900,6 +900,22 @@ to show objects owned by the logged-in user::
                 return qs
             return qs.filter(author=request.user)
 
+.. method:: ModelAdmin.get_formsets(self, request, obj=None)
+
+The ``get_formsets`` method on ``ModelAdmin`` returns the formsets for the 
+registered inline classes.
+
+.. warning::
+
+    Don't change the order of the formsets or skip some of them. Use 
+    ``get_formsets_instances`` if you have to do something like that.
+
+.. method:: ModelAdmin.get_formset_instances(self, request, obj, change=True)
+
+The ``get_formset_instances`` method on ``ModelAdmin`` returns the formsets
+and inlines for the requested page.
+
+
 Other methods
 ~~~~~~~~~~~~~
 
