diff --git a/ecrire/inc/plugin.php b/ecrire/inc/plugin.php
index d72491d9b37ca838b98f94ebeaccc7300f5f45c4..6c363c35ea8d19926bfe24a305b119a4231d5e2b 100644
--- a/ecrire/inc/plugin.php
+++ b/ecrire/inc/plugin.php
@@ -646,9 +646,30 @@ function plugin_controler_necessite($liste, $nom, $intervalle, $balise) {
 	);
 }
 
-
+/**
+ * @param string $intervalle
+ *     L'éventuelle intervalle de compatibilité de la dépendance. ex: [1.1.0;]
+ * @param string $version
+ *     La version en cours active pour le plugin demandé (ou php ou extension php demandée)
+ * @param string $nom
+ *     Le plugin (ou php ou extension php) qui est absent
+ * @param string $balise
+ *     Le type de balise utilisé (necessite ou utilise)
+ * @return string
+ *     Le message d'erreur.
+ */
 function plugin_message_incompatibilite($intervalle, $version, $nom, $balise) {
 
+	// prendre en compte les erreurs de dépendances à PHP
+	// ou à une extension PHP avec des messages d'erreurs dédiés.
+	$type = 'plugin';
+	if ($nom === 'PHP') {
+		$type = 'php';
+	} elseif (strncmp($nom, 'PHP:', 4) === 0) {
+		$type = 'extension_php';
+		list(,$nom) = explode(':', $nom, 2);
+	}
+
 	if (preg_match(_EXTRAIRE_INTERVALLE, $intervalle, $regs)) {
 		$minimum = $regs[1];
 		$maximum = $regs[2];
@@ -658,13 +679,13 @@ function plugin_message_incompatibilite($intervalle, $version, $nom, $balise) {
 
 		if (strlen($minimum)) {
 			if ($minimum_inclus and spip_version_compare($version, $minimum, '<')) {
-				return _T("plugin_${balise}_plugin", array(
+				return _T("plugin_${balise}_${type}", array(
 					'plugin' => $nom,
 					'version' => ' &ge; ' . $minimum
 				));
 			}
 			if (!$minimum_inclus and spip_version_compare($version, $minimum, '<=')) {
-				return _T("plugin_${balise}_plugin", array(
+				return _T("plugin_${balise}_${type}", array(
 					'plugin' => $nom,
 					'version' => ' &gt; ' . $minimum
 				));
@@ -673,7 +694,7 @@ function plugin_message_incompatibilite($intervalle, $version, $nom, $balise) {
 
 		if (strlen($maximum)) {
 			if ($maximum_inclus and spip_version_compare($version, $maximum, '>')) {
-				return _T("plugin_${balise}_plugin", array(
+				return _T("plugin_${balise}_${type}", array(
 					'plugin' => $nom,
 					'version' => ' &le; ' . $maximum
 				));
@@ -687,7 +708,10 @@ function plugin_message_incompatibilite($intervalle, $version, $nom, $balise) {
 		}
 	}
 
-	return _T("plugin_necessite_plugin_sans_version", array('plugin' => $nom));
+	// note : il ne peut pas y avoir d'erreur sur
+	// - un 'utilise' sans version.
+	// - un 'php' sans version.
+	return _T("plugin_necessite_${type}_sans_version", array('plugin' => $nom));
 }
 
 
diff --git a/ecrire/lang/ecrire_fr.php b/ecrire/lang/ecrire_fr.php
index 9dae357022caa9ed4791464ebda5dea93c886653..316d9871e550c4ee61a9416352fe555d122d175a 100644
--- a/ecrire/lang/ecrire_fr.php
+++ b/ecrire/lang/ecrire_fr.php
@@ -677,8 +677,11 @@ dans une couleur qui indique leur état :',
 	'plugin_info_telecharger' => 'à télécharger depuis @url@ et à installer dans @rep@',
 	'plugin_info_upgrade_ok' => 'Mise à jour réussie',
 	'plugin_librairies_installees' => 'Librairies installées',
+	'plugin_necessite_extension_php' => 'Nécessite l’extension PHP @plugin@ en version @version@.',
 	'plugin_necessite_lib' => 'Ce plugin nécessite la librairie @lib@',
+	'plugin_necessite_php' => 'Nécessite @plugin@ en version @version@.',
 	'plugin_necessite_plugin' => 'Nécessite le plugin @plugin@ en version @version@.',
+	'plugin_necessite_extension_php_sans_version' => 'Nécessite l’extension PHP @plugin@',
 	'plugin_necessite_plugin_sans_version' => 'Nécessite le plugin @plugin@',
 	'plugin_necessite_spip' => 'Nécessite SPIP en version @version@ minimum.',
 	'plugin_source' => 'source : ',
@@ -686,6 +689,8 @@ dans une couleur qui indique leur état :',
 	'plugin_titre_automatique_ajouter' => 'Ajouter des plugins',
 	'plugin_titre_installation' => 'Installation du plugin @plugin@',
 	'plugin_titre_modifier' => 'Mes plugins',
+	'plugin_utilise_extension_php' => 'Utilise l’extension PHP @plugin@ en version @version@.',
+	'plugin_utilise_php' => 'Utilise @plugin@ en version @version@.',
 	'plugin_utilise_plugin' => 'Utilise le plugin @plugin@ en version @version@.',
 	'plugin_zip_active' => 'Continuez pour l’activer',
 	'plugin_zip_adresse' => 'indiquez ci-dessous l’adresse d’un fichier zip de plugin à télécharger, ou encore l’adresse d’une liste de plugins.',
diff --git a/ecrire/plugins/get_infos.php b/ecrire/plugins/get_infos.php
index de87cbab4e429ab81204f20341113036ad05af31..27156df2276c9511750b36d8f49100379d2b2e05 100644
--- a/ecrire/plugins/get_infos.php
+++ b/ecrire/plugins/get_infos.php
@@ -124,8 +124,12 @@ function plugins_get_infos_un($plug, $reload, $dir, &$cache) {
 	$ret['md5_file'] = $md5;
 	// Si on lit le paquet.xml de SPIP, on rajoute un procure php afin que les plugins puissent
 	// utiliser un necessite php. SPIP procure donc la version php courante du serveur.
+	// chaque librairie php est aussi procurée, par exemple 'php:curl'.
 	if (isset($ret['prefix']) and $ret['prefix'] == 'spip') {
 		$ret['procure']['php'] = array('nom' => 'php', 'version' => phpversion());
+		foreach (get_loaded_extensions() as $ext) {
+			$ret['procure']['php:' . $ext] = array('nom' => 'php:' . $ext, 'version' => phpversion($ext));
+		}
 	}
 	$diff = ($ret != $pcache);
 
diff --git a/ecrire/xml/valider.php b/ecrire/xml/valider.php
index 79e6073d5ce4b729e5aff84614b8feb1ef99bb91..b0e3b46e056dbb4bc83dbb3a1ba751670ea841d5 100644
--- a/ecrire/xml/valider.php
+++ b/ecrire/xml/valider.php
@@ -238,8 +238,8 @@ class ValidateurXML {
 						. _T('zxml_vide_balise'));
 				}
 			} else {
-				$f = $this->fratrie[substr($depth, 2)];
-				if (!preg_match($regle, $f)) {
+				$f = isset($this->fratrie[substr($depth, 2)]) ? $this->fratrie[substr($depth, 2)] : null;
+				if (is_null($f) or !preg_match($regle, $f)) {
 					coordonnees_erreur($this,
 						" <p>\n<b>$name</b> "
 						. _T('zxml_succession_fils_incorrecte')