diff --git a/_test/tests/inc/difference_engine.test.php b/_test/tests/inc/difference_engine.test.php
new file mode 100644
index 0000000000000000000000000000000000000000..cd0c9c0317a4e03fe2bc80d8a1ae8494544d52e2
--- /dev/null
+++ b/_test/tests/inc/difference_engine.test.php
@@ -0,0 +1,85 @@
+<?php
+
+require_once DOKU_INC.'inc/DifferenceEngine.php';
+
+/**
+ * Class difference_engine_test
+ */
+class difference_engine_test extends DokuWikiTest {
+    public $x = "zzz\n\naaa\n\nbbb\n\nccc\n\nddd\n\nddd\n\nddd\n\neee\n\nfff";
+    public $y = "ddd\n\naaa\n\nbbb\n\nbbb\n\nccc\n\nccc\n\neee";
+
+    function test_render_table(){
+        $diff = new Diff(explode("\n", $this->x), explode("\n", $this->y));
+        $diffformatter = new TableDiffFormatter();
+        $actual = $diffformatter->format($diff);
+        $expected = '<tr><td class="diff-blockheader" colspan="2">Line 1:</td>
+<td class="diff-blockheader" colspan="2">Line 1:</td>
+</tr>
+<tr><td class="diff-lineheader">-</td><td class="diff-deletedline"><strong class="diff-mark">zzz</strong></td><td class="diff-lineheader">+</td><td class="diff-addedline"><strong class="diff-mark">ddd</strong></td></tr>
+<tr><td class="diff-lineheader">&#160;</td><td class="diff-context"></td><td class="diff-lineheader">&#160;</td><td class="diff-context"></td></tr>
+<tr><td class="diff-lineheader">&#160;</td><td class="diff-context">aaa</td><td class="diff-lineheader">&#160;</td><td class="diff-context">aaa</td></tr>
+<tr><td colspan="2">&#160;</td><td class="diff-lineheader">+</td><td class="diff-addedline"></td></tr>
+<tr><td colspan="2">&#160;</td><td class="diff-lineheader">+</td><td class="diff-addedline">bbb</td></tr>
+<tr><td class="diff-lineheader">&#160;</td><td class="diff-context"></td><td class="diff-lineheader">&#160;</td><td class="diff-context"></td></tr>
+<tr><td class="diff-lineheader">&#160;</td><td class="diff-context">bbb</td><td class="diff-lineheader">&#160;</td><td class="diff-context">bbb</td></tr>
+<tr><td class="diff-blockheader" colspan="2">Line 7:</td>
+<td class="diff-blockheader" colspan="2">Line 9:</td>
+</tr>
+<tr><td class="diff-lineheader">&#160;</td><td class="diff-context">ccc</td><td class="diff-lineheader">&#160;</td><td class="diff-context">ccc</td></tr>
+<tr><td class="diff-lineheader">&#160;</td><td class="diff-context"></td><td class="diff-lineheader">&#160;</td><td class="diff-context"></td></tr>
+<tr><td class="diff-lineheader">-</td><td class="diff-deletedline"><strong class="diff-mark">ddd </strong></td><td class="diff-lineheader">+</td><td class="diff-addedline"><strong class="diff-mark">ccc</strong></td></tr>
+<tr><td class="diff-lineheader">-</td><td class="diff-deletedline"><strong class="diff-mark"> </strong></td><td class="diff-lineheader">+</td><td class="diff-addedline"></td></tr>
+<tr><td class="diff-lineheader">-</td><td class="diff-deletedline"><strong class="diff-mark">ddd </strong></td><td class="diff-lineheader">+</td><td class="diff-addedline"></td></tr>
+<tr><td class="diff-lineheader">-</td><td class="diff-deletedline"><strong class="diff-mark"> </strong></td><td class="diff-lineheader">+</td><td class="diff-addedline"></td></tr>
+<tr><td class="diff-lineheader">-</td><td class="diff-deletedline"><strong class="diff-mark">ddd</strong></td><td class="diff-lineheader">+</td><td class="diff-addedline"></td></tr>
+<tr><td class="diff-lineheader">&#160;</td><td class="diff-context"></td><td class="diff-lineheader">&#160;</td><td class="diff-context"></td></tr>
+<tr><td class="diff-lineheader">&#160;</td><td class="diff-context">eee</td><td class="diff-lineheader">&#160;</td><td class="diff-context">eee</td></tr>
+<tr><td class="diff-lineheader">-</td><td class="diff-deletedline"></td><td colspan="2">&#160;</td></tr>
+<tr><td class="diff-lineheader">-</td><td class="diff-deletedline">fff</td><td colspan="2">&#160;</td></tr>
+';
+        $this->assertEquals($expected, $actual);
+    }
+
+    function test_render_inline(){
+        $diff = new Diff(explode("\n", $this->x), explode("\n", $this->y));
+        $diffformatter = new InlineDiffFormatter();
+        $actual = $diffformatter->format($diff);
+        $expected = '<tr><td colspan="2" class="diff-blockheader">@@ Line -1,5 +1,7 @@&#160;<span class="diff-deletedline"><del>removed</del></span>&#160;<span class="diff-addedline">created</span></td></tr>
+
+<tr><td class="diff-lineheader">&#160;</td><td><span class="diff-deletedline"><del>zzz</del></span><span class="diff-addedline">ddd</span></td></tr>
+<tr><td class="diff-lineheader">&#160;</td><td class="diff-context"></td></tr>
+<tr><td class="diff-lineheader">&#160;</td><td class="diff-context">aaa</td></tr>
+<tr><td class="diff-lineheader">&#160;</td><td class="diff-addedline"></td></tr>
+<tr><td class="diff-lineheader">&#160;</td><td class="diff-addedline">bbb</td></tr>
+<tr><td class="diff-lineheader">&#160;</td><td class="diff-context"></td></tr>
+<tr><td class="diff-lineheader">&#160;</td><td class="diff-context">bbb</td></tr>
+<tr><td colspan="2" class="diff-blockheader">@@ Line -7,11 +9,5 @@&#160;<span class="diff-deletedline"><del>removed</del></span>&#160;<span class="diff-addedline">created</span></td></tr>
+
+<tr><td class="diff-lineheader">&#160;</td><td class="diff-context">ccc</td></tr>
+<tr><td class="diff-lineheader">&#160;</td><td class="diff-context"></td></tr>
+<tr><td class="diff-lineheader">&#160;</td><td><span class="diff-deletedline"><del>ddd </del></span></td></tr>
+<tr><td class="diff-lineheader">&#160;</td><td><span class="diff-deletedline"><del> </del></span></td></tr>
+<tr><td class="diff-lineheader">&#160;</td><td><span class="diff-deletedline"><del>ddd </del></span></td></tr>
+<tr><td class="diff-lineheader">&#160;</td><td><span class="diff-deletedline"><del> </del></span></td></tr>
+<tr><td class="diff-lineheader">&#160;</td><td><span class="diff-deletedline"><del>ddd</del></span><span class="diff-addedline">ccc</span></td></tr>
+<tr><td class="diff-lineheader">&#160;</td><td class="diff-context"></td></tr>
+<tr><td class="diff-lineheader">&#160;</td><td class="diff-context">eee</td></tr>
+<tr><td class="diff-lineheader">&#160;</td><td class="diff-deletedline"><del></del></td></tr>
+<tr><td class="diff-lineheader">&#160;</td><td class="diff-deletedline"><del>fff</del></td></tr>
+';
+        $this->assertEquals($expected, $actual);
+    }
+
+    function test_engine_diag(){
+        // initialize
+        $eng = new _DiffEngine;
+        $eng->diff(explode("\n", $this->x), explode("\n", $this->y));
+        // check
+        $this->assertEquals(
+            array(9, array(array(0,0),array(1,2),array(3,4),array(4,5),array(5,7),array(6,9),array(7,10),array(9,12),array(15,13))),
+            $eng->_diag(0, 15, 0, 13, 8)
+        );
+    }
+}
+//Setup VIM: ex: et ts=4 :
diff --git a/inc/DifferenceEngine.php b/inc/DifferenceEngine.php
index 933e0c1eea38fabf6b2103ed9cb1e88e71309330..3c873d8d33db5c969ca85c2b43e184fbff62b29a 100644
--- a/inc/DifferenceEngine.php
+++ b/inc/DifferenceEngine.php
@@ -272,27 +272,19 @@ class _DiffEngine {
                 $matches = $ymatches[$line];
                 $switch = false;
                 foreach ($matches as $y) {
-                    if(!$switch) {
-                        if (empty($this->in_seq[$y])) {
-                            $k = $this->_lcs_pos($y);
-                            USE_ASSERTS && assert($k > 0);
-                            $ymids[$k] = $ymids[$k-1];
-                            $switch = true;
-                        }
-                    }else{
-                        if ($y > $this->seq[$k-1]) {
-                            USE_ASSERTS && assert($y < $this->seq[$k]);
-                            // Optimization: this is a common case:
-                            //  next match is just replacing previous match.
-                            $this->in_seq[$this->seq[$k]] = false;
-                            $this->seq[$k] = $y;
-                            $this->in_seq[$y] = 1;
-                        }
-                        else if (empty($this->in_seq[$y])) {
-                            $k = $this->_lcs_pos($y);
-                            USE_ASSERTS && assert($k > 0);
-                            $ymids[$k] = $ymids[$k-1];
-                        }
+                    if ($switch && $y > $this->seq[$k-1]) {
+                        USE_ASSERTS && assert($y < $this->seq[$k]);
+                        // Optimization: this is a common case:
+                        //  next match is just replacing previous match.
+                        $this->in_seq[$this->seq[$k]] = false;
+                        $this->seq[$k] = $y;
+                        $this->in_seq[$y] = 1;
+                    }
+                    else if (empty($this->in_seq[$y])) {
+                        $k = $this->_lcs_pos($y);
+                        USE_ASSERTS && assert($k > 0);
+                        $ymids[$k] = $ymids[$k-1];
+                        $switch = true;
                     }
                 }
             }