diff --git a/reviewboard/diffviewer/evolutions/__init__.py b/reviewboard/diffviewer/evolutions/__init__.py
index 05096bf59aed9f21cd16ac9198a5e2a45a0004a6..715fa8bd7a1ef1faddff0afe144245ea7fa2b30b 100644
--- a/reviewboard/diffviewer/evolutions/__init__.py
+++ b/reviewboard/diffviewer/evolutions/__init__.py
@@ -13,4 +13,5 @@ SEQUENCE = [
     'filediffdata_extra_data',
     'all_extra_data',
     'raw_diff_file_data',
+    'crlf',
 ]
diff --git a/reviewboard/diffviewer/evolutions/crlf.py b/reviewboard/diffviewer/evolutions/crlf.py
new file mode 100644
index 0000000000000000000000000000000000000000..b0deac0d4bc50b00e904bce30d757ac5fae9338f
--- /dev/null
+++ b/reviewboard/diffviewer/evolutions/crlf.py
@@ -0,0 +1,7 @@
+from django.db.models import BooleanField
+from django_evolution.mutations import AddField
+
+
+MUTATIONS = [
+    AddField('FileDiff', 'crlf', BooleanField, initial=False),
+]
diff --git a/reviewboard/diffviewer/managers.py b/reviewboard/diffviewer/managers.py
index 4e4ac7f15c9342898f3a2647e5106ac2b78f55a7..c28c95a478d5d894c9fe2cda178e937c3e90b7a3 100644
--- a/reviewboard/diffviewer/managers.py
+++ b/reviewboard/diffviewer/managers.py
@@ -697,6 +697,7 @@ class DiffSetManager(models.Manager):
                 source_revision=smart_unicode(orig_rev),
                 dest_detail=f.newInfo,
                 binary=f.binary,
+                crlf=parser.crlf,
                 status=status)
 
             filediff.extra_data = {
diff --git a/reviewboard/diffviewer/models.py b/reviewboard/diffviewer/models.py
index 4a24e719ac7fc3fe3f4efb5b218b6153643956e1..2dd529bd17d2c2321d414d1455e09e7367274ef8 100644
--- a/reviewboard/diffviewer/models.py
+++ b/reviewboard/diffviewer/models.py
@@ -190,6 +190,8 @@ class FileDiff(models.Model):
         null=True,
         blank=True)
 
+    crlf = models.BooleanField(_("crlf line endings"), default=False)
+
     extra_data = JSONField(null=True)
 
     objects = FileDiffManager()
@@ -245,7 +247,12 @@ class FileDiff(models.Model):
         if self._needs_diff_migration():
             self._migrate_diff_data()
 
-        return self.diff_hash.content
+        diff = self.diff_hash.content
+
+        if self.crlf:
+            diff = diff.replace(b'\n', b'\r\n')
+
+        return diff
 
     def _set_diff(self, diff):
         # Add hash to table if it doesn't exist, and set diff_hash to this.
diff --git a/reviewboard/diffviewer/parser.py b/reviewboard/diffviewer/parser.py
index fbe0234e339b18a74c418171fc30fa76cf255c0c..d75a366438a71858d7dd52abd32893d9b5314f95 100644
--- a/reviewboard/diffviewer/parser.py
+++ b/reviewboard/diffviewer/parser.py
@@ -103,6 +103,7 @@ class DiffParser(object):
         self.new_commit_id = None
         self.data = data
         self.lines = split_line_endings(data)
+        self.crlf = b'\r\n' in data
 
     def parse(self):
         """
diff --git a/reviewboard/diffviewer/tests/test_diff_parser.py b/reviewboard/diffviewer/tests/test_diff_parser.py
index 5664c6d3364c5f704a7d39e0d85ec8f95913c858..a6ab891a425e327a701b5df7be973b3a70e5d54c 100644
--- a/reviewboard/diffviewer/tests/test_diff_parser.py
+++ b/reviewboard/diffviewer/tests/test_diff_parser.py
@@ -48,3 +48,15 @@ class DiffParserTest(TestCase):
         self.assertEqual(len(files), 1)
         self.assertEqual(files[0].insert_count, 3)
         self.assertEqual(files[0].delete_count, 4)
+
+    def test_crlf(self):
+        """Testing DiffParser with a CRLF diff"""
+        diff = (
+            b'--- README\trevision 123\r\n'
+            b'+++ README\trevision 123\r\n'
+            b'@@ -1 +1 @@\r\n'
+            b'-Hello, world!\r\n'
+            b'+Hello, everybody!\r\n')
+        parser = DiffParser(diff)
+
+        self.assertTrue(parser.crlf)
diff --git a/reviewboard/reviews/tests/test_download_raw_diff_view.py b/reviewboard/reviews/tests/test_download_raw_diff_view.py
index 19445690f27857af12ccfd568925e49ffba9813f..8ee5d379abede08a02da85100e42d27c0272c11e 100644
--- a/reviewboard/reviews/tests/test_download_raw_diff_view.py
+++ b/reviewboard/reviews/tests/test_download_raw_diff_view.py
@@ -2,6 +2,7 @@
 
 from __future__ import unicode_literals
 
+from reviewboard.diffviewer.parser import DiffParser
 from reviewboard.testing import TestCase
 
 
@@ -36,3 +37,38 @@ class DownloadRawDiffViewTests(TestCase):
         content_disposition = response['Content-Disposition']
         filename = content_disposition[len('attachment; filename='):]
         self.assertFalse(',' in filename)
+
+    def test_crlf(self):
+        """Testing DownloadRawDiffView with a CRLF diff"""
+        diff = (
+            b'--- README\trevision 123\r\n'
+            b'+++ README\trevision 123\r\n'
+            b'@@ -1 +1 @@\r\n'
+            b'-Hello, world!\r\n'
+            b'+Hello, everybody!\r\n')
+        self._test_line_endings(diff)
+
+    def test_lf(self):
+        """Testing DownloadRawDiffView with a LF diff"""
+        diff = (
+            b'--- README\trevision 123\n'
+            b'+++ README\trevision 123\n'
+            b'@@ -1 +1 @@\n'
+            b'-Hello, world!\n'
+            b'+Hello, everybody!\n')
+        self._test_line_endings(diff)
+
+    def _test_line_endings(self, diff):
+        """Testing whether dowloaded diff has correct line endings"""
+        repository = self.create_repository(tool_name="Subversion")
+        review_request = self.create_review_request(create_repository=False,
+                                                    repository=repository,
+                                                    publish=True)
+
+        diffset = self.create_diffset(review_request=review_request)
+        parser = DiffParser(diff)
+        files = parser.parse()
+        self.create_filediff(diffset, diff=files[0].data, crlf=parser.crlf)
+
+        response = self.client.get('/r/%d/diff/raw/' % review_request.pk)
+        self.assertEqual(diff, response.content)
diff --git a/reviewboard/testing/testcase.py b/reviewboard/testing/testcase.py
index c41c86faacd7388073ada250322bb6e656a12570..2de2f18f08e4b669cd4a603e9614f8f2780af08b 100644
--- a/reviewboard/testing/testcase.py
+++ b/reviewboard/testing/testcase.py
@@ -474,7 +474,7 @@ class TestCase(FixturesCompilerMixin, DjbletsTestCase):
     def create_filediff(self, diffset, source_file='/test-file',
                         dest_file='/test-file', source_revision='123',
                         dest_detail='124', status=FileDiff.MODIFIED,
-                        diff=DEFAULT_FILEDIFF_DATA, save=True):
+                        diff=DEFAULT_FILEDIFF_DATA, crlf=False, save=True):
         """Create a FileDiff for testing.
 
         The FileDiff is tied to the given DiffSet. It's populated with
@@ -519,7 +519,8 @@ class TestCase(FixturesCompilerMixin, DjbletsTestCase):
             source_revision=source_revision,
             dest_detail=dest_detail,
             status=status,
-            diff=diff)
+            diff=diff,
+            crlf=crlf)
 
         if save:
             filediff.save()
