diff --git a/public/balises.php b/public/balises.php
index 1c3c6cff4cb969d822e791aef7247563afbcc1b7..c946736caca5b3fc292f77a3cda129e238b6be98 100644
--- a/public/balises.php
+++ b/public/balises.php
@@ -1210,7 +1210,7 @@ function balise_GRAND_TOTAL_dist($p) {
  * tel que `var_mode`.
  *
  * @note
- *     Attention dans un `INCLURE()` ou une balise dynamique, on n'a pas le droit de
+ *     Attention dans un `INCLURE` ou une balise dynamique, on n'a pas le droit de
  *     mettre en cache `#SELF` car il peut correspondre à une autre page (attaque XSS)
  *     (Dans ce cas faire <INCLURE{self=#SELF}> pour différencier les caches.)
  *
diff --git a/public/compiler.php b/public/compiler.php
index 6d7a7341726619c9741f1dd36e014dcd1b01b838..059b54e82ede4235b6d63cef7d29a2df8dbf00c8 100644
--- a/public/compiler.php
+++ b/public/compiler.php
@@ -11,6 +11,7 @@
 
 use Spip\Compilateur\Noeud\Boucle;
 use Spip\Compilateur\Noeud\Contexte;
+use Spip\Compilateur\Noeud\Inclure;
 use Spip\Compilateur\Noeud\Texte;
 
 /**
@@ -50,7 +51,7 @@ include_spip('public/balises');
 // Gestion des jointures
 include_spip('public/jointures');
 
-// Les 2 ecritures INCLURE{A1,A2,A3...} et INCLURE(A1){A2}{A3}... sont admises
+// Les 2 ecritures INCLURE{A1,A2,A3...} et INCLURE{A1}{A2}{A3}... sont admises
 // Preferer la premiere.
 // Les Ai sont de la forme Vi=Ei ou bien Vi qui veut alors dire Vi=Vi
 // Le resultat est un tableau indexe par les Vi
@@ -149,7 +150,7 @@ function argumenter_inclure(
 }
 
 /**
- * Code d'appel à un <INCLURE()>
+ * Code d'appel à un <INCLURE>
  *
  * Code PHP pour un squelette (aussi pour #INCLURE, #MODELE #LES_AUTEURS)
  */
@@ -228,23 +229,18 @@ function calculer_inclure($p, &$boucles, $id_boucle) {
 		$contexte = "array_merge('.var_export(\$Pile[0],1).',$contexte)";
 	}
 
-	// s'il y a une extension .php, ce n'est pas un squelette
-	if ($fichier && preg_match('/^.+[.]php$/s', $fichier)) {
-		$code = sandbox_composer_inclure_php($fichier, $p, $contexte);
-	} else {
-		$_options[] = "\"compil\"=>array($compil)";
-		if ($ajax) {
-			$_options[] = $ajax;
-		}
-		$code = " ' . argumenter_squelette($code) . '";
-		$code = 'echo ' . sprintf(
-			CODE_RECUPERER_FOND,
-			$code,
-			$contexte,
-			implode(',', $_options),
-			"_request(\\'connect\\') ?? \\'\\'"
-		) . ';';
+	$_options[] = "\"compil\"=>array($compil)";
+	if ($ajax) {
+		$_options[] = $ajax;
 	}
+	$code = " ' . argumenter_squelette($code) . '";
+	$code = 'echo ' . sprintf(
+		CODE_RECUPERER_FOND,
+		$code,
+		$contexte,
+		implode(',', $_options),
+		"_request(\\'connect\\') ?? \\'\\'"
+	) . ';';
 
 	return "\n'<'.'" . '?php ' . $code . "\n?'." . "'>'";
 }
diff --git a/public/debusquer.php b/public/debusquer.php
index 8d7d9fb19ec519c7d0b3e4293754a81ffc658647..dee89b41abe233ab45804df81c3ec559975e3980 100644
--- a/public/debusquer.php
+++ b/public/debusquer.php
@@ -89,7 +89,7 @@ function public_debusquer_dist($message = '', $lieu = '', $opt = []) {
 		set_request('var_mode', 'debug');
 		$GLOBALS['bouton_admin_debug'] = true;
 		// Permettre a la compil de continuer
-		if (is_object($lieu) && (!isset($lieu->code) || !$lieu->code)) {
+		if (is_object($lieu) && property_exists($lieu, 'code') && !$lieu->code) {
 			$lieu->code = "''";
 		}
 		// loger
diff --git a/public/normaliser.php b/public/normaliser.php
index 240b6b551603526413ecdd89bb75e0215a51647c..7f5e5bd8247d5a0872d529c30631ca3c1af4ab43 100644
--- a/public/normaliser.php
+++ b/public/normaliser.php
@@ -86,6 +86,5 @@ function normaliser_inclure($champ) {
 			return;
 		}
 	}
-	spip_logger('vieilles_def')
-		->info('inclure sans fond ni fichier');
+	spip_logger('vieilles_def')->info('inclure sans fond');
 }
diff --git a/public/phraser_html.php b/public/phraser_html.php
index d5398976a54430f16844362387160679f4cd1ed7..4ecbf8c33f448a2b6515a7ad5fc6c5b07709b5ac 100644
--- a/public/phraser_html.php
+++ b/public/phraser_html.php
@@ -58,7 +58,7 @@ define('NOM_DE_CHAMP', '#((' . NOM_DE_BOUCLE . "):)?(([A-F]*[G-Z_][A-Z_0-9]*)|[A
 /** Balise complète [...(#TOTO) ... ] */
 define('CHAMP_ETENDU', '/\[([^\[]*?)\(' . NOM_DE_CHAMP . '([^)]*\)[^]]*)\]/S');
 
-define('BALISE_INCLURE', '/<INCLU[DR]E[[:space:]]*(\(([^)]*)\))?/S');
+define('BALISE_INCLURE', '/<INCLU[DR]E[[:space:]]*/S');
 define('BALISE_POLYGLOTTE', ',<multi>(.*)</multi>,Uims');
 define('BALISE_IDIOMES', ',<:(([a-z0-9_]+):)?([a-z0-9_]*)({([^\|=>]*=[^\|>]*)})?((\|[^>]*)?:/?>),iS');
 define('BALISE_IDIOMES_ARGS', '@^\s*([^= ]*)\s*=\s*((' . NOM_DE_CHAMP . '[{][^}]*})?[^,]*)\s*,?\s*@s');
@@ -79,7 +79,6 @@ function phraser_inclure(string $texte, int $ligne, array $result): array {
 	) {
 		$poss = array_column($match, 1);
 		$match = array_column($match, 0);
-		$match = array_pad($match, 3, null);
 
 		$p = $poss[0];
 		$debut = substr($texte, 0, $p);
@@ -91,27 +90,17 @@ function phraser_inclure(string $texte, int $ligne, array $result): array {
 		$champ = new Inclure();
 		$champ->ligne = $ligne;
 		$ligne += public_compte_ligne((string) $match[0]);
-		$fichier = $match[2];
-		$champ->texte = $fichier;
-
 		$texte = substr($texte, $p + strlen((string) $match[0]));
 
 		// on assimile {var=val} a une liste de un argument sans fonction
 		$pos_apres = 0;
 		phraser_args($texte, '/>', '', $result, $champ, $pos_apres);
-		if (!$champ->texte || (is_countable($champ->param) ? count($champ->param) : 0) > 1) {
-			if (!function_exists('normaliser_inclure')) {
-				include_spip('public/normaliser');
-			}
-			normaliser_inclure($champ);
+		if (!function_exists('normaliser_inclure')) {
+			include_spip('public/normaliser');
 		}
+		normaliser_inclure($champ);
+
 		$pos_fin = strpos($texte, '>', $pos_apres) + 1;
-		if (
-			(strpos($texte, '</INCLUDE>', $pos_fin) === $pos_fin)
-			|| (strpos($texte, '</INCLURE>', $pos_fin) === $pos_fin)
-		) {
-			$pos_fin += 10;
-		}
 		$texte = substr($texte, $pos_fin);
 		$result[] = $champ;
 	}
@@ -361,7 +350,7 @@ function phraser_champs_etendus(string $texte, int $ligne, array $result): array
  * sert aussi aux arguments des includes et aux criteres de boucles
  * Tres chevelu
  *
- * @param Champ|Inclure|Idiome|Boucle $pointeur_champ
+ * @param Champ|Inclure|Boucle $pointeur_champ
  */
 function phraser_args(
 	string $texte,
diff --git a/public/sandbox.php b/public/sandbox.php
index 1ffb1f3c2ed6a198b10e5aff927dd6c8af918bdf..a4a957330d74f7b73c0fd58deebbfe7894c7e1af 100644
--- a/public/sandbox.php
+++ b/public/sandbox.php
@@ -111,33 +111,6 @@ function analyser_arguments_filtre(string $function): array {
 	];
 }
 
-// Calculer un <INCLURE(xx.php)>
-// La constante ci-dessous donne le code general quand il s'agit d'un script.
-define('CODE_INCLURE_SCRIPT', 'if (!($path = %s) OR !is_readable($path))
-	erreur_squelette(array("fichier_introuvable", array("fichier" => "%s")), array(%s));
-else {
-	$contexte_inclus = %s;
-	include $path;
-}
-');
-
-/**
- * Composer le code d'inclusion PHP
- *
- * @param string $fichier
- * @param Champ $p
- *     Balise créant l'inclusion
- * @param string $_contexte Chaine PHP qui écrira le contexte 'array(...)'
- * @return string
- */
-function sandbox_composer_inclure_php($fichier, &$p, $_contexte) {
-	$compil = texte_script(memoriser_contexte_compil($p));
-	// si inexistant, on essaiera a l'execution
-	$path = ($path = find_in_path($fichier)) ? "\"$path\"" : "find_in_path(\"$fichier\")";
-
-	return sprintf(CODE_INCLURE_SCRIPT, $path, $fichier, $compil, $_contexte);
-}
-
 /**
  * Composer le code de sécurisation anti script
  *