diff -Naur --exclude='*.pyc' django/contrib/admin/options.py /usr/lib/python2.4/site-packages/django/contrib/admin/options.py
--- django/contrib/admin/options.py	2008-09-02 10:26:24.000000000 -0700
+++ /usr/lib/python2.4/site-packages/django/contrib/admin/options.py	2008-11-04 20:06:36.000000000 -0800
@@ -279,7 +279,11 @@
     def get_formsets(self, request, obj=None):
         for inline in self.inline_instances:
             yield inline.get_formset(request, obj)
-            
+            for nested in inline.inline_instances:
+                yield nested.get_formset(request, obj)
+                for subnested in nested.inline_instances:
+                    yield subnested.get_formset(request, obj)
+
     def log_addition(self, request, object):
         """
         Log that an object has been successfully added. 
@@ -603,12 +607,24 @@
         adminForm = helpers.AdminForm(form, self.get_fieldsets(request, obj), self.prepopulated_fields)
         media = self.media + adminForm.media
 
+        nested_inlines = []
+        subnested_inlines = []
+        for inline in self.inline_instances:
+            for nested in inline.inline_instances:
+                nested_inlines.append(nested)
+                for subnested in nested.inline_instances:
+                    subnested_inlines.append(subnested)
+        all_inlines = self.inline_instances + nested_inlines + subnested_inlines
+
         inline_admin_formsets = []
-        for inline, formset in zip(self.inline_instances, formsets):
-            fieldsets = list(inline.get_fieldsets(request, obj))
-            inline_admin_formset = helpers.InlineAdminFormSet(inline, formset, fieldsets)
-            inline_admin_formsets.append(inline_admin_formset)
-            media = media + inline_admin_formset.media
+        for formset in formsets:
+            for inline in all_inlines:
+                if inline.model == formset.model:
+                    fieldsets = list(inline.get_fieldsets(request, obj))
+                    inline_admin_formset = helpers.InlineAdminFormSet(inline, formset, fieldsets)
+                    inline_admin_formsets.append(inline_admin_formset)
+                    media = media + inline_admin_formset.media
+                    break
 
         context = {
             'title': _('Change %s') % force_unicode(opts.verbose_name),
@@ -759,6 +775,7 @@
     template = None
     verbose_name = None
     verbose_name_plural = None
+    inlines = []
 
     def __init__(self, parent_model, admin_site):
         self.admin_site = admin_site
@@ -769,7 +786,11 @@
             self.verbose_name = self.model._meta.verbose_name
         if self.verbose_name_plural is None:
             self.verbose_name_plural = self.model._meta.verbose_name_plural
-    
+        self.inline_instances = []
+        for inline_class in self.inlines:
+            inline_instance = inline_class(self.model, self.admin_site)
+            self.inline_instances.append(inline_instance)
+
     def _media(self):
         from django.conf import settings
         js = []
diff -Naur --exclude='*.pyc' django/contrib/admin/validation.py /usr/lib/python2.4/site-packages/django/contrib/admin/validation.py
--- django/contrib/admin/validation.py	2008-08-28 08:43:04.000000000 -0700
+++ /usr/lib/python2.4/site-packages/django/contrib/admin/validation.py	2008-11-04 19:58:29.000000000 -0800
@@ -137,6 +137,26 @@
         raise ImproperlyConfigured("'%s.formset' does not inherit from "
                 "BaseModelFormSet." % cls.__name__)
 
+    # nested inlines = []
+    if hasattr(cls, 'inlines'):
+        check_isseq(cls, 'inlines', cls.inlines)
+        for idx, inline in enumerate(cls.inlines):
+            if not issubclass(inline, BaseModelAdmin):
+                raise ImproperlyConfigured("'%s.inlines[%d]' does not inherit "
+                        "from BaseModelAdmin." % (cls.__name__, idx))
+            if not inline.model:
+                raise ImproperlyConfigured("'model' is a required attribute "
+                        "of '%s.inlines[%d]'." % (cls.__name__, idx))
+            if not issubclass(inline.model, models.Model):
+                raise ImproperlyConfigured("'%s.inlines[%d].model' does not "
+                        "inherit from models.Model." % (cls.__name__, idx))
+            validate_base(inline, inline.model)
+            validate_inline(inline)
+
+
+
+
+
 def validate_base(cls, model):
     opts = model._meta
 
