diff --git a/ezcache/territoires_stats.php b/ezcache/territoires_stats.php
deleted file mode 100644
index 34dddeea2806de8e81d320470863bf8a37a3c73f..0000000000000000000000000000000000000000
--- a/ezcache/territoires_stats.php
+++ /dev/null
@@ -1,54 +0,0 @@
-<?php
-/**
- * Ce fichier contient les fonctions de service nécessitées par le plugin Cache Factory.
- */
-if (!defined('_ECRIRE_INC_VERSION')) {
-	return;
-}
-
-/**
- * Renvoie la configuration spécifique des caches gérés par REST Factory si les fonctions de collection des données
- * sont directement codés en PHP.
- *
- * Dans le cas où les données JSON sont créées via des squelettes SPIP, le cache est déjà géré par SPIP.
- *
- * @param string $plugin Identifiant qui permet de distinguer le module appelant qui peut-être un plugin comme le noiZetier ou
- *                       un script. Pour un plugin, le plus pertinent est d'utiliser le préfixe.
- *
- * @return array<string, mixed> Tableau de la configuration brute du plugin Taxonomie.
- */
-function territoires_stats_cache_configurer(string $plugin) : array {
-	// Initialisation du tableau de configuration avec les valeurs par défaut du plugin Cache.
-	$configuration = [
-		'config' => [
-			'racine'          => '_DIR_ETC',
-			'sous_dossier'    => true,
-			'nom_prefixe'     => 'config',
-			'nom_obligatoire' => [],
-			'nom_facultatif'  => [],
-			'extension'       => '.yaml',
-			'securisation'    => false,
-			'serialisation'   => false,
-			'decodage'        => true,
-			'separateur'      => '',
-			'conservation'    => 0,
-			'administration'  => false
-		],
-		'source' => [
-			'racine'          => '_DIR_ETC',
-			'sous_dossier'    => true,
-			'nom_prefixe'     => 'source_1',
-			'nom_obligatoire' => [],
-			'nom_facultatif'  => [],
-			'extension'       => '.json',
-			'securisation'    => false,
-			'serialisation'   => false,
-			'decodage'        => true,
-			'separateur'      => '-',
-			'conservation'    => 0,
-			'administration'  => false
-		],
-	];
-
-	return $configuration;
-}
diff --git a/ezmashup/config.template.yaml b/ezmashup/config.template.yaml
index a2387d76bc99640949449920f893e96486d4f9af..d17396cffdae3dd582ecbee65e2109c9bb68d902 100644
--- a/ezmashup/config.template.yaml
+++ b/ezmashup/config.template.yaml
@@ -7,6 +7,8 @@ title: ''
 description: ''
 
 # Catégorisation du feed
+# -- Les feeds, qui sont créés par l'utilisateur, sont éditables
+is_editable: true
 # -- Pour le plugin, la catégorie des feeds est toujours la même, `territory_data`
 category: 'territory_data'
 # -- Le plugin utilise les tags pour définir le type de territoire, le pays et le code territoire utilisé dans le jeu de données
diff --git a/formulaires/creer_feed_territoires.php b/formulaires/creer_feed_territoires.php
index bbbff34610810e682138966f20a5ff57ac59a6ff..ac160db20a49bb3a28e31a74513b6520dce78e92 100644
--- a/formulaires/creer_feed_territoires.php
+++ b/formulaires/creer_feed_territoires.php
@@ -313,7 +313,7 @@ function formulaires_creer_feed_territoires_traiter() : array {
 	// On considère que toutes les vérifications ont été faites et que donc les variables saisies sont cohérentes
 	// -- identification
 	$description_yaml['title'] = $titre_feed;
-	// -- catégorisation : seuls les tags sont à mettre à jour
+	// -- catégorisation : seuls les tags sont à mettre à jour (category imposée, édition autorisée)
 	$description_yaml['tags']['type'] = $type;
 	$description_yaml['tags']['pays'] = $pays;
 	$description_yaml['tags']['type_id'] = $type_code;
diff --git a/formulaires/editer_carte_territoires.php b/formulaires/editer_carte_territoires.php
deleted file mode 100644
index 51d8a52c1013208a6b6e1ae1ee8ae7671e09e556..0000000000000000000000000000000000000000
--- a/formulaires/editer_carte_territoires.php
+++ /dev/null
@@ -1,111 +0,0 @@
-<?php
-/**
- * Gestion du formulaire de d'édition de carte_territoires.
- */
-if (!defined('_ECRIRE_INC_VERSION')) {
-	return;
-}
-
-include_spip('inc/actions');
-include_spip('inc/editer');
-
-/**
- * Identifier le formulaire en faisant abstraction des paramètres qui ne représentent pas l'objet edité.
- *
- * @param int|string $id_carte    Identifiant du carte_territoires. 'new' pour un nouveau carte_territoires.
- * @param string     $retour      URL de redirection après le traitement
- * @param int        $lier_trad   Identifiant éventuel d'un carte_territoires source d'une traduction
- * @param string     $config_fonc Nom de la fonction ajoutant des configurations particulières au formulaire
- * @param array      $row         Valeurs de la ligne SQL de l'objet carte_territoires, si connu
- * @param string     $hidden      Contenu HTML ajouté en même temps que les champs cachés du formulaire.
- *
- * @return string Hash du formulaire
- */
-function formulaires_editer_carte_territoires_identifier_dist($id_carte = 'new', $retour = '', $lier_trad = 0, $config_fonc = '', $row = [], $hidden = '') {
-	return serialize([(int) $id_carte]);
-}
-
-/**
- * Chargement du formulaire d'édition de carte_territoires.
- *
- * Déclarer les champs postés et y intégrer les valeurs par défaut
- *
- * @uses formulaires_editer_objet_charger()
- *
- * @param int|string $id_carte    Identifiant du carte_territoires. 'new' pour un nouveau carte_territoires.
- * @param string     $retour      URL de redirection après le traitement
- * @param int        $lier_trad   Identifiant éventuel d'un carte_territoires source d'une traduction
- * @param string     $config_fonc Nom de la fonction ajoutant des configurations particulières au formulaire
- * @param array      $row         Valeurs de la ligne SQL de l'objet carte_territoires, si connu
- * @param string     $hidden      Contenu HTML ajouté en même temps que les champs cachés du formulaire.
- *
- * @return array Environnement du formulaire
- */
-function formulaires_editer_carte_territoires_charger_dist($id_carte = 'new', $retour = '', $lier_trad = 0, $config_fonc = '', $row = [], $hidden = '') {
-	// Charger l'objet Carte de territoires de façon standard
-	$valeurs = formulaires_editer_objet_charger('carte_territoires', $id_carte, '', $lier_trad, $retour, $config_fonc, $row, $hidden);
-
-	// Rajouter la liste des territoires et des exclusions si la carte est de type 'territoire'
-	if (
-		$valeurs
-		and !empty($valeurs['type_carte'])
-		and ($valeurs['type_carte'] === 'territoire')
-	) {
-		// -- liste des territoires inclus
-		include_spip('inc/carte_territoires');
-		$territoires_inclus = carte_territoires_detourer($valeurs['id_carte'], 'iso_territoire');
-		// -- liste des territoires exclus si il y en a
-		$parametres = json_decode($valeurs['parametres'], true);
-		$territoires_exclus = $parametres['exclusions'] ?? [];
-		// -- Construire la liste de tous les territoires avec leur nom
-		$territoires = array_merge($territoires_inclus, $territoires_exclus);
-		$territoires = sql_allfetsel('iso_territoire, nom_usage', 'spip_territoires', sql_in('iso_territoire', $territoires), '');
-		$territoires = array_column($territoires, 'nom_usage', 'iso_territoire');
-		asort($territoires);
-
-		$valeurs['_exclusions'] = $territoires;
-		$valeurs['_exclusions_defaut'] = $territoires_exclus;
-	}
-
-	return $valeurs;
-}
-
-/**
- * Vérifications du formulaire d'édition de carte_territoires.
- *
- * Vérifier les champs postés et signaler d'éventuelles erreurs
- *
- * @uses formulaires_editer_objet_verifier()
- *
- * @param int|string $id_carte    Identifiant du carte_territoires. 'new' pour un nouveau carte_territoires.
- * @param string     $retour      URL de redirection après le traitement
- * @param int        $lier_trad   Identifiant éventuel d'un carte_territoires source d'une traduction
- * @param string     $config_fonc Nom de la fonction ajoutant des configurations particulières au formulaire
- * @param array      $row         Valeurs de la ligne SQL de l'objet carte_territoires, si connu
- * @param string     $hidden      Contenu HTML ajouté en même temps que les champs cachés du formulaire.
- *
- * @return array Tableau des erreurs
- */
-function formulaires_editer_carte_territoires_verifier_dist($id_carte = 'new', $retour = '', $lier_trad = 0, $config_fonc = '', $row = [], $hidden = '') {
-	return formulaires_editer_objet_verifier('carte_territoires', $id_carte);
-}
-
-/**
- * Traitement du formulaire d'édition de carte_territoires.
- *
- * Traiter les champs postés
- *
- * @uses formulaires_editer_objet_traiter()
- *
- * @param int|string $id_carte    Identifiant du carte_territoires. 'new' pour un nouveau carte_territoires.
- * @param string     $retour      URL de redirection après le traitement
- * @param int        $lier_trad   Identifiant éventuel d'un carte_territoires source d'une traduction
- * @param string     $config_fonc Nom de la fonction ajoutant des configurations particulières au formulaire
- * @param array      $row         Valeurs de la ligne SQL de l'objet carte_territoires, si connu
- * @param string     $hidden      Contenu HTML ajouté en même temps que les champs cachés du formulaire.
- *
- * @return array Retours des traitements
- */
-function formulaires_editer_carte_territoires_traiter_dist($id_carte = 'new', $retour = '', $lier_trad = 0, $config_fonc = '', $row = [], $hidden = '') {
-	return formulaires_editer_objet_traiter('carte_territoires', $id_carte, '', $lier_trad, $retour, $config_fonc, $row, $hidden);
-}
diff --git a/formulaires/editer_carte_territoires.html b/formulaires/editer_feed_territoires.html
similarity index 67%
rename from formulaires/editer_carte_territoires.html
rename to formulaires/editer_feed_territoires.html
index 9753a2853b1c67bd1519707dc46ae35d251a9218..0a86529a5c5c610a5bbe75cba48d5ce97e92efad 100644
--- a/formulaires/editer_carte_territoires.html
+++ b/formulaires/editer_feed_territoires.html
@@ -1,11 +1,11 @@
-<div class='formulaire_spip formulaire_editer formulaire_#FORM formulaire_#FORM-#ENV{id_carte}'>
+<div class='formulaire_spip formulaire_editer formulaire_#FORM formulaire_#FORM-#ENV{feed_id}'>
 	[<p class="reponse_formulaire reponse_formulaire_ok">(#ENV**{message_ok})</p>]
 	[<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>]
 
 	[(#ENV{editable})
 	<form method="post" action="#ENV{action}"><div>
 		#ACTION_FORMULAIRE
-		<input type="hidden" name="id_carte" value="#ENV{id_carte}" />
+		<input type="hidden" name="feed_id" value="#ENV{feed_id}" />
 		<div class="editer-groupe">
 			[(#SAISIE{input, titre,
 				label=<:carte_territoires:champ_titre_label:>
@@ -16,16 +16,6 @@
 				rows=5,
 				class=inserer_barre_edition
 			})]
-
-			[(#ENV{type_carte}|=={carte}|non)
-				[(#SAISIE{checkbox_flex, exclusions,
-					explication=<:cartes_territoires:explication_etape_2_complement:>,
-					data=#ENV{_exclusions},
-					defaut=#ENV{_exclusions_defaut},
-					extraire_multi=oui,
-					conteneur_class=pleine_largeur,
-				})]
-			]
 		</div>
 		[(#REM) ajouter les saisies supplementaires : extra et autre, a cet endroit ]
 		<!--extra-->
diff --git a/formulaires/editer_feed_territoires.php b/formulaires/editer_feed_territoires.php
new file mode 100644
index 0000000000000000000000000000000000000000..0f103efcca61b55c7c6bf5aad82b29811632d7d7
--- /dev/null
+++ b/formulaires/editer_feed_territoires.php
@@ -0,0 +1,52 @@
+<?php
+/**
+ * Gestion du formulaire de d'édition d'un feed de territoires.
+ */
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+include_spip('inc/actions');
+include_spip('inc/editer');
+
+/**
+ * Chargement du formulaire d'édition d'un feed de territoires.
+ *
+ * @param string $id_feed  Identificant du feed servant à l'affichage du bloc de détails
+ * @param string $redirect URL de redirection suite à la demande d'édition (inutile pour les autres actions)
+ *
+ * @return array Environnement du formulaire
+ */
+function formulaires_editer_feed_territoires_charger_dist(string $id_feed, string $redirect) {
+	$valeurs = [];
+
+	return $valeurs;
+}
+
+/**
+ * Vérifications du formulaire d'édition d'un feed de territoires.
+ *
+ * @param string $feed_id  Identificant du feed servant à l'affichage du bloc de détails
+ * @param string $redirect URL de redirection suite à la demande d'édition (inutile pour les autres actions)
+ *
+ * @return array Tableau des erreurs
+ */
+function formulaires_editer_feed_territoires_verifier_dist(string $id_feed, string $redirect) {
+	$erreurs = [];
+
+	return $erreurs;
+}
+
+/**
+ * Traitement du formulaire d'édition d'un feed de territoires.
+ *
+ * @param string $feed_id Identificant du feed servant à l'affichage du bloc de détails
+ * @param string $redirect URL de redirection suite à la demande d'édition (inutile pour les autres actions)
+ *
+ * @return array Retours des traitements
+ */
+function formulaires_editer_feed_territoires_traiter_dist(string $id_feed, string $redirect) {
+	$retour = [];
+
+	return $retour;
+}
diff --git a/lang/territoires_stats_fr.php b/lang/territoires_stats_fr.php
index a8e5a4b490773ddae227be95826d2b18d0a50021..27fb7dafa57cfa0e9f0bb3027d6ab25fae78f008 100644
--- a/lang/territoires_stats_fr.php
+++ b/lang/territoires_stats_fr.php
@@ -25,6 +25,7 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
 
 	// I
 	'icone_creer_feed' => 'Créer un jeu de données',
+	'icone_modifier_feed' => 'Modifier le jeu de données',
 	'info_0_feed' => 'Aucun jeu de données',
 	'info_1_feed' => '1 jeu de données',
 	'info_feed_aucun' => 'Utilisez les boutons pour créer des jeux de données',
diff --git a/prive/squelettes/contenu/feed_territoires_creer.html b/prive/squelettes/contenu/feed_territoires_creer.html
index 8e646847ddad1d141f011506ea2c84f5a693bdfa..7355f606e635a576bc44a6b20d52c62cba63451d 100644
--- a/prive/squelettes/contenu/feed_territoires_creer.html
+++ b/prive/squelettes/contenu/feed_territoires_creer.html
@@ -1,4 +1,4 @@
-[(#AUTORISER{creer, feedterritoires}|sinon_interdire_acces)]
+[(#AUTORISER{creer, feed, '', #NULL, #ARRAY{plugin, territoires_stats}}|sinon_interdire_acces)]
 <h1 class="grostitre"><:territoires_stats:titre_page_creer:></h1>
 
 [<div class="noajax">
diff --git a/prive/squelettes/contenu/feed_territoires_edit.html b/prive/squelettes/contenu/feed_territoires_edit.html
new file mode 100644
index 0000000000000000000000000000000000000000..7598ea8e882623265e8ec65718ef235a70c57ea5
--- /dev/null
+++ b/prive/squelettes/contenu/feed_territoires_edit.html
@@ -0,0 +1,24 @@
+[(#AUTORISER{actionner, feed, #ENV{feed_id}, #NULL, #ARRAY{plugin, territoires_stats}}|sinon_interdire_acces)]
+#SET{redirect, #URL_ECRIRE{peupler_statistiques}}
+
+<div class="cadre-formulaire-editer">
+<div class="entete-formulaire">
+	[(#ENV{feed_id}|oui)
+		[(#GET{redirect}|icone_verticale{<:icone_retour:/>,territoires_feed,'',left retour[(#ENV{retourajax,''}|oui)ajax preload]})]
+	]
+	<:territoires_stats:icone_modifier_feed:>
+	<BOUCLE_info_feed(FEEDS) {feed_id}>
+		[<h1>(#TITLE)</h1>]
+	</BOUCLE_info_feed>
+</div>
+
+[(#ENV{retourajax,''}|oui)
+	#SET{redirect,'javascript:if (window.jQuery) jQuery(".entete-formulaire .retour a").followLink();'}
+	<div class="ajax">
+]
+[(#FORMULAIRE_EDITER_FEED_TERRITOIRES{#ENV{feed_id}, #GET{redirect}})]
+[(#ENV{retourajax,''}|oui)
+	</div>
+	<script type="text/javascript">/*<!\[CDATA\[*/reloadExecPage('#ENV{exec}');/*\]\]>*/</script>
+]
+</div>
diff --git a/prive/squelettes/contenu/peupler_statistiques.html b/prive/squelettes/contenu/peupler_statistiques.html
index 40c3b6c02d59fda2697c0f940b7ff925cce78d06..0fdf13acb8d3cc87558558f9cf14d854e5e4eb6c 100644
--- a/prive/squelettes/contenu/peupler_statistiques.html
+++ b/prive/squelettes/contenu/peupler_statistiques.html
@@ -1,5 +1,6 @@
 [(#AUTORISER{voir, _feeds}|sinon_interdire_acces)]
 #SET{categorie, territory_data}
+#SET{redirect, #URL_ECRIRE{feed_territoires_edit}|parametre_url{feed_id, #ENV{feed_id}}}
 
 <h1 class="grostitre">
 	<:territoires_stats:titre_page_peupler:>
@@ -12,7 +13,7 @@
 
 [(#REM) <!-- Affichage du formulaire d'admin des feeds filtré sur la catégorie des statistiques des territoires --> ]
 [<div class="ajax noscroll">
-	(#FORMULAIRE_ADMIN_FEEDS{territoires_stats, #GET{categorie}, #ENV{feed_id}, territoires_stats})
+	(#FORMULAIRE_ADMIN_FEEDS{territoires_stats, #GET{categorie}, #ENV{feed_id}, territoires_stats, #GET{redirect}})
 </div>]
 
 [(#AUTORISER{creer, feed, '', #NULL, #ARRAY{plugin, territoires_stats}})