diff --git a/reviewboard/diffviewer/chunk_generator.py b/reviewboard/diffviewer/chunk_generator.py
index 54d233b562a41acbf8969daee94676b52138a0be..745d006e04d9e894c3c431cd9c1fa42ecf44881b 100644
--- a/reviewboard/diffviewer/chunk_generator.py
+++ b/reviewboard/diffviewer/chunk_generator.py
@@ -398,7 +398,7 @@ class DiffChunkGenerator(object):
         return result
 
     def _highlight_indentation(self, old_markup, new_markup, is_indent,
-                               raw_indent_len):
+                               raw_indent_len, norm_indent_len_diff):
         """Highlights indentation in an HTML-formatted line.
 
         This will wrap the indentation in <span> tags, and format it in
@@ -409,18 +409,20 @@ class DiffChunkGenerator(object):
                 'indent',
                 new_markup,
                 raw_indent_len,
+                norm_indent_len_diff,
                 self._serialize_indentation)
         else:
             old_markup = self._wrap_indentation_chars(
                 'unindent',
                 old_markup,
                 raw_indent_len,
+                norm_indent_len_diff,
                 self._serialize_unindentation)
 
         return old_markup, new_markup
 
     def _wrap_indentation_chars(self, class_name, markup, raw_indent_len,
-                                serializer):
+                                norm_indent_len_diff, serializer):
         """Wraps characters in a string with indentation markers.
 
         This will insert the indentation markers and its wrapper in the
@@ -449,13 +451,15 @@ class DiffChunkGenerator(object):
             # a straight sequence of characters. Give up on highlighting it.
             return markup
 
+        serialized, remainder = serializer(indentation, norm_indent_len_diff)
+
         return '%s<span class="%s">%s</span>%s' % (
             markup[:start_pos],
             class_name,
-            serializer(indentation),
-            markup[end_pos:])
+            serialized,
+            remainder + markup[end_pos:])
 
-    def _serialize_indentation(self, chars):
+    def _serialize_indentation(self, chars, norm_indent_len_diff):
         """Serializes an indentation string into an HTML representation.
 
         This will show every space as ">", and every tab as "------>|".
@@ -466,7 +470,7 @@ class DiffChunkGenerator(object):
         s = ''
         i = 0
 
-        for c in chars:
+        for j, c in enumerate(chars):
             if c == ' ':
                 s += '&gt;'
                 i += 1
@@ -486,9 +490,12 @@ class DiffChunkGenerator(object):
                 s += '|'
                 i += 1
 
-        return s
+            if i >= norm_indent_len_diff:
+                break
+
+        return s, chars[j + 1:]
 
-    def _serialize_unindentation(self, chars):
+    def _serialize_unindentation(self, chars, norm_indent_len_diff):
         """Serializes an unindentation string into an HTML representation.
 
         This will show every space as "<", and every tab as "|<------".
@@ -499,7 +506,7 @@ class DiffChunkGenerator(object):
         s = ''
         i = 0
 
-        for c in chars:
+        for j, c in enumerate(chars):
             if c == ' ':
                 s += '&lt;'
                 i += 1
@@ -519,7 +526,10 @@ class DiffChunkGenerator(object):
                         s += '&mdash;' * num_dashes
                         i += num_dashes
 
-        return s
+            if i >= norm_indent_len_diff:
+                break
+
+        return s, chars[j + 1:]
 
     def _new_chunk(self, all_lines, start, end, collapsable=False,
                    tag='equal', meta=None):
diff --git a/reviewboard/diffviewer/opcode_generator.py b/reviewboard/diffviewer/opcode_generator.py
index c0ea8395055403d0d88103539c9eff6ca7baed8b..ec2d569cf1f1f7569c4396d2d01d52832bb1bf16 100644
--- a/reviewboard/diffviewer/opcode_generator.py
+++ b/reviewboard/diffviewer/opcode_generator.py
@@ -238,9 +238,11 @@ class DiffOpcodeGenerator(object):
 
         norm_old_line_indent = old_line_indent.expandtabs(self.TAB_SIZE)
         norm_new_line_indent = new_line_indent.expandtabs(self.TAB_SIZE)
-        norm_old_line_len = (len(norm_old_line_indent) +
+        norm_old_line_indent_len = len(norm_old_line_indent)
+        norm_new_line_indent_len = len(norm_new_line_indent)
+        norm_old_line_len = (norm_old_line_indent_len +
                              len(old_line_stripped))
-        norm_new_line_len = (len(norm_new_line_indent) +
+        norm_new_line_len = (norm_new_line_indent_len +
                              len(new_line_stripped))
         line_len_diff = norm_new_line_len - norm_old_line_len
 
@@ -277,7 +279,9 @@ class DiffOpcodeGenerator(object):
             new_line_indent[::-1],
         ]))
 
-        return is_indent, raw_indent_len
+        return (is_indent,
+                raw_indent_len,
+                abs(norm_old_line_indent_len - norm_new_line_indent_len))
 
     def _compute_moves(self):
         # We now need to figure out all the moved locations.
diff --git a/reviewboard/diffviewer/tests.py b/reviewboard/diffviewer/tests.py
index a472abca32f0504cbf969b22373ceeb1787e83d4..8d6724ff41d644de934c492f3e3eba03ae750bc5 100644
--- a/reviewboard/diffviewer/tests.py
+++ b/reviewboard/diffviewer/tests.py
@@ -1322,7 +1322,7 @@ class ProcessorsTests(TestCase):
                         '21-11': (True, 4),
                     }
                 }),
-            ('equal', 30, 50, 20, 40, {}),
+                ('equal', 30, 50, 20, 40, {}),
             ])
 
     def test_post_process_filtered_equals_with_adjacent_indentation(self):
@@ -1374,108 +1374,119 @@ class DiffChunkGeneratorTests(TestCase):
 
     def test_indent_spaces(self):
         """Testing DiffChunkGenerator._serialize_indentation with spaces"""
-        self.assertEqual(self.generator._serialize_indentation('    '),
-                         '&gt;&gt;&gt;&gt;')
+        self.assertEqual(
+            self.generator._serialize_indentation('    ', 4),
+            ('&gt;&gt;&gt;&gt;', ''))
 
     def test_indent_tabs(self):
         """Testing DiffChunkGenerator._serialize_indentation with tabs"""
-        self.assertEqual(self.generator._serialize_indentation('\t'),
-                         '&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&gt;|')
+        self.assertEqual(
+            self.generator._serialize_indentation('\t', 8),
+            ('&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&gt;|', ''))
 
     def test_indent_spaces_and_tabs(self):
         """Testing DiffChunkGenerator._serialize_indentation
         with spaces and tabs
         """
-        self.assertEqual(self.generator._serialize_indentation('   \t'),
-                         '&gt;&gt;&gt;&mdash;&mdash;&mdash;&gt;|')
+        self.assertEqual(
+            self.generator._serialize_indentation('   \t', 8),
+            ('&gt;&gt;&gt;&mdash;&mdash;&mdash;&gt;|', ''))
 
     def test_indent_tabs_and_spaces(self):
         """Testing DiffChunkGenerator._serialize_indentation
         with tabs and spaces
         """
         self.assertEqual(
-            self.generator._serialize_indentation('\t   '),
-            '&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&gt;|&gt;&gt;&gt;')
+            self.generator._serialize_indentation('\t   ', 11),
+            ('&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&gt;|&gt;&gt;&gt;',
+             ''))
 
     def test_indent_9_spaces_and_tab(self):
         """Testing DiffChunkGenerator._serialize_indentation
         with 9 spaces and tab
         """
         self.assertEqual(
-            self.generator._serialize_indentation('       \t'),
-            '&gt;&gt;&gt;&gt;&gt;&gt;&gt;|')
+            self.generator._serialize_indentation('       \t', 8),
+            ('&gt;&gt;&gt;&gt;&gt;&gt;&gt;|', ''))
 
     def test_indent_8_spaces_and_tab(self):
         """Testing DiffChunkGenerator._serialize_indentation
         with 8 spaces and tab
         """
         self.assertEqual(
-            self.generator._serialize_indentation('      \t'),
-            '&gt;&gt;&gt;&gt;&gt;&gt;&gt;|')
+            self.generator._serialize_indentation('      \t', 8),
+            ('&gt;&gt;&gt;&gt;&gt;&gt;&gt;|', ''))
 
     def test_indent_7_spaces_and_tab(self):
         """Testing DiffChunkGenerator._serialize_indentation
         with 7 spaces and tab
         """
         self.assertEqual(
-            self.generator._serialize_indentation('     \t'),
-            '&gt;&gt;&gt;&gt;&gt;&mdash;&gt;|')
+            self.generator._serialize_indentation('     \t', 8),
+            ('&gt;&gt;&gt;&gt;&gt;&mdash;&gt;|', ''))
 
     def test_unindent_spaces(self):
         """Testing DiffChunkGenerator._serialize_unindentation with spaces"""
-        self.assertEqual(self.generator._serialize_unindentation('    '),
-                         '&lt;&lt;&lt;&lt;')
+        self.assertEqual(
+            self.generator._serialize_unindentation('    ', 4),
+            ('&lt;&lt;&lt;&lt;', ''))
 
     def test_unindent_tabs(self):
         """Testing DiffChunkGenerator._serialize_unindentation with tabs"""
-        self.assertEqual(self.generator._serialize_unindentation('\t'),
-                         '|&lt;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;')
+        self.assertEqual(
+            self.generator._serialize_unindentation('\t', 8),
+            ('|&lt;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;', ''))
 
     def test_unindent_spaces_and_tabs(self):
         """Testing DiffChunkGenerator._serialize_unindentation
         with spaces and tabs
         """
-        self.assertEqual(self.generator._serialize_unindentation('   \t'),
-                         '&lt;&lt;&lt;|&lt;&mdash;&mdash;&mdash;')
+        self.assertEqual(
+            self.generator._serialize_unindentation('   \t', 8),
+            ('&lt;&lt;&lt;|&lt;&mdash;&mdash;&mdash;', ''))
 
     def test_unindent_tabs_and_spaces(self):
         """Testing DiffChunkGenerator._serialize_unindentation
         with tabs and spaces
         """
         self.assertEqual(
-            self.generator._serialize_unindentation('\t   '),
-            '|&lt;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&lt;&lt;&lt;')
+            self.generator._serialize_unindentation('\t   ', 11),
+            ('|&lt;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&lt;&lt;&lt;',
+             ''))
 
     def test_unindent_9_spaces_and_tab(self):
         """Testing DiffChunkGenerator._serialize_unindentation
         with 9 spaces and tab
         """
         self.assertEqual(
-            self.generator._serialize_unindentation('       \t'),
-            '&lt;&lt;&lt;&lt;&lt;&lt;&lt;|')
+            self.generator._serialize_unindentation('       \t', 8),
+            ('&lt;&lt;&lt;&lt;&lt;&lt;&lt;|', ''))
 
     def test_unindent_8_spaces_and_tab(self):
         """Testing DiffChunkGenerator._serialize_unindentation
         with 8 spaces and tab
         """
         self.assertEqual(
-            self.generator._serialize_unindentation('      \t'),
-            '&lt;&lt;&lt;&lt;&lt;&lt;|&lt;')
+            self.generator._serialize_unindentation('      \t', 8),
+            ('&lt;&lt;&lt;&lt;&lt;&lt;|&lt;', ''))
 
     def test_unindent_7_spaces_and_tab(self):
         """Testing DiffChunkGenerator._serialize_unindentation
         with 7 spaces and tab
         """
         self.assertEqual(
-            self.generator._serialize_unindentation('     \t'),
-            '&lt;&lt;&lt;&lt;&lt;|&lt;&mdash;')
+            self.generator._serialize_unindentation('     \t', 8),
+            ('&lt;&lt;&lt;&lt;&lt;|&lt;&mdash;', ''))
 
     def test_highlight_indent(self):
         """Testing DiffChunkGenerator._highlight_indentation
         with indentation
         """
         self.assertEqual(
-            self.generator._highlight_indentation('', '        foo', True, 4),
+            self.generator._highlight_indentation(
+                '',
+                '        foo',
+                True, 4, 4),
             ('', '<span class="indent">&gt;&gt;&gt;&gt;</span>    foo'))
 
     def test_highlight_indent_with_adjacent_tag(self):
@@ -1486,7 +1497,7 @@ class DiffChunkGeneratorTests(TestCase):
             self.generator._highlight_indentation(
                 '',
                 '<span class="s"> </span>foo',
-                True, 1),
+                True, 1, 1),
             ('',
              '<span class="s"><span class="indent">&gt;</span></span>foo'))
 
@@ -1496,7 +1507,9 @@ class DiffChunkGeneratorTests(TestCase):
         """
         self.assertEqual(
             self.generator._highlight_indentation(
-                '', ' <span>  </span> foo', True, 4),
+                '',
+                ' <span>  </span> foo',
+                True, 4, 2),
             ('', ' <span>  </span> foo'))
 
     def test_highlight_unindent(self):
@@ -1504,7 +1517,10 @@ class DiffChunkGeneratorTests(TestCase):
         with unindentation
         """
         self.assertEqual(
-            self.generator._highlight_indentation('        foo', '', False, 4),
+            self.generator._highlight_indentation(
+                '        foo',
+                '',
+                False, 4, 4),
             ('<span class="unindent">&lt;&lt;&lt;&lt;</span>    foo', ''))
 
     def test_highlight_unindent_with_adjacent_tag(self):
@@ -1515,7 +1531,7 @@ class DiffChunkGeneratorTests(TestCase):
             self.generator._highlight_indentation(
                 '<span class="s"> </span>foo',
                 '',
-                False, 1),
+                False, 1, 1),
             ('<span class="s"><span class="unindent">&lt;</span></span>foo',
              ''))
 
@@ -1525,9 +1541,38 @@ class DiffChunkGeneratorTests(TestCase):
         """
         self.assertEqual(
             self.generator._highlight_indentation(
-                ' <span>  </span> foo', '', False, 4),
+                ' <span>  </span> foo',
+                '',
+                False, 4, 2),
             (' <span>  </span> foo', ''))
 
+    def test_highlight_unindent_with_replacing_last_tab_with_spaces(self):
+        """Testing DiffChunkGenerator._highlight_indentation
+        with unindentation and replacing last tab with spaces
+        """
+        self.assertEqual(
+            self.generator._highlight_indentation(
+                '<span>\t\t        </span> foo',
+                '',
+                False, 2, 16),
+            ('<span><span class="unindent">'
+             '|&lt;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;'
+             '|&lt;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;'
+             '</span>        </span> foo', ''))
+
+    def test_highlight_unindent_with_replacing_3_tabs_with_tab_spaces(self):
+        """Testing DiffChunkGenerator._highlight_indentation
+        with unindentation and replacing 3 tabs with 1 tab and 8 spaces
+        """
+        self.assertEqual(
+            self.generator._highlight_indentation(
+                '<span>\t        </span> foo',
+                '',
+                False, 1, 24),
+            ('<span><span class="unindent">'
+             '|&lt;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;'
+             '</span>        </span> foo', ''))
+
 
 class DiffOpcodeGeneratorTests(TestCase):
     """Unit tests for DiffOpcodeGenerator."""
@@ -1542,7 +1587,7 @@ class DiffOpcodeGeneratorTests(TestCase):
             self.generator._compute_line_indentation(
                 '    foo',
                 '        foo'),
-            (True, 4))
+            (True, 4, 4))
 
     def test_indentation_with_tabs(self):
         """Testing DiffOpcodeGenerator._calculate_indentation
@@ -1552,7 +1597,7 @@ class DiffOpcodeGeneratorTests(TestCase):
             self.generator._compute_line_indentation(
                 '    foo',
                 '\t    foo'),
-            (True, 1))
+            (True, 1, 8))
 
     def test_indentation_with_spaces_and_tabs(self):
         """Testing DiffOpcodeGenerator._calculate_indentation
@@ -1562,7 +1607,7 @@ class DiffOpcodeGeneratorTests(TestCase):
             self.generator._compute_line_indentation(
                 '    foo',
                 '  \t    foo'),
-            (True, 3))
+            (True, 3, 8))
 
     def test_indentation_with_tabs_and_spaces(self):
         """Testing DiffOpcodeGenerator._calculate_indentation
@@ -1572,7 +1617,7 @@ class DiffOpcodeGeneratorTests(TestCase):
             self.generator._compute_line_indentation(
                 '    foo',
                 '\t      foo'),
-            (True, 3))
+            (True, 3, 10))
 
     def test_indentation_with_replacing_tabs_with_spaces(self):
         """Testing DiffOpcodeGenerator._calculate_indentation
@@ -1612,7 +1657,7 @@ class DiffOpcodeGeneratorTests(TestCase):
             self.generator._compute_line_indentation(
                 '        foo',
                 '    foo'),
-            (False, 4))
+            (False, 4, 4))
 
     def test_unindentation_with_tabs(self):
         """Testing DiffOpcodeGenerator._calculate_indentation
@@ -1622,7 +1667,7 @@ class DiffOpcodeGeneratorTests(TestCase):
             self.generator._compute_line_indentation(
                 '\t    foo',
                 '    foo'),
-            (False, 1))
+            (False, 1, 8))
 
     def test_unindentation_with_spaces_and_tabs(self):
         """Testing DiffOpcodeGenerator._calculate_indentation
@@ -1632,7 +1677,7 @@ class DiffOpcodeGeneratorTests(TestCase):
             self.generator._compute_line_indentation(
                 '  \t    foo',
                 '    foo'),
-            (False, 3))
+            (False, 3, 8))
 
     def test_unindentation_with_tabs_and_spaces(self):
         """Testing DiffOpcodeGenerator._calculate_indentation
@@ -1642,7 +1687,7 @@ class DiffOpcodeGeneratorTests(TestCase):
             self.generator._compute_line_indentation(
                 '\t      foo',
                 '    foo'),
-            (False, 3))
+            (False, 3, 10))
 
     def test_unindentation_with_replacing_tabs_with_spaces(self):
         """Testing DiffOpcodeGenerator._calculate_indentation
@@ -1652,7 +1697,17 @@ class DiffOpcodeGeneratorTests(TestCase):
             self.generator._compute_line_indentation(
                 '\tfoo',
                 '    foo'),
-            (False, 1))
+            (False, 1, 4))
+
+    def test_unindentation_with_replacing_some_tabs_with_spaces(self):
+        """Testing DiffOpcodeGenerator._calculate_indentation
+        with replacing some tabs with spaces
+        """
+        self.assertEqual(
+            self.generator._compute_line_indentation(
+                '\t\t\tfoo',
+                '\t        foo'),
+            (False, 3, 8))
 
 
 class DiffRendererTests(SpyAgency, TestCase):
