Index: contrib/admin/media/css/global.css
===================================================================
--- contrib/admin/media/css/global.css	(revision 8253)
+++ 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: contrib/admin/options.py
===================================================================
--- contrib/admin/options.py	(revision 8253)
+++ contrib/admin/options.py	(working copy)
@@ -546,6 +546,7 @@
             'inline_admin_formsets': inline_admin_formsets,
             'errors': AdminErrorList(form, inline_formsets),
             'root_path': self.admin_site.root_path,
+            'app_label': app_label,
         }
         context.update(extra_context or {})
         return self.render_change_form(request, context, add=True)
@@ -609,6 +610,7 @@
             'inline_admin_formsets': inline_admin_formsets,
             'errors': AdminErrorList(form, inline_formsets),
             'root_path': self.admin_site.root_path,
+            'app_label': app_label,
         }
         context.update(extra_context or {})
         return self.render_change_form(request, context, change=True, obj=obj)
@@ -639,6 +641,7 @@
             'cl': cl,
             'has_add_permission': self.has_add_permission(request),
             'root_path': self.admin_site.root_path,
+            'app_label': app_label,
         }
         context.update(extra_context or {})
         return render_to_response(self.change_list_template or [
@@ -685,19 +688,20 @@
             return HttpResponseRedirect("../../")
 
         context = {
-            "title": _("Are you sure?"),
-            "object_name": force_unicode(opts.verbose_name),
-            "object": obj,
-            "deleted_objects": deleted_objects,
-            "perms_lacking": perms_needed,
-            "opts": opts,
-            "root_path": self.admin_site.root_path,
+            'title': _('Are you sure?'),
+            'object_name': opts.verbose_name,
+            'object': obj,
+            'deleted_objects': deleted_objects,
+            'perms_lacking': perms_needed,
+            'opts': opts,
+            'root_path': self.admin_site.root_path,
+            'app_label': app_label,
         }
         context.update(extra_context or {})
         return render_to_response(self.delete_confirmation_template or [
-            "admin/%s/%s/delete_confirmation.html" % (app_label, opts.object_name.lower()),
-            "admin/%s/delete_confirmation.html" % app_label,
-            "admin/delete_confirmation.html"
+            'admin/%s/%s/delete_confirmation.html' % (app_label, opts.object_name.lower()),
+            'admin/%s/delete_confirmation.html' % app_label,
+            'admin/delete_confirmation.html'
         ], context, context_instance=template.RequestContext(request))
 
     def history_view(self, request, object_id, extra_context=None):
@@ -720,9 +724,9 @@
         }
         context.update(extra_context or {})
         return render_to_response(self.object_history_template or [
-            "admin/%s/%s/object_history.html" % (opts.app_label, opts.object_name.lower()),
-            "admin/%s/object_history.html" % opts.app_label,
-            "admin/object_history.html"
+            'admin/%s/%s/object_history.html' % (opts.app_label, opts.object_name.lower()),
+            'admin/%s/object_history.html' % opts.app_label,
+            'admin/object_history.html'
         ], context, context_instance=template.RequestContext(request))
 
 class InlineModelAdmin(BaseModelAdmin):
Index: contrib/admin/templates/admin/change_list.html
===================================================================
--- contrib/admin/templates/admin/change_list.html	(revision 8253)
+++ contrib/admin/templates/admin/change_list.html	(working copy)
@@ -5,7 +5,7 @@
 
 {% block bodyclass %}change-list{% 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: contrib/admin/templates/admin/index.html
===================================================================
--- contrib/admin/templates/admin/index.html	(revision 8253)
+++ 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: contrib/admin/templates/admin/change_form.html
===================================================================
--- contrib/admin/templates/admin/change_form.html	(revision 8253)
+++ contrib/admin/templates/admin/change_form.html	(working copy)
@@ -15,6 +15,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: contrib/admin/templates/admin/delete_confirmation.html
===================================================================
--- contrib/admin/templates/admin/delete_confirmation.html	(revision 8253)
+++ contrib/admin/templates/admin/delete_confirmation.html	(working copy)
@@ -4,6 +4,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: contrib/admin/sites.py
===================================================================
--- contrib/admin/sites.py	(revision 8253)
+++ contrib/admin/sites.py	(working copy)
@@ -154,6 +154,8 @@
 
             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.')
 
@@ -305,6 +307,7 @@
                     else:
                         app_dict[app_label] = {
                             'name': app_label.title(),
+                            'app_url': app_label,
                             'has_module_perms': has_module_perms,
                             'models': [model_dict],
                         }
@@ -350,8 +353,47 @@
         return render_to_response(self.login_template or 'admin/login.html', context,
             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()
Index: contrib/auth/models.py
===================================================================
--- contrib/auth/models.py	(revision 8253)
+++ contrib/auth/models.py	(working copy)
@@ -70,7 +70,7 @@
 
     Three basic permissions -- add, change and delete -- are automatically created for each Django model.
     """
-    name = models.CharField(_('name'), max_length=50)
+    name = models.CharField(_('name'), max_length=100)
     content_type = models.ForeignKey(ContentType)
     codename = models.CharField(_('codename'), max_length=100)
 
