diff --git a/.gitattributes b/.gitattributes
index 49c278a3aa7385e132af05dc6439e3599e81c32b..ef6d18037836a3fb4f91832fcbec2a8ba7551911 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -6,6 +6,7 @@ action/copier_local.php -text
 action/dissocier_document.php -text
 action/editer_document.php -text
 action/supprimer_document.php -text
+action/supprimer_tous_orphelins.php -text
 action/tourner.php -text
 action/verifier_documents_brises.php -text
 base/medias.php -text
diff --git a/action/dissocier_document.php b/action/dissocier_document.php
index 0af4bf80c072d6dccbc955513f517bd992c7b07a..7f6169c4686317be9de556faf1833a26dd9826d6 100644
--- a/action/dissocier_document.php
+++ b/action/dissocier_document.php
@@ -63,6 +63,7 @@ function supprimer_lien_document($id_document, $objet, $id_objet, $supprime = fa
 	sql_delete("spip_documents_liens", "id_objet=".intval($id_objet)." AND objet=".sql_quote($objet)." AND id_document=".$id_document);
 
 	// Si c'est une vignette, l'eliminer du document auquel elle appartient
+	// cas tordu peu probable
 	sql_updateq("spip_documents", array('id_vignette' => 0), "id_vignette=".$id_document);
 
 	pipeline('post_edition',
@@ -91,7 +92,8 @@ function supprimer_lien_document($id_document, $objet, $id_objet, $supprime = fa
 
 	// On supprime ensuite s'il est orphelin
 	// et si demande
-	if ($supprime AND !sql_countsel('spip_documents_liens', 'id_document='.$id_document)){
+	// ici on ne bloque pas la suppression d'un document rattache a un autre
+	if ($supprime AND !sql_countsel('spip_documents_liens', "objet!='document' AND id_document=".$id_document)){
 		$supprimer_document = charger_fonction('supprimer_document','action');
 		return $supprimer_document($id_document);
 	}
diff --git a/action/editer_document.php b/action/editer_document.php
index ee834cd36a7a2a0b06af358247ebb2c07899049d..eef646f81343dae257096a769b9e0c8b173462fa 100644
--- a/action/editer_document.php
+++ b/action/editer_document.php
@@ -159,7 +159,7 @@ function instituer_document($id_document,$champs=array()){
 		$statut = 'prepa';
 	
 		$trouver_table = charger_fonction('trouver_table','base');
-		$res = sql_select('id_objet,objet','spip_documents_liens','id_document='.intval($id_document));
+		$res = sql_select('id_objet,objet','spip_documents_liens',"objet!='document' AND id_document=".intval($id_document));
 		// dans 10 ans, ca nous fera un bug a corriger vers 2018
 		// penser a ouvrir un ticket d'ici la :p
 		$date_publication=time()+10*365*24*3600;
diff --git a/action/supprimer_document.php b/action/supprimer_document.php
index eb98e45950ef6a509227c2a5b68a8cdc45f1c269..7dd0045aeff481114f2a28de060a4cc128bb85aa 100644
--- a/action/supprimer_document.php
+++ b/action/supprimer_document.php
@@ -43,8 +43,15 @@ function action_supprimer_document_dist($id_document=0) {
 		action_supprimer_document_dist($doc['id_vignette']);
 		sql_delete('spip_documents_liens', 'id_document='.$doc['id_vignette']);
 	}
+	// Si c'est un document ayant des documents annexes (sous-titre, ...)
+	// les supprimer aussi
+	$annexes = array_map('reset',sql_allfetsel("id_document","spip_documents_liens","objet='document' AND id_objet=".intval($id_document)));
+  foreach($annexes as $id){
+	  action_supprimer_document_dist($id);
+  }
 
 	// dereferencer dans la base
+  sql_delete('spip_documents_liens', 'id_document='.intval($id_document));
 	sql_delete('spip_documents', 'id_document='.intval($id_document));
 	// securite
 	sql_delete('spip_documents_liens', 'id_document='.intval($id_document));
diff --git a/action/supprimer_tous_orphelins.php b/action/supprimer_tous_orphelins.php
new file mode 100644
index 0000000000000000000000000000000000000000..6920654a9fc4e41c1e4a8295b8d207abd4874bae
--- /dev/null
+++ b/action/supprimer_tous_orphelins.php
@@ -0,0 +1,56 @@
+<?php
+
+/***************************************************************************\
+ *  SPIP, Systeme de publication pour l'internet                           *
+ *                                                                         *
+ *  Copyright (c) 2001-2011                                                *
+ *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
+ *                                                                         *
+ *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
+ *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
+\***************************************************************************/
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+include_spip('base/abstract_sql');
+
+function action_supprimer_tous_orphelins() {
+
+	$securiser_action = charger_fonction('securiser_action','inc');
+	$arg = $securiser_action();
+
+	//on recupere le contexte pour ne supprimer les orphelins que de ce dernier
+	list($media,$distant,$statut,$sanstitre) = explode('/',$arg);
+	
+	//critere sur le media
+	if($media) {
+		$select = sql_get_select("extension","spip_types_documents as nnnn","media=".sql_quote($media));
+		$where[] = "spip_documents.extension IN ($select)";
+	}
+
+	//critere sur le distant
+	if($distant)
+		$where[] = "distant=".sql_quote($distant);
+
+	//critere sur le statut
+	if($statut)
+		$where[] = "statut REGEXP ".sql_quote("($statut)");
+
+	//critere sur le sanstitre
+	if($sanstitre)
+		$where[] = "titre=''";
+
+	//on isole les orphelins
+	$select = sql_get_select("DISTINCT id_document","spip_documents_liens as oooo");
+	$cond = "spip_documents.id_document NOT IN ($select)";
+	$where[] = $cond;
+
+	$ids_doc_orphelins = sql_select( "id_document", "spip_documents", $where );
+
+	$supprimer_document = charger_fonction('supprimer_document','action');
+	while ($row = sql_fetch($ids_doc_orphelins)) {
+		$supprimer_document($row['id_document']); // pour les orphelins du contexte, on traite avec la fonction existante
+	}
+}
+
+?>
\ No newline at end of file
diff --git a/medias_autoriser.php b/medias_autoriser.php
index 30c7a4167365e30038f1f5c513e8d37670cc88c1..61c36d452b1d8c7c360c8ad0b443047354ad5f6a 100644
--- a/medias_autoriser.php
+++ b/medias_autoriser.php
@@ -39,10 +39,10 @@ function autoriser_document_tailler_dist($faire,$quoi,$id,$qui,$options) {
 		return false;
 	if (!autoriser('modifier','document',$id,$qui,$options))
 		return false;
-
+	
 	if (!isset($options['document']) OR !$document = $options['document'])
 		$document = sql_fetsel('*','spip_documents','id_document='.intval($id_document));
-
+	
 	// (on ne le propose pas pour les images qu'on sait
 	// lire : gif jpg png), sauf bug, ou document distant
 	if (in_array($document['extension'], array('gif','jpg','png'))
@@ -50,7 +50,7 @@ function autoriser_document_tailler_dist($faire,$quoi,$id,$qui,$options) {
 		AND $document['largeur']
 		AND $document['distant']!='oui')
 		return false;
-
+	
 	// Donnees sur le type de document
 	$extension = $document['extension'];
 	$type_inclus = sql_getfetsel('inclus','spip_types_documents', "extension=".sql_quote($extension));
@@ -145,13 +145,21 @@ function autoriser_document_supprimer($faire, $type, $id, $qui, $opt){
 		OR !$qui['id_auteur']
 		OR !autoriser('ecrire','','',$qui))
 		return false;
+
+	// ne pas considerer les document parent
+	// (cas des vignettes ou autre document annexe rattache a un document)
+	if (sql_countsel('spip_documents_liens', "objet!='document' AND id_document=".intval($id)))
+		return false;
+
 	// si c'est une vignette, se ramener a l'autorisation de son parent
 	if (sql_getfetsel('mode','spip_documents','id_document='.intval($id))=='vignette'){
 		$id_document = sql_getfetsel('id_document','spip_documents','id_vignette='.intval($id));
-	  return !$id_document OR autoriser('modifier','document',$id_document);
+		return !$id_document OR autoriser('modifier','document',$id_document);
+	}
+  // si c'est un document annexe, se ramener a l'autorisation de son parent
+	if ($id_document=sql_getfetsel('id_objet','spip_documents_liens',"objet='document' AND id_document=".intval($id))){
+		return autoriser('modifier','document',$id_document);
 	}
-	if (sql_countsel('spip_documents_liens', 'id_document='.intval($id)))
-		return false;
 
 	return autoriser('modifier','document',$id,$qui,$opt);
 }
@@ -203,7 +211,7 @@ function autoriser_autoassocierdocument_dist($faire, $type, $id, $qui, $opts) {
 /**
  * Autoriser a nettoyer les orphelins de la base des documents
  * reserve aux admins complets
- * 
+ *
  * @param  $faire
  * @param  $type
  * @param  $id