diff --git a/tools/analysis/VisualFAIL/core.php b/tools/analysis/VisualFAIL/core.php
index 69ee124439552f0767025e9fb56b10877b9a0640..aef4582dd278ba3c6a5eaee02d50a28db6b3e085 100644
--- a/tools/analysis/VisualFAIL/core.php
+++ b/tools/analysis/VisualFAIL/core.php
@@ -170,6 +170,38 @@ function asmCode()
 	echo json_encode($content);
 }
 
+function collapse_repeated($html, $disasm, $force_finish)
+{
+	static $last_disasm = '';
+	static $collect = array();
+	$limit_before = $limit_after = 3;
+
+	$out = '';
+	if ($force_finish || $last_disasm != $disasm) {
+		if (count($collect) > $limit_before + $limit_after + 1) {
+			for ($i = 0; $i < $limit_before; ++$i) {
+				$out .= $collect[$i];
+			}
+			$out .= '<i>-- omitted ' . (count($collect) - $limit_before - $limit_after) . " repetitions of '$last_disasm'</i><br>";
+			for ($i = count($collect) - $limit_after; $i < count($collect); ++$i) {
+				$out .= $collect[$i];
+			}
+		} else {
+			$out = implode('', $collect);
+		}
+		$last_disasm = $disasm;
+		$collect = array();
+	}
+
+	if ($force_finish) {
+		$out .= $html;
+	} else {
+		$collect[] = $html;
+	}
+
+	return $out;
+}
+
 function getAsmCode()
 {
 	$content = "";
@@ -188,25 +220,26 @@ function getAsmCode()
 	// FIXME id not unique
 	$content = '<div id="maxFehler" ';
 	foreach ($resulttypes as $value) {
-        $temp = $value . '="' . $fehlerdaten['max'][$value] . '" ';
-        $content .= $temp;
-    }
+		$temp = $value . '="' . $fehlerdaten['max'][$value] . '" ';
+		$content .= $temp;
+	}
 	$content .= ' >';
 	while ($row = mysql_fetch_object($asmcode)) {
 		if (array_key_exists($row->instr_address,$fehlerdaten['Daten'])) {
-			$content .= '<span data-address="' . dechex($row->instr_address) . '" class="hasFehler" ';
+			$line = '<span data-address="' . dechex($row->instr_address) . '" class="hasFehler" ';
 
 			foreach ($resulttypes as $value) {
-				$content .= $value . '="' . $fehlerdaten['Daten'][$row->instr_address][$value] . '" ';
+				$line .= $value . '="' . $fehlerdaten['Daten'][$row->instr_address][$value] . '" ';
 			}
 
-			$content .= ' style="cursor: pointer;">' . dechex($row->instr_address) . '     ' . htmlspecialchars($row->disassemble) . '</span>';
+			$line .= ' style="cursor: pointer;">' . dechex($row->instr_address) . '     ' . htmlspecialchars($row->disassemble) . '</span><br>';
+			$content .= collapse_repeated($line, 'dontcare', true);
 		} else {
-			$content .= dechex($row->instr_address) . '     ' . htmlspecialchars($row->disassemble);
+			$line = dechex($row->instr_address) . '     ' . htmlspecialchars($row->disassemble) . '<br>';
+			$content .= collapse_repeated($line, htmlspecialchars($row->disassemble), false);
 		}
-		$content .= '<br>';
 	}
-
+	$content .= collapse_repeated('', '', true);
 	$content .= ' </div>';
 
 	echo json_encode($content);
@@ -265,13 +298,15 @@ function getHighlevelCode()
 							$maxFehler[$value] += $fehlerdaten['Daten'][$row->instr_address][$value];
 						}
 
-						$newline .= ' style="cursor: pointer;">' . dechex($row->instr_address) . '     ' . htmlspecialchars($row->disassemble) . '</span>';
+						$newline .= ' style="cursor: pointer;">' . dechex($row->instr_address) . '     ' . htmlspecialchars($row->disassemble) . '</span><br>';
+						$newline = collapse_repeated($newline, 'dontcare', true);
 					} else {
-						$newline = dechex($row->instr_address) . '     ' . htmlspecialchars($row->disassemble);
+						$newline = dechex($row->instr_address) . '     ' . htmlspecialchars($row->disassemble) . '<br>';
+						$newline = collapse_repeated($newline, htmlspecialchars($row->disassemble), false);
 					}
-					$newline .= '<br>';
 					$mapping[$lineNumber] [] = $newline;
 				}
+				$mapping[$lineNumber] [] = collapse_repeated('', '', true);
 		}
 		foreach ($resulttypes as $value) {
 			$maxFehlerMapping[$lineNumber][$value] = $maxFehler[$value];