diff --git a/django/contrib/admin/__init__.py b/django/contrib/admin/__init__.py
index abc5f09..ddaac3e 100644
--- a/django/contrib/admin/__init__.py
+++ b/django/contrib/admin/__init__.py
@@ -8,7 +8,7 @@ from django.utils.importlib import import_module
 # True while running, and False when it finishes.
 LOADING = False
 
-def autodiscover():
+def autodiscover(admin_site=None):
     """
     Auto-discover INSTALLED_APPS admin.py modules and fail silently when
     not present. This forces an import on them to register any admin bits they
@@ -27,6 +27,9 @@ def autodiscover():
     import imp
     from django.conf import settings
 
+    if admin_site is None:
+        admin_site = site
+
     for app in settings.INSTALLED_APPS:
         # For each app, we need to look for an admin.py inside that app's
         # package. We can't use os.path here -- recall that modules may be
@@ -55,5 +58,11 @@ def autodiscover():
         # Step 3: import the app's admin file. If this has errors we want them
         # to bubble up.
         import_module("%s.admin" % app)
+
+        # Step 4: look for register function and call it, passing admin site
+        # as parameter
+        register_func = getattr(mod, 'register', None)
+        if register_func is not None and callable(register_func):
+            register_func(admin_site)
     # autodiscover was successful, reset loading flag.
     LOADING = False
diff --git a/django/contrib/auth/admin.py b/django/contrib/auth/admin.py
index 61bae28..e06b601 100644
--- a/django/contrib/auth/admin.py
+++ b/django/contrib/auth/admin.py
@@ -138,6 +138,6 @@ class UserAdmin(admin.ModelAdmin):
         }, context_instance=RequestContext(request))
 
 
-admin.site.register(Group, GroupAdmin)
-admin.site.register(User, UserAdmin)
-
+def register(site):
+    site.register(Group, GroupAdmin)
+    site.register(User, UserAdmin)
diff --git a/django/contrib/comments/admin.py b/django/contrib/comments/admin.py
index ede833f..7ed91de 100644
--- a/django/contrib/comments/admin.py
+++ b/django/contrib/comments/admin.py
@@ -65,4 +65,5 @@ class CommentsAdmin(admin.ModelAdmin):
 # Only register the default admin if the model is the built-in comment model
 # (this won't be true if there's a custom comment app).
 if get_model() is Comment:
-    admin.site.register(Comment, CommentsAdmin)
+    def register(site):
+        site.register(Comment, CommentsAdmin)
diff --git a/django/contrib/flatpages/admin.py b/django/contrib/flatpages/admin.py
index b6fdba3..1fc5631 100644
--- a/django/contrib/flatpages/admin.py
+++ b/django/contrib/flatpages/admin.py
@@ -25,4 +25,5 @@ class FlatPageAdmin(admin.ModelAdmin):
     list_filter = ('sites', 'enable_comments', 'registration_required')
     search_fields = ('url', 'title')
 
-admin.site.register(FlatPage, FlatPageAdmin)
+def register(site):
+    site.register(FlatPage, FlatPageAdmin)
diff --git a/django/contrib/redirects/admin.py b/django/contrib/redirects/admin.py
index a9b2a32..15662fb 100644
--- a/django/contrib/redirects/admin.py
+++ b/django/contrib/redirects/admin.py
@@ -1,4 +1,3 @@
-
 from django.contrib import admin
 from django.contrib.redirects.models import Redirect
 
@@ -8,4 +7,5 @@ class RedirectAdmin(admin.ModelAdmin):
     search_fields = ('old_path', 'new_path')
     radio_fields = {'site': admin.VERTICAL}
 
-admin.site.register(Redirect, RedirectAdmin)
\ No newline at end of file
+def register(site):
+    site.register(Redirect, RedirectAdmin)
diff --git a/django/contrib/sites/admin.py b/django/contrib/sites/admin.py
index 2442c24..2102fa2 100644
--- a/django/contrib/sites/admin.py
+++ b/django/contrib/sites/admin.py
@@ -6,4 +6,5 @@ class SiteAdmin(admin.ModelAdmin):
     list_display = ('domain', 'name')
     search_fields = ('domain', 'name')
 
-admin.site.register(Site, SiteAdmin)
\ No newline at end of file
+def register(site):
+    site.register(Site, SiteAdmin)
