diff --git a/ecrire/articles_versions.php3 b/ecrire/articles_versions.php3
index 511f3e805ac96c5007194836f85d343c553234b1..dae7ec3db41a32dca7964ee7a06b9b4df5ea6c83 100644
--- a/ecrire/articles_versions.php3
+++ b/ecrire/articles_versions.php3
@@ -254,17 +254,17 @@ if ($id_version) {
 	else {
 		echo "<div $dir_lang><b>";
 		$revision_nbsp = ($options == "avancees");	// a regler pour relecture des nbsp dans les articles
-		echo justifier(propre($chapo));
+		echo justifier(propre_diff($chapo));
 		echo "</b></div>\n\n";
 	
 		echo "<div $dir_lang>";
-		echo justifier(propre($texte));
+		echo justifier(propre_diff($texte));
 		echo "</div>";
 	
 		if ($ps) {
 			echo debut_cadre_enfonce();
 			echo "<div $dir_lang><font size='2' face='Verdana,Arial,Sans,sans-serif'>";
-			echo justifier("<b>"._T('info_ps')."</b> ".propre($ps));
+			echo justifier("<b>"._T('info_ps')."</b> ".propre_diff($ps));
 			echo "</font></div>";
 			echo fin_cadre_enfonce();
 		}
diff --git a/ecrire/inc_suivi_revisions.php b/ecrire/inc_suivi_revisions.php
index 8d9975db450825897d631882a6ad641b0553561b..6b4d882905c44b45474dcfe5f1f73674beaaf5bd 100644
--- a/ecrire/inc_suivi_revisions.php
+++ b/ecrire/inc_suivi_revisions.php
@@ -92,7 +92,7 @@ function afficher_suivi_versions ($debut = 0, $id_secteur = 0, $uniq_auteur = fa
 				WHERE id_auteur = $id_auteur";
 			$result_auteur = spip_query($query_auteur);
 			if ($row_auteur = spip_fetch_array($result_auteur)) {
-				$nom = propre($row_auteur["nom"]);
+				$nom = typo($row_auteur["nom"]);
 				if (strlen($nom) > 0) $nom = "($nom)";
 			}
 	
@@ -102,7 +102,7 @@ function afficher_suivi_versions ($debut = 0, $id_secteur = 0, $uniq_auteur = fa
 			echo "<div class='tr_liste' style='padding: 5px; border-top: 1px solid #aaaaaa;'>";
 	
 			echo "<span class='arial2'>";
-			if (!$court) echo bouton_block_invisible("$id_version-$id_article-$id_auteur");
+			if (!$court) echo bouton_block_visible("$id_version-$id_article-$id_auteur");
 			echo "<img src='" . _DIR_IMG_PACK . "$logo_statut' border='0'>&nbsp;";
 			echo "<a class='$statut' style='font-weight: bold;' href='articles_versions.php3?id_article=$id_article'>$titre</a>";
 			echo "</span>";
@@ -163,12 +163,16 @@ function afficher_suivi_versions ($debut = 0, $id_secteur = 0, $uniq_auteur = fa
 					}
 				}
 				
-				echo debut_block_invisible("$id_version-$id_article-$id_auteur");
+				echo debut_block_visible("$id_version-$id_article-$id_auteur");
 				if (is_array($textes))
 				foreach ($textes as $var => $t) {
 					if (strlen($t) > 0) {
 						echo "<blockquote class='serif1'>";
-						echo propre($t);
+						echo propre_diff($t);
+						if ($GLOBALS['les_notes']) {
+							echo '<p>'.$GLOBALS['les_notes'];
+							$GLOBALS['les_notes'] = '';
+						}
 						echo "</blockquote>";
 					}		
 				}		
diff --git a/ecrire/lab_revisions.php b/ecrire/lab_revisions.php
index fb69d82576817865fd564c11814682f487413380..cc0cdf71dd1b10860d3bb4657d1f8d2dbd0b57eb 100644
--- a/ecrire/lab_revisions.php
+++ b/ecrire/lab_revisions.php
@@ -459,4 +459,47 @@ function ajouter_version($id_article, $champs, $titre_version = "") {
 	return $id_version_new;
 }
 
+// les textes "diff" ne peuvent pas passer dans propre directement,
+// car ils contiennent des <span> et <div> parfois mal places
+function propre_diff($texte) {
+
+	$span_diff = array();
+	if (preg_match_all(',</?(span|div) (class|rem)="diff-[^>]+>,', $texte, $regs, PREG_SET_ORDER)) {
+		foreach ($regs as $c => $reg)
+			$texte = str_replace($reg[0], '@@@SPIP_DIFF'.$c.'@@@', $texte);
+	}
+
+	// [ ...<span diff> -> lien ]
+	// < tag <span diff> >
+	$texte = preg_replace(',<([^>]*@@@SPIP_DIFF[0-9]+@@@),',
+		'&lt;\1', $texte);
+	# attention ici astuce seulement deux @@ finals car on doit eviter
+	# deux patterns a suivre, afin de pouvoir prendre [ mais eviter [[
+	$texte = preg_replace(',(^|[^[])[[]([^[\]]*@@@SPIP_DIFF[0-9]+@@),',
+		'\1&#91;\2', $texte);
+
+	$texte = propre($texte);
+
+	// un blockquote mal ferme peut gener l'affichage, et title plante safari
+	$texte = preg_replace(',<(/?(blockquote|title)[^>]*)>,i', '&lt;\1>', $texte);
+
+	// Dans les <cadre> c'est un peu plus complique
+	if (preg_match_all(',<textarea (.*)</textarea>,Uims', $texte, $area, PREG_SET_ORDER)) {
+		foreach ($area as $reg) {
+			$remplace = preg_replace(',@@@SPIP_DIFF[0-9]+@@@,', '**', $reg[0]);
+			if ($remplace <> $reg[0])
+				$texte = str_replace($reg[0], $remplace, $texte);
+		}
+	}
+
+	// replacer les valeurs des <span> et <div> diff-
+	if (is_array($regs))
+	foreach ($regs as $c => $reg) {
+		$texte = str_replace('@@@SPIP_DIFF'.$c.'@@@', $reg[0], $texte);
+		$GLOBALS['les_notes'] = str_replace('@@@SPIP_DIFF'.$c.'@@@', $reg[0], $GLOBALS['les_notes']);
+	}
+
+	return $texte;
+}
+
 ?>