diff --git a/inc/marquer_doublons_doc.php b/inc/marquer_doublons_doc.php
index 0a352f1a58ac41cbb31d8ea24379428e75ca2180..52b454a7033cd4e7fee53675413b200f8a53c397 100644
--- a/inc/marquer_doublons_doc.php
+++ b/inc/marquer_doublons_doc.php
@@ -34,6 +34,10 @@ $GLOBALS['medias_liste_champs'][] = 'chapo';
  * indique que le document est utilisé et doit être lié à l'objet, avec le champ `vu=oui`
  *
  * S'il y avait des anciens liens avec vu=oui qui n'ont plus lieu d'être, ils passent à non.
+ *
+ * @note
+ *     La fonction pourrait avoir bien moins d'arguments : seuls $champs, $id, $type ou $objet, $desc, $serveur
+ *     sont nécessaires. On calcule $desc s'il est absent, et il contient toutes les infos…
  * 
  * @param array $champs
  *     Couples [champ => valeur] connus de l'objet
@@ -54,59 +58,69 @@ $GLOBALS['medias_liste_champs'][] = 'chapo';
  * @return void|null
 **/
 function inc_marquer_doublons_doc_dist($champs, $id, $type, $id_table_objet, $table_objet, $spip_table_objet, $desc=array(), $serveur=''){
-	$champs_selection=array();
 
-	foreach ($GLOBALS['medias_liste_champs'] as $champs_choisis) {
-		if ( isset($champs[$champs_choisis]) )
-			array_push($champs_selection,$champs_choisis);
-	}
-	if (count($champs_selection) == 0)
+	// On conserve uniquement les champs qui modifient le calcul des doublons de documents
+	// S'il n'il en a aucun, les doublons ne sont pas impactés, donc rien à faire d'autre..
+	if (!$champs = array_intersect_key($champs, array_flip($GLOBALS['medias_liste_champs']))) {
 		return;
+	}
+
 	if (!$desc){
 		$trouver_table = charger_fonction('trouver_table', 'base');
 		$desc = $trouver_table($table_objet, $serveur);
 	}
-	$load = "";
-	// charger le champ manquant en cas de modif partielle de l	'objet
-	// seulement si le champ existe dans la table demande
-
-	$champs_a_traiter = "";
-	foreach ($champs_selection as $champs_a_parcourir) {
-		if (isset($desc['field'][$champs_a_parcourir])) {
-			$load = $champs_a_parcourir;
-			$champs_a_traiter .= $champs[$champs_a_parcourir];
+
+	// Il faut récupérer toutes les données qui impactent les liens de documents vus
+	// afin de savoir lesquels sont présents dans les textes, et pouvoir actualiser avec
+	// les liens actuellement enregistrés.
+	$absents = array();
+
+	// Récupérer chaque champ impactant qui existe dans la table de l'objet et qui nous manque
+	foreach ($GLOBALS['medias_liste_champs'] as $champ) {
+		if (isset($desc['field'][$champ]) and !isset($champs[$champ])) {
+			$absents[] = $champ;
 		}
 	}
 
-	if ($load){
-		$champs[$load] = "";
-		$row = sql_fetsel($load, $spip_table_objet, "$id_table_objet=".sql_quote($id));
-		if ($row AND isset($row[$load]))
-			$champs[$load] = $row[$load];
+	// Retrouver les textes des champs manquants
+	if ($absents) {
+		$row = sql_fetsel($absents, $spip_table_objet, "$id_table_objet=".sql_quote($id));
+		if ($row) {
+			$champs = array_merge($row, $champs);
+		}
 	}
+
 	include_spip('inc/texte');
 	include_spip('base/abstract_sql');
 	include_spip('action/editer_liens');
 	include_spip('base/objets');
+
+	// récupérer la liste des modèles qui considèrent un document comme vu s'ils sont utilisés dans un texte
 	$modeles = lister_tables_objets_sql('spip_documents');
 	$modeles = $modeles['modeles'];
+
+	// liste d'id_documents trouvés dans les textes
 	$GLOBALS['doublons_documents_inclus'] = array();
-	$env = array(
-		'objet' => $type,
-		'id_objet' => $id,
+
+	// detecter les doublons dans ces textes
+	traiter_modeles(implode(" ", $champs), array('documents' => $modeles), '', '', null, array(
+		'objet'         => $type,
+		'id_objet'      => $id,
 		$id_table_objet => $id
-	);
-	traiter_modeles($champs_a_traiter,array('documents'=>$modeles),'','',null,$env); // detecter les doublons
-	objet_qualifier_liens(array('document'=>'*'),array($type=>$id),array('vu'=>'non'));
+	));
+
+	// tous les documents liés à l'article sont considérés non vus
+	objet_qualifier_liens(array('document'=>'*'), array($type=>$id), array('vu'=>'non'));
+
+	// ceux présents sont considérés comme vus
 	if (count($GLOBALS['doublons_documents_inclus'])){
 		// on repasse par une requete sur spip_documents pour verifier que les documents existent bien !
-		$in_liste = sql_in('id_document',$GLOBALS['doublons_documents_inclus']);
+		$in_liste = sql_in('id_document', $GLOBALS['doublons_documents_inclus']);
 		$res = sql_allfetsel("id_document", "spip_documents", $in_liste);
-		$res = array_map('reset',$res);
+		$res = array_map('reset', $res);
 		// Creer le lien s'il n'existe pas deja
 		objet_associer(array('document'=>$res),array($type=>$id),array('vu'=>'oui'));
 		objet_qualifier_liens(array('document'=>$res),array($type=>$id),array('vu'=>'oui'));
 	}
 }
 
-?>