diff -r 9aed8047e568 django/template/defaulttags.py
--- a/django/template/defaulttags.py	Thu Nov 18 01:53:38 2010 +0000
+++ b/django/template/defaulttags.py	Thu Nov 18 22:04:47 2010 +0800
@@ -290,24 +290,30 @@
     return False
 
 class SsiNode(Node):
-    def __init__(self, filepath, parsed):
-        self.filepath, self.parsed = filepath, parsed
+    def __init__(self, filepath, parsed, legacy_filepath=True):
+        self.filepath = filepath
+	self.parsed = parsed
+	self.legacy_filepath = legacy_filepath
 
     def render(self, context):
-        if not include_is_allowed(self.filepath):
+        filepath = self.filepath
+        if not self.legacy_filepath:
+           filepath = filepath.resolve(context)
+
+        if not include_is_allowed(filepath):
             if settings.DEBUG:
                 return "[Didn't have permission to include file]"
             else:
                 return '' # Fail silently for invalid includes.
         try:
-            fp = open(self.filepath, 'r')
+            fp = open(filepath, 'r')
             output = fp.read()
             fp.close()
         except IOError:
             output = ''
         if self.parsed:
             try:
-                t = Template(output, name=self.filepath)
+                t = Template(output, name=filepath)
                 return t.render(context)
             except TemplateSyntaxError, e:
                 if settings.DEBUG:
@@ -356,8 +362,9 @@
         return self.mapping.get(self.tagtype, '')
 
 class URLNode(Node):
-    def __init__(self, view_name, args, kwargs, asvar):
+    def __init__(self, view_name, args, kwargs, asvar, legacy_view_name=True):
         self.view_name = view_name
+	self.legacy_view_name = legacy_view_name
         self.args = args
         self.kwargs = kwargs
         self.asvar = asvar
@@ -365,22 +372,27 @@
     def render(self, context):
         from django.core.urlresolvers import reverse, NoReverseMatch
         args = [arg.resolve(context) for arg in self.args]
-        kwargs = dict([(smart_str(k,'ascii'), v.resolve(context))
+        kwargs = dict([(smart_str(k, 'ascii'), v.resolve(context))
                        for k, v in self.kwargs.items()])
 
+        view_name = self.view_name
+        if not self.legacy_view_name:
+            view_name = view_name.resolve(context)
+
         # Try to look up the URL twice: once given the view name, and again
         # relative to what we guess is the "main" app. If they both fail,
         # re-raise the NoReverseMatch unless we're using the
         # {% url ... as var %} construct in which cause return nothing.
         url = ''
         try:
-            url = reverse(self.view_name, args=args, kwargs=kwargs, current_app=context.current_app)
+            url = reverse(view_name, args=args, kwargs=kwargs, current_app=context.current_app)
         except NoReverseMatch, e:
             if settings.SETTINGS_MODULE:
                 project_name = settings.SETTINGS_MODULE.split('.')[0]
                 try:
-                    url = reverse(project_name + '.' + self.view_name,
-                              args=args, kwargs=kwargs, current_app=context.current_app)
+                    url = reverse(project_name + '.' + view_name,
+                              args=args, kwargs=kwargs,
+                              current_app=context.current_app)
                 except NoReverseMatch:
                     if self.asvar is None:
                         # Re-raise the original exception, not the one with
@@ -922,6 +934,11 @@
 
         {% ssi /home/html/ljworld.com/includes/right_generic.html parsed %}
     """
+
+    import warnings
+    warnings.warn('The syntax for the ssi template tag is changing. Load the future_ssi tag library to start using the new behavior.',
+                  category=PendingDeprecationWarning)
+
     bits = token.contents.split()
     parsed = False
     if len(bits) not in (2, 3):
@@ -933,7 +950,7 @@
         else:
             raise TemplateSyntaxError("Second (optional) argument to %s tag"
                                       " must be 'parsed'" % bits[0])
-    return SsiNode(bits[1], parsed)
+    return SsiNode(bits[1], parsed, legacy_filepath=True)
 ssi = register.tag(ssi)
 
 #@register.tag
@@ -1140,6 +1157,11 @@
 
     The URL will look like ``/clients/client/123/``.
     """
+
+    import warnings
+    warnings.warn('The syntax for the url template tag is changing. Load the future_url tag library to start using the new behavior.',
+                  category=PendingDeprecationWarning)
+
     bits = token.split_contents()
     if len(bits) < 2:
         raise TemplateSyntaxError("'%s' takes at least one argument"
@@ -1196,7 +1218,7 @@
             else:
                 args.append(parser.compile_filter(value))
 
-    return URLNode(viewname, args, kwargs, asvar)
+    return URLNode(viewname, args, kwargs, asvar, legacy_view_name=True)
 url = register.tag(url)
 
 #@register.tag
diff -r 9aed8047e568 django/templatetags/future_ssi.py
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/django/templatetags/future_ssi.py	Thu Nov 18 22:04:47 2010 +0800
@@ -0,0 +1,37 @@
+from django.conf import settings
+from django.template import Library, Node, Template, TemplateSyntaxError
+from django.template.defaulttags import include_is_allowed, SsiNode
+
+
+register = Library()
+
+@register.tag
+def ssi(parser, token):
+    """
+    Outputs the contents of a given file into the page.
+
+    Like a simple "include" tag, the ``ssi`` tag includes the contents
+    of another file -- which must be specified using an absolute path --
+    in the current page::
+
+        {% ssi "/home/html/ljworld.com/includes/right_generic.html" %}
+
+    If the optional "parsed" parameter is given, the contents of the included
+    file are evaluated as template code, with the current context::
+
+        {% ssi "/home/html/ljworld.com/includes/right_generic.html" parsed %}
+    """
+    bits = token.contents.split()
+    parsed = False
+    if len(bits) not in (2, 3):
+        raise TemplateSyntaxError("'ssi' tag takes one argument: the path to"
+                                  " the file to be included")
+    if len(bits) == 3:
+        if bits[2] == 'parsed':
+            parsed = True
+        else:
+            raise TemplateSyntaxError("Second (optional) argument to %s tag"
+                                      " must be 'parsed'" % bits[0])
+    filepath = parser.compile_filter(bits[1])
+    return SsiNode(filepath, parsed, legacy_filepath=False)
+
diff -r 9aed8047e568 django/templatetags/future_url.py
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/django/templatetags/future_url.py	Thu Nov 18 22:04:47 2010 +0800
@@ -0,0 +1,70 @@
+from django.conf import settings
+from django.template import Library, Node, TemplateSyntaxError
+from django.template.defaulttags import kwarg_re, URLNode
+from django.utils.encoding import smart_str
+
+
+register = Library()
+
+@register.tag
+def url(parser, token):
+    """
+    Returns an absolute URL matching given view with its parameters.
+
+    This is a way to define links that aren't tied to a particular URL
+    configuration::
+
+        {% url "path.to.some_view" arg1 arg2 %}
+
+        or
+
+        {% url "path.to.some_view" name1=value1 name2=value2 %}
+
+    The first argument is a path to a view. It can be an absolute python path
+    or just ``app_name.view_name`` without the project name if the view is
+    located inside the project.  Other arguments are comma-separated values
+    that will be filled in place of positional and keyword arguments in the
+    URL. All arguments for the URL should be present.
+
+    For example if you have a view ``app_name.client`` taking client's id and
+    the corresponding line in a URLconf looks like this::
+
+        ('^client/(\d+)/$', 'app_name.client')
+
+    and this app's URLconf is included into the project's URLconf under some
+    path::
+
+        ('^clients/', include('project_name.app_name.urls'))
+
+    then in a template you can create a link for a certain client like this::
+
+        {% url "app_name.client" client.id %}
+
+    The URL will look like ``/clients/client/123/``.
+    """
+    bits = token.split_contents()
+    if len(bits) < 2:
+        raise TemplateSyntaxError("'%s' takes at least one argument"
+                                  " (path to a view)" % bits[0])
+    viewname = parser.compile_filter(bits[1])
+    args = []
+    kwargs = {}
+    asvar = None
+    bits = bits[2:]
+    if len(bits) >= 2 and bits[-2] == 'as':
+        asvar = bits[-1]
+        bits = bits[:-2]
+
+    if len(bits):
+        for bit in bits:
+            match = kwarg_re.match(bit)
+            if not match:
+                raise TemplateSyntaxError("Malformed arguments to url tag")
+            name, value = match.groups()
+            if name:
+                kwargs[name] = parser.compile_filter(value)
+            else:
+                args.append(parser.compile_filter(value))
+
+    return URLNode(viewname, args, kwargs, asvar, legacy_view_name=False)
+
diff -r 9aed8047e568 docs/internals/deprecation.txt
--- a/docs/internals/deprecation.txt	Thu Nov 18 01:53:38 2010 +0000
+++ b/docs/internals/deprecation.txt	Thu Nov 18 22:04:47 2010 +0800
@@ -131,6 +131,11 @@
           been deprecated in favor of the
           :class:`~django.contrib.staticfiles.handlers.StaticFilesHandler`.
 
+        * The :ttag:`url` and :ttag:`ssi` template tags will be modified so that
+          the first argument to each tag is a template variable, not an implied
+          string. The new-style behavior is provided with the ``future_url`` and
+          ``future_ssi`` template tag libraries.
+
     * 2.0
         * ``django.views.defaults.shortcut()``. This function has been moved
           to ``django.contrib.contenttypes.views.shortcut()`` as part of the
diff -r 9aed8047e568 docs/ref/templates/builtins.txt
--- a/docs/ref/templates/builtins.txt	Thu Nov 18 01:53:38 2010 +0000
+++ b/docs/ref/templates/builtins.txt	Thu Nov 18 22:04:47 2010 +0800
@@ -838,6 +838,30 @@
 
 See also: ``{% include %}``.
 
+.. admonition:: Forwards compatibility
+
+    .. versionchanged:: 1.3
+
+    In Django 1.5, the behavior of the :ttag:`ssi` template tag will
+    change, with the the first argument being made into a context
+    variable, rather than being a special case unquoted constant. This
+    will allow the :ttag:`ssi` tag to use a context variable as the
+    value of the page to be included.
+
+    In order to provide a forwards compatibility path, Django 1.3
+    provides a compatibility library -- ``future_ssi`` -- that
+    implements the new behavior. To use this library, add a
+    :ttag:`load` call at the top of any template using the :ttag:`ssi`
+    tag, and wrap the first argument to the :ttag:`ssi` tag in quotes.
+    For example::
+
+        {% load future_ssi %}
+        {% ssi '/home/html/ljworld.com/includes/right_generic.html' %}
+
+    In Django 1.5, the unquoted constant behavior will be replaced
+    with the behavior provided by the ``future_ssi`` tag library.
+    Existing templates be migrated to use the new syntax.
+
 .. templatetag:: templatetag
 
 templatetag
@@ -955,10 +979,37 @@
     {% url path.to.view arg,arg2 %}
     {% url path.to.view arg, arg2 %}
 
-This syntax doesn't support the use of literal commas, or or equals
+This syntax doesn't support the use of literal commas, or equals
 signs. Did we mention you shouldn't use this syntax in any new
 projects?
 
+.. admonition:: Forwards compatibility
+
+    .. versionchanged:: 1.3
+
+    In Django 1.5, the behavior of the :ttag:`url` template tag will
+    change, with the the first argument being made into a context
+    variable, rather than being a special case unquoted constant. This
+    will allow the :ttag:`url` tag to use a context variable as the
+    value of the URL name to be reversed.
+
+    In order to provide a forwards compatibility path, Django 1.3
+    provides a compatibility library -- ``future_url`` -- that
+    implements the new behavior. To use this library, add a
+    :ttag:`load` call at the top of any template using the :ttag:`url`
+    tag, and wrap the first argument to the :ttag:`url` tag in quotes.
+    For example::
+
+        {% load future_url %}
+        {% url 'myapp:view-name' %}
+
+    The new library also formally deprecates the comma syntax for
+    separating arguments to the :ttag:`url` template tag.
+
+    In Django 1.5, the old behavior will be replaced with the behavior
+    provided by the ``future_url`` tag library. Existing templates be
+    migrated to use the new syntax.
+
 .. templatetag:: widthratio
 
 widthratio
diff -r 9aed8047e568 docs/releases/1.3.txt
--- a/docs/releases/1.3.txt	Thu Nov 18 01:53:38 2010 +0000
+++ b/docs/releases/1.3.txt	Thu Nov 18 22:04:47 2010 +0800
@@ -341,3 +341,45 @@
 redundancy, :class:`~django.test.simple.DjangoTestRunner` has been
 turned into an empty placeholder class, and will be removed entirely
 in Django 1.5.
+
+Changes to :ttag:`url` and :ttag:`ssi`
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+inconsistency. Most template tags will allow you to pass in either
+constants or variables as arguments -- for example::
+
+    {% extends "base.html" %}
+
+allows you to specify a base template as a constant, but if you have a
+context variable ``templ`` that contains the value ``base.html``::
+
+    {% extends templ %}
+
+is also legal.
+
+However, due to an accident of history, the :ttag:`url` and
+:ttag:`ssi` are different. These tags use the second, quoteless
+syntax, but interpret the argument as a constant. This means it isn't
+possible to use a context variable as the target of a :ttag:`url` and
+:ttag:`ssi` tag.
+
+Django 1.3 marks the start of the process to correct this historical
+accident. Django 1.3 adds two new template libraries -- ``future_url``
+and ``future_ssi`` -- which provide alternate implementations of the
+:ttag:`url` and :ttag:`ssi` template tags. These ``future`` libraries
+implement behavior that makes the handling of the first argument
+consistent with the handling of all other variables. So, an existing
+template that contains::
+
+    {% url sample %}
+
+should be replaced with::
+
+    {% load future_url %}
+    {% url 'sample' %}
+
+The tags implementing the old behavior have been deprecated, and in
+Django 1.5, the old behavior will be replaced with the new behavior.
+To ensure compatibility with future versions of Django, existing
+templates should be modified to use the new ``future`` libraries and
+syntax.
diff -r 9aed8047e568 tests/regressiontests/templates/templates/ssi_include.html
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/regressiontests/templates/templates/ssi_include.html	Thu Nov 18 22:04:47 2010 +0800
@@ -0,0 +1,1 @@
+This is for testing an ssi include. {{ test }}
diff -r 9aed8047e568 tests/regressiontests/templates/tests.py
--- a/tests/regressiontests/templates/tests.py	Thu Nov 18 01:53:38 2010 +0000
+++ b/tests/regressiontests/templates/tests.py	Thu Nov 18 22:04:47 2010 +0800
@@ -354,6 +354,10 @@
         old_invalid = settings.TEMPLATE_STRING_IF_INVALID
         expected_invalid_str = 'INVALID'
 
+        #Set ALLOWED_INCLUDE_ROOTS so that ssi works.
+        old_allowed_include_roots = settings.ALLOWED_INCLUDE_ROOTS
+        settings.ALLOWED_INCLUDE_ROOTS = os.path.dirname(os.path.abspath(__file__))
+
         # Warm the URL reversing cache. This ensures we don't pay the cost
         # warming the cache during one of the tests.
         urlresolvers.reverse('regressiontests.templates.views.client_action',
@@ -416,6 +420,7 @@
         deactivate()
         settings.TEMPLATE_DEBUG = old_td
         settings.TEMPLATE_STRING_IF_INVALID = old_invalid
+        settings.ALLOWED_INCLUDE_ROOTS = old_allowed_include_roots
 
         self.assertEqual(failures, [], "Tests failed:\n%s\n%s" %
             ('-'*70, ("\n%s\n" % ('-'*70)).join(failures)))
@@ -1179,6 +1184,30 @@
                           '{% endfor %},' + \
                           '{% endfor %}',
                           {}, ''),
+            ### SSI TAG ########################################################
+
+            # Test normal behavior
+            'old-ssi01': ('{%% ssi %s %%}' % os.path.join(os.path.dirname(os.path.abspath(__file__)), 'templates', 'ssi_include.html'), {}, 'This is for testing an ssi include. {{ test }}\n'),
+            'old-ssi02': ('{%% ssi %s %%}' % os.path.join(os.path.dirname(os.path.abspath(__file__)), 'not_here'), {}, ''),
+
+            # Test parsed output
+            'old-ssi06': ('{%% ssi %s parsed %%}' % os.path.join(os.path.dirname(os.path.abspath(__file__)), 'templates', 'ssi_include.html'), {'test': 'Look ma! It parsed!'}, 'This is for testing an ssi include. Look ma! It parsed!\n'),
+            'old-ssi07': ('{%% ssi %s parsed %%}' % os.path.join(os.path.dirname(os.path.abspath(__file__)), 'not_here'), {'test': 'Look ma! It parsed!'}, ''),
+
+            # Future compatibility
+            # Test normal behavior
+            'ssi01': ('{%% load future_ssi %%}{%% ssi "%s" %%}' % os.path.join(os.path.dirname(os.path.abspath(__file__)), 'templates', 'ssi_include.html'), {}, 'This is for testing an ssi include. {{ test }}\n'),
+            'ssi02': ('{%% load future_ssi %%}{%% ssi "%s" %%}' % os.path.join(os.path.dirname(os.path.abspath(__file__)), 'not_here'), {}, ''),
+            'ssi03': ("{%% load future_ssi %%}{%% ssi '%s' %%}" % os.path.join(os.path.dirname(os.path.abspath(__file__)), 'not_here'), {}, ''),
+
+            # Test passing as a variable
+            'ssi04': ('{% load future_ssi %}{% ssi ssi_file %}', {'ssi_file': os.path.join(os.path.dirname(os.path.abspath(__file__)), 'templates', 'ssi_include.html')}, 'This is for testing an ssi include. {{ test }}\n'),
+            'ssi05': ('{% load future_ssi %}{% ssi ssi_file %}', {'ssi_file': 'no_file'}, ''),
+
+            # Test parsed output
+            'ssi06': ('{%% load future_ssi %%}{%% ssi "%s" parsed %%}' % os.path.join(os.path.dirname(os.path.abspath(__file__)), 'templates', 'ssi_include.html'), {'test': 'Look ma! It parsed!'}, 'This is for testing an ssi include. Look ma! It parsed!\n'),
+            'ssi07': ('{%% load future_ssi %%}{%% ssi "%s" parsed %%}' % os.path.join(os.path.dirname(os.path.abspath(__file__)), 'not_here'), {'test': 'Look ma! It parsed!'}, ''),
+
 
             ### TEMPLATETAG TAG #######################################################
             'templatetag01': ('{% templatetag openblock %}', {}, '{%'),
@@ -1244,41 +1273,91 @@
             'legacyurl16a': ("{% url regressiontests.templates.views.client_action action='update',id='1' %}", {}, '/url_tag/client/1/update/'),
             'legacyurl17': ('{% url regressiontests.templates.views.client_action client_id=client.my_id,action=action %}', {'client': {'my_id': 1}, 'action': 'update'}, '/url_tag/client/1/update/'),
 
-            'url01': ('{% url regressiontests.templates.views.client client.id %}', {'client': {'id': 1}}, '/url_tag/client/1/'),
-            'url02': ('{% url regressiontests.templates.views.client_action id=client.id action="update" %}', {'client': {'id': 1}}, '/url_tag/client/1/update/'),
-            'url02a': ('{% url regressiontests.templates.views.client_action client.id "update" %}', {'client': {'id': 1}}, '/url_tag/client/1/update/'),
-            'url02b': ("{% url regressiontests.templates.views.client_action id=client.id action='update' %}", {'client': {'id': 1}}, '/url_tag/client/1/update/'),
-            'url02c': ("{% url regressiontests.templates.views.client_action client.id 'update' %}", {'client': {'id': 1}}, '/url_tag/client/1/update/'),
-            'url03': ('{% url regressiontests.templates.views.index %}', {}, '/url_tag/'),
-            'url04': ('{% url named.client client.id %}', {'client': {'id': 1}}, '/url_tag/named-client/1/'),
-            'url05': (u'{% url метка_оператора v %}', {'v': u'Ω'}, '/url_tag/%D0%AE%D0%BD%D0%B8%D0%BA%D0%BE%D0%B4/%CE%A9/'),
-            'url06': (u'{% url метка_оператора_2 tag=v %}', {'v': u'Ω'}, '/url_tag/%D0%AE%D0%BD%D0%B8%D0%BA%D0%BE%D0%B4/%CE%A9/'),
-            'url07': (u'{% url regressiontests.templates.views.client2 tag=v %}', {'v': u'Ω'}, '/url_tag/%D0%AE%D0%BD%D0%B8%D0%BA%D0%BE%D0%B4/%CE%A9/'),
-            'url08': (u'{% url метка_оператора v %}', {'v': 'Ω'}, '/url_tag/%D0%AE%D0%BD%D0%B8%D0%BA%D0%BE%D0%B4/%CE%A9/'),
-            'url09': (u'{% url метка_оператора_2 tag=v %}', {'v': 'Ω'}, '/url_tag/%D0%AE%D0%BD%D0%B8%D0%BA%D0%BE%D0%B4/%CE%A9/'),
-            'url10': ('{% url regressiontests.templates.views.client_action id=client.id action="two words" %}', {'client': {'id': 1}}, '/url_tag/client/1/two%20words/'),
-            'url11': ('{% url regressiontests.templates.views.client_action id=client.id action="==" %}', {'client': {'id': 1}}, '/url_tag/client/1/==/'),
-            'url12': ('{% url regressiontests.templates.views.client_action id=client.id action="," %}', {'client': {'id': 1}}, '/url_tag/client/1/,/'),
-            'url13': ('{% url regressiontests.templates.views.client_action id=client.id action=arg|join:"-" %}', {'client': {'id': 1}, 'arg':['a','b']}, '/url_tag/client/1/a-b/'),
-            'url14': ('{% url regressiontests.templates.views.client_action client.id arg|join:"-" %}', {'client': {'id': 1}, 'arg':['a','b']}, '/url_tag/client/1/a-b/'),
-            'url15': ('{% url regressiontests.templates.views.client_action 12 "test" %}', {}, '/url_tag/client/12/test/'),
-            'url18': ('{% url regressiontests.templates.views.client "1,2" %}', {}, '/url_tag/client/1,2/'),
+            'old-url01': ('{% url regressiontests.templates.views.client client.id %}', {'client': {'id': 1}}, '/url_tag/client/1/'),
+            'old-url02': ('{% url regressiontests.templates.views.client_action id=client.id action="update" %}', {'client': {'id': 1}}, '/url_tag/client/1/update/'),
+            'old-url02a': ('{% url regressiontests.templates.views.client_action client.id "update" %}', {'client': {'id': 1}}, '/url_tag/client/1/update/'),
+            'old-url02b': ("{% url regressiontests.templates.views.client_action id=client.id action='update' %}", {'client': {'id': 1}}, '/url_tag/client/1/update/'),
+            'old-url02c': ("{% url regressiontests.templates.views.client_action client.id 'update' %}", {'client': {'id': 1}}, '/url_tag/client/1/update/'),
+            'old-url03': ('{% url regressiontests.templates.views.index %}', {}, '/url_tag/'),
+            'old-url04': ('{% url named.client client.id %}', {'client': {'id': 1}}, '/url_tag/named-client/1/'),
+            'old-url05': (u'{% url метка_оператора v %}', {'v': u'Ω'}, '/url_tag/%D0%AE%D0%BD%D0%B8%D0%BA%D0%BE%D0%B4/%CE%A9/'),
+            'old-url06': (u'{% url метка_оператора_2 tag=v %}', {'v': u'Ω'}, '/url_tag/%D0%AE%D0%BD%D0%B8%D0%BA%D0%BE%D0%B4/%CE%A9/'),
+            'old-url07': (u'{% url regressiontests.templates.views.client2 tag=v %}', {'v': u'Ω'}, '/url_tag/%D0%AE%D0%BD%D0%B8%D0%BA%D0%BE%D0%B4/%CE%A9/'),
+            'old-url08': (u'{% url метка_оператора v %}', {'v': 'Ω'}, '/url_tag/%D0%AE%D0%BD%D0%B8%D0%BA%D0%BE%D0%B4/%CE%A9/'),
+            'old-url09': (u'{% url метка_оператора_2 tag=v %}', {'v': 'Ω'}, '/url_tag/%D0%AE%D0%BD%D0%B8%D0%BA%D0%BE%D0%B4/%CE%A9/'),
+            'old-url10': ('{% url regressiontests.templates.views.client_action id=client.id action="two words" %}', {'client': {'id': 1}}, '/url_tag/client/1/two%20words/'),
+            'old-url11': ('{% url regressiontests.templates.views.client_action id=client.id action="==" %}', {'client': {'id': 1}}, '/url_tag/client/1/==/'),
+            'old-url12': ('{% url regressiontests.templates.views.client_action id=client.id action="," %}', {'client': {'id': 1}}, '/url_tag/client/1/,/'),
+            'old-url13': ('{% url regressiontests.templates.views.client_action id=client.id action=arg|join:"-" %}', {'client': {'id': 1}, 'arg':['a','b']}, '/url_tag/client/1/a-b/'),
+            'old-url14': ('{% url regressiontests.templates.views.client_action client.id arg|join:"-" %}', {'client': {'id': 1}, 'arg':['a','b']}, '/url_tag/client/1/a-b/'),
+            'old-url15': ('{% url regressiontests.templates.views.client_action 12 "test" %}', {}, '/url_tag/client/12/test/'),
+            'old-url18': ('{% url regressiontests.templates.views.client "1,2" %}', {}, '/url_tag/client/1,2/'),
 
             # Failures
-            'url-fail01': ('{% url %}', {}, template.TemplateSyntaxError),
-            'url-fail02': ('{% url no_such_view %}', {}, urlresolvers.NoReverseMatch),
-            'url-fail03': ('{% url regressiontests.templates.views.client %}', {}, urlresolvers.NoReverseMatch),
-            'url-fail04': ('{% url view id, %}', {}, template.TemplateSyntaxError),
-            'url-fail05': ('{% url view id= %}', {}, template.TemplateSyntaxError),
-            'url-fail06': ('{% url view a.id=id %}', {}, template.TemplateSyntaxError),
-            'url-fail07': ('{% url view a.id!id %}', {}, template.TemplateSyntaxError),
-            'url-fail08': ('{% url view id="unterminatedstring %}', {}, template.TemplateSyntaxError),
-            'url-fail09': ('{% url view id=", %}', {}, template.TemplateSyntaxError),
+            'old-url-fail01': ('{% url %}', {}, template.TemplateSyntaxError),
+            'old-url-fail02': ('{% url no_such_view %}', {}, urlresolvers.NoReverseMatch),
+            'old-url-fail03': ('{% url regressiontests.templates.views.client %}', {}, urlresolvers.NoReverseMatch),
+            'old-url-fail04': ('{% url view id, %}', {}, template.TemplateSyntaxError),
+            'old-url-fail05': ('{% url view id= %}', {}, template.TemplateSyntaxError),
+            'old-url-fail06': ('{% url view a.id=id %}', {}, template.TemplateSyntaxError),
+            'old-url-fail07': ('{% url view a.id!id %}', {}, template.TemplateSyntaxError),
+            'old-url-fail08': ('{% url view id="unterminatedstring %}', {}, template.TemplateSyntaxError),
+            'old-url-fail09': ('{% url view id=", %}', {}, template.TemplateSyntaxError),
 
             # {% url ... as var %}
-            'url-asvar01': ('{% url regressiontests.templates.views.index as url %}', {}, ''),
-            'url-asvar02': ('{% url regressiontests.templates.views.index as url %}{{ url }}', {}, '/url_tag/'),
-            'url-asvar03': ('{% url no_such_view as url %}{{ url }}', {}, ''),
+            'old-url-asvar01': ('{% url regressiontests.templates.views.index as url %}', {}, ''),
+            'old-url-asvar02': ('{% url regressiontests.templates.views.index as url %}{{ url }}', {}, '/url_tag/'),
+            'old-url-asvar03': ('{% url no_such_view as url %}{{ url }}', {}, ''),
+
+            # forward compatibility
+            # Successes
+            'url01': ('{% load future_url %}{% url "regressiontests.templates.views.client" client.id %}', {'client': {'id': 1}}, '/url_tag/client/1/'),
+            'url02': ('{% load future_url %}{% url "regressiontests.templates.views.client_action" id=client.id action="update" %}', {'client': {'id': 1}}, '/url_tag/client/1/update/'),
+            'url02a': ('{% load future_url %}{% url "regressiontests.templates.views.client_action" client.id "update" %}', {'client': {'id': 1}}, '/url_tag/client/1/update/'),
+            'url02b': ("{% load future_url %}{% url 'regressiontests.templates.views.client_action' id=client.id action='update' %}", {'client': {'id': 1}}, '/url_tag/client/1/update/'),
+            'url02c': ("{% load future_url %}{% url 'regressiontests.templates.views.client_action' client.id 'update' %}", {'client': {'id': 1}}, '/url_tag/client/1/update/'),
+            'url03': ('{% load future_url %}{% url "regressiontests.templates.views.index" %}', {}, '/url_tag/'),
+            'url04': ('{% load future_url %}{% url "named.client" client.id %}', {'client': {'id': 1}}, '/url_tag/named-client/1/'),
+            'url05': (u'{% load future_url %}{% url "метка_оператора" v %}', {'v': u'Ω'}, '/url_tag/%D0%AE%D0%BD%D0%B8%D0%BA%D0%BE%D0%B4/%CE%A9/'),
+            'url06': (u'{% load future_url %}{% url "метка_оператора_2" tag=v %}', {'v': u'Ω'}, '/url_tag/%D0%AE%D0%BD%D0%B8%D0%BA%D0%BE%D0%B4/%CE%A9/'),
+            'url07': (u'{% load future_url %}{% url "regressiontests.templates.views.client2" tag=v %}', {'v': u'Ω'}, '/url_tag/%D0%AE%D0%BD%D0%B8%D0%BA%D0%BE%D0%B4/%CE%A9/'),
+            'url08': (u'{% load future_url %}{% url "метка_оператора" v %}', {'v': 'Ω'}, '/url_tag/%D0%AE%D0%BD%D0%B8%D0%BA%D0%BE%D0%B4/%CE%A9/'),
+            'url09': (u'{% load future_url %}{% url "метка_оператора_2" tag=v %}', {'v': 'Ω'}, '/url_tag/%D0%AE%D0%BD%D0%B8%D0%BA%D0%BE%D0%B4/%CE%A9/'),
+            'url10': ('{% load future_url %}{% url "regressiontests.templates.views.client_action" id=client.id action="two words" %}', {'client': {'id': 1}}, '/url_tag/client/1/two%20words/'),
+            'url11': ('{% load future_url %}{% url "regressiontests.templates.views.client_action" id=client.id action="==" %}', {'client': {'id': 1}}, '/url_tag/client/1/==/'),
+            'url12': ('{% load future_url %}{% url "regressiontests.templates.views.client_action" id=client.id action="," %}', {'client': {'id': 1}}, '/url_tag/client/1/,/'),
+            'url13': ('{% load future_url %}{% url "regressiontests.templates.views.client_action" id=client.id action=arg|join:"-" %}', {'client': {'id': 1}, 'arg':['a','b']}, '/url_tag/client/1/a-b/'),
+            'url14': ('{% load future_url %}{% url "regressiontests.templates.views.client_action" client.id arg|join:"-" %}', {'client': {'id': 1}, 'arg':['a','b']}, '/url_tag/client/1/a-b/'),
+            'url15': ('{% load future_url %}{% url "regressiontests.templates.views.client_action" 12 "test" %}', {}, '/url_tag/client/12/test/'),
+            'url18': ('{% load future_url %}{% url "regressiontests.templates.views.client" "1,2" %}', {}, '/url_tag/client/1,2/'),
+
+            'url19': ('{% load future_url %}{% url named_url client.id %}', {'named_url': 'regressiontests.templates.views.client', 'client': {'id': 1}}, '/url_tag/client/1/'),
+
+            # Failures
+            'url-fail01': ('{% load future_url %}{% url %}', {}, template.TemplateSyntaxError),
+            'url-fail02': ('{% load future_url %}{% url "no_such_view" %}', {}, urlresolvers.NoReverseMatch),
+            'url-fail03': ('{% load future_url %}{% url "regressiontests.templates.views.client" %}', {}, urlresolvers.NoReverseMatch),
+            'url-fail04': ('{% load future_url %}{% url "view" id, %}', {}, template.TemplateSyntaxError),
+            'url-fail05': ('{% load future_url %}{% url "view" id= %}', {}, template.TemplateSyntaxError),
+            'url-fail06': ('{% load future_url %}{% url "view" a.id=id %}', {}, template.TemplateSyntaxError),
+            'url-fail07': ('{% load future_url %}{% url "view" a.id!id %}', {}, template.TemplateSyntaxError),
+            'url-fail08': ('{% load future_url %}{% url "view" id="unterminatedstring %}', {}, template.TemplateSyntaxError),
+            'url-fail09': ('{% load future_url %}{% url "view" id=", %}', {}, template.TemplateSyntaxError),
+
+            'url-fail11': ('{% load future_url %}{% url named_url %}', {}, urlresolvers.NoReverseMatch),
+            'url-fail12': ('{% load future_url %}{% url named_url %}', {'named_url': 'no_such_view'}, urlresolvers.NoReverseMatch),
+            'url-fail13': ('{% load future_url %}{% url named_url %}', {'named_url': 'regressiontests.templates.views.client'}, urlresolvers.NoReverseMatch),
+            'url-fail14': ('{% load future_url %}{% url named_url id, %}', {'named_url': 'view'}, template.TemplateSyntaxError),
+            'url-fail15': ('{% load future_url %}{% url named_url id= %}', {'named_url': 'view'}, template.TemplateSyntaxError),
+            'url-fail16': ('{% load future_url %}{% url named_url a.id=id %}', {'named_url': 'view'}, template.TemplateSyntaxError),
+            'url-fail17': ('{% load future_url %}{% url named_url a.id!id %}', {'named_url': 'view'}, template.TemplateSyntaxError),
+            'url-fail18': ('{% load future_url %}{% url named_url id="unterminatedstring %}', {'named_url': 'view'}, template.TemplateSyntaxError),
+            'url-fail19': ('{% load future_url %}{% url named_url id=", %}', {'named_url': 'view'}, template.TemplateSyntaxError),
+
+            # {% url ... as var %}
+            'url-asvar01': ('{% load future_url %}{% url "regressiontests.templates.views.index" as url %}', {}, ''),
+            'url-asvar02': ('{% load future_url %}{% url "regressiontests.templates.views.index" as url %}{{ url }}', {}, '/url_tag/'),
+            'url-asvar03': ('{% load future_url %}{% url "no_such_view" as url %}{{ url }}', {}, ''),
 
             ### CACHE TAG ######################################################
             'cache01': ('{% load cache %}{% cache -1 test %}cache01{% endcache %}', {}, 'cache01'),
