diff -r bdf2b79d7dec django/core/urlresolvers.py
--- a/django/core/urlresolvers.py	Mon Jul 04 16:20:29 2011 +0000
+++ b/django/core/urlresolvers.py	Mon Jul 04 19:40:10 2011 +0200
@@ -8,6 +8,7 @@
 """
 
 import re
+from itertools import chain
 from threading import local
 
 from django.http import Http404
@@ -34,10 +35,12 @@
 
 
 class ResolverMatch(object):
-    def __init__(self, func, args, kwargs, url_name=None, app_name=None, namespaces=None):
+    def __init__(self, func, args, kwargs, url_name=None, app_name=None, namespaces=None, default_kwargs=None):
         self.func = func
         self.args = args
-        self.kwargs = kwargs
+        self.match_kwargs = kwargs
+        self.default_kwargs = default_kwargs
+        self.kwargs = dict([x for x in chain(kwargs.items(), default_kwargs.items())])
         self.app_name = app_name
         if namespaces:
             self.namespaces = [x for x in namespaces if x]
@@ -193,10 +196,8 @@
                 args = ()
             else:
                 args = match.groups()
-            # In both cases, pass any extra_kwargs as **kwargs.
-            kwargs.update(self.default_args)
 
-            return ResolverMatch(self.callback, args, kwargs, self.name)
+            return ResolverMatch(self.callback, args, kwargs, self.name, default_kwargs=self.default_args)
 
     @property
     def callback(self):
@@ -297,10 +298,14 @@
                 else:
                     if sub_match:
                         sub_match_dict = dict([(smart_str(k), v) for k, v in match.groupdict().items()])
-                        sub_match_dict.update(self.default_kwargs)
-                        for k, v in sub_match.kwargs.iteritems():
-                            sub_match_dict[smart_str(k)] = v
-                        return ResolverMatch(sub_match.func, sub_match.args, sub_match_dict, sub_match.url_name, self.app_name or sub_match.app_name, [self.namespace] + sub_match.namespaces)
+                        sub_match_dict.update(sub_match.match_kwargs)
+                        default_kwargs = sub_match.default_kwargs
+                        default_kwargs.update(self.default_kwargs)
+                        return ResolverMatch(sub_match.func, sub_match.args,
+                            sub_match_dict, sub_match.url_name,
+                            self.app_name or sub_match.app_name,
+                            [self.namespace] + sub_match.namespaces,
+                            default_kwargs)
                     tried.append([pattern])
             raise Resolver404({'tried': tried, 'path': new_path})
         raise Resolver404({'path' : path})
diff -r bdf2b79d7dec tests/regressiontests/i18n/patterns/tests.py
--- a/tests/regressiontests/i18n/patterns/tests.py	Mon Jul 04 16:20:29 2011 +0000
+++ b/tests/regressiontests/i18n/patterns/tests.py	Mon Jul 04 19:40:10 2011 +0200
@@ -3,7 +3,7 @@
 import os
 
 from django.core.exceptions import ImproperlyConfigured
-from django.core.urlresolvers import reverse, clear_url_caches
+from django.core.urlresolvers import reverse, resolve, clear_url_caches
 from django.test import TestCase
 from django.test.utils import override_settings
 from django.template import Template, Context
@@ -246,7 +246,7 @@
 
 class URLTagTests(URLTestCaseBase):
     """
-    Test if the language tag works.
+    Tests if the language tag works.
     """
     def test_strings_only(self):
         t = Template("""{% load i18n %}
@@ -283,3 +283,21 @@
             {% language 'pt-br' %}{% url 'no-prefix-translated-slug' slug='apo' %}{% endlanguage %}""")
         self.assertEqual(tpl.render(Context({})).strip().split(),
                          [u'/vertaald/apo/', u'/traduzidos/apo/'])
+
+
+class URLExampleTests(URLTestCaseBase):
+    def test_demo(self):
+        # User accesses an english url.
+        with translation.override('en'):
+            match = resolve('/translated/apo/')
+        # Now we want provide links to the same page in other languages
+        links = []
+        langs = ['nl', 'pt-br']
+        for lang in langs:
+            with translation.override(lang):
+                links.append(reverse(match.url_name, args=match.args, kwargs=match.match_kwargs))
+        self.assertEqual(links, [u'/vertaald/apo/', u'/traduzidos/apo/'])
+        # Now we can offer the user links to the other pages
+        # print "View the page in: ",
+        # for lang, link in zip(langs, links):
+        #   print "<a href='%s'>%s</a> % (link, lang),
diff -r bdf2b79d7dec tests/regressiontests/i18n/patterns/urls/default.py
--- a/tests/regressiontests/i18n/patterns/urls/default.py	Mon Jul 04 16:20:29 2011 +0000
+++ b/tests/regressiontests/i18n/patterns/urls/default.py	Mon Jul 04 19:40:10 2011 +0200
@@ -9,7 +9,7 @@
 urlpatterns = patterns('',
     url(r'^not-prefixed/$', view, name='not-prefixed'),
     url(_(r'^translated/$'), view, name='no-prefix-translated'),
-    url(_(r'^translated/(?P<slug>[\w-]+)/$'), view, name='no-prefix-translated-slug'),
+    url(_(r'^translated/(?P<slug>[\w-]+)/$'), view, {'extra': True}, name='no-prefix-translated-slug'),
 )
 
 urlpatterns += i18n_patterns('',
diff -r bdf2b79d7dec tests/regressiontests/urlpatterns_reverse/tests.py
--- a/tests/regressiontests/urlpatterns_reverse/tests.py	Mon Jul 04 16:20:29 2011 +0000
+++ b/tests/regressiontests/urlpatterns_reverse/tests.py	Mon Jul 04 19:40:10 2011 +0200
@@ -481,3 +481,10 @@
         self.assertRaises(ViewDoesNotExist, self.client.get, '/missing_outer/')
         self.assertRaises(ViewDoesNotExist, self.client.get, '/uncallable/')
 
+
+class TestRereverse(TestCase):
+    urls = 'regressiontests.urlpatterns_reverse.urls'
+
+    def test_rereverse(self):
+        match = resolve('/rereverse/12/')
+        self.assertEqual(reverse(match.url_name, args=match.args, kwargs=match.match_kwargs), '/rereverse/12/')
diff -r bdf2b79d7dec tests/regressiontests/urlpatterns_reverse/urls.py
--- a/tests/regressiontests/urlpatterns_reverse/urls.py	Mon Jul 04 16:20:29 2011 +0000
+++ b/tests/regressiontests/urlpatterns_reverse/urls.py	Mon Jul 04 19:40:10 2011 +0200
@@ -36,6 +36,7 @@
     url(r'^windows_path/(?P<drive_name>[A-Z]):\\(?P<path>.+)/$', empty_view,
             name="windows"),
     url(r'^special_chars/(.+)/$', empty_view, name="special"),
+    url(r'^rereverse/(?P<arg>\d+)/$', empty_view, {'extra': True}, name='rereverse'),
     url(r'^(?P<name>.+)/\d+/$', empty_view, name="mixed"),
     url(r'^repeats/a{1,2}/$', empty_view, name="repeats"),
     url(r'^repeats/a{2,4}/$', empty_view, name="repeats2"),
