Index: django/contrib/admin/options.py
===================================================================
--- django/contrib/admin/options.py	(revision 5519)
+++ django/contrib/admin/options.py	(working copy)
@@ -611,7 +612,15 @@
     def get_inline_formsets(self):
         inline_formset_classes = []
         for opts in self.inlines:
-            inline = inline_formset(self.model, opts.model, formfield_callback=opts.formfield_for_dbfield, fields=opts.fields, extra=opts.extra)
+            inline = inline_formset(
+                        self.model,
+                        opts.model,
+                        formfield_callback=opts.formfield_for_dbfield,
+                        fields=opts.fields,
+                        extra=opts.extra,
+                        fk_name=opts.name,
+                        formset=opts.formset
+                    )
             inline_formset_classes.append(inline)
         return inline_formset_classes
 
-    def __init__(self, model, name=None, extra=3, fields=None, template=None, raw_id_fields=None):
+    def __init__(self, model, name=None, extra=3, fields=None, template=None, raw_id_fields=None, formset=None):
         self.model = model
         self.opts = model._meta
         self.name = name
@@ -634,6 +645,7 @@
         self.verbose_name_plural = model._meta.verbose_name_plural
         self.prepopulated_fields = {}
         self.raw_id_fields = raw_id_fields or ()
+        self.formset = formset
 
 class StackedInline(InlineModelAdmin):
     default_template = 'admin/edit_inline_stacked.html'
Index: django/contrib/contenttypes/generic.py
===================================================================
--- django/contrib/contenttypes/generic.py	(revision 5519)
+++ django/contrib/contenttypes/generic.py	(working copy)
@@ -258,3 +258,51 @@
         self.multiple = True
         assert not (self.raw_id_admin and self.filter_interface), \
             "Generic relations may not use both raw_id_admin and filter_interface"
+
+from django.newforms.models import InlineFormset, save_instance
+class GenericInlineFormset(InlineFormset):
+
+    @classmethod
+    def add_fk( cls, parent_model, model, fk_name ):
+        assert ':' in fk_name, "Supply valid content_type:object_id as fk_name."
+
+        opts = model._meta
+        ct_field_name, id_field_name = fk_name.split( ':' )
+        ct = opts.get_field( ct_field_name )
+        obj_id = opts.get_field( id_field_name )
+        # HACK: remove the ForeignKey to the parent from every form
+        # This should be done a line above before we pass 'fields' to formset_for_model
+        # an 'omit' argument would be very handy here
+        try:
+            del cls.form_class.base_fields[ct.name]
+            del cls.form_class.base_fields[obj_id.name]
+        except KeyError:
+            pass
+
+        cls.parent_model = parent_model
+        cls.model = model
+        cls.ct_field_name = ct_field_name
+        cls.id_field_name = id_field_name
+        cls.ct = ct
+        cls.obj_id = obj_id
+
+    def get_inline_objects( self ):
+        # This import is done here to avoid circular import importing this module
+        from django.contrib.contenttypes.models import ContentType
+        if self.instance is None:
+            return []
+        return self.model._default_manager.filter( **{ 
+                self.ct_field_name : ContentType.objects.get_for_model( self.instance ),
+                self.id_field_name : self.instance._get_pk_val() 
+            })
+
+    def save_new(self, form, commit=True):
+        # This import is done here to avoid circular import importing this module
+        from django.contrib.contenttypes.models import ContentType
+        kwargs = {
+            self.ct.get_attname(): ContentType.objects.get_for_model( self.instance ).id,
+            self.obj_id.get_attname(): self.instance._get_pk_val(),
+        }
+        new_obj = self.model(**kwargs)
+        return save_instance(form, new_obj, commit=commit)
+
Index: django/newforms/models.py
===================================================================
--- django/newforms/models.py	(revision 5519)
+++ django/newforms/models.py	(working copy)
@@ -282,9 +282,35 @@
         from django.db.models.fields.related import RelatedObject
         self.instance = instance
         # is there a better way to get the object descriptor?
-        self.rel_name = RelatedObject(self.fk.rel.to, self.model, self.fk).get_accessor_name()
-        super(InlineFormset, self).__init__(data, instances=self.get_inline_objects(), prefix=self.rel_name)
+        #self.rel_name = RelatedObject(self.fk.rel.to, self.model, self.fk).get_accessor_name()
+        super(InlineFormset, self).__init__(data, instances=self.get_inline_objects(), prefix='aaaa' ) #prefix=self.rel_name)
 
+    @classmethod
+    def add_fk( cls, parent_model, model, fk_name ):
+        opts = model._meta
+        # figure out what the ForeignKey from model to parent_model is
+        if fk_name is None:
+            fks_to_parent = [f for f in opts.fields if isinstance(f, ForeignKey) and f.rel.to == parent_model]
+            if len(fks_to_parent) == 1:
+                fk = fks_to_parent[0]
+            elif len(fks_to_parent) == 0:
+                raise Exception("%s has no ForeignKey to %s" % (model, parent_model))
+            else:
+                raise Exception("%s has more than 1 ForeignKey to %s" % (model, parent_model))
+        else:
+            fk = opts.get_field( fk_name )
+        # HACK: remove the ForeignKey to the parent from every form
+        # This should be done a line above before we pass 'fields' to formset_for_model
+        # an 'omit' argument would be very handy here
+        try:
+            del FormSet.form_class.base_fields[fk.name]
+        except KeyError:
+            pass
+
+        cls.parent_model = parent_model
+        cls.fk_name = fk.name
+        cls.fk = fk
+
     def get_inline_objects(self):
         if self.instance is None:
             return []
@@ -295,7 +321,7 @@
         new_obj = self.model(**kwargs)
         return save_instance(form, new_obj, commit=commit)
 
-def inline_formset(parent_model, model, fk_name=None, fields=None, extra=3, formfield_callback=lambda f: f.formfield()):
+def inline_formset(parent_model, model, fk_name=None, fields=None, extra=3, formfield_callback=lambda f: f.formfield(), formset=None):
     """
     Returns an ``InlineFormset`` for the given kwargs.
     
@@ -303,26 +329,7 @@
     to ``parent_model``.
     """
     from django.db.models import ForeignKey
-    opts = model._meta
-    # figure out what the ForeignKey from model to parent_model is
-    if fk_name is None:
-        fks_to_parent = [f for f in opts.fields if isinstance(f, ForeignKey) and f.rel.to == parent_model]
-        if len(fks_to_parent) == 1:
-            fk = fks_to_parent[0]
-        elif len(fks_to_parent) == 0:
-            raise Exception("%s has no ForeignKey to %s" % (model, parent_model))
-        else:
-            raise Exception("%s has more than 1 ForeignKey to %s" % (model, parent_model))
     # let the formset handle object deletion by default
-    FormSet = formset_for_model(model, formset=InlineFormset, fields=fields, formfield_callback=formfield_callback, extra=extra, deletable=True)
-    # HACK: remove the ForeignKey to the parent from every form
-    # This should be done a line above before we pass 'fields' to formset_for_model
-    # an 'omit' argument would be very handy here
-    try:
-        del FormSet.form_class.base_fields[fk.name]
-    except KeyError:
-        pass
-    FormSet.parent_model = parent_model
-    FormSet.fk_name = fk.name
-    FormSet.fk = fk
+    FormSet = formset_for_model(model, formset=formset or InlineFormset, fields=fields, formfield_callback=formfield_callback, extra=extra, deletable=True)
+    FormSet.add_fk( parent_model, model, fk_name)
     return FormSet
