diff --git a/ecrire/inc/utils.php b/ecrire/inc/utils.php
index 7449a06c6c59d1c2e35927aa4215c572e6e84cc3..88d7e89aba610cf7fc00f60579bebeb3a0cad802 100644
--- a/ecrire/inc/utils.php
+++ b/ecrire/inc/utils.php
@@ -919,9 +919,20 @@ function generer_form_public($script, $corps, $atts='') {
 // http://doc.spip.org/@generer_url_action
 function generer_url_action($script, $args="", $no_entities=false ,$rel = false) {
 
-	return  generer_url_public('',
+	$url = './';
+	$url = parametre_url($url,'action',$script);
+	if ($args) $url .= '&'.$args;
+	if ($redirect = parametre_url($url,'redirect')){
+		if (test_espace_prive() 
+		  AND substr($redirect,0,strlen(_DIR_RESTREINT_ABS))==_DIR_RESTREINT_ABS)
+			$redirect = './'.substr($redirect,strlen(_DIR_RESTREINT_ABS));
+			$url = parametre_url($url,'redirect',$redirect);
+	}
+	if ($no_entities) $url = str_replace('&','&',$url);
+	/*return  generer_url_public('',
 				  "action=$script" .($args ? "&$args" : ''),
-				  $no_entities,$rel);
+				  $no_entities,$rel);*/
+	return $url;
 }
 
 
diff --git a/ecrire/index.php b/ecrire/index.php
index 1b89eb6ce22455fd376907ba13ce8ef43cce5edc..daa1b83df61c2addc828d1c3601fc43ba0ea6cc3 100644
--- a/ecrire/index.php
+++ b/ecrire/index.php
@@ -169,7 +169,7 @@ AND $l = @unserialize($l)) {
 	}
 }
 
-if (_request('var_ajax') OR _request('formulaire_action')){
+if (_request('action') OR _request('var_ajax') OR _request('formulaire_action')){
 	include_spip('public/assembler');
 	traiter_formulaires_dynamiques();
 }
diff --git a/ecrire/public.php b/ecrire/public.php
index e64b26213463410f2e041267657a71b5ba243d45..3c0e5f3358805d7d9403eb08ec3af952dc262f98 100644
--- a/ecrire/public.php
+++ b/ecrire/public.php
@@ -55,22 +55,8 @@ if ($GLOBALS['_INC_PUBLIC']>0) {
 
 
 	// Est-ce une action ?
-	if ($action = _request('action')) {
-		define('_ESPACE_PRIVE', true);
-		include_spip('base/abstract_sql'); // chargement systematique pour les actions
-		include_spip('inc/autoriser'); // chargement systematique pour les actions
-		include_spip('inc/headers');
-		$var_f = charger_fonction($action, 'action');
-		$var_f();
-		if ($GLOBALS['redirect']
-		OR $GLOBALS['redirect'] = _request('redirect'))
-			redirige_par_entete(urldecode($GLOBALS['redirect']));
-
-		if (!headers_sent()
-		AND !ob_get_length())
-			http_status(204); // No Content
-		exit;
-	}
+	// les action sont gerees dans public/assembler/traiter_formulaires_dynamiques
+	// de maniere unifiees public/prive
 
 /*	// Code experimental pour faire marcher ecrire/ a partir de spip.php
 	// pour tester decommenter et indiquer dans mes_options :
diff --git a/ecrire/public/assembler.php b/ecrire/public/assembler.php
index 1d706e5f2156610165a1f1a0537f2139df5cc26e..7348652ba66c1e62d60499a43efad497056f94cc 100644
--- a/ecrire/public/assembler.php
+++ b/ecrire/public/assembler.php
@@ -78,6 +78,41 @@ function init_var_mode(){
 function traiter_formulaires_dynamiques(){
 	static $done = false;
 	if (!$done) {
+		if ($action = _request('action')) {
+			define('_ESPACE_PRIVE', true);
+			include_spip('base/abstract_sql'); // chargement systematique pour les actions
+			include_spip('inc/autoriser'); // chargement systematique pour les actions
+			include_spip('inc/headers');
+			if (($v=_request('var_ajax'))
+			 AND ($v!=='form')
+			 AND ($args = _request('var_ajax_env'))
+			 AND ($cle = _request('var_ajax_cle')) 
+			 AND ($url = _request('redirect'))){
+				$url = parametre_url($url,'var_ajax',$v,'&');
+				$url = parametre_url($url,'var_ajax_env',$args,'&');
+				$url = parametre_url($url,'var_ajax_cle',$cle,'&');
+				set_request('redirect',$url);
+			}
+			$var_f = charger_fonction($action, 'action');
+			$var_f();
+			if ($GLOBALS['redirect']
+			OR $GLOBALS['redirect'] = _request('redirect')){
+				$url = urldecode($GLOBALS['redirect']);
+				if (($v=_request('var_ajax'))
+				 AND ($v!=='form')
+				 AND ($args = _request('var_ajax_env'))
+				 AND ($cle = _request('var_ajax_cle')) ){
+					$url = parametre_url($url,'var_ajax',$v,'&');	
+					$url = parametre_url($url,'var_ajax_env',$args,'&');	
+					$url = parametre_url($url,'var_ajax_cle',$cle,'&');	
+				}
+				redirige_par_entete($url);
+			}
+			if (!headers_sent()
+			AND !ob_get_length())
+				http_status(204); // No Content
+			exit;
+		}
 		// traiter les appels de bloc ajax
 		if (($v=_request('var_ajax'))
 		 AND ($v!=='form')