diff --git a/.gitattributes b/.gitattributes
index c7fe1fea6271d19ccc1740fb55e1fab654ebe7fa..0e2ac8d53d8c6b725975d8f0820108711ada338d 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -319,6 +319,7 @@ ecrire/inc_sites_tous.php -text
 ecrire/inc_spip_action_autoriser.php -text
 ecrire/inc_spip_action_ical.php -text
 ecrire/inc_spip_action_iconifier.php -text
+ecrire/inc_spip_action_instituer.php -text
 ecrire/inc_spip_action_joindre.php -text
 ecrire/inc_spip_action_purger.php -text
 ecrire/inc_spip_action_redirect.php -text
diff --git a/ecrire/inc_articles.php b/ecrire/inc_articles.php
index aa3de94da7061fd1968351b5af9444a4a21c2256..07b6961d767b67dd3a578077cf76a609cdc7d32c 100644
--- a/ecrire/inc_articles.php
+++ b/ecrire/inc_articles.php
@@ -506,28 +506,6 @@ function   comparer_statut_articles($id_article, $statut_nouv, $statut_article,
 	return $ok_nouveau_statut ;
 }
 
-function changer_statut_articles($id_article, $statut)
-{
-	global $connect_toutes_rubriques;
-
-	$id_article = intval($id_article);
-	$result = spip_query("SELECT statut,id_rubrique FROM spip_articles WHERE id_article=$id_article");
-
-	if ($row = spip_fetch_array($result)) {
-		$id_rubrique= $row['id_rubrique'];
-		$statut_ancien = $row['statut'];
-		}
-
-	if (($statut != $statut_ancien) AND 
-	    ($connect_toutes_rubriques OR acces_rubrique($id_rubrique))) {
-		spip_query("UPDATE spip_articles SET statut='$statut', date=NOW() WHERE id_article=$id_article");			
-		include_ecrire("inc_rubriques");
-		include_ecrire('inc_texte');
-		calculer_rubriques();
-
-		cron_articles($id_article, $statut, $statut_ancien);
-	}
-}
 
 function cron_articles($id_article, $statut, $statut_ancien)
 {
diff --git a/ecrire/inc_breves.php b/ecrire/inc_breves.php
index d10565946258b9f029ae04ec22f2db2ff04681ba..73cea0c1885c1a61ad90b83fb1fa2aeafcb212dd 100644
--- a/ecrire/inc_breves.php
+++ b/ecrire/inc_breves.php
@@ -49,25 +49,6 @@ function enfant_breves($leparent){
 	}
 }
 
-function changer_statut_breves($id_breve, $statut)
-{
-	$id_breve = intval($id_breve);
-	$query = "SELECT statut FROM spip_breves WHERE id_breve=$id_breve";
-	$result = spip_query($query);
-	if ($row = spip_fetch_array($result)) {
-		$id_rubrique= $row['id_rubrique'];
-		$statut_ancien = $row['statut'];
-		}
-
-	if (($statut != $statut_ancien) AND 
-	    ($connect_toutes_rubriques OR acces_rubrique($id_rubrique))) {
-		spip_query("UPDATE spip_breves SET date_heure=NOW(), statut='$statut' WHERE id_breve=$id_breve");
-
-		include_ecrire("inc_rubriques");
-		calculer_rubriques();
-	}
-}
-
 function breves_dist()
 {
 	global $connect_statut,$id_breve, $statut, $id_rubrique;
diff --git a/ecrire/inc_forum.php3 b/ecrire/inc_forum.php3
index 1fc4e7b5a78abcbc5ba56f25adb98644c75c60a6..65e7ab7853a1bfe18b852025b866d5f9e6cf4dd5 100644
--- a/ecrire/inc_forum.php3
+++ b/ecrire/inc_forum.php3
@@ -85,25 +85,23 @@ function boutons_controle_forum($id_forum, $forum_stat, $forum_id_auteur=0, $ref
 	}
 
 	$link = new Link();
-	$link = $link->geturl() . "#id$id_forum";
-	$ulink = urlencode($link);
+	$link = _DIR_RESTREINT_ABS . $link->geturl() . "#id$id_forum";
 
 	if ($supprimer)
-		$controle .= icone(_T('icone_supprimer_message'), generer_url_ecrire('iframe_action', "action=forum_admin&id=$id_forum&statut=$supprimer&redirect=$ulink"),
+	  $controle .= icone(_T('icone_supprimer_message'), generer_action_auteur('instituer', "forum $id_forum $supprimer", $link),
 			$logo,
 			"supprimer.gif", 'right', 'non');
 
 	if ($valider)
-		$controle .= icone(_T('icone_valider_message'), generer_url_ecrire('iframe_action', "action=forum_admin&id=$id_forum&statut=$valider&redirect=$ulink"),
+		$controle .= icone(_T('icone_valider_message'), generer_action_auteur('instituer', "forum $id_forum $valider", $link),
 			$logo,
 			"creer.gif", 'right', 'non');
 
 	if ($valider_repondre) {
 
-	  $redirect =  urlencode(generer_url_public('forum', "$ref&id_forum=$id_forum&retour=" . urlencode(_DIR_RESTREINT_ABS . $link), true));
-	  $controle .= icone(_T('icone_valider_message') . " & " .   _T('lien_repondre_message'), generer_url_ecrire('iframe_action', "action=forum_admin&id=$id_forum&statut=$valider&redirect=$redirect"),
-				   $logo,
-				   "creer.gif", 'right', 'non');
+	  $controle .= icone(_T('icone_valider_message') . " & " .   _T('lien_repondre_message'), generer_action_auteur('instituer', "forum $id_forum $valider", generer_url_public('forum', "$ref&id_forum=$id_forum&retour=" . urlencode($link), true)),
+			     $logo,
+			     "creer.gif", 'right', 'non');
 	}
 
 	return $controle;
diff --git a/ecrire/inc_forum_admin.php b/ecrire/inc_forum_admin.php
index e40ca06b94c0d093a6a188532624c7a68a0a1fca..c2a7950aaa7918310abdd30b7e9e7b4e56549953 100644
--- a/ecrire/inc_forum_admin.php
+++ b/ecrire/inc_forum_admin.php
@@ -90,50 +90,4 @@ function forum_admin_dist()
 
   fin_page();
 }
-
-
-//
-// Suppression de forums 
-//
-
-# fonction invoquee par calcul dans iframe_action
-# Elle n'a rien a faire ici en fait, et devra migrer en inc_forum
-# quand on abandonnera les .php 3
-
-function changer_statut_forum_admin($id_forum, $statut) {
-	$id_forum = intval($id_forum);
-	$result = spip_query("SELECT * FROM spip_forum WHERE id_forum=$id_forum");
-	if (!($row = spip_fetch_array($result)))
-		return;
-
-	$id_parent = $row['id_parent'];
-
-	// invalider les pages comportant ce forum
-	include_ecrire('inc_invalideur');
-	include_ecrire('inc_forum');
-	$index_forum = calcul_index_forum($row['id_article'], $row['id_breve'], $row['id_rubrique'], $row['id_syndic']);
-	suivre_invalideur("id='id_forum/$index_forum'");
-
-	// Signaler au moteur de recherche qu'il faut reindexer le thread
-	if ($id_parent) {
-		include_ecrire('inc_index');
-		marquer_indexer ('forum', $id_parent);
-	}
-
-	// changer le statut de toute l'arborescence dependant de ce message
-	$id_messages = array($id_forum);
-	while ($id_messages) {
-		$id_messages = join(',', $id_messages);
-		$query_forum = "UPDATE spip_forum SET statut='$statut'
-		WHERE id_forum IN ($id_messages)";
-		$result_forum = spip_query($query_forum);
-		$query_forum = "SELECT id_forum FROM spip_forum
-		WHERE id_parent IN ($id_messages)";
-		$result_forum = spip_query($query_forum);
-		unset($id_messages);
-		while ($row = spip_fetch_array($result_forum))
-			$id_messages[] = $row['id_forum'];
-	}
-}
-
 ?>
diff --git a/ecrire/inc_minipres.php b/ecrire/inc_minipres.php
index a7736661ed06bf5c522c450ce426baaba78d8801..00e6bf8d5d91633ded59ef73c334a7ec7a88465a 100644
--- a/ecrire/inc_minipres.php
+++ b/ecrire/inc_minipres.php
@@ -110,32 +110,6 @@ function info_dist() {
 	if ($connect_statut == '0minirezo') phpinfo();
 }
 
-
-// normalement il faudrait definir inc_iframe_action.php, mais pour mettre juste ca:
-
-function iframe_action_dist()
-{
-	global $connect_statut, $id, $action, $statut, $redirect;
-	if ($id && ($connect_statut == "0minirezo")) {
-
-		$var_f = find_in_path('inc_' . $action);
-		if ($var_f) 
-		  include($var_f);
-		else
-		  include_ecrire('inc_' . $action);
-
-		$var_nom = 'changer_statut_' . $action;
-		if (function_exists($var_nom))
-		  $var_nom($id, $statut);
-		else spip_log("fonction $var_nom indisponible dans $var_f");
-	}
-	
-	if (!$redirect)
-	  header("Cache-Control: no-store, no-cache, must-revalidate");
-	else
-	  header("Location: " . urldecode($redirect));
-}
-
 // Afficher le bouton "preview" dans l'espace public
 function afficher_bouton_preview() {
 		$x = _T('previsualisation');
diff --git a/ecrire/inc_presentation.php3 b/ecrire/inc_presentation.php3
index 71c88caf8747dca4d6165214587e9f97b061d874..d8fa1e72e6fcc3b47bacfdb245a228c0eb0beaac 100644
--- a/ecrire/inc_presentation.php3
+++ b/ecrire/inc_presentation.php3
@@ -672,7 +672,7 @@ function afficher_script_statut($id, $type, $n, $img, $statut, $title, $act)
   return http_href_img("javascript:selec_statut('$id', '$type', -1, '" .
 		      _DIR_IMG_PACK . $img .
 		      "', '" .
-		       generer_url_ecrire('iframe_action', "action=$type"."s&id=$id&statut=$statut",false,true) .
+		       generer_action_auteur('instituer', "$type $id $statut") .
 		      "');",
 		      $img,
 			"title=\"".$title."\"",
@@ -3259,8 +3259,8 @@ function debloquer_article($arg, $texte)
 {
 	$lien = new Link;
 	$lien->addVar('debloquer_article', $arg);
-	$lien = urlencode($lien->getUrl());
-	return "<a href='" . generer_url_ecrire('iframe_action', "action=articles_page&id=$arg&redirect=$lien") .
+	$lien = (_DIR_RESTREINT_ABS . $lien->getUrl());
+	return "<a href='" . generer_action_auteur('instituer', "collaboration $arg", $lien) .
 	  "' title='" .
 	  addslashes($texte) .
 	  "'>$texte&nbsp;" .
diff --git a/ecrire/inc_session.php3 b/ecrire/inc_session.php3
index 265465a1d58c4e52984b6fd014ed21089aedaeaa..37d8bcf96e00d987d5731a04b0bc29d9ac597d6a 100644
--- a/ecrire/inc_session.php3
+++ b/ecrire/inc_session.php3
@@ -10,7 +10,7 @@
  *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
 \***************************************************************************/
 
-//
+
 if (!defined("_ECRIRE_INC_VERSION")) return;
 
 include_ecrire ("inc_meta");
@@ -279,4 +279,11 @@ function verifier_action_auteur($action, $valeur, $id_auteur = 0) {
 	return false;
 }
 
+function generer_action_auteur($action, $arg, $redirect="", $no_entites=false)
+{
+	global $connect_id_auteur;
+	$hash = calculer_action_auteur("$action $arg");
+	if ($redirect) $redirect = "&redirect=" . urlencode($redirect);
+	return generer_url_public("spip_action.php", "action=$action&arg=$arg&id_auteur=$connect_id_auteur&hash=$hash$redirect", $no_entites);
+}
 ?>
diff --git a/ecrire/inc_spip_action_instituer.php b/ecrire/inc_spip_action_instituer.php
new file mode 100644
index 0000000000000000000000000000000000000000..60afeddcc26a08f4572d7ba6d3ffe2642f495f0b
--- /dev/null
+++ b/ecrire/inc_spip_action_instituer.php
@@ -0,0 +1,118 @@
+<?php
+
+/***************************************************************************\
+ *  SPIP, Systeme de publication pour l'internet                           *
+ *                                                                         *
+ *  Copyright (c) 2001-2006                                                *
+ *  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_ecrire("inc_session");
+
+function spip_action_instituer_dist()
+{
+	global $arg, $action, $hash, $id_auteur;
+
+  if (!verifier_action_auteur("$action $arg", $hash, $id_auteur))
+	spip_log("spip_action: $action $arg interdit a $id_auteur");
+  else {
+    ereg("^([^ ]*) (.*)$", $arg, $r);
+    $var_nom = 'instituer_' . $r[1];
+    if (function_exists($var_nom))
+      $var_nom($r[2]);
+    else spip_log("spip_action_$action: $arg incompris");
+  }
+}
+
+function instituer_collaboration($debloquer_article)
+{
+        global $id_auteur;
+        if ($debloquer_article) {
+                if ($debloquer_article <> 'tous')
+                        $where_id = "AND id_article=".intval($debloquer_article);
+                $query = "UPDATE spip_articles SET auteur_modif='0' WHERE auteur_modif=$id_auteur $where_id";
+                spip_query ($query);
+        }
+}
+
+function instituer_forum($arg) {
+	list($id_forum, $statut) = split(' ', $arg);
+	$id_forum = intval($id_forum);
+	$result = spip_query("SELECT * FROM spip_forum WHERE id_forum=$id_forum");
+	if (!($row = spip_fetch_array($result)))
+		return;
+
+	$id_parent = $row['id_parent'];
+
+	// invalider les pages comportant ce forum
+	include_ecrire('inc_invalideur');
+	include_ecrire('inc_forum');
+	$index_forum = calcul_index_forum($row['id_article'], $row['id_breve'], $row['id_rubrique'], $row['id_syndic']);
+	suivre_invalideur("id='id_forum/$index_forum'");
+
+	// Signaler au moteur de recherche qu'il faut reindexer le thread
+	if ($id_parent) {
+		include_ecrire('inc_index');
+		marquer_indexer ('forum', $id_parent);
+	}
+
+	// changer le statut de toute l'arborescence dependant de ce message
+	$id_messages = array($id_forum);
+	while ($id_messages) {
+		$id_messages = join(',', $id_messages);
+		$query_forum = "UPDATE spip_forum SET statut='$statut'
+		WHERE id_forum IN ($id_messages)";
+		$result_forum = spip_query($query_forum);
+		$query_forum = "SELECT id_forum FROM spip_forum
+		WHERE id_parent IN ($id_messages)";
+		$result_forum = spip_query($query_forum);
+		unset($id_messages);
+		while ($row = spip_fetch_array($result_forum))
+			$id_messages[] = $row['id_forum'];
+	}
+}
+
+function instituer_article($arg)
+{	list($id_article, $statut) = split(' ', $arg);
+
+	$id_article = intval($id_article);
+	$result = spip_query("SELECT statut FROM spip_articles WHERE id_article=$id_article");
+
+	if ($row = spip_fetch_array($result)) {
+		$statut_ancien = $row['statut'];
+		}
+
+	if ($statut != $statut_ancien) {
+		spip_query("UPDATE spip_articles SET statut='$statut', date=NOW() WHERE id_article=$id_article");			
+		include_ecrire("inc_rubriques");
+		include_ecrire('inc_texte');
+		calculer_rubriques();
+
+		cron_articles($id_article, $statut, $statut_ancien);
+	}
+}
+
+
+function instituer_breve($arg)
+{	list($id_breve, $statut) = split(' ', $arg);
+
+	$id_breve = intval($id_breve);
+	$query = "SELECT statut FROM spip_breves WHERE id_breve=$id_breve";
+	$result = spip_query($query);
+	if ($row = spip_fetch_array($result)) {
+		$statut_ancien = $row['statut'];
+		}
+
+	if ($statut != $statut_ancien) {
+		spip_query("UPDATE spip_breves SET date_heure=NOW(), statut='$statut' WHERE id_breve=$id_breve");
+
+		include_ecrire("inc_rubriques");
+		calculer_rubriques();
+	}
+}
+?>
diff --git a/ecrire/inc_upgrade.php b/ecrire/inc_upgrade.php
index c6cb583ce94c64d3770bdbe638dae1acab7a73e0..699cf2759257e43d432c2844ac6fa08d7e489cea 100644
--- a/ecrire/inc_upgrade.php
+++ b/ecrire/inc_upgrade.php
@@ -82,10 +82,7 @@ function upgrade_dist()
   fin_admin($upgrade_titre);
 
   if ($ok) {
-	$action = 'purger';
-	$arg = 'cache';
-	$hash = calculer_action_auteur("$action $arg");
-	redirige_par_entete(generer_url_public("spip_action.php"), "?action=$action&id_auteur=$connect_id_auteur&hash=$hash&redirect=" .  _DIR_RESTREINT_ABS);
+	redirige_par_entete(generer_action_auteur('purger', 'cache', _DIR_RESTREINT_ABS, true));
   }
   else {
 	echo _T('alerte_maj_impossible', array('version' => $spip_version));