diff --git a/ecrire/base/create.php b/ecrire/base/create.php
index 90d048606553e183405a82749f874175fbe43ec1..98ae12f8bb741e6bf81a5bae3f1b523b828a488d 100644
--- a/ecrire/base/create.php
+++ b/ecrire/base/create.php
@@ -18,6 +18,24 @@ include_spip('base/auxiliaires');
 include_spip('base/typedoc');
 include_spip('base/abstract_sql');
 
+
+function creer_ou_upgrader_table($table,$desc,$autoinc,$upgrade=false) {
+	static $fcreate = null;
+	if (!$fcreate) $fcreate = sql_serveur('create', $serveur);
+
+	if (!$upgrade OR !($sql_desc = sql_showtable($table,true,$serveur)))
+		$fcreate($k, $desc['field'], $desc['key'], $autoinc, false, $serveur);
+	if ($upgrade && ($sql_desc OR $sql_desc = sql_showtable($k,true,$serveur))) {
+		// ajouter les champs manquants
+		$last = '';
+		foreach($desc['field'] as $field=>$type){
+			if (!isset($sql_desc['field'][$field]))
+				sql_alter("TABLE $table ADD $field $type".($last?" AFTER $last":""),$serveur);
+			$last = $field;
+		}
+	}
+}
+
 // http://doc.spip.org/@creer_base
 function creer_base($serveur='') {
 	global $tables_principales, $tables_auxiliaires;
@@ -26,13 +44,22 @@ function creer_base($serveur='') {
 	// de la conformite de la base
 	// pas de panique sur  "already exists" et "duplicate entry" donc.
 
-	$fcreate = sql_serveur('create', $serveur);
+	foreach($tables_principales as $k => $v)
+		creer_ou_upgrader_table($k,$v,true);
 
+	foreach($tables_auxiliaires as $k => $v)
+		creer_ou_upgrader_table($k,$v,false);
+}
+
+function maj_base($upgrade_tables=array(),$serveur=''){
+	global $tables_principales, $tables_auxiliaires;
 	foreach($tables_principales as $k => $v)
-		$fcreate($k, $v['field'], $v['key'], true, false, $serveur);
+		if (($upgrade_tables==$k OR (is_array($upgrade_tables) && in_array($k,$upgrade_tables))))
+			creer_ou_upgrader_table($k,$v,true,true);
 
 	foreach($tables_auxiliaires as $k => $v)
-		$fcreate($k, $v['field'], $v['key'], false, false, $serveur);
+		if (($upgrade_tables==$k OR (is_array($upgrade_tables) && in_array($k,$upgrade_tables))))
+			creer_ou_upgrader_table($k,$v,false,true);
 }