Index: django/contrib/admin/media/css/global.css
===================================================================
--- django/contrib/admin/media/css/global.css	(revision 6903)
+++ django/contrib/admin/media/css/global.css	(working copy)
@@ -5,6 +5,8 @@
 a:hover { color: #036; }
 a img { border:none; }
 
+a.section:link, a.section:visited { color: white; text-decoration:none; }
+
 /* GLOBAL DEFAULTS */
 p, ol, ul, dl { margin:.2em 0 .8em 0; }
 p { padding:0; line-height:140%; }
Index: django/contrib/admin/options.py
===================================================================
--- django/contrib/admin/options.py	(revision 6903)
+++ django/contrib/admin/options.py	(working copy)
@@ -526,6 +526,7 @@
             'show_delete': False,
             'media': mark_safe(media),
             'inline_admin_formsets': inline_admin_formsets,
+            'app_label': app_label,
         })
         return self.render_change_form(request, model, c, add=True)
 
@@ -601,6 +602,7 @@
             'is_popup': request.REQUEST.has_key('_popup'),
             'media': mark_safe(media),
             'inline_admin_formsets': inline_admin_formsets,
+            'app_label': app_label,
         })
         return self.render_change_form(request, model, c, change=True, obj=obj)
 
@@ -627,6 +629,7 @@
             'title': cl.title,
             'is_popup': cl.is_popup,
             'cl': cl,
+            'app_label': app_label,
         })
         c.update({'has_add_permission': self.has_add_permission(request)}),
         return render_to_response(['admin/%s/%s/change_list.html' % (app_label, opts.object_name.lower()),
@@ -669,16 +672,17 @@
             request.user.message_set.create(message=_('The %(name)s "%(obj)s" was deleted successfully.') % {'name': force_unicode(opts.verbose_name), 'obj': force_unicode(obj_display)})
             return HttpResponseRedirect("../../")
         extra_context = {
-            "title": _("Are you sure?"),
-            "object_name": opts.verbose_name,
-            "object": obj,
-            "deleted_objects": deleted_objects,
-            "perms_lacking": perms_needed,
-            "opts": opts,
+            'title': _('Are you sure?'),
+            'object_name': opts.verbose_name,
+            'object': obj,
+            'deleted_objects': deleted_objects,
+            'perms_lacking': perms_needed,
+            'opts': opts,
+            'app_label': app_label,
         }
-        return render_to_response(["admin/%s/%s/delete_confirmation.html" % (app_label, opts.object_name.lower() ),
-                                "admin/%s/delete_confirmation.html" % app_label ,
-                                "admin/delete_confirmation.html"], extra_context, context_instance=template.RequestContext(request))
+        return render_to_response(['admin/%s/%s/delete_confirmation.html' % (app_label, opts.object_name.lower() ),
+                                'admin/%s/delete_confirmation.html' % app_label ,
+                                'admin/delete_confirmation.html'], extra_context, context_instance=template.RequestContext(request))
 
     def history_view(self, request, object_id):
         "The 'history' admin view for this model."
Index: django/contrib/admin/templates/admin/change_list.html
===================================================================
--- django/contrib/admin/templates/admin/change_list.html	(revision 6903)
+++ django/contrib/admin/templates/admin/change_list.html	(working copy)
@@ -7,7 +7,7 @@
 
 {% block userlinks %}<a href="../../doc/">{% trans 'Documentation' %}</a> / <a href="../../password_change/">{% trans 'Change password' %}</a> / <a href="../../logout/">{% trans 'Log out' %}</a>{% endblock %}
 
-{% if not is_popup %}{% block breadcrumbs %}<div class="breadcrumbs"><a href="../../">{% trans "Home" %}</a> &rsaquo; {{ cl.opts.verbose_name_plural|capfirst|escape }}</div>{% endblock %}{% endif %}
+{% if not is_popup %}{% block breadcrumbs %}<div class="breadcrumbs"><a href="../../">{% trans "Home" %}</a> &rsaquo; <a href="../">{{ app_label|capfirst|escape }}</a> &rsaquo; {{ cl.opts.verbose_name_plural|capfirst|escape }}</div>{% endblock %}{% endif %}
 
 {% block coltype %}flex{% endblock %}
 
Index: django/contrib/admin/templates/admin/index.html
===================================================================
--- django/contrib/admin/templates/admin/index.html	(revision 6903)
+++ django/contrib/admin/templates/admin/index.html	(working copy)
@@ -16,7 +16,7 @@
     {% for app in app_list %}
         <div class="module">
         <table summary="{% blocktrans with app.name as name %}Models available in the {{ name }} application.{% endblocktrans %}">
-        <caption>{% blocktrans with app.name as name %}{{ name }}{% endblocktrans %}</caption>
+        <caption><a href="{{ app.app_url }}" class="section">{% blocktrans with app.name as name %}{{ name }}{% endblocktrans %}</a></caption>
         {% for model in app.models %}
             <tr>
             {% if model.perms.change %}
Index: django/contrib/admin/templates/admin/app_index.html
===================================================================
--- django/contrib/admin/templates/admin/app_index.html	(revision 0)
+++ django/contrib/admin/templates/admin/app_index.html	(revision 0)
@@ -0,0 +1,5 @@
+{% extends "admin/index.html" %}
+{% load i18n %}
+
+{% if not is_popup %}{% block breadcrumbs %}<div class="breadcrumbs"><a href="../">{% trans "Home" %}</a> &rsaquo; {% for app in app_list %}{% blocktrans with app.name as name %}{{ name }}{% endblocktrans %}{% endfor %}</div>{% endblock %}{% endif %}
+{% block sidebar %}{% endblock %}
\ No newline at end of file
Index: django/contrib/admin/templates/admin/change_form.html
===================================================================
--- django/contrib/admin/templates/admin/change_form.html	(revision 6903)
+++ django/contrib/admin/templates/admin/change_form.html	(working copy)
@@ -17,6 +17,7 @@
 {% block breadcrumbs %}{% if not is_popup %}
 <div class="breadcrumbs">
      <a href="../../../">{% trans "Home" %}</a> &rsaquo;
+     <a href="../../">{{ app_label|capfirst|escape }}</a> &rsaquo;
      <a href="../">{{ opts.verbose_name_plural|capfirst }}</a> &rsaquo;
      {% if add %}{% trans "Add" %} {{ opts.verbose_name }}{% else %}{{ original|truncatewords:"18" }}{% endif %}
 </div>
Index: django/contrib/admin/templates/admin/delete_confirmation.html
===================================================================
--- django/contrib/admin/templates/admin/delete_confirmation.html	(revision 6903)
+++ django/contrib/admin/templates/admin/delete_confirmation.html	(working copy)
@@ -6,6 +6,7 @@
 {% block breadcrumbs %}
 <div class="breadcrumbs">
      <a href="../../../../">{% trans "Home" %}</a> &rsaquo;
+     <a href="../../../">{{ app_label|capfirst|escape }}</a> &rsaquo;
      <a href="../../">{{ opts.verbose_name_plural|capfirst }}</a> &rsaquo;
      <a href="../">{{ object|escape|truncatewords:"18" }}</a> &rsaquo;
      {% trans 'Delete' %}
Index: django/contrib/admin/sites.py
===================================================================
--- django/contrib/admin/sites.py	(revision 6903)
+++ django/contrib/admin/sites.py	(working copy)
@@ -115,7 +115,6 @@
         if not self.has_permission(request):
             return self.login(request)
 
-
         if url == '':
             return self.index(request)
         elif url == 'password_change':
@@ -132,9 +131,11 @@
             match = USER_CHANGE_PASSWORD_URL_RE.match(url)
             if match:
                 return self.user_change_password(request, match.group(1))
-                
+
             if '/' in url:
                 return self.model_page(request, *url.split('/', 2))
+            else:
+                return self.app_index(request, url)
 
         raise http.Http404('The requested admin page does not exist.')
 
@@ -281,6 +282,7 @@
                     else:
                         app_dict[app_label] = {
                             'name': app_label.title(),
+                            'app_url': app_label,
                             'has_module_perms': has_module_perms,
                             'models': [model_dict],
                         }
@@ -298,6 +300,51 @@
             'app_list': app_list,
         }, context_instance=template.RequestContext(request))
 
+    def app_index(self, request, app_label):
+        """
+        Displays the application's index page, which lists all of 
+        the application's models
+        """
+        
+        user = request.user
+        has_module_perms = user.has_module_perms(app_label)
+        app_dict = {}
+        for model, model_admin in self._registry.items():
+            if app_label == model._meta.app_label:
+                if has_module_perms:
+                    perms = {
+                        'add': user.has_perm("%s.%s" % (app_label, model._meta.get_add_permission())),
+                        'change': user.has_perm("%s.%s" % (app_label, model._meta.get_change_permission())),
+                        'delete': user.has_perm("%s.%s" % (app_label, model._meta.get_delete_permission())),
+                    }
+        
+                    # Check whether user has any perm for this module.
+                    # If so, add the module to the model_list.
+                    if True in perms.values():
+                        model_dict = {
+                            'name': capfirst(model._meta.verbose_name_plural),
+                            'admin_url': '%s/' % model.__name__.lower(),
+                            'perms': perms,
+                        }
+                        if app_dict:
+                            app_dict['models'].append(model_dict)
+                        else:
+                            app_dict = {
+                                'name': app_label.title(),
+                                'app_url':'',
+                                'has_module_perms': has_module_perms,
+                                'models': [model_dict],
+                            }
+        if not app_dict:
+            raise http.Http404('The requested admin page does not exist.')
+        # Sort the models alphabetically within each app.
+        app_dict['models'].sort(lambda x, y: cmp(x['name'], y['name']))
+
+        return render_to_response('admin/app_index.html', {
+            'title': _('%s administration' % capfirst(app_label)),
+            'app_list': [app_dict,],
+        }, context_instance=template.RequestContext(request))
+
 # This global object represents the default admin site, for the common case.
 # You can instantiate AdminSite in your own code to create a custom admin site.
 site = AdminSite()
