diff --git a/django/core/urlresolvers.py b/django/core/urlresolvers.py
index b634b56..2ab0235 100644
--- a/django/core/urlresolvers.py
+++ b/django/core/urlresolvers.py
@@ -134,7 +134,7 @@ def get_mod_func(callback):
         dot = callback.rindex('.')
     except ValueError:
         return callback, ''
-    return callback[:dot], callback[dot+1:]
+    return callback[:dot], callback[dot + 1:]
 
 class LocaleRegexProvider(object):
     """
@@ -204,9 +204,10 @@ class RegexURLPattern(LocaleRegexProvider):
             else:
                 args = match.groups()
             # In both cases, pass any extra_kwargs as **kwargs.
-            kwargs.update(self.default_args)
+            kw = self.default_args.copy()
+            kw.update(kwargs)
 
-            return ResolverMatch(self.callback, args, kwargs, self.name)
+            return ResolverMatch(self.callback, args, kw, self.name)
 
     @property
     def callback(self):
@@ -368,12 +369,14 @@ class RegexURLResolver(LocaleRegexProvider):
                     if len(args) != len(params) + len(prefix_args):
                         continue
                     unicode_args = [force_unicode(val) for val in args]
-                    candidate =  (prefix_norm + result) % dict(zip(prefix_args + params, unicode_args))
+                    candidate = (prefix_norm + result) % dict(zip(prefix_args + params, unicode_args))
                 else:
                     if set(kwargs.keys() + defaults.keys()) != set(params + defaults.keys() + prefix_args):
                         continue
                     matches = True
                     for k, v in defaults.items():
+                        if k in params:
+                            continue
                         if kwargs.get(k, v) != v:
                             matches = False
                             break
diff --git a/docs/topics/http/urls.txt b/docs/topics/http/urls.txt
index f3e27ae..1a30955 100644
--- a/docs/topics/http/urls.txt
+++ b/docs/topics/http/urls.txt
@@ -110,6 +110,8 @@ Example requests:
 
 .. _Dive Into Python's explanation: http://diveintopython.net/regular_expressions/street_addresses.html#re.matching.2.3
 
+.. _named_groups:
+
 Named groups
 ============
 
@@ -559,6 +561,8 @@ Once you have defined namespaced URLs, you can reverse them. For details on
 reversing namespaced urls, see the documentation on :ref:`reversing namespaced
 URLs <topics-http-reversing-url-namespaces>`.
 
+.. _pattern_extra_options:
+
 Passing extra options to view functions
 =======================================
 
@@ -587,9 +591,14 @@ options to views.
 
     It's possible to have a URL pattern which captures named keyword arguments,
     and also passes arguments with the same names in its dictionary of extra
-    arguments. When this happens, the arguments in the dictionary will be used
+    arguments. When this happens, the arguments captured in the URL will be used
+    instead of the arguments in the dictionary.
+
+.. versionadded:: 1.4
+    Previously, in case of a conflict, the arguments in the dictionary were used
     instead of the arguments captured in the URL.
 
+
 Passing extra options to ``include()``
 --------------------------------------
 
@@ -933,8 +942,12 @@ If the URL does not resolve, the function raises an
     .. attribute:: ResolverMatch.kwargs
 
         The keyword arguments that would be passed to the view
-        function, as parsed from the URL.
-
+        function, as parsed from the URL or provided to 
+        :func:`~django.core.urlresolvers.pattern`, the keywords 
+        parsed from the URL taking precedence whenever there is 
+        a conflict. See :ref:`pattern_extra_options` and 
+        :ref:`named_groups`.    
+    
     .. attribute:: ResolverMatch.url_name
 
         The name of the URL pattern that matches the URL.
diff --git a/tests/regressiontests/i18n/patterns/tests.py b/tests/regressiontests/i18n/patterns/tests.py
index 1cc4520..5a8e868 100644
--- a/tests/regressiontests/i18n/patterns/tests.py
+++ b/tests/regressiontests/i18n/patterns/tests.py
@@ -4,7 +4,7 @@ import os
 import warnings
 
 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
@@ -306,3 +306,21 @@ class URLTagTests(URLTestCaseBase):
             {% 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 --git a/tests/regressiontests/i18n/patterns/urls/default.py b/tests/regressiontests/i18n/patterns/urls/default.py
index f117502..6b94cba 100644
--- a/tests/regressiontests/i18n/patterns/urls/default.py
+++ b/tests/regressiontests/i18n/patterns/urls/default.py
@@ -9,7 +9,7 @@ view = TemplateView.as_view(template_name='dummy.html')
 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 --git a/tests/regressiontests/urlpatterns_reverse/tests.py b/tests/regressiontests/urlpatterns_reverse/tests.py
index a1c9244..8683d60 100644
--- a/tests/regressiontests/urlpatterns_reverse/tests.py
+++ b/tests/regressiontests/urlpatterns_reverse/tests.py
@@ -511,3 +511,15 @@ class ErroneousViewTests(TestCase):
         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_kwargs_conflict(self):
+        match = resolve('/rereverse-overridden/12/url/')
+        self.assertEqual(match.kwargs, {'arg': '12', 'extra': True, 'overridden': 'url'})
+
+    def test_rereverse(self):
+        match = resolve('/rereverse/12/')
+        self.assertEqual(reverse(match.url_name, args=match.args, kwargs=match.kwargs), '/rereverse/12/')
+        match = resolve('/rereverse-overridden/12/url/')
+        self.assertEqual(reverse(match.url_name, args=match.args, kwargs=match.kwargs), '/rereverse-overridden/12/url/')
diff --git a/tests/regressiontests/urlpatterns_reverse/urls.py b/tests/regressiontests/urlpatterns_reverse/urls.py
index 1d4ae73..4a3ff6a 100644
--- a/tests/regressiontests/urlpatterns_reverse/urls.py
+++ b/tests/regressiontests/urlpatterns_reverse/urls.py
@@ -41,6 +41,8 @@ urlpatterns = patterns('',
     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'^rereverse-overridden/(?P<arg>\d+)/(?P<overridden>\w+)/$', empty_view, {'extra': True, 'overridden': 'default'}, name='rereverse-overridden'),
     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"),
