Index: django/template/defaultfilters.py
===================================================================
--- django/template/defaultfilters.py	(revision 13854)
+++ django/template/defaultfilters.py	(working copy)
@@ -426,6 +426,7 @@
     Converts all newlines in a piece of plain text to HTML line breaks
     (``<br />``).
     """
+    value = re.sub(r'\r\n|\r|\n', '\n', force_unicode(value)) # normalize newlines
     if autoescape and not isinstance(value, SafeData):
         from django.utils.html import escape
         value = escape(value)
Index: tests/regressiontests/defaultfilters/tests.py
===================================================================
--- tests/regressiontests/defaultfilters/tests.py	(revision 13854)
+++ tests/regressiontests/defaultfilters/tests.py	(working copy)
@@ -266,6 +266,15 @@
 >>> linebreaks(u'line 1\nline 2')
 u'<p>line 1<br />line 2</p>'
 
+>>> linebreaks(u'line 1\r\nline 2')
+u'<p>line 1<br />line 2</p>'
+
+>>> linebreaksbr(u'line 1\nline 2')
+u'line 1<br />line 2'
+
+>>> linebreaksbr(u'line 1\r\nline 2')
+u'line 1<br />line 2'
+
 >>> removetags(u'some <b>html</b> with <script>alert("You smell")</script> disallowed <img /> tags', 'script img')
 u'some <b>html</b> with alert("You smell") disallowed  tags'
 
