diff --git a/django/template/defaultfilters.py b/django/template/defaultfilters.py
index 60fa59e..5c9e0f7 100644
--- a/django/template/defaultfilters.py
+++ b/django/template/defaultfilters.py
@@ -414,7 +414,9 @@ def linebreaksbr(value, autoescape=None):
     Converts all newlines in a piece of plain text to HTML line breaks
     (``<br />``).
     """
-    if autoescape and not isinstance(value, SafeData):
+    autoescape = autoescape and not isinstance(value, SafeData)
+    value = re.sub(r'\r\n|\r|\n', '\n', force_unicode(value)) # normalize newlines
+    if autoescape:
         from django.utils.html import escape
         value = escape(value)
     return mark_safe(value.replace('\n', '<br />'))
diff --git a/tests/regressiontests/defaultfilters/tests.py b/tests/regressiontests/defaultfilters/tests.py
index 77bd2ba..b471205 100644
--- a/tests/regressiontests/defaultfilters/tests.py
+++ b/tests/regressiontests/defaultfilters/tests.py
@@ -266,6 +266,18 @@ class DefaultFiltersTests(TestCase):
         self.assertEqual(linebreaks(u'line 1'), u'<p>line 1</p>')
         self.assertEqual(linebreaks(u'line 1\nline 2'),
                           u'<p>line 1<br />line 2</p>')
+        self.assertEqual(linebreaks(u'line 1\rline 2'),
+                          u'<p>line 1<br />line 2</p>')
+        self.assertEqual(linebreaks(u'line 1\r\nline 2'),
+                          u'<p>line 1<br />line 2</p>')
+    
+    def test_linebreaksbr(self):
+        self.assertEqual(linebreaksbr(u'line 1\nline 2'),
+                          u'line 1<br />line 2')
+        self.assertEqual(linebreaksbr(u'line 1\rline 2'), 
+                          u'line 1<br />line 2')
+        self.assertEqual(linebreaksbr(u'line 1\r\nline 2'), 
+                          u'line 1<br />line 2')
 
     def test_removetags(self):
         self.assertEqual(removetags(u'some <b>html</b> with <script>alert'\
