Index: django/contrib/admin/options.py
===================================================================
--- django/contrib/admin/options.py	(revision 7354)
+++ django/contrib/admin/options.py	(working copy)
@@ -2,6 +2,8 @@
 from django import newforms as forms
 from django.newforms.formsets import all_valid
 from django.newforms.models import _modelform_factory, _inlineformset_factory
+# don't mess with ModelForm name defined in other places except line 217
+from django.newforms.models import ModelForm as ModelFormClass
 from django.contrib.contenttypes.models import ContentType
 from django.contrib.admin import widgets
 from django.contrib.admin.util import get_deleted_objects
@@ -212,6 +214,7 @@
     save_on_top = False
     ordering = None
     inlines = []
+    admin_form = ModelFormClass
 
     def __init__(self, model, admin_site):
         self.model = model
@@ -308,17 +311,12 @@
         """
         Returns a Form class for use in the admin add view. This is used by
         add_view and change_view.
-        
-        Note that if you override this method, your form will *not*
-        automatically get the custom admin widgets. raw_id_fields, fields,
-        fieldsets, filter_vertical, and filter_horizonal will not apply to
-        your form. You will have manually specify those widgets.
         """
         if self.declared_fieldsets:
             fields = flatten_fieldsets(self.declared_fieldsets)
         else:
             fields = None
-        return _modelform_factory(self.model, fields=fields, formfield_callback=self.formfield_for_dbfield)
+        return _modelform_factory(self.model, form=self.admin_form, fields=fields, formfield_callback=self.formfield_for_dbfield)
 
     def get_formsets(self, request, obj=None):
         for inline in self.inline_instances:
Index: django/newforms/models.py
===================================================================
--- django/newforms/models.py	(revision 7354)
+++ django/newforms/models.py	(working copy)
@@ -277,7 +277,8 @@
     __metaclass__ = ModelFormMetaclass
 
 # XXX: This API *will* change. Use at your own risk.
-def _modelform_factory(model, form=BaseForm, fields=None, exclude=None,
+# bugfix by brosner: http://dpaste.com/40940/
+def _modelform_factory(model, form=ModelForm, fields=None, exclude=None,
                        formfield_callback=lambda f: f.formfield()):
     # HACK: we should be able to construct a ModelForm without creating
     # and passing in a temporary inner class
@@ -287,7 +288,7 @@
     setattr(Meta, 'fields', fields)
     setattr(Meta, 'exclude', exclude)
     class_name = model.__name__ + 'Form'
-    return ModelFormMetaclass(class_name, (ModelForm,), {'Meta': Meta},
+    return ModelFormMetaclass(class_name, (form,), {'Meta': Meta},
                               formfield_callback=formfield_callback)
 
 
@@ -360,7 +361,7 @@
         super(BaseModelFormSet, self).add_fields(form, index)
 
 # XXX: Use at your own risk. This API *will* change.
-def _modelformset_factory(model, form=BaseModelForm, formfield_callback=lambda f: f.formfield(),
+def _modelformset_factory(model, form=ModelForm, formfield_callback=lambda f: f.formfield(),
                           formset=BaseModelFormSet,
                           extra=1, can_delete=False, can_order=False,
                           fields=None, exclude=None):
@@ -427,7 +428,7 @@
 
 
 # XXX: This API *will* change. Use at your own risk.
-def _inlineformset_factory(parent_model, model, form=BaseModelForm, fk_name=None,
+def _inlineformset_factory(parent_model, model, form=ModelForm, fk_name=None,
                            fields=None, exclude=None,
                            extra=3, can_order=False, can_delete=True,
                            formfield_callback=lambda f: f.formfield()):
