diff --git a/.gitattributes b/.gitattributes
index b08ce3a644553e2ed0a5951c653aa9de9fc29933..aff3eab5f145c0594ad6e46cdb7664a029c5ae53 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -23,9 +23,12 @@ formulaires/editer_document.php -text
 formulaires/illustrer_document.html -text
 formulaires/illustrer_document.php -text
 formulaires/inc-lister_archive_jointe.html -text
-formulaires/inc-upload_document.html -text
 formulaires/joindre_document.html -text
 formulaires/joindre_document.php -text
+formulaires/methodes_upload/distant.html -text
+formulaires/methodes_upload/ftp.html -text
+formulaires/methodes_upload/mediatheque.html -text
+formulaires/methodes_upload/upload.html -text
 inc/choisir_mode_document.php -text
 inc/documenter_objet.php -text
 inc/documents.php -text
diff --git a/formulaires/inc-upload_document.html b/formulaires/inc-upload_document.html
deleted file mode 100644
index 97de81e7c3bc770863e506b771f06f72266de6dd..0000000000000000000000000000000000000000
--- a/formulaires/inc-upload_document.html
+++ /dev/null
@@ -1,133 +0,0 @@
-#SET{domid,_#ENV{mode}|concat{'_',#ENV{id,new}}}
-#SET{methode,upload}
-[(#ENV{joindre_mediatheque}|oui)#SET{methode,mediatheque}]
-[(#ENV{joindre_distant}|oui)#SET{methode,distant}]
-[(#ENV{joindre_ftp}|oui)#SET{methode,ftp}]
-
-<div id="defaultsubmit#GET{domid}" class="none"></div>
-[
-(#REM) Formulaire d'upload de fichier
-]<div class='joindre_mode#GET{domid}[(#GET{methode}|=={upload}|non)none-js]' id='joindre_upload#GET{domid}'>
-	<div class="editer-groupe">
-		<div class='editer editer_fichier_upload[ (#ENV**{erreurs}|table_valeur{fichier_upload}|oui)erreur]'>
-			<label for='fichier_upload#GET{domid}'><:bouton_upload:></label>[
-			<span class='erreur_message'>(#ENV**{erreurs}|table_valeur{fichier_upload})</span>
-			]<input class='file multi' type="file" name="fichier_upload[]" value='[(#ENV{fichier_upload}|is_array|?{'', #ENV{fichier_upload}})]' id="fichier_upload#GET{domid}" size='11' />
-			<!--editer_fichier_upload-->
-		</div>
-	</div>
-	<div class='sourceup'>
-		<:medias:bouton_download_depuis:>
-		<:medias:bouton_download_local:>
-		[(#ENV{mediatheque,''}|oui)
-		| <a href='#' onclick="change_methode('#GET{domid}','mediatheque');return false;"><:medias:bouton_download_par_mediatheque:></a>]
-		[(#ENV{proposer_ftp,''}|oui)
-		| <a href='#' onclick="change_methode('#GET{domid}','ftp');return false;"><:medias:bouton_download_par_ftp:></a>]
-		| <a href='#' onclick="change_methode('#GET{domid}','distant');return false;"><:medias:bouton_download_sur_le_web:></a>
-	</div>
-	<p class='boutons'><input class='submit' type="submit" name="joindre_upload" value="<:bouton_upload:>"/></p>
-</div>[
-(#REM) Formulaire pour document dans mediatheque
-][(#ENV{mediatheque,''}|oui)
-<div class='joindre_mode#GET{domid}[(#GET{methode}|=={mediatheque}|non)none-js]' id='joindre_mediatheque#GET{domid}'>
-	<div class="editer-groupe">
-		<div class='editer editer_refdoc_joindre[ (#ENV**{erreurs}|table_valeur{refdoc_joindre}|oui)erreur]'>
-			<label for='refdoc_joindre#GET{domid}'><:medias:label_refdoc_joindre:></label>[
-			<span class='erreur_message'>(#ENV**{erreurs}|table_valeur{refdoc_joindre})</span>
-			]<input class='text' type="text" name="refdoc_joindre" value='#ENV{refdoc_joindre}' id="refdoc_joindre#GET{domid}"/>
-			<input class='submit' type="button" name="parcourir" value="<:medias:bouton_parcourir:>"
-				onclick="jQuery.modalboxload('#URL_ECRIRE{popin-choisir_document,var_zajax=contenu&selectfunc=mediaselect#GET{domid}}',{autoResize: true});"
-			/>
-			<!--editer_refdoc_joindre-->
-		</div>
-	</div>
-	<script type="text/javascript">/*<!\[CDATA\[*/
-	function mediaselect#GET{domid}(id){jQuery.modalboxclose();jQuery("#refdoc_joindre#GET{domid}").attr('value','doc'+id).focus();jQuery('#joindre_mediatheque#GET{domid}>.boutons input').get(0).click();}
-	/*\]\]>*/</script>
-	<div class='sourceup'>
-		<:medias:bouton_download_depuis:>
-			<a href='#' onclick="change_methode('#GET{domid}','upload');return false;"><:medias:bouton_download_local:></a>
-		| <:medias:bouton_download_par_mediatheque:>
-		[(#ENV{proposer_ftp,''}|oui)
-		| <a href='#' onclick="change_methode('#GET{domid}','ftp');return false;"><:medias:bouton_download_par_ftp:></a>]
-		| <a href='#' onclick="change_methode('#GET{domid}','distant');return false;"><:medias:bouton_download_sur_le_web:></a>
-	</div>
-	<p class='boutons'><input class='submit' type="submit" name="joindre_mediatheque" value="<:medias:bouton_attacher_document:>"/></p>
-</div>
-][
-(#REM) Formulaire pour upload ftp
-][(#ENV{proposer_ftp,''}|oui)
-<div class='joindre_mode#GET{domid}[(#GET{methode}|=={ftp}|non)none-js]' id='joindre_ftp#GET{domid}'>
-	[
-	<div class="editer-groupe">
-		<div class='editer editer_cheminftp[ (#ENV**{erreurs}|table_valeur{cheminftp}|oui)erreur]'>
-			<label for='cheminftp#GET{domid}'>[(#VAL{info_selectionner_fichier}|_T{#ARRAY{upload,#ENV*{_dir_upload_ftp}}})]</label>[
-			<span class='erreur_message'>(#ENV**{erreurs}|table_valeur{cheminftp})</span>
-			]<select name='cheminftp' id='cheminftp#GET{domid}' size='1'>
-			<option value=''>&gt;&gt;</option>
-			(#ENV*{_options_upload_ftp})
-			</select>
-			<!--editer_cheminftp-->
-		</div>
-	</div>][(#ENV{_dir_upload_ftp}|et{#ENV{_options_upload_ftp}|non}|oui)
-	<p class="infos">
-	[(#VAL{info_installer_ftp}|_T{#ARRAY{upload,#ENV*{_dir_upload_ftp}}})] #AIDER{ins_upload}
-	</p>
-	]
-	<div class='sourceup'>
-		<:medias:bouton_download_depuis:>
-		<a href='#' onclick="change_methode('#GET{domid}','upload');return false;"><:medias:bouton_download_local:></a>
-		[(#ENV{mediatheque,''}|oui)
-		| <a href='#' onclick="change_methode('#GET{domid}','mediatheque');return false;"><:medias:bouton_download_par_mediatheque:></a>]
-		| <:medias:bouton_download_par_ftp:>
-		| <a href='#' onclick="change_methode('#GET{domid}','distant');return false;"><:medias:bouton_download_sur_le_web:></a>
-	</div>
-	<p class='boutons'>
-		[(#ENV*{_options_upload_ftp}|oui)
-		<input class='submit' type="submit" name="joindre_ftp" value="<:bouton_choisir:>"/>
-		]
-	</p>
-</div>
-][
-
-
-
-
-(#REM) Formulaire pour document distant
-]<div class='joindre_mode#GET{domid}[(#GET{methode}|=={distant}|non)none-js]' id='joindre_distant#GET{domid}'>
-	<div class="editer-groupe">
-		<div class='editer editer_url[ (#ENV**{erreurs}|table_valeur{url}|oui)erreur]'>
-			<label for='url#GET{domid}'><:medias:info_referencer_doc_distant:></label>[
-			<span class='erreur_message'>(#ENV**{erreurs}|table_valeur{url})</span>
-			]<input class='text' type="text" name="url" value='#ENV{url}' id="url#GET{domid}"/>
-			<!--editer_url-->
-		</div>
-	</div>
-	<div class='sourceup'>
-		<:medias:bouton_download_depuis:>
-			<a href='#' onclick="change_methode('#GET{domid}','upload');return false;"><:medias:bouton_download_local:></a>
-		[(#ENV{mediatheque,''}|oui)
-		| <a href='#' onclick="change_methode('#GET{domid}','mediatheque');return false;"><:medias:bouton_download_par_mediatheque:></a>]
-		[(#ENV{proposer_ftp,''}|oui)
-		| <a href='#' onclick="change_methode('#GET{domid}','ftp');return false;"><:medias:bouton_download_par_ftp:></a>]
-		| <:medias:bouton_download_sur_le_web:>
-	</div>
-	<p class='boutons'><input class='submit' type="submit" name="joindre_distant" value="<:bouton_choisir:>"/></p>
-</div>[
-(#REM) Formulaire pour deballer un zip
-][<div class="editer-groupe"><div class='fieldset deballer_zip'>(#ENV**{erreurs}|table_valeur{lister_contenu_archive})</div></div>]
-
-<script type='text/javascript'>/*<!#EVAL{chr(91)}CDATA#EVAL{chr(91)}*/
-if (window.jQuery){
-function change_methode(domid,methode){
-	var id = "#joindre_"+methode+domid;
-	if (jQuery(id).is(':hidden')) {
-		jQuery('div.joindre_mode'+domid+':visible').slideUp('fast');
-		jQuery(id).slideDown('fast');
-	}
-	// placer en haut du formulaire les boutons submit par defaut correspondant a la methode active
-	jQuery("#defaultsubmit"+domid).html('').append(jQuery(id).find('.boutons').eq(-1).find('input').clone(true));
-}
-jQuery(function(){change_methode('#GET{domid}','#GET{methode}');});
-}
-/*#EVAL{chr(93)}[(#EVAL{chr(93)})]>*/</script>
diff --git a/formulaires/joindre_document.html b/formulaires/joindre_document.html
index 1d3c2c7bf08b33d5ee240e0f82ac0b42d72bcf14..1d91f9a7ae1963aaff7622932e07ad79c4aa1f8b 100644
--- a/formulaires/joindre_document.html
+++ b/formulaires/joindre_document.html
@@ -13,9 +13,60 @@
 	
 	<form action="#ENV{action}#formulaire_joindre_document-#ENV{id,new}" method="post" enctype='multipart/form-data'><div>
 		[(#ACTION_FORMULAIRE{#ENV{action}})]
-		
-		[(#INCLURE{fond=formulaires/inc-upload_document, env, mediatheque=#ENV{objet,''}|et{#ENV{id_objet,''}}|et{#ENV{proposer_media}}})]
-		
+
+		[(#GET{mediatheque,[(#ENV{objet,''}|et{#ENV{id_objet,''}}|et{#ENV{proposer_media}})]})]
+
+		#SET{domid,_#ENV{mode}|concat{'_',#ENV{id,new}}}
+		#SET{methode,upload}
+		[(#ENV{joindre_mediatheque}|oui)#SET{methode,mediatheque}]
+		[(#ENV{joindre_distant}|oui)#SET{methode,distant}]
+		[(#ENV{joindre_ftp}|oui)#SET{methode,ftp}]
+
+		<div id="defaultsubmit#GET{domid}" class="none">DEFAULT</div>
+
+		<BOUCLE_methodes(DATA){source tableau,#ENV{_methodes_upload}}>
+			#SET{methode_upload,#CLE}
+			<div class='joindre_mode#GET{domid}[(#GET{methode}|=={#CLE}|non)none-js]' id='joindre_#CLE#GET{domid}'>
+				
+				[(#INCLURE{fond=formulaires/methodes_upload/#CLE, env, mediatheque=#ENV{objet,''}|et{#ENV{id_objet,''}}|et{#ENV{proposer_media}}})]
+
+				<div class='sourceup'>
+					[(#SET{cpt,1})]
+					<:medias:bouton_download_depuis:>
+					<BOUCLE_methodes_liens(DATA){source tableau,#ENV{_methodes_upload}}>
+						[(#GET{cpt}|>{1}|oui)
+							[(#VAL{'|'})]
+						]
+						[(#GET{methode_upload}|=={#CLE}|oui)
+							#VALEUR
+						]
+						[(#GET{methode_upload}|=={#CLE}|non)
+							<a href='#' onclick="change_methode('#GET{domid}','#CLE');return false;">#VALEUR</a>
+						]
+						[(#SET{cpt,#GET{cpt}|plus{1}})]
+					</BOUCLE_methodes_liens>
+				</div>
+				<p class='boutons'><input class='submit' type="submit" name="joindre_#CLE" value="<:bouton_upload:>"/></p>
+			</div>
+		</BOUCLE_methodes>
+
+		[(#REM) Formulaire pour deballer un zip]
+		[<div class="editer-groupe"><div class='fieldset deballer_zip'>(#ENV**{erreurs}|table_valeur{lister_contenu_archive})</div></div>]
+
+		<script type='text/javascript'>/*<!#EVAL{chr(91)}CDATA#EVAL{chr(91)}*/
+		if (window.jQuery){
+		function change_methode(domid,methode){
+			var id = "#joindre_"+methode+domid;
+			if (jQuery(id).is(':hidden')) {
+				jQuery('div.joindre_mode'+domid+':visible').slideUp('fast');
+				jQuery(id).slideDown('fast');
+			}
+			// placer en haut du formulaire les boutons submit par defaut correspondant a la methode active
+			jQuery("#defaultsubmit"+domid).html('').append(jQuery(id).find('.boutons').eq(-1).find('input').clone(true));
+		}
+		jQuery(function(){change_methode('#GET{domid}','#GET{methode}');});
+		}
+		/*#EVAL{chr(93)}[(#EVAL{chr(93)})]>*/</script>
 	</div></form>
 </div>]
 [(#ENV{_galerie,''}|oui)
diff --git a/formulaires/joindre_document.php b/formulaires/joindre_document.php
index a8eee02f4c87983104335fc9c7fbd271762cc5fe..2461b9c2f441d32a5cc7fe6a6ca2c4b6d540b2a3 100644
--- a/formulaires/joindre_document.php
+++ b/formulaires/joindre_document.php
@@ -83,6 +83,23 @@ function formulaires_joindre_document_charger_dist(
 	$valeurs = array();
 	$mode = joindre_determiner_mode($mode, $id_document, $objet);
 
+	// méthodes d'upload disponibles
+	$valeurs['_methodes_upload']['upload'] = _T('medias:bouton_download_local');
+	if($proposer_ftp) {
+		$valeurs['_methodes_upload']['ftp'] = _T('medias:bouton_download_par_ftp');
+		$valeurs['_methodes_upload']['distant'] = _T('medias:bouton_download_sur_le_web');
+	}
+	if($proposer_media && !empty($objet) && $id_objet != 0){
+		$valeurs['_methodes_upload']['mediatheque'] = _T('medias:bouton_download_par_mediatheque');
+	}
+	
+
+	// pipeline pour les méthodes d'upload
+	$valeurs['_methodes_upload'] = pipeline('medias_methodes_upload', array(
+		'args' => array('objet' => $objet, 'id_objet' => $id_objet), 
+		'data' => $valeurs['_methodes_upload']
+	));
+
 	$valeurs['id'] = $id_document;
 	$valeurs['_mode'] = $mode;
 
diff --git a/formulaires/methodes_upload/distant.html b/formulaires/methodes_upload/distant.html
new file mode 100644
index 0000000000000000000000000000000000000000..3cc4791027de49d8969e28bbbd07777ae1547b33
--- /dev/null
+++ b/formulaires/methodes_upload/distant.html
@@ -0,0 +1,8 @@
+<div class="editer-groupe">
+    <div class='editer editer_url[ (#ENV**{erreurs}|table_valeur{url}|oui)erreur]'>
+        <label for='url#GET{domid}'><:medias:info_referencer_doc_distant:></label>[
+        <span class='erreur_message'>(#ENV**{erreurs}|table_valeur{url})</span>
+        ]<input class='text' type="text" name="url" value='#ENV{url}' id="url#GET{domid}"/>
+        <!--editer_url-->
+    </div>
+</div>
\ No newline at end of file
diff --git a/formulaires/methodes_upload/ftp.html b/formulaires/methodes_upload/ftp.html
new file mode 100644
index 0000000000000000000000000000000000000000..faa6c0cfef891b50e5cf1fed89c3fc9c59583073
--- /dev/null
+++ b/formulaires/methodes_upload/ftp.html
@@ -0,0 +1,16 @@
+<div class="editer-groupe">
+    [<div class='editer editer_cheminftp[ (#ENV**{erreurs}|table_valeur{cheminftp}|oui)erreur]'>
+        <label for='cheminftp#GET{domid}'>[(#VAL{info_selectionner_fichier}|_T{#ARRAY{upload,#ENV*{_dir_upload_ftp}}})]</label>[
+        <span class='erreur_message'>(#ENV**{erreurs}|table_valeur{cheminftp})</span>
+        ]<select name='cheminftp' id='cheminftp#GET{domid}' size='1'>
+        <option value=''>&gt;&gt;</option>
+        (#ENV*{_options_upload_ftp})
+        </select>
+        <!--editer_cheminftp-->
+    </div>]
+</div>
+[(#ENV{_dir_upload_ftp}|et{#ENV{_options_upload_ftp}|non}|oui)
+<p class="infos">
+[(#VAL{info_installer_ftp}|_T{#ARRAY{upload,#ENV*{_dir_upload_ftp}}})] #AIDER{ins_upload}
+</p>
+]
\ No newline at end of file
diff --git a/formulaires/methodes_upload/mediatheque.html b/formulaires/methodes_upload/mediatheque.html
new file mode 100644
index 0000000000000000000000000000000000000000..30992ddf5cd6d5466f497956f4256c8bf8da59b6
--- /dev/null
+++ b/formulaires/methodes_upload/mediatheque.html
@@ -0,0 +1,14 @@
+<div class="editer-groupe">
+    <div class='editer editer_refdoc_joindre[ (#ENV**{erreurs}|table_valeur{refdoc_joindre}|oui)erreur]'>
+        <label for='refdoc_joindre#GET{domid}'><:medias:label_refdoc_joindre:></label>[
+        <span class='erreur_message'>(#ENV**{erreurs}|table_valeur{refdoc_joindre})</span>
+        ]<input class='text' type="text" name="refdoc_joindre" value='#ENV{refdoc_joindre}' id="refdoc_joindre#GET{domid}"/>
+        <input class='submit' type="button" name="parcourir" value="<:medias:bouton_parcourir:>"
+            onclick="jQuery.modalboxload('#URL_ECRIRE{popin-choisir_document,var_zajax=contenu&selectfunc=mediaselect#GET{domid}}',{autoResize: true});"
+        />
+        <!--editer_refdoc_joindre-->
+    </div>
+</div>
+<script type="text/javascript">/*<!\[CDATA\[*/
+function mediaselect#GET{domid}(id){jQuery.modalboxclose();jQuery("#refdoc_joindre#GET{domid}").attr('value','doc'+id).focus();jQuery('#joindre_mediatheque#GET{domid}>.boutons input').get(0).click();}
+/*\]\]>*/</script>
\ No newline at end of file
diff --git a/formulaires/methodes_upload/upload.html b/formulaires/methodes_upload/upload.html
new file mode 100644
index 0000000000000000000000000000000000000000..f0a36573faa4fdea57811cf71eb3a8dfb98fc8a7
--- /dev/null
+++ b/formulaires/methodes_upload/upload.html
@@ -0,0 +1,8 @@
+<div class="editer-groupe">
+    <div class='editer editer_fichier_upload[ (#ENV**{erreurs}|table_valeur{fichier_upload}|oui)erreur]'>
+        <label for='fichier_upload#GET{domid}'><:bouton_upload:></label>[
+        <span class='erreur_message'>(#ENV**{erreurs}|table_valeur{fichier_upload})</span>
+        ]<input class='file multi' type="file" name="fichier_upload[]" value='[(#ENV{fichier_upload}|is_array|?{'', #ENV{fichier_upload}})]' id="fichier_upload#GET{domid}" size='11' />
+        <!--editer_fichier_upload-->
+    </div>
+</div>
\ No newline at end of file
diff --git a/paquet.xml b/paquet.xml
index c7a1f4070afdabeb42d960dca880e4f00efefa88..3ff1d90576efc1646c4f4937ecc538742fe350ac 100644
--- a/paquet.xml
+++ b/paquet.xml
@@ -1,7 +1,7 @@
 <paquet
 	prefix="medias"
 	categorie="multimedia"
-	version="2.19.17"
+	version="2.20.0"
 	etat="stable"
 	compatibilite="[3.2.0-dev;3.2.*]"
 	logo="prive/themes/spip/images/portfolio-32.png"
@@ -42,6 +42,7 @@
 	<pipeline nom="afficher_metas_document" action="" />
 	<pipeline nom="medias_documents_visibles" action="" />
 	<pipeline nom="ieconfig_metas" inclure="medias_ieconfig.php" />
+	<pipeline nom="medias_methodes_upload" action='' /> 
 
 	<procure nom="minidoc" version="1.0.2" />
 	<procure nom="ordoc" version="1.1.1" />