diff --git a/django/core/urlresolvers.py b/django/core/urlresolvers.py
index b634b56..84cb111 100644
--- django/core/urlresolvers.py
+++ django/core/urlresolvers.py
@@ -118,13 +118,15 @@ def get_resolver(urlconf):
     return RegexURLResolver(r'^/', urlconf)
 get_resolver = memoize(get_resolver, _resolver_cache, 1)
 
-def get_ns_resolver(ns_pattern, resolver):
+def get_ns_resolver(resolvers):
     # Build a namespaced resolver for the given parent urlconf pattern.
     # This makes it possible to have captured parameters in the parent
     # urlconf pattern.
-    ns_resolver = RegexURLResolver(ns_pattern,
-                                          resolver.url_patterns)
-    return RegexURLResolver(r'^/', [ns_resolver])
+    ns_resolvers = []
+    for ns_pattern, resolver in resolvers:
+        ns_resolvers.append(RegexURLResolver(ns_pattern,
+                                              resolver.url_patterns))
+    return RegexURLResolver(r'^/', ns_resolvers)
 get_ns_resolver = memoize(get_ns_resolver, _ns_resolver_cache, 2)
 
 def get_mod_func(callback):
@@ -245,7 +247,7 @@ class RegexURLResolver(LocaleRegexProvider):
                 p_pattern = p_pattern[1:]
             if isinstance(pattern, RegexURLResolver):
                 if pattern.namespace:
-                    namespaces[pattern.namespace] = (p_pattern, pattern)
+                    namespaces.setdefault(pattern.namespace, []).append((p_pattern, pattern))
                     if pattern.app_name:
                         apps.setdefault(pattern.app_name, []).append(pattern.namespace)
                 else:
@@ -256,8 +258,9 @@ class RegexURLResolver(LocaleRegexProvider):
                             for piece, p_args in parent:
                                 new_matches.extend([(piece + suffix, p_args + args) for (suffix, args) in matches])
                             lookups.appendlist(name, (new_matches, p_pattern + pat, dict(defaults, **pattern.default_kwargs)))
-                    for namespace, (prefix, sub_pattern) in pattern.namespace_dict.items():
-                        namespaces[namespace] = (p_pattern + prefix, sub_pattern)
+                    for namespace, resolvers in pattern.namespace_dict.items():
+                        for prefix, sub_pattern in resolvers:
+                            namespaces.setdefault(namespace, []).append((p_pattern + prefix, sub_pattern))
                     for app_name, namespace_list in pattern.app_dict.items():
                         apps.setdefault(app_name, []).extend(namespace_list)
             else:
@@ -437,8 +440,9 @@ def reverse(viewname, urlconf=None, args=None, kwargs=None, prefix=None, current
         view = parts[0]
         path = parts[1:]
 
+        resolvers = []
         resolved_path = []
-        ns_pattern = ''
+        ns_patterns = ['']
         while path:
             ns = path.pop()
 
@@ -459,9 +463,14 @@ def reverse(viewname, urlconf=None, args=None, kwargs=None, prefix=None, current
                 pass
 
             try:
-                extra, resolver = resolver.namespace_dict[ns]
+                _resolvers = resolver.namespace_dict[ns]
                 resolved_path.append(ns)
-                ns_pattern = ns_pattern + extra
+                _ns_patterns = []
+                for extra, resolver in _resolvers:
+                    for ns_pattern in ns_patterns:
+                        ns_pattern += extra
+                        _ns_patterns.append(ns_pattern)
+                        resolvers.append((ns_pattern, resolver))
             except KeyError, key:
                 if resolved_path:
                     raise NoReverseMatch(
@@ -470,8 +479,9 @@ def reverse(viewname, urlconf=None, args=None, kwargs=None, prefix=None, current
                 else:
                     raise NoReverseMatch("%s is not a registered namespace" %
                                          key)
-        if ns_pattern:
-            resolver = get_ns_resolver(ns_pattern, resolver)
+
+        if resolvers and resolvers[0]:
+            resolver = get_ns_resolver(tuple(resolvers))
 
     return iri_to_uri(resolver._reverse_with_prefix(view, prefix, *args, **kwargs))
 
diff --git a/tests/regressiontests/urlpatterns_reverse/namespace_urls.py b/tests/regressiontests/urlpatterns_reverse/namespace_urls.py
index fa892a4..2208d38 100644
--- tests/regressiontests/urlpatterns_reverse/namespace_urls.py
+++ tests/regressiontests/urlpatterns_reverse/namespace_urls.py
@@ -6,16 +6,19 @@ from .views import view_class_instance
 
 
 class URLObject(object):
-    def __init__(self, app_name, namespace):
+    def __init__(self, app_name, namespace, _patterns=None):
+        if _patterns is None:
+            _patterns = patterns('',
+                url(r'^inner/$', 'empty_view', name='urlobject-view'),
+                url(r'^inner/(?P<arg1>\d+)/(?P<arg2>\d+)/$', 'empty_view', name='urlobject-view'),
+                url(r'^inner/\+\\\$\*/$', 'empty_view', name='urlobject-special-view'),
+            )
+        self.patterns = _patterns
         self.app_name = app_name
         self.namespace = namespace
 
     def urls(self):
-        return patterns('',
-            url(r'^inner/$', 'empty_view', name='urlobject-view'),
-            url(r'^inner/(?P<arg1>\d+)/(?P<arg2>\d+)/$', 'empty_view', name='urlobject-view'),
-            url(r'^inner/\+\\\$\*/$', 'empty_view', name='urlobject-special-view'),
-        ), self.app_name, self.namespace
+        return self.patterns, self.app_name, self.namespace
     urls = property(urls)
 
 testobj1 = URLObject('testapp', 'test-ns1')
@@ -25,6 +28,15 @@ default_testobj = URLObject('testapp', 'testapp')
 otherobj1 = URLObject('nodefault', 'other-ns1')
 otherobj2 = URLObject('nodefault', 'other-ns2')
 
+first_patterns = patterns('',
+    url(r'^$', 'empty_view', name='first'),
+)
+first = URLObject('first', 'inc-some', first_patterns)
+second_patterns = patterns('',
+    url(r'^$', 'empty_view', name='second'),
+)
+second = URLObject('second', 'inc-some', second_patterns)
+
 urlpatterns = patterns('regressiontests.urlpatterns_reverse.views',
     url(r'^normal/$', 'empty_view', name='normal-view'),
     url(r'^normal/(?P<arg1>\d+)/(?P<arg2>\d+)/$', 'empty_view', name='normal-view'),
@@ -55,4 +67,7 @@ urlpatterns = patterns('regressiontests.urlpatterns_reverse.views',
     (r'^ns-outer/(?P<outer>\d+)/', include('regressiontests.urlpatterns_reverse.included_namespace_urls', namespace='inc-outer')),
 
     (r'^\+\\\$\*/', include('regressiontests.urlpatterns_reverse.namespace_urls', namespace='special')),
+
+    url(r'^first/', include(first.urls)),
+    url(r'^second/', include(second.urls)),
 )
diff --git a/tests/regressiontests/urlpatterns_reverse/tests.py b/tests/regressiontests/urlpatterns_reverse/tests.py
index a1c9244..aef7214 100644
--- tests/regressiontests/urlpatterns_reverse/tests.py
+++ tests/regressiontests/urlpatterns_reverse/tests.py
@@ -392,6 +392,11 @@ class NamespaceTests(TestCase):
         self.assertEqual('/inc70/', reverse('inc-ns5:inner-nothing', args=['70']))
         self.assertEqual('/inc78/extra/foobar/', reverse('inc-ns5:inner-extra', args=['78','foobar']))
 
+    def test_namespaces_in_different_includes(self):
+        "Namespaces declared in different places: see #17551"
+        self.assertEqual('/first/', reverse('inc-some:first'))
+        self.assertEqual('/second/', reverse('inc-some:second'))
+
 class RequestURLconfTests(TestCase):
     def setUp(self):
         self.root_urlconf = settings.ROOT_URLCONF
