diff --git a/django/contrib/admin/options.py b/django/contrib/admin/options.py
index 12490c8..9b00fcd 100644
--- a/django/contrib/admin/options.py
+++ b/django/contrib/admin/options.py
@@ -420,6 +420,33 @@ 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 = {}
+
+        inline_admin_formsets = []
+
+        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))
+
+            fieldsets = list(inline.get_fieldsets(request))
+            readonly = list(inline.get_readonly_fields(request))
+            inline_admin_formset = helpers.InlineAdminFormSet(inline, formset,
+                fieldsets, readonly, model_admin=self)
+            inline_admin_formsets.append(inline_admin_formset)
+
+        return inline_admin_formsets
+
     def log_addition(self, request, object):
         """
         Log that an object has been successfully added.
@@ -776,6 +803,7 @@ class ModelAdmin(BaseModelAdmin):
             raise PermissionDenied
 
         ModelForm = self.get_form(request)
+        inline_admin_formsets = []
         formsets = []
         if request.method == 'POST':
             form = ModelForm(request.POST, request.FILES)
@@ -785,17 +813,9 @@ 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)
+            inline_admin_formsets = self.get_formset_instances(request, new_object, False)
+            formsets = map(lambda x: x.formset, inline_admin_formsets)
+
             if all_valid(formsets) and form_validated:
                 self.save_model(request, new_object, form, change=False)
                 form.save_m2m()
@@ -816,29 +836,15 @@ 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)
+            inline_admin_formsets = self.get_formset_instances(request, self.model(), False)
+            formsets = map(lambda x: x.formset, inline_admin_formsets)
 
         adminForm = helpers.AdminForm(form, list(self.get_fieldsets(request)),
             self.prepopulated_fields, self.get_readonly_fields(request),
             model_admin=self)
         media = self.media + adminForm.media
 
-        inline_admin_formsets = []
-        for inline, formset in zip(self.inline_instances, formsets):
-            fieldsets = list(inline.get_fieldsets(request))
-            readonly = list(inline.get_readonly_fields(request))
-            inline_admin_formset = helpers.InlineAdminFormSet(inline, formset,
-                fieldsets, readonly, model_admin=self)
-            inline_admin_formsets.append(inline_admin_formset)
+        for inline_admin_formset in inline_admin_formsets:
             media = media + inline_admin_formset.media
 
         context = {
@@ -874,6 +880,7 @@ class ModelAdmin(BaseModelAdmin):
             return self.add_view(request, form_url='../add/')
 
         ModelForm = self.get_form(request, obj)
+        inline_admin_formsets = []
         formsets = []
         if request.method == 'POST':
             form = ModelForm(request.POST, request.FILES, instance=obj)
@@ -883,18 +890,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)
+            inline_admin_formsets = self.get_formset_instances(request, new_object, True)
+            formsets = map(lambda x: x.formset, inline_admin_formsets)
 
             if all_valid(formsets) and form_validated:
                 self.save_model(request, new_object, form, change=True)
@@ -908,28 +905,15 @@ 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)
+            inline_admin_formsets = self.get_formset_instances(request, obj, True)
+            formsets = map(lambda x: x.formset, inline_admin_formsets)
 
         adminForm = helpers.AdminForm(form, self.get_fieldsets(request, obj),
             self.prepopulated_fields, self.get_readonly_fields(request, obj),
             model_admin=self)
         media = self.media + adminForm.media
 
-        inline_admin_formsets = []
-        for inline, formset in zip(self.inline_instances, formsets):
-            fieldsets = list(inline.get_fieldsets(request, obj))
-            readonly = list(inline.get_readonly_fields(request, obj))
-            inline_admin_formset = helpers.InlineAdminFormSet(inline, formset,
-                fieldsets, readonly, model_admin=self)
-            inline_admin_formsets.append(inline_admin_formset)
+        for inline_admin_formset in inline_admin_formsets:
             media = media + inline_admin_formset.media
 
         context = {
diff --git a/docs/ref/contrib/admin/index.txt b/docs/ref/contrib/admin/index.txt
index 0550576..009b016 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
+for the requested page.
+
+
 Other methods
 ~~~~~~~~~~~~~
 
