diff --git a/django/templatetags/i18n.py b/django/templatetags/i18n.py
--- a/django/templatetags/i18n.py
+++ b/django/templatetags/i18n.py
@@ -96,13 +96,15 @@
 
 class BlockTranslateNode(Node):
     def __init__(self, extra_context, singular, plural=None, countervar=None,
-            counter=None, message_context=None):
+            counter=None, message_context=None, plural_vname_var=None, plural_vname=None):
         self.extra_context = extra_context
         self.singular = singular
         self.plural = plural
         self.countervar = countervar
         self.counter = counter
         self.message_context = message_context
+        self.plural_vname_var = plural_vname_var
+        self.plural_vname = plural_vname
 
     def render_token_list(self, tokens):
         result = []
@@ -129,9 +131,12 @@
         singular, vars = self.render_token_list(self.singular)
         # Escape all isolated '%'
         singular = re.sub(u'%(?!\()', u'%%', singular)
+        count, plural_vname = None, None
         if self.plural and self.countervar and self.counter:
             count = self.counter.resolve(context)
             context[self.countervar] = count
+            if self.plural_vname_var is not None and self.plural_vname is not None:
+                plural_vname = self.plural_vname.resolve(context)
             plural, plural_vars = self.render_token_list(self.plural)
             plural = re.sub(u'%(?!\()', u'%%', plural)
             if message_context:
@@ -145,6 +150,9 @@
                 result = translation.pgettext(message_context, singular)
             else:
                 result = translation.ugettext(singular)
+        if count not in (1, None) and plural_vname is not None: # TODO: Hardcoding 1 isn't right
+            #print 'setting context["%s"] = "%s" to render "%s"' % (self.plural_vname_var, plural_vname, result)
+            context[self.plural_vname_var] = plural_vname
         data = dict([(v, _render_value_in_context(context.get(v, ''), context)) for v in vars])
         context.pop()
         try:
@@ -432,6 +440,7 @@
     else:
         message_context = None
     extra_context = options.get('with', {})
+    plural_vname_var, plural_vname = None, None
 
     singular = []
     plural = []
@@ -442,8 +451,34 @@
         else:
             break
     if countervar and counter:
-        if token.contents.strip() != 'plural':
-            raise TemplateSyntaxError("'blocktrans' doesn't allow other block tags inside it")
+        if not token.contents.lstrip().startswith('plural'):
+            raise TemplateSyntaxError("'blocktrans' doesn't allow other block tags inside it (%s)" % token.contents.strip())
+        else:
+            poptions = {}
+            bits = token.split_contents()
+            remaining_bits = bits[1:]
+            while remaining_bits:
+                option = remaining_bits.pop(0)
+                if option in poptions:
+                    raise TemplateSyntaxError('The %r option was specified more '
+                                            'than once.' % option)
+                if option == 'with':
+                    pvalue = token_kwargs(remaining_bits, parser, support_legacy=False)
+                    if len(pvalue) != 1:
+                        raise TemplateSyntaxError('"with" in %r section of blocktrans tag accepts only '
+                                                'one keyword argument.' % bits[0])
+                    if pvalue.keys()[0] not in options['with']:
+                        raise TemplateSyntaxError(
+                            'blocktrans: Pluralized verbose name variable '
+                            'specified in plural section should have the same '
+                            'name as the one in the singular section')
+                else:
+                    raise TemplateSyntaxError('Unknown argument for %r tag: %r.' %
+                                            (bits[0], option))
+                poptions[option] = pvalue
+            plural_vname = poptions.get('with')
+            if 'with' in poptions:
+                plural_vname_var, plural_vname = poptions['with'].items()[0]
         while parser.tokens:
             token = parser.next_token()
             if token.token_type in (TOKEN_VAR, TOKEN_TEXT):
@@ -454,7 +489,7 @@
         raise TemplateSyntaxError("'blocktrans' doesn't allow other block tags (seen %r) inside it" % token.contents)
 
     return BlockTranslateNode(extra_context, singular, plural, countervar,
-            counter, message_context)
+            counter, message_context, plural_vname_var, plural_vname)
 
 @register.tag
 def language(parser, token):
diff --git a/tests/regressiontests/templates/tests.py b/tests/regressiontests/templates/tests.py
--- a/tests/regressiontests/templates/tests.py
+++ b/tests/regressiontests/templates/tests.py
@@ -1305,6 +1305,15 @@
             'i18n36': ('{% load i18n %}{% trans "Page not found" as page_not_found noop %}{{ page_not_found }}', {'LANGUAGE_CODE': 'de'}, "Page not found"),
             'i18n37': ('{% load i18n %}{% trans "Page not found" as page_not_found %}{% blocktrans %}Error: {{ page_not_found }}{% endblocktrans %}', {'LANGUAGE_CODE': 'de'}, "Error: Seite nicht gefunden"),
 
+            # New in 1.4: When the plural form functionality is used with a
+            # count variable, the plural inner tag can specify one var binding
+            # that overrides a similarly named one declared in the main tag body
+            'i18n38': ('{% load i18n %}{% blocktrans with name=singular_name count counter=number %}singular: {{ counter }} {{ name }}{% plural with name=plural_name %}plural: {{ counter }} {{ name }}{% endblocktrans %}', {'number': 1, 'singular_name': 'pony', 'plural_name': 'ponies'}, u"singular: 1 pony"),
+            'i18n39': ('{% load i18n %}{% blocktrans with name=singular_name count counter=number %}singular: {{ counter }} {{ name }}{% plural with name=plural_name %}plural: {{ counter }} {{ name }}{% endblocktrans %}', {'number': 2, 'singular_name': 'pony', 'plural_name': 'ponies'}, u"plural: 2 ponies"),
+            'i18n40': ('{% load i18n %}{% blocktrans with name=singular_name count counter=number %}singular: {{ counter }} {{ name }}{% plural with name=plural_name foo="bar" %}plural: {{ counter }} {{ name }}{% endblocktrans %}', {'number': 2, 'singular_name': 'pony', 'plural_name': 'ponies'}, template.TemplateSyntaxError),
+            'i18n41': ('{% load i18n %}{% blocktrans with name=singular_name %}singular: {{ counter }} {{ name }}{% plural with name=plural_name %}plural: {{ counter }} {{ name }}{% endblocktrans %}', {'number': 2, 'singular_name': 'pony', 'plural_name': 'ponies'}, template.TemplateSyntaxError),
+            'i18n42': ('{% load i18n %}{% blocktrans with name=singular_name count counter=number %}singular: {{ counter }} {{ name}}{% plural foo %}plural: {{ counter }} {{ name }}{% endblocktrans %}', {'number': 2, 'singular_name': 'pony'}, template.TemplateSyntaxError),
+
             ### HANDLING OF TEMPLATE_STRING_IF_INVALID ###################################
 
             'invalidstr01': ('{{ var|default:"Foo" }}', {}, ('Foo','INVALID')),
