diff --git a/django/contrib/admin/loading.py b/django/contrib/admin/loading.py
new file mode 100644
index 0000000..2a23843
--- /dev/null
+++ b/django/contrib/admin/loading.py
@@ -0,0 +1,22 @@
+
+class ModelAdminCache(object):
+    
+    __shared_state = dict(
+        modeladmin_store = {},
+    )
+    
+    def __init__(self):
+        self.__dict__ = self.__shared_state
+        
+    def get(self, key):
+        return self.modeladmin_store[key]
+    
+    def register(self, *admin_classes):
+        for admin_class in admin_classes:
+            key = ".".join(admin_class.__module__.split(".")[-2:] + [admin_class.__name__])
+            # print "ModelAdminCache registering %s (%s)" % (key, id(admin_class))
+            if key in self.modeladmin_store:
+                continue
+            self.modeladmin_store[key] = admin_class
+
+admin_class_cache = ModelAdminCache()
diff --git a/django/contrib/admin/options.py b/django/contrib/admin/options.py
index d0cca0a..d5358af 100644
--- a/django/contrib/admin/options.py
+++ b/django/contrib/admin/options.py
@@ -4,6 +4,7 @@ from django.newforms.formsets import all_valid
 from django.newforms.models import _modelform_factory, _inlineformset_factory
 from django.contrib.contenttypes.models import ContentType
 from django.contrib.admin import widgets
+from django.contrib.admin.loading import admin_class_cache
 from django.contrib.admin.util import get_deleted_objects
 from django.core.exceptions import ImproperlyConfigured, PermissionDenied
 from django.db import models, transaction
@@ -124,6 +125,23 @@ class AdminField(object):
         attrs = classes and {'class': u' '.join(classes)} or {}
         return self.field.label_tag(contents=contents, attrs=attrs)
 
+class ModelAdminMetaclass(type):
+    def __new__(cls, name, bases, attrs):
+        new_class = forms.MediaDefiningClass.__new__(cls, name, bases, attrs)
+        try:
+            parents = [b for b in bases if issubclass(b, ModelAdmin)]
+            if not parents:
+                return new_class
+        except NameError:
+            return new_class
+        # new_class = type.__new__(cls, name, bases, attrs)
+        # put this in some sort of registry
+        # print "ModelAdminMetaclass called (name=%s, module=%s, new_class=%s)" % (name, new_class.__module__, id(new_class))
+        admin_class_cache.register(new_class)
+        # due to the way imports happening only use the admin class that is
+        # already registered.
+        return admin_class_cache.get(".".join(new_class.__module__.split(".")[-2:] + [new_class.__name__]))
+
 class BaseModelAdmin(object):
     """Functionality common to both ModelAdmin and InlineAdmin."""
     raw_id_fields = ()
@@ -200,7 +218,7 @@ class BaseModelAdmin(object):
 
 class ModelAdmin(BaseModelAdmin):
     "Encapsulates all admin options and functionality for a given model."
-    __metaclass__ = forms.MediaDefiningClass
+    __metaclass__ = ModelAdminMetaclass
 
     list_display = ('__str__',)
     list_display_links = ()
diff --git a/django/contrib/admin/sites.py b/django/contrib/admin/sites.py
index 6c6f47e..610f5e7 100644
--- a/django/contrib/admin/sites.py
+++ b/django/contrib/admin/sites.py
@@ -76,8 +76,10 @@ class AdminSite(object):
         if isinstance(model_or_iterable, ModelBase):
             model_or_iterable = [model_or_iterable]
         for model in model_or_iterable:
-            if model in self._registry:
-                raise AlreadyRegistered('The model %s is already registered' % model.__name__)
+            # print "registering %r (model=%s, admin_class=%s, in_registry=%s, self=%s)" % (model, id(model), id(admin_class), model in self._registry, id(self))
+            if model in self._registry and self._registry[model].__class__ is not admin_class:
+                # print "MAYDAY!! (%s is not %s)" % (id(self._registry[model].__class__), id(admin_class))
+                raise AlreadyRegistered('The model %s is already registered to %s' % (model.__name__, self._registry[model].__class__.__name__))
             self._registry[model] = admin_class(model, self)
 
     def unregister(self, model_or_iterable):
