Index: django/template/defaulttags.py
===================================================================
--- django/template/defaulttags.py	(revision 4835)
+++ django/template/defaulttags.py	(working copy)
@@ -280,6 +280,24 @@
     def render(self, context):
         return ''
 
+class LoremNode(Node):
+    def __init__(self, count, method, common):
+        self.count, self.method, self.common = count, method, common
+
+    def render(self, context):
+        from django.utils.lorem_ipsum import words, paragraphs
+        try:
+            count = int(self.count.resolve(context))
+        except (ValueError, TypeError):
+            count = 1
+        if self.method == 'w':
+            return words(count, common=self.common)
+        else:
+            paras = paragraphs(count, common=self.common)
+        if self.method == 'p':
+            paras = ['<p>%s</p>' % p for p in paras]
+        return '\n\n'.join(paras)
+
 class NowNode(Node):
     def __init__(self, format_string):
         self.format_string = format_string
@@ -769,6 +787,52 @@
 load = register.tag(load)
 
 #@register.tag
+def lorem(parser, token):
+    """
+    Creates random latin text useful for providing test data in templates.
+
+    Usage format::
+
+        {% lorem [count] [method] [random] %}
+
+    ``count`` is a number (or variable) containing the number of paragraphs or
+    words to generate (default is 1).
+
+    ``method`` is either ``w`` for words, ``p`` for HTML paragraphs, ``b`` for
+    plain-text paragraph blocks (default is ``b``).
+
+    ``random`` is the word ``random``, which if given, does not use the common
+    paragraph (starting "Lorem ipsum dolor sit amet, consectetuer...").
+
+    Examples:
+        * ``{% lorem %}`` will output the common "lorem ipsum" paragraph
+        * ``{% lorem 3 p %}`` will output the common "lorem ipsum" paragraph
+          and two random paragraphs each wrapped in HTML ``<p>`` tags
+        * ``{% lorem 2 w random %}`` will output two random latin words
+    """
+    bits = list(token.split_contents())
+    tagname = bits[0]
+    # Random bit
+    common = bits[-1] != 'random'
+    if not common:
+        bits.pop()
+    # Method bit
+    if bits[-1] in ('w', 'p', 'b'):
+        method = bits.pop()
+    else:
+        method = 'b'
+    # Count bit
+    if len(bits) > 1:
+        count = bits.pop()
+    else:
+        count = '1'
+    count = parser.compile_filter(count)
+    if len(bits) != 1:
+        raise TemplateSyntaxError, "Incorrect format for %r tag" % tagname
+    return LoremNode(count, method, common)
+lorem = register.tag(lorem)    
+
+#@register.tag
 def now(parser, token):
     """
     Display the date, formatted according to the given string.
Index: django/utils/lorem_ipsum.py
===================================================================
--- django/utils/lorem_ipsum.py	(revision 0)
+++ django/utils/lorem_ipsum.py	(revision 0)
@@ -0,0 +1,58 @@
+import random
+
+COMMON_P = 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.'
+WORDS = ('exercitationem', 'perferendis', 'perspiciatis', 'laborum', 'eveniet', 'sunt', 'iure', 'nam', 'nobis', 'eum', 'cum', 'officiis', 'excepturi', 'odio', 'consectetur', 'quasi', 'aut', 'quisquam', 'vel', 'eligendi', 'itaque', 'non', 'odit', 'tempore', 'quaerat', 'dignissimos', 'facilis', 'neque', 'nihil', 'expedita', 'vitae', 'vero', 'ipsum', 'nisi', 'animi', 'cumque', 'pariatur', 'velit', 'modi', 'natus', 'iusto', 'eaque', 'sequi', 'illo', 'sed', 'ex', 'et', 'voluptatibus', 'tempora', 'veritatis', 'ratione', 'assumenda', 'incidunt', 'nostrum', 'placeat', 'aliquid', 'fuga', 'provident', 'praesentium', 'rem', 'necessitatibus', 'suscipit', 'adipisci', 'quidem', 'possimus', 'voluptas', 'debitis', 'sint', 'accusantium', 'unde', 'sapiente', 'voluptate', 'qui', 'aspernatur', 'laudantium', 'soluta', 'amet', 'quo', 'aliquam', 'saepe', 'culpa', 'libero', 'ipsa', 'dicta', 'reiciendis', 'nesciunt', 'doloribus', 'autem', 'impedit', 'minima', 'maiores', 'repudiandae', 'ipsam', 'obcaecati', 'ullam', 'enim', 'totam', 'delectus', 'ducimus', 'quis', 'voluptates', 'dolores', 'molestiae', 'harum', 'dolorem', 'quia', 'voluptatem', 'molestias', 'magni', 'distinctio', 'omnis', 'illum', 'dolorum', 'voluptatum', 'ea', 'quas', 'quam', 'corporis', 'quae', 'blanditiis', 'atque', 'deserunt', 'laboriosam', 'earum', 'consequuntur', 'hic', 'cupiditate', 'quibusdam', 'accusamus', 'ut', 'rerum', 'error', 'minus', 'eius', 'ab', 'ad', 'nemo', 'fugit', 'officia', 'at', 'in', 'id', 'quos', 'reprehenderit', 'numquam', 'iste', 'fugiat', 'sit', 'inventore', 'beatae', 'repellendus', 'magnam', 'recusandae', 'quod', 'explicabo', 'doloremque', 'aperiam', 'consequatur', 'asperiores', 'commodi', 'optio', 'dolor', 'labore', 'temporibus', 'repellat', 'veniam', 'architecto', 'est', 'esse', 'mollitia', 'nulla', 'a', 'similique', 'eos', 'alias', 'dolore', 'tenetur', 'deleniti', 'porro', 'facere', 'maxime', 'corrupti')
+COMMON_WORDS = ('lorem', 'ipsum', 'dolor', 'sit', 'amet', 'consectetur', 'adipisicing', 'elit', 'sed', 'do', 'eiusmod', 'tempor', 'incididunt', 'ut', 'labore', 'et', 'dolore', 'magna', 'aliqua')
+
+def sentence():
+    sentence = []
+    # Determine the number of comma separated sections and number of words in
+    # each section for this sentence.
+    section_count = random.randint(1, 5)
+    section_max_length = 12 - section_count
+    section_lengths = []
+    length = 0
+    for i in range(section_count):
+        section_length = random.randint(3, section_max_length)
+        length += section_length
+        section_lengths.append(section_length)
+    # Fill each comma seperated section from the sample of latin words.
+    words = random.sample(WORDS, length)
+    for section_length in section_lengths:
+        section = []
+        for i in range(section_length):
+            section.append(words.pop())
+        sentence.append(' '.join(section))
+    sentence = ', '.join(sentence)
+    # Convert to sentence case and add end punctuation.
+    sentence = '%s%s%s' % (sentence[0].upper(), sentence[1:], random.choice('?.'))
+    return sentence
+
+def paragraph():
+    paragraph = []
+    for i in range(random.randint(1, 4)):
+        paragraph.append(sentence())
+    return ' '.join(paragraph)
+
+def paragraphs(count, common=True):
+    paragraphs = []
+    for i in range(count):
+        if i == 0 and common:
+            paragraphs.append(COMMON_P)
+        else:
+            paragraphs.append(paragraph())
+    return paragraphs
+
+def words(count, common=True):
+    if common:
+        words = list(COMMON_WORDS)
+    else:
+        words = []
+    c = len(words)
+    if count > c:
+        count = min(count - c, len(WORDS))
+        words += random.sample(WORDS, count - c)
+    else:
+        words = words[:count]
+    return ' '.join(words)
+
Index: docs/templates.txt
===================================================================
--- docs/templates.txt	(revision 4835)
+++ docs/templates.txt	(working copy)
@@ -625,6 +625,31 @@
 
 See `Custom tag and filter libraries`_ for more information.
 
+lorem
+~~~~~
+
+Display random latin text useful for providing test data in templates.
+
+Usage format: ``{% lorem [count] [method] [random] %}``
+
+    ===========  =============================================================
+    Argument     Description
+    ===========  =============================================================
+    ``count``    A number (or variable) containing the number of paragraphs or
+                 words to generate (default is 1).
+    ``method``   Either ``w`` for words, ``p`` for HTML paragraphs or ``b``
+                 for plain-text paragraph blocks (default is ``b``).
+    ``random``   The word ``random``, which if given, does not use the common
+                 paragraph ("Lorem ipsum dolor sit amet...") when generating
+                 text.
+
+Examples:
+
+    * ``{% lorem %}`` will output the common "lorem ipsum" paragraph.
+    * ``{% lorem 3 p %}`` will output the common "lorem ipsum" paragraph
+      and two random paragraphs each wrapped in HTML ``<p>`` tags.
+    * ``{% lorem 2 w random %}`` will output two random latin words.
+
 now
 ~~~
 
Index: tests/regressiontests/templates/tests.py
===================================================================
--- tests/regressiontests/templates/tests.py	(revision 4835)
+++ tests/regressiontests/templates/tests.py	(working copy)
@@ -654,6 +654,11 @@
             'with01': ('{% with dict.key as key %}{{ key }}{% endwith %}', {'dict': {'key':50}}, '50'),
             'with02': ('{{ key }}{% with dict.key as key %}{{ key }}-{{ dict.key }}-{{ key }}{% endwith %}{{ key }}', {'dict': {'key':50}}, ('50-50-50', 'INVALID50-50-50INVALID')),
 
+            ### LOREM TAG ######################################################
+            'lorem01': ('{% lorem %}', {}, 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.'),
+            'lorem02': ('{% lorem p %}', {}, '<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>'),
+            'lorem03': ('{% lorem 6 w %}', {}, 'lorem ipsum dolor sit amet consectetur'),
+
             ### NOW TAG ########################################################
             # Simple case
             'now01' : ('{% now "j n Y"%}', {}, str(datetime.now().day) + ' ' + str(datetime.now().month) + ' ' + str(datetime.now().year)),
